diff options
author | Matt Turner <[email protected]> | 2013-09-06 12:36:48 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2013-09-09 15:01:08 -0700 |
commit | fd183fa02c4430e439faf6a5195f5008d34db987 (patch) | |
tree | e5805f77948de4dbe16d7b9a32b09cf3e24d2760 /src/glsl | |
parent | 847726295861af4a34f0ec8eb7b3dfe9a6e178bd (diff) |
glsl: Use conditional-select in mix().
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/builtin_functions.cpp | 16 |
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; } |