On 04/09/2013 10:29 AM, Eric Anholt wrote:
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).
Hm... I think I tried that (or some variation there of), but it didn't
work. I'll try again.
+ 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.
Okay.
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.
Should we add a lowering pass or an option of some sort?
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev