diff options
author | antonino <antonino.maniscalco@collabora.com> | 2023-05-04 16:54:03 +0200 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2023-05-05 19:07:13 +0100 |
commit | 0de2d41055ee77bbe976366b3b27e07d925fb48f (patch) | |
tree | 1606325ea96a6e39eb8cd8d2a66e8930ed7bd363 | |
parent | 566a97ce4a64a1c8bd1e40af52176dd6ae766c7b (diff) | |
download | mesa-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.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_compiler.c | 17 |
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, |