Module: Mesa Branch: main Commit: 36aa1a29590494750a315951ff58c3f83ff9aeef URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=36aa1a29590494750a315951ff58c3f83ff9aeef
Author: Michael Tang <[email protected]> Date: Thu Oct 7 16:19:33 2021 -0700 gallium/d3d12: move d3d12_lower_bool_input to microsoft/compiler Reviewed-by: Jesse Natalie <[email protected]> Reviewed-by: Boris Brezillon <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13262> --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 2 +- src/gallium/drivers/d3d12/d3d12_nir_passes.c | 48 ---------------------------- src/gallium/drivers/d3d12/d3d12_nir_passes.h | 3 -- src/microsoft/compiler/dxil_nir.c | 48 ++++++++++++++++++++++++++++ src/microsoft/compiler/dxil_nir.h | 1 + 5 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index ca3e8a9119c..b2d4d9a9f58 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -160,7 +160,7 @@ compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel, NIR_PASS_V(nir, nir_lower_packed_ubo_loads); NIR_PASS_V(nir, d3d12_lower_load_first_vertex); NIR_PASS_V(nir, d3d12_lower_state_vars, shader); - NIR_PASS_V(nir, d3d12_lower_bool_input); + NIR_PASS_V(nir, dxil_nir_lower_bool_input); struct nir_to_dxil_options opts = {}; opts.interpolate_at_vertex = screen->have_load_at_vertex; diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.c b/src/gallium/drivers/d3d12/d3d12_nir_passes.c index 0b3bbbc43da..7ed43cbc7b8 100644 --- a/src/gallium/drivers/d3d12/d3d12_nir_passes.c +++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.c @@ -542,54 +542,6 @@ d3d12_lower_state_vars(nir_shader *nir, struct d3d12_shader *shader) return progress; } -static bool -lower_bool_input_filter(const nir_instr *instr, - UNUSED const void *_options) -{ - if (instr->type != nir_instr_type_intrinsic) - return false; - - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - if (intr->intrinsic == nir_intrinsic_load_front_face) - return true; - - if (intr->intrinsic == nir_intrinsic_load_deref) { - nir_deref_instr *deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr); - nir_variable *var = nir_deref_instr_get_variable(deref); - return var->data.mode == nir_var_shader_in && - glsl_get_base_type(var->type) == GLSL_TYPE_BOOL; - } - - return false; -} - -static nir_ssa_def * -lower_bool_input_impl(nir_builder *b, nir_instr *instr, - UNUSED void *_options) -{ - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - - if (intr->intrinsic == nir_intrinsic_load_deref) { - nir_deref_instr *deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr); - nir_variable *var = nir_deref_instr_get_variable(deref); - - /* rewrite var->type */ - var->type = glsl_vector_type(GLSL_TYPE_UINT, - glsl_get_vector_elements(var->type)); - deref->type = var->type; - } - - intr->dest.ssa.bit_size = 32; - return nir_i2b1(b, &intr->dest.ssa); -} - -bool -d3d12_lower_bool_input(struct nir_shader *s) -{ - return nir_shader_lower_instructions(s, lower_bool_input_filter, - lower_bool_input_impl, NULL); -} - void d3d12_add_missing_dual_src_target(struct nir_shader *s, unsigned missing_mask) diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.h b/src/gallium/drivers/d3d12/d3d12_nir_passes.h index 38d36206caf..4461939013e 100644 --- a/src/gallium/drivers/d3d12/d3d12_nir_passes.h +++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.h @@ -54,9 +54,6 @@ d3d12_lower_depth_range(nir_shader *nir); bool d3d12_lower_load_first_vertex(nir_shader *nir); -bool -d3d12_lower_bool_input(struct nir_shader *s); - void d3d12_lower_uint_cast(nir_shader *nir, bool is_signed); diff --git a/src/microsoft/compiler/dxil_nir.c b/src/microsoft/compiler/dxil_nir.c index cb27054ece1..d968d98b46b 100644 --- a/src/microsoft/compiler/dxil_nir.c +++ b/src/microsoft/compiler/dxil_nir.c @@ -1466,6 +1466,54 @@ dxil_nir_create_bare_samplers(nir_shader *nir) } +static bool +lower_bool_input_filter(const nir_instr *instr, + UNUSED const void *_options) +{ + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + if (intr->intrinsic == nir_intrinsic_load_front_face) + return true; + + if (intr->intrinsic == nir_intrinsic_load_deref) { + nir_deref_instr *deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr); + nir_variable *var = nir_deref_instr_get_variable(deref); + return var->data.mode == nir_var_shader_in && + glsl_get_base_type(var->type) == GLSL_TYPE_BOOL; + } + + return false; +} + +static nir_ssa_def * +lower_bool_input_impl(nir_builder *b, nir_instr *instr, + UNUSED void *_options) +{ + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + + if (intr->intrinsic == nir_intrinsic_load_deref) { + nir_deref_instr *deref = nir_instr_as_deref(intr->src[0].ssa->parent_instr); + nir_variable *var = nir_deref_instr_get_variable(deref); + + /* rewrite var->type */ + var->type = glsl_vector_type(GLSL_TYPE_UINT, + glsl_get_vector_elements(var->type)); + deref->type = var->type; + } + + intr->dest.ssa.bit_size = 32; + return nir_i2b1(b, &intr->dest.ssa); +} + +bool +dxil_nir_lower_bool_input(struct nir_shader *s) +{ + return nir_shader_lower_instructions(s, lower_bool_input_filter, + lower_bool_input_impl, NULL); +} + /* Comparison function to sort io values so that first come normal varyings, * then system values, and then system generated values. */ diff --git a/src/microsoft/compiler/dxil_nir.h b/src/microsoft/compiler/dxil_nir.h index 252f5367636..9820405a60f 100644 --- a/src/microsoft/compiler/dxil_nir.h +++ b/src/microsoft/compiler/dxil_nir.h @@ -50,6 +50,7 @@ bool dxil_nir_lower_system_values_to_zero(nir_shader *shader, gl_system_value* system_value, uint32_t count); bool dxil_nir_create_bare_samplers(nir_shader *shader); +bool dxil_nir_lower_bool_input(struct nir_shader *s); nir_ssa_def * build_load_ubo_dxil(nir_builder *b, nir_ssa_def *buffer,
