Skip to content

Commit b702541

Browse files
committed
Handle marking sparse BDA buffers as referenced. Closes baldurk#3572
1 parent b031e69 commit b702541

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

renderdoc/driver/vulkan/vk_core.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,6 +2414,8 @@ void WrappedVulkan::StartFrameCapture(DeviceOwnedWindow devWnd)
24142414
// and its backing memory
24152415
GetResourceManager()->MarkMemoryFrameReferenced((*it)->baseResourceMem, (*it)->memOffset,
24162416
(*it)->memSize, eFrameRef_ReadBeforeWrite);
2417+
// and sparse memory (yuck yuck yuck)
2418+
GetResourceManager()->MarkSparseMapReferenced((*it)->resInfo);
24172419
}
24182420
}
24192421

renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,12 +1788,6 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic
17881788

17891789
VkResult ret = ObjDisp(device)->CreateBuffer(Unwrap(device), &patched, NULL, &buf);
17901790

1791-
if(CreateInfo.flags &
1792-
(VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT))
1793-
{
1794-
APIProps.SparseResources = true;
1795-
}
1796-
17971791
SetBufferUsageFlags(&CreateInfo, origusage);
17981792

17991793
if(ret != VK_SUCCESS)
@@ -1811,6 +1805,34 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic
18111805
memoryRequirements);
18121806
}
18131807

1808+
if(CreateInfo.flags &
1809+
(VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT))
1810+
{
1811+
APIProps.SparseResources = true;
1812+
1813+
// for sparse BDA buffers we can and must request the address now since it won't be queried on memory bind
1814+
if(CreateInfo.usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)
1815+
{
1816+
VulkanCreationInfo::Buffer &bufInfo = m_CreationInfo.m_Buffer[GetResID(buf)];
1817+
1818+
VkBufferDeviceAddressInfo getInfo = {
1819+
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1820+
NULL,
1821+
Unwrap(buf),
1822+
};
1823+
1824+
RDCCOMPILE_ASSERT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO ==
1825+
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT,
1826+
"KHR and EXT buffer_device_address should be interchangeable here.");
1827+
1828+
if(GetExtensions(GetRecord(device)).ext_KHR_buffer_device_address)
1829+
bufInfo.gpuAddress = ObjDisp(device)->GetBufferDeviceAddress(Unwrap(device), &getInfo);
1830+
else if(GetExtensions(GetRecord(device)).ext_EXT_buffer_device_address)
1831+
bufInfo.gpuAddress = ObjDisp(device)->GetBufferDeviceAddressEXT(Unwrap(device), &getInfo);
1832+
m_CreationInfo.m_BufferAddresses[bufInfo.gpuAddress] = GetResID(buf);
1833+
}
1834+
}
1835+
18141836
AddResource(Buffer, ResourceType::Buffer, "Buffer");
18151837
DerivedResource(device, Buffer);
18161838
}

0 commit comments

Comments
 (0)