From e9171e4d8253493fa0bd918123b5c7c078cb719d Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 26 Sep 2017 12:22:05 +0100 Subject: [PATCH] Consider images with external memory pNext structs to be dirty on create --- .../vulkan/wrappers/vk_resource_funcs.cpp | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 5bebc719f..ba45729f5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1277,19 +1277,42 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pImage); record->AddChunk(chunk); - if(pCreateInfo->flags & - (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)) + bool isSparse = (pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | + VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)) != 0; + + bool isExternal = false; + + const VkGenericStruct *next = (const VkGenericStruct *)pCreateInfo->pNext; + + // search for external memory image create info struct in pNext chain + while(next) + { + if(next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV || + next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) + { + isExternal = true; + break; + } + + next = next->pNext; + } + + // sparse and external images are considered dirty from creation. For sparse images this is + // so that we can serialise the tracked page table, for external images this is so we can be + // sure to fetch their contents even if we don't see any writes. + if(isSparse || isExternal) + { + SCOPED_LOCK(m_CapTransitionLock); + if(m_State != WRITING_CAPFRAME) + GetResourceManager()->MarkDirtyResource(id); + else + GetResourceManager()->MarkPendingDirty(id); + } + + if(isSparse) { record->sparseInfo = new SparseMapping(); - { - SCOPED_LOCK(m_CapTransitionLock); - if(m_State != WRITING_CAPFRAME) - GetResourceManager()->MarkDirtyResource(id); - else - GetResourceManager()->MarkPendingDirty(id); - } - if(pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) { // must record image and page dimension, and create page tables