Re: [Mesa-dev] [PATCH] glsl: Expand matrix flip optimization pass to cover more cases.

2014-06-17 Thread Iago Toral
Hi Ian,

On Mon, 2014-06-16 at 12:20 -0700, Ian Romanick wrote:
 On 04/21/2014 04:38 AM, Iago Toral Quiroga wrote:
  Currently it only considers the cases of gl_ModelViewProjectionMatrix and
  gl_TextureMatrix. The same optimization can be done also for
  gl_ModelViewMatrix, gl_ProjectionMatrix and the corresponding inverses.
 
 I've been looking at some thing similar recently.  I've been looking at
 flipping user-defined matrices.
 
 I think rather than adding a bunch of individual handles to flippable
 matrices, I think we should add a hash-table of possible names.  For the
 built-in uniforms, we would add any matrix uniform that doesn't have
 Transpose in the name.  Something like:
 
 struct matrix_and_transpose {
 ir_variable *matrix;
 ir_variable *transpose_matrix;
 };
 
 I think all of the names have regular enough patterns that we should be
 able to generate the non-transpose name from the transpose name.  Vice
 versa shouldn't be necessary.  If the transpose name is encountered
 first, add the structure with matrix set NULL and the name derived from
 the transpose name.

Right, I think this is better too.

I understand that you are already working on this then? If not I can
give this a go as soon as I send the v2 of the series for the
multi-stream support (hopefully tomorrow).

Iago

 One other comment below.
 
  ---
   src/glsl/opt_flip_matrices.cpp | 118 
  +++--
   1 file changed, 91 insertions(+), 27 deletions(-)
  
  diff --git a/src/glsl/opt_flip_matrices.cpp b/src/glsl/opt_flip_matrices.cpp
  index 9044fd6..bf09b78 100644
  --- a/src/glsl/opt_flip_matrices.cpp
  +++ b/src/glsl/opt_flip_matrices.cpp
  @@ -29,8 +29,9 @@
* On some hardware, this is more efficient.
*
* This currently only does the conversion for built-in matrices which
  - * already have transposed equivalents.  Namely, 
  gl_ModelViewProjectionMatrix
  - * and gl_TextureMatrix.
  + * already have transposed equivalents. Namely, gl_ModelViewMatrix,
  + * gl_ProjectionMatrix, gl_ModelViewProjectionMatrix, gl_TextureMatrix and
  + * their inverses.
*/
   #include ir.h
   #include ir_optimization.h
  @@ -42,18 +43,39 @@ public:
  matrix_flipper(exec_list *instructions)
  {
 progress = false;
  +  p_transpose = NULL;
  +  p_inv_transpose = NULL;
  +  mv_transpose = NULL;
  +  mv_inv_transpose = NULL;
 mvp_transpose = NULL;
  +  mvp_inv_transpose = NULL;
 texmat_transpose = NULL;
  +  texmat_inv_transpose = NULL;
   
 foreach_list(n, instructions) {
ir_instruction *ir = (ir_instruction *) n;
ir_variable *var = ir-as_variable();
if (!var)
   continue;
  - if (strcmp(var-name, gl_ModelViewProjectionMatrixTranspose) == 
  0)
  +
  + if (strcmp(var-name, gl_ProjectionMatrixTranspose) == 0)
  +p_transpose = var;
  + else if (strcmp(var-name, gl_ProjectionMatrixInverseTranspose) 
  == 0)
  +p_inv_transpose = var;
  + else if (strcmp(var-name, gl_ModelViewMatrixTranspose) == 0)
  +mv_transpose = var;
  + else if (strcmp(var-name, gl_ModelViewMatrixInverseTranspose) 
  == 0)
  +mv_inv_transpose = var;
  + else if (strcmp(var-name,
  + gl_ModelViewProjectionMatrixTranspose) == 0)
   mvp_transpose = var;
  - if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
  + else if (strcmp(var-name,
  + gl_ModelViewProjectionMatrixInverseTranspose) 
  == 0)
  +mvp_inv_transpose = var;
  + else if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
   texmat_transpose = var;
  + else if (strcmp(var-name, gl_TextureMatrixInverseTranspose) == 
  0)
  +texmat_inv_transpose = var;
 }
  }
   
  @@ -62,11 +84,49 @@ public:
  bool progress;
   
   private:
  +   ir_variable *p_transpose;
  +   ir_variable *p_inv_transpose;
  +   ir_variable *mv_transpose;
  +   ir_variable *mv_inv_transpose;
  ir_variable *mvp_transpose;
  +   ir_variable *mvp_inv_transpose;
  ir_variable *texmat_transpose;
  +   ir_variable *texmat_inv_transpose;
   };
   }
   
  +static void
  +transform_operands(ir_expression *ir,
  +   ir_variable *mat_var, ir_variable *mat_transpose)
  +{
  +#ifndef NDEBUG
  +   ir_dereference_variable *deref = 
  ir-operands[0]-as_dereference_variable();
  +   assert(deref  deref-var == mat_var);
  +#endif
  +
  +   void *mem_ctx = ralloc_parent(ir);
  +   ir-operands[0] = ir-operands[1];
  +   ir-operands[1] = new(mem_ctx) ir_dereference_variable(mat_transpose);
  +}
  +
  +static void
  +transform_operands_texmat(ir_expression *ir,
  +  ir_variable *mat_var, ir_variable *mat_transpose)
 
 I'd call this transform_operands_array_of_matrix or something.  Once we
 add support for 

