r300: always route 4 texcoord components to RS
authorMaciej Cencora <m.cencora@gmail.com>
Fri, 24 Apr 2009 14:15:19 +0000 (16:15 +0200)
committerDave Airlie <airlied@linux.ie>
Mon, 27 Apr 2009 09:07:50 +0000 (19:07 +1000)
Routing <4 components may lead to lock up.

Thanks to Alex Deucher for suggestion.

src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_swtcl.c

index a1f78c5244e92903b9f99044b5dd199e5945139f..9c8b8adbe3b0042e78ffec2dd30c3cfc3ecaa697 100644 (file)
@@ -1482,6 +1482,7 @@ static void r300SetupRSUnit(GLcontext * ctx)
                }
        }
 
+       /* We always route 4 texcoord components */
        for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
                if (! ( InputsRead & FRAG_BIT_TEX(i) ) )
                    continue;
@@ -1491,26 +1492,10 @@ static void r300SetupRSUnit(GLcontext * ctx)
                    continue;
                }
 
-               int swiz;
-
-               /* with TCL we always seem to route 4 components */
-               if (hw_tcl_on)
-                       count = 4;
-               else
-                       count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
-
-               switch(count) {
-               case 4: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3); break;
-               case 3: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(R300_RS_SEL_K1); break;
-               default:
-               case 1:
-               case 2: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(R300_RS_SEL_K0) | R300_RS_SEL_Q(R300_RS_SEL_K1); break;
-               };
-
-               r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= swiz | R300_RS_TEX_PTR(rs_tex_count);
+               r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3) | R300_RS_TEX_PTR(rs_tex_count);
                r300->hw.rr.cmd[R300_RR_INST_0 + tex_ip] |= R300_RS_INST_TEX_ID(tex_ip) | R300_RS_INST_TEX_CN_WRITE | R300_RS_INST_TEX_ADDR(fp_reg);
                InputsRead &= ~(FRAG_BIT_TEX0 << i);
-               rs_tex_count += count;
+               rs_tex_count += 4;
                ++tex_ip;
                ++fp_reg;
        }
@@ -1633,7 +1618,7 @@ static void r500SetupRSUnit(GLcontext * ctx)
                }
        }
 
-
+       /* We always route 4 texcoord components */
        for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
                if (! ( InputsRead & FRAG_BIT_TEX(i) ) )
                    continue;
@@ -1643,45 +1628,14 @@ static void r500SetupRSUnit(GLcontext * ctx)
                    continue;
                }
 
-               int swiz = 0;
-
-               /* with TCL we always seem to route 4 components */
-               if (hw_tcl_on)
-                 count = 4;
-               else
-                 count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
-
-               if (count == 4) {
-                       swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
-                       swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
-                       swiz |= (rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT;
-                       swiz |= (rs_tex_count + 3) << R500_RS_IP_TEX_PTR_Q_SHIFT;
-               } else if (count == 3) {
-                       swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
-                       swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
-                       swiz |= (rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
-               } else if (count == 2) {
-                       swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
-                       swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
-               } else if (count == 1) {
-                       swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
-               } else {
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
-                       swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
-               }
+               r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= ((rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT) |
+                       ((rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT) |
+                       ((rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT) |
+                       ((rs_tex_count + 3) << R500_RS_IP_TEX_PTR_Q_SHIFT);
 
-               r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= swiz;
                r300->hw.rr.cmd[R300_RR_INST_0 + tex_ip] |= R500_RS_INST_TEX_ID(tex_ip) | R500_RS_INST_TEX_CN_WRITE | R500_RS_INST_TEX_ADDR(fp_reg);
                InputsRead &= ~(FRAG_BIT_TEX0 << i);
-               rs_tex_count += count;
+               rs_tex_count += 4;
                ++tex_ip;
                ++fp_reg;
        }
index 55187d4bc8058e45846b2f2c4c5db6e71ee0d2e6..fc849889b60b75a85690688186f485cf96354cd9 100644 (file)
@@ -204,34 +204,31 @@ static void r300SetVertexFormat( GLcontext *ctx )
                ADD_ATTR(VERT_ATTRIB_POINT_SIZE, EMIT_1F, SWTCL_OVM_POINT_SIZE, swiz, MASK_X);
        }
 
+       /**
+        *  Sending only one texcoord component may lead to lock up,
+        *  so for all textures always output 4 texcoord components to RS.
+        */
        if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
-               int i, size;
-               GLuint swiz, mask, format;
+               int i;
+               GLuint swiz, format;
                for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
                        if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
                                switch (VB->TexCoordPtr[i]->size) {
                                        case 1:
                                                format = EMIT_1F;
                                                swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);
-                                               mask = MASK_X;
                                                break;
                                        case 2:
                                                format = EMIT_2F;
                                                swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ZERO, SWIZZLE_ONE);
-                                               mask = MASK_X | MASK_Y;
-                                               size = 2;
                                                break;
                                        case 3:
                                                format = EMIT_3F;
                                                swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE);
-                                               mask = MASK_X | MASK_Y | MASK_Z;
-                                               size = 3;
                                                break;
                                        case 4:
                                                format = EMIT_4F;
                                                swiz = SWIZZLE_XYZW;
-                                               mask = MASK_XYZW;
-                                               size = 4;
                                                break;
                                        default:
                                                continue;
@@ -239,8 +236,8 @@ static void r300SetVertexFormat( GLcontext *ctx )
                                InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i);
                                OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
                                EMIT_ATTR(_TNL_ATTRIB_TEX(i), format);
-                               ADD_ATTR(VERT_ATTRIB_TEX0 + i, format, SWTCL_OVM_TEX(i), swiz, mask);
-                               vap_out_fmt_1 |= size << (i * 3);
+                               ADD_ATTR(VERT_ATTRIB_TEX0 + i, format, SWTCL_OVM_TEX(i), swiz, MASK_XYZW);
+                               vap_out_fmt_1 |= 4 << (i * 3);
                                ++first_free_tex;
                        }
                }