d3d12: Fix d3d12_lower_triangle_strip if multiple vars are in a single location

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28562>
This commit is contained in:
Jesse Natalie
2024-04-03 15:13:14 -07:00
committed by Marge Bot
parent c17ef8c196
commit 201053bac1
+14 -20
View File
@@ -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);
}