r500: initial support for tmu mappings
authorDave Airlie <airlied@redhat.com>
Tue, 27 May 2008 00:59:42 +0000 (10:59 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 27 May 2008 00:59:42 +0000 (10:59 +1000)
src/mesa/drivers/dri/r300/r300_state.c

index 496b76dce435f183b38a5e827061286418666dc5..86607478a3257a3fd4d80e1da7bf4994b20a2e10 100644 (file)
@@ -1324,6 +1324,85 @@ static unsigned long gen_fixed_filter(unsigned long f)
        return f;
 }
 
+static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       int i;
+       struct r300_fragment_program *fp = (struct r300_fragment_program *)
+           (char *)ctx->FragmentProgram._Current;
+
+       R300_STATECHANGE(r300, fpt);
+
+       for (i = 0; i < fp->tex.length; i++) {
+               int unit;
+               int opcode;
+               unsigned long val;
+                       
+               unit = fp->tex.inst[i] >> R300_TEX_ID_SHIFT;
+               unit &= 15;
+                       
+               val = fp->tex.inst[i];
+               val &= ~R300_TEX_ID_MASK;
+                       
+               opcode =
+                       (val & R300_TEX_INST_MASK) >> R300_TEX_INST_SHIFT;
+               if (opcode == R300_TEX_OP_KIL) {
+                       r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
+               } else {
+                       if (tmu_mappings[unit] >= 0) {
+                               val |=
+                                       tmu_mappings[unit] <<
+                                       R300_TEX_ID_SHIFT;
+                               r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
+                       } else {
+                               // We get here when the corresponding texture image is incomplete
+                               // (e.g. incomplete mipmaps etc.)
+                               r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
+                       }
+               }
+       }
+       
+       r300->hw.fpt.cmd[R300_FPT_CMD_0] =
+               cmdpacket0(R300_US_TEX_INST_0, fp->tex.length);
+       
+}
+
+static void r500SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       int i;
+       struct r500_fragment_program *fp = (struct r500_fragment_program *)
+           (char *)ctx->FragmentProgram._Current;
+
+       /* find all the texture instructions and relocate the texture units */
+       for (i = 0; i < fp->inst_end + 1; i++) {
+               if ((fp->inst[i].inst0 & 0x3) == R500_INST_TYPE_TEX) {
+                       uint32_t val;
+                       int unit, opcode, new_unit;
+
+                       val = fp->inst[i].inst1;
+
+                       unit = (val >> 16) & 0xf;
+
+                       val &= ~(0xf << 16);
+                       
+                       opcode = val & (0x7 << 22);
+                       if (opcode == R500_TEX_INST_TEXKILL) {
+                               new_unit = 0;
+                       } else {
+                               if (tmu_mappings[unit] >= 0) {
+                                       new_unit = tmu_mappings[unit];
+                               } else {
+                                       new_unit = 0;
+                               }
+                       }
+                       fprintf(stderr,"unit translate %d to %d\n", unit, new_unit);
+                       val |= R500_TEX_ID(new_unit);
+                       fp->inst[i].inst1 = val;
+               }
+       }
+}
+
 static void r300SetupTextures(GLcontext * ctx)
 {
        int i, mtu;
@@ -1439,41 +1518,10 @@ static void r300SetupTextures(GLcontext * ctx)
                return;
 
 
-        if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
-               R300_STATECHANGE(r300, fpt);
-
-               for (i = 0; i < fp->tex.length; i++) {
-                       int unit;
-                       int opcode;
-                       unsigned long val;
-                       
-                       unit = fp->tex.inst[i] >> R300_TEX_ID_SHIFT;
-                       unit &= 15;
-                       
-                       val = fp->tex.inst[i];
-                       val &= ~R300_TEX_ID_MASK;
-                       
-                       opcode =
-                               (val & R300_TEX_INST_MASK) >> R300_TEX_INST_SHIFT;
-                       if (opcode == R300_TEX_OP_KIL) {
-                               r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
-                       } else {
-                               if (tmu_mappings[unit] >= 0) {
-                                       val |=
-                                               tmu_mappings[unit] <<
-                                               R300_TEX_ID_SHIFT;
-                                       r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
-                               } else {
-                                       // We get here when the corresponding texture image is incomplete
-                                       // (e.g. incomplete mipmaps etc.)
-                                       r300->hw.fpt.cmd[R300_FPT_INSTR_0 + i] = val;
-                               }
-                       }
-               }
-               
-               r300->hw.fpt.cmd[R300_FPT_CMD_0] =
-                       cmdpacket0(R300_US_TEX_INST_0, fp->tex.length);
-       }
+        if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515)
+               r300SetupFragmentShaderTextures(ctx, tmu_mappings);
+       else 
+               r500SetupFragmentShaderTextures(ctx, tmu_mappings);
 
        if (RADEON_DEBUG & DEBUG_STATE)
                fprintf(stderr, "TX_ENABLE: %08x  last_hw_tmu=%d\n",