Several loops over the map1/2 evaluator arrays were incorrect.

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.
This commit is contained in:
Brian Paul 2006-07-19 15:28:29 +00:00
parent 69ddf6cc41
commit 0749e2723b
3 changed files with 33 additions and 19 deletions

View 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];
};

View 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 );

View 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"),
@ -36,17 +36,20 @@
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;