Mesa (master): nir: Handle ray-tracing intrinsics and storage classes in copy-prop etc.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 6 00:40:27 UTC 2020


Module: Mesa
Branch: master
Commit: 03683b9b2e697302c86abab80be702596f44a06e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=03683b9b2e697302c86abab80be702596f44a06e

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Jul 10 15:32:43 2020 -0500

nir: Handle ray-tracing intrinsics and storage classes in copy-prop etc.

We need to consider shader calls as potential writes to their payloads.
For other ray-tracing intrinsics, we may not have a shader payload
pointer and have to treat them more like a barrier.  We also need to
ensure that global and SSBO reads/writes aren't propagated across shader
call intrinsics.

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6479>

---

 src/compiler/nir/nir.c                    | 14 ++++++++
 src/compiler/nir/nir.h                    |  1 +
 src/compiler/nir/nir_opt_combine_stores.c | 22 ++++++++++++
 src/compiler/nir/nir_opt_copy_prop_vars.c | 59 +++++++++++++++++++++++++++++++
 4 files changed, 96 insertions(+)

diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index 1fc873050f2..acedb0536ab 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -2502,3 +2502,17 @@ nir_image_intrinsic_coord_components(const nir_intrinsic_instr *instr)
    else
       return coords + nir_intrinsic_image_array(instr);
 }
+
+nir_src *
+nir_get_shader_call_payload_src(nir_intrinsic_instr *call)
+{
+   switch (call->intrinsic) {
+   case nir_intrinsic_trace_ray:
+      return &call->src[10];
+   case nir_intrinsic_execute_callable:
+      return &call->src[1];
+   default:
+      unreachable("Not a call intrinsic");
+      return NULL;
+   }
+}
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index ef77bba4d0e..389c58587b3 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -4579,6 +4579,7 @@ bool nir_lower_explicit_io(nir_shader *shader,
 
 nir_src *nir_get_io_offset_src(nir_intrinsic_instr *instr);
 nir_src *nir_get_io_vertex_index_src(nir_intrinsic_instr *instr);
+nir_src *nir_get_shader_call_payload_src(nir_intrinsic_instr *call);
 
 bool nir_is_per_vertex_io(const nir_variable *var, gl_shader_stage stage);
 
diff --git a/src/compiler/nir/nir_opt_combine_stores.c b/src/compiler/nir/nir_opt_combine_stores.c
index 74a2a9ce675..3c69ac4ed20 100644
--- a/src/compiler/nir/nir_opt_combine_stores.c
+++ b/src/compiler/nir/nir_opt_combine_stores.c
@@ -350,6 +350,20 @@ combine_stores_block(struct combine_stores_state *state, nir_block *block)
          combine_stores_with_modes(state, nir_var_shader_out);
          break;
 
+      case nir_intrinsic_report_ray_intersection:
+         combine_stores_with_modes(state, nir_var_mem_ssbo |
+                                          nir_var_mem_global |
+                                          nir_var_shader_call_data |
+                                          nir_var_ray_hit_attrib);
+         break;
+
+      case nir_intrinsic_ignore_ray_intersection:
+      case nir_intrinsic_terminate_ray:
+         combine_stores_with_modes(state, nir_var_mem_ssbo |
+                                          nir_var_mem_global |
+                                          nir_var_shader_call_data);
+         break;
+
       case nir_intrinsic_load_deref: {
          nir_deref_instr *src = nir_src_as_deref(intrin->src[0]);
          combine_stores_with_deref(state, src);
@@ -380,6 +394,14 @@ combine_stores_block(struct combine_stores_state *state, nir_block *block)
          break;
       }
 
+      case nir_intrinsic_trace_ray:
+      case nir_intrinsic_execute_callable: {
+         nir_deref_instr *payload =
+            nir_src_as_deref(*nir_get_shader_call_payload_src(intrin));
+         combine_stores_with_deref(state, payload);
+         break;
+      }
+
       case nir_intrinsic_deref_atomic_add:
       case nir_intrinsic_deref_atomic_imin:
       case nir_intrinsic_deref_atomic_umin:
diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c
index 2c6ad6b4043..dea6f7b020f 100644
--- a/src/compiler/nir/nir_opt_copy_prop_vars.c
+++ b/src/compiler/nir/nir_opt_copy_prop_vars.c
@@ -184,6 +184,39 @@ gather_vars_written(struct copy_prop_var_state *state,
             written->modes = nir_var_shader_out;
             break;
 
+         case nir_intrinsic_trace_ray:
+         case nir_intrinsic_execute_callable: {
+            nir_deref_instr *payload =
+               nir_src_as_deref(*nir_get_shader_call_payload_src(intrin));
+
+            nir_component_mask_t mask =
+               BITFIELD_MASK(glsl_get_vector_elements(payload->type));
+
+            struct hash_entry *ht_entry =
+               _mesa_hash_table_search(written->derefs, payload);
+            if (ht_entry) {
+               ht_entry->data = (void *)(mask | (uintptr_t)ht_entry->data);
+            } else {
+               _mesa_hash_table_insert(written->derefs, payload,
+                                       (void *)(uintptr_t)mask);
+            }
+            break;
+         }
+
+         case nir_intrinsic_report_ray_intersection:
+            written->modes |= nir_var_mem_ssbo |
+                              nir_var_mem_global |
+                              nir_var_shader_call_data |
+                              nir_var_ray_hit_attrib;
+            break;
+
+         case nir_intrinsic_ignore_ray_intersection:
+         case nir_intrinsic_terminate_ray:
+            written->modes |= nir_var_mem_ssbo |
+                              nir_var_mem_global |
+                              nir_var_shader_call_data;
+            break;
+
          case nir_intrinsic_deref_atomic_add:
          case nir_intrinsic_deref_atomic_imin:
          case nir_intrinsic_deref_atomic_umin:
@@ -846,6 +879,20 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
          apply_barrier_for_modes(copies, nir_var_shader_out);
          break;
 
+      case nir_intrinsic_report_ray_intersection:
+         apply_barrier_for_modes(copies, nir_var_mem_ssbo |
+                                         nir_var_mem_global |
+                                         nir_var_shader_call_data |
+                                         nir_var_ray_hit_attrib);
+         break;
+
+      case nir_intrinsic_ignore_ray_intersection:
+      case nir_intrinsic_terminate_ray:
+         apply_barrier_for_modes(copies, nir_var_mem_ssbo |
+                                         nir_var_mem_global |
+                                         nir_var_shader_call_data);
+         break;
+
       case nir_intrinsic_load_deref: {
          if (debug) dump_instr(instr);
 
@@ -1057,6 +1104,18 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
          break;
       }
 
+      case nir_intrinsic_trace_ray:
+      case nir_intrinsic_execute_callable: {
+         if (debug) dump_instr(instr);
+
+         nir_deref_instr *payload =
+            nir_src_as_deref(*nir_get_shader_call_payload_src(intrin));
+         nir_component_mask_t full_mask =
+            BITFIELD_MASK(glsl_get_vector_elements(payload->type));
+         kill_aliases(copies, payload, full_mask);
+         break;
+      }
+
       case nir_intrinsic_memcpy_deref:
       case nir_intrinsic_deref_atomic_add:
       case nir_intrinsic_deref_atomic_imin:



More information about the mesa-commit mailing list