diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c index 0f84b8c217a..9e30f25ba58 100644 --- a/src/nouveau/vulkan/nvk_buffer.c +++ b/src/nouveau/vulkan/nvk_buffer.c @@ -79,3 +79,21 @@ nvk_BindBufferMemory2(VkDevice _device, } return VK_SUCCESS; } + +VKAPI_ATTR VkDeviceAddress VKAPI_CALL +nvk_GetBufferDeviceAddress(UNUSED VkDevice device, + const VkBufferDeviceAddressInfo *pInfo) +{ + VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer); + + return nvk_buffer_address(buffer, 0); +} + +VKAPI_ATTR uint64_t VKAPI_CALL +nvk_GetBufferOpaqueCaptureAddress(UNUSED VkDevice device, + const VkBufferDeviceAddressInfo *pInfo) +{ + VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer); + + return nvk_buffer_address(buffer, 0); +} diff --git a/src/nouveau/vulkan/nvk_device_memory.c b/src/nouveau/vulkan/nvk_device_memory.c index 7abaebdf8c7..e71945c3f30 100644 --- a/src/nouveau/vulkan/nvk_device_memory.c +++ b/src/nouveau/vulkan/nvk_device_memory.c @@ -301,3 +301,13 @@ nvk_GetMemoryFdKHR(VkDevice _device, return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT); } } + +VKAPI_ATTR uint64_t VKAPI_CALL +nvk_GetDeviceMemoryOpaqueCaptureAddress( + UNUSED VkDevice device, + const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) +{ + VK_FROM_HANDLE(nvk_device_memory, mem, pInfo->memory); + + return mem->bo->offset; +} diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index f4b2dfac771..40018294007 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -78,6 +78,9 @@ nvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, .imagelessFramebuffer = true, .separateDepthStencilLayouts = true, .hostQueryReset = true, + .bufferDeviceAddress = true, + .bufferDeviceAddressCaptureReplay = false, + .bufferDeviceAddressMultiDevice = false, }; VkPhysicalDeviceVulkan13Features core_1_3 = { @@ -109,6 +112,13 @@ nvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, f->borderColorSwizzleFromImage = false; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: { + VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *f = (void *)ext; + f->bufferDeviceAddress = true; + f->bufferDeviceAddressCaptureReplay = false; + f->bufferDeviceAddressMultiDevice = false; + break; + } case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { VkPhysicalDeviceCustomBorderColorFeaturesEXT *f = (void *)ext; f->customBorderColors = true; @@ -349,6 +359,7 @@ nvk_get_device_extensions(const struct nvk_physical_device *device, struct vk_device_extension_table *ext) { *ext = (struct vk_device_extension_table) { + .KHR_buffer_device_address = true, .KHR_copy_commands2 = true, .KHR_create_renderpass2 = true, .KHR_dedicated_allocation = true, @@ -369,6 +380,7 @@ nvk_get_device_extensions(const struct nvk_physical_device *device, #endif .KHR_variable_pointers = true, .EXT_border_color_swizzle = true, + .EXT_buffer_device_address = true, .EXT_custom_border_color = true, .EXT_extended_dynamic_state = true, .EXT_extended_dynamic_state2 = true, diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 73bf2b5747e..eeb5d99985d 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -61,8 +61,10 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdevice, return (struct spirv_to_nir_options) { .caps = { .image_write_without_format = true, + .physical_storage_buffer_address = true, }, .ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers), + .phys_ssbo_addr_format = nir_address_format_64bit_global, .ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers), .shared_addr_format = nir_address_format_32bit_offset, }; @@ -237,6 +239,8 @@ nvk_lower_nir(struct nvk_device *device, nir_shader *nir, nir_address_format_32bit_offset); NIR_PASS(_, nir, nvk_nir_lower_descriptors, rs, layout); + NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_global, + nir_address_format_64bit_global); NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ssbo, nvk_buffer_addr_format(rs->storage_buffers)); NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ubo,