From 201053bac14b695c0d8a688b051afcdb9bfd6c40 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Wed, 3 Apr 2024 15:13:14 -0700 Subject: [PATCH] d3d12: Fix d3d12_lower_triangle_strip if multiple vars are in a single location Part-of: --- src/gallium/drivers/d3d12/d3d12_nir_passes.c | 34 ++++++++------------ 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_nir_passes.c b/src/gallium/drivers/d3d12/d3d12_nir_passes.c index cb26e263818..b212a158899 100644 --- a/src/gallium/drivers/d3d12/d3d12_nir_passes.c +++ b/src/gallium/drivers/d3d12/d3d12_nir_passes.c @@ -639,7 +639,7 @@ d3d12_lower_primitive_id(nir_shader *shader) static void lower_triangle_strip_store(nir_builder *b, nir_intrinsic_instr *intr, nir_variable *vertex_count_var, - nir_variable **varyings) + struct hash_table *varyings) { /** * tmp_varying[slot][min(vertex_count, 2)] = src @@ -651,7 +651,7 @@ lower_triangle_strip_store(nir_builder *b, nir_intrinsic_instr *intr, if (var->data.mode != nir_var_shader_out) return; - nir_deref_instr *deref = nir_build_deref_array(b, nir_build_deref_var(b, varyings[var->data.location]), index); + nir_deref_instr *deref = nir_build_deref_array(b, nir_build_deref_var(b, _mesa_hash_table_search(varyings, var)->data), index); nir_def *value = intr->src[1].ssa; nir_store_deref(b, deref, value, 0xf); nir_instr_remove(&intr->instr); @@ -660,8 +660,7 @@ lower_triangle_strip_store(nir_builder *b, nir_intrinsic_instr *intr, static void lower_triangle_strip_emit_vertex(nir_builder *b, nir_intrinsic_instr *intr, nir_variable *vertex_count_var, - nir_variable **varyings, - nir_variable **out_varyings) + struct hash_table *varyings) { // TODO xfb + flat shading + last_pv /** @@ -684,20 +683,17 @@ lower_triangle_strip_emit_vertex(nir_builder *b, nir_intrinsic_instr *intr, nir_if *count_check = nir_push_if(b, count_cmp); for (int j = 0; j < 3; ++j) { - for (int i = 0; i < VARYING_SLOT_MAX; ++i) { - if (!varyings[i]) - continue; - nir_copy_deref(b, nir_build_deref_var(b, out_varyings[i]), - nir_build_deref_array_imm(b, nir_build_deref_var(b, varyings[i]), j)); + nir_foreach_shader_out_variable(var, b->shader) { + nir_copy_deref(b, nir_build_deref_var(b, var), + nir_build_deref_array_imm(b, nir_build_deref_var(b, _mesa_hash_table_search(varyings, var)->data), j)); } nir_emit_vertex(b, 0); } - for (int i = 0; i < VARYING_SLOT_MAX; ++i) { - if (!varyings[i]) - continue; - nir_copy_deref(b, nir_build_deref_array(b, nir_build_deref_var(b, varyings[i]), nir_umod(b, vertex_count, two)), - nir_build_deref_array(b, nir_build_deref_var(b, varyings[i]), two)); + nir_foreach_shader_out_variable(var, b->shader) { + nir_variable *varying = _mesa_hash_table_search(varyings, var)->data; + nir_copy_deref(b, nir_build_deref_array(b, nir_build_deref_var(b, varying), nir_umod(b, vertex_count, two)), + nir_build_deref_array(b, nir_build_deref_var(b, varying), two)); } nir_end_primitive(b, .stream_id = 0); @@ -726,8 +722,7 @@ d3d12_lower_triangle_strip(nir_shader *shader) { nir_builder b; nir_function_impl *impl = nir_shader_get_entrypoint(shader); - nir_variable *tmp_vars[VARYING_SLOT_MAX] = {0}; - nir_variable *out_vars[VARYING_SLOT_MAX] = {0}; + struct hash_table *tmp_vars = _mesa_pointer_hash_table_create(NULL); b = nir_builder_create(impl); shader->info.gs.vertices_out = (shader->info.gs.vertices_out - 2) * 3; @@ -739,8 +734,7 @@ d3d12_lower_triangle_strip(nir_shader *shader) b.cursor = nir_before_block(first); nir_foreach_variable_with_modes(var, shader, nir_var_shader_out) { const struct glsl_type *type = glsl_array_type(var->type, 3, 0); - tmp_vars[var->data.location] = nir_local_variable_create(impl, type, "tmp_var"); - out_vars[var->data.location] = var; + _mesa_hash_table_insert(tmp_vars, var, nir_local_variable_create(impl, type, "tmp_var")); } nir_store_var(&b, vertex_count_var, nir_imm_int(&b, 0), 1); @@ -758,8 +752,7 @@ d3d12_lower_triangle_strip(nir_shader *shader) case nir_intrinsic_emit_vertex_with_counter: case nir_intrinsic_emit_vertex: b.cursor = nir_before_instr(instr); - lower_triangle_strip_emit_vertex(&b, intrin, vertex_count_var, - tmp_vars, out_vars); + lower_triangle_strip_emit_vertex(&b, intrin, vertex_count_var, tmp_vars); break; case nir_intrinsic_end_primitive: case nir_intrinsic_end_primitive_with_counter: @@ -772,6 +765,7 @@ d3d12_lower_triangle_strip(nir_shader *shader) } } + _mesa_hash_table_destroy(tmp_vars, NULL); nir_metadata_preserve(impl, nir_metadata_none); NIR_PASS_V(shader, nir_lower_var_copies); }