summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantonino <antonino.maniscalco@collabora.com>2023-05-04 16:54:03 +0200
committerEric Engestrom <eric@engestrom.ch>2023-05-05 19:07:13 +0100
commit0de2d41055ee77bbe976366b3b27e07d925fb48f (patch)
tree1606325ea96a6e39eb8cd8d2a66e8930ed7bd363
parent566a97ce4a64a1c8bd1e40af52176dd6ae766c7b (diff)
downloadmesa-0de2d41055ee77bbe976366b3b27e07d925fb48f.tar.gz
zink: take location_frac into account in pv emulation
The pv mode emulation code was not taking into account the location_frac of variables, they where beeing stored in a 1D array leading to collisions. Fixes: 5a4083349f3 ("zink: add provoking vertex mode lowering") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22856> (cherry picked from commit 96cd034e3cfa85c4e72496360d1432dcb7e89cc8)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/zink/zink_compiler.c17
2 files changed, 11 insertions, 8 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 363022ed118..00f2a3b582e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -283,7 +283,7 @@
"description": "zink: take location_frac into account in pv emulation",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "5a4083349f36ef6db36a962327de6952a30d0c92"
},
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 6c9bfeb2441..2edd2ac1605 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -407,7 +407,7 @@ lower_gl_point_gs(nir_shader *shader)
}
struct lower_pv_mode_state {
- nir_variable *varyings[VARYING_SLOT_MAX];
+ nir_variable *varyings[VARYING_SLOT_MAX][4];
nir_variable *pos_counter;
nir_variable *out_pos_counter;
nir_variable *ring_offset;
@@ -462,11 +462,12 @@ lower_pv_mode_gs_store(nir_builder *b,
nir_variable *var = nir_deref_instr_get_variable(deref);
gl_varying_slot location = var->data.location;
- assert(state->varyings[location]);
+ unsigned location_frac = var->data.location_frac;
+ assert(state->varyings[location][location_frac]);
assert(intrin->src[1].is_ssa);
nir_ssa_def *pos_counter = nir_load_var(b, state->pos_counter);
nir_ssa_def *index = lower_pv_mode_gs_ring_index(b, state, pos_counter);
- nir_deref_instr *varying_deref = nir_build_deref_var(b, state->varyings[location]);
+ nir_deref_instr *varying_deref = nir_build_deref_var(b, state->varyings[location][location_frac]);
nir_deref_instr *ring_deref = nir_build_deref_array(b, varying_deref, index);
// recreate the chain of deref that lead to the store.
nir_deref_instr *new_top_deref = replicate_derefs(b, deref, ring_deref);
@@ -533,9 +534,10 @@ lower_pv_mode_emit_rotated_prim(nir_builder *b,
rotated_i = nir_iadd(b, rotated_i, current_vertex);
nir_foreach_variable_with_modes(var, b->shader, nir_var_shader_out) {
gl_varying_slot location = var->data.location;
- if (state->varyings[location]) {
+ unsigned location_frac = var->data.location_frac;
+ if (state->varyings[location][location_frac]) {
nir_ssa_def *index = lower_pv_mode_gs_ring_index(b, state, rotated_i);
- nir_deref_instr *value = nir_build_deref_array(b, nir_build_deref_var(b, state->varyings[location]), index);
+ nir_deref_instr *value = nir_build_deref_array(b, nir_build_deref_var(b, state->varyings[location][location_frac]), index);
copy_vars(b, nir_build_deref_var(b, var), value);
}
}
@@ -648,10 +650,11 @@ lower_pv_mode_gs(nir_shader *shader, unsigned prim)
nir_foreach_variable_with_modes(var, shader, nir_var_shader_out) {
gl_varying_slot location = var->data.location;
+ unsigned location_frac = var->data.location_frac;
char name[100];
- snprintf(name, sizeof(name), "__tmp_primverts_%d", location);
- state.varyings[location] =
+ snprintf(name, sizeof(name), "__tmp_primverts_%d_%d", location, location_frac);
+ state.varyings[location][location_frac] =
nir_local_variable_create(entry,
glsl_array_type(var->type,
state.ring_size,