diff --git a/Common/GPU/Vulkan/VulkanBarrier.h b/Common/GPU/Vulkan/VulkanBarrier.h index 9382f71166..2356fbcc18 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.h +++ b/Common/GPU/Vulkan/VulkanBarrier.h @@ -16,6 +16,8 @@ class VulkanBarrier { public: VulkanBarrier() : imageBarriers_(4) {} + bool empty() const { return imageBarriers_.empty(); } + void TransitionImage( VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 8b031ce8c9..9dc8db917f 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -1411,6 +1411,11 @@ void VulkanRenderManager::Finish() { int curFrame = vulkan_->GetCurFrame(); FrameData &frameData = frameData_[curFrame]; + if (!postInitBarrier_.empty()) { + VkCommandBuffer buffer = frameData.GetInitCmd(vulkan_); + postInitBarrier_.Flush(buffer); + } + VLOG("PUSH: Frame[%d]", curFrame); VKRRenderThreadTask *task = new VKRRenderThreadTask(VKRRunType::SUBMIT); task->frame = curFrame; @@ -1561,7 +1566,12 @@ void VulkanRenderManager::FlushSync() { int curFrame = vulkan_->GetCurFrame(); FrameData &frameData = frameData_[curFrame]; - + + if (!postInitBarrier_.empty()) { + VkCommandBuffer buffer = frameData.GetInitCmd(vulkan_); + postInitBarrier_.Flush(buffer); + } + if (useRenderThread_) { { VLOG("PUSH: Frame[%d]", curFrame); @@ -1584,11 +1594,10 @@ void VulkanRenderManager::FlushSync() { frameData.syncDone = false; } } else { - VKRRenderThreadTask *task = new VKRRenderThreadTask(VKRRunType::SYNC); - task->frame = curFrame; - task->steps = std::move(steps_); - Run(*task); - delete task; + VKRRenderThreadTask task(VKRRunType::SYNC); + task.frame = curFrame; + task.steps = std::move(steps_); + Run(task); steps_.clear(); } } diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index 8f9c7120d9..6b07b0c198 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -16,6 +16,7 @@ #include "Common/Thread/Promise.h" #include "Common/System/Display.h" #include "Common/GPU/Vulkan/VulkanContext.h" +#include "Common/GPU/Vulkan/VulkanBarrier.h" #include "Common/Data/Convert/SmallDataConvert.h" #include "Common/Data/Collections/FastVec.h" #include "Common/Math/math_util.h" @@ -535,6 +536,12 @@ public: return outOfDateFrames_ > VulkanContext::MAX_INFLIGHT_FRAMES; } + void Invalidate(InvalidationFlags flags); + + VulkanBarrier &PostInitBarrier() { + return postInitBarrier_; + } + void ResetStats(); void DrainAndBlockCompileQueue(); void ReleaseCompileQueue(); @@ -626,6 +633,8 @@ private: SimpleStat renderCPUTimeMs_; SimpleStat descUpdateTimeMs_; + VulkanBarrier postInitBarrier_; + std::function invalidationCallback_; uint64_t frameIdGen_ = FRAME_TIME_HISTORY_LENGTH;