From 370bf24d2c13781af125d3b415bbd998b90c2f44 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 145a2ed8e..44d8fa8d8 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 1fdf92b9b..b67c0cc48 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -492,6 +492,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 1701cb371..58d173359 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 9acfb5718..3ac0bd4ae 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 a239bda6d..7950a3b5c 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);