patch by blight:

The C implementation of the gl functions is done. Thanks to Royce who has figured out more ICD internals (how function pointers are passed) the ICD loading code is getting more complete.

svn path=/trunk/; revision=8050
This commit is contained in:
Royce Mitchell III 2004-02-06 13:59:13 +00:00
parent b1adc9e47f
commit e2dba7ab82
7 changed files with 622 additions and 584 deletions

View file

@ -7,14 +7,14 @@ TARGET_NORC = yes
TARGET_NAME = opengl32
# -fno-builtin
TARGET_CFLAGS = -D__USE_W32API -DUNICODE -D_M_IX86
TARGET_CFLAGS = -D__USE_W32API -DUNICODE -D_M_IX86 -Os
# require os code to explicitly request A/W version of structs/functions
TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror
TARGET_LFLAGS = -lgdi32 -lntdll
TARGET_SDKLIBS = opengl32.a gdi32.a
TARGET_SDKLIBS = opengl32.a gdi32.a ntdll.a
# ntdll.a gdi32.a - may still need these
TARGET_OBJECTS = \

View file

@ -13,18 +13,19 @@
/* On a x86 we call the ICD functions in a special-way:
*
* For every glXXX function we export a glXXX entry-point which loads the
* matching "real" function pointer from the NtCurrentTeb()->glDispatch table
* and jmps to the address, leaving the stack alone and letting the "real"
* function return for us.
* matching "real" function pointer from the NtCurrentTeb()->glDispatchTable
* for gl functions in teblist.h and for others it gets the pointer from
* NtCurrentTeb()->glTable and jmps to the address, leaving the stack alone and
* letting the "real" function return for us.
* Royce has implemented this in NASM =D
*
* On other machines we use C to forward the calls (slow...)
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
/*#include <GL/gl.h>*/
/* -- complains about conflicting types of GL functions we export */
/* either fix that or put the GLxxx typedefs in here */
#include <ntos/types.h>
#include <napi/teb.h>
#include "opengl32.h"
@ -46,42 +47,56 @@ typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
#if defined(__GNUC__) && defined(_M_IX86) /* use GCC extended inline asm */
void STDCALL glEmptyFunc0() {}
void STDCALL glEmptyFunc4( long l1 ) {}
void STDCALL glEmptyFunc8( long l1, long l2 ) {}
void STDCALL glEmptyFunc12( long l1, long l2, long l3 ) {}
void STDCALL glEmptyFunc16( long l1, long l2, long l3, long l4 ) {}
void STDCALL glEmptyFunc20( long l1, long l2, long l3, long l4, long l5 ) {}
void STDCALL glEmptyFunc24( long l1, long l2, long l3, long l4, long l5,
long l6 ) {}
void STDCALL glEmptyFunc28( long l1, long l2, long l3, long l4, long l5,
long l6, long l7 ) {}
void STDCALL glEmptyFunc32( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8 ) {}
void STDCALL glEmptyFunc36( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9 ) {}
void STDCALL glEmptyFunc40( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9, long l10 ) {}
void STDCALL glEmptyFunc44( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9, long l10,
long l11 ) {}
void STDCALL glEmptyFunc48( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9, long l10,
long l11, long l12 ) {}
void STDCALL glEmptyFunc52( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9, long l10,
long l11, long l12, long l13 ) {}
void STDCALL glEmptyFunc56( long l1, long l2, long l3, long l4, long l5,
long l6, long l7, long l8, long l9, long l10,
long l11, long l12, long l13, long l14 ) {}
# define X(func, ret, typeargs, args) \
void WINAPI func typeargs \
{ \
__asm__( \
"movl %%fs:0x18, %%eax" "\n\t" \
"addl %0, %%eax" "\n\t" \
"jmpl *(%%eax)" "\n\t" \
: \
: "n"(0x714+(GLIDX_##func*sizeof(PVOID))) ); \
}
#elif defined(_MSC_VER) && defined(_M_IX86) /* use MSVC intel inline asm */
# define X(func, ret, typeargs, args) \
ret WINAPI func typeargs \
{ \
__asm { \
mov eax, fs:[00000018] \
jmp *GLIDX_##func(eax) \
} \
}
#else /* use C code */
#error C
# define X(func, ret, typeargs, args) \
ret WINAPI func typeargs \
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
ret STDCALL func typeargs \
{ \
PVOID fn = (PVOID)(NtCurrentTeb()->glDispatch[GLIDX_##func]); \
return (ret)((ret (*) typeargs)fn)args; \
PROC *table; \
PROC fn; \
if (tebidx >= 0) \
{ \
table = (PROC *)NtCurrentTeb()->glDispatchTable; \
fn = table[tebidx]; \
} \
else \
{ \
table = (PROC *)NtCurrentTeb()->glTable; \
fn = table[icdidx]; \
} \
return (ret)((ret(*)typeargs)fn)args; \
}
#endif
GLFUNCS_MACRO
#undef X
/* EOF */

View file

@ -8,481 +8,350 @@
* !!! AUTOMATICALLY CREATED FROM glfuncs.csv !!!
*/
/* To use this macro define a macro X(name, ret, typeargs, args).
* It gets called for every glXXX function. For glVertex3f name would be "glVertex3f",
* ret would be "void", typeargs would be "(GLfloat x, GLfloat y, GLfloat z)" and
* args would be "(x,y,z)".
/* To use this macro define a macro X(name, ret, typeargs, args, icdidx, tebidx, stack).
* It gets called for every glXXX function. i.e. glVertex3f: name = "glVertex3f",
* ret = "void", typeargs = "(GLfloat x, GLfloat y, GLfloat z)", args = "(x,y,z)",
* icdidx = "136", tebidx = "98" and stack = "12".
* Don't forget to undefine X ;-)
*/
#define GLFUNCS_MACRO \
X(glAccum, void, (GLenum op, GLfloat value), (op,value)) \
X(glActiveTexture, void, (GLenum texture), (texture)) \
X(glAddSwapHintRectWIN, void, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height)) \
X(glAlphaFunc, void, (GLenum func, GLclampf ref), (func,ref)) \
X(glAreTexturesResident, GLboolean, (GLsizei n, const GLuint *textures, GLboolean *residences), (n,textures,residences)) \
X(glArrayElement, void, (GLint i), (i)) \
X(glBegin, void, (GLenum mode), (mode)) \
X(glBindTexture, void, (GLenum target, GLuint texture), (target,texture)) \
X(glBitmap, void, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap), (width,height,xorig,yorig,xmove,ymove,bitmap)) \
X(glBlendColor, void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red,green,blue,alpha)) \
X(glBlendEquation, void, (GLenum mode), (mode)) \
X(glBlendFunc, void, (GLenum sfactor, GLenum dfactor), (sfactor,dfactor)) \
X(glBlendFuncSeparate, void, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha), (sfactorRGB,dfactorRGB,sfactorAlpha,dfactorAlpha)) \
X(glCallList, void, (GLuint list), (list)) \
X(glCallLists, void, (GLsizei n, GLenum type, const GLvoid *lists), (n,type,lists)) \
X(glClear, void, (GLbitfield mask), (mask)) \
X(glClearAccum, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha), (red,green,blue,alpha)) \
X(glClearColor, void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red,green,blue,alpha)) \
X(glClearDepth, void, (GLclampd depth), (depth)) \
X(glClearIndex, void, (GLfloat c), (c)) \
X(glClearStencil, void, (GLint s), (s)) \
X(glClientActiveTexture, void, (GLenum texture), (texture)) \
X(glClipPlane, void, (GLenum plane, const GLdouble *equation), (plane,equation)) \
X(glColor3b, void, (GLbyte red, GLbyte green, GLbyte blue), (red,green,blue)) \
X(glColor3bv, void, (const GLbyte *v), (v)) \
X(glColor3d, void, (GLdouble red, GLdouble green, GLdouble blue), (red,green,blue)) \
X(glColor3dv, void, (const GLdouble *v), (v)) \
X(glColor3f, void, (GLfloat red, GLfloat green, GLfloat blue), (red,green,blue)) \
X(glColor3fv, void, (const GLfloat *v), (v)) \
X(glColor3i, void, (GLint red, GLint green, GLint blue), (red,green,blue)) \
X(glColor3iv, void, (const GLint *v), (v)) \
X(glColor3s, void, (GLshort red, GLshort green, GLshort blue), (red,green,blue)) \
X(glColor3sv, void, (const GLshort *v), (v)) \
X(glColor3ub, void, (GLubyte red, GLubyte green, GLubyte blue), (red,green,blue)) \
X(glColor3ubv, void, (const GLubyte *v), (v)) \
X(glColor3ui, void, (GLuint red, GLuint green, GLuint blue), (red,green,blue)) \
X(glColor3uiv, void, (const GLuint *v), (v)) \
X(glColor3us, void, (GLushort red, GLushort green, GLushort blue), (red,green,blue)) \
X(glColor3usv, void, (const GLushort *v), (v)) \
X(glColor4b, void, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha), (red,green,blue,alpha)) \
X(glColor4bv, void, (const GLbyte *v), (v)) \
X(glColor4d, void, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha), (red,green,blue,alpha)) \
X(glColor4dv, void, (const GLdouble *v), (v)) \
X(glColor4f, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha), (red,green,blue,alpha)) \
X(glColor4fv, void, (const GLfloat *v), (v)) \
X(glColor4i, void, (GLint red, GLint green, GLint blue, GLint alpha), (red,green,blue,alpha)) \
X(glColor4iv, void, (const GLint *v), (v)) \
X(glColor4s, void, (GLshort red, GLshort green, GLshort blue, GLshort alpha), (red,green,blue,alpha)) \
X(glColor4sv, void, (const GLshort *v), (v)) \
X(glColor4ub, void, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha), (red,green,blue,alpha)) \
X(glColor4ubv, void, (const GLubyte *v), (v)) \
X(glColor4ui, void, (GLuint red, GLuint green, GLuint blue, GLuint alpha), (red,green,blue,alpha)) \
X(glColor4uiv, void, (const GLuint *v), (v)) \
X(glColor4us, void, (GLushort red, GLushort green, GLushort blue, GLushort alpha), (red,green,blue,alpha)) \
X(glColor4usv, void, (const GLushort *v), (v)) \
X(glColorMask, void, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha), (red,green,blue,alpha)) \
X(glColorMaterial, void, (GLenum face, GLenum mode), (face,mode)) \
X(glColorPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer)) \
X(glColorSubTable, void, (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data), (target,start,count,format,type,data)) \
X(glColorTable, void, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table), (target,internalformat,width,format,type,table)) \
X(glColorTableParameterfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params)) \
X(glColorTableParameteriv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params)) \
X(glCompressedTexImage1D, void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data), (target,level,internalformat,width,border,imageSize,data)) \
X(glCompressedTexImage2D, void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data), (target,level,internalformat,width,height,border,imageSize,data)) \
X(glCompressedTexImage3D, void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data), (target,level,internalformat,width,height,depth,border,imageSize,data)) \
X(glCompressedTexSubImage1D, void, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data), (target,level,xoffset,width,format,imageSize,data)) \
X(glCompressedTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data), (target,level,xoffset,yoffset,width,height,format,imageSize,data)) \
X(glCompressedTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data), (target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)) \
X(glConvolutionFilter1D, void, (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image), (target,internalformat,width,format,type,image)) \
X(glConvolutionFilter2D, void, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image), (target,internalformat,width,height,format,type,image)) \
X(glConvolutionParameterf, void, (GLenum target, GLenum pname, GLfloat params), (target,pname,params)) \
X(glConvolutionParameterfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params)) \
X(glConvolutionParameteri, void, (GLenum target, GLenum pname, GLint params), (target,pname,params)) \
X(glConvolutionParameteriv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params)) \
X(glCopyColorSubTable, void, (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width), (target,start,x,y,width)) \
X(glCopyColorTable, void, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width), (target,internalformat,x,y,width)) \
X(glCopyConvolutionFilter1D, void, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width), (target,internalformat,x,y,width)) \
X(glCopyConvolutionFilter2D, void, (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height), (target,internalformat,x,y,width,height)) \
X(glCopyPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type), (x,y,width,height,type)) \
X(glCopyTexImage1D, void, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border), (target,level,internalformat,x,y,width,border)) \
X(glCopyTexImage2D, void, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border), (target,level,internalformat,x,y,width,height,border)) \
X(glCopyTexSubImage1D, void, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width), (target,level,xoffset,x,y,width)) \
X(glCopyTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height), (target,level,xoffset,yoffset,x,y,width,height)) \
X(glCopyTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height), (target,level,xoffset,yoffset,zoffset,x,y,width,height)) \
X(glCullFace, void, (GLenum mode), (mode)) \
X(glDeleteLists, void, (GLuint list, GLsizei range), (list,range)) \
X(glDeleteTextures, void, (GLsizei n, const GLuint *textures), (n,textures)) \
X(glDepthFunc, void, (GLenum func), (func)) \
X(glDepthMask, void, (GLboolean flag), (flag)) \
X(glDepthRange, void, (GLclampd zNear, GLclampd zFar), (zNear,zFar)) \
X(glDisable, void, (GLenum cap), (cap)) \
X(glDisableClientState, void, (GLenum array), (array)) \
X(glDrawArrays, void, (GLenum mode, GLint first, GLsizei count), (mode,first,count)) \
X(glDrawBuffer, void, (GLenum mode), (mode)) \
X(glDrawElements, void, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices), (mode,count,type,indices)) \
X(glDrawPixels, void, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels), (width,height,format,type,pixels)) \
X(glDrawRangeElements, void, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices), (mode,start,end,count,type,indices)) \
X(glEdgeFlag, void, (GLboolean flag), (flag)) \
X(glEdgeFlagPointer, void, (GLsizei stride, const GLboolean *pointer), (stride,pointer)) \
X(glEdgeFlagv, void, (const GLboolean *flag), (flag)) \
X(glEnable, void, (GLenum cap), (cap)) \
X(glEnableClientState, void, (GLenum array), (array)) \
X(glEnd, void, (void), ()) \
X(glEndList, void, (void), ()) \
X(glEvalCoord1d, void, (GLdouble u), (u)) \
X(glEvalCoord1dv, void, (const GLdouble *u), (u)) \
X(glEvalCoord1f, void, (GLfloat u), (u)) \
X(glEvalCoord1fv, void, (const GLfloat *u), (u)) \
X(glEvalCoord2d, void, (GLdouble u, GLdouble v), (u,v)) \
X(glEvalCoord2dv, void, (const GLdouble *u), (u)) \
X(glEvalCoord2f, void, (GLfloat u, GLfloat v), (u,v)) \
X(glEvalCoord2fv, void, (const GLfloat *u), (u)) \
X(glEvalMesh1, void, (GLenum mode, GLint i1, GLint i2), (mode,i1,i2)) \
X(glEvalMesh2, void, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2), (mode,i1,i2,j1,j2)) \
X(glEvalPoint1, void, (GLint i), (i)) \
X(glEvalPoint2, void, (GLint i, GLint j), (i,j)) \
X(glFeedbackBuffer, void, (GLsizei size, GLenum type, GLfloat *buffer), (size,type,buffer)) \
X(glFinish, void, (void), ()) \
X(glFlush, void, (void), ()) \
X(glFlushHold, GLuint, (void), ()) \
X(glFogCoordPointer, void, (GLenum type, GLsizei stride, const GLvoid *pointer), (type,stride,pointer)) \
X(glFogCoordd, void, (GLdouble fog), (fog)) \
X(glFogCoorddv, void, (const GLdouble *fog), (fog)) \
X(glFogCoordf, void, (GLfloat fog), (fog)) \
X(glFogCoordfv, void, (const GLfloat *fog), (fog)) \
X(glFogf, void, (GLenum pname, GLfloat param), (pname,param)) \
X(glFogfv, void, (GLenum pname, const GLfloat *params), (pname,params)) \
X(glFogi, void, (GLenum pname, GLint param), (pname,param)) \
X(glFogiv, void, (GLenum pname, const GLint *params), (pname,params)) \
X(glFrontFace, void, (GLenum mode), (mode)) \
X(glFrustum, void, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar), (left,right,bottom,top,zNear,zFar)) \
X(glGenLists, GLuint, (GLsizei range), (range)) \
X(glGenTextures, void, (GLsizei n, GLuint *textures), (n,textures)) \
X(glGetBooleanv, void, (GLenum pname, GLboolean *params), (pname,params)) \
X(glGetClipPlane, void, (GLenum plane, GLdouble *equation), (plane,equation)) \
X(glGetColorTable, void, (GLenum target, GLenum format, GLenum type, GLvoid *table), (target,format,type,table)) \
X(glGetColorTableParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetColorTableParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glGetCompressedTexImage, void, (GLenum target, GLint lod, GLvoid *img), (target,lod,img)) \
X(glGetConvolutionFilter, void, (GLenum target, GLenum format, GLenum type, GLvoid *image), (target,format,type,image)) \
X(glGetConvolutionParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetConvolutionParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glGetDoublev, void, (GLenum pname, GLdouble *params), (pname,params)) \
X(glGetError, GLenum, (void), ()) \
X(glGetFloatv, void, (GLenum pname, GLfloat *params), (pname,params)) \
X(glGetHistogram, void, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values), (target,reset,format,type,values)) \
X(glGetHistogramParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetHistogramParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glGetIntegerv, void, (GLenum pname, GLint *params), (pname,params)) \
X(glGetLightfv, void, (GLenum light, GLenum pname, GLfloat *params), (light,pname,params)) \
X(glGetLightiv, void, (GLenum light, GLenum pname, GLint *params), (light,pname,params)) \
X(glGetMapdv, void, (GLenum target, GLenum query, GLdouble *v), (target,query,v)) \
X(glGetMapfv, void, (GLenum target, GLenum query, GLfloat *v), (target,query,v)) \
X(glGetMapiv, void, (GLenum target, GLenum query, GLint *v), (target,query,v)) \
X(glGetMaterialfv, void, (GLenum face, GLenum pname, GLfloat *params), (face,pname,params)) \
X(glGetMaterialiv, void, (GLenum face, GLenum pname, GLint *params), (face,pname,params)) \
X(glGetMinmax, void, (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values), (target,reset,format,type,values)) \
X(glGetMinmaxParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetMinmaxParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glGetPixelMapfv, void, (GLenum map, GLfloat *values), (map,values)) \
X(glGetPixelMapuiv, void, (GLenum map, GLuint *values), (map,values)) \
X(glGetPixelMapusv, void, (GLenum map, GLushort *values), (map,values)) \
X(glGetPointerv, void, (GLenum pname, GLvoid* *params), (pname,params)) \
X(glGetPolygonStipple, void, (GLubyte *mask), (mask)) \
X(glGetSeparableFilter, void, (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span), (target,format,type,row,column,span)) \
X(glGetString, const, (GLenum name), (name)) \
X(glGetTexEnvfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetTexEnviv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glGetTexGendv, void, (GLenum coord, GLenum pname, GLdouble *params), (coord,pname,params)) \
X(glGetTexGenfv, void, (GLenum coord, GLenum pname, GLfloat *params), (coord,pname,params)) \
X(glGetTexGeniv, void, (GLenum coord, GLenum pname, GLint *params), (coord,pname,params)) \
X(glGetTexImage, void, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels), (target,level,format,type,pixels)) \
X(glGetTexLevelParameterfv, void, (GLenum target, GLint level, GLenum pname, GLfloat *params), (target,level,pname,params)) \
X(glGetTexLevelParameteriv, void, (GLenum target, GLint level, GLenum pname, GLint *params), (target,level,pname,params)) \
X(glGetTexParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params)) \
X(glGetTexParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params)) \
X(glHint, void, (GLenum target, GLenum mode), (target,mode)) \
X(glHistogram, void, (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink), (target,width,internalformat,sink)) \
X(glIndexMask, void, (GLuint mask), (mask)) \
X(glIndexPointer, void, (GLenum type, GLsizei stride, const GLvoid *pointer), (type,stride,pointer)) \
X(glIndexd, void, (GLdouble c), (c)) \
X(glIndexdv, void, (const GLdouble *c), (c)) \
X(glIndexf, void, (GLfloat c), (c)) \
X(glIndexfv, void, (const GLfloat *c), (c)) \
X(glIndexi, void, (GLint c), (c)) \
X(glIndexiv, void, (const GLint *c), (c)) \
X(glIndexs, void, (GLshort c), (c)) \
X(glIndexsv, void, (const GLshort *c), (c)) \
X(glIndexub, void, (GLubyte c), (c)) \
X(glIndexubv, void, (const GLubyte *c), (c)) \
X(glInitNames, void, (void), ()) \
X(glInterleavedArrays, void, (GLenum format, GLsizei stride, const GLvoid *pointer), (format,stride,pointer)) \
X(glIsEnabled, GLboolean, (GLenum cap), (cap)) \
X(glIsList, GLboolean, (GLuint list), (list)) \
X(glIsTexture, GLboolean, (GLuint texture), (texture)) \
X(glLightModelf, void, (GLenum pname, GLfloat param), (pname,param)) \
X(glLightModelfv, void, (GLenum pname, const GLfloat *params), (pname,params)) \
X(glLightModeli, void, (GLenum pname, GLint param), (pname,param)) \
X(glLightModeliv, void, (GLenum pname, const GLint *params), (pname,params)) \
X(glLightf, void, (GLenum light, GLenum pname, GLfloat param), (light,pname,param)) \
X(glLightfv, void, (GLenum light, GLenum pname, const GLfloat *params), (light,pname,params)) \
X(glLighti, void, (GLenum light, GLenum pname, GLint param), (light,pname,param)) \
X(glLightiv, void, (GLenum light, GLenum pname, const GLint *params), (light,pname,params)) \
X(glLineStipple, void, (GLint factor, GLushort pattern), (factor,pattern)) \
X(glLineWidth, void, (GLfloat width), (width)) \
X(glListBase, void, (GLuint base), (base)) \
X(glLoadIdentity, void, (void), ()) \
X(glLoadMatrixd, void, (const GLdouble *m), (m)) \
X(glLoadMatrixf, void, (const GLfloat *m), (m)) \
X(glLoadName, void, (GLuint name), (name)) \
X(glLoadTransposeMatrixd, void, (const GLdouble *m), (m)) \
X(glLoadTransposeMatrixf, void, (const GLfloat *m), (m)) \
X(glLogicOp, void, (GLenum opcode), (opcode)) \
X(glMap1d, void, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points), (target,u1,u2,stride,order,points)) \
X(glMap1f, void, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points), (target,u1,u2,stride,order,points)) \
X(glMap2d, void, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points), (target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,points)) \
X(glMap2f, void, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points), (target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,points)) \
X(glMapGrid1d, void, (GLint un, GLdouble u1, GLdouble u2), (un,u1,u2)) \
X(glMapGrid1f, void, (GLint un, GLfloat u1, GLfloat u2), (un,u1,u2)) \
X(glMapGrid2d, void, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2), (un,u1,u2,vn,v1,v2)) \
X(glMapGrid2f, void, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2), (un,u1,u2,vn,v1,v2)) \
X(glMaterialf, void, (GLenum face, GLenum pname, GLfloat param), (face,pname,param)) \
X(glMaterialfv, void, (GLenum face, GLenum pname, const GLfloat *params), (face,pname,params)) \
X(glMateriali, void, (GLenum face, GLenum pname, GLint param), (face,pname,param)) \
X(glMaterialiv, void, (GLenum face, GLenum pname, const GLint *params), (face,pname,params)) \
X(glMatrixMode, void, (GLenum mode), (mode)) \
X(glMinmax, void, (GLenum target, GLenum internalformat, GLboolean sink), (target,internalformat,sink)) \
X(glMultMatrixd, void, (const GLdouble *m), (m)) \
X(glMultMatrixf, void, (const GLfloat *m), (m)) \
X(glMultTransposeMatrixd, void, (const GLdouble *m), (m)) \
X(glMultTransposeMatrixf, void, (const GLfloat *m), (m)) \
X(glMultiDrawArrays, void, (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount), (mode,first,count,primcount)) \
X(glMultiDrawElements, void, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount), (mode,count,type,indices,primcount)) \
X(glMultiTexCoord1d, void, (GLenum target, GLdouble s), (target,s)) \
X(glMultiTexCoord1dv, void, (GLenum target, const GLdouble *v), (target,v)) \
X(glMultiTexCoord1f, void, (GLenum target, GLfloat s), (target,s)) \
X(glMultiTexCoord1fv, void, (GLenum target, const GLfloat *v), (target,v)) \
X(glMultiTexCoord1i, void, (GLenum target, GLint s), (target,s)) \
X(glMultiTexCoord1iv, void, (GLenum target, const GLint *v), (target,v)) \
X(glMultiTexCoord1s, void, (GLenum target, GLshort s), (target,s)) \
X(glMultiTexCoord1sv, void, (GLenum target, const GLshort *v), (target,v)) \
X(glMultiTexCoord2d, void, (GLenum target, GLdouble s, GLdouble t), (target,s,t)) \
X(glMultiTexCoord2dv, void, (GLenum target, const GLdouble *v), (target,v)) \
X(glMultiTexCoord2f, void, (GLenum target, GLfloat s, GLfloat t), (target,s,t)) \
X(glMultiTexCoord2fv, void, (GLenum target, const GLfloat *v), (target,v)) \
X(glMultiTexCoord2i, void, (GLenum target, GLint s, GLint t), (target,s,t)) \
X(glMultiTexCoord2iv, void, (GLenum target, const GLint *v), (target,v)) \
X(glMultiTexCoord2s, void, (GLenum target, GLshort s, GLshort t), (target,s,t)) \
X(glMultiTexCoord2sv, void, (GLenum target, const GLshort *v), (target,v)) \
X(glMultiTexCoord3d, void, (GLenum target, GLdouble s, GLdouble t, GLdouble r), (target,s,t,r)) \
X(glMultiTexCoord3dv, void, (GLenum target, const GLdouble *v), (target,v)) \
X(glMultiTexCoord3f, void, (GLenum target, GLfloat s, GLfloat t, GLfloat r), (target,s,t,r)) \
X(glMultiTexCoord3fv, void, (GLenum target, const GLfloat *v), (target,v)) \
X(glMultiTexCoord3i, void, (GLenum target, GLint s, GLint t, GLint r), (target,s,t,r)) \
X(glMultiTexCoord3iv, void, (GLenum target, const GLint *v), (target,v)) \
X(glMultiTexCoord3s, void, (GLenum target, GLshort s, GLshort t, GLshort r), (target,s,t,r)) \
X(glMultiTexCoord3sv, void, (GLenum target, const GLshort *v), (target,v)) \
X(glMultiTexCoord4d, void, (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q), (target,s,t,r,q)) \
X(glMultiTexCoord4dv, void, (GLenum target, const GLdouble *v), (target,v)) \
X(glMultiTexCoord4f, void, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q), (target,s,t,r,q)) \
X(glMultiTexCoord4fv, void, (GLenum target, const GLfloat *v), (target,v)) \
X(glMultiTexCoord4i, void, (GLenum target, GLint s, GLint t, GLint r, GLint q), (target,s,t,r,q)) \
X(glMultiTexCoord4iv, void, (GLenum target, const GLint *v), (target,v)) \
X(glMultiTexCoord4s, void, (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q), (target,s,t,r,q)) \
X(glMultiTexCoord4sv, void, (GLenum target, const GLshort *v), (target,v)) \
X(glNewList, void, (GLuint list, GLenum mode), (list,mode)) \
X(glNormal3b, void, (GLbyte nx, GLbyte ny, GLbyte nz), (nx,ny,nz)) \
X(glNormal3bv, void, (const GLbyte *v), (v)) \
X(glNormal3d, void, (GLdouble nx, GLdouble ny, GLdouble nz), (nx,ny,nz)) \
X(glNormal3dv, void, (const GLdouble *v), (v)) \
X(glNormal3f, void, (GLfloat nx, GLfloat ny, GLfloat nz), (nx,ny,nz)) \
X(glNormal3fv, void, (const GLfloat *v), (v)) \
X(glNormal3i, void, (GLint nx, GLint ny, GLint nz), (nx,ny,nz)) \
X(glNormal3iv, void, (const GLint *v), (v)) \
X(glNormal3s, void, (GLshort nx, GLshort ny, GLshort nz), (nx,ny,nz)) \
X(glNormal3sv, void, (const GLshort *v), (v)) \
X(glNormalPointer, void, (GLenum type, GLsizei stride, const GLvoid *pointer), (type,stride,pointer)) \
X(glOrtho, void, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar), (left,right,bottom,top,zNear,zFar)) \
X(glPassThrough, void, (GLfloat token), (token)) \
X(glPixelMapfv, void, (GLenum map, GLint mapsize, const GLfloat *values), (map,mapsize,values)) \
X(glPixelMapuiv, void, (GLenum map, GLint mapsize, const GLuint *values), (map,mapsize,values)) \
X(glPixelMapusv, void, (GLenum map, GLint mapsize, const GLushort *values), (map,mapsize,values)) \
X(glPixelStoref, void, (GLenum pname, GLfloat param), (pname,param)) \
X(glPixelStorei, void, (GLenum pname, GLint param), (pname,param)) \
X(glPixelTransferf, void, (GLenum pname, GLfloat param), (pname,param)) \
X(glPixelTransferi, void, (GLenum pname, GLint param), (pname,param)) \
X(glPixelZoom, void, (GLfloat xfactor, GLfloat yfactor), (xfactor,yfactor)) \
X(glPointParameterf, void, (GLenum pname, GLfloat param), (pname,param)) \
X(glPointParameterfv, void, (GLenum pname, const GLfloat *params), (pname,params)) \
X(glPointParameteri, void, (GLenum pname, GLint param), (pname,param)) \
X(glPointParameteriv, void, (GLenum pname, const GLint *params), (pname,params)) \
X(glPointSize, void, (GLfloat size), (size)) \
X(glPolygonMode, void, (GLenum face, GLenum mode), (face,mode)) \
X(glPolygonOffset, void, (GLfloat factor, GLfloat units), (factor,units)) \
X(glPolygonStipple, void, (const GLubyte *mask), (mask)) \
X(glPopAttrib, void, (void), ()) \
X(glPopClientAttrib, void, (void), ()) \
X(glPopMatrix, void, (void), ()) \
X(glPopName, void, (void), ()) \
X(glPrioritizeTextures, void, (GLsizei n, const GLuint *textures, const GLclampf *priorities), (n,textures,priorities)) \
X(glPushAttrib, void, (GLbitfield mask), (mask)) \
X(glPushClientAttrib, void, (GLbitfield mask), (mask)) \
X(glPushMatrix, void, (void), ()) \
X(glPushName, void, (GLuint name), (name)) \
X(glRasterPos2d, void, (GLdouble x, GLdouble y), (x,y)) \
X(glRasterPos2dv, void, (const GLdouble *v), (v)) \
X(glRasterPos2f, void, (GLfloat x, GLfloat y), (x,y)) \
X(glRasterPos2fv, void, (const GLfloat *v), (v)) \
X(glRasterPos2i, void, (GLint x, GLint y), (x,y)) \
X(glRasterPos2iv, void, (const GLint *v), (v)) \
X(glRasterPos2s, void, (GLshort x, GLshort y), (x,y)) \
X(glRasterPos2sv, void, (const GLshort *v), (v)) \
X(glRasterPos3d, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z)) \
X(glRasterPos3dv, void, (const GLdouble *v), (v)) \
X(glRasterPos3f, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z)) \
X(glRasterPos3fv, void, (const GLfloat *v), (v)) \
X(glRasterPos3i, void, (GLint x, GLint y, GLint z), (x,y,z)) \
X(glRasterPos3iv, void, (const GLint *v), (v)) \
X(glRasterPos3s, void, (GLshort x, GLshort y, GLshort z), (x,y,z)) \
X(glRasterPos3sv, void, (const GLshort *v), (v)) \
X(glRasterPos4d, void, (GLdouble x, GLdouble y, GLdouble z, GLdouble w), (x,y,z,w)) \
X(glRasterPos4dv, void, (const GLdouble *v), (v)) \
X(glRasterPos4f, void, (GLfloat x, GLfloat y, GLfloat z, GLfloat w), (x,y,z,w)) \
X(glRasterPos4fv, void, (const GLfloat *v), (v)) \
X(glRasterPos4i, void, (GLint x, GLint y, GLint z, GLint w), (x,y,z,w)) \
X(glRasterPos4iv, void, (const GLint *v), (v)) \
X(glRasterPos4s, void, (GLshort x, GLshort y, GLshort z, GLshort w), (x,y,z,w)) \
X(glRasterPos4sv, void, (const GLshort *v), (v)) \
X(glReadBuffer, void, (GLenum mode), (mode)) \
X(glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels), (x,y,width,height,format,type,pixels)) \
X(glRectd, void, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2), (x1,y1,x2,y2)) \
X(glRectdv, void, (const GLdouble *v1, const GLdouble *v2), (v1,v2)) \
X(glRectf, void, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2), (x1,y1,x2,y2)) \
X(glRectfv, void, (const GLfloat *v1, const GLfloat *v2), (v1,v2)) \
X(glRecti, void, (GLint x1, GLint y1, GLint x2, GLint y2), (x1,y1,x2,y2)) \
X(glRectiv, void, (const GLint *v1, const GLint *v2), (v1,v2)) \
X(glRects, void, (GLshort x1, GLshort y1, GLshort x2, GLshort y2), (x1,y1,x2,y2)) \
X(glRectsv, void, (const GLshort *v1, const GLshort *v2), (v1,v2)) \
X(glReleaseFlushHold, GLenum, (GLuint id), (id)) \
X(glRenderMode, GLint, (GLenum mode), (mode)) \
X(glResetHistogram, void, (GLenum target), (target)) \
X(glResetMinmax, void, (GLenum target), (target)) \
X(glRotated, void, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z), (angle,x,y,z)) \
X(glRotatef, void, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z), (angle,x,y,z)) \
X(glSampleCoverage, void, (GLclampf value, GLboolean invert), (value,invert)) \
X(glScaled, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z)) \
X(glScalef, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z)) \
X(glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height)) \
X(glSecondaryColor3b, void, (GLbyte red, GLbyte green, GLbyte blue), (red,green,blue)) \
X(glSecondaryColor3bv, void, (const GLbyte *v), (v)) \
X(glSecondaryColor3d, void, (GLdouble red, GLdouble green, GLdouble blue), (red,green,blue)) \
X(glSecondaryColor3dv, void, (const GLdouble *v), (v)) \
X(glSecondaryColor3f, void, (GLfloat red, GLfloat green, GLfloat blue), (red,green,blue)) \
X(glSecondaryColor3fv, void, (const GLfloat *v), (v)) \
X(glSecondaryColor3i, void, (GLint red, GLint green, GLint blue), (red,green,blue)) \
X(glSecondaryColor3iv, void, (const GLint *v), (v)) \
X(glSecondaryColor3s, void, (GLshort red, GLshort green, GLshort blue), (red,green,blue)) \
X(glSecondaryColor3sv, void, (const GLshort *v), (v)) \
X(glSecondaryColor3ub, void, (GLubyte red, GLubyte green, GLubyte blue), (red,green,blue)) \
X(glSecondaryColor3ubv, void, (const GLubyte *v), (v)) \
X(glSecondaryColor3ui, void, (GLuint red, GLuint green, GLuint blue), (red,green,blue)) \
X(glSecondaryColor3uiv, void, (const GLuint *v), (v)) \
X(glSecondaryColor3us, void, (GLushort red, GLushort green, GLushort blue), (red,green,blue)) \
X(glSecondaryColor3usv, void, (const GLushort *v), (v)) \
X(glSecondaryColorPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer)) \
X(glSelectBuffer, void, (GLsizei size, GLuint *buffer), (size,buffer)) \
X(glSeparableFilter2D, void, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column), (target,internalformat,width,height,format,type,row,column)) \
X(glShadeModel, void, (GLenum mode), (mode)) \
X(glStencilFunc, void, (GLenum func, GLint ref, GLuint mask), (func,ref,mask)) \
X(glStencilMask, void, (GLuint mask), (mask)) \
X(glStencilOp, void, (GLenum fail, GLenum zfail, GLenum zpass), (fail,zfail,zpass)) \
X(glTexCoord1d, void, (GLdouble s), (s)) \
X(glTexCoord1dv, void, (const GLdouble *v), (v)) \
X(glTexCoord1f, void, (GLfloat s), (s)) \
X(glTexCoord1fv, void, (const GLfloat *v), (v)) \
X(glTexCoord1i, void, (GLint s), (s)) \
X(glTexCoord1iv, void, (const GLint *v), (v)) \
X(glTexCoord1s, void, (GLshort s), (s)) \
X(glTexCoord1sv, void, (const GLshort *v), (v)) \
X(glTexCoord2d, void, (GLdouble s, GLdouble t), (s,t)) \
X(glTexCoord2dv, void, (const GLdouble *v), (v)) \
X(glTexCoord2f, void, (GLfloat s, GLfloat t), (s,t)) \
X(glTexCoord2fv, void, (const GLfloat *v), (v)) \
X(glTexCoord2i, void, (GLint s, GLint t), (s,t)) \
X(glTexCoord2iv, void, (const GLint *v), (v)) \
X(glTexCoord2s, void, (GLshort s, GLshort t), (s,t)) \
X(glTexCoord2sv, void, (const GLshort *v), (v)) \
X(glTexCoord3d, void, (GLdouble s, GLdouble t, GLdouble r), (s,t,r)) \
X(glTexCoord3dv, void, (const GLdouble *v), (v)) \
X(glTexCoord3f, void, (GLfloat s, GLfloat t, GLfloat r), (s,t,r)) \
X(glTexCoord3fv, void, (const GLfloat *v), (v)) \
X(glTexCoord3i, void, (GLint s, GLint t, GLint r), (s,t,r)) \
X(glTexCoord3iv, void, (const GLint *v), (v)) \
X(glTexCoord3s, void, (GLshort s, GLshort t, GLshort r), (s,t,r)) \
X(glTexCoord3sv, void, (const GLshort *v), (v)) \
X(glTexCoord4d, void, (GLdouble s, GLdouble t, GLdouble r, GLdouble q), (s,t,r,q)) \
X(glTexCoord4dv, void, (const GLdouble *v), (v)) \
X(glTexCoord4f, void, (GLfloat s, GLfloat t, GLfloat r, GLfloat q), (s,t,r,q)) \
X(glTexCoord4fv, void, (const GLfloat *v), (v)) \
X(glTexCoord4i, void, (GLint s, GLint t, GLint r, GLint q), (s,t,r,q)) \
X(glTexCoord4iv, void, (const GLint *v), (v)) \
X(glTexCoord4s, void, (GLshort s, GLshort t, GLshort r, GLshort q), (s,t,r,q)) \
X(glTexCoord4sv, void, (const GLshort *v), (v)) \
X(glTexCoordPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer)) \
X(glTexEnvf, void, (GLenum target, GLenum pname, GLfloat param), (target,pname,param)) \
X(glTexEnvfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params)) \
X(glTexEnvi, void, (GLenum target, GLenum pname, GLint param), (target,pname,param)) \
X(glTexEnviv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params)) \
X(glTexGend, void, (GLenum coord, GLenum pname, GLdouble param), (coord,pname,param)) \
X(glTexGendv, void, (GLenum coord, GLenum pname, const GLdouble *params), (coord,pname,params)) \
X(glTexGenf, void, (GLenum coord, GLenum pname, GLfloat param), (coord,pname,param)) \
X(glTexGenfv, void, (GLenum coord, GLenum pname, const GLfloat *params), (coord,pname,params)) \
X(glTexGeni, void, (GLenum coord, GLenum pname, GLint param), (coord,pname,param)) \
X(glTexGeniv, void, (GLenum coord, GLenum pname, const GLint *params), (coord,pname,params)) \
X(glTexImage1D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels), (target,level,internalformat,width,border,format,type,pixels)) \
X(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels), (target,level,internalformat,width,height,border,format,type,pixels)) \
X(glTexImage3D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels), (target,level,internalformat,width,height,depth,border,format,type,pixels)) \
X(glTexParameterf, void, (GLenum target, GLenum pname, GLfloat param), (target,pname,param)) \
X(glTexParameterfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params)) \
X(glTexParameteri, void, (GLenum target, GLenum pname, GLint param), (target,pname,param)) \
X(glTexParameteriv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params)) \
X(glTexSubImage1D, void, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels), (target,level,xoffset,width,format,type,pixels)) \
X(glTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels), (target,level,xoffset,yoffset,width,height,format,type,pixels)) \
X(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels), (target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)) \
X(glTranslated, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z)) \
X(glTranslatef, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z)) \
X(glValidBackBufferHintAutodesk, GLboolean, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height)) \
X(glVertex2d, void, (GLdouble x, GLdouble y), (x,y)) \
X(glVertex2dv, void, (const GLdouble *v), (v)) \
X(glVertex2f, void, (GLfloat x, GLfloat y), (x,y)) \
X(glVertex2fv, void, (const GLfloat *v), (v)) \
X(glVertex2i, void, (GLint x, GLint y), (x,y)) \
X(glVertex2iv, void, (const GLint *v), (v)) \
X(glVertex2s, void, (GLshort x, GLshort y), (x,y)) \
X(glVertex2sv, void, (const GLshort *v), (v)) \
X(glVertex3d, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z)) \
X(glVertex3dv, void, (const GLdouble *v), (v)) \
X(glVertex3f, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z)) \
X(glVertex3fv, void, (const GLfloat *v), (v)) \
X(glVertex3i, void, (GLint x, GLint y, GLint z), (x,y,z)) \
X(glVertex3iv, void, (const GLint *v), (v)) \
X(glVertex3s, void, (GLshort x, GLshort y, GLshort z), (x,y,z)) \
X(glVertex3sv, void, (const GLshort *v), (v)) \
X(glVertex4d, void, (GLdouble x, GLdouble y, GLdouble z, GLdouble w), (x,y,z,w)) \
X(glVertex4dv, void, (const GLdouble *v), (v)) \
X(glVertex4f, void, (GLfloat x, GLfloat y, GLfloat z, GLfloat w), (x,y,z,w)) \
X(glVertex4fv, void, (const GLfloat *v), (v)) \
X(glVertex4i, void, (GLint x, GLint y, GLint z, GLint w), (x,y,z,w)) \
X(glVertex4iv, void, (const GLint *v), (v)) \
X(glVertex4s, void, (GLshort x, GLshort y, GLshort z, GLshort w), (x,y,z,w)) \
X(glVertex4sv, void, (const GLshort *v), (v)) \
X(glVertexPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer)) \
X(glViewport, void, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height)) \
X(glWindowBackBufferHintAutodesk, void, (void), ()) \
X(glWindowPos2d, void, (GLdouble x, GLdouble y), (x,y)) \
X(glWindowPos2dv, void, (const GLdouble *p), (p)) \
X(glWindowPos2f, void, (GLfloat x, GLfloat y), (x,y)) \
X(glWindowPos2fv, void, (const GLfloat *p), (p)) \
X(glWindowPos2i, void, (GLint x, GLint y), (x,y)) \
X(glWindowPos2iv, void, (const GLint *p), (p)) \
X(glWindowPos2s, void, (GLshort x, GLshort y), (x,y)) \
X(glWindowPos2sv, void, (const GLshort *p), (p)) \
X(glWindowPos3d, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z)) \
X(glWindowPos3dv, void, (const GLdouble *p), (p)) \
X(glWindowPos3f, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z)) \
X(glWindowPos3fv, void, (const GLfloat *p), (p)) \
X(glWindowPos3i, void, (GLint x, GLint y, GLint z), (x,y,z)) \
X(glWindowPos3iv, void, (const GLint *p), (p)) \
X(glWindowPos3s, void, (GLshort x, GLshort y, GLshort z), (x,y,z)) \
X(glWindowPos3sv, void, (const GLshort *p), (p))
X(glAccum, void, (GLenum op, GLfloat value), (op,value), 213, -1, 8) \
X(glAlphaFunc, void, (GLenum func, GLclampf ref), (func,ref), 240, -1, 8) \
X(glAreTexturesResident, GLboolean, (GLsizei n, const GLuint *textures, GLboolean *residences), (n,textures,residences), 322, -1, 12) \
X(glArrayElement, void, (GLint i), (i), 306, 144, 4) \
X(glBegin, void, (GLenum mode), (mode), 7, 2, 4) \
X(glBindTexture, void, (GLenum target, GLuint texture), (target,texture), 307, 145, 8) \
X(glBitmap, void, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap), (width,height,xorig,yorig,xmove,ymove,bitmap), 8, -1, 28) \
X(glBlendFunc, void, (GLenum sfactor, GLenum dfactor), (sfactor,dfactor), 241, -1, 8) \
X(glCallList, void, (GLuint list), (list), 2, 0, 4) \
X(glCallLists, void, (GLsizei n, GLenum type, const GLvoid *lists), (n,type,lists), 3, 1, 12) \
X(glClear, void, (GLbitfield mask), (mask), 203, -1, 4) \
X(glClearAccum, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha), (red,green,blue,alpha), 204, -1, 16) \
X(glClearColor, void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red,green,blue,alpha), 206, -1, 16) \
X(glClearDepth, void, (GLclampd depth), (depth), 208, -1, 8) \
X(glClearIndex, void, (GLfloat c), (c), 205, -1, 4) \
X(glClearStencil, void, (GLint s), (s), 207, -1, 4) \
X(glClipPlane, void, (GLenum plane, const GLdouble *equation), (plane,equation), 150, -1, 8) \
X(glColor3b, void, (GLbyte red, GLbyte green, GLbyte blue), (red,green,blue), 9, 3, 12) \
X(glColor3bv, void, (const GLbyte *v), (v), 10, 4, 4) \
X(glColor3d, void, (GLdouble red, GLdouble green, GLdouble blue), (red,green,blue), 11, 5, 24) \
X(glColor3dv, void, (const GLdouble *v), (v), 12, 6, 4) \
X(glColor3f, void, (GLfloat red, GLfloat green, GLfloat blue), (red,green,blue), 13, 7, 12) \
X(glColor3fv, void, (const GLfloat *v), (v), 14, 8, 4) \
X(glColor3i, void, (GLint red, GLint green, GLint blue), (red,green,blue), 15, 9, 12) \
X(glColor3iv, void, (const GLint *v), (v), 16, 10, 4) \
X(glColor3s, void, (GLshort red, GLshort green, GLshort blue), (red,green,blue), 17, 11, 12) \
X(glColor3sv, void, (const GLshort *v), (v), 18, 12, 4) \
X(glColor3ub, void, (GLubyte red, GLubyte green, GLubyte blue), (red,green,blue), 19, 13, 12) \
X(glColor3ubv, void, (const GLubyte *v), (v), 20, 14, 4) \
X(glColor3ui, void, (GLuint red, GLuint green, GLuint blue), (red,green,blue), 21, 15, 12) \
X(glColor3uiv, void, (const GLuint *v), (v), 22, 16, 4) \
X(glColor3us, void, (GLushort red, GLushort green, GLushort blue), (red,green,blue), 23, 17, 12) \
X(glColor3usv, void, (const GLushort *v), (v), 24, 18, 4) \
X(glColor4b, void, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha), (red,green,blue,alpha), 25, 19, 16) \
X(glColor4bv, void, (const GLbyte *v), (v), 26, 20, 4) \
X(glColor4d, void, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha), (red,green,blue,alpha), 27, 21, 32) \
X(glColor4dv, void, (const GLdouble *v), (v), 28, 22, 4) \
X(glColor4f, void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha), (red,green,blue,alpha), 29, 23, 16) \
X(glColor4fv, void, (const GLfloat *v), (v), 30, 24, 4) \
X(glColor4i, void, (GLint red, GLint green, GLint blue, GLint alpha), (red,green,blue,alpha), 31, 25, 16) \
X(glColor4iv, void, (const GLint *v), (v), 32, 26, 4) \
X(glColor4s, void, (GLshort red, GLshort green, GLshort blue, GLshort alpha), (red,green,blue,alpha), 33, 27, 16) \
X(glColor4sv, void, (const GLshort *v), (v), 34, 28, 4) \
X(glColor4ub, void, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha), (red,green,blue,alpha), 35, 29, 16) \
X(glColor4ubv, void, (const GLubyte *v), (v), 36, 30, 4) \
X(glColor4ui, void, (GLuint red, GLuint green, GLuint blue, GLuint alpha), (red,green,blue,alpha), 37, 31, 16) \
X(glColor4uiv, void, (const GLuint *v), (v), 38, 32, 4) \
X(glColor4us, void, (GLushort red, GLushort green, GLushort blue, GLushort alpha), (red,green,blue,alpha), 39, 33, 16) \
X(glColor4usv, void, (const GLushort *v), (v), 40, 34, 4) \
X(glColorMask, void, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha), (red,green,blue,alpha), 210, -1, 16) \
X(glColorMaterial, void, (GLenum face, GLenum mode), (face,mode), 151, -1, 8) \
X(glColorPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer), 308, 146, 16) \
X(glCopyPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type), (x,y,width,height,type), 255, -1, 20) \
X(glCopyTexImage1D, void, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border), (target,level,internalformat,x,y,width,border), 323, -1, 28) \
X(glCopyTexImage2D, void, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border), (target,level,internalformat,x,y,width,height,border), 324, -1, 32) \
X(glCopyTexSubImage1D, void, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width), (target,level,xoffset,x,y,width), 325, -1, 24) \
X(glCopyTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height), (target,level,xoffset,yoffset,x,y,width,height), 326, -1, 32) \
X(glCullFace, void, (GLenum mode), (mode), 152, -1, 4) \
X(glDeleteLists, void, (GLuint list, GLsizei range), (list,range), 4, -1, 8) \
X(glDeleteTextures, void, (GLsizei n, const GLuint *textures), (n,textures), 327, -1, 8) \
X(glDepthFunc, void, (GLenum func), (func), 245, -1, 4) \
X(glDepthMask, void, (GLboolean flag), (flag), 211, -1, 4) \
X(glDepthRange, void, (GLclampd zNear, GLclampd zFar), (zNear,zFar), 288, -1, 16) \
X(glDisable, void, (GLenum cap), (cap), 214, 116, 4) \
X(glDisableClientState, void, (GLenum array), (array), 309, 147, 4) \
X(glDrawArrays, void, (GLenum mode, GLint first, GLsizei count), (mode,first,count), 310, 148, 12) \
X(glDrawBuffer, void, (GLenum mode), (mode), 202, -1, 4) \
X(glDrawElements, void, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices), (mode,count,type,indices), 311, 149, 16) \
X(glDrawPixels, void, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels), (width,height,format,type,pixels), 257, -1, 20) \
X(glEdgeFlag, void, (GLboolean flag), (flag), 41, 35, 4) \
X(glEdgeFlagPointer, void, (GLsizei stride, const GLboolean *pointer), (stride,pointer), 312, 150, 8) \
X(glEdgeFlagv, void, (const GLboolean *flag), (flag), 42, 36, 4) \
X(glEnable, void, (GLenum cap), (cap), 215, 117, 4) \
X(glEnableClientState, void, (GLenum array), (array), 313, 151, 4) \
X(glEnd, void, (void), (), 43, 37, 0) \
X(glEndList, void, (void), (), 1, -1, 0) \
X(glEvalCoord1d, void, (GLdouble u), (u), 228, 120, 8) \
X(glEvalCoord1dv, void, (const GLdouble *u), (u), 229, 121, 4) \
X(glEvalCoord1f, void, (GLfloat u), (u), 230, 122, 4) \
X(glEvalCoord1fv, void, (const GLfloat *u), (u), 231, 123, 4) \
X(glEvalCoord2d, void, (GLdouble u, GLdouble v), (u,v), 232, 124, 16) \
X(glEvalCoord2dv, void, (const GLdouble *u), (u), 233, 125, 4) \
X(glEvalCoord2f, void, (GLfloat u, GLfloat v), (u,v), 234, 126, 8) \
X(glEvalCoord2fv, void, (const GLfloat *u), (u), 235, 127, 4) \
X(glEvalMesh1, void, (GLenum mode, GLint i1, GLint i2), (mode,i1,i2), 236, -1, 12) \
X(glEvalMesh2, void, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2), (mode,i1,i2,j1,j2), 238, -1, 20) \
X(glEvalPoint1, void, (GLint i), (i), 237, 128, 4) \
X(glEvalPoint2, void, (GLint i, GLint j), (i,j), 239, 129, 8) \
X(glFeedbackBuffer, void, (GLsizei size, GLenum type, GLfloat *buffer), (size,type,buffer), 194, -1, 12) \
X(glFinish, void, (void), (), 216, -1, 0) \
X(glFlush, void, (void), (), 217, -1, 0) \
X(glFogf, void, (GLenum pname, GLfloat param), (pname,param), 153, -1, 8) \
X(glFogfv, void, (GLenum pname, const GLfloat *params), (pname,params), 154, -1, 8) \
X(glFogi, void, (GLenum pname, GLint param), (pname,param), 155, -1, 8) \
X(glFogiv, void, (GLenum pname, const GLint *params), (pname,params), 156, -1, 8) \
X(glFrontFace, void, (GLenum mode), (mode), 157, -1, 4) \
X(glFrustum, void, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar), (left,right,bottom,top,zNear,zFar), 289, -1, 48) \
X(glGenLists, GLuint, (GLsizei range), (range), 5, -1, 4) \
X(glGenTextures, void, (GLsizei n, GLuint *textures), (n,textures), 328, -1, 8) \
X(glGetBooleanv, void, (GLenum pname, GLboolean *params), (pname,params), 258, -1, 8) \
X(glGetClipPlane, void, (GLenum plane, GLdouble *equation), (plane,equation), 259, -1, 8) \
X(glGetDoublev, void, (GLenum pname, GLdouble *params), (pname,params), 260, -1, 8) \
X(glGetError, GLenum, (void), (), 261, -1, 0) \
X(glGetFloatv, void, (GLenum pname, GLfloat *params), (pname,params), 262, -1, 8) \
X(glGetIntegerv, void, (GLenum pname, GLint *params), (pname,params), 263, -1, 8) \
X(glGetLightfv, void, (GLenum light, GLenum pname, GLfloat *params), (light,pname,params), 264, -1, 12) \
X(glGetLightiv, void, (GLenum light, GLenum pname, GLint *params), (light,pname,params), 265, -1, 12) \
X(glGetMapdv, void, (GLenum target, GLenum query, GLdouble *v), (target,query,v), 266, -1, 12) \
X(glGetMapfv, void, (GLenum target, GLenum query, GLfloat *v), (target,query,v), 267, -1, 12) \
X(glGetMapiv, void, (GLenum target, GLenum query, GLint *v), (target,query,v), 268, -1, 12) \
X(glGetMaterialfv, void, (GLenum face, GLenum pname, GLfloat *params), (face,pname,params), 269, -1, 12) \
X(glGetMaterialiv, void, (GLenum face, GLenum pname, GLint *params), (face,pname,params), 270, -1, 12) \
X(glGetPixelMapfv, void, (GLenum map, GLfloat *values), (map,values), 271, -1, 8) \
X(glGetPixelMapuiv, void, (GLenum map, GLuint *values), (map,values), 272, -1, 8) \
X(glGetPixelMapusv, void, (GLenum map, GLushort *values), (map,values), 273, -1, 8) \
X(glGetPointerv, void, (GLenum pname, GLvoid* *params), (pname,params), 329, 160, 8) \
X(glGetPolygonStipple, void, (GLubyte *mask), (mask), 274, -1, 4) \
X(glGetString, const GLubyte *, (GLenum name), (name), 275, -1, 4) \
X(glGetTexEnvfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params), 276, -1, 12) \
X(glGetTexEnviv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params), 277, -1, 12) \
X(glGetTexGendv, void, (GLenum coord, GLenum pname, GLdouble *params), (coord,pname,params), 278, -1, 12) \
X(glGetTexGenfv, void, (GLenum coord, GLenum pname, GLfloat *params), (coord,pname,params), 279, -1, 12) \
X(glGetTexGeniv, void, (GLenum coord, GLenum pname, GLint *params), (coord,pname,params), 280, -1, 12) \
X(glGetTexImage, void, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels), (target,level,format,type,pixels), 281, -1, 20) \
X(glGetTexLevelParameterfv, void, (GLenum target, GLint level, GLenum pname, GLfloat *params), (target,level,pname,params), 284, -1, 16) \
X(glGetTexLevelParameteriv, void, (GLenum target, GLint level, GLenum pname, GLint *params), (target,level,pname,params), 285, -1, 16) \
X(glGetTexParameterfv, void, (GLenum target, GLenum pname, GLfloat *params), (target,pname,params), 282, -1, 12) \
X(glGetTexParameteriv, void, (GLenum target, GLenum pname, GLint *params), (target,pname,params), 283, -1, 12) \
X(glHint, void, (GLenum target, GLenum mode), (target,mode), 158, -1, 8) \
X(glIndexMask, void, (GLuint mask), (mask), 212, -1, 4) \
X(glIndexPointer, void, (GLenum type, GLsizei stride, const GLvoid *pointer), (type,stride,pointer), 314, 152, 12) \
X(glIndexd, void, (GLdouble c), (c), 44, 38, 8) \
X(glIndexdv, void, (const GLdouble *c), (c), 45, 39, 4) \
X(glIndexf, void, (GLfloat c), (c), 46, 40, 4) \
X(glIndexfv, void, (const GLfloat *c), (c), 47, 41, 4) \
X(glIndexi, void, (GLint c), (c), 48, 42, 4) \
X(glIndexiv, void, (const GLint *c), (c), 49, 43, 4) \
X(glIndexs, void, (GLshort c), (c), 50, 44, 4) \
X(glIndexsv, void, (const GLshort *c), (c), 51, 45, 4) \
X(glIndexub, void, (GLubyte c), (c), 315, 153, 4) \
X(glIndexubv, void, (const GLubyte *c), (c), 316, 154, 4) \
X(glInitNames, void, (void), (), 197, -1, 0) \
X(glInterleavedArrays, void, (GLenum format, GLsizei stride, const GLvoid *pointer), (format,stride,pointer), 317, 155, 12) \
X(glIsEnabled, GLboolean, (GLenum cap), (cap), 286, -1, 4) \
X(glIsList, GLboolean, (GLuint list), (list), 287, -1, 4) \
X(glIsTexture, GLboolean, (GLuint texture), (texture), 330, -1, 4) \
X(glLightModelf, void, (GLenum pname, GLfloat param), (pname,param), 163, -1, 8) \
X(glLightModelfv, void, (GLenum pname, const GLfloat *params), (pname,params), 164, -1, 8) \
X(glLightModeli, void, (GLenum pname, GLint param), (pname,param), 165, -1, 8) \
X(glLightModeliv, void, (GLenum pname, const GLint *params), (pname,params), 166, -1, 8) \
X(glLightf, void, (GLenum light, GLenum pname, GLfloat param), (light,pname,param), 159, -1, 12) \
X(glLightfv, void, (GLenum light, GLenum pname, const GLfloat *params), (light,pname,params), 160, -1, 12) \
X(glLighti, void, (GLenum light, GLenum pname, GLint param), (light,pname,param), 161, -1, 12) \
X(glLightiv, void, (GLenum light, GLenum pname, const GLint *params), (light,pname,params), 162, -1, 12) \
X(glLineStipple, void, (GLint factor, GLushort pattern), (factor,pattern), 167, -1, 8) \
X(glLineWidth, void, (GLfloat width), (width), 168, -1, 4) \
X(glListBase, void, (GLuint base), (base), 6, -1, 4) \
X(glLoadIdentity, void, (void), (), 290, 130, 0) \
X(glLoadMatrixd, void, (const GLdouble *m), (m), 292, 132, 4) \
X(glLoadMatrixf, void, (const GLfloat *m), (m), 291, 131, 4) \
X(glLoadName, void, (GLuint name), (name), 198, -1, 4) \
X(glLogicOp, void, (GLenum opcode), (opcode), 242, -1, 4) \
X(glMap1d, void, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points), (target,u1,u2,stride,order,points), 220, -1, 32) \
X(glMap1f, void, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points), (target,u1,u2,stride,order,points), 221, -1, 24) \
X(glMap2d, void, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points), (target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,points), 222, -1, 56) \
X(glMap2f, void, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points), (target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,points), 223, -1, 40) \
X(glMapGrid1d, void, (GLint un, GLdouble u1, GLdouble u2), (un,u1,u2), 224, -1, 20) \
X(glMapGrid1f, void, (GLint un, GLfloat u1, GLfloat u2), (un,u1,u2), 225, -1, 12) \
X(glMapGrid2d, void, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2), (un,u1,u2,vn,v1,v2), 226, -1, 40) \
X(glMapGrid2f, void, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2), (un,u1,u2,vn,v1,v2), 227, -1, 24) \
X(glMaterialf, void, (GLenum face, GLenum pname, GLfloat param), (face,pname,param), 169, 112, 12) \
X(glMaterialfv, void, (GLenum face, GLenum pname, const GLfloat *params), (face,pname,params), 170, 113, 12) \
X(glMateriali, void, (GLenum face, GLenum pname, GLint param), (face,pname,param), 171, 114, 12) \
X(glMaterialiv, void, (GLenum face, GLenum pname, const GLint *params), (face,pname,params), 172, 115, 12) \
X(glMatrixMode, void, (GLenum mode), (mode), 293, 133, 4) \
X(glMultMatrixd, void, (const GLdouble *m), (m), 295, 135, 4) \
X(glMultMatrixf, void, (const GLfloat *m), (m), 294, 134, 4) \
X(glNewList, void, (GLuint list, GLenum mode), (list,mode), 0, -1, 8) \
X(glNormal3b, void, (GLbyte nx, GLbyte ny, GLbyte nz), (nx,ny,nz), 52, 46, 12) \
X(glNormal3bv, void, (const GLbyte *v), (v), 53, 47, 4) \
X(glNormal3d, void, (GLdouble nx, GLdouble ny, GLdouble nz), (nx,ny,nz), 54, 48, 24) \
X(glNormal3dv, void, (const GLdouble *v), (v), 55, 49, 4) \
X(glNormal3f, void, (GLfloat nx, GLfloat ny, GLfloat nz), (nx,ny,nz), 56, 50, 12) \
X(glNormal3fv, void, (const GLfloat *v), (v), 57, 51, 4) \
X(glNormal3i, void, (GLint nx, GLint ny, GLint nz), (nx,ny,nz), 58, 52, 12) \
X(glNormal3iv, void, (const GLint *v), (v), 59, 53, 4) \
X(glNormal3s, void, (GLshort nx, GLshort ny, GLshort nz), (nx,ny,nz), 60, 54, 12) \
X(glNormal3sv, void, (const GLshort *v), (v), 61, 55, 4) \
X(glNormalPointer, void, (GLenum type, GLsizei stride, const GLvoid *pointer), (type,stride,pointer), 318, 156, 12) \
X(glOrtho, void, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar), (left,right,bottom,top,zNear,zFar), 296, -1, 48) \
X(glPassThrough, void, (GLfloat token), (token), 199, -1, 4) \
X(glPixelMapfv, void, (GLenum map, GLint mapsize, const GLfloat *values), (map,mapsize,values), 251, -1, 12) \
X(glPixelMapuiv, void, (GLenum map, GLint mapsize, const GLuint *values), (map,mapsize,values), 252, -1, 12) \
X(glPixelMapusv, void, (GLenum map, GLint mapsize, const GLushort *values), (map,mapsize,values), 253, -1, 12) \
X(glPixelStoref, void, (GLenum pname, GLfloat param), (pname,param), 249, -1, 8) \
X(glPixelStorei, void, (GLenum pname, GLint param), (pname,param), 250, -1, 8) \
X(glPixelTransferf, void, (GLenum pname, GLfloat param), (pname,param), 247, -1, 8) \
X(glPixelTransferi, void, (GLenum pname, GLint param), (pname,param), 248, -1, 8) \
X(glPixelZoom, void, (GLfloat xfactor, GLfloat yfactor), (xfactor,yfactor), 246, -1, 8) \
X(glPointSize, void, (GLfloat size), (size), 173, -1, 4) \
X(glPolygonMode, void, (GLenum face, GLenum mode), (face,mode), 174, -1, 8) \
X(glPolygonOffset, void, (GLfloat factor, GLfloat units), (factor,units), 319, 157, 8) \
X(glPolygonStipple, void, (const GLubyte *mask), (mask), 175, -1, 4) \
X(glPopAttrib, void, (void), (), 218, 118, 0) \
X(glPopClientAttrib, void, (void), (), 334, 161, 0) \
X(glPopMatrix, void, (void), (), 297, 136, 0) \
X(glPopName, void, (void), (), 200, -1, 0) \
X(glPrioritizeTextures, void, (GLsizei n, const GLuint *textures, const GLclampf *priorities), (n,textures,priorities), 331, -1, 12) \
X(glPushAttrib, void, (GLbitfield mask), (mask), 219, 119, 4) \
X(glPushClientAttrib, void, (GLbitfield mask), (mask), 335, 162, 4) \
X(glPushMatrix, void, (void), (), 298, 137, 0) \
X(glPushName, void, (GLuint name), (name), 201, -1, 4) \
X(glRasterPos2d, void, (GLdouble x, GLdouble y), (x,y), 62, -1, 16) \
X(glRasterPos2dv, void, (const GLdouble *v), (v), 63, -1, 4) \
X(glRasterPos2f, void, (GLfloat x, GLfloat y), (x,y), 64, -1, 8) \
X(glRasterPos2fv, void, (const GLfloat *v), (v), 65, -1, 4) \
X(glRasterPos2i, void, (GLint x, GLint y), (x,y), 66, -1, 8) \
X(glRasterPos2iv, void, (const GLint *v), (v), 67, -1, 4) \
X(glRasterPos2s, void, (GLshort x, GLshort y), (x,y), 68, -1, 8) \
X(glRasterPos2sv, void, (const GLshort *v), (v), 69, -1, 4) \
X(glRasterPos3d, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z), 70, -1, 24) \
X(glRasterPos3dv, void, (const GLdouble *v), (v), 71, -1, 4) \
X(glRasterPos3f, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z), 72, -1, 12) \
X(glRasterPos3fv, void, (const GLfloat *v), (v), 73, -1, 4) \
X(glRasterPos3i, void, (GLint x, GLint y, GLint z), (x,y,z), 74, -1, 12) \
X(glRasterPos3iv, void, (const GLint *v), (v), 75, -1, 4) \
X(glRasterPos3s, void, (GLshort x, GLshort y, GLshort z), (x,y,z), 76, -1, 12) \
X(glRasterPos3sv, void, (const GLshort *v), (v), 77, -1, 4) \
X(glRasterPos4d, void, (GLdouble x, GLdouble y, GLdouble z, GLdouble w), (x,y,z,w), 78, -1, 32) \
X(glRasterPos4dv, void, (const GLdouble *v), (v), 79, -1, 4) \
X(glRasterPos4f, void, (GLfloat x, GLfloat y, GLfloat z, GLfloat w), (x,y,z,w), 80, -1, 16) \
X(glRasterPos4fv, void, (const GLfloat *v), (v), 81, -1, 4) \
X(glRasterPos4i, void, (GLint x, GLint y, GLint z, GLint w), (x,y,z,w), 82, -1, 16) \
X(glRasterPos4iv, void, (const GLint *v), (v), 83, -1, 4) \
X(glRasterPos4s, void, (GLshort x, GLshort y, GLshort z, GLshort w), (x,y,z,w), 84, -1, 16) \
X(glRasterPos4sv, void, (const GLshort *v), (v), 85, -1, 4) \
X(glReadBuffer, void, (GLenum mode), (mode), 254, -1, 4) \
X(glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels), (x,y,width,height,format,type,pixels), 256, -1, 28) \
X(glRectd, void, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2), (x1,y1,x2,y2), 86, -1, 32) \
X(glRectdv, void, (const GLdouble *v1, const GLdouble *v2), (v1,v2), 87, -1, 8) \
X(glRectf, void, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2), (x1,y1,x2,y2), 88, -1, 16) \
X(glRectfv, void, (const GLfloat *v1, const GLfloat *v2), (v1,v2), 89, -1, 8) \
X(glRecti, void, (GLint x1, GLint y1, GLint x2, GLint y2), (x1,y1,x2,y2), 90, -1, 16) \
X(glRectiv, void, (const GLint *v1, const GLint *v2), (v1,v2), 91, -1, 8) \
X(glRects, void, (GLshort x1, GLshort y1, GLshort x2, GLshort y2), (x1,y1,x2,y2), 92, -1, 16) \
X(glRectsv, void, (const GLshort *v1, const GLshort *v2), (v1,v2), 93, -1, 8) \
X(glRenderMode, GLint, (GLenum mode), (mode), 196, -1, 4) \
X(glRotated, void, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z), (angle,x,y,z), 299, 138, 32) \
X(glRotatef, void, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z), (angle,x,y,z), 300, 139, 16) \
X(glScaled, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z), 301, 140, 24) \
X(glScalef, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z), 302, 141, 12) \
X(glScissor, void, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height), 176, -1, 16) \
X(glSelectBuffer, void, (GLsizei size, GLuint *buffer), (size,buffer), 195, -1, 8) \
X(glShadeModel, void, (GLenum mode), (mode), 177, -1, 4) \
X(glStencilFunc, void, (GLenum func, GLint ref, GLuint mask), (func,ref,mask), 243, -1, 12) \
X(glStencilMask, void, (GLuint mask), (mask), 209, -1, 4) \
X(glStencilOp, void, (GLenum fail, GLenum zfail, GLenum zpass), (fail,zfail,zpass), 244, -1, 12) \
X(glTexCoord1d, void, (GLdouble s), (s), 94, 56, 8) \
X(glTexCoord1dv, void, (const GLdouble *v), (v), 95, 57, 4) \
X(glTexCoord1f, void, (GLfloat s), (s), 96, 58, 4) \
X(glTexCoord1fv, void, (const GLfloat *v), (v), 97, 59, 4) \
X(glTexCoord1i, void, (GLint s), (s), 98, 60, 4) \
X(glTexCoord1iv, void, (const GLint *v), (v), 99, 61, 4) \
X(glTexCoord1s, void, (GLshort s), (s), 100, 62, 4) \
X(glTexCoord1sv, void, (const GLshort *v), (v), 101, 63, 4) \
X(glTexCoord2d, void, (GLdouble s, GLdouble t), (s,t), 102, 64, 16) \
X(glTexCoord2dv, void, (const GLdouble *v), (v), 103, 65, 4) \
X(glTexCoord2f, void, (GLfloat s, GLfloat t), (s,t), 104, 66, 8) \
X(glTexCoord2fv, void, (const GLfloat *v), (v), 105, 67, 4) \
X(glTexCoord2i, void, (GLint s, GLint t), (s,t), 106, 68, 8) \
X(glTexCoord2iv, void, (const GLint *v), (v), 107, 69, 4) \
X(glTexCoord2s, void, (GLshort s, GLshort t), (s,t), 108, 70, 8) \
X(glTexCoord2sv, void, (const GLshort *v), (v), 109, 71, 4) \
X(glTexCoord3d, void, (GLdouble s, GLdouble t, GLdouble r), (s,t,r), 110, 72, 24) \
X(glTexCoord3dv, void, (const GLdouble *v), (v), 111, 73, 4) \
X(glTexCoord3f, void, (GLfloat s, GLfloat t, GLfloat r), (s,t,r), 112, 74, 12) \
X(glTexCoord3fv, void, (const GLfloat *v), (v), 113, 75, 4) \
X(glTexCoord3i, void, (GLint s, GLint t, GLint r), (s,t,r), 114, 76, 12) \
X(glTexCoord3iv, void, (const GLint *v), (v), 115, 77, 4) \
X(glTexCoord3s, void, (GLshort s, GLshort t, GLshort r), (s,t,r), 116, 78, 12) \
X(glTexCoord3sv, void, (const GLshort *v), (v), 117, 79, 4) \
X(glTexCoord4d, void, (GLdouble s, GLdouble t, GLdouble r, GLdouble q), (s,t,r,q), 118, 80, 32) \
X(glTexCoord4dv, void, (const GLdouble *v), (v), 119, 81, 4) \
X(glTexCoord4f, void, (GLfloat s, GLfloat t, GLfloat r, GLfloat q), (s,t,r,q), 120, 82, 16) \
X(glTexCoord4fv, void, (const GLfloat *v), (v), 121, 83, 4) \
X(glTexCoord4i, void, (GLint s, GLint t, GLint r, GLint q), (s,t,r,q), 122, 84, 16) \
X(glTexCoord4iv, void, (const GLint *v), (v), 123, 85, 4) \
X(glTexCoord4s, void, (GLshort s, GLshort t, GLshort r, GLshort q), (s,t,r,q), 124, 86, 16) \
X(glTexCoord4sv, void, (const GLshort *v), (v), 125, 87, 4) \
X(glTexCoordPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer), 320, 158, 16) \
X(glTexEnvf, void, (GLenum target, GLenum pname, GLfloat param), (target,pname,param), 184, -1, 12) \
X(glTexEnvfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params), 185, -1, 12) \
X(glTexEnvi, void, (GLenum target, GLenum pname, GLint param), (target,pname,param), 186, -1, 12) \
X(glTexEnviv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params), 187, -1, 12) \
X(glTexGend, void, (GLenum coord, GLenum pname, GLdouble param), (coord,pname,param), 188, -1, 16) \
X(glTexGendv, void, (GLenum coord, GLenum pname, const GLdouble *params), (coord,pname,params), 189, -1, 12) \
X(glTexGenf, void, (GLenum coord, GLenum pname, GLfloat param), (coord,pname,param), 190, -1, 12) \
X(glTexGenfv, void, (GLenum coord, GLenum pname, const GLfloat *params), (coord,pname,params), 191, -1, 12) \
X(glTexGeni, void, (GLenum coord, GLenum pname, GLint param), (coord,pname,param), 192, -1, 12) \
X(glTexGeniv, void, (GLenum coord, GLenum pname, const GLint *params), (coord,pname,params), 193, -1, 12) \
X(glTexImage1D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels), (target,level,internalformat,width,border,format,type,pixels), 182, -1, 32) \
X(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels), (target,level,internalformat,width,height,border,format,type,pixels), 183, -1, 36) \
X(glTexParameterf, void, (GLenum target, GLenum pname, GLfloat param), (target,pname,param), 178, -1, 12) \
X(glTexParameterfv, void, (GLenum target, GLenum pname, const GLfloat *params), (target,pname,params), 179, -1, 12) \
X(glTexParameteri, void, (GLenum target, GLenum pname, GLint param), (target,pname,param), 180, -1, 12) \
X(glTexParameteriv, void, (GLenum target, GLenum pname, const GLint *params), (target,pname,params), 181, -1, 12) \
X(glTexSubImage1D, void, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels), (target,level,xoffset,width,format,type,pixels), 332, -1, 28) \
X(glTexSubImage2D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels), (target,level,xoffset,yoffset,width,height,format,type,pixels), 333, -1, 36) \
X(glTranslated, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z), 303, 142, 24) \
X(glTranslatef, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z), 304, 143, 12) \
X(glVertex2d, void, (GLdouble x, GLdouble y), (x,y), 126, 88, 16) \
X(glVertex2dv, void, (const GLdouble *v), (v), 127, 89, 4) \
X(glVertex2f, void, (GLfloat x, GLfloat y), (x,y), 128, 90, 8) \
X(glVertex2fv, void, (const GLfloat *v), (v), 129, 91, 4) \
X(glVertex2i, void, (GLint x, GLint y), (x,y), 130, 92, 8) \
X(glVertex2iv, void, (const GLint *v), (v), 131, 93, 4) \
X(glVertex2s, void, (GLshort x, GLshort y), (x,y), 132, 94, 8) \
X(glVertex2sv, void, (const GLshort *v), (v), 133, 95, 4) \
X(glVertex3d, void, (GLdouble x, GLdouble y, GLdouble z), (x,y,z), 134, 96, 24) \
X(glVertex3dv, void, (const GLdouble *v), (v), 135, 97, 4) \
X(glVertex3f, void, (GLfloat x, GLfloat y, GLfloat z), (x,y,z), 136, 98, 12) \
X(glVertex3fv, void, (const GLfloat *v), (v), 137, 99, 4) \
X(glVertex3i, void, (GLint x, GLint y, GLint z), (x,y,z), 138, 100, 12) \
X(glVertex3iv, void, (const GLint *v), (v), 139, 101, 4) \
X(glVertex3s, void, (GLshort x, GLshort y, GLshort z), (x,y,z), 140, 102, 12) \
X(glVertex3sv, void, (const GLshort *v), (v), 141, 103, 4) \
X(glVertex4d, void, (GLdouble x, GLdouble y, GLdouble z, GLdouble w), (x,y,z,w), 142, 104, 32) \
X(glVertex4dv, void, (const GLdouble *v), (v), 143, 105, 4) \
X(glVertex4f, void, (GLfloat x, GLfloat y, GLfloat z, GLfloat w), (x,y,z,w), 144, 106, 16) \
X(glVertex4fv, void, (const GLfloat *v), (v), 145, 107, 4) \
X(glVertex4i, void, (GLint x, GLint y, GLint z, GLint w), (x,y,z,w), 146, 108, 16) \
X(glVertex4iv, void, (const GLint *v), (v), 147, 109, 4) \
X(glVertex4s, void, (GLshort x, GLshort y, GLshort z, GLshort w), (x,y,z,w), 148, 110, 16) \
X(glVertex4sv, void, (const GLshort *v), (v), 149, 111, 4) \
X(glVertexPointer, void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size,type,stride,pointer), 321, 159, 16) \
X(glViewport, void, (GLint x, GLint y, GLsizei width, GLsizei height), (x,y,width,height), 305, -1, 16) \
/* EOF */

