mesa: fix a GLSL swizzled writemask bug

This fixes cases such as:
  vec4 v4;
  vec2 v2;
  v4.xz.yx = v2;
The last line now correctly compiles into MOV TEMP[1].xz, TEMP[0].yyxw;
Helps to fix the Humus Domino demo.  See bug 19189.

(cherry picked from commit 9736d8f033)
This commit is contained in:
Brian Paul
2009-01-05 13:12:12 -07:00
parent 0e25c363be
commit fb45adeb9e
+18 -2
View File
@@ -3319,6 +3319,22 @@ is_store_writable(const slang_assemble_ctx *A, const slang_ir_storage *store)
}
/**
* Walk up an IR storage path to compute the final swizzle.
* This is used when we find an expression such as "foo.xz.yx".
*/
static GLuint
root_swizzle(const slang_ir_storage *st)
{
GLuint swizzle = st->Swizzle;
while (st->Parent) {
st = st->Parent;
swizzle = _slang_swizzle_swizzle(st->Swizzle, swizzle);
}
return swizzle;
}
/**
* Generate IR tree for an assignment (=).
*/
@@ -3394,9 +3410,9 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)
rhs = _slang_gen_operation(A, &oper->children[1]);
if (lhs && rhs) {
/* convert lhs swizzle into writemask */
const GLuint swizzle = root_swizzle(lhs->Store);
GLuint writemask, newSwizzle;
if (!swizzle_to_writemask(A, lhs->Store->Swizzle,
&writemask, &newSwizzle)) {
if (!swizzle_to_writemask(A, swizzle, &writemask, &newSwizzle)) {
/* Non-simple writemask, need to swizzle right hand side in
* order to put components into the right place.
*/