r300: reorder fog coordinate and WPOS fp attributes
authorMaciej Cencora <m.cencora@gmail.com>
Tue, 7 Apr 2009 22:47:16 +0000 (00:47 +0200)
committerDave Airlie <airlied@redhat.com>
Thu, 9 Apr 2009 00:31:51 +0000 (10:31 +1000)
HW TCL path currently assumed fog, WPOS order. The order was inverted for SW TCL path.

This hopefully fixes rest of fog and WPOS related bugs.
Additionally fix some indentation, don't route unnecessary components of fog coordinates for performance reasons and simplify vertex
attribute emitting for SW TCL path.

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

index bcf8803..4fd6ba9 100644 (file)
@@ -191,7 +191,7 @@ GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
                        fprintf(stderr, "\tout of free texcoords to write fog coord\n");
                        _mesa_exit(-1);
                }
-               ret |= 4 << (3 * first_free_texcoord);
+               ret |= 1 << (3 * first_free_texcoord);
        }
 
        return ret;
index 6796d36..46c3df7 100644 (file)
@@ -1510,9 +1510,9 @@ static void r300SetupRSUnit(GLcontext * ctx)
 
                /* with TCL we always seem to route 4 components */
                if (hw_tcl_on)
-                 count = 4;
+                       count = 4;
                else
-                 count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
+                       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;
@@ -1530,12 +1530,22 @@ static void r300SetupRSUnit(GLcontext * ctx)
                ++fp_reg;
        }
 
+       if (InputsRead & FRAG_BIT_WPOS) {
+               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_WPOS;
+               rs_tex_count += 4;
+               ++tex_ip;
+               ++fp_reg;
+       }
+
        if (InputsRead & FRAG_BIT_FOGC) {
                if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_FOGC, _TNL_ATTRIB_FOG)) {
-                       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.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_S(0) | R300_RS_SEL_T(R300_RS_SEL_K0) | R300_RS_SEL_R(R300_RS_SEL_K0);
+                       r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_Q(R300_RS_SEL_K1) | 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_FOGC;
-                       rs_tex_count += 4;
+                       rs_tex_count += 1;
                        ++tex_ip;
                        ++fp_reg;
                } else {
@@ -1543,16 +1553,6 @@ static void r300SetupRSUnit(GLcontext * ctx)
                }
        }
 
-       if (InputsRead & FRAG_BIT_WPOS) {
-               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_WPOS;
-               rs_tex_count += 4;
-               ++tex_ip;
-               ++fp_reg;
-       }
-       InputsRead &= ~FRAG_BIT_WPOS;
-
        /* Setup default color if no color or tex was set */
        if (rs_tex_count == 0 && col_ip == 0) {
                r300->hw.rr.cmd[R300_RR_INST_0] = R300_RS_INST_COL_ID(0) | R300_RS_INST_COL_CN_WRITE | R300_RS_INST_COL_ADDR(0) | R300_RS_COL_FMT(R300_RS_COL_FMT_0001);
@@ -1560,10 +1560,10 @@ static void r300SetupRSUnit(GLcontext * ctx)
        }
 
        high_rr = (col_ip > tex_ip) ? col_ip : tex_ip;
-       r300->hw.rc.cmd[1] |= (rs_tex_count << R300_IT_COUNT_SHIFT)  | (col_ip << R300_IC_COUNT_SHIFT) | R300_HIRES_EN;
+       r300->hw.rc.cmd[1] |= (rs_tex_count << R300_IT_COUNT_SHIFT) | (col_ip << R300_IC_COUNT_SHIFT) | R300_HIRES_EN;
        r300->hw.rc.cmd[2] |= high_rr - 1;
 
-        r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, high_rr);
+       r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, high_rr);
 
        if (InputsRead)
                WARN_ONCE("Don't know how to satisfy InputsRead=0x%08x\n", InputsRead);
