mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-25 18:00:52 +01:00
nir: Fix output swizzle in get_mul_for_src
Avoid copying an overwritten swizzle, use the original values. Example: Former swizzle[] = xyzw src->swizzle[] = zyxx The expected output swizzle = zyxx but if we reuse swizzle in the loop, then output swizzle would be zyzz. Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com> Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
19cf934f7f
commit
418c004f80
1 changed files with 12 additions and 1 deletions
|
|
@ -76,6 +76,7 @@ static nir_alu_instr *
|
|||
get_mul_for_src(nir_alu_src *src, int num_components,
|
||||
uint8_t swizzle[4], bool *negate, bool *abs)
|
||||
{
|
||||
uint8_t swizzle_tmp[4];
|
||||
assert(src->src.is_ssa && !src->abs && !src->negate);
|
||||
|
||||
nir_instr *instr = src->src.ssa->parent_instr;
|
||||
|
|
@ -116,8 +117,18 @@ get_mul_for_src(nir_alu_src *src, int num_components,
|
|||
if (!alu)
|
||||
return NULL;
|
||||
|
||||
/* Copy swizzle data before overwriting it to avoid setting a wrong swizzle.
|
||||
*
|
||||
* Example:
|
||||
* Former swizzle[] = xyzw
|
||||
* src->swizzle[] = zyxx
|
||||
*
|
||||
* Expected output swizzle = zyxx
|
||||
* If we reuse swizzle in the loop, then output swizzle would be zyzz.
|
||||
*/
|
||||
memcpy(swizzle_tmp, swizzle, 4*sizeof(uint8_t));
|
||||
for (unsigned i = 0; i < num_components; i++)
|
||||
swizzle[i] = swizzle[src->swizzle[i]];
|
||||
swizzle[i] = swizzle_tmp[src->swizzle[i]];
|
||||
|
||||
return alu;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue