Ian Romanick <i...@freedesktop.org> writes:

> From: Ian Romanick <ian.d.roman...@intel.com>
>
> This will eventually replace do_vec_index_to_cond_assign.  This lowering
> pass is called in all the places where do_vec_index_to_cond_assign or
> do_vec_index_to_swizzle is called.

> +
> +      ir_constant *const cmp_indices =
> +         new(factory.mem_ctx) 
> ir_constant(glsl_type::get_instance(GLSL_TYPE_INT,
> +                                                                  components,
> +                                                                  1),
> +                                          &cmp_indices_data);
> +
> +      ir_variable *const cmp_result =
> +         factory.make_temp(glsl_type::get_instance(GLSL_TYPE_BOOL,
> +                                                   components,
> +                                                   1),
> +                           "index_condition");

I wish we had some helpers like glsl_type::bvec(components) instead of
these verbose getters for sized vectors.

> +      ir_variable *const src_temp =
> +         factory.make_temp(expr->operands[1]->type, "src_temp");
> +
> +      const ir_swizzle_mask m = { 0, 0, 0, 0, components, false };
> +      ir_rvalue *broadcast_index =
> +         new(factory.mem_ctx) ir_swizzle(expr->operands[2], m);

Optionally:

ir_rvalue *broadcast_index =
   swizzle_for_size(swizzle_xxxx(expr->operands[2]), components).

> +      factory.emit(assign(temp, expr->operands[0]));
> +      factory.emit(assign(src_temp, expr->operands[1]));
> +      factory.emit(assign(cmp_result, equal(broadcast_index, cmp_indices)));
> +      factory.emit(if_tree(swizzle_x(cmp_result), assign(temp, src_temp, 
> 1)));
> +      factory.emit(if_tree(swizzle_y(cmp_result), assign(temp, src_temp, 
> 2)));
> +
> +      if (components > 2)
> +         factory.emit(if_tree(swizzle_z(cmp_result), assign(temp, src_temp, 
> 4)));
> +
> +      if (components > 3)
> +         factory.emit(if_tree(swizzle_w(cmp_result), assign(temp, src_temp, 
> 8)));

Please use the WRITEMASK_* defines here.

I know our hardware doesn't like the swizzling of that bvec compare
result and we'd rather just see individual compares as the condition of
each if statement.  (we basically have to emit a compare of the swizzled
bool against 0, after masking its high bits off, when we could have just
compared the index value to a constant).  I imagine other hardware would
prefer the same.

Attachment: pgp62cYICW9KI.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to