diff --git a/src/vulkan/runtime/vk_buffer.c b/src/vulkan/runtime/vk_buffer.c index 3ea17bf6f95..499287f6f12 100644 --- a/src/vulkan/runtime/vk_buffer.c +++ b/src/vulkan/runtime/vk_buffer.c @@ -41,6 +41,7 @@ vk_buffer_init(struct vk_device *device, buffer->create_flags = pCreateInfo->flags; buffer->size = pCreateInfo->size; buffer->usage = pCreateInfo->usage; + buffer->device_address = 0; const VkBufferUsageFlags2CreateInfoKHR *usage2_info = vk_find_struct_const(pCreateInfo->pNext, @@ -148,3 +149,12 @@ vk_common_BindBufferMemory(VkDevice _device, return device->dispatch_table.BindBufferMemory2(_device, 1, &bind); } + +VKAPI_ATTR VkDeviceAddress VKAPI_CALL +vk_common_GetBufferDeviceAddress(UNUSED VkDevice device, + const VkBufferDeviceAddressInfo *pInfo) +{ + VK_FROM_HANDLE(vk_buffer, buffer, pInfo->buffer); + + return buffer->device_address; +} diff --git a/src/vulkan/runtime/vk_buffer.h b/src/vulkan/runtime/vk_buffer.h index 0bd9b19b6fb..9350cffe39a 100644 --- a/src/vulkan/runtime/vk_buffer.h +++ b/src/vulkan/runtime/vk_buffer.h @@ -40,6 +40,13 @@ struct vk_buffer { /** VkBufferCreateInfo::usage or VkBufferUsageFlags2CreateInfoKHR::usage */ VkBufferUsageFlags2KHR usage; + + /** Set by the implementation + * + * The implementation must set this at creation for sparse buffers or can + * delay as far as the bind for non-sparse buffers. + */ + VkDeviceAddress device_address; }; VK_DEFINE_NONDISP_HANDLE_CASTS(vk_buffer, base, VkBuffer, VK_OBJECT_TYPE_BUFFER); @@ -57,6 +64,14 @@ void vk_buffer_destroy(struct vk_device *device, const VkAllocationCallbacks *alloc, struct vk_buffer *buffer); +static inline VkDeviceAddress +vk_buffer_address(const struct vk_buffer *buffer, + VkDeviceSize offset) +{ + assert(buffer->device_address != 0); + return buffer->device_address + offset; +} + static inline uint64_t vk_buffer_range(const struct vk_buffer *buffer, uint64_t offset, uint64_t range)