R6xx/r7xx: Fix specular lighting issue
authorCooper Yuan <cooperyuan@gmail.com>
Tue, 14 Jul 2009 02:39:07 +0000 (10:39 +0800)
committerCooper Yuan <cooperyuan@gmail.com>
Tue, 14 Jul 2009 02:39:07 +0000 (10:39 +0800)
src/mesa/drivers/dri/r600/r700_assembler.c

index 4666518824fe0dc59ebaec5d0fbc1c9244a778f8..1d41c5cf785b409ca07bd615e6dce7b38dd5a290 100644 (file)
@@ -2883,14 +2883,17 @@ GLboolean assemble_LIT(r700_AssemblerBase *pAsm)
         return GL_FALSE;
     }
 
-    /* dst.z = log(src.y) */
+    /* before: dst.w = log(src.y)
+     * after : dst.x = log(src.y)
+     * why change dest register is that dst.w has been initialized as 1 before
+     */
     pAsm->D.dst.opcode   = SQ_OP2_INST_LOG_CLAMPED;
     pAsm->D.dst.math     = 1;
     pAsm->D.dst.rtype    = dstType;
     pAsm->D.dst.reg      = dstReg;
-    pAsm->D.dst.writex   = 0;
+    pAsm->D.dst.writex   = 1;
     pAsm->D.dst.writey   = 0;
-    pAsm->D.dst.writez   = 1;
+    pAsm->D.dst.writez   = 0;
     pAsm->D.dst.writew   = 0;
     pAsm->S[0].src.rtype = srcType;
     pAsm->S[0].src.reg   = srcReg;
@@ -2905,15 +2908,16 @@ GLboolean assemble_LIT(r700_AssemblerBase *pAsm)
         return GL_FALSE;
     }
 
-    /* dst.w = MUL_LIT(src.w, dst.z, src.x ) */
+    /* before: tmp.x = amd MUL_LIT(src.w, dst.w, src.x ) */
+    /* after : tmp.x = amd MUL_LIT(src.w, dst.x, src.x ) */
     pAsm->D.dst.opcode   = SQ_OP3_INST_MUL_LIT;
     pAsm->D.dst.op3      = 1;
-    pAsm->D.dst.rtype    = dstType;
-    pAsm->D.dst.reg      = dstReg;
-    pAsm->D.dst.writex   = 0;
+    pAsm->D.dst.rtype    = DST_REG_TEMPORARY;
+    pAsm->D.dst.reg      = tmp;
+    pAsm->D.dst.writex   = 1;
     pAsm->D.dst.writey   = 0;
     pAsm->D.dst.writez   = 0;
-    pAsm->D.dst.writew   = 1;
+    pAsm->D.dst.writew   = 0;
 
     pAsm->S[0].src.rtype = srcType;
     pAsm->S[0].src.reg   = srcReg;
@@ -2928,10 +2932,10 @@ GLboolean assemble_LIT(r700_AssemblerBase *pAsm)
     pAsm->S[1].src.reg   = dstReg;
     setaddrmode_PVSSRC(&(pAsm->S[1].src), ADDR_ABSOLUTE);
     noneg_PVSSRC(&(pAsm->S[1].src));
-    pAsm->S[1].src.swizzlex = SQ_SEL_Z;
-    pAsm->S[1].src.swizzley = SQ_SEL_Z;
-    pAsm->S[1].src.swizzlez = SQ_SEL_Z;
-    pAsm->S[1].src.swizzlew = SQ_SEL_Z;
+    pAsm->S[1].src.swizzlex = SQ_SEL_X;
+    pAsm->S[1].src.swizzley = SQ_SEL_X;
+    pAsm->S[1].src.swizzlez = SQ_SEL_X;
+    pAsm->S[1].src.swizzlew = SQ_SEL_X;
 
     pAsm->S[2].src.rtype = srcType;
     pAsm->S[2].src.reg   = srcReg;
@@ -2947,7 +2951,7 @@ GLboolean assemble_LIT(r700_AssemblerBase *pAsm)
         return GL_FALSE;
     }
 
-    /* dst.z = exp(dst.z) */
+    /* dst.z = exp(tmp.x) */
     pAsm->D.dst.opcode   = SQ_OP2_INST_EXP_IEEE;
     pAsm->D.dst.math     = 1;
     pAsm->D.dst.rtype    = dstType;
@@ -2957,14 +2961,14 @@ GLboolean assemble_LIT(r700_AssemblerBase *pAsm)
     pAsm->D.dst.writez   = 1;
     pAsm->D.dst.writew   = 0;
 
-    pAsm->S[0].src.rtype = dstType;
-    pAsm->S[0].src.reg   = dstReg;
+    pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;
+    pAsm->S[0].src.reg   = tmp;
     setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);
     noneg_PVSSRC(&(pAsm->S[0].src));
-    pAsm->S[0].src.swizzlex = SQ_SEL_Z;
-    pAsm->S[0].src.swizzley = SQ_SEL_Z;
-    pAsm->S[0].src.swizzlez = SQ_SEL_Z;
-    pAsm->S[0].src.swizzlew = SQ_SEL_Z;
+    pAsm->S[0].src.swizzlex = SQ_SEL_X;
+    pAsm->S[0].src.swizzley = SQ_SEL_X;
+    pAsm->S[0].src.swizzlez = SQ_SEL_X;
+    pAsm->S[0].src.swizzlew = SQ_SEL_X;
 
     if( GL_FALSE == next_ins(pAsm) )
     {