Re: [Mesa-dev] [v2 PATCH 10/16] glsl: Optimize clamp(x, 0.0, b), where b 1.0 as min(saturate(x), b)

2014-07-08 Thread Abdiel Janulgue

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)

2014-07-08 Thread Abdiel Janulgue

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)

2014-07-07 Thread Abdiel Janulgue
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)

2014-07-07 Thread Matt Turner
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