1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-23 19:54:16 +01:00

[dxvk] Factor out method to find pending deferred clears

This commit is contained in:
Philip Rebohle 2025-02-12 17:38:52 +01:00
parent 1cabbee2bb
commit f5a5ec7c88
2 changed files with 18 additions and 12 deletions

View File

@ -4244,18 +4244,7 @@ namespace dxvk {
return false; return false;
// Find a pending clear that overlaps with the source image // Find a pending clear that overlaps with the source image
const DxvkDeferredClear* clear = nullptr; const DxvkDeferredClear* clear = findDeferredClear(srcImage, vk::makeSubresourceRange(srcSubresource));
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;
}
}
if (!clear) if (!clear)
return false; return false;
@ -6187,6 +6176,19 @@ namespace dxvk {
} }
DxvkDeferredClear* DxvkContext::findDeferredClear(
const Rc<DxvkImage>& 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() { bool DxvkContext::updateIndexBufferBinding() {
if (unlikely(!m_state.vi.indexBuffer.length())) if (unlikely(!m_state.vi.indexBuffer.length()))
return false; return false;

View File

@ -1731,6 +1731,10 @@ namespace dxvk {
const VkImageSubresourceRange& subresources, const VkImageSubresourceRange& subresources,
bool flushClears = true); bool flushClears = true);
DxvkDeferredClear* findDeferredClear(
const Rc<DxvkImage>& image,
const VkImageSubresourceRange& subresources);
bool updateIndexBufferBinding(); bool updateIndexBufferBinding();
void updateVertexBufferBindings(); void updateVertexBufferBindings();