Re: [Mesa-dev] [PATCH] glsl: Expand matrix flip optimization pass to cover more cases.

2014-06-17 Thread Ian Romanick
On 06/17/2014 05:07 AM, Iago Toral wrote:
 Hi Ian,
 
 On Mon, 2014-06-16 at 12:20 -0700, Ian Romanick wrote:
 On 04/21/2014 04:38 AM, Iago Toral Quiroga wrote:
 Currently it only considers the cases of gl_ModelViewProjectionMatrix and
 gl_TextureMatrix. The same optimization can be done also for
 gl_ModelViewMatrix, gl_ProjectionMatrix and the corresponding inverses.

 I've been looking at some thing similar recently.  I've been looking at
 flipping user-defined matrices.

 I think rather than adding a bunch of individual handles to flippable
 matrices, I think we should add a hash-table of possible names.  For the
 built-in uniforms, we would add any matrix uniform that doesn't have
 Transpose in the name.  Something like:

 struct matrix_and_transpose {
 ir_variable *matrix;
 ir_variable *transpose_matrix;
 };

 I think all of the names have regular enough patterns that we should be
 able to generate the non-transpose name from the transpose name.  Vice
 versa shouldn't be necessary.  If the transpose name is encountered
 first, add the structure with matrix set NULL and the name derived from
 the transpose name.
 
 Right, I think this is better too.
 
 I understand that you are already working on this then? If not I can
 give this a go as soon as I send the v2 of the series for the
 multi-stream support (hopefully tomorrow).

