r600: fix dst reg indexing
authorKevin DeKorte <kdekorte@gmail.com>
Mon, 20 Jul 2009 22:56:47 +0000 (18:56 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Mon, 20 Jul 2009 23:00:57 +0000 (19:00 -0400)
This fixes segfaults in apps like teapot and tunnel

src/mesa/drivers/dri/r600/r700_assembler.c

index 1d41c5cf785b409ca07bd615e6dce7b38dd5a290..2d40dfa708e2ae6da64602d616cfb1a501a116c4 100644 (file)
@@ -2193,6 +2193,7 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
 GLboolean next_ins(r700_AssemblerBase *pAsm)
 {
     struct prog_instruction *pILInst = &(pAsm->pILInst[pAsm->uiCurInst]);
+    uint index;
 
     if( GL_TRUE == IsTex(pILInst->Opcode) )
     {
@@ -2213,14 +2214,20 @@ GLboolean next_ins(r700_AssemblerBase *pAsm)
       
     if(pAsm->D.dst.rtype == DST_REG_OUT) 
     {
+           if (pAsm->starting_export_register_number >= pAsm->D.dst.reg) {
+                   index = 0;
+           } else {
+                   index = pAsm->D.dst.reg - pAsm->starting_export_register_number;
+           }
+
         if(pAsm->D.dst.op3) 
         {        
             // There is no mask for OP3 instructions, so all channels are written        
-            pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number] = 0xF;
+            pAsm->pucOutMask[index] = 0xF;
         }
         else 
         {
-            pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number] 
+            pAsm->pucOutMask[index]
                |= (unsigned char)pAsm->pILInst[pAsm->uiCurInst].DstReg.WriteMask;
         }
     }