Mesa (main): radv: Implement build_node_to_addr for GFX8 and below

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Oct 4 12:16:03 UTC 2021


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

Author: Joshua Ashton <joshua at froggi.es>
Date:   Tue Sep 21 15:46:03 2021 +0100

radv: Implement build_node_to_addr for GFX8 and below

Removes the nir_ prefix also given it no longer acts like a typical builder function.

Signed-off-by: Joshua Ashton <joshua at froggi.es>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12974>

---

 src/amd/vulkan/radv_pipeline_rt.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c
index d78b0901abe..e38469d7e14 100644
--- a/src/amd/vulkan/radv_pipeline_rt.c
+++ b/src/amd/vulkan/radv_pipeline_rt.c
@@ -1127,7 +1127,7 @@ init_traversal_vars(nir_builder *b)
 }
 
 static nir_ssa_def *
-nir_build_addr_to_node(nir_builder *b, nir_ssa_def *addr)
+build_addr_to_node(nir_builder *b, nir_ssa_def *addr)
 {
    const uint64_t bvh_size = 1ull << 42;
    nir_ssa_def *node = nir_ushr(b, addr, nir_imm_int(b, 3));
@@ -1135,13 +1135,15 @@ nir_build_addr_to_node(nir_builder *b, nir_ssa_def *addr)
 }
 
 static nir_ssa_def *
-nir_build_node_to_addr(nir_builder *b, nir_ssa_def *node)
+build_node_to_addr(struct radv_device *device, nir_builder *b, nir_ssa_def *node)
 {
    nir_ssa_def *addr = nir_iand(b, node, nir_imm_int64(b, ~7ull));
    addr = nir_ishl(b, addr, nir_imm_int(b, 3));
    /* Assumes everything is in the top half of address space, which is true in
     * GFX9+ for now. */
-   return nir_ior(b, addr, nir_imm_int64(b, 0xffffull << 48));
+   return device->physical_device->rad_info.chip_class >= GFX9
+      ? nir_ior(b, addr, nir_imm_int64(b, 0xffffull << 48))
+      : addr;
 }
 
 /* When a hit is opaque the any_hit shader is skipped for this hit and the hit
@@ -1259,7 +1261,7 @@ insert_traversal_triangle_case(struct radv_device *device,
 
       nir_ssa_def *triangle_info = nir_build_load_global(
          b, 2, 32,
-         nir_iadd(b, nir_build_node_to_addr(b, bvh_node),
+         nir_iadd(b, build_node_to_addr(device, b, bvh_node),
                   nir_imm_int64(b, offsetof(struct radv_bvh_triangle_node, triangle_id))),
          .align_mul = 4, .align_offset = 0);
       nir_ssa_def *primitive_id = nir_channel(b, triangle_info, 0);
@@ -1364,7 +1366,7 @@ insert_traversal_aabb_case(struct radv_device *device,
 {
    RADV_FROM_HANDLE(radv_pipeline_layout, layout, pCreateInfo->layout);
 
-   nir_ssa_def *node_addr = nir_build_node_to_addr(b, bvh_node);
+   nir_ssa_def *node_addr = build_node_to_addr(device, b, bvh_node);
    nir_ssa_def *triangle_info = nir_build_load_global(
       b, 2, 32, nir_iadd(b, node_addr, nir_imm_int64(b, 24)), .align_mul = 4, .align_offset = 0);
    nir_ssa_def *primitive_id = nir_channel(b, triangle_info, 0);
@@ -1549,7 +1551,7 @@ insert_traversal(struct radv_device *device, const VkRayTracingPipelineCreateInf
 
    nir_push_if(b, nir_ine(b, accel_struct, nir_imm_int64(b, 0)));
    {
-      nir_store_var(b, trav_vars.bvh_base, nir_build_addr_to_node(b, accel_struct), 1);
+      nir_store_var(b, trav_vars.bvh_base, build_addr_to_node(b, accel_struct), 1);
 
       nir_ssa_def *bvh_root =
          nir_build_load_global(b, 1, 32, accel_struct, .access = ACCESS_NON_WRITEABLE,
@@ -1586,7 +1588,7 @@ insert_traversal(struct radv_device *device, const VkRayTracingPipelineCreateInf
          b, nir_uge(b, nir_load_var(b, trav_vars.top_stack), nir_load_var(b, trav_vars.stack)));
       nir_store_var(b, trav_vars.top_stack, nir_imm_int(b, 0), 1);
       nir_store_var(b, trav_vars.bvh_base,
-                    nir_build_addr_to_node(b, nir_load_var(b, vars->accel_struct)), 1);
+                    build_addr_to_node(b, nir_load_var(b, vars->accel_struct)), 1);
       nir_store_var(b, trav_vars.origin, nir_load_var(b, vars->origin), 7);
       nir_store_var(b, trav_vars.dir, nir_load_var(b, vars->direction), 7);
       nir_store_var(b, trav_vars.inv_dir, nir_fdiv(b, vec3ones, nir_load_var(b, trav_vars.dir)), 7);
@@ -1621,7 +1623,7 @@ insert_traversal(struct radv_device *device, const VkRayTracingPipelineCreateInf
             nir_push_else(b, NULL);
             {
                /* instance */
-               nir_ssa_def *instance_node_addr = nir_build_node_to_addr(b, bvh_node);
+               nir_ssa_def *instance_node_addr = build_node_to_addr(device, b, bvh_node);
                nir_ssa_def *instance_data = nir_build_load_global(
                   b, 4, 32, instance_node_addr, .align_mul = 64, .align_offset = 0);
                nir_ssa_def *wto_matrix[] = {
@@ -1648,7 +1650,7 @@ insert_traversal(struct radv_device *device, const VkRayTracingPipelineCreateInf
 
                nir_store_var(b, trav_vars.top_stack, nir_load_var(b, trav_vars.stack), 1);
                nir_store_var(b, trav_vars.bvh_base,
-                             nir_build_addr_to_node(
+                             build_addr_to_node(
                                 b, nir_pack_64_2x32(b, nir_channels(b, instance_data, 0x3))),
                              1);
                nir_store_shared(b,



More information about the mesa-commit mailing list