From d5757c965a9c77e8edcecfdc55ce41b33bc20d98 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 26 Jul 2021 13:55:39 +0300 Subject: [PATCH] turnip: implement VK_KHR_buffer_device_address We don't advertise bufferDeviceAddressCaptureReplay capability and neither does blob, because at the moment there is no way to allocate bo with predefined iova. There is no support of any arithmetic with addresses since shaderInt64 is not enabled. However, we could enable int64 support whenever we want. Signed-off-by: Danylo Piliaiev Part-of: --- docs/features.txt | 2 +- src/freedreno/vulkan/tu_device.c | 8 +++++--- src/freedreno/vulkan/tu_shader.c | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) 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);