I was working on something a little different, but I've been sidetracked
by other things.  I probably won't get back to it for a week or more.
It seems like your work is a lot closer to being ready.  I can rebase
mine on top of yours later.

 Iago
 
 One other comment below.

 ---
  src/glsl/opt_flip_matrices.cpp | 118 
 +++--
  1 file changed, 91 insertions(+), 27 deletions(-)

 diff --git a/src/glsl/opt_flip_matrices.cpp b/src/glsl/opt_flip_matrices.cpp
 index 9044fd6..bf09b78 100644
 --- a/src/glsl/opt_flip_matrices.cpp
 +++ b/src/glsl/opt_flip_matrices.cpp
 @@ -29,8 +29,9 @@
   * On some hardware, this is more efficient.
   *
   * This currently only does the conversion for built-in matrices which
 - * already have transposed equivalents.  Namely, 
 gl_ModelViewProjectionMatrix
 - * and gl_TextureMatrix.
 + * already have transposed equivalents. Namely, gl_ModelViewMatrix,
 + * gl_ProjectionMatrix, gl_ModelViewProjectionMatrix, gl_TextureMatrix and
 + * their inverses.
   */
  #include ir.h
  #include ir_optimization.h
 @@ -42,18 +43,39 @@ public:
 matrix_flipper(exec_list *instructions)
 {
progress = false;
 +  p_transpose = NULL;
 +  p_inv_transpose = NULL;
 +  mv_transpose = NULL;
 +  mv_inv_transpose = NULL;
mvp_transpose = NULL;
 +  mvp_inv_transpose = NULL;
texmat_transpose = NULL;
 +  texmat_inv_transpose = NULL;
  
foreach_list(n, instructions) {
   ir_instruction *ir = (ir_instruction *) n;
   ir_variable *var = ir-as_variable();
   if (!var)
  continue;
 - if (strcmp(var-name, gl_ModelViewProjectionMatrixTranspose) == 
 0)
 +
 + if (strcmp(var-name, gl_ProjectionMatrixTranspose) == 0)
 +p_transpose = var;
 + else if (strcmp(var-name, gl_ProjectionMatrixInverseTranspose) 
 == 0)
 +p_inv_transpose = var;
 + else if (strcmp(var-name, gl_ModelViewMatrixTranspose) == 0)
 +mv_transpose = var;
 + else if (strcmp(var-name, gl_ModelViewMatrixInverseTranspose) 
 == 0)
 +mv_inv_transpose = var;
 + else if (strcmp(var-name,
 + gl_ModelViewProjectionMatrixTranspose) == 0)
  mvp_transpose = var;
 - if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
 + else if (strcmp(var-name,
 + gl_ModelViewProjectionMatrixInverseTranspose) 
 == 0)
 +mvp_inv_transpose = var;
 + else if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
  texmat_transpose = var;
 + else if (strcmp(var-name, gl_TextureMatrixInverseTranspose) == 
 0)
 +texmat_inv_transpose = var;
}
 }
  
 @@ -62,11 +84,49 @@ public:
 bool progress;
  
  private:
 +   ir_variable *p_transpose;
 +   ir_variable *p_inv_transpose;
 +   ir_variable *mv_transpose;
 +   ir_variable *mv_inv_transpose;
 ir_variable *mvp_transpose;
 +   ir_variable *mvp_inv_transpose;
 ir_variable *texmat_transpose;
 +   ir_variable *texmat_inv_transpose;
  };
  }
  
 +static void
 +transform_operands(ir_expression *ir,
 +   ir_variable *mat_var, ir_variable *mat_transpose)
 +{
 +#ifndef NDEBUG
 +   ir_dereference_variable *deref = 
 ir-operands[0]-as_dereference_variable();
 +   assert(deref  deref-var == mat_var);
 +#endif
 +
 +   void *mem_ctx = ralloc_parent(ir);
 +   ir-operands[0] = ir-operands[1];
 +   ir-operands[1] = new(mem_ctx) ir_dereference_variable(mat_transpose);
 +}
 +
 +static void
 +transform_operands_texmat(ir_expression 

Re: [Mesa-dev] [PATCH] glsl: Expand matrix flip optimization pass to cover more cases.

2014-06-16 Thread Ian Romanick
On 04/21/2014 04:38 AM, Iago Toral Quiroga wrote:
 Currently it only considers the cases of gl_ModelViewProjectionMatrix and
 gl_TextureMatrix. The same optimization can be done also for
 gl_ModelViewMatrix, gl_ProjectionMatrix and the corresponding inverses.

I've been looking at some thing similar recently.  I've been looking at
flipping user-defined matrices.

I think rather than adding a bunch of individual handles to flippable
matrices, I think we should add a hash-table of possible names.  For the
built-in uniforms, we would add any matrix uniform that doesn't have
Transpose in the name.  Something like:

struct matrix_and_transpose {
ir_variable *matrix;
ir_variable *transpose_matrix;
};

I think all of the names have regular enough patterns that we should be
able to generate the non-transpose name from the transpose name.  Vice
versa shouldn't be necessary.  If the transpose name is encountered
first, add the structure with matrix set NULL and the name derived from
the transpose name.

One other comment below.

 ---
  src/glsl/opt_flip_matrices.cpp | 118 
 +++--
  1 file changed, 91 insertions(+), 27 deletions(-)
 
 diff --git a/src/glsl/opt_flip_matrices.cpp b/src/glsl/opt_flip_matrices.cpp
 index 9044fd6..bf09b78 100644
 --- a/src/glsl/opt_flip_matrices.cpp
 +++ b/src/glsl/opt_flip_matrices.cpp
 @@ -29,8 +29,9 @@
   * On some hardware, this is more efficient.
   *
   * This currently only does the conversion for built-in matrices which
 - * already have transposed equivalents.  Namely, gl_ModelViewProjectionMatrix
 - * and gl_TextureMatrix.
 + * already have transposed equivalents. Namely, gl_ModelViewMatrix,
 + * gl_ProjectionMatrix, gl_ModelViewProjectionMatrix, gl_TextureMatrix and
 + * their inverses.
   */
  #include ir.h
  #include ir_optimization.h
 @@ -42,18 +43,39 @@ public:
 matrix_flipper(exec_list *instructions)
 {
progress = false;
 +  p_transpose = NULL;
 +  p_inv_transpose = NULL;
 +  mv_transpose = NULL;
 +  mv_inv_transpose = NULL;
mvp_transpose = NULL;
 +  mvp_inv_transpose = NULL;
texmat_transpose = NULL;
 +  texmat_inv_transpose = NULL;
  
foreach_list(n, instructions) {
   ir_instruction *ir = (ir_instruction *) n;
   ir_variable *var = ir-as_variable();
   if (!var)
  continue;
 - if (strcmp(var-name, gl_ModelViewProjectionMatrixTranspose) == 0)
 +
 + if (strcmp(var-name, gl_ProjectionMatrixTranspose) == 0)
 +p_transpose = var;
 + else if (strcmp(var-name, gl_ProjectionMatrixInverseTranspose) 
 == 0)
 +p_inv_transpose = var;
 + else if (strcmp(var-name, gl_ModelViewMatrixTranspose) == 0)
 +mv_transpose = var;
 + else if (strcmp(var-name, gl_ModelViewMatrixInverseTranspose) == 
 0)
 +mv_inv_transpose = var;
 + else if (strcmp(var-name,
 + gl_ModelViewProjectionMatrixTranspose) == 0)
  mvp_transpose = var;
 - if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
 + else if (strcmp(var-name,
 + gl_ModelViewProjectionMatrixInverseTranspose) == 
 0)
 +mvp_inv_transpose = var;
 + else if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
  texmat_transpose = var;
 + else if (strcmp(var-name, gl_TextureMatrixInverseTranspose) == 0)
 +texmat_inv_transpose = var;
}
 }
  
 @@ -62,11 +84,49 @@ public:
 bool progress;
  
  private:
 +   ir_variable *p_transpose;
 +   ir_variable *p_inv_transpose;
 +   ir_variable *mv_transpose;
 +   ir_variable *mv_inv_transpose;
 ir_variable *mvp_transpose;
 +   ir_variable *mvp_inv_transpose;
 ir_variable *texmat_transpose;
 +   ir_variable *texmat_inv_transpose;
  };
  }
  
 +static void
 +transform_operands(ir_expression *ir,
 +   ir_variable *mat_var, ir_variable *mat_transpose)
 +{
 +#ifndef NDEBUG
 +   ir_dereference_variable *deref = 
 ir-operands[0]-as_dereference_variable();
 +   assert(deref  deref-var == mat_var);
 +#endif
 +
 +   void *mem_ctx = ralloc_parent(ir);
 +   ir-operands[0] = ir-operands[1];
 +   ir-operands[1] = new(mem_ctx) ir_dereference_variable(mat_transpose);
 +}
 +
 +static void
 +transform_operands_texmat(ir_expression *ir,
 +  ir_variable *mat_var, ir_variable *mat_transpose)

