From d256175981f10b7225dd81da1f0aae4981c2d698 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 21 Nov 2020 03:03:15 +0100 Subject: [PATCH] [dxvk] Eliminate back-to-back clears when no render pass is active Trine 4 hits this with a multisampled depth buffer multiple times per frame. Previously, we'd only eliminate redudant clears if the render target to clear was active in the current render pass. --- src/dxvk/dxvk_context.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index bc8b43d3..10a3f26d 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1819,6 +1819,21 @@ namespace dxvk { const Rc& imageView, VkImageAspectFlags clearAspects, VkClearValue clearValue) { + for (auto& entry : m_deferredClears) { + if (entry.imageView == imageView) { + entry.clearAspects |= clearAspects; + + if (clearAspects & VK_IMAGE_ASPECT_COLOR_BIT) + entry.clearValue.color = clearValue.color; + if (clearAspects & VK_IMAGE_ASPECT_DEPTH_BIT) + entry.clearValue.depthStencil.depth = clearValue.depthStencil.depth; + if (clearAspects & VK_IMAGE_ASPECT_STENCIL_BIT) + entry.clearValue.depthStencil.stencil = clearValue.depthStencil.stencil; + + return; + } + } + m_deferredClears.push_back({ imageView, clearAspects, clearValue }); }