View file

@ -1,4 +1,4 @@
// icdtable.h
/* icdtable.h */
#ifndef OPENGL32_PRIVATE_ICDTABLE_H
#define OPENGL32_PRIVATE_ICDTABLE_H
@ -12,10 +12,12 @@ enum icdoffsets_e
ICDIDX_COUNT
};
struct ICDTable
typedef struct tagICDTable
{
DWORD num_funcs; // Normally 336 (0x150)
DWORD num_funcs; /* Normally 336 (0x150) */
PROC dispatch_table[812];
};
} ICDTable;
#endif//OPENGL32_PRIVATE_ICDTABLE_H
#endif /* OPENGL32_PRIVATE_ICDTABLE_H */
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: opengl32.c,v 1.9 2004/02/05 04:28:11 royce Exp $
/* $Id: opengl32.c,v 1.10 2004/02/06 13:59:13 royce Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -12,9 +12,10 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winreg.h>
#include <ntos/types.h>
#include <napi/teb.h>
#include <string.h>
//#include <GL/gl.h>
#include "opengl32.h"
/* function prototypes */
@ -26,12 +27,12 @@ static DWORD OPENGL32_InitializeDriver( GLDRIVERDATA *icd );
static BOOL OPENGL32_UnloadDriver( GLDRIVERDATA *icd );
/* global vars */
const char* OPENGL32_funcnames[GLIDX_COUNT] SHARED =
/*const char* OPENGL32_funcnames[GLIDX_COUNT] SHARED =
{
#define X(func, ret, typeargs, args) #func,
GLFUNCS_MACRO
#undef X
};
};*/
DWORD OPENGL32_tls;
GLPROCESSDATA OPENGL32_processdata;
@ -54,9 +55,11 @@ static void OPENGL32_ThreadDetach()
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
{
GLTHREADDATA* lpData = NULL;
SECURITY_ATTRIBUTES attrib = { .nLength = sizeof (SECURITY_ATTRIBUTES),
.lpSecurityDescriptor = NULL,
.bInheritHandle = TRUE };
ICDTable *dispatchTable = NULL;
TEB *teb = NULL;
SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */
NULL, /* lpSecurityDescriptor */
TRUE /* bInheritHandle */ };
DBGPRINT( "Info: Called!" );
switch ( Reason )
@ -92,15 +95,36 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
/* The attached process creates a new thread. */
case DLL_THREAD_ATTACH:
//lpData = (GLTHREADDATA*)LocalAlloc(LPTR, sizeof(GLTHREADDATA));
dispatchTable = (ICDTable*)HeapAlloc( GetProcessHeap(),
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY,
sizeof (ICDTable) );
if (dispatchTable == NULL)
{
DBGPRINT( "Error: Couldn't allocate GL dispatch table" );
return FALSE;
}
lpData = (GLTHREADDATA*)HeapAlloc( GetProcessHeap(),
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY,
sizeof (GLTHREADDATA) );
if (lpData == NULL)
{
DBGPRINT( "Error: Couldn't allocate GLTHREADDATA" );
HeapFree( GetProcessHeap(), 0, dispatchTable );
return FALSE;
}
teb = NtCurrentTeb();
/* initialize dispatch table with empty functions */
#define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
dispatchTable->dispatch_table[icdidx] = (PROC)glEmptyFunc##stack; \
if (tebidx >= 0) \
teb->glDispatchTable[tebidx] = (PVOID)glEmptyFunc##stack;
GLFUNCS_MACRO
#undef X
teb->glTable = dispatchTable->dispatch_table;
TlsSetValue( OPENGL32_tls, lpData );
break;
@ -126,17 +150,10 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
/* FUNCTION: Append ICD to linked list.
* ARGUMENTS: [IN] icd: GLDRIVERDATA to append to list
* NOTES: Only call this when you hold the driver_mutex
*/
static void OPENGL32_AppendICD( GLDRIVERDATA *icd )
{
/* synchronize */
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
WAIT_FAILED)
{
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
return; /* FIXME: do we have to expect such an error and handle it? */
}
if (OPENGL32_processdata.driver_list == NULL)
OPENGL32_processdata.driver_list = icd;
else
@ -146,26 +163,15 @@ static void OPENGL32_AppendICD( GLDRIVERDATA *icd )
p = p->next;
p->next = icd;
}
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
}
/* FUNCTION: Remove ICD from linked list.
* ARGUMENTS: [IN] icd: GLDRIVERDATA to remove from list
* NOTES: Only call this when you hold the driver_mutex
*/
static void OPENGL32_RemoveICD( GLDRIVERDATA *icd )
{
/* synchronize */
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
WAIT_FAILED)
{
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
return; /* FIXME: do we have to expect such an error and handle it? */
}
if (icd == OPENGL32_processdata.driver_list)
OPENGL32_processdata.driver_list = icd->next;
else
@ -182,10 +188,6 @@ static void OPENGL32_RemoveICD( GLDRIVERDATA *icd )
}
DBGPRINT( "Error: ICD 0x%08x not found in list!", icd );
}
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
}
@ -224,7 +226,7 @@ static GLDRIVERDATA *OPENGL32_LoadDriver( LPCWSTR driver )
DBGPRINT( "Info: Dll = %ws", icd->dll );
DBGPRINT( "Info: Version = 0x%08x", icd->version );
DBGPRINT( "Info: DriverVersion = 0x%08x", icd->driverVersion );
DBGPRINT( "Info: DriverVersion = 0x%08x", icd->driver_version );
DBGPRINT( "Info: Flags = 0x%08x", icd->flags );
/* load/initialize ICD */
@ -363,12 +365,25 @@ GLDRIVERDATA *OPENGL32_LoadICD ( LPCWSTR driver )
{
GLDRIVERDATA *icd;
/* synchronize */
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
WAIT_FAILED)
{
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
return NULL; /* FIXME: do we have to expect such an error and handle it? */
}
/* look if ICD is already loaded */
for (icd = OPENGL32_processdata.driver_list; icd; icd = icd->next)
{
if (!_wcsicmp( driver, icd->driver_name )) /* found */
{
icd->refcount++;
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
return icd;
}
}
@ -377,6 +392,11 @@ GLDRIVERDATA *OPENGL32_LoadICD ( LPCWSTR driver )
icd = OPENGL32_LoadDriver( driver );
if (icd != NULL)
icd->refcount = 1;
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
return icd;
}
@ -386,11 +406,25 @@ GLDRIVERDATA *OPENGL32_LoadICD ( LPCWSTR driver )
*/
BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd )
{
BOOL ret = TRUE;
/* synchronize */
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
WAIT_FAILED)
{
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
return FALSE; /* FIXME: do we have to expect such an error and handle it? */
}
icd->refcount--;
if (icd->refcount == 0)
return OPENGL32_UnloadDriver( icd );
ret = OPENGL32_UnloadDriver( icd );
return TRUE;
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
return ret;
}

