[Mesa-dev] [PATCH 13/13] glsl: Compare vector indices in blocks

Eric Anholt eric at anholt.net
Thu Jul 21 17:28:24 PDT 2011


On Thu, 21 Jul 2011 12:16:58 -0700, "Ian Romanick" <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Just like the non-constant array index lowering pass, compare all N
> indices at once.  For accesses to a vec4, this saves 3 comparison
> instructions on a vector architecture.
> ---
>  src/glsl/lower_vec_index_to_cond_assign.cpp |   57 ++++++++++++++++----------
>  1 files changed, 35 insertions(+), 22 deletions(-)
> 
> diff --git a/src/glsl/lower_vec_index_to_cond_assign.cpp b/src/glsl/lower_vec_index_to_cond_assign.cpp
> index 15992e2..26c5452 100644
> --- a/src/glsl/lower_vec_index_to_cond_assign.cpp
> +++ b/src/glsl/lower_vec_index_to_cond_assign.cpp
> @@ -93,32 +93,40 @@ ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(ir_rvalue
>     base_ir->insert_before(index);
>     deref = new(base_ir) ir_dereference_variable(index);
>     assign = new(base_ir) ir_assignment(deref, orig_deref->array_index, NULL);
> -   base_ir->insert_before(assign);
> +   list.push_tail(assign);
>  
>     /* Temporary where we store whichever value we swizzle out. */
>     var = new(base_ir) ir_variable(ir->type, "vec_index_tmp_v",
>  				  ir_var_temporary);
> -   base_ir->insert_before(var);
> +   list.push_tail(var);
> +
> +   /* Generate a single comparison condition "mask" for all of the components
> +    * in the vector.
> +    */
> +   ir_rvalue *const cond_deref =
> +      compare_index_block(&list, index, 0,
> +			  orig_deref->array->type->vector_elements,
> +			  mem_ctx);
>  
>     /* Generate a conditional move of each vector element to the temp. */
>     for (i = 0; i < orig_deref->array->type->vector_elements; i++) {
> -      deref = new(base_ir) ir_dereference_variable(index);
> -      condition = new(base_ir) ir_expression(ir_binop_equal,
> -					     glsl_type::bool_type,
> -					     deref,
> -					     new(base_ir) ir_constant(i));
> +      ir_rvalue *condition_swizzle =
> +	 new(ir) ir_swizzle(cond_deref->clone(ir, NULL), i, 0, 0, 0, 1);

If you've got the mem_ctx = ralloc_parent(base_ir) around already, it seems
like the right thing to use here (and in a few other places in this code)

Other than that, switching the base_ir->insert_before(whatever) to
list.push_tail() in various places (but not everywhere) seems strange.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110721/6146b76f/attachment.pgp>


More information about the mesa-dev mailing list