glsl2: Add ir_assignment::write_mask and associated methods
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 3 Aug 2010 01:48:25 +0000 (18:48 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 4 Aug 2010 23:47:27 +0000 (16:47 -0700)
commit5a7758efbe14dee026245a4f4f4fb3ccf7b2c23b
treebe214c6f3ea4be5ec4472afa5b3426d5191380f5
parent8e9ce2eb56a087c2544112700ae1abe3f96648dd
glsl2: Add ir_assignment::write_mask and associated methods

Replace swizzles on the LHS with additional swizzles on the RHS and a
write mask in the assignment instruction.  As part of this add
ir_assignment::set_lhs.  Ideally we'd make ir_assignment::lhs private
to prevent erroneous writes, but that would require a lot of code
butchery at this point.

Add ir_assignment constructor that takes an explicit write mask.  This
is required for ir_assignment::clone, but it can also be used in other
places.  Without this, ir_assignment clones lose their write masks,
and incorrect IR is generated in optimization passes.

Add ir_assignment::whole_variable_written method.  This method gets
the variable on the LHS if the whole variable is written or NULL
otherwise.  This is different from
ir->lhs->whole_variable_referenced() because the latter has no
knowledge of the write mask stored in the ir_assignment.

Gut all code from ir_to_mesa that handled swizzles on the LHS of
assignments.  There is probably some other refactoring that could be
done here, but that can be left for another day.
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_clone.cpp
src/glsl/ir_constant_variable.cpp
src/glsl/ir_copy_propagation.cpp
src/glsl/ir_dead_code_local.cpp
src/glsl/ir_print_visitor.cpp
src/glsl/ir_tree_grafting.cpp
src/glsl/ir_vec_index_to_swizzle.cpp
src/mesa/program/ir_to_mesa.cpp