Module: Mesa Branch: master Commit: 03683b9b2e697302c86abab80be702596f44a06e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=03683b9b2e697302c86abab80be702596f44a06e
Author: Jason Ekstrand <[email protected]> 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 <[email protected]> Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]> 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: _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
