[Mesa-dev] [PATCH] glsl: Expand matrix flip optimization pass to cover more cases.
Iago Toral
itoral at igalia.com
Tue Jun 17 05:07:42 PDT 2014
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 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 = 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);
> > + progress = true;
> > + } else if (p_inv_transpose &&
> > + strcmp(mat_var->name, "gl_ProjectionMatrixInverse") == 0) {
> > + transform_operands(ir, mat_var, p_inv_transpose);
> > + progress = true;
> > + } else if (mv_transpose &&
> > + strcmp(mat_var->name, "gl_ModelViewMatrix") == 0) {
> > + transform_operands(ir, mat_var, mv_transpose);
> > + progress = true;
> > + } else if (mv_inv_transpose &&
> > + strcmp(mat_var->name, "gl_ModelViewMatrixInverse") == 0) {
> > + transform_operands(ir, mat_var, mv_inv_transpose);
> > progress = true;
> > } else if (texmat_transpose &&
> > strcmp(mat_var->name, "gl_TextureMatrix") == 0) {
> > - 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 = texmat_transpose;
> > -
> > - texmat_transpose->data.max_array_access =
> > - MAX2(texmat_transpose->data.max_array_access, mat_var->data.max_array_access);
> > -
> > + transform_operands_texmat(ir, mat_var, texmat_transpose);
> > + progress = true;
> > + } else if (texmat_inv_transpose &&
> > + strcmp(mat_var->name, "gl_TextureMatrixInverse") == 0) {
> > + transform_operands_texmat(ir, mat_var, texmat_inv_transpose);
> > progress = true;
> > }
> >
>
>
More information about the mesa-dev
mailing list