aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mesa/program/prog_to_nir.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2015-04-30 23:26:47 +0200
committermarha <marha@users.sourceforge.net>2015-04-30 23:29:47 +0200
commit055e5645a789d2822d3c4e5a3bc81ff6a969ff31 (patch)
tree8a923f19c3586f9341114be6c81784ab9018aef8 /mesalib/src/mesa/program/prog_to_nir.c
parent0f7871ff824bcf064db3ab6bdfe26645ba6c8087 (diff)
parenta71d524ecad48837e0124a03124bc05f59a48be7 (diff)
downloadvcxsrv-055e5645a789d2822d3c4e5a3bc81ff6a969ff31.tar.gz
vcxsrv-055e5645a789d2822d3c4e5a3bc81ff6a969ff31.tar.bz2
vcxsrv-055e5645a789d2822d3c4e5a3bc81ff6a969ff31.zip
Merge remote-tracking branch 'origin/released'
Diffstat (limited to 'mesalib/src/mesa/program/prog_to_nir.c')
-rw-r--r--mesalib/src/mesa/program/prog_to_nir.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/mesalib/src/mesa/program/prog_to_nir.c b/mesalib/src/mesa/program/prog_to_nir.c
index c738f5073..ff3d9f3be 100644
--- a/mesalib/src/mesa/program/prog_to_nir.c
+++ b/mesalib/src/mesa/program/prog_to_nir.c
@@ -222,12 +222,23 @@ ptn_get_src(struct ptn_compile *c, const struct prog_src_register *prog_src)
}
nir_ssa_def *def;
- if (!HAS_EXTENDED_SWIZZLE(prog_src->Swizzle)) {
+ if (!HAS_EXTENDED_SWIZZLE(prog_src->Swizzle) &&
+ (prog_src->Negate == NEGATE_NONE || prog_src->Negate == NEGATE_XYZW)) {
+ /* The simple non-SWZ case. */
for (int i = 0; i < 4; i++)
src.swizzle[i] = GET_SWZ(prog_src->Swizzle, i);
def = nir_fmov_alu(b, src, 4);
+
+ if (prog_src->Abs)
+ def = nir_fabs(b, def);
+
+ if (prog_src->Negate)
+ def = nir_fneg(b, def);
} else {
+ /* The SWZ instruction allows per-component zero/one swizzles, and also
+ * per-component negation.
+ */
nir_ssa_def *chans[4];
for (int i = 0; i < 4; i++) {
int swizzle = GET_SWZ(prog_src->Swizzle, i);
@@ -246,16 +257,16 @@ ptn_get_src(struct ptn_compile *c, const struct prog_src_register *prog_src)
chans[i] = &mov->dest.dest.ssa;
}
+
+ if (prog_src->Abs)
+ chans[i] = nir_fabs(b, chans[i]);
+
+ if (prog_src->Negate & (1 << i))
+ chans[i] = nir_fneg(b, chans[i]);
}
def = nir_vec4(b, chans[0], chans[1], chans[2], chans[3]);
}
- if (prog_src->Abs)
- def = nir_fabs(b, def);
-
- if (prog_src->Negate)
- def = nir_fneg(b, def);
-
return def;
}