summaryrefslogtreecommitdiffstats
path: root/src/mesa/shader/slang/slang_emit.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2009-02-23 13:10:55 -0700
committerBrian Paul <[email protected]>2009-02-23 14:05:34 -0700
commitd9881356a64b848dbae5fffd77fd93d0eb4247a3 (patch)
treea53ba754939ba98fc9e8b7049f2bc731ad913e67 /src/mesa/shader/slang/slang_emit.c
parent01c0c01a6d737d71a75cbd0de65c87c42b7ca230 (diff)
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.
Diffstat (limited to 'src/mesa/shader/slang/slang_emit.c')
-rw-r--r--src/mesa/shader/slang/slang_emit.c21
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 c9d008c0af8..adb3bde9c4b 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;
}