blob: 89cceddc77ba485e9c2beacd70ec3d83f7f10d54 [file] [log] [blame]
Brian Paul2c9bf832000-02-12 21:08:00 +00001/* $Id: glapi.c,v 1.35 2000/02/12 21:08:00 brianp Exp $ */
Brian Paulfbd8f211999-11-11 01:22:25 +00002
3/*
4 * Mesa 3-D graphics library
5 * Version: 3.3
6 *
Brian Paulacb62972000-01-14 16:35:25 +00007 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
Brian Paulfbd8f211999-11-11 01:22:25 +00008 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
Brian Paul7e1161b1999-11-25 18:17:04 +000028/*
29 * This file manages the OpenGL API dispatch layer.
30 * The dispatch table (struct _glapi_table) is basically just a list
31 * of function pointers.
32 * There are functions to set/get the current dispatch table for the
33 * current thread and to manage registration/dispatch of dynamically
34 * added extension functions.
Brian Paul9f943992000-01-28 19:03:33 +000035 *
36 * It's intended that this file and the other glapi*.[ch] files are
37 * flexible enough to be reused in several places: XFree86, DRI-
38 * based libGL.so, and perhaps the SGI SI.
39 *
40 * There are no dependencies on Mesa in this code.
Brian Paul7e1161b1999-11-25 18:17:04 +000041 */
42
43
44
Brian Paul3c27be32000-02-10 21:27:48 +000045#include "glheader.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000046#include "glapi.h"
47#include "glapinoop.h"
Brian Paul0c239fc1999-12-16 12:38:11 +000048#include "glapioffsets.h"
49#include "glapitable.h"
Brian Paul9f943992000-01-28 19:03:33 +000050#include "glthread.h"
Brian Paulbb72d321999-12-16 17:31:59 +000051
Brian Paulfbd8f211999-11-11 01:22:25 +000052
Brian Paul0f710251999-12-15 15:02:30 +000053/* This is used when thread safety is disabled */
Brian Paulc2319b42000-01-17 19:28:31 +000054struct _glapi_table *_glapi_Dispatch = &__glapi_noop_table;
Brian Paul0f710251999-12-15 15:02:30 +000055
Brian Paul8f91fb61999-12-17 14:51:28 +000056/* Used when thread safety disabled */
Brian Paulf9b97d92000-01-28 20:17:42 +000057void *_glapi_Context = NULL;
Brian Paul8f91fb61999-12-17 14:51:28 +000058
Brian Paul0f710251999-12-15 15:02:30 +000059
Brian Paul7fb54ae1999-11-19 22:33:50 +000060#if defined(THREADS)
Brian Paulbb72d321999-12-16 17:31:59 +000061
Brian Paul77aa8b92000-01-07 07:30:13 +000062/* Flag to indicate whether thread-safe dispatch is enabled */
63static GLboolean ThreadSafe = GL_FALSE;
64
Brian Paulbb72d321999-12-16 17:31:59 +000065static _glthread_TSD DispatchTSD;
66
Brian Paul8f91fb61999-12-17 14:51:28 +000067static _glthread_TSD ContextTSD;
68
Brian Paul0f710251999-12-15 15:02:30 +000069#endif
70
71
72
Brian Paulbb72d321999-12-16 17:31:59 +000073static GLuint MaxDispatchOffset = sizeof(struct _glapi_table) / sizeof(void *) - 1;
Brian Paul0f710251999-12-15 15:02:30 +000074static GLboolean GetSizeCalled = GL_FALSE;
Brian Paulfbd8f211999-11-11 01:22:25 +000075
Brian Paul7fb54ae1999-11-19 22:33:50 +000076
Brian Paulbb72d321999-12-16 17:31:59 +000077
78/*
79 * We should call this periodically from a function such as glXMakeCurrent
80 * in order to test if multiple threads are being used. When we detect
81 * that situation we should then call _glapi_enable_thread_safety()
82 */
83void
84_glapi_check_multithread(void)
85{
86#if defined(THREADS)
Brian Paul26e14d22000-01-05 04:36:17 +000087 if (!ThreadSafe) {
Brian Paulbb72d321999-12-16 17:31:59 +000088 static unsigned long knownID;
89 static GLboolean firstCall = GL_TRUE;
90 if (firstCall) {
91 knownID = _glthread_GetID();
92 firstCall = GL_FALSE;
93 }
94 else if (knownID != _glthread_GetID()) {
Brian Paul26e14d22000-01-05 04:36:17 +000095 ThreadSafe = GL_TRUE;
Brian Paulbb72d321999-12-16 17:31:59 +000096 }
97 }
Brian Paul26e14d22000-01-05 04:36:17 +000098 if (ThreadSafe) {
Brian Paulbb72d321999-12-16 17:31:59 +000099 /* make sure that this thread's dispatch pointer isn't null */
100 if (!_glapi_get_dispatch()) {
101 _glapi_set_dispatch(NULL);
102 }
103 }
104#endif
105}
106
107
108
109/*
Brian Paul8f91fb61999-12-17 14:51:28 +0000110 * Set the current context pointer for this thread.
111 * The context pointer is an opaque type which should be cast to
112 * void from the real context pointer type.
113 */
114void
Brian Paulf9b97d92000-01-28 20:17:42 +0000115_glapi_set_context(void *context)
Brian Paul8f91fb61999-12-17 14:51:28 +0000116{
117#if defined(THREADS)
Brian Paul3c27be32000-02-10 21:27:48 +0000118 _glthread_SetTSD(&ContextTSD, context);
Brian Paul26e14d22000-01-05 04:36:17 +0000119 if (ThreadSafe)
Brian Paulf9b97d92000-01-28 20:17:42 +0000120 _glapi_Context = NULL;
Brian Paul8f91fb61999-12-17 14:51:28 +0000121 else
Brian Paulf9b97d92000-01-28 20:17:42 +0000122 _glapi_Context = context;
Brian Paul8f91fb61999-12-17 14:51:28 +0000123#else
Brian Paulf9b97d92000-01-28 20:17:42 +0000124 _glapi_Context = context;
Brian Paul8f91fb61999-12-17 14:51:28 +0000125#endif
126}
127
128
129
130/*
131 * Get the current context pointer for this thread.
132 * The context pointer is an opaque type which should be cast from
133 * void to the real context pointer type.
134 */
135void *
Brian Paulf9b97d92000-01-28 20:17:42 +0000136_glapi_get_context(void)
Brian Paul8f91fb61999-12-17 14:51:28 +0000137{
138#if defined(THREADS)
Brian Paul26e14d22000-01-05 04:36:17 +0000139 if (ThreadSafe) {
Brian Paul8f91fb61999-12-17 14:51:28 +0000140 return _glthread_GetTSD(&ContextTSD);
141 }
142 else {
Brian Paulf9b97d92000-01-28 20:17:42 +0000143 return _glapi_Context;
Brian Paul8f91fb61999-12-17 14:51:28 +0000144 }
145#else
Brian Paulf9b97d92000-01-28 20:17:42 +0000146 return _glapi_Context;
Brian Paul8f91fb61999-12-17 14:51:28 +0000147#endif
148}
149
150
151
152/*
Brian Paul7fb54ae1999-11-19 22:33:50 +0000153 * Set the global or per-thread dispatch table pointer.
154 */
155void
156_glapi_set_dispatch(struct _glapi_table *dispatch)
157{
158 if (!dispatch) {
159 /* use the no-op functions */
160 dispatch = &__glapi_noop_table;
161 }
162#ifdef DEBUG
163 else {
164 _glapi_check_table(dispatch);
165 }
166#endif
167
168#if defined(THREADS)
Brian Paul3c27be32000-02-10 21:27:48 +0000169 _glthread_SetTSD(&DispatchTSD, (void*) dispatch);
Brian Paul26e14d22000-01-05 04:36:17 +0000170 if (ThreadSafe)
Brian Paulc2319b42000-01-17 19:28:31 +0000171 _glapi_Dispatch = NULL;
Brian Paul590d3471999-12-17 12:20:23 +0000172 else
Brian Paulc2319b42000-01-17 19:28:31 +0000173 _glapi_Dispatch = dispatch;
Brian Paul7fb54ae1999-11-19 22:33:50 +0000174#else
Brian Paulc2319b42000-01-17 19:28:31 +0000175 _glapi_Dispatch = dispatch;
Brian Paul7fb54ae1999-11-19 22:33:50 +0000176#endif
177}
178
179
Brian Paulbb72d321999-12-16 17:31:59 +0000180
Brian Paul7fb54ae1999-11-19 22:33:50 +0000181/*
Brian Paulbb72d321999-12-16 17:31:59 +0000182 * Return pointer to current dispatch table for calling thread.
Brian Paul7fb54ae1999-11-19 22:33:50 +0000183 */
184struct _glapi_table *
185_glapi_get_dispatch(void)
186{
187#if defined(THREADS)
Brian Paul26e14d22000-01-05 04:36:17 +0000188 if (ThreadSafe) {
Brian Paulbb72d321999-12-16 17:31:59 +0000189 return (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD);
190 }
Brian Paul590d3471999-12-17 12:20:23 +0000191 else {
Brian Paulc2319b42000-01-17 19:28:31 +0000192 assert(_glapi_Dispatch);
193 return _glapi_Dispatch;
Brian Paul590d3471999-12-17 12:20:23 +0000194 }
Brian Paul7fb54ae1999-11-19 22:33:50 +0000195#else
Brian Paulc2319b42000-01-17 19:28:31 +0000196 return _glapi_Dispatch;
Brian Paul7fb54ae1999-11-19 22:33:50 +0000197#endif
198}
199
200
Brian Paul91bcefa1999-11-27 21:30:40 +0000201
202/*
203 * Return size of dispatch table struct as number of functions (or
204 * slots).
205 */
206GLuint
207_glapi_get_dispatch_table_size(void)
208{
Brian Paul0f710251999-12-15 15:02:30 +0000209 /* return sizeof(struct _glapi_table) / sizeof(void *);*/
210 GetSizeCalled = GL_TRUE;
211 return MaxDispatchOffset + 1;
Brian Paul91bcefa1999-11-27 21:30:40 +0000212}
213
214
215
Brian Paul7fb54ae1999-11-19 22:33:50 +0000216/*
217 * Get API dispatcher version string.
Brian Paul7fb54ae1999-11-19 22:33:50 +0000218 */
219const char *
220_glapi_get_version(void)
221{
Brian Paul9f943992000-01-28 19:03:33 +0000222 return "20000128"; /* YYYYMMDD */
Brian Paul7fb54ae1999-11-19 22:33:50 +0000223}
224
225
Brian Paul91bcefa1999-11-27 21:30:40 +0000226struct name_address_pair {
Brian Paul7fb54ae1999-11-19 22:33:50 +0000227 const char *Name;
Brian Paul91bcefa1999-11-27 21:30:40 +0000228 GLvoid *Address;
Brian Paul7fb54ae1999-11-19 22:33:50 +0000229};
230
Brian Paul0c239fc1999-12-16 12:38:11 +0000231static struct name_address_pair static_functions[1000];
232
233
234
235/*
236 * Return dispatch table offset of the named static (built-in) function.
237 * Return -1 if function not found.
238 */
239static GLint
240get_static_proc_offset(const char *funcName)
241{
242 GLuint i;
243 for (i = 0; static_functions[i].Name; i++) {
244 if (strcmp(static_functions[i].Name, funcName) == 0) {
245 return i;
246 }
247 }
248 return -1;
249}
250
251
252/*
253 * Return dispatch function address the named static (built-in) function.
254 * Return NULL if function not found.
255 */
256static GLvoid *
257get_static_proc_address(const char *funcName)
258{
259 GLuint i = get_static_proc_offset(funcName);
260 if (i >= 0)
261 return static_functions[i].Address;
262 else
263 return NULL;
264}
265
266
267
268/**********************************************************************
269 * Extension function management.
Brian Paulbb72d321999-12-16 17:31:59 +0000270 */
Brian Paul0c239fc1999-12-16 12:38:11 +0000271
272
Brian Paulef5d0842000-02-12 16:44:24 +0000273#define MAX_EXTENSION_FUNCS 1000
274
275
Brian Paul0c239fc1999-12-16 12:38:11 +0000276struct _glapi_ext_entrypoint {
277 const char *Name; /* the extension function's name */
278 GLuint Offset; /* relative to start of dispatch table */
279 GLvoid *Address; /* address of dispatch function */
280};
281
Brian Paulef5d0842000-02-12 16:44:24 +0000282static struct _glapi_ext_entrypoint ExtEntryTable[MAX_EXTENSION_FUNCS];
Brian Paul0c239fc1999-12-16 12:38:11 +0000283static GLuint NumExtEntryPoints = 0;
284
285
286
287/*
288 * Generate a dispatch function (entrypoint) which jumps through
289 * the given slot number (offset) in the current dispatch table.
Brian Paul4428a3f2000-01-31 22:51:44 +0000290 * We need assembly language in order to accomplish this.
Brian Paul0c239fc1999-12-16 12:38:11 +0000291 */
292static void *
Brian Paulb086b952000-02-02 18:50:07 +0000293generate_entrypoint(GLuint functionOffset)
Brian Paul0c239fc1999-12-16 12:38:11 +0000294{
Brian Paul4428a3f2000-01-31 22:51:44 +0000295#if defined(USE_X86_ASM)
296 /*
297 * This x86 code contributed by Josh Vanderhoof.
298 *
299 * 0: a1 10 32 54 76 movl __glapi_Dispatch,%eax
300 * 00 01 02 03 04
301 * 5: 85 c0 testl %eax,%eax
302 * 05 06
303 * 7: 74 06 je f <entrypoint+0xf>
304 * 07 08
305 * 9: ff a0 10 32 54 76 jmp *0x76543210(%eax)
306 * 09 0a 0b 0c 0d 0e
307 * f: e8 fc ff ff ff call __glapi_get_dispatch
308 * 0f 10 11 12 13
309 * 14: ff a0 10 32 54 76 jmp *0x76543210(%eax)
310 * 14 15 16 17 18 19
311 */
312 static const unsigned char temp[] = {
313 0xa1, 0x00, 0x00, 0x00, 0x00,
314 0x85, 0xc0,
315 0x74, 0x06,
316 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00,
317 0xe8, 0x00, 0x00, 0x00, 0x00,
318 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00
319 };
320 unsigned char *code = malloc(sizeof(temp));
321 unsigned int next_insn;
322 if (code) {
323 memcpy(code, temp, sizeof(temp));
Brian Paul0c239fc1999-12-16 12:38:11 +0000324
Brian Paul4428a3f2000-01-31 22:51:44 +0000325 *(unsigned int *)(code + 0x01) = (unsigned int)&_glapi_Dispatch;
326 *(unsigned int *)(code + 0x0b) = (unsigned int)functionOffset * 4;
327 next_insn = (unsigned int)(code + 0x14);
328 *(unsigned int *)(code + 0x10) = (unsigned int)_glapi_get_dispatch - next_insn;
329 *(unsigned int *)(code + 0x16) = (unsigned int)functionOffset * 4;
330 }
331 return code;
332#else
Brian Paul0c239fc1999-12-16 12:38:11 +0000333 return NULL;
Brian Paul4428a3f2000-01-31 22:51:44 +0000334#endif
Brian Paul0c239fc1999-12-16 12:38:11 +0000335}
336
337
338
339/*
340 * Add a new extension function entrypoint.
341 * Return: GL_TRUE = success or GL_FALSE = failure
342 */
343GLboolean
344_glapi_add_entrypoint(const char *funcName, GLuint offset)
345{
Brian Paul0c239fc1999-12-16 12:38:11 +0000346 /* Make sure we don't try to add a new entrypoint after someone
347 * has already called _glapi_get_dispatch_table_size()! If that's
348 * happened the caller's information will now be out of date.
349 */
350 assert(!GetSizeCalled);
351
352 /* first check if the named function is already statically present */
Brian Paul85db3d72000-02-12 17:31:40 +0000353 {
354 GLint index = get_static_proc_offset(funcName);
355 if (index >= 0) {
356 return (GLboolean) (index == offset); /* bad offset! */
357 }
Brian Paul0c239fc1999-12-16 12:38:11 +0000358 }
Brian Paul85db3d72000-02-12 17:31:40 +0000359
360 {
361 /* make sure this offset/name pair is legal */
362 const char *name = _glapi_get_proc_name(offset);
363 if (name && strcmp(name, funcName) != 0)
364 return GL_FALSE; /* bad name! */
365 }
366
367 {
Brian Paul0c239fc1999-12-16 12:38:11 +0000368 /* be sure index and name match known data */
369 GLuint i;
370 for (i = 0; i < NumExtEntryPoints; i++) {
371 if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
372 /* function already registered with api */
373 if (ExtEntryTable[i].Offset == offset) {
374 return GL_TRUE; /* offsets match */
375 }
376 else {
377 return GL_FALSE; /* bad offset! */
378 }
379 }
380 }
Brian Paul0c239fc1999-12-16 12:38:11 +0000381
Brian Paulef5d0842000-02-12 16:44:24 +0000382 /* make sure we have space */
383 if (NumExtEntryPoints >= MAX_EXTENSION_FUNCS) {
384 return GL_FALSE;
385 }
386 else {
387 void *entrypoint = generate_entrypoint(offset);
388 if (!entrypoint)
389 return GL_FALSE;
Brian Paul0c239fc1999-12-16 12:38:11 +0000390
Brian Paulef5d0842000-02-12 16:44:24 +0000391 ExtEntryTable[NumExtEntryPoints].Name = strdup(funcName);
392 ExtEntryTable[NumExtEntryPoints].Offset = offset;
393 ExtEntryTable[NumExtEntryPoints].Address = entrypoint;
394 NumExtEntryPoints++;
395
396 if (offset > MaxDispatchOffset)
397 MaxDispatchOffset = offset;
398
399 return GL_TRUE; /* success */
400 }
Brian Paul0c239fc1999-12-16 12:38:11 +0000401 }
Brian Paulef5d0842000-02-12 16:44:24 +0000402
403 /* should never get here, but play it safe */
404 return GL_FALSE;
Brian Paul0c239fc1999-12-16 12:38:11 +0000405}
406
407
408
Brian Paulef5d0842000-02-12 16:44:24 +0000409#if 0000 /* prototype code for dynamic extension slot allocation */
410
411static int NextFreeOffset = 409; /*XXX*/
412#define MAX_DISPATCH_TABLE_SIZE 1000
413
414/*
415 * Dynamically allocate a dispatch slot for an extension entrypoint
416 * and generate the assembly language dispatch stub.
417 * Return the dispatch offset for the function or -1 if no room or error.
418 */
419GLint
420_glapi_add_entrypoint2(const char *funcName)
421{
422 int offset;
423
424 /* first see if extension func is already known */
425 offset = _glapi_get_proc_offset(funcName);
426 if (offset >= 0)
427 return offset;
428
429 if (NumExtEntryPoints < MAX_EXTENSION_FUNCS
430 && NextFreeOffset < MAX_DISPATCH_TABLE_SIZE) {
431 void *entryPoint;
432 offset = NextFreeOffset;
433 entryPoint = generate_entrypoint(offset);
434 if (entryPoint) {
435 NextFreeOffset++;
436 ExtEntryTable[NumExtEntryPoints].Name = strdup(funcName);
437 ExtEntryTable[NumExtEntryPoints].Offset = offset;
438 ExtEntryTable[NumExtEntryPoints].Address = entryPoint;
439 NumExtEntryPoints++;
440 return offset;
441 }
442 }
443 return -1;
444}
445
446#endif
447
448
449
Brian Paul0c239fc1999-12-16 12:38:11 +0000450/*
451 * Return offset of entrypoint for named function within dispatch table.
452 */
453GLint
454_glapi_get_proc_offset(const char *funcName)
455{
456 /* search extension functions first */
457 GLint i;
458 for (i = 0; i < NumExtEntryPoints; i++) {
459 if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
460 return ExtEntryTable[i].Offset;
461 }
462 }
463
464 /* search static functions */
465 return get_static_proc_offset(funcName);
466}
467
468
469
470/*
471 * Return entrypoint for named function.
472 */
473const GLvoid *
474_glapi_get_proc_address(const char *funcName)
475{
476 /* search extension functions first */
477 GLint i;
478 for (i = 0; i < NumExtEntryPoints; i++) {
479 if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
480 return ExtEntryTable[i].Address;
481 }
482 }
483
484 /* search static functions */
485 return get_static_proc_address(funcName);
486}
487
488
489
490
491/*
492 * Return the name of the function at the given dispatch offset.
493 * This is only intended for debugging.
494 */
495const char *
496_glapi_get_proc_name(GLuint offset)
497{
498 GLuint n = sizeof(static_functions) / sizeof(struct name_address_pair);
499 if (offset < n) {
500 return static_functions[offset].Name;
501 }
502 else {
503 /* search added extension functions */
504 GLuint i;
505 for (i = 0; i < NumExtEntryPoints; i++) {
506 if (ExtEntryTable[i].Offset == offset) {
507 return ExtEntryTable[i].Name;
508 }
509 }
510 return NULL;
511 }
512}
513
514
515
516/*
517 * Make sure there are no NULL pointers in the given dispatch table.
518 * Intented for debugging purposes.
519 */
520void
521_glapi_check_table(const struct _glapi_table *table)
522{
523 const GLuint entries = _glapi_get_dispatch_table_size();
524 const void **tab = (const void **) table;
525 GLuint i;
526 for (i = 1; i < entries; i++) {
527 assert(tab[i]);
528 }
529
Brian Paulacb62972000-01-14 16:35:25 +0000530#ifdef DEBUG
Brian Paul0c239fc1999-12-16 12:38:11 +0000531 /* Do some spot checks to be sure that the dispatch table
532 * slots are assigned correctly.
533 */
534 {
535 GLuint BeginOffset = _glapi_get_proc_offset("glBegin");
536 char *BeginFunc = (char*) &table->Begin;
537 GLuint offset = (BeginFunc - (char *) table) / sizeof(void *);
538 assert(BeginOffset == _gloffset_Begin);
539 assert(BeginOffset == offset);
540 }
541 {
542 GLuint viewportOffset = _glapi_get_proc_offset("glViewport");
543 char *viewportFunc = (char*) &table->Viewport;
544 GLuint offset = (viewportFunc - (char *) table) / sizeof(void *);
545 assert(viewportOffset == _gloffset_Viewport);
546 assert(viewportOffset == offset);
547 }
548 {
549 GLuint VertexPointerOffset = _glapi_get_proc_offset("glVertexPointer");
550 char *VertexPointerFunc = (char*) &table->VertexPointer;
551 GLuint offset = (VertexPointerFunc - (char *) table) / sizeof(void *);
552 assert(VertexPointerOffset == _gloffset_VertexPointer);
553 assert(VertexPointerOffset == offset);
554 }
555 {
556 GLuint ResetMinMaxOffset = _glapi_get_proc_offset("glResetMinmax");
557 char *ResetMinMaxFunc = (char*) &table->ResetMinmax;
558 GLuint offset = (ResetMinMaxFunc - (char *) table) / sizeof(void *);
559 assert(ResetMinMaxOffset == _gloffset_ResetMinmax);
560 assert(ResetMinMaxOffset == offset);
561 }
562 {
563 GLuint blendColorOffset = _glapi_get_proc_offset("glBlendColorEXT");
564 char *blendColorFunc = (char*) &table->BlendColorEXT;
565 GLuint offset = (blendColorFunc - (char *) table) / sizeof(void *);
566 assert(blendColorOffset == _gloffset_BlendColorEXT);
567 assert(blendColorOffset == offset);
568 }
569 {
570 GLuint istextureOffset = _glapi_get_proc_offset("glIsTextureEXT");
571 char *istextureFunc = (char*) &table->IsTextureEXT;
572 GLuint offset = (istextureFunc - (char *) table) / sizeof(void *);
573 assert(istextureOffset == _gloffset_IsTextureEXT);
574 assert(istextureOffset == offset);
575 }
Brian Paulacb62972000-01-14 16:35:25 +0000576#endif
Brian Paul0c239fc1999-12-16 12:38:11 +0000577}
578
579
Brian Paul0c239fc1999-12-16 12:38:11 +0000580/*
581 * For each entry in static_functions[] which use this function
582 * we should implement a dispatch function in glapitemp.h and
583 * in glapinoop.c
584 */
Brian Paulb3674092000-01-08 11:01:24 +0000585static int NotImplemented(void)
Brian Paul0c239fc1999-12-16 12:38:11 +0000586{
Brian Paulb3674092000-01-08 11:01:24 +0000587 return 0;
Brian Paul0c239fc1999-12-16 12:38:11 +0000588}
589
590
591
Brian Paul91bcefa1999-11-27 21:30:40 +0000592static struct name_address_pair static_functions[] = {
Brian Paul0c239fc1999-12-16 12:38:11 +0000593 { "NotImplemented", (GLvoid *) NotImplemented },
594
595 /* GL 1.1 */
Brian Paul91bcefa1999-11-27 21:30:40 +0000596 { "glAccum", (GLvoid *) glAccum },
597 { "glAlphaFunc", (GLvoid *) glAlphaFunc },
598 { "glBegin", (GLvoid *) glBegin },
599 { "glBitmap", (GLvoid *) glBitmap },
600 { "glBlendFunc", (GLvoid *) glBlendFunc },
601 { "glCallList", (GLvoid *) glCallList },
602 { "glCallLists", (GLvoid *) glCallLists },
603 { "glClear", (GLvoid *) glClear },
604 { "glClearAccum", (GLvoid *) glClearAccum },
605 { "glClearColor", (GLvoid *) glClearColor },
606 { "glClearDepth", (GLvoid *) glClearDepth },
607 { "glClearIndex", (GLvoid *) glClearIndex },
608 { "glClearStencil", (GLvoid *) glClearStencil },
609 { "glClipPlane", (GLvoid *) glClipPlane },
610 { "glColor3b", (GLvoid *) glColor3b },
611 { "glColor3bv", (GLvoid *) glColor3bv },
612 { "glColor3d", (GLvoid *) glColor3d },
613 { "glColor3dv", (GLvoid *) glColor3dv },
614 { "glColor3f", (GLvoid *) glColor3f },
615 { "glColor3fv", (GLvoid *) glColor3fv },
616 { "glColor3i", (GLvoid *) glColor3i },
617 { "glColor3iv", (GLvoid *) glColor3iv },
618 { "glColor3s", (GLvoid *) glColor3s },
619 { "glColor3sv", (GLvoid *) glColor3sv },
620 { "glColor3ub", (GLvoid *) glColor3ub },
621 { "glColor3ubv", (GLvoid *) glColor3ubv },
622 { "glColor3ui", (GLvoid *) glColor3ui },
623 { "glColor3uiv", (GLvoid *) glColor3uiv },
624 { "glColor3us", (GLvoid *) glColor3us },
625 { "glColor3usv", (GLvoid *) glColor3usv },
626 { "glColor4b", (GLvoid *) glColor4b },
627 { "glColor4bv", (GLvoid *) glColor4bv },
628 { "glColor4d", (GLvoid *) glColor4d },
629 { "glColor4dv", (GLvoid *) glColor4dv },
630 { "glColor4f", (GLvoid *) glColor4f },
631 { "glColor4fv", (GLvoid *) glColor4fv },
632 { "glColor4i", (GLvoid *) glColor4i },
633 { "glColor4iv", (GLvoid *) glColor4iv },
634 { "glColor4s", (GLvoid *) glColor4s },
635 { "glColor4sv", (GLvoid *) glColor4sv },
636 { "glColor4ub", (GLvoid *) glColor4ub },
637 { "glColor4ubv", (GLvoid *) glColor4ubv },
638 { "glColor4ui", (GLvoid *) glColor4ui },
639 { "glColor4uiv", (GLvoid *) glColor4uiv },
640 { "glColor4us", (GLvoid *) glColor4us },
641 { "glColor4usv", (GLvoid *) glColor4usv },
642 { "glColorMask", (GLvoid *) glColorMask },
643 { "glColorMaterial", (GLvoid *) glColorMaterial },
644 { "glCopyPixels", (GLvoid *) glCopyPixels },
645 { "glCullFace", (GLvoid *) glCullFace },
646 { "glDeleteLists", (GLvoid *) glDeleteLists },
647 { "glDepthFunc", (GLvoid *) glDepthFunc },
648 { "glDepthMask", (GLvoid *) glDepthMask },
649 { "glDepthRange", (GLvoid *) glDepthRange },
650 { "glDisable", (GLvoid *) glDisable },
651 { "glDrawBuffer", (GLvoid *) glDrawBuffer },
652 { "glDrawPixels", (GLvoid *) glDrawPixels },
653 { "glEdgeFlag", (GLvoid *) glEdgeFlag },
654 { "glEdgeFlagv", (GLvoid *) glEdgeFlagv },
655 { "glEnable", (GLvoid *) glEnable },
656 { "glEnd", (GLvoid *) glEnd },
657 { "glEndList", (GLvoid *) glEndList },
658 { "glEvalCoord1d", (GLvoid *) glEvalCoord1d },
659 { "glEvalCoord1dv", (GLvoid *) glEvalCoord1dv },
660 { "glEvalCoord1f", (GLvoid *) glEvalCoord1f },
661 { "glEvalCoord1fv", (GLvoid *) glEvalCoord1fv },
662 { "glEvalCoord2d", (GLvoid *) glEvalCoord2d },
663 { "glEvalCoord2dv", (GLvoid *) glEvalCoord2dv },
664 { "glEvalCoord2f", (GLvoid *) glEvalCoord2f },
665 { "glEvalCoord2fv", (GLvoid *) glEvalCoord2fv },
666 { "glEvalMesh1", (GLvoid *) glEvalMesh1 },
667 { "glEvalMesh2", (GLvoid *) glEvalMesh2 },
668 { "glEvalPoint1", (GLvoid *) glEvalPoint1 },
669 { "glEvalPoint2", (GLvoid *) glEvalPoint2 },
670 { "glFeedbackBuffer", (GLvoid *) glFeedbackBuffer },
671 { "glFinish", (GLvoid *) glFinish },
672 { "glFlush", (GLvoid *) glFlush },
673 { "glFogf", (GLvoid *) glFogf },
674 { "glFogfv", (GLvoid *) glFogfv },
675 { "glFogi", (GLvoid *) glFogi },
676 { "glFogiv", (GLvoid *) glFogiv },
677 { "glFrontFace", (GLvoid *) glFrontFace },
678 { "glFrustum", (GLvoid *) glFrustum },
679 { "glGenLists", (GLvoid *) glGenLists },
680 { "glGetBooleanv", (GLvoid *) glGetBooleanv },
681 { "glGetClipPlane", (GLvoid *) glGetClipPlane },
682 { "glGetDoublev", (GLvoid *) glGetDoublev },
683 { "glGetError", (GLvoid *) glGetError },
684 { "glGetFloatv", (GLvoid *) glGetFloatv },
685 { "glGetIntegerv", (GLvoid *) glGetIntegerv },
686 { "glGetLightfv", (GLvoid *) glGetLightfv },
687 { "glGetLightiv", (GLvoid *) glGetLightiv },
688 { "glGetMapdv", (GLvoid *) glGetMapdv },
689 { "glGetMapfv", (GLvoid *) glGetMapfv },
690 { "glGetMapiv", (GLvoid *) glGetMapiv },
691 { "glGetMaterialfv", (GLvoid *) glGetMaterialfv },
692 { "glGetMaterialiv", (GLvoid *) glGetMaterialiv },
693 { "glGetPixelMapfv", (GLvoid *) glGetPixelMapfv },
694 { "glGetPixelMapuiv", (GLvoid *) glGetPixelMapuiv },
695 { "glGetPixelMapusv", (GLvoid *) glGetPixelMapusv },
696 { "glGetPolygonStipple", (GLvoid *) glGetPolygonStipple },
697 { "glGetString", (GLvoid *) glGetString },
698 { "glGetTexEnvfv", (GLvoid *) glGetTexEnvfv },
699 { "glGetTexEnviv", (GLvoid *) glGetTexEnviv },
700 { "glGetTexGendv", (GLvoid *) glGetTexGendv },
701 { "glGetTexGenfv", (GLvoid *) glGetTexGenfv },
702 { "glGetTexGeniv", (GLvoid *) glGetTexGeniv },
703 { "glGetTexImage", (GLvoid *) glGetTexImage },
704 { "glGetTexLevelParameterfv", (GLvoid *) glGetTexLevelParameterfv },
705 { "glGetTexLevelParameteriv", (GLvoid *) glGetTexLevelParameteriv },
706 { "glGetTexParameterfv", (GLvoid *) glGetTexParameterfv },
707 { "glGetTexParameteriv", (GLvoid *) glGetTexParameteriv },
708 { "glHint", (GLvoid *) glHint },
709 { "glIndexMask", (GLvoid *) glIndexMask },
710 { "glIndexd", (GLvoid *) glIndexd },
711 { "glIndexdv", (GLvoid *) glIndexdv },
712 { "glIndexf", (GLvoid *) glIndexf },
713 { "glIndexfv", (GLvoid *) glIndexfv },
714 { "glIndexi", (GLvoid *) glIndexi },
715 { "glIndexiv", (GLvoid *) glIndexiv },
716 { "glIndexs", (GLvoid *) glIndexs },
717 { "glIndexsv", (GLvoid *) glIndexsv },
718 { "glInitNames", (GLvoid *) glInitNames },
719 { "glIsEnabled", (GLvoid *) glIsEnabled },
720 { "glIsList", (GLvoid *) glIsList },
721 { "glLightModelf", (GLvoid *) glLightModelf },
722 { "glLightModelfv", (GLvoid *) glLightModelfv },
723 { "glLightModeli", (GLvoid *) glLightModeli },
724 { "glLightModeliv", (GLvoid *) glLightModeliv },
725 { "glLightf", (GLvoid *) glLightf },
726 { "glLightfv", (GLvoid *) glLightfv },
727 { "glLighti", (GLvoid *) glLighti },
728 { "glLightiv", (GLvoid *) glLightiv },
729 { "glLineStipple", (GLvoid *) glLineStipple },
730 { "glLineWidth", (GLvoid *) glLineWidth },
731 { "glListBase", (GLvoid *) glListBase },
732 { "glLoadIdentity", (GLvoid *) glLoadIdentity },
733 { "glLoadMatrixd", (GLvoid *) glLoadMatrixd },
734 { "glLoadMatrixf", (GLvoid *) glLoadMatrixf },
735 { "glLoadName", (GLvoid *) glLoadName },
736 { "glLogicOp", (GLvoid *) glLogicOp },
737 { "glMap1d", (GLvoid *) glMap1d },
738 { "glMap1f", (GLvoid *) glMap1f },
739 { "glMap2d", (GLvoid *) glMap2d },
740 { "glMap2f", (GLvoid *) glMap2f },
741 { "glMapGrid1d", (GLvoid *) glMapGrid1d },
742 { "glMapGrid1f", (GLvoid *) glMapGrid1f },
743 { "glMapGrid2d", (GLvoid *) glMapGrid2d },
744 { "glMapGrid2f", (GLvoid *) glMapGrid2f },
745 { "glMaterialf", (GLvoid *) glMaterialf },
746 { "glMaterialfv", (GLvoid *) glMaterialfv },
747 { "glMateriali", (GLvoid *) glMateriali },
748 { "glMaterialiv", (GLvoid *) glMaterialiv },
749 { "glMatrixMode", (GLvoid *) glMatrixMode },
750 { "glMultMatrixd", (GLvoid *) glMultMatrixd },
751 { "glMultMatrixf", (GLvoid *) glMultMatrixf },
752 { "glNewList", (GLvoid *) glNewList },
753 { "glNormal3b", (GLvoid *) glNormal3b },
754 { "glNormal3bv", (GLvoid *) glNormal3bv },
755 { "glNormal3d", (GLvoid *) glNormal3d },
756 { "glNormal3dv", (GLvoid *) glNormal3dv },
757 { "glNormal3f", (GLvoid *) glNormal3f },
758 { "glNormal3fv", (GLvoid *) glNormal3fv },
759 { "glNormal3i", (GLvoid *) glNormal3i },
760 { "glNormal3iv", (GLvoid *) glNormal3iv },
761 { "glNormal3s", (GLvoid *) glNormal3s },
762 { "glNormal3sv", (GLvoid *) glNormal3sv },
763 { "glOrtho", (GLvoid *) glOrtho },
764 { "glPassThrough", (GLvoid *) glPassThrough },
765 { "glPixelMapfv", (GLvoid *) glPixelMapfv },
766 { "glPixelMapuiv", (GLvoid *) glPixelMapuiv },
767 { "glPixelMapusv", (GLvoid *) glPixelMapusv },
768 { "glPixelStoref", (GLvoid *) glPixelStoref },
769 { "glPixelStorei", (GLvoid *) glPixelStorei },
770 { "glPixelTransferf", (GLvoid *) glPixelTransferf },
771 { "glPixelTransferi", (GLvoid *) glPixelTransferi },
772 { "glPixelZoom", (GLvoid *) glPixelZoom },
773 { "glPointSize", (GLvoid *) glPointSize },
774 { "glPolygonMode", (GLvoid *) glPolygonMode },
775 { "glPolygonOffset", (GLvoid *) glPolygonOffset },
776 { "glPolygonStipple", (GLvoid *) glPolygonStipple },
777 { "glPopAttrib", (GLvoid *) glPopAttrib },
778 { "glPopMatrix", (GLvoid *) glPopMatrix },
779 { "glPopName", (GLvoid *) glPopName },
780 { "glPushAttrib", (GLvoid *) glPushAttrib },
781 { "glPushMatrix", (GLvoid *) glPushMatrix },
782 { "glPushName", (GLvoid *) glPushName },
783 { "glRasterPos2d", (GLvoid *) glRasterPos2d },
784 { "glRasterPos2dv", (GLvoid *) glRasterPos2dv },
785 { "glRasterPos2f", (GLvoid *) glRasterPos2f },
786 { "glRasterPos2fv", (GLvoid *) glRasterPos2fv },
787 { "glRasterPos2i", (GLvoid *) glRasterPos2i },
788 { "glRasterPos2iv", (GLvoid *) glRasterPos2iv },
789 { "glRasterPos2s", (GLvoid *) glRasterPos2s },
790 { "glRasterPos2sv", (GLvoid *) glRasterPos2sv },
791 { "glRasterPos3d", (GLvoid *) glRasterPos3d },
792 { "glRasterPos3dv", (GLvoid *) glRasterPos3dv },
793 { "glRasterPos3f", (GLvoid *) glRasterPos3f },
794 { "glRasterPos3fv", (GLvoid *) glRasterPos3fv },
795 { "glRasterPos3i", (GLvoid *) glRasterPos3i },
796 { "glRasterPos3iv", (GLvoid *) glRasterPos3iv },
797 { "glRasterPos3s", (GLvoid *) glRasterPos3s },
798 { "glRasterPos3sv", (GLvoid *) glRasterPos3sv },
799 { "glRasterPos4d", (GLvoid *) glRasterPos4d },
800 { "glRasterPos4dv", (GLvoid *) glRasterPos4dv },
801 { "glRasterPos4f", (GLvoid *) glRasterPos4f },
802 { "glRasterPos4fv", (GLvoid *) glRasterPos4fv },
803 { "glRasterPos4i", (GLvoid *) glRasterPos4i },
804 { "glRasterPos4iv", (GLvoid *) glRasterPos4iv },
805 { "glRasterPos4s", (GLvoid *) glRasterPos4s },
806 { "glRasterPos4sv", (GLvoid *) glRasterPos4sv },
807 { "glReadBuffer", (GLvoid *) glReadBuffer },
808 { "glReadPixels", (GLvoid *) glReadPixels },
809 { "glRectd", (GLvoid *) glRectd },
810 { "glRectdv", (GLvoid *) glRectdv },
811 { "glRectf", (GLvoid *) glRectf },
812 { "glRectfv", (GLvoid *) glRectfv },
813 { "glRecti", (GLvoid *) glRecti },
814 { "glRectiv", (GLvoid *) glRectiv },
815 { "glRects", (GLvoid *) glRects },
816 { "glRectsv", (GLvoid *) glRectsv },
817 { "glRenderMode", (GLvoid *) glRenderMode },
818 { "glRotated", (GLvoid *) glRotated },
819 { "glRotatef", (GLvoid *) glRotatef },
820 { "glScaled", (GLvoid *) glScaled },
821 { "glScalef", (GLvoid *) glScalef },
822 { "glScissor", (GLvoid *) glScissor },
823 { "glSelectBuffer", (GLvoid *) glSelectBuffer },
824 { "glShadeModel", (GLvoid *) glShadeModel },
825 { "glStencilFunc", (GLvoid *) glStencilFunc },
826 { "glStencilMask", (GLvoid *) glStencilMask },
827 { "glStencilOp", (GLvoid *) glStencilOp },
828 { "glTexCoord1d", (GLvoid *) glTexCoord1d },
829 { "glTexCoord1dv", (GLvoid *) glTexCoord1dv },
830 { "glTexCoord1f", (GLvoid *) glTexCoord1f },
831 { "glTexCoord1fv", (GLvoid *) glTexCoord1fv },
832 { "glTexCoord1i", (GLvoid *) glTexCoord1i },
833 { "glTexCoord1iv", (GLvoid *) glTexCoord1iv },
834 { "glTexCoord1s", (GLvoid *) glTexCoord1s },
835 { "glTexCoord1sv", (GLvoid *) glTexCoord1sv },
836 { "glTexCoord2d", (GLvoid *) glTexCoord2d },
837 { "glTexCoord2dv", (GLvoid *) glTexCoord2dv },
838 { "glTexCoord2f", (GLvoid *) glTexCoord2f },
839 { "glTexCoord2fv", (GLvoid *) glTexCoord2fv },
840 { "glTexCoord2i", (GLvoid *) glTexCoord2i },
841 { "glTexCoord2iv", (GLvoid *) glTexCoord2iv },
842 { "glTexCoord2s", (GLvoid *) glTexCoord2s },
843 { "glTexCoord2sv", (GLvoid *) glTexCoord2sv },
844 { "glTexCoord3d", (GLvoid *) glTexCoord3d },
845 { "glTexCoord3dv", (GLvoid *) glTexCoord3dv },
846 { "glTexCoord3f", (GLvoid *) glTexCoord3f },
847 { "glTexCoord3fv", (GLvoid *) glTexCoord3fv },
848 { "glTexCoord3i", (GLvoid *) glTexCoord3i },
849 { "glTexCoord3iv", (GLvoid *) glTexCoord3iv },
850 { "glTexCoord3s", (GLvoid *) glTexCoord3s },
851 { "glTexCoord3sv", (GLvoid *) glTexCoord3sv },
852 { "glTexCoord4d", (GLvoid *) glTexCoord4d },
853 { "glTexCoord4dv", (GLvoid *) glTexCoord4dv },
854 { "glTexCoord4f", (GLvoid *) glTexCoord4f },
855 { "glTexCoord4fv", (GLvoid *) glTexCoord4fv },
856 { "glTexCoord4i", (GLvoid *) glTexCoord4i },
857 { "glTexCoord4iv", (GLvoid *) glTexCoord4iv },
858 { "glTexCoord4s", (GLvoid *) glTexCoord4s },
859 { "glTexCoord4sv", (GLvoid *) glTexCoord4sv },
860 { "glTexEnvf", (GLvoid *) glTexEnvf },
861 { "glTexEnvfv", (GLvoid *) glTexEnvfv },
862 { "glTexEnvi", (GLvoid *) glTexEnvi },
863 { "glTexEnviv", (GLvoid *) glTexEnviv },
864 { "glTexGend", (GLvoid *) glTexGend },
865 { "glTexGendv", (GLvoid *) glTexGendv },
866 { "glTexGenf", (GLvoid *) glTexGenf },
867 { "glTexGenfv", (GLvoid *) glTexGenfv },
868 { "glTexGeni", (GLvoid *) glTexGeni },
869 { "glTexGeniv", (GLvoid *) glTexGeniv },
870 { "glTexImage1D", (GLvoid *) glTexImage1D },
871 { "glTexImage2D", (GLvoid *) glTexImage2D },
872 { "glTexParameterf", (GLvoid *) glTexParameterf },
873 { "glTexParameterfv", (GLvoid *) glTexParameterfv },
874 { "glTexParameteri", (GLvoid *) glTexParameteri },
875 { "glTexParameteriv", (GLvoid *) glTexParameteriv },
876 { "glTranslated", (GLvoid *) glTranslated },
877 { "glTranslatef", (GLvoid *) glTranslatef },
878 { "glVertex2d", (GLvoid *) glVertex2d },
879 { "glVertex2dv", (GLvoid *) glVertex2dv },
880 { "glVertex2f", (GLvoid *) glVertex2f },
881 { "glVertex2fv", (GLvoid *) glVertex2fv },
882 { "glVertex2i", (GLvoid *) glVertex2i },
883 { "glVertex2iv", (GLvoid *) glVertex2iv },
884 { "glVertex2s", (GLvoid *) glVertex2s },
885 { "glVertex2sv", (GLvoid *) glVertex2sv },
886 { "glVertex3d", (GLvoid *) glVertex3d },
887 { "glVertex3dv", (GLvoid *) glVertex3dv },
888 { "glVertex3f", (GLvoid *) glVertex3f },
889 { "glVertex3fv", (GLvoid *) glVertex3fv },
890 { "glVertex3i", (GLvoid *) glVertex3i },
891 { "glVertex3iv", (GLvoid *) glVertex3iv },
892 { "glVertex3s", (GLvoid *) glVertex3s },
893 { "glVertex3sv", (GLvoid *) glVertex3sv },
894 { "glVertex4d", (GLvoid *) glVertex4d },
895 { "glVertex4dv", (GLvoid *) glVertex4dv },
896 { "glVertex4f", (GLvoid *) glVertex4f },
897 { "glVertex4fv", (GLvoid *) glVertex4fv },
898 { "glVertex4i", (GLvoid *) glVertex4i },
899 { "glVertex4iv", (GLvoid *) glVertex4iv },
900 { "glVertex4s", (GLvoid *) glVertex4s },
901 { "glVertex4sv", (GLvoid *) glVertex4sv },
902 { "glViewport", (GLvoid *) glViewport },
Brian Paul7fb54ae1999-11-19 22:33:50 +0000903
Brian Paul0c239fc1999-12-16 12:38:11 +0000904 /* GL 1.1 */
Brian Paul77aa8b92000-01-07 07:30:13 +0000905#ifdef GL_VERSION_1_1
906#define NAME(X) X
907#else
908#define NAME(X) NotImplemented
909#endif
910 { "glAreTexturesResident", (GLvoid *) NAME(glAreTexturesResident) },
911 { "glArrayElement", (GLvoid *) NAME(glArrayElement) },
912 { "glBindTexture", (GLvoid *) NAME(glBindTexture) },
913 { "glColorPointer", (GLvoid *) NAME(glColorPointer) },
914 { "glCopyTexImage1D", (GLvoid *) NAME(glCopyTexImage1D) },
915 { "glCopyTexImage2D", (GLvoid *) NAME(glCopyTexImage2D) },
916 { "glCopyTexSubImage1D", (GLvoid *) NAME(glCopyTexSubImage1D) },
917 { "glCopyTexSubImage2D", (GLvoid *) NAME(glCopyTexSubImage2D) },
918 { "glDeleteTextures", (GLvoid *) NAME(glDeleteTextures) },
919 { "glDisableClientState", (GLvoid *) NAME(glDisableClientState) },
920 { "glDrawArrays", (GLvoid *) NAME(glDrawArrays) },
921 { "glDrawElements", (GLvoid *) NAME(glDrawElements) },
922 { "glEdgeFlagPointer", (GLvoid *) NAME(glEdgeFlagPointer) },
923 { "glEnableClientState", (GLvoid *) NAME(glEnableClientState) },
924 { "glGenTextures", (GLvoid *) NAME(glGenTextures) },
925 { "glGetPointerv", (GLvoid *) NAME(glGetPointerv) },
926 { "glIndexPointer", (GLvoid *) NAME(glIndexPointer) },
927 { "glIndexub", (GLvoid *) NAME(glIndexub) },
928 { "glIndexubv", (GLvoid *) NAME(glIndexubv) },
929 { "glInterleavedArrays", (GLvoid *) NAME(glInterleavedArrays) },
930 { "glIsTexture", (GLvoid *) NAME(glIsTexture) },
931 { "glNormalPointer", (GLvoid *) NAME(glNormalPointer) },
932 { "glPopClientAttrib", (GLvoid *) NAME(glPopClientAttrib) },
933 { "glPrioritizeTextures", (GLvoid *) NAME(glPrioritizeTextures) },
934 { "glPushClientAttrib", (GLvoid *) NAME(glPushClientAttrib) },
935 { "glTexCoordPointer", (GLvoid *) NAME(glTexCoordPointer) },
936 { "glTexSubImage1D", (GLvoid *) NAME(glTexSubImage1D) },
937 { "glTexSubImage2D", (GLvoid *) NAME(glTexSubImage2D) },
938 { "glVertexPointer", (GLvoid *) NAME(glVertexPointer) },
939#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +0000940
Brian Paul0c239fc1999-12-16 12:38:11 +0000941 /* GL 1.2 */
Brian Paul77aa8b92000-01-07 07:30:13 +0000942#ifdef GL_VERSION_1_2
943#define NAME(X) X
944#else
945#define NAME(X) NotImplemented
946#endif
947 { "glCopyTexSubImage3D", (GLvoid *) NAME(glCopyTexSubImage3D) },
948 { "glDrawRangeElements", (GLvoid *) NAME(glDrawRangeElements) },
949 { "glTexImage3D", (GLvoid *) NAME(glTexImage3D) },
950 { "glTexSubImage3D", (GLvoid *) NAME(glTexSubImage3D) },
951#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +0000952
Brian Paul0c239fc1999-12-16 12:38:11 +0000953 /* GL_ARB_imaging */
Brian Paul77aa8b92000-01-07 07:30:13 +0000954#ifdef GL_ARB_imaging
955#define NAME(X) X
956#else
957#define NAME(X) NotImplemented
958#endif
959 { "glBlendColor", (GLvoid *) NAME(glBlendColor) },
960 { "glBlendEquation", (GLvoid *) NAME(glBlendEquation) },
961 { "glColorSubTable", (GLvoid *) NAME(glColorSubTable) },
962 { "glColorTable", (GLvoid *) NAME(glColorTable) },
963 { "glColorTableParameterfv", (GLvoid *) NAME(glColorTableParameterfv) },
964 { "glColorTableParameteriv", (GLvoid *) NAME(glColorTableParameteriv) },
965 { "glConvolutionFilter1D", (GLvoid *) NAME(glConvolutionFilter1D) },
966 { "glConvolutionFilter2D", (GLvoid *) NAME(glConvolutionFilter2D) },
967 { "glConvolutionParameterf", (GLvoid *) NAME(glConvolutionParameterf) },
968 { "glConvolutionParameterfv", (GLvoid *) NAME(glConvolutionParameterfv) },
969 { "glConvolutionParameteri", (GLvoid *) NAME(glConvolutionParameteri) },
970 { "glConvolutionParameteriv", (GLvoid *) NAME(glConvolutionParameteriv) },
971 { "glCopyColorSubTable", (GLvoid *) NAME(glCopyColorSubTable) },
972 { "glCopyColorTable", (GLvoid *) NAME(glCopyColorTable) },
973 { "glCopyConvolutionFilter1D", (GLvoid *) NAME(glCopyConvolutionFilter1D) },
974 { "glCopyConvolutionFilter2D", (GLvoid *) NAME(glCopyConvolutionFilter2D) },
975 { "glGetColorTable", (GLvoid *) NAME(glGetColorTable) },
976 { "glGetColorTableParameterfv", (GLvoid *) NAME(glGetColorTableParameterfv) },
977 { "glGetColorTableParameteriv", (GLvoid *) NAME(glGetColorTableParameteriv) },
978 { "glGetConvolutionFilter", (GLvoid *) NAME(glGetConvolutionFilter) },
979 { "glGetConvolutionParameterfv", (GLvoid *) NAME(glGetConvolutionParameterfv) },
980 { "glGetConvolutionParameteriv", (GLvoid *) NAME(glGetConvolutionParameteriv) },
981 { "glGetHistogram", (GLvoid *) NAME(glGetHistogram) },
982 { "glGetHistogramParameterfv", (GLvoid *) NAME(glGetHistogramParameterfv) },
983 { "glGetHistogramParameteriv", (GLvoid *) NAME(glGetHistogramParameteriv) },
984 { "glGetMinmax", (GLvoid *) NAME(glGetMinmax) },
985 { "glGetMinmaxParameterfv", (GLvoid *) NAME(glGetMinmaxParameterfv) },
986 { "glGetMinmaxParameteriv", (GLvoid *) NAME(glGetMinmaxParameteriv) },
987 { "glGetSeparableFilter", (GLvoid *) NAME(glGetSeparableFilter) },
988 { "glHistogram", (GLvoid *) NAME(glHistogram) },
989 { "glMinmax", (GLvoid *) NAME(glMinmax) },
990 { "glResetHistogram", (GLvoid *) NAME(glResetHistogram) },
991 { "glResetMinmax", (GLvoid *) NAME(glResetMinmax) },
992 { "glSeparableFilter2D", (GLvoid *) NAME(glSeparableFilter2D) },
993#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +0000994
Brian Paul67661b01999-12-15 12:52:31 +0000995 /* GL_ARB_multitexture */
Brian Paul77aa8b92000-01-07 07:30:13 +0000996#ifdef GL_ARB_multitexture
997#define NAME(X) X
998#else
999#define NAME(X) NotImplemented
1000#endif
1001 { "glActiveTextureARB", (GLvoid *) NAME(glActiveTextureARB) },
1002 { "glClientActiveTextureARB", (GLvoid *) NAME(glClientActiveTextureARB) },
1003 { "glMultiTexCoord1dARB", (GLvoid *) NAME(glMultiTexCoord1dARB) },
1004 { "glMultiTexCoord1dvARB", (GLvoid *) NAME(glMultiTexCoord1dvARB) },
1005 { "glMultiTexCoord1fARB", (GLvoid *) NAME(glMultiTexCoord1fARB) },
1006 { "glMultiTexCoord1fvARB", (GLvoid *) NAME(glMultiTexCoord1fvARB) },
1007 { "glMultiTexCoord1iARB", (GLvoid *) NAME(glMultiTexCoord1iARB) },
1008 { "glMultiTexCoord1ivARB", (GLvoid *) NAME(glMultiTexCoord1ivARB) },
1009 { "glMultiTexCoord1sARB", (GLvoid *) NAME(glMultiTexCoord1sARB) },
1010 { "glMultiTexCoord1svARB", (GLvoid *) NAME(glMultiTexCoord1svARB) },
1011 { "glMultiTexCoord2dARB", (GLvoid *) NAME(glMultiTexCoord2dARB) },
1012 { "glMultiTexCoord2dvARB", (GLvoid *) NAME(glMultiTexCoord2dvARB) },
1013 { "glMultiTexCoord2fARB", (GLvoid *) NAME(glMultiTexCoord2fARB) },
1014 { "glMultiTexCoord2fvARB", (GLvoid *) NAME(glMultiTexCoord2fvARB) },
1015 { "glMultiTexCoord2iARB", (GLvoid *) NAME(glMultiTexCoord2iARB) },
1016 { "glMultiTexCoord2ivARB", (GLvoid *) NAME(glMultiTexCoord2ivARB) },
1017 { "glMultiTexCoord2sARB", (GLvoid *) NAME(glMultiTexCoord2sARB) },
1018 { "glMultiTexCoord2svARB", (GLvoid *) NAME(glMultiTexCoord2svARB) },
1019 { "glMultiTexCoord3dARB", (GLvoid *) NAME(glMultiTexCoord3dARB) },
1020 { "glMultiTexCoord3dvARB", (GLvoid *) NAME(glMultiTexCoord3dvARB) },
1021 { "glMultiTexCoord3fARB", (GLvoid *) NAME(glMultiTexCoord3fARB) },
1022 { "glMultiTexCoord3fvARB", (GLvoid *) NAME(glMultiTexCoord3fvARB) },
1023 { "glMultiTexCoord3iARB", (GLvoid *) NAME(glMultiTexCoord3iARB) },
1024 { "glMultiTexCoord3ivARB", (GLvoid *) NAME(glMultiTexCoord3ivARB) },
1025 { "glMultiTexCoord3sARB", (GLvoid *) NAME(glMultiTexCoord3sARB) },
1026 { "glMultiTexCoord3svARB", (GLvoid *) NAME(glMultiTexCoord3svARB) },
1027 { "glMultiTexCoord4dARB", (GLvoid *) NAME(glMultiTexCoord4dARB) },
1028 { "glMultiTexCoord4dvARB", (GLvoid *) NAME(glMultiTexCoord4dvARB) },
1029 { "glMultiTexCoord4fARB", (GLvoid *) NAME(glMultiTexCoord4fARB) },
1030 { "glMultiTexCoord4fvARB", (GLvoid *) NAME(glMultiTexCoord4fvARB) },
1031 { "glMultiTexCoord4iARB", (GLvoid *) NAME(glMultiTexCoord4iARB) },
1032 { "glMultiTexCoord4ivARB", (GLvoid *) NAME(glMultiTexCoord4ivARB) },
1033 { "glMultiTexCoord4sARB", (GLvoid *) NAME(glMultiTexCoord4sARB) },
1034 { "glMultiTexCoord4svARB", (GLvoid *) NAME(glMultiTexCoord4svARB) },
1035#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +00001036
Brian Paul67661b01999-12-15 12:52:31 +00001037 /* 2. GL_EXT_blend_color */
Brian Paul77aa8b92000-01-07 07:30:13 +00001038#ifdef GL_EXT_blend_color
1039#define NAME(X) X
1040#else
1041#define NAME(X) NotImplemented
1042#endif
1043 { "glBlendColorEXT", (GLvoid *) NAME(glBlendColorEXT) },
1044#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001045
1046 /* 3. GL_EXT_polygon_offset */
Brian Paul77aa8b92000-01-07 07:30:13 +00001047#ifdef GL_EXT_polygon_offset
1048#define NAME(X) X
1049#else
1050#define NAME(X) NotImplemented
1051#endif
1052 { "glPolygonOffsetEXT", (GLvoid *) NAME(glPolygonOffsetEXT) },
1053#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001054
Brian Paul0c239fc1999-12-16 12:38:11 +00001055 /* 6. GL_EXT_texture3D */
Brian Paul77aa8b92000-01-07 07:30:13 +00001056#ifdef GL_EXT_texture3D
1057#define NAME(X) X
1058#else
1059#define NAME(X) NotImplemented
1060#endif
1061 { "glCopyTexSubImage3DEXT", (GLvoid *) NAME(glCopyTexSubImage3DEXT) },
1062 { "glTexImage3DEXT", (GLvoid *) NAME(glTexImage3DEXT) },
1063 { "glTexSubImage3DEXT", (GLvoid *) NAME(glTexSubImage3DEXT) },
1064#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001065
1066 /* 7. GL_SGI_texture_filter4 */
Brian Paul77aa8b92000-01-07 07:30:13 +00001067#ifdef GL_SGI_texture_filter4
1068#define NAME(X) X
1069#else
1070#define NAME(X) NotImplemented
1071#endif
1072 { "glGetTexFilterFuncSGIS", (GLvoid *) NAME(glGetTexFilterFuncSGIS) },
1073 { "glTexFilterFuncSGIS", (GLvoid *) NAME(glTexFilterFuncSGIS) },
1074#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001075
1076 /* 9. GL_EXT_subtexture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001077#ifdef GL_EXT_subtexture
1078#define NAME(X) X
1079#else
1080#define NAME(X) NotImplemented
1081#endif
1082 { "glTexSubImage1DEXT", (GLvoid *) NAME(glTexSubImage1DEXT) },
1083 { "glTexSubImage2DEXT", (GLvoid *) NAME(glTexSubImage2DEXT) },
1084#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001085
1086 /* 10. GL_EXT_copy_texture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001087#ifdef GL_EXT_copy_texture
1088#define NAME(X) X
1089#else
1090#define NAME(X) NotImplemented
1091#endif
1092 { "glCopyTexImage1DEXT", (GLvoid *) NAME(glCopyTexImage1DEXT) },
1093 { "glCopyTexImage2DEXT", (GLvoid *) NAME(glCopyTexImage2DEXT) },
1094 { "glCopyTexSubImage1DEXT", (GLvoid *) NAME(glCopyTexSubImage1DEXT) },
1095 { "glCopyTexSubImage2DEXT", (GLvoid *) NAME(glCopyTexSubImage2DEXT) },
1096#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001097
1098 /* 11. GL_EXT_histogram */
Brian Paul77aa8b92000-01-07 07:30:13 +00001099#ifdef GL_EXT_histogram
1100#define NAME(X) X
1101#else
1102#define NAME(X) NotImplemented
1103#endif
1104 { "glGetHistogramEXT", (GLvoid *) NAME(glGetHistogramEXT) },
1105 { "glGetHistogramParameterfvEXT", (GLvoid *) NAME(glGetHistogramParameterfvEXT) },
1106 { "glGetHistogramParameterivEXT", (GLvoid *) NAME(glGetHistogramParameterivEXT) },
1107 { "glGetMinmaxEXT", (GLvoid *) NAME(glGetMinmaxEXT) },
1108 { "glGetMinmaxParameterfvEXT", (GLvoid *) NAME(glGetMinmaxParameterfvEXT) },
1109 { "glGetMinmaxParameterivEXT", (GLvoid *) NAME(glGetMinmaxParameterivEXT) },
1110 { "glHistogramEXT", (GLvoid *) NAME(glHistogramEXT) },
1111 { "glMinmaxEXT", (GLvoid *) NAME(glMinmaxEXT) },
1112 { "glResetHistogramEXT", (GLvoid *) NAME(glResetHistogramEXT) },
1113 { "glResetMinmaxEXT", (GLvoid *) NAME(glResetMinmaxEXT) },
1114#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001115
1116 /* 12. GL_EXT_convolution */
Brian Paul77aa8b92000-01-07 07:30:13 +00001117#ifdef GL_EXT_convolution
1118#define NAME(X) X
1119#else
1120#define NAME(X) NotImplemented
1121#endif
1122 { "glConvolutionFilter1DEXT", (GLvoid *) NAME(glConvolutionFilter1DEXT) },
1123 { "glConvolutionFilter2DEXT", (GLvoid *) NAME(glConvolutionFilter2DEXT) },
1124 { "glConvolutionParameterfEXT", (GLvoid *) NAME(glConvolutionParameterfEXT) },
1125 { "glConvolutionParameterfvEXT", (GLvoid *) NAME(glConvolutionParameterfvEXT) },
1126 { "glConvolutionParameteriEXT", (GLvoid *) NAME(glConvolutionParameteriEXT) },
1127 { "glConvolutionParameterivEXT", (GLvoid *) NAME(glConvolutionParameterivEXT) },
1128 { "glCopyConvolutionFilter1DEXT", (GLvoid *) NAME(glCopyConvolutionFilter1DEXT) },
1129 { "glCopyConvolutionFilter2DEXT", (GLvoid *) NAME(glCopyConvolutionFilter2DEXT) },
1130 { "glGetConvolutionFilterEXT", (GLvoid *) NAME(glGetConvolutionFilterEXT) },
1131 { "glGetConvolutionParameterivEXT", (GLvoid *) NAME(glGetConvolutionParameterivEXT) },
1132 { "glGetConvolutionParameterfvEXT", (GLvoid *) NAME(glGetConvolutionParameterfvEXT) },
1133 { "glGetSeparableFilterEXT", (GLvoid *) NAME(glGetSeparableFilterEXT) },
1134 { "glSeparableFilter2DEXT", (GLvoid *) NAME(glSeparableFilter2DEXT) },
1135#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001136
1137 /* 14. GL_SGI_color_table */
Brian Paul77aa8b92000-01-07 07:30:13 +00001138#ifdef GL_SGI_color_table
1139#define NAME(X) X
1140#else
1141#define NAME(X) NotImplemented
1142#endif
1143 { "glColorTableSGI", (GLvoid *) NAME(glColorTableSGI) },
1144 { "glColorTableParameterfvSGI", (GLvoid *) NAME(glColorTableParameterfvSGI) },
1145 { "glColorTableParameterivSGI", (GLvoid *) NAME(glColorTableParameterivSGI) },
1146 { "glCopyColorTableSGI", (GLvoid *) NAME(glCopyColorTableSGI) },
1147 { "glGetColorTableSGI", (GLvoid *) NAME(glGetColorTableSGI) },
1148 { "glGetColorTableParameterfvSGI", (GLvoid *) NAME(glGetColorTableParameterfvSGI) },
1149 { "glGetColorTableParameterivSGI", (GLvoid *) NAME(glGetColorTableParameterivSGI) },
1150#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001151
1152 /* 15. GL_SGIS_pixel_texture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001153#ifdef GL_SGIS_pixel_texture
1154#define NAME(X) X
1155#else
1156#define NAME(X) NotImplemented
1157#endif
1158 { "glPixelTexGenParameterfSGIS", (GLvoid *) NAME(glPixelTexGenParameterfSGIS) },
1159 { "glPixelTexGenParameteriSGIS", (GLvoid *) NAME(glPixelTexGenParameteriSGIS) },
1160 { "glGetPixelTexGenParameterfvSGIS", (GLvoid *) NAME(glGetPixelTexGenParameterfvSGIS) },
1161 { "glGetPixelTexGenParameterivSGIS", (GLvoid *) NAME(glGetPixelTexGenParameterivSGIS) },
1162#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001163
1164 /* 16. GL_SGIS_texture4D */
Brian Paul77aa8b92000-01-07 07:30:13 +00001165#ifdef GL_SGIS_texture4D
1166#define NAME(X) X
1167#else
1168#define NAME(X) NotImplemented
1169#endif
1170 { "glTexImage4DSGIS", (GLvoid *) NAME(glTexImage4DSGIS) },
1171 { "glTexSubImage4DSGIS", (GLvoid *) NAME(glTexSubImage4DSGIS) },
1172#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001173
1174 /* 20. GL_EXT_texture_object */
Brian Paul77aa8b92000-01-07 07:30:13 +00001175#ifdef GL_EXT_texture_object
1176#define NAME(X) X
1177#else
1178#define NAME(X) NotImplemented
1179#endif
1180 { "glAreTexturesResidentEXT", (GLvoid *) NAME(glAreTexturesResidentEXT) },
1181 { "glBindTextureEXT", (GLvoid *) NAME(glBindTextureEXT) },
1182 { "glDeleteTexturesEXT", (GLvoid *) NAME(glDeleteTexturesEXT) },
1183 { "glGenTexturesEXT", (GLvoid *) NAME(glGenTexturesEXT) },
1184 { "glIsTextureEXT", (GLvoid *) NAME(glIsTextureEXT) },
1185 { "glPrioritizeTexturesEXT", (GLvoid *) NAME(glPrioritizeTexturesEXT) },
1186#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001187
1188 /* 21. GL_SGIS_detail_texture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001189#ifdef GL_SGIS_detail_texture
1190#define NAME(X) X
1191#else
1192#define NAME(X) NotImplemented
1193#endif
1194 { "glDetailTexFuncSGIS", (GLvoid *) NAME(glDetailTexFuncSGIS) },
1195 { "glGetDetailTexFuncSGIS", (GLvoid *) NAME(glGetDetailTexFuncSGIS) },
1196#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001197
1198 /* 22. GL_SGIS_sharpen_texture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001199#ifdef GL_SGIS_sharpen_texture
1200#define NAME(X) X
1201#else
1202#define NAME(X) NotImplemented
1203#endif
1204 { "glGetSharpenTexFuncSGIS", (GLvoid *) NAME(glGetSharpenTexFuncSGIS) },
1205 { "glSharpenTexFuncSGIS", (GLvoid *) NAME(glSharpenTexFuncSGIS) },
1206#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001207
1208 /* 25. GL_SGIS_multisample */
Brian Paul77aa8b92000-01-07 07:30:13 +00001209#ifdef GL_SGIS_multisample
1210#define NAME(X) X
1211#else
1212#define NAME(X) NotImplemented
1213#endif
1214 { "glSampleMaskSGIS", (GLvoid *) NAME(glSampleMaskSGIS) },
1215 { "glSamplePatternSGIS", (GLvoid *) NAME(glSamplePatternSGIS) },
1216#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001217
1218 /* 30. GL_EXT_vertex_array */
Brian Paul77aa8b92000-01-07 07:30:13 +00001219#ifdef GL_EXT_vertex_array
1220#define NAME(X) X
1221#else
1222#define NAME(X) NotImplemented
1223#endif
1224 { "glArrayElementEXT", (GLvoid *) NAME(glArrayElementEXT) },
1225 { "glColorPointerEXT", (GLvoid *) NAME(glColorPointerEXT) },
1226 { "glDrawArraysEXT", (GLvoid *) NAME(glDrawArraysEXT) },
1227 { "glEdgeFlagPointerEXT", (GLvoid *) NAME(glEdgeFlagPointerEXT) },
1228 { "glGetPointervEXT", (GLvoid *) NAME(glGetPointervEXT) },
1229 { "glIndexPointerEXT", (GLvoid *) NAME(glIndexPointerEXT) },
1230 { "glNormalPointerEXT", (GLvoid *) NAME(glNormalPointerEXT) },
1231 { "glTexCoordPointerEXT", (GLvoid *) NAME(glTexCoordPointerEXT) },
1232 { "glVertexPointerEXT", (GLvoid *) NAME(glVertexPointerEXT) },
1233#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001234
1235 /* 37. GL_EXT_blend_minmax */
Brian Paul77aa8b92000-01-07 07:30:13 +00001236#ifdef GL_EXT_blend_minmax
1237#define NAME(X) X
1238#else
1239#define NAME(X) NotImplemented
1240#endif
1241 { "glBlendEquationEXT", (GLvoid *) NAME(glBlendEquationEXT) },
1242#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001243
1244 /* 52. GL_SGIX_sprite */
Brian Paul77aa8b92000-01-07 07:30:13 +00001245#ifdef GL_SGIX_sprite
1246#define NAME(X) X
1247#else
1248#define NAME(X) NotImplemented
1249#endif
1250 { "glSpriteParameterfSGIX", (GLvoid *) NAME(glSpriteParameterfSGIX) },
1251 { "glSpriteParameterfvSGIX", (GLvoid *) NAME(glSpriteParameterfvSGIX) },
1252 { "glSpriteParameteriSGIX", (GLvoid *) NAME(glSpriteParameteriSGIX) },
1253 { "glSpriteParameterivSGIX", (GLvoid *) NAME(glSpriteParameterivSGIX) },
1254#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001255
Brian Paul67661b01999-12-15 12:52:31 +00001256 /* 54. GL_EXT_point_parameters */
Brian Paul77aa8b92000-01-07 07:30:13 +00001257#ifdef GL_EXT_point_parameters
1258#define NAME(X) X
1259#else
1260#define NAME(X) NotImplemented
1261#endif
1262 { "glPointParameterfEXT", (GLvoid *) NAME(glPointParameterfEXT) },
1263 { "glPointParameterfvEXT", (GLvoid *) NAME(glPointParameterfvEXT) },
1264#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001265
1266 /* 55. GL_SGIX_instruments */
Brian Paul77aa8b92000-01-07 07:30:13 +00001267#ifdef GL_SGIX_instruments
1268#define NAME(X) X
1269#else
1270#define NAME(X) NotImplemented
1271#endif
1272 { "glInstrumentsBufferSGIX", (GLvoid *) NAME(glInstrumentsBufferSGIX) },
1273 { "glStartInstrumentsSGIX", (GLvoid *) NAME(glStartInstrumentsSGIX) },
1274 { "glStopInstrumentsSGIX", (GLvoid *) NAME(glStopInstrumentsSGIX) },
1275 { "glReadInstrumentsSGIX", (GLvoid *) NAME(glReadInstrumentsSGIX) },
1276 { "glPollInstrumentsSGIX", (GLvoid *) NAME(glPollInstrumentsSGIX) },
1277 { "glGetInstrumentsSGIX", (GLvoid *) NAME(glGetInstrumentsSGIX) },
1278#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001279
1280 /* 57. GL_SGIX_framezoom */
Brian Paul77aa8b92000-01-07 07:30:13 +00001281#ifdef GL_SGIX_framezoom
1282#define NAME(X) X
1283#else
1284#define NAME(X) NotImplemented
1285#endif
1286 { "glFrameZoomSGIX", (GLvoid *) NAME(glFrameZoomSGIX) },
1287#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001288
1289 /* 60. GL_SGIX_reference_plane */
Brian Paul77aa8b92000-01-07 07:30:13 +00001290#ifdef GL_SGIX_reference_plane
1291#define NAME(X) X
1292#else
1293#define NAME(X) NotImplemented
1294#endif
1295 { "glReferencePlaneSGIX", (GLvoid *) NAME(glReferencePlaneSGIX) },
1296#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001297
1298 /* 61. GL_SGIX_flush_raster */
Brian Paul77aa8b92000-01-07 07:30:13 +00001299#ifdef GL_SGIX_flush_raster
1300#define NAME(X) X
1301#else
1302#define NAME(X) NotImplemented
1303#endif
1304 { "glFlushRasterSGIX", (GLvoid *) NAME(glFlushRasterSGIX) },
1305#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001306
1307 /* 66. GL_HP_image_transform */
Brian Paul77aa8b92000-01-07 07:30:13 +00001308#ifdef GL_HP_image_transform
1309#define NAME(X) X
1310#else
1311#define NAME(X) NotImplemented
1312#endif
1313 { "glGetImageTransformParameterfvHP", (GLvoid *) NAME(glGetImageTransformParameterfvHP) },
1314 { "glGetImageTransformParameterivHP", (GLvoid *) NAME(glGetImageTransformParameterivHP) },
1315 { "glImageTransformParameterfHP", (GLvoid *) NAME(glImageTransformParameterfHP) },
1316 { "glImageTransformParameterfvHP", (GLvoid *) NAME(glImageTransformParameterfvHP) },
1317 { "glImageTransformParameteriHP", (GLvoid *) NAME(glImageTransformParameteriHP) },
1318 { "glImageTransformParameterivHP", (GLvoid *) NAME(glImageTransformParameterivHP) },
1319#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001320
1321 /* 74. GL_EXT_color_subtable */
Brian Paul77aa8b92000-01-07 07:30:13 +00001322#ifdef GL_EXT_color_subtable
1323#define NAME(X) X
1324#else
1325#define NAME(X) NotImplemented
1326#endif
1327 { "glColorSubTableEXT", (GLvoid *) NAME(glColorSubTableEXT) },
1328 { "glCopyColorSubTableEXT", (GLvoid *) NAME(glCopyColorSubTableEXT) },
1329#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001330
1331 /* 77. GL_PGI_misc_hints */
Brian Paul77aa8b92000-01-07 07:30:13 +00001332#ifdef GL_PGI_misc_hints
1333#define NAME(X) X
1334#else
1335#define NAME(X) NotImplemented
1336#endif
1337 { "glHintPGI", (GLvoid *) NAME(glHintPGI) },
1338#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001339
1340 /* 78. GL_EXT_paletted_texture */
Brian Paul77aa8b92000-01-07 07:30:13 +00001341#ifdef GL_EXT_paletted_texture
1342#define NAME(X) X
1343#else
1344#define NAME(X) NotImplemented
1345#endif
1346 { "glColorTableEXT", (GLvoid *) NAME(glColorTableEXT) },
1347 { "glGetColorTableEXT", (GLvoid *) NAME(glGetColorTableEXT) },
1348 { "glGetColorTableParameterfvEXT", (GLvoid *) NAME(glGetColorTableParameterfvEXT) },
1349 { "glGetColorTableParameterivEXT", (GLvoid *) NAME(glGetColorTableParameterivEXT) },
1350#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001351
Brian Paul0c239fc1999-12-16 12:38:11 +00001352 /* 80. GL_SGIX_list_priority */
Brian Paul77aa8b92000-01-07 07:30:13 +00001353#ifdef GL_SGIX_list_priority
1354#define NAME(X) X
1355#else
1356#define NAME(X) NotImplemented
1357#endif
1358 { "glGetListParameterfvSGIX", (GLvoid *) NAME(glGetListParameterfvSGIX) },
1359 { "glGetListParameterivSGIX", (GLvoid *) NAME(glGetListParameterivSGIX) },
1360 { "glListParameterfSGIX", (GLvoid *) NAME(glListParameterfSGIX) },
1361 { "glListParameterfvSGIX", (GLvoid *) NAME(glListParameterfvSGIX) },
1362 { "glListParameteriSGIX", (GLvoid *) NAME(glListParameteriSGIX) },
1363 { "glListParameterivSGIX", (GLvoid *) NAME(glListParameterivSGIX) },
1364#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001365
1366 /* 94. GL_EXT_index_material */
Brian Paul77aa8b92000-01-07 07:30:13 +00001367#ifdef GL_EXT_index_material
1368#define NAME(X) X
1369#else
1370#define NAME(X) NotImplemented
1371#endif
1372 { "glIndexMaterialEXT", (GLvoid *) NAME(glIndexMaterialEXT) },
1373#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001374
1375 /* 95. GL_EXT_index_func */
Brian Paul77aa8b92000-01-07 07:30:13 +00001376#ifdef GL_EXT_index_func
1377#define NAME(X) X
1378#else
1379#define NAME(X) NotImplemented
1380#endif
1381 { "glIndexFuncEXT", (GLvoid *) NAME(glIndexFuncEXT) },
1382#undef NAME
Brian Paul0c239fc1999-12-16 12:38:11 +00001383
Brian Paul67661b01999-12-15 12:52:31 +00001384 /* 97. GL_EXT_compiled_vertex_array */
Brian Paul77aa8b92000-01-07 07:30:13 +00001385#ifdef GL_EXT_compiled_vertex_array
1386#define NAME(X) X
1387#else
1388#define NAME(X) NotImplemented
1389#endif
1390 { "glLockArraysEXT", (GLvoid *) NAME(glLockArraysEXT) },
1391 { "glUnlockArraysEXT", (GLvoid *) NAME(glUnlockArraysEXT) },
1392#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001393
Brian Paul0c239fc1999-12-16 12:38:11 +00001394 /* 98. GL_EXT_cull_vertex */
Brian Paul77aa8b92000-01-07 07:30:13 +00001395#ifdef GL_EXT_cull_vertex
1396#define NAME(X) X
1397#else
1398#define NAME(X) NotImplemented
1399#endif
1400 { "glCullParameterfvEXT", (GLvoid *) NAME(glCullParameterfvEXT) },
1401 { "glCullParameterdvEXT", (GLvoid *) NAME(glCullParameterdvEXT) },
1402#undef NAME
Brian Paul67661b01999-12-15 12:52:31 +00001403
1404 /* 173. GL_EXT/INGR_blend_func_separate */
Brian Paul77aa8b92000-01-07 07:30:13 +00001405#ifdef GL_INGR_blend_func_separate
1406#define NAME(X) X
1407#else
1408#define NAME(X) NotImplemented
1409#endif
1410 { "glBlendFuncSeparateINGR", (GLvoid *) NAME(glBlendFuncSeparateINGR) },
1411#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +00001412
Brian Paul67661b01999-12-15 12:52:31 +00001413 /* GL_MESA_window_pos */
Brian Paul77aa8b92000-01-07 07:30:13 +00001414#ifdef MESA_window_pos
1415#define NAME(X) X
1416#else
1417#define NAME(X) NotImplemented
1418#endif
1419 { "glWindowPos4fMESA", (GLvoid *) NAME(glWindowPos4fMESA) },
1420#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +00001421
Brian Paul67661b01999-12-15 12:52:31 +00001422 /* GL_MESA_resize_buffers */
Brian Paul77aa8b92000-01-07 07:30:13 +00001423#ifdef MESA_resize_buffers
1424#define NAME(X) X
1425#else
1426#define NAME(X) NotImplemented
1427#endif
1428 { "glResizeBuffersMESA", (GLvoid *) NAME(glResizeBuffersMESA) },
1429#undef NAME
Brian Paul91bcefa1999-11-27 21:30:40 +00001430
Brian Paul67661b01999-12-15 12:52:31 +00001431 /* GL_ARB_transpose_matrix */
Brian Paul77aa8b92000-01-07 07:30:13 +00001432#ifdef GL_ARB_transpose_matrix
1433#define NAME(X) X
1434#else
1435#define NAME(X) NotImplemented
1436#endif
1437 { "glLoadTransposeMatrixdARB", (GLvoid *) NAME(glLoadTransposeMatrixdARB) },
1438 { "glLoadTransposeMatrixfARB", (GLvoid *) NAME(glLoadTransposeMatrixfARB) },
1439 { "glMultTransposeMatrixdARB", (GLvoid *) NAME(glMultTransposeMatrixdARB) },
1440 { "glMultTransposeMatrixfARB", (GLvoid *) NAME(glMultTransposeMatrixfARB) },
1441#undef NAME
1442
1443 /*
1444 * XXX many more extenstion functions to add.
1445 */
Brian Paulcd963881999-12-10 20:01:06 +00001446
Brian Paul67661b01999-12-15 12:52:31 +00001447 { NULL, NULL } /* end of list marker */
Brian Paul91bcefa1999-11-27 21:30:40 +00001448};
Brian Paul7fb54ae1999-11-19 22:33:50 +00001449