diff options
author | Ian Romanick <[email protected]> | 2005-08-05 18:13:37 +0000 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2005-08-05 18:13:37 +0000 |
commit | 126c89e35fb5179fe077f7593f31ea874c89dd65 (patch) | |
tree | cd9daa0454bd2968044376698bfe517b75889066 /src/mesa/glapi/dispatch.h | |
parent | 33f5e47faf4ee545ac1f7755da652c7e003d0589 (diff) |
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.
Diffstat (limited to 'src/mesa/glapi/dispatch.h')
-rw-r--r-- | src/mesa/glapi/dispatch.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/mesa/glapi/dispatch.h b/src/mesa/glapi/dispatch.h index 1e61edcf9f4..9a456b5409d 100644 --- a/src/mesa/glapi/dispatch.h +++ b/src/mesa/glapi/dispatch.h @@ -40,11 +40,20 @@ */ #define CALL_by_offset(disp, cast, offset, parameters) \ - (*(cast (((_glapi_proc *)(disp))[offset]))) parameters + (*(cast (GET_by_offset(disp, offset)))) parameters #define GET_by_offset(disp, offset) \ - (((_glapi_proc *)(disp))[offset]) + (offset >= 0) ? (((_glapi_proc *)(disp))[offset]) : NULL #define SET_by_offset(disp, offset, fn) \ - ((((_glapi_proc *)(disp))[offset]) = (_glapi_proc) fn) + do { \ + if ( (offset) < 0 ) { \ + /* fprintf( stderr, "[%s:%u] SET_by_offset(%p, %d, %s)!\n", */ \ + /* __func__, __LINE__, disp, offset, # fn); */ \ + /* abort(); */ \ + } \ + else { \ + ( (_glapi_proc *) (disp) )[offset] = (_glapi_proc) fn; \ + } \ + } while(0) #define CALL_NewList(disp, parameters) (*((disp)->NewList)) parameters #define GET_NewList(disp) ((disp)->NewList) @@ -2501,7 +2510,7 @@ #else #define driDispatchRemapTable_size 408 -extern unsigned driDispatchRemapTable[ driDispatchRemapTable_size ]; +extern int driDispatchRemapTable[ driDispatchRemapTable_size ]; #define LoadTransposeMatrixfARB_remap_index 0 #define LoadTransposeMatrixdARB_remap_index 1 |