Shuffle some code around in the emit_tex() and emit_move() instructions.
authorBrian <brian@yutani.localnet.net>
Tue, 13 Mar 2007 16:49:08 +0000 (10:49 -0600)
committerBrian <brian@yutani.localnet.net>
Tue, 13 Mar 2007 16:49:08 +0000 (10:49 -0600)
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.

src/mesa/shader/slang/slang_emit.c

index 6d39354d755b75f8a6fb8d7117fa34e32bf65b4d..71741fbaf550d228f19d3afe4a11292e72c03071 100644 (file)
@@ -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;