Several loops over the map1/2 evaluator arrays were incorrect.
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 19 Jul 2006 15:28:29 +0000 (15:28 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 19 Jul 2006 15:28:29 +0000 (15:28 +0000)
There's only 16 evaluator maps.  Define new _TNL_NUM_EVAL constant for
those loops.
Also, fix priority of GL_NV_vertex_program generic maps - they override the
conventional maps.
See bug 7564.

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

index 5cf262c580c677b3053416ae8b316e09d85729f9..97ad79c58fdf8bb08ed70fa770be3338f2c28378 100644 (file)
@@ -172,6 +172,9 @@ enum {
 /* Number of available generic attributes */
 #define _TNL_NUM_GENERIC 16
 
+/* Number of attributes used for evaluators */
+#define _TNL_NUM_EVAL 16
+
 #define PRIM_BEGIN     0x10
 #define PRIM_END       0x20
 #define PRIM_WEAK      0x40
@@ -199,8 +202,8 @@ struct tnl_eval2_map {
 
 struct tnl_eval {
    GLuint new_state;
-   struct tnl_eval1_map map1[_TNL_ATTRIB_EDGEFLAG + 1];
-   struct tnl_eval2_map map2[_TNL_ATTRIB_EDGEFLAG + 1];
+   struct tnl_eval1_map map1[_TNL_NUM_EVAL];
+   struct tnl_eval2_map map2[_TNL_NUM_EVAL];
 };
 
 
index 47652282696c997c112d9a775457371440833047..214af5b63c5f97f9edfc5206a88046bd60d52de5 100644 (file)
@@ -649,7 +649,7 @@ static void GLAPIENTRY _tnl_EvalCoord1f( GLfloat u )
       if (tnl->vtx.eval.new_state) 
         _tnl_update_eval( ctx );
 
-      for (i = 0 ; i <= _TNL_ATTRIB_EDGEFLAG ; i++) {
+      for (i = 0; i < _TNL_NUM_EVAL; i++) {
         if (tnl->vtx.eval.map1[i].map) 
            if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map1[i].sz)
               _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map1[i].sz );
@@ -677,7 +677,7 @@ static void GLAPIENTRY _tnl_EvalCoord2f( GLfloat u, GLfloat v )
       if (tnl->vtx.eval.new_state) 
         _tnl_update_eval( ctx );
 
-      for (i = 0 ; i <= _TNL_ATTRIB_EDGEFLAG ; i++) {
+      for (i = 0; i < _TNL_NUM_EVAL; i++) {
         if (tnl->vtx.eval.map2[i].map) 
            if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map2[i].sz)
               _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map2[i].sz );
index e21cc7f00a61472c9fc894d120957ed97bef4390..71564076e377a00845e67fc0b8a41ea22eea2616 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.1
+ * Version:  6.5.1
  *
- * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 
 static void clear_active_eval1( TNLcontext *tnl, GLuint attr ) 
 {
+   ASSERT(attr < _TNL_NUM_EVAL);
    tnl->vtx.eval.map1[attr].map = NULL;
 }
 
 static void clear_active_eval2( TNLcontext *tnl, GLuint attr ) 
 {
+   ASSERT(attr < _TNL_NUM_EVAL);
    tnl->vtx.eval.map2[attr].map = NULL;
 }
 
 static void set_active_eval1( TNLcontext *tnl, GLuint attr, GLuint dim, 
                              struct gl_1d_map *map )
 {
+   ASSERT(attr < _TNL_NUM_EVAL);
    if (!tnl->vtx.eval.map1[attr].map) {
       tnl->vtx.eval.map1[attr].map = map;
       tnl->vtx.eval.map1[attr].sz = dim;
@@ -56,6 +59,7 @@ static void set_active_eval1( TNLcontext *tnl, GLuint attr, GLuint dim,
 static void set_active_eval2( TNLcontext *tnl, GLuint attr, GLuint dim, 
                              struct gl_2d_map *map )
 {
+   ASSERT(attr < _TNL_NUM_EVAL);
    if (!tnl->vtx.eval.map2[attr].map) {
       tnl->vtx.eval.map2[attr].map = map;
       tnl->vtx.eval.map2[attr].sz = dim;
@@ -69,21 +73,11 @@ void _tnl_update_eval( GLcontext *ctx )
 
    /* Vertex program maps have priority over conventional attribs */
 
-   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
+   for (attr = 0; attr < _TNL_NUM_EVAL; attr++) {
       clear_active_eval1( tnl, attr );
       clear_active_eval2( tnl, attr );
    }
 
-   if (ctx->VertexProgram._Enabled) {
-      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
-        if (ctx->Eval.Map1Attrib[attr]) 
-           set_active_eval1( tnl, attr, 4, &ctx->EvalMap.Map1Attrib[attr] );
-
-        if (ctx->Eval.Map2Attrib[attr]) 
-           set_active_eval2( tnl, attr, 4, &ctx->EvalMap.Map2Attrib[attr] );
-      }
-   }
-
    if (ctx->Eval.Map1Color4) 
       set_active_eval1( tnl, VERT_ATTRIB_COLOR0, 4, &ctx->EvalMap.Map1Color4 );
       
@@ -124,6 +118,23 @@ void _tnl_update_eval( GLcontext *ctx )
    else if (ctx->Eval.Map2Vertex3) 
       set_active_eval2( tnl, VERT_ATTRIB_POS, 3, &ctx->EvalMap.Map2Vertex3 );
 
+   /* Evaluators with generic attributes is only supported for NV vertex
+    * programs, not ARB vertex programs.  16 evaluator maps are supported.
+    * We do this after the conventional attributes since the spec says that
+    * these generic maps have higher priority.
+    */
+   if (ctx->VertexProgram._Enabled &&
+       ctx->VertexProgram._Current &&
+       ctx->VertexProgram._Current->IsNVProgram) {
+      for (attr = 0; attr < 16; attr++) {
+        if (ctx->Eval.Map1Attrib[attr]) 
+           set_active_eval1( tnl, attr, 4, &ctx->EvalMap.Map1Attrib[attr] );
+
+        if (ctx->Eval.Map2Attrib[attr]) 
+           set_active_eval2( tnl, attr, 4, &ctx->EvalMap.Map2Attrib[attr] );
+      }
+   }
+
    tnl->vtx.eval.new_state = 0;
 }
 
@@ -134,7 +145,7 @@ void _tnl_do_EvalCoord1f(GLcontext* ctx, GLfloat u)
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    GLuint attr;
 
-   for (attr = 1; attr <= _TNL_ATTRIB_EDGEFLAG; attr++) {
+   for (attr = 1; attr < _TNL_NUM_EVAL; attr++) {
       struct gl_1d_map *map = tnl->vtx.eval.map1[attr].map;
       if (map) {
         GLfloat uu = (u - map->u1) * map->du;
@@ -179,7 +190,7 @@ void _tnl_do_EvalCoord2f( GLcontext* ctx, GLfloat u, GLfloat v )
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    GLuint attr;
 
-   for (attr = 1; attr <= _TNL_ATTRIB_EDGEFLAG; attr++) {
+   for (attr = 1; attr < _TNL_NUM_EVAL; attr++) {
       struct gl_2d_map *map = tnl->vtx.eval.map2[attr].map;
       if (map) {
         GLfloat uu = (u - map->u1) * map->du;