Module: Mesa Branch: main Commit: e411e0afd33d30320b6a83b1619746f65d1677a0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e411e0afd33d30320b6a83b1619746f65d1677a0
Author: Caio Oliveira <[email protected]> Date: Sun Feb 26 14:11:04 2023 -0800 microsoft/compiler: Handle scoped barrier in Tess splitting Reviewed-by: Jesse Natalie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3339> --- src/microsoft/compiler/dxil_nir_tess.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/microsoft/compiler/dxil_nir_tess.c b/src/microsoft/compiler/dxil_nir_tess.c index 2adf3f8bc59..4b94ea25d1d 100644 --- a/src/microsoft/compiler/dxil_nir_tess.c +++ b/src/microsoft/compiler/dxil_nir_tess.c @@ -27,6 +27,21 @@ #include "dxil_nir.h" +static bool +is_memory_barrier_tcs_patch(const nir_intrinsic_instr *intr) +{ + if (intr->intrinsic == nir_intrinsic_scoped_barrier && + nir_intrinsic_memory_modes(intr) & nir_var_shader_out) { + assert(nir_intrinsic_memory_modes(intr) == nir_var_shader_out); + assert(nir_intrinsic_memory_scope(intr) == NIR_SCOPE_WORKGROUP); + return true; + } else if (intr->intrinsic == nir_intrinsic_memory_barrier_tcs_patch) { + return true; + } else { + return false; + } +} + static void remove_hs_intrinsics(nir_function_impl *impl) { @@ -36,7 +51,7 @@ remove_hs_intrinsics(nir_function_impl *impl) continue; nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); if (intr->intrinsic != nir_intrinsic_store_output && - intr->intrinsic != nir_intrinsic_memory_barrier_tcs_patch && + !is_memory_barrier_tcs_patch(intr) && intr->intrinsic != nir_intrinsic_control_barrier) continue; nir_instr_remove(instr); @@ -85,7 +100,7 @@ prune_patch_function_to_intrinsic_and_srcs(nir_function_impl *impl) if (instr->type == nir_instr_type_intrinsic) { nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); if (intr->intrinsic != nir_intrinsic_store_output && - intr->intrinsic != nir_intrinsic_memory_barrier_tcs_patch) + !is_memory_barrier_tcs_patch(intr)) continue; } else if (instr->type != nir_instr_type_jump) continue; @@ -253,7 +268,11 @@ dxil_nir_split_tess_ctrl(nir_shader *nir, nir_function **patch_const_func) nir_ssa_def_rewrite_uses(&intr->dest.ssa, state.count); break; } + case nir_intrinsic_scoped_barrier: case nir_intrinsic_memory_barrier_tcs_patch: + if (!is_memory_barrier_tcs_patch(intr)) + break; + /* The GL tessellation spec says: * The barrier() function may only be called inside the main entry point of the tessellation control shader * and may not be called in potentially divergent flow control. In particular, barrier() may not be called
