summaryrefslogtreecommitdiffstats
path: root/src/mesa/shader/slang/slang_emit.c
diff options
context:
space:
mode:
authorBrian <[email protected]>2007-03-13 10:49:08 -0600
committerBrian <[email protected]>2007-03-13 10:49:08 -0600
commit8b9842a2560a1254e98b5e01927f73917a0597fc (patch)
treeaa5b8e18f274e49829256058194127b0ea90d967 /src/mesa/shader/slang/slang_emit.c
parent7265e6928e873312d53eba4c24fcd3002e806831 (diff)
Shuffle some code around in the emit_tex() and emit_move() instructions.
Note that the inst ptr returned by new_instruction() may become invalid after calling emit_() since the emit functions may allocate new instructions which is done vial realloc(). Also, add some new assertions to try to catch this kind of bug.
Diffstat (limited to 'src/mesa/shader/slang/slang_emit.c')
-rw-r--r--src/mesa/shader/slang/slang_emit.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
index 6d39354d755..71741fbaf55 100644
--- a/src/mesa/shader/slang/slang_emit.c
+++ b/src/mesa/shader/slang/slang_emit.c
@@ -482,12 +482,12 @@ storage_to_src_reg(struct prog_src_register *src, const slang_ir_storage *st)
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W),
MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W)
};
- assert(st->File >= 0 && st->File <= 16);
- src->File = st->File;
- src->Index = st->Index;
- assert(st->File != PROGRAM_UNDEFINED);
+ assert(st->File >= 0);
+ assert(st->File < PROGRAM_UNDEFINED);
assert(st->Size >= 1);
assert(st->Size <= 4);
+ src->File = st->File;
+ src->Index = st->Index;
if (st->Swizzle != SWIZZLE_NOOP)
src->Swizzle = st->Swizzle;
else
@@ -520,6 +520,10 @@ new_instruction(slang_emit_info *emitInfo, gl_inst_opcode opcode)
_mesa_init_instructions(inst, 1);
inst->Opcode = opcode;
inst->BranchTarget = -1; /* invalid */
+ /*
+ printf("New inst %d: %p %s\n", prog->NumInstructions-1,(void*)inst,
+ _mesa_opcode_string(inst->Opcode));
+ */
return inst;
}
@@ -901,6 +905,9 @@ static struct prog_instruction *
emit_tex(slang_emit_info *emitInfo, slang_ir_node *n)
{
struct prog_instruction *inst;
+
+ (void) emit(emitInfo, n->Children[1]);
+
if (n->Opcode == IR_TEX) {
inst = new_instruction(emitInfo, OPCODE_TEX);
}
@@ -918,9 +925,9 @@ emit_tex(slang_emit_info *emitInfo, slang_ir_node *n)
storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask);
- (void) emit(emitInfo, n->Children[1]);
-
/* Child[1] is the coord */
+ assert(n->Children[1]->Store->File != PROGRAM_UNDEFINED);
+ assert(n->Children[1]->Store->Index >= 0);
storage_to_src_reg(&inst->SrcReg[0], n->Children[1]->Store);
/* Child[0] is the sampler (a uniform which'll indicate the texture unit) */
@@ -941,15 +948,15 @@ emit_move(slang_emit_info *emitInfo, slang_ir_node *n)
{
struct prog_instruction *inst;
+ /* lhs */
+ emit(emitInfo, n->Children[0]);
+
/* rhs */
assert(n->Children[1]);
inst = emit(emitInfo, n->Children[1]);
assert(n->Children[1]->Store->Index >= 0);
- /* lhs */
- emit(emitInfo, n->Children[0]);
-
assert(!n->Store);
n->Store = n->Children[0]->Store;