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
This commit is contained in:
Aliya Pazylbekova
2025-10-03 19:33:04 +00:00
committed by Baldur Karlsson
parent 49e764e2c1
commit 56ee544a28
4 changed files with 22 additions and 9 deletions
+1 -1
View File
@@ -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;
+1
View File
@@ -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;
@@ -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,
@@ -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)