From 126c89e35fb5179fe077f7593f31ea874c89dd65 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 5 Aug 2005 18:13:37 +0000 Subject: Fix recent problems with display lists and other parts of the code. CALL_by_offset, SET_by_offset, and GET_by_offset all had various problems. The core issue is that parts of the device-independent code in Mesa assumes that all functions have slots in the dispatch table. This is especially true in the display list code. It will merrilly try to set dispatch pointers for glVertexAttrib1fARB even if GL_ARB_vertex_program is not supported. When the GET/SET/CALL macros are invoked, they would read a 0 from the remap table. The problem is that 0 is the dispatch offset for glNewList! One change is that the remap table is now initialized to be full of -1 values. In addtion, all of the *_by_offset marcos misbehave in an obvious way if the specified offset is -1. SET_by_offset will do nothing, GET_by_offset will return NULL, and CALL_by_offset, since it uses GET_by_offset, will segfault. I also had to add GL_EXT_blend_func_separate to the list of default extensions in all_mesa_extensions (src/mesa/drivers/dri/common/utils.c). Even though many drivers do not export this extension, glBlendFunc is internally implemented by calling glBlendFuncSeparate. Without this addition, glBlendFunc stopped working on drivers (such as mga) that do not export GL_EXT_blend_func_separate. There are still a few assertions / crashes in GL_ARB_vertex_program tests, but I don't think that these are related to any of my changes. --- src/mesa/main/api_arrayelt.c | 28 ++++++++++++++++++++++++++++ src/mesa/main/vtxfmt.c | 6 ++++-- src/mesa/main/vtxfmt_tmp.h | 1 + 3 files changed, 33 insertions(+), 2 deletions(-) (limited to 'src/mesa/main') diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c index 71becd3533b..41adc1d1d29 100644 --- a/src/mesa/main/api_arrayelt.c +++ b/src/mesa/main/api_arrayelt.c @@ -145,6 +145,19 @@ static const int NormalFuncs[8] = { _gloffset_Normal3dv, }; +#if defined(IN_DRI_DRIVER) +static int SecondaryColorFuncs[8]; +static int FogCoordFuncs[8] = { + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 0, +}; +#else static const int SecondaryColorFuncs[8] = { _gloffset_SecondaryColor3bvEXT, _gloffset_SecondaryColor3ubvEXT, @@ -166,6 +179,7 @@ static const int FogCoordFuncs[8] = { _gloffset_FogCoordfvEXT, _gloffset_FogCoorddvEXT }; +#endif /**********************************************************************/ @@ -608,6 +622,20 @@ GLboolean _ae_create_context( GLcontext *ctx ) if (ctx->aelt_context) return GL_TRUE; +#if defined(IN_DRI_DRIVER) + SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bvEXT; + SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubvEXT; + SecondaryColorFuncs[2] = _gloffset_SecondaryColor3svEXT; + SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usvEXT; + SecondaryColorFuncs[4] = _gloffset_SecondaryColor3ivEXT; + SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uivEXT; + SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT; + SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dvEXT; + + FogCoordFuncs[6] = _gloffset_FogCoordfvEXT; + FogCoordFuncs[7] = _gloffset_FogCoorddvEXT; +#endif + ctx->aelt_context = MALLOC( sizeof(AEcontext) ); if (!ctx->aelt_context) return GL_FALSE; diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c index dcb684837c8..b3c63982911 100644 --- a/src/mesa/main/vtxfmt.c +++ b/src/mesa/main/vtxfmt.c @@ -48,14 +48,16 @@ #define PRE_LOOPBACK( FUNC ) \ { \ GET_CURRENT_CONTEXT(ctx); \ - struct gl_tnl_module *tnl = &(ctx->TnlModule); \ + struct gl_tnl_module * const tnl = &(ctx->TnlModule); \ + const int tmp_offset = _gloffset_ ## FUNC ; \ \ ASSERT( tnl->Current ); \ ASSERT( tnl->SwapCount < NUM_VERTEX_FORMAT_ENTRIES ); \ + ASSERT( tmp_offset >= 0 ); \ \ /* Save the swapped function's dispatch entry so it can be */ \ /* restored later. */ \ - tnl->Swapped[tnl->SwapCount].location = (_glapi_proc *) & (GET_ ## FUNC (ctx->Exec)); \ + tnl->Swapped[tnl->SwapCount].location = & (((_glapi_proc *)ctx->Exec)[tmp_offset]); \ tnl->Swapped[tnl->SwapCount].function = (_glapi_proc)TAG(FUNC); \ tnl->SwapCount++; \ \ diff --git a/src/mesa/main/vtxfmt_tmp.h b/src/mesa/main/vtxfmt_tmp.h index 4c9691fc0e6..2a0fdde4665 100644 --- a/src/mesa/main/vtxfmt_tmp.h +++ b/src/mesa/main/vtxfmt_tmp.h @@ -30,6 +30,7 @@ #endif #include "dispatch.h" +#include "glapioffsets.h" static void GLAPIENTRY TAG(ArrayElement)( GLint i ) { -- cgit v1.2.3