From 25d2384e1011bbe0da0c52a4c1804dc045b4ec89 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 8 Feb 2024 08:29:25 -0500 Subject: [PATCH] zink: adjust swizzled deref loads by the variable component offset this code is intended to transform a block like: ``` 32 %306 = @load_interpolated_input (%34, %0 (0x0)) (base=3, component=2, dest_type=float32, io location=VARYING_SLOT_VAR3 slots=1) 32x2 %307 = fsub %305, %306.xx ``` into derefs. the existing code generates this: ``` decl_var shader_in INTERP_MODE_NONE none vec2 #7 (VARYING_SLOT_VAR3.zw, 0, 0) 32 %516 = deref_var  (shader_in vec2) 32x2 %517 = @load_deref (%516) (access=none) 32 %518 = mov %517.z error: src->swizzle[i] < num_components (../src/compiler/nir/nir_validate.c:216) ``` the problem is attempting to reapply the component offset to a variable which is already at an offset fixes #10567 Fixes: 17a35412dcc ("zink: re-rework i/o variable handling to make having variables entirely optional") Part-of: (cherry picked from commit 0a243a7241e26292ca55a97f5f8d464001b532cd) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_compiler.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 7ea071e1624..6af5bb6196f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -8074,7 +8074,7 @@ "description": "zink: adjust swizzled deref loads by the variable component offset", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "17a35412dcc77a3058107100d27f734796a9d0ca", "notes": null diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 9abcd86760f..2ea83c70140 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3761,7 +3761,7 @@ add_derefs_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data) } /* filter needed components */ if (intr->num_components < load->num_components) - load = nir_channels(b, load, BITFIELD_MASK(intr->num_components) << c); + load = nir_channels(b, load, BITFIELD_MASK(intr->num_components) << (c - var->data.location_frac)); nir_def_rewrite_uses(&intr->def, load); } else { nir_def *store = intr->src[0].ssa;