Mesa (master): glsl: fix another swizzle-related bug

Brian Paul brianp at kemper.freedesktop.org
Mon Feb 23 21:05:45 UTC 2009


Module: Mesa
Branch: master
Commit: d9881356a64b848dbae5fffd77fd93d0eb4247a3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d9881356a64b848dbae5fffd77fd93d0eb4247a3

Author: Brian Paul <brianp at vmware.com>
Date:   Mon Feb 23 13:10:55 2009 -0700

glsl: fix another swizzle-related bug

This fixes the case of "infinitely" nested swizzles such as EXPR.wzyx.yxwz.xxyz
This doesn't appear in typical shaders but with function inlining and the
compiler's internal use of swizzles it can happen.
New glean glsl1 test case added for this.

---

 src/mesa/shader/slang/slang_emit.c |   21 ++++++++-------------
 1 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
index c9d008c..adb3bde 100644
--- a/src/mesa/shader/slang/slang_emit.c
+++ b/src/mesa/shader/slang/slang_emit.c
@@ -1379,6 +1379,7 @@ emit_copy(slang_emit_info *emitInfo, slang_ir_node *n)
 
 #if PEEPHOLE_OPTIMIZATIONS
    if (inst &&
+       (n->Children[1]->Opcode != IR_SWIZZLE) &&
        _slang_is_temp(emitInfo->vt, n->Children[1]->Store) &&
        (inst->DstReg.File == n->Children[1]->Store->File) &&
        (inst->DstReg.Index == n->Children[1]->Store->Index) &&
@@ -1395,13 +1396,9 @@ emit_copy(slang_emit_info *emitInfo, slang_ir_node *n)
        * becomes:
        *   MUL a, x, y;
        */
-      if (n->Children[1]->Opcode != IR_SWIZZLE)
-         _slang_free_temp(emitInfo->vt, n->Children[1]->Store);
-      *n->Children[1]->Store = *n->Children[0]->Store;
 
       /* fixup the previous instruction (which stored the RHS result) */
       assert(n->Children[0]->Store->Index >= 0);
-
       storage_to_dst_reg(&inst->DstReg, n->Children[0]->Store);
       return inst;
    }
@@ -1860,24 +1857,22 @@ emit_swizzle(slang_emit_info *emitInfo, slang_ir_node *n)
 
    inst = emit(emitInfo, n->Children[0]);
 
-   if (n->Children[0]->Opcode == IR_VAR ||
-       n->Children[0]->Opcode == IR_SWIZZLE ||
-       n->Children[0]->Opcode == IR_ELEMENT) {
-      /* We can resolve the swizzle now.  Other swizzles will be resolved
-       * in storage_to_src_reg().
-       */
+   assert(n->Children[0]->Store == n->Store->Parent);
+   assert(n->Store->Parent);
+
+   {
       const GLuint swizzle = n->Store->Swizzle;
-      assert(n->Store->Parent);
       /* new storage is parent storage with updated Swizzle + Size fields */
       _slang_copy_ir_storage(n->Store, n->Store->Parent);
       /* Apply this node's swizzle to parent's storage */
       n->Store->Swizzle = _slang_swizzle_swizzle(n->Store->Swizzle, swizzle);
       /* Update size */
       n->Store->Size = swizzle_size(n->Store->Swizzle);
-      assert(!n->Store->Parent);
-      assert(n->Store->Index >= 0);
    }
 
+   assert(!n->Store->Parent);
+   assert(n->Store->Index >= 0);
+
    return inst;
 }
 




More information about the mesa-commit mailing list