From a45fab65e85f328e8e984dbe88cba2847e7801c4 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 30 Aug 2023 18:53:45 +0200 Subject: [PATCH] Fix crash when frame buffers are resized --- src/common/rendering/vulkan/textures/vk_renderbuffers.cpp | 1 + src/common/rendering/vulkan/vk_renderdevice.cpp | 8 ++++++++ src/common/rendering/vulkan/vk_renderdevice.h | 2 ++ src/common/rendering/vulkan/vk_renderstate.cpp | 6 ++++++ src/common/rendering/vulkan/vk_renderstate.h | 2 ++ 5 files changed, 19 insertions(+) diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index 145a2ed8ed..44d8fa8d88 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -70,6 +70,7 @@ void VkRenderBuffers::BeginFrame(int width, int height, int sceneWidth, int scen { fb->GetCommands()->WaitForCommands(false); fb->GetRenderPassManager()->RenderBuffersReset(); + fb->ResetRenderStateCache(); } if (width != mWidth || height != mHeight) diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 282840c564..bcf1b916b6 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -493,6 +493,14 @@ void VulkanRenderDevice::WaitForCommands(bool finish) mCommands->WaitForCommands(finish); } +void VulkanRenderDevice::ResetRenderStateCache() +{ + for (auto& renderstate : mRenderState) + { + renderstate->ResetCache(); + } +} + void VulkanRenderDevice::PrintStartupLog() { const auto &props = mDevice->PhysicalDevice.Properties.Properties; diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index 1701cb3710..58d1733590 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -85,6 +85,8 @@ public: void WaitForCommands(bool finish) override; + void ResetRenderStateCache(); + std::mutex ThreadMutex; private: diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 9acfb57181..3ac0bd4aef 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -740,6 +740,12 @@ void VkRenderState::EndFrame() mStreamBufferWriter.Reset(); } +void VkRenderState::ResetCache() +{ + mRenderPassSetups.clear(); + mPipelineLayouts.clear(); +} + void VkRenderState::EnableDrawBuffers(int count, bool apply) { if (mRenderTarget.DrawBuffers != count) diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index a239bda6d1..7950a3b5c4 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -64,6 +64,8 @@ public: void EndRenderPass(); void EndFrame(); + void ResetCache(); + protected: void Apply(int dt); void ApplyRenderPass(int dt);