From edc3605b029d2ccadb3d35363adb542685705a30 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 19 Jul 2006 15:47:59 +0000 Subject: from trunk: fix vertex program + evaluator crash --- src/mesa/tnl/t_context.h | 11 ++++++----- src/mesa/tnl/t_vtx_api.c | 4 ++-- src/mesa/tnl/t_vtx_eval.c | 41 ++++++++++++++++++++++++++--------------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index 9c8f2003b2..97a071951c 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -1,8 +1,8 @@ /* * mesa 3-D graphics library - * Version: 6.3 + * Version: 6.4.3 * - * Copyright (C) 1999-2005 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"), @@ -201,7 +201,8 @@ enum { _TNL_BIT_SEVEN | \ _TNL_BITS_TEX_ANY) - +/* Number of attributes used for evaluators */ +#define _TNL_NUM_EVAL 16 #define PRIM_BEGIN 0x10 #define PRIM_END 0x20 @@ -230,8 +231,8 @@ struct tnl_eval2_map { struct tnl_eval { GLuint new_state; - struct tnl_eval1_map map1[_TNL_ATTRIB_INDEX + 1]; - struct tnl_eval2_map map2[_TNL_ATTRIB_INDEX + 1]; + struct tnl_eval1_map map1[_TNL_NUM_EVAL]; + struct tnl_eval2_map map2[_TNL_NUM_EVAL]; }; diff --git a/src/mesa/tnl/t_vtx_api.c b/src/mesa/tnl/t_vtx_api.c index 013e74e12c..4eb3993e85 100644 --- a/src/mesa/tnl/t_vtx_api.c +++ b/src/mesa/tnl/t_vtx_api.c @@ -645,7 +645,7 @@ static void GLAPIENTRY _tnl_EvalCoord1f( GLfloat u ) if (tnl->vtx.eval.new_state) _tnl_update_eval( ctx ); - for (i = 0 ; i <= _TNL_ATTRIB_INDEX ; 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 ); @@ -673,7 +673,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_INDEX ; 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 ); diff --git a/src/mesa/tnl/t_vtx_eval.c b/src/mesa/tnl/t_vtx_eval.c index d948e700b0..03f126dda8 100644 --- a/src/mesa/tnl/t_vtx_eval.c +++ b/src/mesa/tnl/t_vtx_eval.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.1 + * Version: 6.4.3 * - * 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 < _TNL_NUM_EVAL; 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_INDEX; 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_INDEX; 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; -- cgit v1.2.3