Fix the worst problems with dangling edgeflag references in
authorKeith Whitwell <keith@tungstengraphics.com>
Sat, 23 Apr 2005 11:55:18 +0000 (11:55 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Sat, 23 Apr 2005 11:55:18 +0000 (11:55 +0000)
display lists.  These mainly arise from edgeflag being the only
attribute no longer stored internally as a float and requiring
various special case paths to accomodate it.

src/mesa/tnl/t_context.h
src/mesa/tnl/t_save_api.c
src/mesa/tnl/t_vtx_api.c

index 905933a0d9b14473005eede1fa6bfbbde324ef23..e8a3c259822fbd0c144aad6cc0972fb367899911 100644 (file)
@@ -282,6 +282,7 @@ struct tnl_vtx {
    GLfloat vertex[_TNL_ATTRIB_MAX*4]; /* current vertex */
    GLfloat *attrptr[_TNL_ATTRIB_MAX]; /* points into vertex */
    GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->Current, etc */
+   GLfloat CurrentFloatEdgeFlag;
    GLuint counter, initial_counter;
    struct tnl_copied_vtx copied;
 
@@ -379,6 +380,8 @@ struct tnl_save {
    GLuint opcode_vertex_list;
 
    struct tnl_copied_vtx copied;
+   
+   GLfloat CurrentFloatEdgeFlag;
 
    GLfloat *current[_TNL_ATTRIB_MAX]; /* points into ctx->ListState */
    GLubyte *currentsz[_TNL_ATTRIB_MAX];
index 28bd376fc0801b69c3e27bbc965fb003cd2a4c7e..67fee8e29a9b57639083cc1f192984216a1a3ba9 100644 (file)
@@ -377,12 +377,16 @@ static void _save_copy_to_current( GLcontext *ctx )
       }
    }
 
-   /* Edgeflag requires special treatment:
+   /* Edgeflag requires special treatment: 
+    *
+    * TODO: change edgeflag to GLfloat in Mesa.
     */
    if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
       ctx->ListState.ActiveEdgeFlag = 1;
+      tnl->save.CurrentFloatEdgeFlag = 
+        tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0];
       ctx->ListState.CurrentEdgeFlag = 
-        (tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] == 1.0);
+        (tnl->save.CurrentFloatEdgeFlag == 1.0);
    }
 }
 
@@ -403,9 +407,10 @@ static void _save_copy_from_current( GLcontext *ctx )
 
    /* Edgeflag requires special treatment:
     */
-   if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG]) 
-      tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] = 
-        (GLfloat)ctx->ListState.CurrentEdgeFlag;
+   if (tnl->save.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
+      tnl->save.CurrentFloatEdgeFlag = (GLfloat)ctx->ListState.CurrentEdgeFlag;
+      tnl->save.attrptr[_TNL_ATTRIB_EDGEFLAG][0] = tnl->save.CurrentFloatEdgeFlag;
+   }
 }
 
 
@@ -480,8 +485,9 @@ static void _save_upgrade_vertex( GLcontext *ctx,
       if (tnl->save.currentsz[attr][0] == 0) {
         assert(oldsz == 0);
         tnl->save.dangling_attr_ref = GL_TRUE;
-        _mesa_debug(NULL, "_save_upgrade_vertex: dangling reference attr %d\n", 
-                     attr); 
+
+/*      _mesa_debug(NULL, "_save_upgrade_vertex: dangling reference attr %d\n",  */
+/*                  attr);  */
 
 #if 0
         /* The current strategy is to punt these degenerate cases
@@ -1653,7 +1659,8 @@ static void _save_current_init( GLcontext *ctx )
    tnl->save.currentsz[_TNL_ATTRIB_INDEX] = &ctx->ListState.ActiveIndex;
    tnl->save.current[_TNL_ATTRIB_INDEX] = &ctx->ListState.CurrentIndex;
 
-   /* Current edgeflag is handled individually */
+   tnl->save.currentsz[_TNL_ATTRIB_EDGEFLAG] = &ctx->ListState.ActiveEdgeFlag;
+   tnl->save.current[_TNL_ATTRIB_EDGEFLAG] = &tnl->save.CurrentFloatEdgeFlag;
 }
 
 /**
index fabd99e5d097f28cf83c7b6108c10fec47376941..b9ad28e67db9fd8dfe3d8949bbc624251ab2343b 100644 (file)
@@ -142,7 +142,7 @@ static void _tnl_copy_to_current( GLcontext *ctx )
    TNLcontext *tnl = TNL_CONTEXT(ctx); 
    GLuint i;
 
-   for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_INDEX ; i++)
+   for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_EDGEFLAG ; i++)
       if (tnl->vtx.attrsz[i]) {
          /* Note: the tnl->vtx.current[i] pointers points to
           * the ctx->Current fields.  The first 16 or so, anyway.
@@ -152,12 +152,12 @@ static void _tnl_copy_to_current( GLcontext *ctx )
                    tnl->vtx.attrptr[i]);
       }
 
-   /* Edgeflag requires special treatment:
+   /* Edgeflag requires additional treatment:
     */
-   if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG]) 
+   if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG]) {
       ctx->Current.EdgeFlag = 
-        (tnl->vtx.attrptr[_TNL_ATTRIB_EDGEFLAG][0] == 1.0);
-
+        (tnl->vtx.CurrentFloatEdgeFlag == 1.0);
+   }
 
    /* Colormaterial -- this kindof sucks.
     */
@@ -179,7 +179,12 @@ static void _tnl_copy_from_current( GLcontext *ctx )
    TNLcontext *tnl = TNL_CONTEXT(ctx); 
    GLint i;
 
-   for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_INDEX ; i++) 
+   /* Edgeflag requires additional treatment:
+    */
+   tnl->vtx.CurrentFloatEdgeFlag = 
+      (GLfloat)ctx->Current.EdgeFlag;
+   
+   for (i = _TNL_ATTRIB_POS+1 ; i <= _TNL_ATTRIB_MAX ; i++) 
       switch (tnl->vtx.attrsz[i]) {
       case 4: tnl->vtx.attrptr[i][3] = tnl->vtx.current[i][3];
       case 3: tnl->vtx.attrptr[i][2] = tnl->vtx.current[i][2];
@@ -188,13 +193,6 @@ static void _tnl_copy_from_current( GLcontext *ctx )
         break;
       }
 
-   /* Edgeflag requires special treatment:
-    */
-   if (tnl->vtx.attrsz[_TNL_ATTRIB_EDGEFLAG]) 
-      tnl->vtx.attrptr[_TNL_ATTRIB_EDGEFLAG][0] = 
-        (GLfloat)ctx->Current.EdgeFlag;
-
-
    ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
 }
 
@@ -860,6 +858,7 @@ static void _tnl_current_init( GLcontext *ctx )
         ctx->Light.Material.Attrib[i];
 
    tnl->vtx.current[_TNL_ATTRIB_INDEX] = &ctx->Current.Index;
+   tnl->vtx.current[_TNL_ATTRIB_EDGEFLAG] = &tnl->vtx.CurrentFloatEdgeFlag;
 }
 
 static struct _tnl_dynfn *no_codegen( GLcontext *ctx, int key )