View file

@ -1,4 +1,4 @@
/* $Id: opengl32.h,v 1.8 2004/02/05 04:28:11 royce Exp $
/* $Id: opengl32.h,v 1.9 2004/02/06 13:59:13 royce Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -12,6 +12,12 @@
#ifndef OPENGL32_PRIVATE_H
#define OPENGL32_PRIVATE_H
/* gl function list */
#include "glfuncs.h"
/* ICD index list/types */
#include "icdtable.h"
/* debug flags */
#if !defined(NDEBUG)
# define DEBUG_OPENGL32
@ -21,7 +27,8 @@
#endif /* !NDEBUG */
/* debug macros */
#if 0//def DEBUG_OPENGL32 /* FIXME: DPRINT wants DbgPrint - where is it? */
#ifdef DEBUG_OPENGL32 /* FIXME: DPRINT wants DbgPrint - where is it? */
ULONG DbgPrint(PCH Format,...);
# include <debug.h>
# define DBGPRINT( fmt, args... ) \
DPRINT( "OpenGL32.DLL: %s: "fmt"\n", __FUNCTION__, ##args )
@ -39,14 +46,7 @@
# endif
#endif
/* function/data attributes */
#define EXPORT __declspec(dllexport)
#define NAKED __attribute__((naked))
#define SHARED __attribute__((section("shared"), shared))
/* gl function list */
#include "glfuncs.h"
#if 0
/* table indices for funcnames and function pointers */
enum glfunc_indices
{
@ -59,9 +59,10 @@ enum glfunc_indices
/* function name table */
extern const char* OPENGL32_funcnames[GLIDX_COUNT];
#endif
/* FIXME: what type of argument does this take? */
typedef DWORD (CALLBACK * SetContextCallBack) (void *);
/* Called by the driver to set the dispatch table */
typedef DWORD (CALLBACK * SetContextCallBack)( const ICDTable * );
/* OpenGL ICD data */
typedef struct tagGLDRIVERDATA
@ -93,12 +94,10 @@ typedef struct tagGLDRIVERDATA
BOOL (*DrvSwapLayerBuffers)( HDC, UINT );
BOOL (*DrvValidateVersion)( DWORD );
PVOID func_list[GLIDX_COUNT]; /* glXXX functions supported by ICD */
struct tagGLDRIVERDATA *next; /* next ICD -- linked list */
} GLDRIVERDATA;
/* OpenGL context */
/* Out private OpenGL context (saved in TLS) */
typedef struct tagGLRC
{
GLDRIVERDATA *icd; /* driver used for this context */
@ -108,7 +107,6 @@ typedef struct tagGLRC
DWORD thread_id; /* thread holding this context */
HGLRC hglrc; /* GLRC from DrvCreateContext */
PVOID func_list[GLIDX_COUNT]; /* glXXX function pointers */
struct tagGLRC *next; /* linked list */
} GLRC;
@ -138,6 +136,29 @@ BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd );
DWORD OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName );
DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd );
/* empty gl functions from gl.c */
void STDCALL glEmptyFunc0();
void STDCALL glEmptyFunc4( long );
void STDCALL glEmptyFunc8( long, long );
void STDCALL glEmptyFunc12( long, long, long );
void STDCALL glEmptyFunc16( long, long, long, long );
void STDCALL glEmptyFunc20( long, long, long, long, long );
void STDCALL glEmptyFunc24( long, long, long, long, long, long );
void STDCALL glEmptyFunc28( long, long, long, long, long, long, long );
void STDCALL glEmptyFunc32( long, long, long, long, long, long, long, long );
void STDCALL glEmptyFunc36( long, long, long, long, long, long, long, long,
long );
void STDCALL glEmptyFunc40( long, long, long, long, long, long, long, long,
long, long );
void STDCALL glEmptyFunc44( long, long, long, long, long, long, long, long,
long, long, long );
void STDCALL glEmptyFunc48( long, long, long, long, long, long, long, long,
long, long, long, long );
void STDCALL glEmptyFunc52( long, long, long, long, long, long, long, long,
long, long, long, long, long );
void STDCALL glEmptyFunc56( long, long, long, long, long, long, long, long,
long, long, long, long, long, long );
#endif//OPENGL32_PRIVATE_H
/* EOF */