I'd call this transform_operands_array_of_matrix or something.  Once we
add support for user-defined matrices, this function will be used for
other arrays too.

 +{
 +   ir_dereference_array *array_ref = ir-operands[0]-as_dereference_array();
 +   assert(array_ref != NULL);
 +   ir_dereference_variable *var_ref = 
 array_ref-array-as_dereference_variable();
 +   assert(var_ref  var_ref-var == mat_var);
 +
 +   ir-operands[0] = ir-operands[1];
 +   ir-operands[1] = array_ref;
 +
 +   var_ref-var = 

[Mesa-dev] [PATCH] glsl: Expand matrix flip optimization pass to cover more cases.

2014-04-21 Thread Iago Toral Quiroga
Currently it only considers the cases of gl_ModelViewProjectionMatrix and
gl_TextureMatrix. The same optimization can be done also for
gl_ModelViewMatrix, gl_ProjectionMatrix and the corresponding inverses.
---
 src/glsl/opt_flip_matrices.cpp | 118 +++--
 1 file changed, 91 insertions(+), 27 deletions(-)

diff --git a/src/glsl/opt_flip_matrices.cpp b/src/glsl/opt_flip_matrices.cpp
index 9044fd6..bf09b78 100644
--- a/src/glsl/opt_flip_matrices.cpp
+++ b/src/glsl/opt_flip_matrices.cpp
@@ -29,8 +29,9 @@
  * On some hardware, this is more efficient.
  *
  * This currently only does the conversion for built-in matrices which
- * already have transposed equivalents.  Namely, gl_ModelViewProjectionMatrix
- * and gl_TextureMatrix.
+ * already have transposed equivalents. Namely, gl_ModelViewMatrix,
+ * gl_ProjectionMatrix, gl_ModelViewProjectionMatrix, gl_TextureMatrix and
+ * their inverses.
  */
 #include ir.h
 #include ir_optimization.h
@@ -42,18 +43,39 @@ public:
matrix_flipper(exec_list *instructions)
{
   progress = false;
+  p_transpose = NULL;
+  p_inv_transpose = NULL;
+  mv_transpose = NULL;
+  mv_inv_transpose = NULL;
   mvp_transpose = NULL;
+  mvp_inv_transpose = NULL;
   texmat_transpose = NULL;
+  texmat_inv_transpose = NULL;
 
   foreach_list(n, instructions) {
  ir_instruction *ir = (ir_instruction *) n;
  ir_variable *var = ir-as_variable();
  if (!var)
 continue;
- if (strcmp(var-name, gl_ModelViewProjectionMatrixTranspose) == 0)
+
+ if (strcmp(var-name, gl_ProjectionMatrixTranspose) == 0)
+p_transpose = var;
+ else if (strcmp(var-name, gl_ProjectionMatrixInverseTranspose) == 
0)
+p_inv_transpose = var;
+ else if (strcmp(var-name, gl_ModelViewMatrixTranspose) == 0)
+mv_transpose = var;
+ else if (strcmp(var-name, gl_ModelViewMatrixInverseTranspose) == 0)
+mv_inv_transpose = var;
+ else if (strcmp(var-name,
+ gl_ModelViewProjectionMatrixTranspose) == 0)
 mvp_transpose = var;
- if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
+ else if (strcmp(var-name,
+ gl_ModelViewProjectionMatrixInverseTranspose) == 0)
+mvp_inv_transpose = var;
+ else if (strcmp(var-name, gl_TextureMatrixTranspose) == 0)
 texmat_transpose = var;
+ else if (strcmp(var-name, gl_TextureMatrixInverseTranspose) == 0)
+texmat_inv_transpose = var;
   }
}
 
@@ -62,11 +84,49 @@ public:
bool progress;
 
 private:
+   ir_variable *p_transpose;
+   ir_variable *p_inv_transpose;
+   ir_variable *mv_transpose;
+   ir_variable *mv_inv_transpose;
ir_variable *mvp_transpose;
+   ir_variable *mvp_inv_transpose;
ir_variable *texmat_transpose;
+   ir_variable *texmat_inv_transpose;
 };
 }
 
