From c1d6a62620144610d696dc2e9e900a01d8f01ea2 Mon Sep 17 00:00:00 2001 From: Aliya Pazylbekova Date: Fri, 3 Oct 2025 19:33:04 +0000 Subject: [PATCH] Special treatment of UNDEFINED layout for external images - Preserve the initial contents of UNDEFINED images if they are external - Don't consider a pipeline barrier from UNDEFINED a resource discard for external images Change-Id: Ife30e7c542a66668d681d492363a25745238119e --- renderdoc/driver/vulkan/vk_initstate.cpp | 2 +- renderdoc/driver/vulkan/vk_resources.h | 1 + .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 27 +++++++++++++------ .../vulkan/wrappers/vk_resource_funcs.cpp | 1 + 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 728964da0c..7e20dfba29 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -228,7 +228,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) allUndef = false; } - if(allUndef) + if(allUndef && !imageInfo.isExternal) { RDCDEBUG("Ignoring init states for %s as it never left undefined", ToStr(im->id).c_str()); return true; diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index db844db1d8..e635021fbd 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -902,6 +902,7 @@ struct ImageInfo uint16_t levelCount = 0; uint16_t sampleCount = 0; bool storage = false; + bool isExternal = false; bool isAHB = false; VkExtent3D extent = {0, 0, 0}; VkImageType imageType = VK_IMAGE_TYPE_2D; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index c3250ecada..923a0fb711 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -4675,9 +4675,13 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( const VkImageMemoryBarrier &b = pImageMemoryBarriers[i]; if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED) { - m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair( - GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, - ResourceUsage::Discard))); + VulkanCreationInfo::Image &imgInfo = m_CreationInfo.m_Image[GetResID(b.image)]; + if(!imgInfo.external) + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair( + GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, + ResourceUsage::Discard))); + } } } } @@ -4706,7 +4710,9 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( for(uint32_t i = 0; i < imageMemoryBarrierCount; i++) { const VkImageMemoryBarrier &b = pImageMemoryBarriers[i]; - if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED) + VulkanCreationInfo::Image &imgInfo = m_CreationInfo.m_Image[GetResID(b.image)]; + if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && + !imgInfo.external) { VkImageLayout newLayout = b.newLayout; SanitiseNewImageLayout(newLayout); @@ -4928,9 +4934,13 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier2(SerialiserType &ser, if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && b.newLayout != VK_IMAGE_LAYOUT_UNDEFINED) { - m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair( - GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, - ResourceUsage::Discard))); + VulkanCreationInfo::Image &imgInfo = m_CreationInfo.m_Image[GetResID(b.image)]; + if(!imgInfo.external) + { + m_BakedCmdBufferInfo[m_LastCmdBufferID].resourceUsage.push_back(make_rdcpair( + GetResID(b.image), EventUsage(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID, + ResourceUsage::Discard))); + } } } } @@ -4980,8 +4990,9 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier2(SerialiserType &ser, for(uint32_t i = 0; i < DependencyInfo.imageMemoryBarrierCount; i++) { const VkImageMemoryBarrier2 &b = DependencyInfo.pImageMemoryBarriers[i]; + VulkanCreationInfo::Image &imgInfo = m_CreationInfo.m_Image[GetResID(b.image)]; if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && - b.newLayout != VK_IMAGE_LAYOUT_UNDEFINED) + b.newLayout != VK_IMAGE_LAYOUT_UNDEFINED && !imgInfo.external) { GetDebugManager()->FillWithDiscardPattern( commandBuffer, DiscardType::UndefinedTransition, b.image, b.newLayout, diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index eda3d3c01a..9e2fc95b62 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -2915,6 +2915,7 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * next->sType == VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID) { isExternal = true; + resInfo.imageInfo.isExternal = true; // we can't call vkGetImageMemoryRequirements on AHB-backed images until they are bound if(next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO)