diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 7d3325224..591a171cd 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -267,6 +267,20 @@ void GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, VkDeviceSize size, u vkr = ObjDisp(dev)->BindBufferMemory(Unwrap(dev), buf, mem, 0); CHECK_VKR(driver, vkr); + + if(flags & eGPUBufferAddressable) + { + RDCCOMPILE_ASSERT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO == + VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT, + "KHR and EXT buffer_device_address should be interchangeable here."); + VkBufferDeviceAddressInfo getAddressInfo = {VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, NULL, + buf}; + + if(useBufferAddressKHR) + addr = ObjDisp(dev)->GetBufferDeviceAddress(Unwrap(dev), &getAddressInfo); + else + addr = ObjDisp(dev)->GetBufferDeviceAddressEXT(Unwrap(dev), &getAddressInfo); + } } void GPUBuffer::FillDescriptor(VkDescriptorBufferInfo &desc) @@ -283,6 +297,7 @@ void GPUBuffer::Destroy() ObjDisp(device)->DestroyBuffer(Unwrap(device), buf, NULL); ObjDisp(device)->FreeMemory(Unwrap(device), mem, NULL); } + addr = 0; } void *GPUBuffer::Map(uint32_t *bindoffset, VkDeviceSize usedsize) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index d3bc09881..717daa142 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -221,6 +221,8 @@ struct GPUBuffer void FillDescriptor(VkDescriptorBufferInfo &desc); + VkDeviceAddress Address() const { return addr; } + size_t GetRingCount() { return size_t(ringCount); } void *Map(VkDeviceSize &bindoffset, VkDeviceSize usedsize = 0); void *Map(uint32_t *bindoffset = NULL, VkDeviceSize usedsize = 0); @@ -233,6 +235,8 @@ private: VkBuffer buf = VK_NULL_HANDLE; VkDeviceMemory mem = VK_NULL_HANDLE; + VkDeviceAddress addr = 0; + // uniform buffer alignment requirement VkDeviceSize align = 0;