aboutsummaryrefslogtreecommitdiffstats
path: root/src/freedreno/ir3
diff options
context:
space:
mode:
authorJonathan Marek <[email protected]>2020-06-13 23:50:22 -0400
committerMarge Bot <[email protected]>2020-06-14 17:53:47 +0000
commit1d9e6e456ad60f4c995c24c5cde6d73943141e6c (patch)
tree0384d80a8e394e54ea1aeda71d459dc7ee326be6 /src/freedreno/ir3
parent356be07ce279e6ff2d468fd1321a2edb2d6b2df2 (diff)
freedreno/ir3: fix ir3_nir_move_varying_inputs
ir3_nir_move_varying_inputs is broken when there a load input outside of the first block which depends on the result of a previous load input. This simplification/rework avoids the problem, and should also be faster. Fixes this dEQP-VK test: dEQP-VK.pipeline.multisample_interpolation.offset_interpolate_at_pixel_center.128_128_1.samples_2 Signed-off-by: Jonathan Marek <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5465>
Diffstat (limited to 'src/freedreno/ir3')
-rw-r--r--src/freedreno/ir3/ir3_nir_move_varying_inputs.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/freedreno/ir3/ir3_nir_move_varying_inputs.c b/src/freedreno/ir3/ir3_nir_move_varying_inputs.c
index 625666f07e2..91590393c78 100644
--- a/src/freedreno/ir3/ir3_nir_move_varying_inputs.c
+++ b/src/freedreno/ir3/ir3_nir_move_varying_inputs.c
@@ -42,7 +42,6 @@
typedef struct {
nir_shader *shader;
nir_block *start_block;
- struct nir_instr *cursor;
} state;
static void move_instruction_to_start_block(state *state, nir_instr *instr);
@@ -59,6 +58,10 @@ move_src(nir_src *src, void *state)
static void
move_instruction_to_start_block(state *state, nir_instr *instr)
{
+ /* nothing to do if the instruction is already in the start block */
+ if (instr->block == state->start_block)
+ return;
+
/* first move (recursively) all src's to ensure they appear before
* load*_input that we are trying to move:
*/
@@ -67,14 +70,7 @@ move_instruction_to_start_block(state *state, nir_instr *instr)
/* and then move the instruction itself:
*/
exec_node_remove(&instr->node);
-
- if (state->cursor) {
- exec_node_insert_after(&state->cursor->node, &instr->node);
- } else {
- exec_list_push_head(&state->start_block->instr_list, &instr->node);
- }
-
- state->cursor = instr;
+ exec_list_push_tail(&state->start_block->instr_list, &instr->node);
instr->block = state->start_block;
}
@@ -100,7 +96,6 @@ move_varying_inputs_block(state *state, nir_block *block)
debug_assert(intr->dest.is_ssa);
- state->cursor = NULL;
move_instruction_to_start_block(state, instr);
progress = true;