On Wed, 06 Oct 2004 10:16:23 -0700
Eric Anholt <[EMAIL PROTECTED]> wrote:

> On Wed, 2004-10-06 at 04:54, Felix Kühling wrote:
> > On Mon, 04 Oct 2004 12:09:09 +0100
> > Keith Whitwell <[EMAIL PROTECTED]> wrote:
> > 
> > > John,
> > > 
> > > I'd say the problem is with these lines in savagetris.c:
> > > 
> > > 
> > >    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 );
> > >     }
> > > 
> > > This is a cut and paste of old code from another driver.  Have a look at how 
> > > other drivers handle this now to avoid trying to emit FOG when only COLOR1 is 
> > > enabled, and vice versa.
> > 
> > Is there a simpler test case than RTCW? I can't reproduce a segfault
> > with a simple program that draws triangles with diffuse lighting and
> > Fog. John, can you try if the attached patch fixes it?
> 
> One thing to note is, what happens if you change from, say,
> specular-without-fog to specular-with-fog?  You won't end up doing the
> install_attrs again like you want.  For Rage 128, I just stored the
> index in the context and checked if that had changed, instead of the
> vertex format register's value.

You're right. Thanks for catching this. I tried to understand what
force_emit in the i830 driver was for, now I understand. An updated
patch is attached. I'm going to commit that.

> 
> -- 
> Eric Anholt                                [EMAIL PROTECTED]          
> http://people.freebsd.org/~anholt/         [EMAIL PROTECTED]
> 
> 


| Felix Kühling <[EMAIL PROTECTED]>                     http://fxk.de.vu |
| PGP Fingerprint: 6A3C 9566 5B30 DDED 73C3  B152 151C 5CC1 D888 E595 |
Index: savagetris.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/savage/savagetris.c,v
retrieving revision 1.12
diff -u -r1.12 savagetris.c
--- savagetris.c        1 Jul 2004 13:14:06 -0000       1.12
+++ savagetris.c        6 Oct 2004 19:58:10 -0000
@@ -715,6 +715,15 @@
    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)
+
+
 static void savageRenderStart( GLcontext *ctx )
 {
    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
@@ -736,6 +745,11 @@
     */
    if ((index & _TNL_BITS_TEX_ANY) || !(ctx->_TriangleCaps & DD_FLATSHADE)) {
       EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, SAVAGE_HW_NO_W );
+      /* We use index below to check if the emit code changed. Since
+       * we're depending on something outside the index here we need
+       * to make sure index reflects the change in the emit
+       * code. Using an otherwise unused bit. */
+      index |= _TNL_BIT_TEX7;
    }
    else {
       EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, 0 );
@@ -745,8 +759,14 @@
    EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, 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_HW_NO_CS );
+      else
+        EMIT_PAD( 3 );
+      if ((index & _TNL_BIT_FOG))
+        EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, SAVAGE_HW_NO_CS );
+      else
+        EMIT_PAD( 1 );
    }
 
    if (index & _TNL_BIT_TEX(0)) {
@@ -770,19 +790,16 @@
         EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_1F, 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 (index != 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 = index;
 
       imesa->DrawPrimitiveCmd = drawCmd;
    }
@@ -802,7 +819,8 @@
 
    /* 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)

Reply via email to