Fix emitting fog without secondary color and vice-versa.
authorFelix Kuehling <fxkuehl@gmx.de>
Thu, 7 Oct 2004 10:07:35 +0000 (10:07 +0000)
committerFelix Kuehling <fxkuehl@gmx.de>
Thu, 7 Oct 2004 10:07:35 +0000 (10:07 +0000)
src/mesa/drivers/dri/savage/savagetris.c

index 31917132f7f6a11944f73957a70ed581a748746f..e8b9eaa2863fb62883c148c123baf02cda1c2147 100644 (file)
@@ -707,20 +707,43 @@ static void savageRenderPrimitive( GLcontext *ctx, GLenum prim )
 }
 
 
-#define EMIT_ATTR( ATTR, STYLE, SKIP )                                 \
+#define EMIT_ATTR( ATTR, STYLE, INDEX, SKIP )                          \
 do {                                                                   \
    imesa->vertex_attrs[imesa->vertex_attr_count].attrib = (ATTR);      \
    imesa->vertex_attrs[imesa->vertex_attr_count].format = (STYLE);     \
    imesa->vertex_attr_count++;                                         \
-   drawCmd &= ~SKIP;                                                   \
+   setupIndex |= (INDEX);                                              \
+   drawCmd &= ~(SKIP);                                                 \
 } while (0)
 
+#define EMIT_PAD( N )                                                  \
+do {                                                                   \
+   imesa->vertex_attrs[imesa->vertex_attr_count].attrib = 0;           \
+   imesa->vertex_attrs[imesa->vertex_attr_count].format = EMIT_PAD;    \
+   imesa->vertex_attrs[imesa->vertex_attr_count].offset = (N);         \
+   imesa->vertex_attr_count++;                                         \
+} while (0)
+
+#define SAVAGE_EMIT_XYZ 0x0001
+#define SAVAGE_EMIT_W   0x0002
+#define SAVAGE_EMIT_C0  0x0004
+#define SAVAGE_EMIT_C1  0x0008
+#define SAVAGE_EMIT_FOG 0x0010
+#define SAVAGE_EMIT_S0  0x0020
+#define SAVAGE_EMIT_T0  0x0040
+#define SAVAGE_EMIT_ST0 0x0060
+#define SAVAGE_EMIT_S1  0x0080
+#define SAVAGE_EMIT_T1  0x0100
+#define SAVAGE_EMIT_ST1 0x0180
+
+
 static void savageRenderStart( GLcontext *ctx )
 {
    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    struct vertex_buffer *VB = &tnl->vb;
    GLuint index = tnl->render_inputs;
+   GLuint setupIndex = SAVAGE_EMIT_XYZ;
    GLuint drawCmd = SAVAGE_HW_SKIPFLAGS;
    if (imesa->savageScreen->chipset < S3_SAVAGE4)
       drawCmd &= ~SAVAGE_HW_NO_UV1;
@@ -735,18 +758,24 @@ static void savageRenderStart( GLcontext *ctx )
     * build up a hardware vertex.
     */
    if ((index & _TNL_BITS_TEX_ANY) || !(ctx->_TriangleCaps & DD_FLATSHADE)) {
-      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_HW_NO_W );
+      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_EMIT_W, SAVAGE_HW_NO_W );
    }
    else {
-      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0 );
+      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0, 0 );
    }
 
    /* t_context.c always includes a diffuse color */
-   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, SAVAGE_HW_NO_CD );
+   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, SAVAGE_EMIT_C0, SAVAGE_HW_NO_CD );
       
    if (index & (_TNL_BIT_COLOR1|_TNL_BIT_FOG)) {
-      EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, SAVAGE_HW_NO_CS );
-      EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_HW_NO_CS );
+      if ((index & _TNL_BIT_COLOR1))
+        EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, SAVAGE_EMIT_C1, SAVAGE_HW_NO_CS );
+      else
+        EMIT_PAD( 3 );
+      if ((index & _TNL_BIT_FOG))
+        EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_EMIT_FOG, SAVAGE_HW_NO_CS );
+      else
+        EMIT_PAD( 1 );
    }
 
    if (index & _TNL_BIT_TEX(0)) {
@@ -755,9 +784,9 @@ static void savageRenderStart( GLcontext *ctx )
         FALLBACK(ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE);
       }
       if (VB->TexCoordPtr[0]->size == 2)
-        EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_HW_NO_UV0 );
+        EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_EMIT_ST0, SAVAGE_HW_NO_UV0 );
       else
-        EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_HW_NO_U0 );
+        EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_EMIT_S0, SAVAGE_HW_NO_U0 );
    }
    if (index & _TNL_BIT_TEX(1)) {
       if (VB->TexCoordPtr[1]->size > 2) {
@@ -765,24 +794,21 @@ static void savageRenderStart( GLcontext *ctx )
         FALLBACK(ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE);
       }
       if (VB->TexCoordPtr[1]->size == 2)
-        EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, SAVAGE_HW_NO_UV1 );
+        EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, SAVAGE_EMIT_ST1, SAVAGE_HW_NO_UV1 );
       else
-        EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_1F, SAVAGE_HW_NO_U1 );
+        EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_1F, SAVAGE_EMIT_S1, SAVAGE_HW_NO_U1 );
    }
 
-   /* Only need to change the vertex emit code if there has been a
-    * statechange to a new hardware vertex format and also when the
-    * vertex format is set for the first time. This is indicated by
-    * imesa->vertex_size == 0.
-    */
-   if (drawCmd != (imesa->DrawPrimitiveCmd & SAVAGE_HW_SKIPFLAGS) ||
-       imesa->vertex_size == 0) {
+   /* Need to change the vertex emit code if the SetupIndex changed or
+    * is set for the first time (indicated by vertex_size == 0). */
+   if (setupIndex != imesa->SetupIndex || imesa->vertex_size == 0) {
       imesa->vertex_size = 
         _tnl_install_attrs( ctx, 
                             imesa->vertex_attrs, 
                             imesa->vertex_attr_count,
                             imesa->hw_viewport, 0 );
       imesa->vertex_size >>= 2;
+      imesa->SetupIndex = setupIndex;
 
       imesa->DrawPrimitiveCmd = drawCmd;
    }
@@ -802,7 +828,8 @@ static void savageRenderFinish( GLcontext *ctx )
 
    /* Flush the last primitive now, before any state is changed.
     * Alternatively state could be emitted in all state-changing
-    * functions in savagestate.c. */
+    * functions in savagestate.c and when changing the vertex format
+    * above. */
    FLUSH_BATCH(SAVAGE_CONTEXT(ctx));
 
    if (SAVAGE_CONTEXT(ctx)->RenderIndex & SAVAGE_FALLBACK_BIT)