mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-12-03 07:04:02 +08:00
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:
parent
69ddf6cc41
commit
0749e2723b
@ -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];
|
||||
};
|
||||
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user