diff --git a/docs/features.txt b/docs/features.txt index 1515e3bf0c1..d7d4038961b 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -446,7 +446,7 @@ Vulkan 1.1 -- all DONE: anv, lvp, radv, tu, vn Vulkan 1.2 -- all DONE: anv, vn VK_KHR_8bit_storage DONE (anv/gen8+, lvp, radv, vn) - VK_KHR_buffer_device_address DONE (anv/gen8+, lvp, radv, vn) + VK_KHR_buffer_device_address DONE (anv/gen8+, lvp, radv, tu, vn) VK_KHR_create_renderpass2 DONE (anv, lvp, radv, tu, vn) VK_KHR_depth_stencil_resolve DONE (anv, lvp, radv, tu, vn) VK_KHR_draw_indirect_count DONE (anv, lvp, radv, tu, vn) diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index d51299f9cb2..b0878a54474 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -156,6 +156,7 @@ get_device_extensions(const struct tu_physical_device *device, .KHR_vulkan_memory_model = true, .KHR_driver_properties = true, .KHR_separate_depth_stencil_layouts = true, + .KHR_buffer_device_address = true, #ifndef TU_USE_KGSL .KHR_timeline_semaphore = true, #endif @@ -560,7 +561,7 @@ tu_get_physical_device_features_1_2(struct tu_physical_device *pdevice, features->separateDepthStencilLayouts = true; features->hostQueryReset = true; features->timelineSemaphore = true; - features->bufferDeviceAddress = false; + features->bufferDeviceAddress = true; features->bufferDeviceAddressCaptureReplay = false; features->bufferDeviceAddressMultiDevice = false; features->vulkanMemoryModel = true; @@ -2574,8 +2575,9 @@ VkDeviceAddress tu_GetBufferDeviceAddress(VkDevice _device, const VkBufferDeviceAddressInfoKHR* pInfo) { - tu_stub(); - return 0; + TU_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer); + + return tu_buffer_iova(buffer); } uint64_t tu_GetBufferOpaqueCaptureAddress( diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c index a0baf0921b6..ea5838a518f 100644 --- a/src/freedreno/vulkan/tu_shader.c +++ b/src/freedreno/vulkan/tu_shader.c @@ -81,6 +81,7 @@ tu_spirv_to_nir(struct tu_device *dev, .subgroup_basic = true, .subgroup_ballot = true, .subgroup_vote = true, + .physical_storage_buffer_address = true, }, }; @@ -749,6 +750,10 @@ tu_shader_create(struct tu_device *dev, nir_var_mem_ubo | nir_var_mem_ssbo, nir_address_format_vec2_index_32bit_offset); + NIR_PASS_V(nir, nir_lower_explicit_io, + nir_var_mem_global, + nir_address_format_64bit_global); + if (nir->info.stage == MESA_SHADER_COMPUTE) { NIR_PASS_V(nir, nir_lower_vars_to_explicit_types, nir_var_mem_shared, shared_type_info);