From f5a5ec7c88b6c4245cb5156baf50523b799a5c80 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 12 Feb 2025 17:38:52 +0100 Subject: [PATCH] [dxvk] Factor out method to find pending deferred clears --- src/dxvk/dxvk_context.cpp | 26 ++++++++++++++------------ src/dxvk/dxvk_context.h | 4 ++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b7c594e89..b4f38fedd 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -4244,18 +4244,7 @@ namespace dxvk { return false; // Find a pending clear that overlaps with the source image - const DxvkDeferredClear* clear = nullptr; - - for (const auto& entry : m_deferredClears) { - // Entries in the deferred clear array cannot overlap, so - // if we find an entry covering all source subresources, - // it's the only one in the list that does. - if ((entry.imageView->image() == srcImage) && ((srcSubresource.aspectMask & entry.clearAspects) == srcSubresource.aspectMask) - && (vk::checkSubresourceRangeSuperset(entry.imageView->subresources(), vk::makeSubresourceRange(srcSubresource)))) { - clear = &entry; - break; - } - } + const DxvkDeferredClear* clear = findDeferredClear(srcImage, vk::makeSubresourceRange(srcSubresource)); if (!clear) return false; @@ -6187,6 +6176,19 @@ namespace dxvk { } + DxvkDeferredClear* DxvkContext::findDeferredClear( + const Rc& image, + const VkImageSubresourceRange& subresources) { + for (auto& entry : m_deferredClears) { + if ((entry.imageView->image() == image) && ((subresources.aspectMask & entry.clearAspects) == subresources.aspectMask) + && (vk::checkSubresourceRangeSuperset(entry.imageView->imageSubresources(), subresources))) + return &entry; + } + + return nullptr; + } + + bool DxvkContext::updateIndexBufferBinding() { if (unlikely(!m_state.vi.indexBuffer.length())) return false; diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 8b2d5dfc4..70fbdf2c2 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1731,6 +1731,10 @@ namespace dxvk { const VkImageSubresourceRange& subresources, bool flushClears = true); + DxvkDeferredClear* findDeferredClear( + const Rc& image, + const VkImageSubresourceRange& subresources); + bool updateIndexBufferBinding(); void updateVertexBufferBindings();