Re: [Mesa-dev] [v2 PATCH 10/16] glsl: Optimize clamp(x, 0.0, b), where b 1.0 as min(saturate(x), b)
On 07.07.2014 20:25, Matt Turner wrote: On Mon, Jul 7, 2014 at 6:57 AM, Abdiel Janulgue abdiel.janul...@linux.intel.com wrote: v2: - Output min(saturate(x),b) instead of saturate(min(x,b)) suggested by Ilia Mirkin - Make sure we do component-wise comparison for vectors (Ian Romanick) Signed-off-by: Abdiel Janulgue abdiel.janul...@linux.intel.com --- src/glsl/opt_algebraic.cpp | 10 ++ 1 file changed, 10 insertions(+) diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp index 2ad561c..bcda7a9 100644 --- a/src/glsl/opt_algebraic.cpp +++ b/src/glsl/opt_algebraic.cpp @@ -643,6 +643,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir) /* Found a min (max(x, 0), 1.0) */ if (outer_const-is_one() inner_val_a-is_zero()) return saturate(inner_val_b); + +unsigned component = 0; +for (int c = 0; c outer_const-type-vector_elements; c++) { + if (outer_const-get_float_component(c) 1.0f) + component++; +} +/* Found a min (max(x, 0.0) b), where b 1.0 */ Is this case the only thing it finds? Does it find max(min(x, b), 0.0)? Unfortunately, you are right. The detection only works if the inner constant is zero. I'll fix this in the next revision +if ((component == outer_const-type-vector_elements) +inner_val_b-is_zero()) + return expr(ir_binop_min, saturate(inner_val_a), outer_const); It seems like it would incorrectly recognize max(min(x, 0.0), b). This one it would correctly recognize. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [v2 PATCH 10/16] glsl: Optimize clamp(x, 0.0, b), where b 1.0 as min(saturate(x), b)
On 08.07.2014 12:37, Abdiel Janulgue wrote: On 07.07.2014 20:25, Matt Turner wrote: On Mon, Jul 7, 2014 at 6:57 AM, Abdiel Janulgue abdiel.janul...@linux.intel.com wrote: v2: - Output min(saturate(x),b) instead of saturate(min(x,b)) suggested by Ilia Mirkin - Make sure we do component-wise comparison for vectors (Ian Romanick) Signed-off-by: Abdiel Janulgue abdiel.janul...@linux.intel.com --- src/glsl/opt_algebraic.cpp | 10 ++ 1 file changed, 10 insertions(+) diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp index 2ad561c..bcda7a9 100644 --- a/src/glsl/opt_algebraic.cpp +++ b/src/glsl/opt_algebraic.cpp @@ -643,6 +643,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir) /* Found a min (max(x, 0), 1.0) */ if (outer_const-is_one() inner_val_a-is_zero()) return saturate(inner_val_b); + +unsigned component = 0; +for (int c = 0; c outer_const-type-vector_elements; c++) { + if (outer_const-get_float_component(c) 1.0f) + component++; +} +/* Found a min (max(x, 0.0) b), where b 1.0 */ Is this case the only thing it finds? Does it find max(min(x, b), 0.0)? Unfortunately, you are right. The detection only works if the inner constant is zero. I'll fix this in the next revision +if ((component == outer_const-type-vector_elements) +inner_val_b-is_zero()) + return expr(ir_binop_min, saturate(inner_val_a), outer_const); It seems like it would incorrectly recognize max(min(x, 0.0), b). This one it would correctly recognize. Actually no, this one actually does not work either. Fix coming up! ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [v2 PATCH 10/16] glsl: Optimize clamp(x, 0.0, b), where b 1.0 as min(saturate(x), b)
v2: - Output min(saturate(x),b) instead of saturate(min(x,b)) suggested by Ilia Mirkin - Make sure we do component-wise comparison for vectors (Ian Romanick) Signed-off-by: Abdiel Janulgue abdiel.janul...@linux.intel.com --- src/glsl/opt_algebraic.cpp | 10 ++ 1 file changed, 10 insertions(+) diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp index 2ad561c..bcda7a9 100644 --- a/src/glsl/opt_algebraic.cpp +++ b/src/glsl/opt_algebraic.cpp @@ -643,6 +643,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir) /* Found a min (max(x, 0), 1.0) */ if (outer_const-is_one() inner_val_a-is_zero()) return saturate(inner_val_b); + +unsigned component = 0; +for (int c = 0; c outer_const-type-vector_elements; c++) { + if (outer_const-get_float_component(c) 1.0f) + component++; +} +/* Found a min (max(x, 0.0) b), where b 1.0 */ +if ((component == outer_const-type-vector_elements) +inner_val_b-is_zero()) + return expr(ir_binop_min, saturate(inner_val_a), outer_const); } } -- 1.9.1 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [v2 PATCH 10/16] glsl: Optimize clamp(x, 0.0, b), where b 1.0 as min(saturate(x), b)
On Mon, Jul 7, 2014 at 6:57 AM, Abdiel Janulgue abdiel.janul...@linux.intel.com wrote: v2: - Output min(saturate(x),b) instead of saturate(min(x,b)) suggested by Ilia Mirkin - Make sure we do component-wise comparison for vectors (Ian Romanick) Signed-off-by: Abdiel Janulgue abdiel.janul...@linux.intel.com --- src/glsl/opt_algebraic.cpp | 10 ++ 1 file changed, 10 insertions(+) diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp index 2ad561c..bcda7a9 100644 --- a/src/glsl/opt_algebraic.cpp +++ b/src/glsl/opt_algebraic.cpp @@ -643,6 +643,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir) /* Found a min (max(x, 0), 1.0) */ if (outer_const-is_one() inner_val_a-is_zero()) return saturate(inner_val_b); + +unsigned component = 0; +for (int c = 0; c outer_const-type-vector_elements; c++) { + if (outer_const-get_float_component(c) 1.0f) + component++; +} +/* Found a min (max(x, 0.0) b), where b 1.0 */ Is this case the only thing it finds? Does it find max(min(x, b), 0.0)? +if ((component == outer_const-type-vector_elements) +inner_val_b-is_zero()) + return expr(ir_binop_min, saturate(inner_val_a), outer_const); It seems like it would incorrectly recognize max(min(x, 0.0), b). ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev