mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-12 09:38:20 +00:00
Move FrameData out of VulkanRenderManager
This commit is contained in:
parent
415a795b11
commit
fabd50b178
@ -623,6 +623,8 @@ add_library(Common STATIC
|
||||
Common/GPU/Vulkan/VulkanRenderManager.h
|
||||
Common/GPU/Vulkan/VulkanQueueRunner.cpp
|
||||
Common/GPU/Vulkan/VulkanQueueRunner.h
|
||||
Common/GPU/Vulkan/VulkanFrameData.cpp
|
||||
Common/GPU/Vulkan/VulkanFrameData.h
|
||||
Common/Input/GestureDetector.cpp
|
||||
Common/Input/GestureDetector.h
|
||||
Common/Input/KeyCodes.h
|
||||
|
@ -441,6 +441,7 @@
|
||||
<ClInclude Include="GPU\Vulkan\VulkanBarrier.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanContext.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanDebug.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanFrameData.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanImage.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanLoader.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanMemory.h" />
|
||||
@ -861,6 +862,7 @@
|
||||
<ClCompile Include="GPU\Vulkan\VulkanBarrier.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanContext.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanDebug.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanFrameData.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanImage.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanLoader.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanMemory.cpp" />
|
||||
|
@ -419,6 +419,9 @@
|
||||
<Filter>GPU\Vulkan</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="RiscVEmitter.h" />
|
||||
<ClInclude Include="GPU\Vulkan\VulkanFrameData.h">
|
||||
<Filter>GPU\Vulkan</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ABI.cpp" />
|
||||
@ -791,6 +794,9 @@
|
||||
<Filter>GPU\Vulkan</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RiscVEmitter.cpp" />
|
||||
<ClCompile Include="GPU\Vulkan\VulkanFrameData.cpp">
|
||||
<Filter>GPU\Vulkan</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Crypto">
|
||||
|
15
Common/GPU/Vulkan/VulkanFrameData.cpp
Normal file
15
Common/GPU/Vulkan/VulkanFrameData.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
#include "VulkanFrameData.h"
|
||||
|
||||
void FrameData::AcquireNextImage(VulkanContext *vulkan) {
|
||||
// Get the index of the next available swapchain image, and a semaphore to block command buffer execution on.
|
||||
VkResult res = vkAcquireNextImageKHR(vulkan->GetDevice(), vulkan->GetSwapchain(), UINT64_MAX, acquireSemaphore, (VkFence)VK_NULL_HANDLE, &curSwapchainImage);
|
||||
if (res == VK_SUBOPTIMAL_KHR) {
|
||||
// Hopefully the resize will happen shortly. Ignore - one frame might look bad or something.
|
||||
WARN_LOG(G3D, "VK_SUBOPTIMAL_KHR returned - ignoring");
|
||||
} else if (res == VK_ERROR_OUT_OF_DATE_KHR) {
|
||||
WARN_LOG(G3D, "VK_ERROR_OUT_OF_DATE_KHR returned - processing the frame, but not presenting");
|
||||
skipSwap = true;
|
||||
} else {
|
||||
_assert_msg_(res == VK_SUCCESS, "vkAcquireNextImageKHR failed! result=%s", VulkanResultToString(res));
|
||||
}
|
||||
}
|
65
Common/GPU/Vulkan/VulkanFrameData.h
Normal file
65
Common/GPU/Vulkan/VulkanFrameData.h
Normal file
@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
#include "Common/GPU/Vulkan/VulkanContext.h"
|
||||
|
||||
struct VKRStep;
|
||||
|
||||
enum class VKRRunType {
|
||||
END,
|
||||
SYNC,
|
||||
};
|
||||
|
||||
struct QueueProfileContext {
|
||||
VkQueryPool queryPool;
|
||||
std::vector<std::string> timestampDescriptions;
|
||||
std::string profileSummary;
|
||||
double cpuStartTime;
|
||||
double cpuEndTime;
|
||||
};
|
||||
|
||||
// Per-frame data, round-robin so we can overlap submission with execution of the previous frame.
|
||||
struct FrameData {
|
||||
std::mutex push_mutex;
|
||||
std::condition_variable push_condVar;
|
||||
|
||||
std::mutex pull_mutex;
|
||||
std::condition_variable pull_condVar;
|
||||
|
||||
bool readyForFence = true;
|
||||
bool readyForRun = false;
|
||||
bool skipSwap = false;
|
||||
VKRRunType type = VKRRunType::END;
|
||||
|
||||
VkFence fence;
|
||||
VkFence readbackFence; // Strictly speaking we might only need one of these.
|
||||
bool readbackFenceUsed = false;
|
||||
|
||||
// These are on different threads so need separate pools.
|
||||
VkCommandPool cmdPoolInit; // Written to from main thread
|
||||
VkCommandPool cmdPoolMain; // Written to from render thread, which also submits
|
||||
|
||||
VkCommandBuffer initCmd;
|
||||
VkCommandBuffer mainCmd;
|
||||
VkCommandBuffer presentCmd;
|
||||
|
||||
bool hasInitCommands = false;
|
||||
bool hasPresentCommands = false;
|
||||
|
||||
std::vector<VKRStep *> steps;
|
||||
|
||||
// Swapchain.
|
||||
bool hasBegun = false;
|
||||
uint32_t curSwapchainImage = -1;
|
||||
VkSemaphore acquireSemaphore; // Not owned, shared between all FrameData.
|
||||
|
||||
// Profiling.
|
||||
QueueProfileContext profile;
|
||||
bool profilingEnabled_;
|
||||
|
||||
void AcquireNextImage(VulkanContext *vulkan);
|
||||
};
|
@ -8,6 +8,7 @@
|
||||
#include "Common/Data/Collections/Hashmaps.h"
|
||||
#include "Common/GPU/Vulkan/VulkanContext.h"
|
||||
#include "Common/GPU/Vulkan/VulkanBarrier.h"
|
||||
#include "Common/GPU/Vulkan/VulkanFrameData.h"
|
||||
#include "Common/Data/Convert/SmallDataConvert.h"
|
||||
#include "Common/Data/Collections/TinySet.h"
|
||||
#include "Common/GPU/DataFormat.h"
|
||||
@ -149,14 +150,6 @@ struct TransitionRequest {
|
||||
VkImageLayout targetLayout;
|
||||
};
|
||||
|
||||
struct QueueProfileContext {
|
||||
VkQueryPool queryPool;
|
||||
std::vector<std::string> timestampDescriptions;
|
||||
std::string profileSummary;
|
||||
double cpuStartTime;
|
||||
double cpuEndTime;
|
||||
};
|
||||
|
||||
class VKRRenderPass;
|
||||
|
||||
struct VKRStep {
|
||||
|
@ -326,6 +326,8 @@ VulkanRenderManager::VulkanRenderManager(VulkanContext *vulkan) : vulkan_(vulkan
|
||||
query_ci.queryCount = MAX_TIMESTAMP_QUERIES;
|
||||
query_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
|
||||
res = vkCreateQueryPool(vulkan_->GetDevice(), &query_ci, nullptr, &frameData_[i].profile.queryPool);
|
||||
|
||||
frameData_[i].acquireSemaphore = acquireSemaphore_;
|
||||
}
|
||||
|
||||
queueRunner_.CreateDeviceObjects();
|
||||
@ -1416,23 +1418,14 @@ void VulkanRenderManager::BeginSubmitFrame(int frame) {
|
||||
SubmitInitCommands(frame);
|
||||
|
||||
if (!frameData.hasBegun) {
|
||||
// Get the index of the next available swapchain image, and a semaphore to block command buffer execution on.
|
||||
VkResult res = vkAcquireNextImageKHR(vulkan_->GetDevice(), vulkan_->GetSwapchain(), UINT64_MAX, acquireSemaphore_, (VkFence)VK_NULL_HANDLE, &frameData.curSwapchainImage);
|
||||
if (res == VK_SUBOPTIMAL_KHR) {
|
||||
// Hopefully the resize will happen shortly. Ignore - one frame might look bad or something.
|
||||
WARN_LOG(G3D, "VK_SUBOPTIMAL_KHR returned - ignoring");
|
||||
} else if (res == VK_ERROR_OUT_OF_DATE_KHR) {
|
||||
WARN_LOG(G3D, "VK_ERROR_OUT_OF_DATE_KHR returned - processing the frame, but not presenting");
|
||||
frameData.skipSwap = true;
|
||||
} else {
|
||||
_assert_msg_(res == VK_SUCCESS, "vkAcquireNextImageKHR failed! result=%s", VulkanResultToString(res));
|
||||
}
|
||||
frameData.AcquireNextImage(vulkan_);
|
||||
|
||||
// Effectively resets both main and present command buffers, since they both live in this pool.
|
||||
vkResetCommandPool(vulkan_->GetDevice(), frameData.cmdPoolMain, 0);
|
||||
|
||||
VkCommandBufferBeginInfo begin{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
|
||||
begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||
res = vkBeginCommandBuffer(frameData.mainCmd, &begin);
|
||||
|
||||
VkResult res = vkBeginCommandBuffer(frameData.mainCmd, &begin);
|
||||
_assert_msg_(res == VK_SUCCESS, "vkBeginCommandBuffer failed! result=%s", VulkanResultToString(res));
|
||||
|
||||
queueRunner_.SetBackbuffer(framebuffers_[frameData.curSwapchainImage], swapchainImages_[frameData.curSwapchainImage].image);
|
||||
|
@ -65,11 +65,6 @@ private:
|
||||
std::string tag_;
|
||||
};
|
||||
|
||||
enum class VKRRunType {
|
||||
END,
|
||||
SYNC,
|
||||
};
|
||||
|
||||
enum {
|
||||
MAX_TIMESTAMP_QUERIES = 128,
|
||||
};
|
||||
@ -487,45 +482,6 @@ private:
|
||||
VkSemaphore acquireSemaphore_;
|
||||
VkSemaphore renderingCompleteSemaphore_;
|
||||
|
||||
// Per-frame data, round-robin so we can overlap submission with execution of the previous frame.
|
||||
struct FrameData {
|
||||
std::mutex push_mutex;
|
||||
std::condition_variable push_condVar;
|
||||
|
||||
std::mutex pull_mutex;
|
||||
std::condition_variable pull_condVar;
|
||||
|
||||
bool readyForFence = true;
|
||||
bool readyForRun = false;
|
||||
bool skipSwap = false;
|
||||
VKRRunType type = VKRRunType::END;
|
||||
|
||||
VkFence fence;
|
||||
VkFence readbackFence; // Strictly speaking we might only need one of these.
|
||||
bool readbackFenceUsed = false;
|
||||
|
||||
// These are on different threads so need separate pools.
|
||||
VkCommandPool cmdPoolInit; // Written to from main thread
|
||||
VkCommandPool cmdPoolMain; // Written to from render thread, which also submits
|
||||
|
||||
VkCommandBuffer initCmd;
|
||||
VkCommandBuffer mainCmd;
|
||||
VkCommandBuffer presentCmd;
|
||||
|
||||
bool hasInitCommands = false;
|
||||
bool hasPresentCommands = false;
|
||||
|
||||
std::vector<VKRStep *> steps;
|
||||
|
||||
// Swapchain.
|
||||
bool hasBegun = false;
|
||||
uint32_t curSwapchainImage = -1;
|
||||
|
||||
// Profiling.
|
||||
QueueProfileContext profile;
|
||||
bool profilingEnabled_;
|
||||
};
|
||||
|
||||
FrameData frameData_[VulkanContext::MAX_INFLIGHT_FRAMES];
|
||||
int newInflightFrames_ = -1;
|
||||
int inflightFramesAtStart_ = 0;
|
||||
|
@ -51,6 +51,7 @@ VULKAN_FILES := \
|
||||
$(SRC)/Common/GPU/Vulkan/thin3d_vulkan.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanQueueRunner.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanRenderManager.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanFrameData.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanLoader.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanContext.cpp \
|
||||
$(SRC)/Common/GPU/Vulkan/VulkanDebug.cpp \
|
||||
|
@ -253,6 +253,7 @@ SOURCES_CXX += \
|
||||
$(COMMONDIR)/GPU/Vulkan/thin3d_vulkan.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanQueueRunner.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanRenderManager.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanFrameData.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanLoader.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanContext.cpp \
|
||||
$(COMMONDIR)/GPU/Vulkan/VulkanDebug.cpp \
|
||||
|
Loading…
x
Reference in New Issue
Block a user