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:
Samuel Iglesias Gonsalvez 2015-06-11 12:32:26 +02:00 committed by Jason Ekstrand
parent 19cf934f7f
commit 418c004f80

View file

@ -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;
}