+static void
+transform_operands(ir_expression *ir,
+   ir_variable *mat_var, ir_variable *mat_transpose)
+{
+#ifndef NDEBUG
+   ir_dereference_variable *deref = ir-operands[0]-as_dereference_variable();
+   assert(deref  deref-var == mat_var);
+#endif
+
+   void *mem_ctx = ralloc_parent(ir);
+   ir-operands[0] = ir-operands[1];
+   ir-operands[1] = new(mem_ctx) ir_dereference_variable(mat_transpose);
+}
+
+static void
+transform_operands_texmat(ir_expression *ir,
+  ir_variable *mat_var, ir_variable *mat_transpose)
+{
+   ir_dereference_array *array_ref = ir-operands[0]-as_dereference_array();
+   assert(array_ref != NULL);
+   ir_dereference_variable *var_ref = 
array_ref-array-as_dereference_variable();
+   assert(var_ref  var_ref-var == mat_var);
+
+   ir-operands[0] = ir-operands[1];
+   ir-operands[1] = array_ref;
+
+   var_ref-var = mat_transpose;
+
+   mat_transpose-data.max_array_access =
+  MAX2(mat_transpose-data.max_array_access, 
mat_var-data.max_array_access);
+}
+
 ir_visitor_status
 matrix_flipper::visit_enter(ir_expression *ir)
 {
@@ -81,32 +141,36 @@ matrix_flipper::visit_enter(ir_expression *ir)
 
if (mvp_transpose 
strcmp(mat_var-name, gl_ModelViewProjectionMatrix) == 0) {
-#ifndef NDEBUG
-  ir_dereference_variable *deref = 
ir-operands[0]-as_dereference_variable();
-  assert(deref  deref-var == mat_var);
-#endif
-
-  void *mem_ctx = ralloc_parent(ir);
-
-  ir-operands[0] = ir-operands[1];
-  ir-operands[1] = new(mem_ctx) ir_dereference_variable(mvp_transpose);
-
+  transform_operands(ir, mat_var, mvp_transpose);
+  progress = true;
+   } else if (mvp_inv_transpose 
+  strcmp(mat_var-name,
+ gl_ModelViewProjectionMatrixInverse) == 0) {
+  transform_operands(ir, mat_var, mvp_inv_transpose);
+  progress = true;
+   } else if (p_transpose 
+  strcmp(mat_var-name, gl_ProjectionMatrix) == 0) {
+  transform_operands(ir, mat_var, p_transpose);
+