summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2013-09-06 12:36:48 -0700
committerMatt Turner <[email protected]>2013-09-09 15:01:08 -0700
commitfd183fa02c4430e439faf6a5195f5008d34db987 (patch)
treee5805f77948de4dbe16d7b9a32b09cf3e24d2760
parent847726295861af4a34f0ec8eb7b3dfe9a6e178bd (diff)
glsl: Use conditional-select in mix().
Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r--src/glsl/builtin_functions.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
index 662fc1eda5e..0139b6ff01f 100644
--- a/src/glsl/builtin_functions.cpp
+++ b/src/glsl/builtin_functions.cpp
@@ -2262,14 +2262,14 @@ builtin_builder::_mix_sel(const glsl_type *val_type, const glsl_type *blend_type
ir_variable *a = in_var(blend_type, "a");
MAKE_SIG(val_type, v130, 3, x, y, a);
- if (blend_type->vector_elements == 1) {
- body.emit(assign(x, y, a));
- } else {
- for (int i = 0; i < blend_type->vector_elements; i++) {
- body.emit(assign(x, swizzle(y, i, 1), swizzle(a, i, 1), 1 << i));
- }
- }
- body.emit(ret(x));
+ /* csel matches the ternary operator in that a selector of true choses the
+ * first argument. This differs from mix(x, y, false) which choses the
+ * second argument (to remain consistent with the interpolating version of
+ * mix() which takes a blend factor from 0.0 to 1.0 where 0.0 is only x.
+ *
+ * To handle the behavior mismatch, reverse the x and y arguments.
+ */
+ body.emit(ret(csel(a, y, x)));
return sig;
}