From fd183fa02c4430e439faf6a5195f5008d34db987 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Fri, 6 Sep 2013 12:36:48 -0700 Subject: [PATCH] glsl: Use conditional-select in mix(). Reviewed-by: Kenneth Graunke Reviewed-by: Ian Romanick --- src/glsl/builtin_functions.cpp | 16 ++++++++-------- 1 file 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; } -- 2.30.2