Mesa (main): turnip: implement VK_KHR_buffer_device_address

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 23 19:10:17 UTC 2021


Module: Mesa
Branch: main
Commit: d5757c965a9c77e8edcecfdc55ce41b33bc20d98
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d5757c965a9c77e8edcecfdc55ce41b33bc20d98

Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date:   Mon Jul 26 13:55:39 2021 +0300

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 <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8717>

---

 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);



More information about the mesa-commit mailing list