index fce34ea..03c1521 100644 (file)
@@ -171,7 +171,7 @@ static void r300SetVertexFormat( GLcontext *ctx )
        r300ContextPtr rmesa = R300_CONTEXT( ctx );
        TNLcontext *tnl = TNL_CONTEXT(ctx);
        struct vertex_buffer *VB = &tnl->vb;
-       int fog_id = -1, vap_out_fmt_1 = 0;
+       int first_free_tex = 0, vap_out_fmt_1 = 0;
        GLuint InputsRead = 0;
        GLuint OutputsWritten = 0;
        int num_attrs = 0;
@@ -222,33 +222,6 @@ static void r300SetVertexFormat( GLcontext *ctx )
                ADD_ATTR(VERT_ATTRIB_POINT_SIZE, EMIT_1F, SWTCL_OVM_POINT_SIZE, swiz, MASK_X);
        }
 
-       if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_FOG)) {
-               /* find first free tex coord slot */
-               if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
-                       int i;
-                       for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
-                               if (!RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
-                                       fog_id = i;
-                                       break;
-                               }
-                       }
-               } else {
-                       fog_id = 0;
-               }
-
-               if (fog_id == -1) {
-                       fprintf(stderr, "\tout of free texcoords to do fog\n");
-                       _mesa_exit(-1);
-               }
-
-               InputsRead |= 1 << VERT_ATTRIB_FOG;
-               OutputsWritten |= 1 << VERT_RESULT_FOGC;
-               GLuint swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO);
-               EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1F );
-               ADD_ATTR(VERT_ATTRIB_FOG, EMIT_1F, SWTCL_OVM_TEX(fog_id), swiz, MASK_X);
-               vap_out_fmt_1 |=  1 << (fog_id * 3);
-       }
-
        if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
                int i, size;
                GLuint swiz, mask, format;
@@ -282,30 +255,14 @@ static void r300SetVertexFormat( GLcontext *ctx )
                                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);
+                               ++first_free_tex;
                        }
                }
        }
 
        /* RS can't put fragment position on the pixel stack, so stuff it in texcoord if needed */
        if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_POS) && (ctx->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_WPOS)) {
-               int first_free_tex = -1;
-               if (fog_id >= 0) {
-                       first_free_tex = fog_id+1;
-               } else {
-                       if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
-                               int i;
-                               for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
-                                       if (!RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
-                                               first_free_tex = i;
-                                               break;
-                                       }
-                               }
-                       } else {
-                               first_free_tex = 0;
-                       }
-               }
-
-               if (first_free_tex == -1) {
+               if (first_free_tex >= ctx->Const.MaxTextureUnits) {
                        fprintf(stderr, "\tout of free texcoords to write w pos\n");
                        _mesa_exit(-1);
                }
@@ -315,6 +272,21 @@ static void r300SetVertexFormat( GLcontext *ctx )
                EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F );
                ADD_ATTR(VERT_ATTRIB_POS, EMIT_4F, SWTCL_OVM_TEX(first_free_tex), SWIZZLE_XYZW, MASK_XYZW);
                vap_out_fmt_1 |= 4 << (first_free_tex * 3);
+               ++first_free_tex;
+       }
+
+       if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_FOG)) {
+               if (first_free_tex >= ctx->Const.MaxTextureUnits) {
+                       fprintf(stderr, "\tout of free texcoords to write fog coordinate\n");
+                       _mesa_exit(-1);
+               }
+
+               InputsRead |= 1 << VERT_ATTRIB_FOG;
+               OutputsWritten |= 1 << VERT_RESULT_FOGC;
+               GLuint swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO);
+               EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1F );
+               ADD_ATTR(VERT_ATTRIB_FOG, EMIT_1F, SWTCL_OVM_TEX(first_free_tex), swiz, MASK_X);
+               vap_out_fmt_1 |=  1 << (first_free_tex * 3);
        }
 
        R300_NEWPRIM(rmesa);