View file

@ -10,6 +10,8 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ntos/types.h>
#include <napi/teb.h>
#include "opengl32.h"
@ -83,8 +85,17 @@ static void WGL_RemoveContext( GLRC *glrc )
*/
static BOOL WGL_ContainsContext( GLRC *glrc )
{
GLRC *p = OPENGL32_processdata.glrc_list;
GLRC *p;
/* synchronize */
if (WaitForSingleObject( OPENGL32_processdata.glrc_mutex, INFINITE ) ==
WAIT_FAILED)
{
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
return FALSE; /* FIXME: do we have to expect such an error and handle it? */
}
p = OPENGL32_processdata.glrc_list;
while (p != NULL)
{
if (p == glrc)
@ -92,6 +103,10 @@ static BOOL WGL_ContainsContext( GLRC *glrc )
p = p->next;
}
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.glrc_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
return FALSE;
}
@ -103,14 +118,65 @@ static BOOL WGL_ContainsContext( GLRC *glrc )
* functions)
* RETURNS: unkown
*/
DWORD CALLBACK WGL_SetContextCallBack( void *table )
DWORD CALLBACK WGL_SetContextCallBack( const ICDTable *table )
{
DBGPRINT( "Function count: %d\n", *(DWORD *)table );
DBGBREAK();
/* UINT i;*/
TEB *teb;
PROC *tebTable, *tebDispatchTable;
teb = NtCurrentTeb();
tebTable = (PROC *)teb->glTable;
tebDispatchTable = (PROC *)teb->glDispatchTable;
DBGPRINT( "Function count: %d\n", table->num_funcs );
/* save table */
memcpy( tebTable, table->dispatch_table,
sizeof (PROC) * table->num_funcs );
memset( tebTable + sizeof (PROC) * table->num_funcs, 0,
(sizeof (table->dispatch_table) / sizeof (PROC)) -
(sizeof (PROC) * table->num_funcs) );
/* FIXME: pull in software fallbacks -- need mesa */
#if 0 /* unused atm */
for (i = 0; i < (sizeof (table->dispatch_table) / sizeof (PROC)); i++)
{
if (tebTable[i] == NULL)
{
/* FIXME: fallback */
DBGPRINT( "Warning: GL proc #%d is NULL!", i );
}
}
#endif
/* put in empty functions as long as we dont have a fallback */
#define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
if (tebTable[icdidx] == NULL) \
{ \
DBGPRINT( "Warning: GL proc '%s' is NULL", #func ); \
tebTable[icdidx] = (PROC)glEmptyFunc##stack; \
}
GLFUNCS_MACRO
#undef X
/* fill teb->glDispatchTable for fast calls */
#define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
if (tebidx >= 0) \
tebDispatchTable[tebidx] = tebTable[icdidx];
GLFUNCS_MACRO
#undef X
return ERROR_SUCCESS;
}
int WINAPI wglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd )
{
UNIMPLEMENTED;
return 0;
}
/* FUNCTION: Copy data specified by mask from one GLRC to another.
* ARGUMENTS: [IN] src Source GLRC
* [OUT] dst Destination GLRC
@ -168,7 +234,7 @@ HGLRC WINAPI wglCreateLayerContext( HDC hdc, int layer )
WCHAR driver[256];
DWORD dw, size;
GLDRIVERDATA *icd;
GLDRIVERDATA *icd = NULL;
GLRC *glrc;
HGLRC drvHglrc = NULL;
@ -198,7 +264,7 @@ HGLRC WINAPI wglCreateLayerContext( HDC hdc, int layer )
if (icd->DrvCreateLayerContext)
drvHglrc = icd->DrvCreateLayerContext( hdc, layer );
else
if (drvHglrc)
{
if (layer == 0)
drvHglrc = icd->DrvCreateContext( hdc );
@ -217,7 +283,7 @@ HGLRC WINAPI wglCreateLayerContext( HDC hdc, int layer )
break;
}
if (drvHglrc == NULL) /* no ICD was found */
if (drvHglrc == NULL || icd == NULL) /* no ICD was found */
{
/* FIXME: fallback to mesa */
DBGPRINT( "Error: No working ICD found!" );
@ -229,9 +295,6 @@ HGLRC WINAPI wglCreateLayerContext( HDC hdc, int layer )
glrc->hglrc = drvHglrc;
glrc->iFormat = -1; /* what is this used for? */
glrc->icd = icd;
memcpy( glrc->func_list, icd->func_list, sizeof (PVOID) * GLIDX_COUNT );
/* FIXME: fill NULL-pointers in glrc->func_list with mesa functions */
/* append glrc to context list */
WGL_AppendContext( glrc );
@ -283,12 +346,19 @@ BOOL WINAPI wglDeleteContext( HGLRC hglrc )
BOOL WINAPI wglDescribeLayerPlane( HDC hdc, int iPixelFormat, int iLayerPlane,
UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd )
{
UNIMPLEMENTED;
return FALSE;
}
int WINAPI wglDescribePixelFormat( HDC hdc, int iFormat, UINT nBytes,
LPPIXELFORMATDESCRIPTOR pfd )
{
UNIMPLEMENTED;
return 0;
}
/* FUNCTION: Return the current GLRC
* RETURNS: Current GLRC (NULL if none was set current)
*/
@ -314,6 +384,14 @@ HDC WINAPI wglGetCurrentDC()
int WINAPI wglGetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart,
int cEntries, COLORREF *pcr )
{
UNIMPLEMENTED;
return 0;
}
int WINAPI wglGetPixelFormat( HDC hdc )
{
UNIMPLEMENTED;
return 0;
}
@ -366,7 +444,11 @@ BOOL WINAPI wglMakeCurrent( HDC hdc, HGLRC hglrc )
{
GLRC *glrc = (GLRC *)hglrc;
/* FIXME: glFlush() current context */
/* flush current context */
if (OPENGL32_threaddata->glrc != NULL)
{
glFlush();
}
/* check hdc */
if (GetObjectType( hdc ) != OBJ_DC)
@ -392,9 +474,8 @@ BOOL WINAPI wglMakeCurrent( HDC hdc, HGLRC hglrc )
/* call the ICD */
if (glrc->hglrc != NULL)
{
/* FIXME: which function to call? DrvSetContext?
does it crash with NULL as SetContextCallBack? */
if (!glrc->icd->DrvSetContext( hdc, glrc->hglrc, NULL ))
if (!glrc->icd->DrvSetContext( hdc, glrc->hglrc,
WGL_SetContextCallBack ))
{
DBGPRINT( "Error: DrvSetContext failed (%d)\n", GetLastError() );
return FALSE;
@ -414,6 +495,7 @@ BOOL WINAPI wglMakeCurrent( HDC hdc, HGLRC hglrc )
BOOL WINAPI wglRealizeLayerPalette( HDC hdc, int iLayerPlane, BOOL bRealize )
{
UNIMPLEMENTED;
return FALSE;
}
@ -421,9 +503,18 @@ BOOL WINAPI wglRealizeLayerPalette( HDC hdc, int iLayerPlane, BOOL bRealize )
int WINAPI wglSetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart,
int cEntries, CONST COLORREF *pcr )
{
UNIMPLEMENTED;
return 0;
}
BOOL WINAPI wglSetPixelFormat( HDC hdc, int iFormat, CONST PIXELFORMATDESCRIPTOR *pfd )
{
UNIMPLEMENTED;
return FALSE;
}
/* FUNCTION: Enable display-list sharing between multiple GLRCs
* ARGUMENTS: [IN] hglrc1 GLRC number 1
* [IN] hglrc2 GLRC number 2
@ -457,6 +548,7 @@ BOOL WINAPI wglShareLists( HGLRC hglrc1, HGLRC hglrc2 )
return glrc1->icd->DrvShareLists( glrc1->hglrc, glrc2->hglrc );
}
/* FUNCTION: Flushes GL and swaps front/back buffer if appropriate
* ARGUMENTS: [IN] hdc Handle to device context to swap buffers for
* RETURNS: TRUE on success, FALSE on failure
@ -490,18 +582,21 @@ BOOL WINAPI wglSwapBuffers( HDC hdc )
BOOL WINAPI wglSwapLayerBuffers( HDC hdc, UINT fuPlanes )
{
UNIMPLEMENTED;
return FALSE;
}
BOOL WINAPI wglUseFontBitmapsA( HDC hdc, DWORD first, DWORD count, DWORD listBase )
{
UNIMPLEMENTED;
return FALSE;
}
BOOL WINAPI wglUseFontBitmapsW( HDC hdc, DWORD first, DWORD count, DWORD listBase )
{
UNIMPLEMENTED;
return FALSE;
}
@ -510,6 +605,7 @@ BOOL WINAPI wglUseFontOutlinesA( HDC hdc, DWORD first, DWORD count, DWORD listBa
FLOAT deviation, FLOAT extrusion, int format,
LPGLYPHMETRICSFLOAT lpgmf )
{
UNIMPLEMENTED;
return FALSE;
}
@ -518,6 +614,7 @@ BOOL WINAPI wglUseFontOutlinesW( HDC hdc, DWORD first, DWORD count, DWORD listBa
FLOAT deviation, FLOAT extrusion, int format,
LPGLYPHMETRICSFLOAT lpgmf )
{
UNIMPLEMENTED;
return FALSE;
}