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: 17a35412dc ("zink: re-rework i/o variable handling to make having variables entirely optional")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27522>
(cherry picked from commit 0a243a7241e26292ca55a97f5f8d464001b532cd)
This commit is contained in:
parent
3120d28d2d
commit
25d2384e10
2 changed files with 2 additions and 2 deletions
|
|
@ -8074,7 +8074,7 @@
|
||||||
"description": "zink: adjust swizzled deref loads by the variable component offset",
|
"description": "zink: adjust swizzled deref loads by the variable component offset",
|
||||||
"nominated": true,
|
"nominated": true,
|
||||||
"nomination_type": 1,
|
"nomination_type": 1,
|
||||||
"resolution": 0,
|
"resolution": 1,
|
||||||
"main_sha": null,
|
"main_sha": null,
|
||||||
"because_sha": "17a35412dcc77a3058107100d27f734796a9d0ca",
|
"because_sha": "17a35412dcc77a3058107100d27f734796a9d0ca",
|
||||||
"notes": null
|
"notes": null
|
||||||
|
|
|
||||||
|
|
@ -3761,7 +3761,7 @@ add_derefs_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data)
|
||||||
}
|
}
|
||||||
/* filter needed components */
|
/* filter needed components */
|
||||||
if (intr->num_components < load->num_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);
|
nir_def_rewrite_uses(&intr->def, load);
|
||||||
} else {
|
} else {
|
||||||
nir_def *store = intr->src[0].ssa;
|
nir_def *store = intr->src[0].ssa;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue