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