i965: Fix swizzles for system values such as gl_InstanceID.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 9 Feb 2012 00:59:39 +0000 (16:59 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 29 Feb 2012 22:57:26 +0000 (14:57 -0800)
visit(ir_variable *) sets dst_reg::writemask to the appropriate channel
for system values.  Unfortunately, visit(ir_dereference_variable *) then
calls swizzle_for_size, which for a float, sets the swizzle to .x.

This works for gl_VertexID, since we store it in the .x component (see
brw_draw_upload.c:732 - VID), but fails for gl_InstanceID (IID) since we
store it in the .y channel.

To fix this, avoid calling swizzle_for_size on ir_var_system_values.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index f9a08a011f28fb13ca39d90c0f942078aac8f98d..cb4cb877b66d8e3a65f1983970dfeaae5bf12f71 100644 (file)
@@ -1402,6 +1402,10 @@ vec4_visitor::visit(ir_dereference_variable *ir)
 
    this->result = src_reg(*reg);
 
+   /* System values get their swizzle from the dst_reg writemask */
+   if (ir->var->mode == ir_var_system_value)
+      return;
+
    if (type->is_scalar() || type->is_vector() || type->is_matrix())
       this->result.swizzle = swizzle_for_size(type->vector_elements);
 }