From: Matt Turner Date: Fri, 6 Sep 2013 19:36:48 +0000 (-0700) Subject: glsl: Use conditional-select in mix(). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fd183fa02c4430e439faf6a5195f5008d34db987;p=mesa.git glsl: Use conditional-select in mix(). Reviewed-by: Kenneth Graunke Reviewed-by: Ian Romanick --- 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; }