Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 54 → Rev 55

/shark/trunk/ports/mesa/include/GL/dmesa.h
0,0 → 1,79
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* DOS/DJGPP device driver v1.2 for Mesa 4.1
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#ifndef DMESA_H_included
#define DMESA_H_included
 
#define DMESA_MAJOR_VERSION 5
#define DMESA_MINOR_VERSION 0
 
typedef struct dmesa_context *DMesaContext;
typedef struct dmesa_visual *DMesaVisual;
typedef struct dmesa_buffer *DMesaBuffer;
 
#ifdef __cplusplus
extern "C" {
#endif
 
DMesaVisual DMesaCreateVisual (GLint width, GLint height,
GLint colDepth,
GLboolean dbFlag,
GLint depthSize,
GLint stencilSize,
GLint accumSize);
 
void DMesaDestroyVisual (DMesaVisual v);
 
DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
GLint xpos, GLint ypos,
GLint width, GLint height);
 
void DMesaDestroyBuffer (DMesaBuffer b);
 
DMesaContext DMesaCreateContext (DMesaVisual visual, DMesaContext share);
 
void DMesaDestroyContext (DMesaContext c);
 
GLboolean DMesaViewport (DMesaBuffer b,
GLint xpos, GLint ypos,
GLint width, GLint height);
 
GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b);
 
void DMesaSwapBuffers (DMesaBuffer b);
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/glx.h
0,0 → 1,493
/* $Id: glx.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef GLX_H
#define GLX_H
 
 
#ifdef __VMS
#include <GL/vms_x_fix.h>
# ifdef __cplusplus
/* VMS Xlib.h gives problems with C++.
* this avoids a bunch of trivial warnings */
#pragma message disable nosimpint
#endif
#endif
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef __VMS
# ifdef __cplusplus
#pragma message enable nosimpint
#endif
#endif
#include <GL/gl.h>
 
 
#if defined(USE_MGL_NAMESPACE)
#include <GL/glx_mangle.h>
#endif
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#define GLX_VERSION_1_1 1
#define GLX_VERSION_1_2 1
#define GLX_VERSION_1_3 1
#define GLX_VERSION_1_4 1
 
#define GLX_EXTENSION_NAME "GLX"
 
 
 
/*
* Tokens for glXChooseVisual and glXGetConfig:
*/
#define GLX_USE_GL 1
#define GLX_BUFFER_SIZE 2
#define GLX_LEVEL 3
#define GLX_RGBA 4
#define GLX_DOUBLEBUFFER 5
#define GLX_STEREO 6
#define GLX_AUX_BUFFERS 7
#define GLX_RED_SIZE 8
#define GLX_GREEN_SIZE 9
#define GLX_BLUE_SIZE 10
#define GLX_ALPHA_SIZE 11
#define GLX_DEPTH_SIZE 12
#define GLX_STENCIL_SIZE 13
#define GLX_ACCUM_RED_SIZE 14
#define GLX_ACCUM_GREEN_SIZE 15
#define GLX_ACCUM_BLUE_SIZE 16
#define GLX_ACCUM_ALPHA_SIZE 17
 
 
/*
* Error codes returned by glXGetConfig:
*/
#define GLX_BAD_SCREEN 1
#define GLX_BAD_ATTRIBUTE 2
#define GLX_NO_EXTENSION 3
#define GLX_BAD_VISUAL 4
#define GLX_BAD_CONTEXT 5
#define GLX_BAD_VALUE 6
#define GLX_BAD_ENUM 7
 
 
/*
* GLX 1.1 and later:
*/
#define GLX_VENDOR 1
#define GLX_VERSION 2
#define GLX_EXTENSIONS 3
 
 
/*
* GLX 1.3 and later:
*/
#define GLX_CONFIG_CAVEAT 0x20
#define GLX_DONT_CARE 0xFFFFFFFF
#define GLX_SLOW_CONFIG 0x8001
#define GLX_NON_CONFORMANT_CONFIG 0x800D
#define GLX_X_VISUAL_TYPE 0x22
#define GLX_TRANSPARENT_TYPE 0x23
#define GLX_TRANSPARENT_INDEX_VALUE 0x24
#define GLX_TRANSPARENT_RED_VALUE 0x25
#define GLX_TRANSPARENT_GREEN_VALUE 0x26
#define GLX_TRANSPARENT_BLUE_VALUE 0x27
#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
#define GLX_MAX_PBUFFER_WIDTH 0x8016
#define GLX_MAX_PBUFFER_HEIGHT 0x8017
#define GLX_MAX_PBUFFER_PIXELS 0x8018
#define GLX_PRESERVED_CONTENTS 0x801B
#define GLX_LARGEST_PBUFFER 0x801C
#define GLX_WIDTH 0x801D
#define GLX_HEIGHT 0x801E
#define GLX_EVENT_MASK 0x801F
#define GLX_DRAWABLE_TYPE 0x8010
#define GLX_FBCONFIG_ID 0x8013
#define GLX_VISUAL_ID 0x800B
#define GLX_WINDOW_BIT 0x00000001
#define GLX_PIXMAP_BIT 0x00000002
#define GLX_PBUFFER_BIT 0x00000004
#define GLX_AUX_BUFFERS_BIT 0x00000010
#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
#define GLX_DEPTH_BUFFER_BIT 0x00000020
#define GLX_STENCIL_BUFFER_BIT 0x00000040
#define GLX_ACCUM_BUFFER_BIT 0x00000080
#define GLX_DRAWABLE_TYPE 0x8010
#define GLX_RENDER_TYPE 0x8011
#define GLX_X_RENDERABLE 0x8012
#define GLX_NONE 0x8000
#define GLX_TRUE_COLOR 0x8002
#define GLX_DIRECT_COLOR 0x8003
#define GLX_PSEUDO_COLOR 0x8004
#define GLX_STATIC_COLOR 0x8005
#define GLX_GRAY_SCALE 0x8006
#define GLX_STATIC_GRAY 0x8007
#define GLX_TRANSPARENT_RGB 0x8008
#define GLX_TRANSPARENT_INDEX 0x8009
#define GLX_RGBA_TYPE 0x8014
#define GLX_COLOR_INDEX_TYPE 0x8015
#define GLX_COLOR_INDEX_BIT 0x00000002
#define GLX_RGBA_BIT 0x00000001
#define GLX_SCREEN 0x800C
#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
#define GLX_DAMAGED 0x8020
#define GLX_SAVED 0x8021
#define GLX_WINDOW 0x8022
#define GLX_PBUFFER 0x8023
#define GLX_PBUFFER_HEIGHT 0x8040
#define GLX_PBUFFER_WIDTH 0x8041
 
 
/*
* GLX 1.4 and later:
*/
#define GLX_SAMPLE_BUFFERS 0x186a0 /*100000*/
#define GLX_SAMPLES 0x186a1 /*100001*/
 
 
 
typedef struct __GLXcontextRec *GLXContext;
typedef XID GLXPixmap;
typedef XID GLXDrawable;
/* GLX 1.3 and later */
typedef struct __GLXFBConfigRec *GLXFBConfig;
typedef XID GLXFBConfigID;
typedef XID GLXContextID;
typedef XID GLXWindow;
typedef XID GLXPbuffer;
 
 
 
extern XVisualInfo* glXChooseVisual( Display *dpy, int screen,
int *attribList );
 
extern GLXContext glXCreateContext( Display *dpy, XVisualInfo *vis,
GLXContext shareList, Bool direct );
 
extern void glXDestroyContext( Display *dpy, GLXContext ctx );
 
extern Bool glXMakeCurrent( Display *dpy, GLXDrawable drawable,
GLXContext ctx);
 
extern void glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
unsigned long mask );
 
extern void glXSwapBuffers( Display *dpy, GLXDrawable drawable );
 
extern GLXPixmap glXCreateGLXPixmap( Display *dpy, XVisualInfo *visual,
Pixmap pixmap );
 
extern void glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap );
 
extern Bool glXQueryExtension( Display *dpy, int *errorb, int *event );
 
extern Bool glXQueryVersion( Display *dpy, int *maj, int *min );
 
extern Bool glXIsDirect( Display *dpy, GLXContext ctx );
 
extern int glXGetConfig( Display *dpy, XVisualInfo *visual,
int attrib, int *value );
 
extern GLXContext glXGetCurrentContext( void );
 
extern GLXDrawable glXGetCurrentDrawable( void );
 
extern void glXWaitGL( void );
 
extern void glXWaitX( void );
 
extern void glXUseXFont( Font font, int first, int count, int list );
 
 
 
/* GLX 1.1 and later */
extern const char *glXQueryExtensionsString( Display *dpy, int screen );
 
extern const char *glXQueryServerString( Display *dpy, int screen, int name );
 
extern const char *glXGetClientString( Display *dpy, int name );
 
 
/* GLX 1.2 and later */
extern Display *glXGetCurrentDisplay( void );
 
 
/* GLX 1.3 and later */
extern GLXFBConfig *glXChooseFBConfig( Display *dpy, int screen,
const int *attribList, int *nitems );
 
extern int glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
int attribute, int *value );
 
extern GLXFBConfig *glXGetFBConfigs( Display *dpy, int screen,
int *nelements );
 
extern XVisualInfo *glXGetVisualFromFBConfig( Display *dpy,
GLXFBConfig config );
 
extern GLXWindow glXCreateWindow( Display *dpy, GLXFBConfig config,
Window win, const int *attribList );
 
extern void glXDestroyWindow( Display *dpy, GLXWindow window );
 
extern GLXPixmap glXCreatePixmap( Display *dpy, GLXFBConfig config,
Pixmap pixmap, const int *attribList );
 
extern void glXDestroyPixmap( Display *dpy, GLXPixmap pixmap );
 
extern GLXPbuffer glXCreatePbuffer( Display *dpy, GLXFBConfig config,
const int *attribList );
 
extern void glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf );
 
extern void glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
unsigned int *value );
 
extern GLXContext glXCreateNewContext( Display *dpy, GLXFBConfig config,
int renderType, GLXContext shareList,
Bool direct );
 
extern Bool glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
GLXDrawable read, GLXContext ctx );
 
extern GLXDrawable glXGetCurrentReadDrawable( void );
 
extern int glXQueryContext( Display *dpy, GLXContext ctx, int attribute,
int *value );
 
extern void glXSelectEvent( Display *dpy, GLXDrawable drawable,
unsigned long mask );
 
extern void glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
unsigned long *mask );
 
 
/* GLX 1.4 and later */
extern void (*glXGetProcAddress(const GLubyte *procname))();
 
 
#ifndef GLX_GLXEXT_LEGACY
 
#include <GL/glxext.h>
 
#else
 
 
/*
* 28. GLX_EXT_visual_info extension
*/
#ifndef GLX_EXT_visual_info
#define GLX_EXT_visual_info 1
 
#define GLX_X_VISUAL_TYPE_EXT 0x22
#define GLX_TRANSPARENT_TYPE_EXT 0x23
#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
#define GLX_TRUE_COLOR_EXT 0x8002
#define GLX_DIRECT_COLOR_EXT 0x8003
#define GLX_PSEUDO_COLOR_EXT 0x8004
#define GLX_STATIC_COLOR_EXT 0x8005
#define GLX_GRAY_SCALE_EXT 0x8006
#define GLX_STATIC_GRAY_EXT 0x8007
#define GLX_NONE_EXT 0x8000
#define GLX_TRANSPARENT_RGB_EXT 0x8008
#define GLX_TRANSPARENT_INDEX_EXT 0x8009
 
#endif /* 28. GLX_EXT_visual_info extension */
 
 
 
/*
* 41. GLX_SGI_video_sync
*/
#ifndef GLX_SGI_video_sync
#define GLX_SGI_video_sync 1
 
extern int glXGetVideoSyncSGI(unsigned int *count);
extern int glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count);
 
#endif /* GLX_SGI_video_sync */
 
 
 
/*
* 42. GLX_EXT_visual_rating
*/
#ifndef GLX_EXT_visual_rating
#define GLX_EXT_visual_rating 1
 
#define GLX_VISUAL_CAVEAT_EXT 0x20
/*#define GLX_NONE_EXT 0x8000*/
#define GLX_SLOW_VISUAL_EXT 0x8001
#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
 
#endif /* GLX_EXT_visual_rating */
 
 
 
/*
* 47. GLX_EXT_import_context
*/
#ifndef GLX_EXT_import_context
#define GLX_EXT_import_context 1
 
#define GLX_SHARE_CONTEXT_EXT 0x800A
#define GLX_VISUAL_ID_EXT 0x800B
#define GLX_SCREEN_EXT 0x800C
 
extern void glXFreeContextEXT(Display *dpy, GLXContext context);
 
extern GLXContextID glXGetContextIDEXT(const GLXContext context);
 
extern Display *glXGetCurrentDisplayEXT(void);
 
extern GLXContext glXImportContextEXT(Display *dpy, GLXContextID contextID);
 
extern int glXQueryContextInfoEXT(Display *dpy, GLXContext context,
int attribute,int *value);
 
#endif /* GLX_EXT_import_context */
 
 
 
/*
* 215. GLX_MESA_copy_sub_buffer
*/
#ifndef GLX_MESA_copy_sub_buffer
#define GLX_MESA_copy_sub_buffer 1
 
extern void glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
int x, int y, int width, int height );
 
#endif
 
 
 
/*
* 216. GLX_MESA_pixmap_colormap
*/
#ifndef GLX_MESA_pixmap_colormap
#define GLX_MESA_pixmap_colormap 1
 
extern GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual,
Pixmap pixmap, Colormap cmap );
 
#endif /* GLX_MESA_pixmap_colormap */
 
 
 
/*
* 217. GLX_MESA_release_buffers
*/
#ifndef GLX_MESA_release_buffers
#define GLX_MESA_release_buffers 1
 
extern Bool glXReleaseBuffersMESA( Display *dpy, GLXDrawable d );
 
#endif /* GLX_MESA_release_buffers */
 
 
 
/*
* 218. GLX_MESA_set_3dfx_mode
*/
#ifndef GLX_MESA_set_3dfx_mode
#define GLX_MESA_set_3dfx_mode 1
 
#define GLX_3DFX_WINDOW_MODE_MESA 0x1
#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
 
extern Bool glXSet3DfxModeMESA( int mode );
 
#endif /* GLX_MESA_set_3dfx_mode */
 
 
 
/*
* ARB 2. GLX_ARB_get_proc_address
*/
#ifndef GLX_ARB_get_proc_address
#define GLX_ARB_get_proc_address 1
 
extern void (*glXGetProcAddressARB(const GLubyte *procName))();
 
#endif /* GLX_ARB_get_proc_address */
 
 
 
#endif /* GLX_GLXEXT_LEGACY */
 
 
/**
** The following aren't in glxext.h yet.
**/
 
 
/*
* ???. GLX_NV_vertex_array_range
*/
#ifndef GLX_NV_vertex_array_range
#define GLX_NV_vertex_array_range
 
extern void *glXAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
extern void glXFreeMemoryNV(GLvoid *pointer);
typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
typedef void ( * PFNGLXFREEMEMORYNVPROC) (GLvoid *pointer);
 
#endif /* GLX_NV_vertex_array_range */
 
 
 
/*
* ???. GLX_MESA_agp_offset
*/
#ifndef GLX_MESA_agp_offset
#define GLX_MESA_agp_offset 1
 
extern GLuint glXGetAGPOffsetMESA(const GLvoid *pointer);
typedef GLuint (* PFNGLXGETAGPOFFSETMESAPROC) (const GLvoid *pointer);
 
#endif /* GLX_MESA_agp_offset */
 
 
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/glutf90.h
0,0 → 1,81
#ifndef __glutf90_h__
#define __glutf90_h__
 
/* Copyright (c) Mark J. Kilgard & Willam F. Mitchell, 1998. */
 
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
 
/* This header provides the binding interface for William Mitchell's
f90gl Fortran 90 GLUT binding. Other GLUT language bindings
can and should use this interace. */
 
/* I appreciate the guidance from William Mitchell
(mitchell@cam.nist.gov) in developing this friend interface
for use by the f90gl package. See ../../README.fortran */
 
#include <GL/glut.h>
 
/* Which callback enumerants for the __glutSetFCB/__glutGetFCB routines. */
/* NOTE These values are part of a binary interface for the f90gl Fortran
90 binding and so must NOT changes (additions are allowed). */
 
/* GLUTwindow callbacks. */
#define GLUT_FCB_DISPLAY 0 /* GLUTdisplayFCB */
#define GLUT_FCB_RESHAPE 1 /* GLUTreshapeFCB */
#define GLUT_FCB_MOUSE 2 /* GLUTmouseFCB */
#define GLUT_FCB_MOTION 3 /* GLUTmotionFCB */
#define GLUT_FCB_PASSIVE 4 /* GLUTpassiveFCB */
#define GLUT_FCB_ENTRY 5 /* GLUTentryFCB */
#define GLUT_FCB_KEYBOARD 6 /* GLUTkeyboardFCB */
#define GLUT_FCB_KEYBOARD_UP 7 /* GLUTkeyboardFCB */
#define GLUT_FCB_WINDOW_STATUS 8 /* GLUTwindowStatusFCB */
#define GLUT_FCB_VISIBILITY 9 /* GLUTvisibilityFCB */
#define GLUT_FCB_SPECIAL 10 /* GLUTspecialFCB */
#define GLUT_FCB_SPECIAL_UP 11 /* GLUTspecialFCB */
#define GLUT_FCB_BUTTON_BOX 12 /* GLUTbuttonBoxFCB */
#define GLUT_FCB_DIALS 13 /* GLUTdialsFCB */
#define GLUT_FCB_SPACE_MOTION 14 /* GLUTspaceMotionFCB */
#define GLUT_FCB_SPACE_ROTATE 15 /* GLUTspaceRotateFCB */
#define GLUT_FCB_SPACE_BUTTON 16 /* GLUTspaceButtonFCB */
#define GLUT_FCB_TABLET_MOTION 17 /* GLUTtabletMotionFCB */
#define GLUT_FCB_TABLET_BUTTON 18 /* GLUTtabletButtonFCB */
#define GLUT_FCB_JOYSTICK 19 /* GLUTjoystickFCB */
/* Non-GLUTwindow callbacks. */
#define GLUT_FCB_OVERLAY_DISPLAY 100 /* GLUTdisplayFCB */
#define GLUT_FCB_SELECT 101 /* GLUTselectFCB */
#define GLUT_FCB_TIMER 102 /* GLUTtimerFCB */
 
/* GLUT Fortran callback function types. */
typedef void (GLUTCALLBACK *GLUTdisplayFCB) (void);
typedef void (GLUTCALLBACK *GLUTreshapeFCB) (int *, int *);
/* NOTE the pressed key is int, not unsigned char for Fortran! */
typedef void (GLUTCALLBACK *GLUTkeyboardFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTmouseFCB) (int *, int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTmotionFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTpassiveFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTentryFCB) (int *);
typedef void (GLUTCALLBACK *GLUTwindowStatusFCB) (int *);
typedef void (GLUTCALLBACK *GLUTvisibilityFCB) (int *);
typedef void (GLUTCALLBACK *GLUTspecialFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTbuttonBoxFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTdialsFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceMotionFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceRotateFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceButtonFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTtabletMotionFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTtabletButtonFCB) (int *, int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTjoystickFCB) (unsigned int *buttonMask, int *x, int *y, int *z);
 
typedef void (GLUTCALLBACK *GLUTselectFCB) (int *);
typedef void (GLUTCALLBACK *GLUTtimerFCB) (int *);
typedef void (GLUTCALLBACK *GLUTmenuStateFCB) (int *); /* DEPRICATED. */
typedef void (GLUTCALLBACK *GLUTmenuStatusFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTidleFCB) (void);
 
/* Functions that set and return Fortran callback functions. */
GLUTAPI void* APIENTRY __glutGetFCB(int which);
GLUTAPI void APIENTRY __glutSetFCB(int which, void *func);
 
#endif /* __glutf90_h__ */
/shark/trunk/ports/mesa/include/GL/uglmesa.h
0,0 → 1,155
/* uglmesa.h - Public header UGL/Mesa */
 
/* Copyright (C) 2001 by Wind River Systems, Inc */
 
/*
* Mesa 3-D graphics library
* Version: 4.0
*
* The MIT License
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
 
/*
* Author:
* Stephane Raimbault <stephane.raimbault@windriver.com>
*/
 
#ifndef UGLMESA_H
#define UGLMESA_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#define UGL_MESA_MAJOR_VERSION 4
#define UGL_MESA_MINOR_VERSION 0
 
#include <GL/gl.h>
#include <ugl/ugl.h>
 
/*
* Values for display mode of uglMesaCreateContext ()
*/
 
/*
* With these mask values, it's possible to test double buffer mode
* with UGL_MESA_DOUBLE mask
*
* SINGLE 0000 0001
* DOUBLE 0000 0110
* - SOFT 0000 0010
* - HARD 0000 0100
* WINDML 0001 0000
*
*
*/
#define UGL_MESA_SINGLE 0x01
#define UGL_MESA_DOUBLE 0x06
#define UGL_MESA_DOUBLE_SOFTWARE 0x02
#define UGL_MESA_DOUBLE_HARDWARE 0x04
#define UGL_MESA_WINDML_EXCLUSIVE 0x10
 
#define UGL_MESA_FULLSCREEN_WIDTH 0x0
#define UGL_MESA_FULLSCREEN_HEIGHT 0x0
 
/*
* uglMesaPixelStore() parameters:
*/
#define UGL_MESA_ROW_LENGTH 0x20
#define UGL_MESA_Y_UP 0x21
 
/*
* Accepted by uglMesaGetIntegerv:
*/
 
#define UGL_MESA_LEFT_X 0x01
#define UGL_MESA_TOP_Y 0x02
#define UGL_MESA_WIDTH 0x03
#define UGL_MESA_HEIGHT 0x04
#define UGL_MESA_DISPLAY_WIDTH 0x05
#define UGL_MESA_DISPLAY_HEIGHT 0x06
#define UGL_MESA_COLOR_FORMAT 0x07
#define UGL_MESA_COLOR_MODEL 0x08
#define UGL_MESA_PIXEL_FORMAT 0x09
#define UGL_MESA_TYPE 0x0A
#define UGL_MESA_RGB 0x0B
#define UGL_MESA_COLOR_INDEXED 0x0C
#define UGL_MESA_SINGLE_BUFFER 0x0D
#define UGL_MESA_DOUBLE_BUFFER 0x0E
#define UGL_MESA_DOUBLE_BUFFER_SOFTWARE 0x0F
#define UGL_MESA_DOUBLE_BUFFER_HARDWARE 0x10
/*
* typedefs
*/
 
typedef struct uglMesaContext * UGL_MESA_CONTEXT;
UGL_MESA_CONTEXT uglMesaCreateNewContext (GLenum mode,
UGL_MESA_CONTEXT share_list);
 
UGL_MESA_CONTEXT uglMesaCreateNewContextExt (GLenum mode,
GLint depth_bits,
GLint stencil_bits,
GLint accum_red_bits,
GLint accum_green_bits,
GLint accum_blue_bits,
GLint accum_alpha_bits,
UGL_MESA_CONTEXT share_list);
 
GLboolean uglMesaMakeCurrentContext (UGL_MESA_CONTEXT umc,
GLsizei left, GLsizei top,
GLsizei width, GLsizei height);
 
GLboolean uglMesaMoveWindow (GLsizei dx, GLsizei dy);
 
GLboolean uglMesaMoveToWindow (GLsizei left, GLsizei top);
 
GLboolean uglMesaResizeWindow (GLsizei dw, GLsizei dh);
 
GLboolean uglMesaResizeToWindow (GLsizei width, GLsizei height);
 
void uglMesaDestroyContext (void);
 
UGL_MESA_CONTEXT uglMesaGetCurrentContext (void);
 
void uglMesaSwapBuffers (void);
 
void uglMesaPixelStore (GLint pname, GLint value);
 
void uglMesaGetIntegerv (GLint pname, GLint *value);
 
GLboolean uglMesaGetDepthBuffer (GLint *width, GLint *height,
GLint *bytesPerValue, void **buffer);
 
GLboolean uglMesaGetColorBuffer (GLint *width, GLint *height,
GLint *format, void **buffer);
 
GLboolean uglMesaSetColor (GLubyte index, GLfloat red,
GLfloat green, GLfloat blue);
#ifdef __cplusplus
}
#endif
 
 
#endif
/shark/trunk/ports/mesa/include/GL/mesa_wgl.h
0,0 → 1,125
/* $Id: mesa_wgl.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.1
*
* Copyright (C) 1999 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/* prototypes for the Mesa WGL functions */
/* relocated here so that I could make GLUT get them properly */
 
#define _mesa_wgl_h_
 
#ifndef _mesa_wgl_h_
#define _mesa_wgl_h_
 
 
#include <gl/gl.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN32__))
# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */
# define GLAPI __declspec(dllexport)
# define WGLAPI __declspec(dllexport)
# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */
# define GLAPI __declspec(dllimport)
# define WGLAPI __declspec(dllimport)
# else /* for use with static link lib build of Win32 edition only */
# define GLAPI extern
# define WGLAPI __declspec(dllimport)
# endif /* _STATIC_MESA support */
# define GLAPIENTRY __stdcall
#else
/* non-Windows compilation */
# define GLAPI extern
# define GLAPIENTRY
#endif /* WIN32 / CYGWIN32 bracket */
 
 
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP)
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
# ifdef UNICODE
# define wglUseFontBitmaps wglUseFontBitmapsW
# define wglUseFontOutlines wglUseFontOutlinesW
# else
# define wglUseFontBitmaps wglUseFontBitmapsA
# define wglUseFontOutlines wglUseFontOutlinesA
# endif /* !UNICODE */
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT;
typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR;
#endif
 
 
#ifdef _MSC_VER
# pragma warning( disable : 4615 ) /* pragma warning : unknown user warning type*/
# pragma warning( push )
# pragma warning( disable : 4273 ) /* 'function' : inconsistent DLL linkage. dllexport assumed. */
#endif
 
WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC);
WGLAPI int GLAPIENTRY wglMakeCurrent(HDC,HGLRC);
WGLAPI int GLAPIENTRY wglSetPixelFormat(HDC, int, const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY wglSwapBuffers(HDC hdc);
WGLAPI HDC GLAPIENTRY wglGetCurrentDC(void);
WGLAPI HGLRC GLAPIENTRY wglCreateContext(HDC);
WGLAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC,int);
WGLAPI HGLRC GLAPIENTRY wglGetCurrentContext(void);
WGLAPI PROC GLAPIENTRY wglGetProcAddress(const char*);
WGLAPI int GLAPIENTRY wglChoosePixelFormat(HDC, const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY wglCopyContext(HGLRC, HGLRC, unsigned int);
WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC);
WGLAPI int GLAPIENTRY wglDescribeLayerPlane(HDC, int, int, unsigned int,LPLAYERPLANEDESCRIPTOR);
WGLAPI int GLAPIENTRY wglDescribePixelFormat(HDC,int, unsigned int, LPPIXELFORMATDESCRIPTOR);
WGLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC, int, int, int,COLORREF *);
WGLAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc);
WGLAPI int GLAPIENTRY wglMakeCurrent(HDC, HGLRC);
WGLAPI int GLAPIENTRY wglRealizeLayerPalette(HDC, int, int);
WGLAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC, int, int, int,const COLORREF *);
WGLAPI int GLAPIENTRY wglShareLists(HGLRC, HGLRC);
WGLAPI int GLAPIENTRY wglSwapLayerBuffers(HDC, unsigned int);
WGLAPI int GLAPIENTRY wglUseFontBitmapsA(HDC, unsigned long, unsigned long, unsigned long);
WGLAPI int GLAPIENTRY wglUseFontBitmapsW(HDC, unsigned long, unsigned long, unsigned long);
WGLAPI int GLAPIENTRY wglUseFontOutlinesA(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT);
WGLAPI int GLAPIENTRY wglUseFontOutlinesW(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT);
WGLAPI int GLAPIENTRY SwapBuffers(HDC);
WGLAPI int GLAPIENTRY ChoosePixelFormat(HDC,const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY DescribePixelFormat(HDC,int,unsigned int,LPPIXELFORMATDESCRIPTOR);
WGLAPI int GLAPIENTRY GetPixelFormat(HDC);
WGLAPI int GLAPIENTRY SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR *);
 
#ifdef _MSC_VER
# pragma warning( pop )
#endif
 
#ifdef __cplusplus
}
#endif
 
 
#endif /* _mesa_wgl_h_ */
/shark/trunk/ports/mesa/include/GL/vms_x_fix.h
0,0 → 1,880
/***************************************************************************
* *
* Repair definitions of Xlib when compileing with /name=(as_is) on VMS *
* *
* Author : Jouk Jansen (joukj@hrem.stm.tudelft.nl) *
* *
* Last revision : 22 August 2000 *
* *
***************************************************************************/
 
#ifndef VMS_X_FIX
#define VMS_X_FIX
 
#define _XRegisterFilterByType _XREGISTERFILTERBYTYPE
#define XAllocClassHint XALLOCCLASSHINT
#define XAllocColor XALLOCCOLOR
#define XAllocColorCells XALLOCCOLORCELLS
#define XAllocSizeHints XALLOCSIZEHINTS
#define XAllocWMHints XALLOCWMHINTS
#define XAutoRepeatOff XAUTOREPEATOFF
#define XAutoRepeatOn XAUTOREPEATON
#define XBaseFontNameListOfFontSet XBASEFONTNAMELISTOFFONTSET
#define XBell XBELL
#define XBitmapPad XBITMAPPAD
#define XChangeActivePointerGrab XCHANGEACTIVEPOINTERGRAB
#define XChangeGC XCHANGEGC
#define XChangeProperty XCHANGEPROPERTY
#define XChangeWindowAttributes XCHANGEWINDOWATTRIBUTES
#define XCheckIfEvent XCHECKIFEVENT
#define XCheckMaskEvent XCHECKMASKEVENT
#define XCheckTypedWindowEvent XCHECKTYPEDWINDOWEVENT
#define XCheckWindowEvent XCHECKWINDOWEVENT
#define XClearArea XCLEARAREA
#define XClearWindow XCLEARWINDOW
#define XClipBox XCLIPBOX
#define XCloseDisplay XCLOSEDISPLAY
#define XCloseIM XCLOSEIM
#define XConfigureWindow XCONFIGUREWINDOW
#define XConvertSelection XCONVERTSELECTION
#define XCopyArea XCOPYAREA
#define XCopyGC XCOPYGC
#define XCopyPlane XCOPYPLANE
#define XCreateBitmapFromData XCREATEBITMAPFROMDATA
#define XCreateColormap XCREATECOLORMAP
#define XCreateFontCursor XCREATEFONTCURSOR
#define XCreateFontSet XCREATEFONTSET
#define XCreateGC XCREATEGC
#define XCreateIC XCREATEIC
#define XCreateImage XCREATEIMAGE
#define XCreatePixmap XCREATEPIXMAP
#define XCreatePixmapCursor XCREATEPIXMAPCURSOR
#define XCreatePixmapFromBitmapData XCREATEPIXMAPFROMBITMAPDATA
#define XCreateRegion XCREATEREGION
#define XCreateSimpleWindow XCREATESIMPLEWINDOW
#define XCreateWindow XCREATEWINDOW
#define XDefaultScreenOfDisplay XDEFAULTSCREENOFDISPLAY
#define XDefineCursor XDEFINECURSOR
#define XDeleteProperty XDELETEPROPERTY
#define XDestroyIC XDESTROYIC
#define XDestroyRegion XDESTROYREGION
#define XDestroyWindow XDESTROYWINDOW
#define XDisplayName XDISPLAYNAME
#define XDisplayOfScreen XDISPLAYOFSCREEN
#define XDrawArc XDRAWARC
#define XDrawImageString XDRAWIMAGESTRING
#define XDrawImageString16 XDRAWIMAGESTRING16
#define XDrawLine XDRAWLINE
#define XDrawLines XDRAWLINES
#define XDrawPoint XDRAWPOINT
#define XDrawPoints XDRAWPOINTS
#define XDrawRectangle XDRAWRECTANGLE
#define XDrawSegments XDRAWSEGMENTS
#define XDrawString XDRAWSTRING
#define XDrawString16 XDRAWSTRING16
#define XEmptyRegion XEMPTYREGION
#define XEqualRegion XEQUALREGION
#define XEventsQueued XEVENTSQUEUED
#define XExtentsOfFontSet XEXTENTSOFFONTSET
#define XFillArc XFILLARC
#define XFillPolygon XFILLPOLYGON
#define XFillRectangle XFILLRECTANGLE
#define XFillRectangles XFILLRECTANGLES
#define XFilterEvent XFILTEREVENT
#define XFlush XFLUSH
#define XFontsOfFontSet XFONTSOFFONTSET
#define XFree XFREE
#define XFreeColormap XFREECOLORMAP
#define XFreeColors XFREECOLORS
#define XFreeCursor XFREECURSOR
#define XFreeFont XFREEFONT
#define XFreeFontInfo XFREEFONTINFO
#define XFreeFontNames XFREEFONTNAMES
#define XFreeFontSet XFREEFONTSET
#define XFreeGC XFREEGC
#define XFreeModifiermap XFREEMODIFIERMAP
#define XFreePixmap XFREEPIXMAP
#define XFreeStringList XFREESTRINGLIST
#define XGetAtomName XGETATOMNAME
#define XGetDefault XGETDEFAULT
#define XGetErrorDatabaseText XGETERRORDATABASETEXT
#define XGetErrorText XGETERRORTEXT
#define XGetFontProperty XGETFONTPROPERTY
#define XGetGCValues XGETGCVALUES
#define XGetGeometry XGETGEOMETRY
#define XGetICValues XGETICVALUES
#define XGetIMValues XGETIMVALUES
#define XGetImage XGETIMAGE
#define XGetKeyboardControl XGETKEYBOARDCONTROL
#define XGetModifierMapping XGETMODIFIERMAPPING
#define XGetMotionEvents XGETMOTIONEVENTS
#define XGetNormalHints XGETNORMALHINTS
#define XGetSelectionOwner XGETSELECTIONOWNER
#define XGetSubImage XGETSUBIMAGE
#define XGetVisualInfo XGETVISUALINFO
#define XGetWMColormapWindows XGETWMCOLORMAPWINDOWS
#define XGetWMHints XGETWMHINTS
#define XGetWMName XGETWMNAME
#define XGetWMNormalHints XGETWMNORMALHINTS
#define XGetWindowAttributes XGETWINDOWATTRIBUTES
#define XGetWindowProperty XGETWINDOWPROPERTY
#define XGrabKeyboard XGRABKEYBOARD
#define XGrabPointer XGRABPOINTER
#define XGrabServer XGRABSERVER
#define XHeightOfScreen XHEIGHTOFSCREEN
#define XIfEvent XIFEVENT
#define XInternAtom XINTERNATOM
#define XIntersectRegion XINTERSECTREGION
#define XKeycodeToKeysym XKEYCODETOKEYSYM
#define XKeysymToKeycode XKEYSYMTOKEYCODE
#define XKeysymToString XKEYSYMTOSTRING
#define XListFonts XLISTFONTS
#define XListFontsWithInfo XLISTFONTSWITHINFO
#define XListPixmapFormats XLISTPIXMAPFORMATS
#define XListProperties XLISTPROPERTIES
#define XLoadQueryFont XLOADQUERYFONT
#define XLookupString XLOOKUPSTRING
#define XLowerWindow XLOWERWINDOW
#define XMapRaised XMAPRAISED
#define XMapWindow XMAPWINDOW
#define XMatchVisualInfo XMATCHVISUALINFO
#define XMoveResizeWindow XMOVERESIZEWINDOW
#define XMoveWindow XMOVEWINDOW
#define XNextEvent XNEXTEVENT
#define XOffsetRegion XOFFSETREGION
#define XOpenDisplay XOPENDISPLAY
#define XOpenIM XOPENIM
#define XParseColor XPARSECOLOR
#define XParseGeometry XPARSEGEOMETRY
#define XPeekEvent XPEEKEVENT
#define XPending XPENDING
#define XPointInRegion XPOINTINREGION
#define XPolygonRegion XPOLYGONREGION
#define XPutBackEvent XPUTBACKEVENT
#define XPutImage XPUTIMAGE
#define XQueryColor XQUERYCOLOR
#define XQueryColors XQUERYCOLORS
#define XQueryExtension XQUERYEXTENSION
#define XQueryPointer XQUERYPOINTER
#define XQueryTree XQUERYTREE
#define XRaiseWindow XRAISEWINDOW
#define XReconfigureWMWindow XRECONFIGUREWMWINDOW
#define XRectInRegion XRECTINREGION
#define XRefreshKeyboardMapping XREFRESHKEYBOARDMAPPING
#define XReparentWindow XREPARENTWINDOW
#define XResizeWindow XRESIZEWINDOW
#define XRestackWindows XRESTACKWINDOWS
#define XRootWindowOfScreen XROOTWINDOWOFSCREEN
#define XScreenNumberOfScreen XSCREENNUMBEROFSCREEN
#define XSelectAsyncEvent XSELECTASYNCEVENT
#define XSelectAsyncInput XSELECTASYNCINPUT
#define XSelectInput XSELECTINPUT
#define XSendEvent XSENDEVENT
#define XServerVendor XSERVERVENDOR
#define XSetBackground XSETBACKGROUND
#define XSetClassHint XSETCLASSHINT
#define XSetClipMask XSETCLIPMASK
#define XSetClipOrigin XSETCLIPORIGIN
#define XSetClipRectangles XSETCLIPRECTANGLES
#define XSetCloseDownMode XSETCLOSEDOWNMODE
#define XSetCommand XSETCOMMAND
#define XSetDashes XSETDASHES
#define XSetErrorHandler XSETERRORHANDLER
#define XSetFillStyle XSETFILLSTYLE
#define XSetFont XSETFONT
#define XSetForeground XSETFOREGROUND
#define XSetFunction XSETFUNCTION
#define XSetGraphicsExposures XSETGRAPHICSEXPOSURES
#define XSetICFocus XSETICFOCUS
#define XSetICValues XSETICVALUES
#define XSetIOErrorHandler XSETIOERRORHANDLER
#define XSetInputFocus XSETINPUTFOCUS
#define XSetLineAttributes XSETLINEATTRIBUTES
#define XSetLocaleModifiers XSETLOCALEMODIFIERS
#define XSetNormalHints XSETNORMALHINTS
#define XSetRegion XSETREGION
#define XSetSelectionOwner XSETSELECTIONOWNER
#define XSetStipple XSETSTIPPLE
#define XSetSubwindowMode XSETSUBWINDOWMODE
#define XSetTSOrigin XSETTSORIGIN
#define XSetTile XSETTILE
#define XSetTransientForHint XSETTRANSIENTFORHINT
#define XSetWMColormapWindows XSETWMCOLORMAPWINDOWS
#define XSetWMHints XSETWMHINTS
#define XSetWMIconName XSETWMICONNAME
#define XSetWMName XSETWMNAME
#define XSetWMNormalHints XSETWMNORMALHINTS
#define XSetWMProperties XSETWMPROPERTIES
#define XSetWMProtocols XSETWMPROTOCOLS
#define XSetWindowBackground XSETWINDOWBACKGROUND
#define XSetWindowBackgroundPixmap XSETWINDOWBACKGROUNDPIXMAP
#define XSetWindowColormap XSETWINDOWCOLORMAP
#define XShapeCombineMask XSHAPECOMBINEMASK
#define XShapeCombineRectangles XSHAPECOMBINERECTANGLES
#define XShapeGetRectangles XSHAPEGETRECTANGLES
#define XShrinkRegion XSHRINKREGION
#define XStoreColor XSTORECOLOR
#define XStoreColors XSTORECOLORS
#define XStoreName XSTORENAME
#define XStringToKeysym XSTRINGTOKEYSYM
#define XSubtractRegion XSUBTRACTREGION
#define XSupportsLocale XSUPPORTSLOCALE
#define XSync XSYNC
#define XSynchronize XSYNCHRONIZE
#define XTextExtents XTEXTEXTENTS
#define XTextExtents16 XTEXTEXTENTS16
#define XTextWidth XTEXTWIDTH
#define XTextWidth16 XTEXTWIDTH16
#define XTranslateCoordinates XTRANSLATECOORDINATES
#define XUndefineCursor XUNDEFINECURSOR
#define XUngrabKeyboard XUNGRABKEYBOARD
#define XUngrabPointer XUNGRABPOINTER
#define XUngrabServer XUNGRABSERVER
#define XUnionRectWithRegion XUNIONRECTWITHREGION
#define XUnionRegion XUNIONREGION
#define XUnmapWindow XUNMAPWINDOW
#define _XUnregisterFilter _XUNREGISTERFILTER
#define XUnsetICFocus XUNSETICFOCUS
#define XVaCreateNestedList XVACREATENESTEDLIST
#define XVisualIDFromVisual XVISUALIDFROMVISUAL
#define XWidthOfScreen XWIDTHOFSCREEN
#define XWindowEvent XWINDOWEVENT
#define XWithdrawWindow XWITHDRAWWINDOW
#define XXorRegion XXORREGION
#define XmAddProtocolCallback XMADDPROTOCOLCALLBACK
#define XmAddProtocols XMADDPROTOCOLS
#define XmChangeColor XMCHANGECOLOR
#define XmClipboardCopy XMCLIPBOARDCOPY
#define XmClipboardEndCopy XMCLIPBOARDENDCOPY
#define XmClipboardInquireLength XMCLIPBOARDINQUIRELENGTH
#define XmClipboardLock XMCLIPBOARDLOCK
#define XmClipboardRetrieve XMCLIPBOARDRETRIEVE
#define XmClipboardStartCopy XMCLIPBOARDSTARTCOPY
#define XmClipboardUnlock XMCLIPBOARDUNLOCK
#define XmCreateArrowButton XMCREATEARROWBUTTON
#define XmCreateArrowButtonGadget XMCREATEARROWBUTTONGADGET
#define XmCreateCascadeButton XMCREATECASCADEBUTTON
#define XmCreateDialogShell XMCREATEDIALOGSHELL
#define XmCreateDragIcon XMCREATEDRAGICON
#define XmCreateDrawingArea XMCREATEDRAWINGAREA
#define XmCreateDrawnButton XMCREATEDRAWNBUTTON
#define XmCreateFileSelectionBox XMCREATEFILESELECTIONBOX
#define XmCreateFileSelectionDialog XMCREATEFILESELECTIONDIALOG
#define XmCreateForm XMCREATEFORM
#define XmCreateFormDialog XMCREATEFORMDIALOG
#define XmCreateFrame XMCREATEFRAME
#define XmCreateInformationDialog XMCREATEINFORMATIONDIALOG
#define XmCreateLabelGadget XMCREATELABELGADGET
#define XmCreateMainWindow XMCREATEMAINWINDOW
#define XmCreateMenuBar XMCREATEMENUBAR
#define XmCreateMessageBox XMCREATEMESSAGEBOX
#define XmCreateMessageDialog XMCREATEMESSAGEDIALOG
#define XmCreateOptionMenu XMCREATEOPTIONMENU
#define XmCreatePanedWindow XMCREATEPANEDWINDOW
#define XmCreatePopupMenu XMCREATEPOPUPMENU
#define XmCreatePromptDialog XMCREATEPROMPTDIALOG
#define XmCreatePulldownMenu XMCREATEPULLDOWNMENU
#define XmCreatePushButton XMCREATEPUSHBUTTON
#define XmCreatePushButtonGadget XMCREATEPUSHBUTTONGADGET
#define XmCreateQuestionDialog XMCREATEQUESTIONDIALOG
#define XmCreateRadioBox XMCREATERADIOBOX
#define XmCreateRowColumn XMCREATEROWCOLUMN
#define XmCreateScale XMCREATESCALE
#define XmCreateScrollBar XMCREATESCROLLBAR
#define XmCreateScrolledList XMCREATESCROLLEDLIST
#define XmCreateScrolledText XMCREATESCROLLEDTEXT
#define XmCreateScrolledWindow XMCREATESCROLLEDWINDOW
#define XmCreateSelectionDialog XMCREATESELECTIONDIALOG
#define XmCreateSeparator XMCREATESEPARATOR
#define XmCreateSeparatorGadget XMCREATESEPARATORGADGET
#define XmCreateTemplateDialog XMCREATETEMPLATEDIALOG
#define XmCreateText XMCREATETEXT
#define XmCreateTextField XMCREATETEXTFIELD
#define XmCreateToggleButton XMCREATETOGGLEBUTTON
#define XmCreateToggleButtonGadget XMCREATETOGGLEBUTTONGADGET
#define XmDragStart XMDRAGSTART
#define XmDropSiteRegister XMDROPSITEREGISTER
#define XmDropSiteUnregister XMDROPSITEUNREGISTER
#define XmDropSiteUpdate XMDROPSITEUPDATE
#define XmDropTransferStart XMDROPTRANSFERSTART
#define XmFileSelectionBoxGetChild XMFILESELECTIONBOXGETCHILD
#define XmFileSelectionDoSearch XMFILESELECTIONDOSEARCH
#define XmFontListAppendEntry XMFONTLISTAPPENDENTRY
#define XmFontListCopy XMFONTLISTCOPY
#define XmFontListCreate XMFONTLISTCREATE
#define XmFontListEntryCreate XMFONTLISTENTRYCREATE
#define XmFontListEntryFree XMFONTLISTENTRYFREE
#define XmFontListEntryGetFont XMFONTLISTENTRYGETFONT
#define XmFontListEntryGetTag XMFONTLISTENTRYGETTAG
#define XmFontListEntryLoad XMFONTLISTENTRYLOAD
#define XmFontListFree XMFONTLISTFREE
#define XmFontListFreeFontContext XMFONTLISTFREEFONTCONTEXT
#define XmFontListGetNextFont XMFONTLISTGETNEXTFONT
#define XmFontListInitFontContext XMFONTLISTINITFONTCONTEXT
#define XmFontListNextEntry XMFONTLISTNEXTENTRY
#define XmGetColors XMGETCOLORS
#define XmGetFocusWidget XMGETFOCUSWIDGET
#define XmGetMenuCursor XMGETMENUCURSOR
#define XmGetPixmapByDepth XMGETPIXMAPBYDEPTH
#define XmGetTearOffControl XMGETTEAROFFCONTROL
#define XmGetXmDisplay XMGETXMDISPLAY
#define XmImMbLookupString XMIMMBLOOKUPSTRING
#define XmImRegister XMIMREGISTER
#define XmImSetFocusValues XMIMSETFOCUSVALUES
#define XmImSetValues XMIMSETVALUES
#define XmImUnregister XMIMUNREGISTER
#define XmImUnsetFocus XMIMUNSETFOCUS
#define XmInternAtom XMINTERNATOM
#define XmIsMotifWMRunning XMISMOTIFWMRUNNING
#define XmListAddItem XMLISTADDITEM
#define XmListAddItemUnselected XMLISTADDITEMUNSELECTED
#define XmListAddItemsUnselected XMLISTADDITEMSUNSELECTED
#define XmListDeleteAllItems XMLISTDELETEALLITEMS
#define XmListDeleteItemsPos XMLISTDELETEITEMSPOS
#define XmListDeletePos XMLISTDELETEPOS
#define XmListDeselectAllItems XMLISTDESELECTALLITEMS
#define XmListDeselectPos XMLISTDESELECTPOS
#define XmListGetKbdItemPos XMLISTGETKBDITEMPOS
#define XmListGetMatchPos XMLISTGETMATCHPOS
#define XmListGetSelectedPos XMLISTGETSELECTEDPOS
#define XmListPosSelected XMLISTPOSSELECTED
#define XmListSelectItem XMLISTSELECTITEM
#define XmListSelectPos XMLISTSELECTPOS
#define XmListSetBottomPos XMLISTSETBOTTOMPOS
#define XmListSetItem XMLISTSETITEM
#define XmListSetKbdItemPos XMLISTSETKBDITEMPOS
#define XmListSetPos XMLISTSETPOS
#define XmMainWindowSetAreas XMMAINWINDOWSETAREAS
#define XmMenuPosition XMMENUPOSITION
#define XmMessageBoxGetChild XMMESSAGEBOXGETCHILD
#define XmOptionButtonGadget XMOPTIONBUTTONGADGET
#define XmOptionLabelGadget XMOPTIONLABELGADGET
#define XmProcessTraversal XMPROCESSTRAVERSAL
#define XmQmotif XMQMOTIF
#define XmRemoveProtocolCallback XMREMOVEPROTOCOLCALLBACK
#define XmRepTypeGetId XMREPTYPEGETID
#define XmRepTypeGetRecord XMREPTYPEGETRECORD
#define XmRepTypeRegister XMREPTYPEREGISTER
#define XmRepTypeValidValue XMREPTYPEVALIDVALUE
#define XmScrollBarSetValues XMSCROLLBARSETVALUES
#define XmScrolledWindowSetAreas XMSCROLLEDWINDOWSETAREAS
#define XmSelectionBoxGetChild XMSELECTIONBOXGETCHILD
#define XmStringByteCompare XMSTRINGBYTECOMPARE
#define XmStringCompare XMSTRINGCOMPARE
#define XmStringConcat XMSTRINGCONCAT
#define XmStringCopy XMSTRINGCOPY
#define XmStringCreate XMSTRINGCREATE
#define XmStringCreateLocalized XMSTRINGCREATELOCALIZED
#define XmStringCreateLtoR XMSTRINGCREATELTOR
#define XmStringCreateSimple XMSTRINGCREATESIMPLE
#define XmStringDraw XMSTRINGDRAW
#define XmStringDrawUnderline XMSTRINGDRAWUNDERLINE
#define XmStringExtent XMSTRINGEXTENT
#define XmStringFree XMSTRINGFREE
#define XmStringFreeContext XMSTRINGFREECONTEXT
#define XmStringGetLtoR XMSTRINGGETLTOR
#define XmStringGetNextComponent XMSTRINGGETNEXTCOMPONENT
#define XmStringGetNextSegment XMSTRINGGETNEXTSEGMENT
#define XmStringInitContext XMSTRINGINITCONTEXT
#define XmStringLength XMSTRINGLENGTH
#define XmStringLtoRCreate XMSTRINGLTORCREATE
#define XmStringNConcat XMSTRINGNCONCAT
#define XmStringSegmentCreate XMSTRINGSEGMENTCREATE
#define XmStringWidth XMSTRINGWIDTH
#define XmTextClearSelection XMTEXTCLEARSELECTION
#define XmTextFieldGetEditable XMTEXTFIELDGETEDITABLE
#define XmTextFieldGetInsertionPosition XMTEXTFIELDGETINSERTIONPOSITION
#define XmTextFieldGetLastPosition XMTEXTFIELDGETLASTPOSITION
#define XmTextFieldGetSelection XMTEXTFIELDGETSELECTION
#define XmTextFieldGetString XMTEXTFIELDGETSTRING
#define XmTextFieldInsert XMTEXTFIELDINSERT
#define XmTextFieldRemove XMTEXTFIELDREMOVE
#define XmTextFieldSetSelection XMTEXTFIELDSETSELECTION
#define XmTextFieldSetString XMTEXTFIELDSETSTRING
#define XmTextGetCursorPosition XMTEXTGETCURSORPOSITION
#define XmTextGetInsertionPosition XMTEXTGETINSERTIONPOSITION
#define XmTextGetLastPosition XMTEXTGETLASTPOSITION
#define XmTextGetMaxLength XMTEXTGETMAXLENGTH
#define XmTextGetSelection XMTEXTGETSELECTION
#define XmTextGetSelectionPosition XMTEXTGETSELECTIONPOSITION
#define XmTextGetString XMTEXTGETSTRING
#define XmTextInsert XMTEXTINSERT
#define XmTextRemove XMTEXTREMOVE
#define XmTextReplace XMTEXTREPLACE
#define XmTextSetCursorPosition XMTEXTSETCURSORPOSITION
#define XmTextSetHighlight XMTEXTSETHIGHLIGHT
#define XmTextSetInsertionPosition XMTEXTSETINSERTIONPOSITION
#define XmTextSetSelection XMTEXTSETSELECTION
#define XmTextSetString XMTEXTSETSTRING
#define XmToggleButtonGadgetGetState XMTOGGLEBUTTONGADGETGETSTATE
#define XmToggleButtonGadgetSetState XMTOGGLEBUTTONGADGETSETSTATE
#define XmToggleButtonGetState XMTOGGLEBUTTONGETSTATE
#define XmToggleButtonSetState XMTOGGLEBUTTONSETSTATE
#define XmUpdateDisplay XMUPDATEDISPLAY
#define XmVaCreateSimpleRadioBox XMVACREATESIMPLERADIOBOX
#define XmbDrawString XMBDRAWSTRING
#define XmbLookupString XMBLOOKUPSTRING
#define XmbResetIC XMBRESETIC
#define XmbSetWMProperties XMBSETWMPROPERTIES
#define XmbTextEscapement XMBTEXTESCAPEMENT
#define XmbTextExtents XMBTEXTEXTENTS
#define XmbTextListToTextProperty XMBTEXTLISTTOTEXTPROPERTY
#define XmbTextPropertyToTextList XMBTEXTPROPERTYTOTEXTLIST
#define XmuClientWindow XMUCLIENTWINDOW
#define XmuPrintDefaultErrorMessage XMUPRINTDEFAULTERRORMESSAGE
#define XrmGetDatabase XRMGETDATABASE
#define XrmGetResource XRMGETRESOURCE
#define XrmPutStringResource XRMPUTSTRINGRESOURCE
#define XrmQuarkToString XRMQUARKTOSTRING
#define XrmStringToQuark XRMSTRINGTOQUARK
#define XtAddCallback XTADDCALLBACK
#define XtAddCallbacks XTADDCALLBACKS
#define XtAddEventHandler XTADDEVENTHANDLER
#define XtAddGrab XTADDGRAB
#define XtAllocateGC XTALLOCATEGC
#define XtAppAddActions XTAPPADDACTIONS
#define XtAppAddInput XTAPPADDINPUT
#define XtAppAddTimeOut XTAPPADDTIMEOUT
#define XtAppCreateShell XTAPPCREATESHELL
#define XtAppInitialize XTAPPINITIALIZE
#define XtAppNextEvent XTAPPNEXTEVENT
#define XtAppPeekEvent XTAPPPEEKEVENT
#define XtAppPending XTAPPPENDING
#define XtAppProcessEvent XTAPPPROCESSEVENT
#define XtAppSetErrorHandler XTAPPSETERRORHANDLER
#define XtAppSetFallbackResources XTAPPSETFALLBACKRESOURCES
#define XtAppSetWarningHandler XTAPPSETWARNINGHANDLER
#define XtAppSetWarningMsgHandler XTAPPSETWARNINGMSGHANDLER
#define XtAppWarning XTAPPWARNING
#define XtCallActionProc XTCALLACTIONPROC
#define XtCallCallbackList XTCALLCALLBACKLIST
#define XtCallCallbacks XTCALLCALLBACKS
#define XtConfigureWidget XTCONFIGUREWIDGET
#define XtConvertAndStore XTCONVERTANDSTORE
#define XtCreateApplicationContext XTCREATEAPPLICATIONCONTEXT
#define XtCreateManagedWidget XTCREATEMANAGEDWIDGET
#define XtCreatePopupShell XTCREATEPOPUPSHELL
#define XtCreateWidget XTCREATEWIDGET
#define XtDatabase XTDATABASE
#define XtDestroyWidget XTDESTROYWIDGET
#define XtDisownSelection XTDISOWNSELECTION
#define XtDispatchEvent XTDISPATCHEVENT
#define XtDisplayOfObject XTDISPLAYOFOBJECT
#define XtDisplayStringConvWarning XTDISPLAYSTRINGCONVWARNING
#define XtDisplayToApplicationContext XTDISPLAYTOAPPLICATIONCONTEXT
#define XtAppAddWorkProc XTAPPADDWORKPROC
#define XtRemoveWorkProc XTREMOVEWORKPROC
#define XtFree XTFREE
#define XtGetActionKeysym XTGETACTIONKEYSYM
#define XtGetActionList XTGETACTIONLIST
#define XtGetApplicationNameAndClass XTGETAPPLICATIONNAMEANDCLASS
#define XtGetApplicationResources XTGETAPPLICATIONRESOURCES
#define XtGetGC XTGETGC
#define XtGetMultiClickTime XTGETMULTICLICKTIME
#define XtGetSelectionValue XTGETSELECTIONVALUE
#define XtGetSelectionValues XTGETSELECTIONVALUES
#define XtGetSubresources XTGETSUBRESOURCES
#define XtGetValues XTGETVALUES
#define XtGrabKeyboard XTGRABKEYBOARD
#define XtGrabPointer XTGRABPOINTER
#define XtHasCallbacks XTHASCALLBACKS
#define XtInitializeWidgetClass XTINITIALIZEWIDGETCLASS
#define XtInsertEventHandler XTINSERTEVENTHANDLER
#define XtIsManaged XTISMANAGED
#define XtIsObject XTISOBJECT
#define XtIsSensitive XTISSENSITIVE
#define XtIsSubclass XTISSUBCLASS
#define XtLastTimestampProcessed XTLASTTIMESTAMPPROCESSED
#define XtMakeGeometryRequest XTMAKEGEOMETRYREQUEST
#define XtMakeResizeRequest XTMAKERESIZEREQUEST
#define XtMalloc XTMALLOC
#define XtManageChild XTMANAGECHILD
#define XtManageChildren XTMANAGECHILDREN
#define XtMergeArgLists XTMERGEARGLISTS
#define XtMoveWidget XTMOVEWIDGET
#define XtName XTNAME
#define XtNameToWidget XTNAMETOWIDGET
#define XtOpenDisplay XTOPENDISPLAY
#define XtOverrideTranslations XTOVERRIDETRANSLATIONS
#define XtOwnSelection XTOWNSELECTION
#define XtParseTranslationTable XTPARSETRANSLATIONTABLE
#define XtPopdown XTPOPDOWN
#define XtPopup XTPOPUP
#define XtQueryGeometry XTQUERYGEOMETRY
#define XtRealizeWidget XTREALIZEWIDGET
#define XtRealloc XTREALLOC
#define XtReleaseGC XTRELEASEGC
#define XtRemoveAllCallbacks XTREMOVEALLCALLBACKS
#define XtRemoveCallback XTREMOVECALLBACK
#define XtRemoveEventHandler XTREMOVEEVENTHANDLER
#define XtRemoveGrab XTREMOVEGRAB
#define XtRemoveInput XTREMOVEINPUT
#define XtRemoveTimeOut XTREMOVETIMEOUT
#define XtResizeWidget XTRESIZEWIDGET
#define XtResolvePathname XTRESOLVEPATHNAME
#define XtSetKeyboardFocus XTSETKEYBOARDFOCUS
#define XtSetMappedWhenManaged XTSETMAPPEDWHENMANAGED
#define XtSetSensitive XTSETSENSITIVE
#define XtSetTypeConverter XTSETTYPECONVERTER
#define XtSetValues XTSETVALUES
#define XtShellStrings XTSHELLSTRINGS
#define XtStrings XTSTRINGS
#define XtToolkitInitialize XTTOOLKITINITIALIZE
#define XtTranslateCoords XTTRANSLATECOORDS
#define XtTranslateKeycode XTTRANSLATEKEYCODE
#define XtUngrabKeyboard XTUNGRABKEYBOARD
#define XtUngrabPointer XTUNGRABPOINTER
#define XtUnmanageChild XTUNMANAGECHILD
#define XtUnmanageChildren XTUNMANAGECHILDREN
#define XtUnrealizeWidget XTUNREALIZEWIDGET
#define XtVaCreateManagedWidget XTVACREATEMANAGEDWIDGET
#define XtVaCreateWidget XTVACREATEWIDGET
#define XtVaGetValues XTVAGETVALUES
#define XtVaSetValues XTVASETVALUES
#define XtWarning XTWARNING
#define XtWidgetToApplicationContext XTWIDGETTOAPPLICATIONCONTEXT
#define XtWindowOfObject XTWINDOWOFOBJECT
#define XtWindowToWidget XTWINDOWTOWIDGET
#define XwcDrawString XWCDRAWSTRING
#define XwcFreeStringList XWCFREESTRINGLIST
#define XwcTextEscapement XWCTEXTESCAPEMENT
#define XwcTextExtents XWCTEXTEXTENTS
#define XwcTextListToTextProperty XWCTEXTLISTTOTEXTPROPERTY
#define XwcTextPropertyToTextList XWCTEXTPROPERTYTOTEXTLIST
#define _XmBottomShadowColorDefault _XMBOTTOMSHADOWCOLORDEFAULT
#define _XmClearBorder _XMCLEARBORDER
#define _XmConfigureObject _XMCONFIGUREOBJECT
#define _XmDestroyParentCallback _XMDESTROYPARENTCALLBACK
#define _XmDrawArrow _XMDRAWARROW
#define _XmDrawShadows _XMDRAWSHADOWS
#define _XmFontListGetDefaultFont _XMFONTLISTGETDEFAULTFONT
#define _XmFromHorizontalPixels _XMFROMHORIZONTALPIXELS
#define _XmFromVerticalPixels _XMFROMVERTICALPIXELS
#define _XmGetClassExtensionPtr _XMGETCLASSEXTENSIONPTR
#define _XmGetDefaultFontList _XMGETDEFAULTFONTLIST
#define _XmGetTextualDragIcon _XMGETTEXTUALDRAGICON
#define _XmGetWidgetExtData _XMGETWIDGETEXTDATA
#define _XmGrabKeyboard _XMGRABKEYBOARD
#define _XmGrabPointer _XMGRABPOINTER
#define _XmInheritClass _XMINHERITCLASS
#define _XmInputInGadget _XMINPUTINGADGET
#define _XmMakeGeometryRequest _XMMAKEGEOMETRYREQUEST
#define _XmMenuPopDown _XMMENUPOPDOWN
#define _XmMoveObject _XMMOVEOBJECT
#define _XmNavigChangeManaged _XMNAVIGCHANGEMANAGED
#define _XmOSBuildFileList _XMOSBUILDFILELIST
#define _XmOSFileCompare _XMOSFILECOMPARE
#define _XmOSFindPatternPart _XMOSFINDPATTERNPART
#define _XmOSQualifyFileSpec _XMOSQUALIFYFILESPEC
#define _XmPostPopupMenu _XMPOSTPOPUPMENU
#define _XmPrimitiveEnter _XMPRIMITIVEENTER
#define _XmPrimitiveLeave _XMPRIMITIVELEAVE
#define _XmRedisplayGadgets _XMREDISPLAYGADGETS
#define _XmShellIsExclusive _XMSHELLISEXCLUSIVE
#define _XmStringDraw _XMSTRINGDRAW
#define _XmStringGetTextConcat _XMSTRINGGETTEXTCONCAT
#define _XmStrings _XMSTRINGS
#define _XmToHorizontalPixels _XMTOHORIZONTALPIXELS
#define _XmToVerticalPixels _XMTOVERTICALPIXELS
#define _XmTopShadowColorDefault _XMTOPSHADOWCOLORDEFAULT
#define _Xm_fastPtr _XM_FASTPTR
#define _XtCheckSubclassFlag _XTCHECKSUBCLASSFLAG
#define _XtInherit _XTINHERIT
#define _XtInheritTranslations _XTINHERITTRANSLATIONS
#define applicationShellWidgetClass APPLICATIONSHELLWIDGETCLASS
#define compositeWidgetClass COMPOSITEWIDGETCLASS
#define overrideShellWidgetClass OVERRIDESHELLWIDGETCLASS
#define shellWidgetClass SHELLWIDGETCLASS
#define topLevelShellClassRec TOPLEVELSHELLCLASSREC
#define topLevelShellWidgetClass TOPLEVELSHELLWIDGETCLASS
#define transientShellWidgetClass TRANSIENTSHELLWIDGETCLASS
#define vendorShellClassRec VENDORSHELLCLASSREC
#define vendorShellWidgetClass VENDORSHELLWIDGETCLASS
#define wmShellWidgetClass WMSHELLWIDGETCLASS
#define xmArrowButtonWidgetClass XMARROWBUTTONWIDGETCLASS
#define xmCascadeButtonClassRec XMCASCADEBUTTONCLASSREC
#define xmCascadeButtonGadgetClass XMCASCADEBUTTONGADGETCLASS
#define xmCascadeButtonWidgetClass XMCASCADEBUTTONWIDGETCLASS
#define xmDialogShellWidgetClass XMDIALOGSHELLWIDGETCLASS
#define xmDrawingAreaWidgetClass XMDRAWINGAREAWIDGETCLASS
#define xmDrawnButtonWidgetClass XMDRAWNBUTTONWIDGETCLASS
#define xmFileSelectionBoxWidgetClass XMFILESELECTIONBOXWIDGETCLASS
#define xmFormWidgetClass XMFORMWIDGETCLASS
#define xmFrameWidgetClass XMFRAMEWIDGETCLASS
#define xmGadgetClass XMGADGETCLASS
#define xmLabelGadgetClass XMLABELGADGETCLASS
#define xmLabelWidgetClass XMLABELWIDGETCLASS
#define xmListWidgetClass XMLISTWIDGETCLASS
#define xmMainWindowWidgetClass XMMAINWINDOWWIDGETCLASS
#define xmManagerClassRec XMMANAGERCLASSREC
#define xmManagerWidgetClass XMMANAGERWIDGETCLASS
#define xmMenuShellWidgetClass XMMENUSHELLWIDGETCLASS
#define xmMessageBoxWidgetClass XMMESSAGEBOXWIDGETCLASS
#define xmPrimitiveClassRec XMPRIMITIVECLASSREC
#define xmPrimitiveWidgetClass XMPRIMITIVEWIDGETCLASS
#define xmPushButtonClassRec XMPUSHBUTTONCLASSREC
#define xmPushButtonGadgetClass XMPUSHBUTTONGADGETCLASS
#define xmPushButtonWidgetClass XMPUSHBUTTONWIDGETCLASS
#define xmRowColumnWidgetClass XMROWCOLUMNWIDGETCLASS
#define xmSashWidgetClass XMSASHWIDGETCLASS
#define xmScrollBarWidgetClass XMSCROLLBARWIDGETCLASS
#define xmScrolledWindowClassRec XMSCROLLEDWINDOWCLASSREC
#define xmScrolledWindowWidgetClass XMSCROLLEDWINDOWWIDGETCLASS
#define xmSeparatorGadgetClass XMSEPARATORGADGETCLASS
#define xmSeparatorWidgetClass XMSEPARATORWIDGETCLASS
#define xmTextFieldWidgetClass XMTEXTFIELDWIDGETCLASS
#define xmTextWidgetClass XMTEXTWIDGETCLASS
#define xmToggleButtonGadgetClass XMTOGGLEBUTTONGADGETCLASS
#define xmToggleButtonWidgetClass XMTOGGLEBUTTONWIDGETCLASS
#define XtRegisterDrawable _XTREGISTERWINDOW
#define XtUnregisterDrawable _XTUNREGISTERWINDOW
#define XQueryFont XQUERYFONT
#define XSetPlaneMask XSETPLANEMASK
#define XChangeKeyboardControl XCHANGEKEYBOARDCONTROL
#define XDestroySubwindows XDESTROYSUBWINDOWS
#define XFreeDeviceList XFREEDEVICELIST
#define XFreeDeviceState XFREEDEVICESTATE
#define XGetExtensionVersion XGETEXTENSIONVERSION
#define XGetRGBColormaps XGETRGBCOLORMAPS
#define XIconifyWindow XICONIFYWINDOW
#define XInstallColormap XINSTALLCOLORMAP
#define XListInputDevices XLISTINPUTDEVICES
#define XLookupKeysym XLOOKUPKEYSYM
#define XOpenDevice XOPENDEVICE
#define XQueryDeviceState XQUERYDEVICESTATE
#define XSelectExtensionEvent XSELECTEXTENSIONEVENT
#define XWarpPointer XWARPPOINTER
#define XmuLookupStandardColormap XMULOOKUPSTANDARDCOLORMAP
#define XAllocNamedColor XALLOCNAMEDCOLOR
#define XBlackPixelOfScreen XBLACKPIXELOFSCREEN
#define XDefaultColormap XDEFAULTCOLORMAP
#define XDefaultColormapOfScreen XDEFAULTCOLORMAPOFSCREEN
#define XDefaultDepth XDEFAULTDEPTH
#define XDefaultScreen XDEFAULTSCREEN
#define XDefaultVisual XDEFAULTVISUAL
#define XSetIconName XSETICONNAME
#define XtInitialize XTINITIALIZE
#define XtMainLoop XTMAINLOOP
#define DtSaverGetWindows DTSAVERGETWINDOWS
#define XAddHosts XADDHOSTS
#define XDisableAccessControl XDISABLEACCESSCONTROL
#define XEnableAccessControl XENABLEACCESSCONTROL
#define XFillArcs XFILLARCS
#define XForceScreenSaver XFORCESCREENSAVER
#define XGetScreenSaver XGETSCREENSAVER
#define XListHosts XLISTHOSTS
#define XReadBitmapFile XREADBITMAPFILE
#define XRemoveHosts XREMOVEHOSTS
#define XResetScreenSaver XRESETSCREENSAVER
#define XResourceManagerString XRESOURCEMANAGERSTRING
#define XSetScreenSaver XSETSCREENSAVER
#define XStringListToTextProperty XSTRINGLISTTOTEXTPROPERTY
#define XrmDestroyDatabase XRMDESTROYDATABASE
#define XrmGetFileDatabase XRMGETFILEDATABASE
#define XrmGetStringDatabase XRMGETSTRINGDATABASE
#define XrmInitialize XRMINITIALIZE
#define XrmMergeDatabases XRMMERGEDATABASES
#define XrmParseCommand XRMPARSECOMMAND
#define XrmPutLineResource XRMPUTLINERESOURCE
#define XrmQPutStringResource XRMQPUTSTRINGRESOURCE
#define XrmStringToBindingQuarkList XRMSTRINGTOBINDINGQUARKLIST
#define XrmStringToQuark XRMSTRINGTOQUARK
#define XmCreateLabel XMCREATELABEL
 
#ifdef __cplusplus
extern "C" {
#endif
extern void XtFree(char*);
#ifdef __cplusplus
}
#endif
 
#define pthread_attr_create PTHREAD_ATTR_CREATE
#define pthread_attr_delete PTHREAD_ATTR_DELETE
#define pthread_attr_destroy PTHREAD_ATTR_DESTROY
#define pthread_attr_getdetach_np PTHREAD_ATTR_GETDETACH_NP
#define pthread_attr_getguardsize_np PTHREAD_ATTR_GETGUARDSIZE_NP
#define pthread_attr_getinheritsched PTHREAD_ATTR_GETINHERITSCHED
#define pthread_attr_getprio PTHREAD_ATTR_GETPRIO
#define pthread_attr_getsched PTHREAD_ATTR_GETSCHED
#define pthread_attr_getschedparam PTHREAD_ATTR_GETSCHEDPARAM
#define pthread_attr_getstacksize PTHREAD_ATTR_GETSTACKSIZE
#define pthread_attr_init PTHREAD_ATTR_INIT
#define pthread_attr_setdetach_np PTHREAD_ATTR_SETDETACH_NP
#define pthread_attr_setdetachstate PTHREAD_ATTR_SETDETACHSTATE
#define pthread_attr_setguardsize_np PTHREAD_ATTR_SETGUARDSIZE_NP
#define pthread_attr_setinheritsched PTHREAD_ATTR_SETINHERITSCHED
#define pthread_attr_setprio PTHREAD_ATTR_SETPRIO
#define pthread_attr_setsched PTHREAD_ATTR_SETSCHED
#define pthread_attr_setschedparam PTHREAD_ATTR_SETSCHEDPARAM
#define pthread_attr_setschedpolicy PTHREAD_ATTR_SETSCHEDPOLICY
#define pthread_attr_setstacksize PTHREAD_ATTR_SETSTACKSIZE
#define pthread_cancel PTHREAD_CANCEL
#define pthread_cancel_e PTHREAD_CANCEL_E
#define pthread_cond_broadcast PTHREAD_COND_BROADCAST
#define pthread_cond_destroy PTHREAD_COND_DESTROY
#define pthread_cond_init PTHREAD_COND_INIT
#define pthread_cond_sig_preempt_int_np PTHREAD_COND_SIG_PREEMPT_INT_NP
#define pthread_cond_signal PTHREAD_COND_SIGNAL
#define pthread_cond_signal_int_np PTHREAD_COND_SIGNAL_INT_NP
#define pthread_cond_timedwait PTHREAD_COND_TIMEDWAIT
#define pthread_cond_wait PTHREAD_COND_WAIT
#define pthread_condattr_create PTHREAD_CONDATTR_CREATE
#define pthread_condattr_delete PTHREAD_CONDATTR_DELETE
#define pthread_condattr_init PTHREAD_CONDATTR_INIT
#define pthread_create PTHREAD_CREATE
#define pthread_delay_np PTHREAD_DELAY_NP
#define pthread_detach PTHREAD_DETACH
#define pthread_equal PTHREAD_EQUAL
#define pthread_exc_fetch_fp_np PTHREAD_EXC_FETCH_FP_NP
#define pthread_exc_handler_np PTHREAD_EXC_HANDLER_NP
#define pthread_exc_pop_ctx_np PTHREAD_EXC_POP_CTX_NP
#define pthread_exc_push_ctx_np PTHREAD_EXC_PUSH_CTX_NP
#define pthread_exc_savecontext_np PTHREAD_EXC_SAVECONTEXT_NP
#define pthread_exit PTHREAD_EXIT
#define pthread_get_expiration_np PTHREAD_GET_EXPIRATION_NP
#define pthread_getprio PTHREAD_GETPRIO
#define pthread_getschedparam PTHREAD_GETSCHEDPARAM
#define pthread_getscheduler PTHREAD_GETSCHEDULER
#define pthread_getspecific PTHREAD_GETSPECIFIC
#define pthread_getunique_np PTHREAD_GETUNIQUE_NP
#define pthread_join PTHREAD_JOIN
#define pthread_join32 PTHREAD_JOIN32
#define pthread_keycreate PTHREAD_KEYCREATE
#define pthread_key_create PTHREAD_KEY_CREATE
#define pthread_kill PTHREAD_KILL
#define pthread_lock_global_np PTHREAD_LOCK_GLOBAL_NP
#define pthread_mutex_destroy PTHREAD_MUTEX_DESTROY
#define pthread_mutex_init PTHREAD_MUTEX_INIT
#define pthread_mutex_lock PTHREAD_MUTEX_LOCK
#define pthread_mutex_trylock PTHREAD_MUTEX_TRYLOCK
#define pthread_mutex_unlock PTHREAD_MUTEX_UNLOCK
#define pthread_mutexattr_create PTHREAD_MUTEXATTR_CREATE
#define pthread_mutexattr_delete PTHREAD_MUTEXATTR_DELETE
#define pthread_mutexattr_destroy PTHREAD_MUTEXATTR_DESTROY
#define pthread_mutexattr_getkind_np PTHREAD_MUTEXATTR_GETKIND_NP
#define pthread_mutexattr_init PTHREAD_MUTEXATTR_INIT
#define pthread_mutexattr_setkind_np PTHREAD_MUTEXATTR_SETKIND_NP
#define pthread_mutexattr_settype_np PTHREAD_MUTEXATTR_SETTYPE_NP
#define pthread_once PTHREAD_ONCE
#define pthread_resume_np PTHREAD_RESUME_NP
#define pthread_self PTHREAD_SELF
#define pthread_setasynccancel PTHREAD_SETASYNCCANCEL
#define pthread_setcancel PTHREAD_SETCANCEL
#define pthread_setcancelstate PTHREAD_SETCANCELSTATE
#define pthread_setprio PTHREAD_SETPRIO
#define pthread_setschedparam PTHREAD_SETSCHEDPARAM
#define pthread_setscheduler PTHREAD_SETSCHEDULER
#define pthread_setspecific PTHREAD_SETSPECIFIC
#define pthread_suspend_np PTHREAD_SUSPEND_NP
#define pthread_testcancel PTHREAD_TESTCANCEL
#define pthread_unlock_global_np PTHREAD_UNLOCK_GLOBAL_NP
#define pthread_yield PTHREAD_YIELD
#define pthread_yield_np PTHREAD_YIELD_NP
#define XDefaultRootWindow XDEFAULTROOTWINDOW
#define XDisplayCells XDISPLAYCELLS
#define XMaxRequestSize XMAXREQUESTSIZE
#define XScreenOfDisplay XSCREENOFDISPLAY
#define XSetFillRule XSETFILLRULE
#define XmActivateProtocol XMACTIVATEPROTOCOL
#define XmCreateBulletinBoardDialog XMCREATEBULLETINBOARDDIALOG
#define XmCreateErrorDialog XMCREATEERRORDIALOG
#define XmCreateWarningDialog XMCREATEWARNINGDIALOG
#define XmCvtCTToXmString XMCVTCTTOXMSTRING
#define XmDestroyPixmap XMDESTROYPIXMAP
#define XmGetPixmap XMGETPIXMAP
#define XmInstallImage XMINSTALLIMAGE
#define XmListAddItems XMLISTADDITEMS
#define XmListDeleteItem XMLISTDELETEITEM
#define XmListItemExists XMLISTITEMEXISTS
#define XmListItemPos XMLISTITEMPOS
#define XmListReplaceItems XMLISTREPLACEITEMS
#define XmListReplaceItemsPos XMLISTREPLACEITEMSPOS
#define XmRemoveProtocols XMREMOVEPROTOCOLS
#define XmRemoveTabGroup XMREMOVETABGROUP
#define XmSetColorCalculation XMSETCOLORCALCULATION
#define XmTextCopy XMTEXTCOPY
#define XmTextCut XMTEXTCUT
#define XmTextFieldClearSelection XMTEXTFIELDCLEARSELECTION
#define XmTextFieldCopy XMTEXTFIELDCOPY
#define XmTextFieldCut XMTEXTFIELDCUT
#define XmTextFieldGetMaxLength XMTEXTFIELDGETMAXLENGTH
#define XmTextFieldGetSelectionPosition XMTEXTFIELDGETSELECTIONPOSITION
#define XmTextFieldPaste XMTEXTFIELDPASTE
#define XmTextFieldReplace XMTEXTFIELDREPLACE
#define XmTextFieldSetAddMode XMTEXTFIELDSETADDMODE
#define XmTextFieldSetHighlight XMTEXTFIELDSETHIGHLIGHT
#define XmTextFieldSetInsertionPosition XMTEXTFIELDSETINSERTIONPOSITION
#define XmTextFieldSetMaxLength XMTEXTFIELDSETMAXLENGTH
#define XmTextFieldShowPosition XMTEXTFIELDSHOWPOSITION
#define XmTextGetEditable XMTEXTGETEDITABLE
#define XmTextPaste XMTEXTPASTE
#define XmTextPosToXY XMTEXTPOSTOXY
#define XmTextSetEditable XMTEXTSETEDITABLE
#define XmTextShowPosition XMTEXTSHOWPOSITION
#define XmUninstallImage XMUNINSTALLIMAGE
#define XmuCvtStringToBitmap XMUCVTSTRINGTOBITMAP
#define XrmPutFileDatabase XRMPUTFILEDATABASE
#define XtAddConverter XTADDCONVERTER
#define XtError XTERROR
#define XtVaCreatePopupShell XTVACREATEPOPUPSHELL
#define pthread_attr_getschedpolicy PTHREAD_ATTR_GETSCHEDPOLICY
#define pthread_key_delete PTHREAD_KEY_DELETE
#define xmBulletinBoardWidgetClass XMBULLETINBOARDWIDGETCLASS
#define xmScaleWidgetClass XMSCALEWIDGETCLASS
#define XtDisplay XTDISPLAY
#define XtScreen XTSCREEN
#define XAllocIconSize XALLOCICONSIZE
#define XAllocStandardColormap XALLOCSTANDARDCOLORMAP
#define XAllowEvents XALLOWEVENTS
#define XBlackPixel XBLACKPIXEL
#define XCopyColormapAndFree XCOPYCOLORMAPANDFREE
#define XDefaultGC XDEFAULTGC
#define XDisplayHeight XDISPLAYHEIGHT
#define XDisplayWidth XDISPLAYWIDTH
#define XGetCommand XGETCOMMAND
#define XGetIconSizes XGETICONSIZES
#define XKillClient XKILLCLIENT
#define XListInstalledColormaps XLISTINSTALLEDCOLORMAPS
#define XRootWindow XROOTWINDOW
#define XWMGeometry XWMGEOMETRY
#define XWhitePixel XWHITEPIXEL
#define XrmCombineDatabase XRMCOMBINEDATABASE
#define XrmCombineFileDatabase XRMCOMBINEFILEDATABASE
#define XSetStandardProperties XSETSTANDARDPROPERTIES
#define XSetState XSETSTATE
#define XDrawRectangles XDRAWRECTANGLES
#define XGrabButton XGRABBUTTON
#define XLookupColor XLOOKUPCOLOR
#define XMapSubwindows XMAPSUBWINDOWS
#define XRecolorCursor XRECOLORCURSOR
#define XStoreBytes XSTOREBYTES
#define XUngrabButton XUNGRABBUTTON
#define XUninstallColormap XUNINSTALLCOLORMAP
#define lib$wait LIB$WAIT
#define lib$find_file LIB$FIND_FILE
#define lib$find_file_end LIB$FIND_FILE_END
#define lib$set_symbol LIB$SET_SYMBOL
#define lib$sfree1_dd LIB$SFREE1_DD
#define lib$spawn LIB$SPAWN
#define sys$assign SYS$ASSIGN
#define sys$crembx SYS$CREMBX
#define sys$dassgn SYS$DASSGN
#define sys$dclexh SYS$DCLEXH
#define sys$getdviw SYS$GETDVIW
#define sys$getsyiw SYS$GETSYIW
#define sys$qio SYS$QIO
#define sys$qiow SYS$QIOW
#define sys$setef SYS$SETEF
#define sys$synch SYS$SYNCH
#define XDrawText XDRAWTEXT
#define XtCloseDisplay XTCLOSEDISPLAY
#define XtDestroyApplicationContext XTDESTROYAPPLICATIONCONTEXT
#define lib$ediv LIB$EDIV
#define lib$subx LIB$SUBX
#define sys$bintim SYS$BINTIM
#define sys$gettim SYS$GETTIM
#define XFetchName XFETCHNAME
#define XPeekIfEvent XPEEKIFEVENT
#define XQueryKeymap XQUERYKEYMAP
#endif
/shark/trunk/ports/mesa/include/GL/gl.h
0,0 → 1,2669
/* $Id: gl.h,v 1.1 2003-02-28 11:41:55 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef __gl_h_
#define __gl_h_
 
#if defined(USE_MGL_NAMESPACE)
#include "gl_mangle.h"
#endif
 
 
/**********************************************************************
* Begin system-specific stuff.
*/
#if defined(__BEOS__)
#include <stdlib.h> /* to get some BeOS-isms */
#endif
 
#if !defined(OPENSTEP) && (defined(NeXT) || defined(NeXT_PDO))
#define OPENSTEP
#endif
 
#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__)
#define __WIN32__
#endif
 
#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__))
# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */
# define GLAPI __declspec(dllexport)
# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */
# define GLAPI __declspec(dllimport)
# else /* for use with static link lib build of Win32 edition only */
# define GLAPI extern
# endif /* _STATIC_MESA support */
# define GLAPIENTRY __stdcall
#else
/* non-Windows compilation */
# define GLAPI extern
# define GLAPIENTRY
#endif /* WIN32 / CYGWIN bracket */
 
#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__)
# define PRAGMA_EXPORT_SUPPORTED 1
#endif
 
/*
* WINDOWS: Include windows.h here to define APIENTRY.
* It is also useful when applications include this file by
* including only glut.h, since glut.h depends on windows.h.
* Applications needing to include windows.h with parms other
* than "WIN32_LEAN_AND_MEAN" may include windows.h before
* glut.h or gl.h.
*/
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__)
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
 
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) && !defined(__CYGWIN__)
#include <gl/mesa_wgl.h>
#endif
 
#if defined(macintosh) && PRAGMA_IMPORT_SUPPORTED
#pragma import on
#endif
 
#ifndef APIENTRY
#define APIENTRY GLAPIENTRY
#endif
 
#ifdef CENTERLINE_CLPP
#define signed
#endif
 
#if defined(PRAGMA_EXPORT_SUPPORTED)
#pragma export on
#endif
 
/*
* End system-specific stuff.
**********************************************************************/
 
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
#define getenv(x) 0
 
#define GL_VERSION_1_1 1
#define GL_VERSION_1_2 1
#define GL_VERSION_1_3 1
#define GL_ARB_imaging 1
 
 
/*
* Datatypes
*/
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef void GLvoid;
typedef signed char GLbyte; /* 1-byte signed */
typedef short GLshort; /* 2-byte signed */
typedef int GLint; /* 4-byte signed */
typedef unsigned char GLubyte; /* 1-byte unsigned */
typedef unsigned short GLushort; /* 2-byte unsigned */
typedef unsigned int GLuint; /* 4-byte unsigned */
typedef int GLsizei; /* 4-byte signed */
typedef float GLfloat; /* single precision float */
typedef float GLclampf; /* single precision float in [0,1] */
typedef double GLdouble; /* double precision float */
typedef double GLclampd; /* double precision float in [0,1] */
 
 
 
/*
* Constants
*/
 
/* Boolean values */
#define GL_FALSE 0x0
#define GL_TRUE 0x1
 
/* Data types */
#define GL_BYTE 0x1400
#define GL_UNSIGNED_BYTE 0x1401
#define GL_SHORT 0x1402
#define GL_UNSIGNED_SHORT 0x1403
#define GL_INT 0x1404
#define GL_UNSIGNED_INT 0x1405
#define GL_FLOAT 0x1406
#define GL_DOUBLE 0x140A
#define GL_2_BYTES 0x1407
#define GL_3_BYTES 0x1408
#define GL_4_BYTES 0x1409
 
/* Primitives */
#define GL_POINTS 0x0000
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
#define GL_POLYGON 0x0009
 
/* Vertex Arrays */
#define GL_VERTEX_ARRAY 0x8074
#define GL_NORMAL_ARRAY 0x8075
#define GL_COLOR_ARRAY 0x8076
#define GL_INDEX_ARRAY 0x8077
#define GL_TEXTURE_COORD_ARRAY 0x8078
#define GL_EDGE_FLAG_ARRAY 0x8079
#define GL_VERTEX_ARRAY_SIZE 0x807A
#define GL_VERTEX_ARRAY_TYPE 0x807B
#define GL_VERTEX_ARRAY_STRIDE 0x807C
#define GL_NORMAL_ARRAY_TYPE 0x807E
#define GL_NORMAL_ARRAY_STRIDE 0x807F
#define GL_COLOR_ARRAY_SIZE 0x8081
#define GL_COLOR_ARRAY_TYPE 0x8082
#define GL_COLOR_ARRAY_STRIDE 0x8083
#define GL_INDEX_ARRAY_TYPE 0x8085
#define GL_INDEX_ARRAY_STRIDE 0x8086
#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
#define GL_VERTEX_ARRAY_POINTER 0x808E
#define GL_NORMAL_ARRAY_POINTER 0x808F
#define GL_COLOR_ARRAY_POINTER 0x8090
#define GL_INDEX_ARRAY_POINTER 0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
#define GL_V2F 0x2A20
#define GL_V3F 0x2A21
#define GL_C4UB_V2F 0x2A22
#define GL_C4UB_V3F 0x2A23
#define GL_C3F_V3F 0x2A24
#define GL_N3F_V3F 0x2A25
#define GL_C4F_N3F_V3F 0x2A26
#define GL_T2F_V3F 0x2A27
#define GL_T4F_V4F 0x2A28
#define GL_T2F_C4UB_V3F 0x2A29
#define GL_T2F_C3F_V3F 0x2A2A
#define GL_T2F_N3F_V3F 0x2A2B
#define GL_T2F_C4F_N3F_V3F 0x2A2C
#define GL_T4F_C4F_N3F_V4F 0x2A2D
 
/* Matrix Mode */
#define GL_MATRIX_MODE 0x0BA0
#define GL_MODELVIEW 0x1700
#define GL_PROJECTION 0x1701
#define GL_TEXTURE 0x1702
 
/* Points */
#define GL_POINT_SMOOTH 0x0B10
#define GL_POINT_SIZE 0x0B11
#define GL_POINT_SIZE_GRANULARITY 0x0B13
#define GL_POINT_SIZE_RANGE 0x0B12
 
/* Lines */
#define GL_LINE_SMOOTH 0x0B20
#define GL_LINE_STIPPLE 0x0B24
#define GL_LINE_STIPPLE_PATTERN 0x0B25
#define GL_LINE_STIPPLE_REPEAT 0x0B26
#define GL_LINE_WIDTH 0x0B21
#define GL_LINE_WIDTH_GRANULARITY 0x0B23
#define GL_LINE_WIDTH_RANGE 0x0B22
 
/* Polygons */
#define GL_POINT 0x1B00
#define GL_LINE 0x1B01
#define GL_FILL 0x1B02
#define GL_CW 0x0900
#define GL_CCW 0x0901
#define GL_FRONT 0x0404
#define GL_BACK 0x0405
#define GL_POLYGON_MODE 0x0B40
#define GL_POLYGON_SMOOTH 0x0B41
#define GL_POLYGON_STIPPLE 0x0B42
#define GL_EDGE_FLAG 0x0B43
#define GL_CULL_FACE 0x0B44
#define GL_CULL_FACE_MODE 0x0B45
#define GL_FRONT_FACE 0x0B46
#define GL_POLYGON_OFFSET_FACTOR 0x8038
#define GL_POLYGON_OFFSET_UNITS 0x2A00
#define GL_POLYGON_OFFSET_POINT 0x2A01
#define GL_POLYGON_OFFSET_LINE 0x2A02
#define GL_POLYGON_OFFSET_FILL 0x8037
 
/* Display Lists */
#define GL_COMPILE 0x1300
#define GL_COMPILE_AND_EXECUTE 0x1301
#define GL_LIST_BASE 0x0B32
#define GL_LIST_INDEX 0x0B33
#define GL_LIST_MODE 0x0B30
 
/* Depth buffer */
#define GL_NEVER 0x0200
#define GL_LESS 0x0201
#define GL_EQUAL 0x0202
#define GL_LEQUAL 0x0203
#define GL_GREATER 0x0204
#define GL_NOTEQUAL 0x0205
#define GL_GEQUAL 0x0206
#define GL_ALWAYS 0x0207
#define GL_DEPTH_TEST 0x0B71
#define GL_DEPTH_BITS 0x0D56
#define GL_DEPTH_CLEAR_VALUE 0x0B73
#define GL_DEPTH_FUNC 0x0B74
#define GL_DEPTH_RANGE 0x0B70
#define GL_DEPTH_WRITEMASK 0x0B72
#define GL_DEPTH_COMPONENT 0x1902
 
/* Lighting */
#define GL_LIGHTING 0x0B50
#define GL_LIGHT0 0x4000
#define GL_LIGHT1 0x4001
#define GL_LIGHT2 0x4002
#define GL_LIGHT3 0x4003
#define GL_LIGHT4 0x4004
#define GL_LIGHT5 0x4005
#define GL_LIGHT6 0x4006
#define GL_LIGHT7 0x4007
#define GL_SPOT_EXPONENT 0x1205
#define GL_SPOT_CUTOFF 0x1206
#define GL_CONSTANT_ATTENUATION 0x1207
#define GL_LINEAR_ATTENUATION 0x1208
#define GL_QUADRATIC_ATTENUATION 0x1209
#define GL_AMBIENT 0x1200
#define GL_DIFFUSE 0x1201
#define GL_SPECULAR 0x1202
#define GL_SHININESS 0x1601
#define GL_EMISSION 0x1600
#define GL_POSITION 0x1203
#define GL_SPOT_DIRECTION 0x1204
#define GL_AMBIENT_AND_DIFFUSE 0x1602
#define GL_COLOR_INDEXES 0x1603
#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
#define GL_LIGHT_MODEL_AMBIENT 0x0B53
#define GL_FRONT_AND_BACK 0x0408
#define GL_SHADE_MODEL 0x0B54
#define GL_FLAT 0x1D00
#define GL_SMOOTH 0x1D01
#define GL_COLOR_MATERIAL 0x0B57
#define GL_COLOR_MATERIAL_FACE 0x0B55
#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
#define GL_NORMALIZE 0x0BA1
 
/* User clipping planes */
#define GL_CLIP_PLANE0 0x3000
#define GL_CLIP_PLANE1 0x3001
#define GL_CLIP_PLANE2 0x3002
#define GL_CLIP_PLANE3 0x3003
#define GL_CLIP_PLANE4 0x3004
#define GL_CLIP_PLANE5 0x3005
 
/* Accumulation buffer */
#define GL_ACCUM_RED_BITS 0x0D58
#define GL_ACCUM_GREEN_BITS 0x0D59
#define GL_ACCUM_BLUE_BITS 0x0D5A
#define GL_ACCUM_ALPHA_BITS 0x0D5B
#define GL_ACCUM_CLEAR_VALUE 0x0B80
#define GL_ACCUM 0x0100
#define GL_ADD 0x0104
#define GL_LOAD 0x0101
#define GL_MULT 0x0103
#define GL_RETURN 0x0102
 
/* Alpha testing */
#define GL_ALPHA_TEST 0x0BC0
#define GL_ALPHA_TEST_REF 0x0BC2
#define GL_ALPHA_TEST_FUNC 0x0BC1
 
/* Blending */
#define GL_BLEND 0x0BE2
#define GL_BLEND_SRC 0x0BE1
#define GL_BLEND_DST 0x0BE0
#define GL_ZERO 0x0
#define GL_ONE 0x1
#define GL_SRC_COLOR 0x0300
#define GL_ONE_MINUS_SRC_COLOR 0x0301
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_DST_ALPHA 0x0304
#define GL_ONE_MINUS_DST_ALPHA 0x0305
#define GL_DST_COLOR 0x0306
#define GL_ONE_MINUS_DST_COLOR 0x0307
#define GL_SRC_ALPHA_SATURATE 0x0308
 
/* Render Mode */
#define GL_FEEDBACK 0x1C01
#define GL_RENDER 0x1C00
#define GL_SELECT 0x1C02
 
/* Feedback */
#define GL_2D 0x0600
#define GL_3D 0x0601
#define GL_3D_COLOR 0x0602
#define GL_3D_COLOR_TEXTURE 0x0603
#define GL_4D_COLOR_TEXTURE 0x0604
#define GL_POINT_TOKEN 0x0701
#define GL_LINE_TOKEN 0x0702
#define GL_LINE_RESET_TOKEN 0x0707
#define GL_POLYGON_TOKEN 0x0703
#define GL_BITMAP_TOKEN 0x0704
#define GL_DRAW_PIXEL_TOKEN 0x0705
#define GL_COPY_PIXEL_TOKEN 0x0706
#define GL_PASS_THROUGH_TOKEN 0x0700
#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
 
/* Selection */
#define GL_SELECTION_BUFFER_POINTER 0x0DF3
#define GL_SELECTION_BUFFER_SIZE 0x0DF4
 
/* Fog */
#define GL_FOG 0x0B60
#define GL_FOG_MODE 0x0B65
#define GL_FOG_DENSITY 0x0B62
#define GL_FOG_COLOR 0x0B66
#define GL_FOG_INDEX 0x0B61
#define GL_FOG_START 0x0B63
#define GL_FOG_END 0x0B64
#define GL_LINEAR 0x2601
#define GL_EXP 0x0800
#define GL_EXP2 0x0801
 
/* Logic Ops */
#define GL_LOGIC_OP 0x0BF1
#define GL_INDEX_LOGIC_OP 0x0BF1
#define GL_COLOR_LOGIC_OP 0x0BF2
#define GL_LOGIC_OP_MODE 0x0BF0
#define GL_CLEAR 0x1500
#define GL_SET 0x150F
#define GL_COPY 0x1503
#define GL_COPY_INVERTED 0x150C
#define GL_NOOP 0x1505
#define GL_INVERT 0x150A
#define GL_AND 0x1501
#define GL_NAND 0x150E
#define GL_OR 0x1507
#define GL_NOR 0x1508
#define GL_XOR 0x1506
#define GL_EQUIV 0x1509
#define GL_AND_REVERSE 0x1502
#define GL_AND_INVERTED 0x1504
#define GL_OR_REVERSE 0x150B
#define GL_OR_INVERTED 0x150D
 
/* Stencil */
#define GL_STENCIL_TEST 0x0B90
#define GL_STENCIL_WRITEMASK 0x0B98
#define GL_STENCIL_BITS 0x0D57
#define GL_STENCIL_FUNC 0x0B92
#define GL_STENCIL_VALUE_MASK 0x0B93
#define GL_STENCIL_REF 0x0B97
#define GL_STENCIL_FAIL 0x0B94
#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
#define GL_STENCIL_CLEAR_VALUE 0x0B91
#define GL_STENCIL_INDEX 0x1901
#define GL_KEEP 0x1E00
#define GL_REPLACE 0x1E01
#define GL_INCR 0x1E02
#define GL_DECR 0x1E03
 
/* Buffers, Pixel Drawing/Reading */
#define GL_NONE 0x0
#define GL_LEFT 0x0406
#define GL_RIGHT 0x0407
/*GL_FRONT 0x0404 */
/*GL_BACK 0x0405 */
/*GL_FRONT_AND_BACK 0x0408 */
#define GL_FRONT_LEFT 0x0400
#define GL_FRONT_RIGHT 0x0401
#define GL_BACK_LEFT 0x0402
#define GL_BACK_RIGHT 0x0403
#define GL_AUX0 0x0409
#define GL_AUX1 0x040A
#define GL_AUX2 0x040B
#define GL_AUX3 0x040C
#define GL_COLOR_INDEX 0x1900
#define GL_RED 0x1903
#define GL_GREEN 0x1904
#define GL_BLUE 0x1905
#define GL_ALPHA 0x1906
#define GL_LUMINANCE 0x1909
#define GL_LUMINANCE_ALPHA 0x190A
#define GL_ALPHA_BITS 0x0D55
#define GL_RED_BITS 0x0D52
#define GL_GREEN_BITS 0x0D53
#define GL_BLUE_BITS 0x0D54
#define GL_INDEX_BITS 0x0D51
#define GL_SUBPIXEL_BITS 0x0D50
#define GL_AUX_BUFFERS 0x0C00
#define GL_READ_BUFFER 0x0C02
#define GL_DRAW_BUFFER 0x0C01
#define GL_DOUBLEBUFFER 0x0C32
#define GL_STEREO 0x0C33
#define GL_BITMAP 0x1A00
#define GL_COLOR 0x1800
#define GL_DEPTH 0x1801
#define GL_STENCIL 0x1802
#define GL_DITHER 0x0BD0
#define GL_RGB 0x1907
#define GL_RGBA 0x1908
 
/* Implementation limits */
#define GL_MAX_LIST_NESTING 0x0B31
#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
#define GL_MAX_NAME_STACK_DEPTH 0x0D37
#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
#define GL_MAX_EVAL_ORDER 0x0D30
#define GL_MAX_LIGHTS 0x0D31
#define GL_MAX_CLIP_PLANES 0x0D32
#define GL_MAX_TEXTURE_SIZE 0x0D33
#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
#define GL_MAX_VIEWPORT_DIMS 0x0D3A
#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
 
/* Gets */
#define GL_ATTRIB_STACK_DEPTH 0x0BB0
#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
#define GL_COLOR_CLEAR_VALUE 0x0C22
#define GL_COLOR_WRITEMASK 0x0C23
#define GL_CURRENT_INDEX 0x0B01
#define GL_CURRENT_COLOR 0x0B00
#define GL_CURRENT_NORMAL 0x0B02
#define GL_CURRENT_RASTER_COLOR 0x0B04
#define GL_CURRENT_RASTER_DISTANCE 0x0B09
#define GL_CURRENT_RASTER_INDEX 0x0B05
#define GL_CURRENT_RASTER_POSITION 0x0B07
#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
#define GL_CURRENT_TEXTURE_COORDS 0x0B03
#define GL_INDEX_CLEAR_VALUE 0x0C20
#define GL_INDEX_MODE 0x0C30
#define GL_INDEX_WRITEMASK 0x0C21
#define GL_MODELVIEW_MATRIX 0x0BA6
#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
#define GL_NAME_STACK_DEPTH 0x0D70
#define GL_PROJECTION_MATRIX 0x0BA7
#define GL_PROJECTION_STACK_DEPTH 0x0BA4
#define GL_RENDER_MODE 0x0C40
#define GL_RGBA_MODE 0x0C31
#define GL_TEXTURE_MATRIX 0x0BA8
#define GL_TEXTURE_STACK_DEPTH 0x0BA5
#define GL_VIEWPORT 0x0BA2
 
/* Evaluators */
#define GL_AUTO_NORMAL 0x0D80
#define GL_MAP1_COLOR_4 0x0D90
#define GL_MAP1_INDEX 0x0D91
#define GL_MAP1_NORMAL 0x0D92
#define GL_MAP1_TEXTURE_COORD_1 0x0D93
#define GL_MAP1_TEXTURE_COORD_2 0x0D94
#define GL_MAP1_TEXTURE_COORD_3 0x0D95
#define GL_MAP1_TEXTURE_COORD_4 0x0D96
#define GL_MAP1_VERTEX_3 0x0D97
#define GL_MAP1_VERTEX_4 0x0D98
#define GL_MAP2_COLOR_4 0x0DB0
#define GL_MAP2_INDEX 0x0DB1
#define GL_MAP2_NORMAL 0x0DB2
#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
#define GL_MAP2_VERTEX_3 0x0DB7
#define GL_MAP2_VERTEX_4 0x0DB8
#define GL_MAP1_GRID_DOMAIN 0x0DD0
#define GL_MAP1_GRID_SEGMENTS 0x0DD1
#define GL_MAP2_GRID_DOMAIN 0x0DD2
#define GL_MAP2_GRID_SEGMENTS 0x0DD3
#define GL_COEFF 0x0A00
#define GL_DOMAIN 0x0A02
#define GL_ORDER 0x0A01
 
/* Hints */
#define GL_FOG_HINT 0x0C54
#define GL_LINE_SMOOTH_HINT 0x0C52
#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
#define GL_POINT_SMOOTH_HINT 0x0C51
#define GL_POLYGON_SMOOTH_HINT 0x0C53
#define GL_DONT_CARE 0x1100
#define GL_FASTEST 0x1101
#define GL_NICEST 0x1102
 
/* Scissor box */
#define GL_SCISSOR_TEST 0x0C11
#define GL_SCISSOR_BOX 0x0C10
 
/* Pixel Mode / Transfer */
#define GL_MAP_COLOR 0x0D10
#define GL_MAP_STENCIL 0x0D11
#define GL_INDEX_SHIFT 0x0D12
#define GL_INDEX_OFFSET 0x0D13
#define GL_RED_SCALE 0x0D14
#define GL_RED_BIAS 0x0D15
#define GL_GREEN_SCALE 0x0D18
#define GL_GREEN_BIAS 0x0D19
#define GL_BLUE_SCALE 0x0D1A
#define GL_BLUE_BIAS 0x0D1B
#define GL_ALPHA_SCALE 0x0D1C
#define GL_ALPHA_BIAS 0x0D1D
#define GL_DEPTH_SCALE 0x0D1E
#define GL_DEPTH_BIAS 0x0D1F
#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
#define GL_PIXEL_MAP_S_TO_S 0x0C71
#define GL_PIXEL_MAP_I_TO_I 0x0C70
#define GL_PIXEL_MAP_I_TO_R 0x0C72
#define GL_PIXEL_MAP_I_TO_G 0x0C73
#define GL_PIXEL_MAP_I_TO_B 0x0C74
#define GL_PIXEL_MAP_I_TO_A 0x0C75
#define GL_PIXEL_MAP_R_TO_R 0x0C76
#define GL_PIXEL_MAP_G_TO_G 0x0C77
#define GL_PIXEL_MAP_B_TO_B 0x0C78
#define GL_PIXEL_MAP_A_TO_A 0x0C79
#define GL_PACK_ALIGNMENT 0x0D05
#define GL_PACK_LSB_FIRST 0x0D01
#define GL_PACK_ROW_LENGTH 0x0D02
#define GL_PACK_SKIP_PIXELS 0x0D04
#define GL_PACK_SKIP_ROWS 0x0D03
#define GL_PACK_SWAP_BYTES 0x0D00
#define GL_UNPACK_ALIGNMENT 0x0CF5
#define GL_UNPACK_LSB_FIRST 0x0CF1
#define GL_UNPACK_ROW_LENGTH 0x0CF2
#define GL_UNPACK_SKIP_PIXELS 0x0CF4
#define GL_UNPACK_SKIP_ROWS 0x0CF3
#define GL_UNPACK_SWAP_BYTES 0x0CF0
#define GL_ZOOM_X 0x0D16
#define GL_ZOOM_Y 0x0D17
 
/* Texture mapping */
#define GL_TEXTURE_ENV 0x2300
#define GL_TEXTURE_ENV_MODE 0x2200
#define GL_TEXTURE_1D 0x0DE0
#define GL_TEXTURE_2D 0x0DE1
#define GL_TEXTURE_WRAP_S 0x2802
#define GL_TEXTURE_WRAP_T 0x2803
#define GL_TEXTURE_MAG_FILTER 0x2800
#define GL_TEXTURE_MIN_FILTER 0x2801
#define GL_TEXTURE_ENV_COLOR 0x2201
#define GL_TEXTURE_GEN_S 0x0C60
#define GL_TEXTURE_GEN_T 0x0C61
#define GL_TEXTURE_GEN_MODE 0x2500
#define GL_TEXTURE_BORDER_COLOR 0x1004
#define GL_TEXTURE_WIDTH 0x1000
#define GL_TEXTURE_HEIGHT 0x1001
#define GL_TEXTURE_BORDER 0x1005
#define GL_TEXTURE_COMPONENTS 0x1003
#define GL_TEXTURE_RED_SIZE 0x805C
#define GL_TEXTURE_GREEN_SIZE 0x805D
#define GL_TEXTURE_BLUE_SIZE 0x805E
#define GL_TEXTURE_ALPHA_SIZE 0x805F
#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
#define GL_TEXTURE_INTENSITY_SIZE 0x8061
#define GL_NEAREST_MIPMAP_NEAREST 0x2700
#define GL_NEAREST_MIPMAP_LINEAR 0x2702
#define GL_LINEAR_MIPMAP_NEAREST 0x2701
#define GL_LINEAR_MIPMAP_LINEAR 0x2703
#define GL_OBJECT_LINEAR 0x2401
#define GL_OBJECT_PLANE 0x2501
#define GL_EYE_LINEAR 0x2400
#define GL_EYE_PLANE 0x2502
#define GL_SPHERE_MAP 0x2402
#define GL_DECAL 0x2101
#define GL_MODULATE 0x2100
#define GL_NEAREST 0x2600
#define GL_REPEAT 0x2901
#define GL_CLAMP 0x2900
#define GL_S 0x2000
#define GL_T 0x2001
#define GL_R 0x2002
#define GL_Q 0x2003
#define GL_TEXTURE_GEN_R 0x0C62
#define GL_TEXTURE_GEN_Q 0x0C63
 
/* Utility */
#define GL_VENDOR 0x1F00
#define GL_RENDERER 0x1F01
#define GL_VERSION 0x1F02
#define GL_EXTENSIONS 0x1F03
 
/* Errors */
#define GL_NO_ERROR 0x0
#define GL_INVALID_VALUE 0x0501
#define GL_INVALID_ENUM 0x0500
#define GL_INVALID_OPERATION 0x0502
#define GL_STACK_OVERFLOW 0x0503
#define GL_STACK_UNDERFLOW 0x0504
#define GL_OUT_OF_MEMORY 0x0505
 
/* glPush/PopAttrib bits */
#define GL_CURRENT_BIT 0x00000001
#define GL_POINT_BIT 0x00000002
#define GL_LINE_BIT 0x00000004
#define GL_POLYGON_BIT 0x00000008
#define GL_POLYGON_STIPPLE_BIT 0x00000010
#define GL_PIXEL_MODE_BIT 0x00000020
#define GL_LIGHTING_BIT 0x00000040
#define GL_FOG_BIT 0x00000080
#define GL_DEPTH_BUFFER_BIT 0x00000100
#define GL_ACCUM_BUFFER_BIT 0x00000200
#define GL_STENCIL_BUFFER_BIT 0x00000400
#define GL_VIEWPORT_BIT 0x00000800
#define GL_TRANSFORM_BIT 0x00001000
#define GL_ENABLE_BIT 0x00002000
#define GL_COLOR_BUFFER_BIT 0x00004000
#define GL_HINT_BIT 0x00008000
#define GL_EVAL_BIT 0x00010000
#define GL_LIST_BIT 0x00020000
#define GL_TEXTURE_BIT 0x00040000
#define GL_SCISSOR_BIT 0x00080000
#define GL_ALL_ATTRIB_BITS 0x000FFFFF
 
 
/* OpenGL 1.1 */
#define GL_PROXY_TEXTURE_1D 0x8063
#define GL_PROXY_TEXTURE_2D 0x8064
#define GL_TEXTURE_PRIORITY 0x8066
#define GL_TEXTURE_RESIDENT 0x8067
#define GL_TEXTURE_BINDING_1D 0x8068
#define GL_TEXTURE_BINDING_2D 0x8069
#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
#define GL_ALPHA4 0x803B
#define GL_ALPHA8 0x803C
#define GL_ALPHA12 0x803D
#define GL_ALPHA16 0x803E
#define GL_LUMINANCE4 0x803F
#define GL_LUMINANCE8 0x8040
#define GL_LUMINANCE12 0x8041
#define GL_LUMINANCE16 0x8042
#define GL_LUMINANCE4_ALPHA4 0x8043
#define GL_LUMINANCE6_ALPHA2 0x8044
#define GL_LUMINANCE8_ALPHA8 0x8045
#define GL_LUMINANCE12_ALPHA4 0x8046
#define GL_LUMINANCE12_ALPHA12 0x8047
#define GL_LUMINANCE16_ALPHA16 0x8048
#define GL_INTENSITY 0x8049
#define GL_INTENSITY4 0x804A
#define GL_INTENSITY8 0x804B
#define GL_INTENSITY12 0x804C
#define GL_INTENSITY16 0x804D
#define GL_R3_G3_B2 0x2A10
#define GL_RGB4 0x804F
#define GL_RGB5 0x8050
#define GL_RGB8 0x8051
#define GL_RGB10 0x8052
#define GL_RGB12 0x8053
#define GL_RGB16 0x8054
#define GL_RGBA2 0x8055
#define GL_RGBA4 0x8056
#define GL_RGB5_A1 0x8057
#define GL_RGBA8 0x8058
#define GL_RGB10_A2 0x8059
#define GL_RGBA12 0x805A
#define GL_RGBA16 0x805B
#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF
#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF
 
 
 
/*
* Miscellaneous
*/
 
GLAPI void GLAPIENTRY glClearIndex( GLfloat c );
 
GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha );
 
GLAPI void GLAPIENTRY glClear( GLbitfield mask );
 
GLAPI void GLAPIENTRY glIndexMask( GLuint mask );
 
GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha );
 
GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref );
 
GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor );
 
GLAPI void GLAPIENTRY glLogicOp( GLenum opcode );
 
GLAPI void GLAPIENTRY glCullFace( GLenum mode );
 
GLAPI void GLAPIENTRY glFrontFace( GLenum mode );
 
GLAPI void GLAPIENTRY glPointSize( GLfloat size );
 
GLAPI void GLAPIENTRY glLineWidth( GLfloat width );
 
GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern );
 
GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode );
 
GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units );
 
GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask );
 
GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask );
 
GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag );
 
GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag );
 
GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height);
 
GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation );
 
GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation );
 
GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode );
 
GLAPI void GLAPIENTRY glReadBuffer( GLenum mode );
 
GLAPI void GLAPIENTRY glEnable( GLenum cap );
 
GLAPI void GLAPIENTRY glDisable( GLenum cap );
 
GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap );
 
 
GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */
 
GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */
 
 
GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params );
 
GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params );
 
GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params );
 
GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params );
 
 
GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask );
 
GLAPI void GLAPIENTRY glPopAttrib( void );
 
 
GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */
 
GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */
 
 
GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode );
 
GLAPI GLenum GLAPIENTRY glGetError( void );
 
GLAPI const GLubyte* GLAPIENTRY glGetString( GLenum name );
 
GLAPI void GLAPIENTRY glFinish( void );
 
GLAPI void GLAPIENTRY glFlush( void );
 
GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode );
 
 
/*
* Depth Buffer
*/
 
GLAPI void GLAPIENTRY glClearDepth( GLclampd depth );
 
GLAPI void GLAPIENTRY glDepthFunc( GLenum func );
 
GLAPI void GLAPIENTRY glDepthMask( GLboolean flag );
 
GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val );
 
 
/*
* Accumulation Buffer
*/
 
GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha );
 
GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value );
 
 
/*
* Transformation
*/
 
GLAPI void GLAPIENTRY glMatrixMode( GLenum mode );
 
GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near_val, GLdouble far_val );
 
GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near_val, GLdouble far_val );
 
GLAPI void GLAPIENTRY glViewport( GLint x, GLint y,
GLsizei width, GLsizei height );
 
GLAPI void GLAPIENTRY glPushMatrix( void );
 
GLAPI void GLAPIENTRY glPopMatrix( void );
 
GLAPI void GLAPIENTRY glLoadIdentity( void );
 
GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m );
GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m );
 
GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m );
GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m );
 
GLAPI void GLAPIENTRY glRotated( GLdouble angle,
GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glRotatef( GLfloat angle,
GLfloat x, GLfloat y, GLfloat z );
 
GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z );
 
GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z );
 
 
/*
* Display Lists
*/
 
GLAPI GLboolean GLAPIENTRY glIsList( GLuint list );
 
GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range );
 
GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range );
 
GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode );
 
GLAPI void GLAPIENTRY glEndList( void );
 
GLAPI void GLAPIENTRY glCallList( GLuint list );
 
GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type,
const GLvoid *lists );
 
GLAPI void GLAPIENTRY glListBase( GLuint base );
 
 
/*
* Drawing Functions
*/
 
GLAPI void GLAPIENTRY glBegin( GLenum mode );
 
GLAPI void GLAPIENTRY glEnd( void );
 
 
GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y );
GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y );
GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y );
GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y );
 
GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z );
GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z );
GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z );
 
GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );
GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w );
GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w );
 
GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v );
GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v );
GLAPI void GLAPIENTRY glVertex2iv( const GLint *v );
GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v );
GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v );
GLAPI void GLAPIENTRY glVertex3iv( const GLint *v );
GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v );
GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v );
GLAPI void GLAPIENTRY glVertex4iv( const GLint *v );
GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v );
 
 
GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz );
GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz );
GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz );
GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz );
GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz );
 
GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v );
GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v );
GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v );
GLAPI void GLAPIENTRY glNormal3iv( const GLint *v );
GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v );
 
 
GLAPI void GLAPIENTRY glIndexd( GLdouble c );
GLAPI void GLAPIENTRY glIndexf( GLfloat c );
GLAPI void GLAPIENTRY glIndexi( GLint c );
GLAPI void GLAPIENTRY glIndexs( GLshort c );
GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */
 
GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c );
GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c );
GLAPI void GLAPIENTRY glIndexiv( const GLint *c );
GLAPI void GLAPIENTRY glIndexsv( const GLshort *c );
GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */
 
GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue );
GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue );
GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue );
GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue );
GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue );
GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue );
GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue );
GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue );
 
GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green,
GLbyte blue, GLbyte alpha );
GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green,
GLdouble blue, GLdouble alpha );
GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green,
GLfloat blue, GLfloat alpha );
GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green,
GLint blue, GLint alpha );
GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green,
GLshort blue, GLshort alpha );
GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green,
GLubyte blue, GLubyte alpha );
GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green,
GLuint blue, GLuint alpha );
GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green,
GLushort blue, GLushort alpha );
 
 
GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v );
GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v );
GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v );
GLAPI void GLAPIENTRY glColor3iv( const GLint *v );
GLAPI void GLAPIENTRY glColor3sv( const GLshort *v );
GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v );
GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v );
GLAPI void GLAPIENTRY glColor3usv( const GLushort *v );
 
GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v );
GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v );
GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v );
GLAPI void GLAPIENTRY glColor4iv( const GLint *v );
GLAPI void GLAPIENTRY glColor4sv( const GLshort *v );
GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v );
GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v );
GLAPI void GLAPIENTRY glColor4usv( const GLushort *v );
 
 
GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s );
GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s );
GLAPI void GLAPIENTRY glTexCoord1i( GLint s );
GLAPI void GLAPIENTRY glTexCoord1s( GLshort s );
 
GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t );
GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t );
GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t );
GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t );
 
GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r );
GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r );
GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r );
GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r );
 
GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q );
GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q );
GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q );
GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q );
 
GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v );
GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v );
GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v );
GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v );
GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v );
GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v );
GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v );
GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v );
GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v );
GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v );
GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v );
GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v );
GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v );
 
 
GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y );
GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y );
GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y );
GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y );
 
GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z );
GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z );
GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z );
 
GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );
GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w );
GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w );
 
GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v );
GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v );
GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v );
GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v );
GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v );
GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v );
GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v );
 
GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v );
GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v );
GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v );
GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v );
 
 
GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 );
GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 );
GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 );
GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 );
 
 
GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 );
GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 );
GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 );
GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 );
 
 
/*
* Vertex Arrays (1.1)
*/
 
GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride,
const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride,
const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params );
 
GLAPI void GLAPIENTRY glArrayElement( GLint i );
 
GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count );
 
GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count,
GLenum type, const GLvoid *indices );
 
GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride,
const GLvoid *pointer );
 
/*
* Lighting
*/
 
GLAPI void GLAPIENTRY glShadeModel( GLenum mode );
 
GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param );
GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname,
const GLfloat *params );
GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname,
const GLint *params );
 
GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname,
GLfloat *params );
GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname,
GLint *params );
 
GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param );
GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params );
GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params );
 
GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param );
GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params );
GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params );
 
GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params );
GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params );
 
GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode );
 
 
/*
* Raster functions
*/
 
GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor );
 
GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLint mapsize,
const GLfloat *values );
GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLint mapsize,
const GLuint *values );
GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLint mapsize,
const GLushort *values );
 
GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values );
GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values );
GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values );
 
GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height,
GLfloat xorig, GLfloat yorig,
GLfloat xmove, GLfloat ymove,
const GLubyte *bitmap );
 
GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
GLvoid *pixels );
 
GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels );
 
GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y,
GLsizei width, GLsizei height,
GLenum type );
 
/*
* Stenciling
*/
 
GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask );
 
GLAPI void GLAPIENTRY glStencilMask( GLuint mask );
 
GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass );
 
GLAPI void GLAPIENTRY glClearStencil( GLint s );
 
 
 
/*
* Texture mapping
*/
 
GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param );
GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params );
GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params );
GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params );
 
GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params );
GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params );
GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params );
 
 
GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params );
GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params );
 
GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params );
GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params );
 
 
GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname,
const GLfloat *params );
GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname,
const GLint *params );
 
GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target,
GLenum pname, GLfloat *params);
GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target,
GLenum pname, GLint *params );
 
GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level,
GLenum pname, GLfloat *params );
GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params );
 
 
GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level,
GLint internalFormat,
GLsizei width, GLint border,
GLenum format, GLenum type,
const GLvoid *pixels );
 
GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level,
GLint internalFormat,
GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels );
 
GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level,
GLenum format, GLenum type,
GLvoid *pixels );
 
 
/* 1.1 functions */
 
GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures );
 
GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures);
 
GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture );
 
GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n,
const GLuint *textures,
const GLclampf *priorities );
 
GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n,
const GLuint *textures,
GLboolean *residences );
 
GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture );
 
 
GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level,
GLint xoffset,
GLsizei width, GLenum format,
GLenum type, const GLvoid *pixels );
 
 
GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels );
 
 
GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level,
GLenum internalformat,
GLint x, GLint y,
GLsizei width, GLint border );
 
 
GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level,
GLenum internalformat,
GLint x, GLint y,
GLsizei width, GLsizei height,
GLint border );
 
 
GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level,
GLint xoffset, GLint x, GLint y,
GLsizei width );
 
 
GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint x, GLint y,
GLsizei width, GLsizei height );
 
 
/*
* Evaluators
*/
 
GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2,
GLint stride,
GLint order, const GLdouble *points );
GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2,
GLint stride,
GLint order, const GLfloat *points );
 
GLAPI void GLAPIENTRY glMap2d( GLenum target,
GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
const GLdouble *points );
GLAPI void GLAPIENTRY glMap2f( GLenum target,
GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
const GLfloat *points );
 
GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v );
GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v );
GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v );
 
GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u );
GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u );
 
GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u );
GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u );
 
GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v );
GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v );
 
GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u );
GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u );
 
GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 );
GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 );
 
GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2,
GLint vn, GLdouble v1, GLdouble v2 );
GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2,
GLint vn, GLfloat v1, GLfloat v2 );
 
GLAPI void GLAPIENTRY glEvalPoint1( GLint i );
 
GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j );
 
GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 );
 
GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );
 
 
/*
* Fog
*/
 
GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param );
 
GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param );
 
GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params );
 
GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params );
 
 
/*
* Selection and Feedback
*/
 
GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer );
 
GLAPI void GLAPIENTRY glPassThrough( GLfloat token );
 
GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer );
 
GLAPI void GLAPIENTRY glInitNames( void );
 
GLAPI void GLAPIENTRY glLoadName( GLuint name );
 
GLAPI void GLAPIENTRY glPushName( GLuint name );
 
GLAPI void GLAPIENTRY glPopName( void );
 
 
 
/*
* OpenGL 1.2
*/
 
#define GL_RESCALE_NORMAL 0x803A
#define GL_CLAMP_TO_EDGE 0x812F
#define GL_MAX_ELEMENTS_VERTICES 0x80E8
#define GL_MAX_ELEMENTS_INDICES 0x80E9
#define GL_BGR 0x80E0
#define GL_BGRA 0x80E1
#define GL_UNSIGNED_BYTE_3_3_2 0x8032
#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
#define GL_UNSIGNED_SHORT_5_6_5 0x8363
#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
#define GL_UNSIGNED_INT_8_8_8_8 0x8035
#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
#define GL_UNSIGNED_INT_10_10_10_2 0x8036
#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
#define GL_SINGLE_COLOR 0x81F9
#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
#define GL_TEXTURE_MIN_LOD 0x813A
#define GL_TEXTURE_MAX_LOD 0x813B
#define GL_TEXTURE_BASE_LEVEL 0x813C
#define GL_TEXTURE_MAX_LEVEL 0x813D
#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
#define GL_PACK_SKIP_IMAGES 0x806B
#define GL_PACK_IMAGE_HEIGHT 0x806C
#define GL_UNPACK_SKIP_IMAGES 0x806D
#define GL_UNPACK_IMAGE_HEIGHT 0x806E
#define GL_TEXTURE_3D 0x806F
#define GL_PROXY_TEXTURE_3D 0x8070
#define GL_TEXTURE_DEPTH 0x8071
#define GL_TEXTURE_WRAP_R 0x8072
#define GL_MAX_3D_TEXTURE_SIZE 0x8073
#define GL_TEXTURE_BINDING_3D 0x806A
 
GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start,
GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
 
GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level,
GLint internalFormat,
GLsizei width, GLsizei height,
GLsizei depth, GLint border,
GLenum format, GLenum type,
const GLvoid *pixels );
 
GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width,
GLsizei height, GLsizei depth,
GLenum format,
GLenum type, const GLvoid *pixels);
 
GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint zoffset, GLint x,
GLint y, GLsizei width,
GLsizei height );
 
typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
 
 
/*
* GL_ARB_imaging
*/
 
#define GL_CONSTANT_COLOR 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
#define GL_CONSTANT_ALPHA 0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
#define GL_COLOR_TABLE 0x80D0
#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
#define GL_PROXY_COLOR_TABLE 0x80D3
#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
#define GL_COLOR_TABLE_SCALE 0x80D6
#define GL_COLOR_TABLE_BIAS 0x80D7
#define GL_COLOR_TABLE_FORMAT 0x80D8
#define GL_COLOR_TABLE_WIDTH 0x80D9
#define GL_COLOR_TABLE_RED_SIZE 0x80DA
#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
#define GL_CONVOLUTION_1D 0x8010
#define GL_CONVOLUTION_2D 0x8011
#define GL_SEPARABLE_2D 0x8012
#define GL_CONVOLUTION_BORDER_MODE 0x8013
#define GL_CONVOLUTION_FILTER_SCALE 0x8014
#define GL_CONVOLUTION_FILTER_BIAS 0x8015
#define GL_REDUCE 0x8016
#define GL_CONVOLUTION_FORMAT 0x8017
#define GL_CONVOLUTION_WIDTH 0x8018
#define GL_CONVOLUTION_HEIGHT 0x8019
#define GL_MAX_CONVOLUTION_WIDTH 0x801A
#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
#define GL_CONSTANT_BORDER 0x8151
#define GL_REPLICATE_BORDER 0x8153
#define GL_CONVOLUTION_BORDER_COLOR 0x8154
#define GL_COLOR_MATRIX 0x80B1
#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
#define GL_HISTOGRAM 0x8024
#define GL_PROXY_HISTOGRAM 0x8025
#define GL_HISTOGRAM_WIDTH 0x8026
#define GL_HISTOGRAM_FORMAT 0x8027
#define GL_HISTOGRAM_RED_SIZE 0x8028
#define GL_HISTOGRAM_GREEN_SIZE 0x8029
#define GL_HISTOGRAM_BLUE_SIZE 0x802A
#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
#define GL_HISTOGRAM_SINK 0x802D
#define GL_MINMAX 0x802E
#define GL_MINMAX_FORMAT 0x802F
#define GL_MINMAX_SINK 0x8030
#define GL_TABLE_TOO_LARGE 0x8031
#define GL_BLEND_EQUATION 0x8009
#define GL_MIN 0x8007
#define GL_MAX 0x8008
#define GL_FUNC_ADD 0x8006
#define GL_FUNC_SUBTRACT 0x800A
#define GL_FUNC_REVERSE_SUBTRACT 0x800B
#define GL_BLEND_COLOR 0x8005
 
 
GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat,
GLsizei width, GLenum format,
GLenum type, const GLvoid *table );
 
GLAPI void GLAPIENTRY glColorSubTable( GLenum target,
GLsizei start, GLsizei count,
GLenum format, GLenum type,
const GLvoid *data );
 
GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname,
const GLint *params);
 
GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname,
const GLfloat *params);
 
GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width );
 
GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width );
 
GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format,
GLenum type, GLvoid *table );
 
GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname,
GLfloat *params );
 
GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname,
GLint *params );
 
GLAPI void GLAPIENTRY glBlendEquation( GLenum mode );
 
GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green,
GLclampf blue, GLclampf alpha );
 
GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width,
GLenum internalformat, GLboolean sink );
 
GLAPI void GLAPIENTRY glResetHistogram( GLenum target );
 
GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset,
GLenum format, GLenum type,
GLvoid *values );
 
GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname,
GLfloat *params );
 
GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname,
GLint *params );
 
GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat,
GLboolean sink );
 
GLAPI void GLAPIENTRY glResetMinmax( GLenum target );
 
GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset,
GLenum format, GLenum types,
GLvoid *values );
 
GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname,
GLfloat *params );
 
GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname,
GLint *params );
 
GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target,
GLenum internalformat, GLsizei width, GLenum format, GLenum type,
const GLvoid *image );
 
GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target,
GLenum internalformat, GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *image );
 
GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname,
GLfloat params );
 
GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname,
const GLfloat *params );
 
GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname,
GLint params );
 
GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname,
const GLint *params );
 
GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target,
GLenum internalformat, GLint x, GLint y, GLsizei width );
 
GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target,
GLenum internalformat, GLint x, GLint y, GLsizei width,
GLsizei height);
 
GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format,
GLenum type, GLvoid *image );
 
GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname,
GLfloat *params );
 
GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname,
GLint *params );
 
GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target,
GLenum internalformat, GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *row, const GLvoid *column );
 
GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format,
GLenum type, GLvoid *row, GLvoid *column, GLvoid *span );
 
typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);
typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);
 
 
 
/*
* OpenGL 1.3
*/
 
/* multitexture */
#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84C3
#define GL_TEXTURE4 0x84C4
#define GL_TEXTURE5 0x84C5
#define GL_TEXTURE6 0x84C6
#define GL_TEXTURE7 0x84C7
#define GL_TEXTURE8 0x84C8
#define GL_TEXTURE9 0x84C9
#define GL_TEXTURE10 0x84CA
#define GL_TEXTURE11 0x84CB
#define GL_TEXTURE12 0x84CC
#define GL_TEXTURE13 0x84CD
#define GL_TEXTURE14 0x84CE
#define GL_TEXTURE15 0x84CF
#define GL_TEXTURE16 0x84D0
#define GL_TEXTURE17 0x84D1
#define GL_TEXTURE18 0x84D2
#define GL_TEXTURE19 0x84D3
#define GL_TEXTURE20 0x84D4
#define GL_TEXTURE21 0x84D5
#define GL_TEXTURE22 0x84D6
#define GL_TEXTURE23 0x84D7
#define GL_TEXTURE24 0x84D8
#define GL_TEXTURE25 0x84D9
#define GL_TEXTURE26 0x84DA
#define GL_TEXTURE27 0x84DB
#define GL_TEXTURE28 0x84DC
#define GL_TEXTURE29 0x84DD
#define GL_TEXTURE30 0x84DE
#define GL_TEXTURE31 0x84DF
#define GL_ACTIVE_TEXTURE 0x84E0
#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
#define GL_MAX_TEXTURE_UNITS 0x84E2
/* texture_cube_map */
#define GL_NORMAL_MAP 0x8511
#define GL_REFLECTION_MAP 0x8512
#define GL_TEXTURE_CUBE_MAP 0x8513
#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
/* texture_compression */
#define GL_COMPRESSED_ALPHA 0x84E9
#define GL_COMPRESSED_LUMINANCE 0x84EA
#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
#define GL_COMPRESSED_INTENSITY 0x84EC
#define GL_COMPRESSED_RGB 0x84ED
#define GL_COMPRESSED_RGBA 0x84EE
#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
#define GL_TEXTURE_COMPRESSED 0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
/* multisample */
#define GL_MULTISAMPLE 0x809D
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
#define GL_SAMPLE_COVERAGE 0x80A0
#define GL_SAMPLE_BUFFERS 0x80A8
#define GL_SAMPLES 0x80A9
#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
#define GL_MULTISAMPLE_BIT 0x20000000
/* transpose_matrix */
#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
/* texture_env_combine */
#define GL_COMBINE 0x8570
#define GL_COMBINE_RGB 0x8571
#define GL_COMBINE_ALPHA 0x8572
#define GL_SOURCE0_RGB 0x8580
#define GL_SOURCE1_RGB 0x8581
#define GL_SOURCE2_RGB 0x8582
#define GL_SOURCE0_ALPHA 0x8588
#define GL_SOURCE1_ALPHA 0x8589
#define GL_SOURCE2_ALPHA 0x858A
#define GL_OPERAND0_RGB 0x8590
#define GL_OPERAND1_RGB 0x8591
#define GL_OPERAND2_RGB 0x8592
#define GL_OPERAND0_ALPHA 0x8598
#define GL_OPERAND1_ALPHA 0x8599
#define GL_OPERAND2_ALPHA 0x859A
#define GL_RGB_SCALE 0x8573
#define GL_ADD_SIGNED 0x8574
#define GL_INTERPOLATE 0x8575
#define GL_SUBTRACT 0x84E7
#define GL_CONSTANT 0x8576
#define GL_PRIMARY_COLOR 0x8577
#define GL_PREVIOUS 0x8578
/* texture_env_dot3 */
#define GL_DOT3_RGB 0x86AE
#define GL_DOT3_RGBA 0x86AF
/* texture_border_clamp */
#define GL_CLAMP_TO_BORDER 0x812D
 
GLAPI void GLAPIENTRY glActiveTexture( GLenum texture );
 
GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture );
 
GLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data );
 
GLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img );
 
GLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s );
 
GLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s );
 
GLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s );
 
GLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s );
 
GLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t );
 
GLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t );
 
GLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t );
 
GLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t );
 
GLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r );
 
GLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r );
 
GLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r );
 
GLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r );
 
GLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q );
 
GLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q );
 
GLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q );
 
GLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v );
 
GLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q );
 
GLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v );
 
 
GLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] );
 
GLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] );
 
GLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] );
 
GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] );
 
GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert );
 
typedef void (APIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m);
typedef void (APIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
 
 
/*
* GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1)
*/
#ifndef GL_ARB_multitexture
#define GL_ARB_multitexture 1
 
#define GL_TEXTURE0_ARB 0x84C0
#define GL_TEXTURE1_ARB 0x84C1
#define GL_TEXTURE2_ARB 0x84C2
#define GL_TEXTURE3_ARB 0x84C3
#define GL_TEXTURE4_ARB 0x84C4
#define GL_TEXTURE5_ARB 0x84C5
#define GL_TEXTURE6_ARB 0x84C6
#define GL_TEXTURE7_ARB 0x84C7
#define GL_TEXTURE8_ARB 0x84C8
#define GL_TEXTURE9_ARB 0x84C9
#define GL_TEXTURE10_ARB 0x84CA
#define GL_TEXTURE11_ARB 0x84CB
#define GL_TEXTURE12_ARB 0x84CC
#define GL_TEXTURE13_ARB 0x84CD
#define GL_TEXTURE14_ARB 0x84CE
#define GL_TEXTURE15_ARB 0x84CF
#define GL_TEXTURE16_ARB 0x84D0
#define GL_TEXTURE17_ARB 0x84D1
#define GL_TEXTURE18_ARB 0x84D2
#define GL_TEXTURE19_ARB 0x84D3
#define GL_TEXTURE20_ARB 0x84D4
#define GL_TEXTURE21_ARB 0x84D5
#define GL_TEXTURE22_ARB 0x84D6
#define GL_TEXTURE23_ARB 0x84D7
#define GL_TEXTURE24_ARB 0x84D8
#define GL_TEXTURE25_ARB 0x84D9
#define GL_TEXTURE26_ARB 0x84DA
#define GL_TEXTURE27_ARB 0x84DB
#define GL_TEXTURE28_ARB 0x84DC
#define GL_TEXTURE29_ARB 0x84DD
#define GL_TEXTURE30_ARB 0x84DE
#define GL_TEXTURE31_ARB 0x84DF
#define GL_ACTIVE_TEXTURE_ARB 0x84E0
#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
 
GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture);
GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture);
GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s);
GLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v);
GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s);
GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v);
GLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s);
GLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v);
GLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s);
GLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v);
GLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t);
GLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v);
GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t);
GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v);
GLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t);
GLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v);
GLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t);
GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v);
GLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r);
GLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v);
GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r);
GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v);
GLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r);
GLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v);
GLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r);
GLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v);
GLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
GLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v);
GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v);
GLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q);
GLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v);
GLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v);
 
typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
 
#endif /* GL_ARB_multitexture */
 
 
 
/*
* Define this token if you want "old-style" header file behaviour (extensions
* defined in gl.h). Otherwise, extensions will be included from glext.h.
*/
#if defined(GL_GLEXT_LEGACY)
 
 
/*
* 1. GL_EXT_abgr
*/
#ifndef GL_EXT_abgr
#define GL_EXT_abgr 1
 
#define GL_ABGR_EXT 0x8000
 
#endif /* GL_EXT_abgr */
 
 
 
/*
* 2. GL_EXT_blend_color
*/
#ifndef GL_EXT_blend_color
#define GL_EXT_blend_color 1
 
#define GL_CONSTANT_COLOR_EXT 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
#define GL_CONSTANT_ALPHA_EXT 0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
#define GL_BLEND_COLOR_EXT 0x8005
 
GLAPI void GLAPIENTRY glBlendColorEXT( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha );
 
#endif /* GL_EXT_blend_color */
 
 
 
/*
* 3. GL_EXT_polygon_offset
*/
#ifndef GL_EXT_polygon_offset
#define GL_EXT_polygon_offset 1
 
#define GL_POLYGON_OFFSET_EXT 0x8037
#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
 
GLAPI void GLAPIENTRY glPolygonOffsetEXT( GLfloat factor, GLfloat bias );
 
#endif /* GL_EXT_polygon_offset */
 
 
 
/*
* 6. GL_EXT_texture3D
*/
#ifndef GL_EXT_texture3D
#define GL_EXT_texture3D 1
 
#define GL_PACK_SKIP_IMAGES_EXT 0x806B
#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
#define GL_TEXTURE_3D_EXT 0x806F
#define GL_PROXY_TEXTURE_3D_EXT 0x8070
#define GL_TEXTURE_DEPTH_EXT 0x8071
#define GL_TEXTURE_WRAP_R_EXT 0x8072
#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
#define GL_TEXTURE_3D_BINDING_EXT 0x806A
 
GLAPI void GLAPIENTRY glTexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels );
 
GLAPI void GLAPIENTRY glTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
 
GLAPI void GLAPIENTRY glCopyTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height );
 
#endif /* GL_EXT_texture3D */
 
 
 
/*
* 20. GL_EXT_texture_object
*/
#ifndef GL_EXT_texture_object
#define GL_EXT_texture_object 1
 
#define GL_TEXTURE_PRIORITY_EXT 0x8066
#define GL_TEXTURE_RESIDENT_EXT 0x8067
#define GL_TEXTURE_1D_BINDING_EXT 0x8068
#define GL_TEXTURE_2D_BINDING_EXT 0x8069
 
GLAPI void GLAPIENTRY glGenTexturesEXT( GLsizei n, GLuint *textures );
 
GLAPI void GLAPIENTRY glDeleteTexturesEXT( GLsizei n, const GLuint *textures);
 
GLAPI void GLAPIENTRY glBindTextureEXT( GLenum target, GLuint texture );
 
GLAPI void GLAPIENTRY glPrioritizeTexturesEXT( GLsizei n, const GLuint *textures, const GLclampf *priorities );
 
GLAPI GLboolean GLAPIENTRY glAreTexturesResidentEXT( GLsizei n, const GLuint *textures, GLboolean *residences );
 
GLAPI GLboolean GLAPIENTRY glIsTextureEXT( GLuint texture );
 
#endif /* GL_EXT_texture_object */
 
 
 
/*
* 27. GL_EXT_rescale_normal
*/
#ifndef GL_EXT_rescale_normal
#define GL_EXT_rescale_normal 1
 
#define GL_RESCALE_NORMAL_EXT 0x803A
 
#endif /* GL_EXT_rescale_normal */
 
 
 
/*
* 30. GL_EXT_vertex_array
*/
#ifndef GL_EXT_vertex_array
#define GL_EXT_vertex_array 1
 
#define GL_VERTEX_ARRAY_EXT 0x8074
#define GL_NORMAL_ARRAY_EXT 0x8075
#define GL_COLOR_ARRAY_EXT 0x8076
#define GL_INDEX_ARRAY_EXT 0x8077
#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
 
GLAPI void GLAPIENTRY glVertexPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glNormalPointerEXT( GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glColorPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glIndexPointerEXT( GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glTexCoordPointerEXT( GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr );
 
GLAPI void GLAPIENTRY glEdgeFlagPointerEXT( GLsizei stride, GLsizei count, const GLboolean *ptr );
 
GLAPI void GLAPIENTRY glGetPointervEXT( GLenum pname, GLvoid **params );
 
GLAPI void GLAPIENTRY glArrayElementEXT( GLint i );
 
GLAPI void GLAPIENTRY glDrawArraysEXT( GLenum mode, GLint first, GLsizei count );
 
#endif /* GL_EXT_vertex_array */
 
 
 
/*
* 35. GL_SGIS_texture_edge_clamp
*/
#ifndef GL_SGIS_texture_edge_clamp
#define GL_SGIS_texture_edge_clamp 1
 
#define GL_CLAMP_TO_EDGE_SGIS 0x812F
 
#endif /* GL_SGIS_texture_edge_clamp */
 
 
 
/*
* 37. GL_EXT_blend_minmax
*/
#ifndef GL_EXT_blend_minmax
#define GL_EXT_blend_minmax 1
 
#define GL_FUNC_ADD_EXT 0x8006
#define GL_MIN_EXT 0x8007
#define GL_MAX_EXT 0x8008
#define GL_BLEND_EQUATION_EXT 0x8009
 
GLAPI void GLAPIENTRY glBlendEquationEXT( GLenum mode );
 
#endif /* GL_EXT_blend_minmax */
 
 
 
/*
* 38. GL_EXT_blend_subtract (requires GL_EXT_blend_max )
*/
#ifndef GL_EXT_blend_subtract
#define GL_EXT_blend_subtract 1
 
#define GL_FUNC_SUBTRACT_EXT 0x800A
#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
 
#endif /* GL_EXT_blend_subtract */
 
 
 
/*
* 39. GL_EXT_blend_logic_op
*/
#ifndef GL_EXT_blend_logic_op
#define GL_EXT_blend_logic_op 1
 
/* No new tokens or functions */
 
#endif /* GL_EXT_blend_logic_op */
 
 
 
/*
* 54. GL_EXT_point_parameters
*/
#ifndef GL_EXT_point_parameters
#define GL_EXT_point_parameters 1
 
#define GL_POINT_SIZE_MIN_EXT 0x8126
#define GL_POINT_SIZE_MAX_EXT 0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
#define GL_DISTANCE_ATTENUATION_EXT 0x8129
 
GLAPI void GLAPIENTRY glPointParameterfEXT( GLenum pname, GLfloat param );
GLAPI void GLAPIENTRY glPointParameterfvEXT( GLenum pname, const GLfloat *params );
GLAPI void GLAPIENTRY glPointParameterfSGIS(GLenum pname, GLfloat param);
GLAPI void GLAPIENTRY glPointParameterfvSGIS(GLenum pname, const GLfloat *params);
 
#endif /* GL_EXT_point_parameters */
 
 
 
/*
* 78. GL_EXT_paletted_texture
*/
#ifndef GL_EXT_paletted_texture
#define GL_EXT_paletted_texture 1
 
#define GL_TABLE_TOO_LARGE_EXT 0x8031
#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8
#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9
#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA
#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB
#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC
#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD
#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF
#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
#define GL_COLOR_INDEX1_EXT 0x80E2
#define GL_COLOR_INDEX2_EXT 0x80E3
#define GL_COLOR_INDEX4_EXT 0x80E4
#define GL_COLOR_INDEX8_EXT 0x80E5
#define GL_COLOR_INDEX12_EXT 0x80E6
#define GL_COLOR_INDEX16_EXT 0x80E7
 
GLAPI void GLAPIENTRY glColorTableEXT( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table );
 
GLAPI void GLAPIENTRY glColorSubTableEXT( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data );
 
GLAPI void GLAPIENTRY glGetColorTableEXT( GLenum target, GLenum format, GLenum type, GLvoid *table );
 
GLAPI void GLAPIENTRY glGetColorTableParameterfvEXT( GLenum target, GLenum pname, GLfloat *params );
 
GLAPI void GLAPIENTRY glGetColorTableParameterivEXT( GLenum target, GLenum pname, GLint *params );
 
#endif /* GL_EXT_paletted_texture */
 
 
 
/*
* 79. GL_EXT_clip_volume_hint
*/
#ifndef GL_EXT_clip_volume_hint
#define GL_EXT_clip_volume_hint 1
 
#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
 
#endif /* GL_EXT_clip_volume_hint */
 
 
 
/*
* 97. GL_EXT_compiled_vertex_array
*/
#ifndef GL_EXT_compiled_vertex_array
#define GL_EXT_compiled_vertex_array 1
 
#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8
#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9
 
GLAPI void GLAPIENTRY glLockArraysEXT( GLint first, GLsizei count );
GLAPI void GLAPIENTRY glUnlockArraysEXT( void );
 
#endif /* GL_EXT_compiled_vertex_array */
 
/*
* 137. GL_HP_occlusion_test
*/
#ifndef GL_HP_occlusion_test
#define GL_HP_occlusion_test 1
 
#define GL_OCCLUSION_TEST_HP 0x8165
#define GL_OCCLUSION_TEST_RESULT_HP 0x8166
 
#endif /* GL_HP_occlusion_test */
 
 
/*
* 141. GL_EXT_shared_texture_palette (req's GL_EXT_paletted_texture)
*/
#ifndef GL_EXT_shared_texture_palette
#define GL_EXT_shared_texture_palette 1
 
#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
 
#endif /* GL_EXT_shared_texture_palette */
 
 
 
/*
* 176. GL_EXT_stencil_wrap
*/
#ifndef GL_EXT_stencil_wrap
#define GL_EXT_stencil_wrap 1
 
#define GL_INCR_WRAP_EXT 0x8507
#define GL_DECR_WRAP_EXT 0x8508
 
#endif /* GL_EXT_stencil_wrap */
 
 
 
/*
* 179. GL_NV_texgen_reflection
*/
#ifndef GL_NV_texgen_reflection
#define GL_NV_texgen_reflection 1
 
#define GL_NORMAL_MAP_NV 0x8511
#define GL_REFLECTION_MAP_NV 0x8512
 
#endif /* GL_NV_texgen_reflection */
 
 
 
/*
* 185. GL_EXT_texture_env_add
*/
#ifndef GL_EXT_texture_env_add
#define GL_EXT_texture_env_add 1
 
/* No new tokens or functions */
 
#endif /* GL_EXT_texture_env_add */
 
 
 
/*
* 197. GL_MESA_window_pos
*/
#ifndef GL_MESA_window_pos
#define GL_MESA_window_pos 1
 
GLAPI void GLAPIENTRY glWindowPos2iMESA( GLint x, GLint y );
GLAPI void GLAPIENTRY glWindowPos2sMESA( GLshort x, GLshort y );
GLAPI void GLAPIENTRY glWindowPos2fMESA( GLfloat x, GLfloat y );
GLAPI void GLAPIENTRY glWindowPos2dMESA( GLdouble x, GLdouble y );
GLAPI void GLAPIENTRY glWindowPos2ivMESA( const GLint *p );
GLAPI void GLAPIENTRY glWindowPos2svMESA( const GLshort *p );
GLAPI void GLAPIENTRY glWindowPos2fvMESA( const GLfloat *p );
GLAPI void GLAPIENTRY glWindowPos2dvMESA( const GLdouble *p );
GLAPI void GLAPIENTRY glWindowPos3iMESA( GLint x, GLint y, GLint z );
GLAPI void GLAPIENTRY glWindowPos3sMESA( GLshort x, GLshort y, GLshort z );
GLAPI void GLAPIENTRY glWindowPos3fMESA( GLfloat x, GLfloat y, GLfloat z );
GLAPI void GLAPIENTRY glWindowPos3dMESA( GLdouble x, GLdouble y, GLdouble z );
GLAPI void GLAPIENTRY glWindowPos3ivMESA( const GLint *p );
GLAPI void GLAPIENTRY glWindowPos3svMESA( const GLshort *p );
GLAPI void GLAPIENTRY glWindowPos3fvMESA( const GLfloat *p );
GLAPI void GLAPIENTRY glWindowPos3dvMESA( const GLdouble *p );
GLAPI void GLAPIENTRY glWindowPos4iMESA( GLint x, GLint y, GLint z, GLint w );
GLAPI void GLAPIENTRY glWindowPos4sMESA( GLshort x, GLshort y, GLshort z, GLshort w );
GLAPI void GLAPIENTRY glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
GLAPI void GLAPIENTRY glWindowPos4dMESA( GLdouble x, GLdouble y, GLdouble z, GLdouble w);
GLAPI void GLAPIENTRY glWindowPos4ivMESA( const GLint *p );
GLAPI void GLAPIENTRY glWindowPos4svMESA( const GLshort *p );
GLAPI void GLAPIENTRY glWindowPos4fvMESA( const GLfloat *p );
GLAPI void GLAPIENTRY glWindowPos4dvMESA( const GLdouble *p );
 
#endif /* GL_MESA_window_pos */
 
 
 
/*
* 196. GL_MESA_resize_bufffers
*/
#ifndef GL_MESA_resize_bufffers
#define GL_MESA_resize_buffers 1
 
GLAPI void GLAPIENTRY glResizeBuffersMESA( void );
 
#endif /* GL_MESA_resize_bufffers */
 
 
 
/*
* 220. GL_EXT_texture_env_dot3
*/
#ifndef GL_EXT_texture_env_dot3
#define GL_EXT_texture_env_dot3 1
 
#define GL_DOT3_RGB_EXT 0x8740
#define GL_DOT3_RGBA_EXT 0x8741
 
#endif /* GL_EXT_texture_env_dot3 */
 
 
#else /* GL_GLEXT_LEGACY */
 
#include <GL/glext.h>
 
#endif /* GL_GLEXT_LEGACY */
 
 
 
/*
* ???. GL_MESA_trace
* XXX obsolete
*/
#ifndef GL_MESA_trace
#define GL_MESA_trace 1
 
#define GL_TRACE_ALL_BITS_MESA 0xFFFF
#define GL_TRACE_OPERATIONS_BIT_MESA 0x0001
#define GL_TRACE_PRIMITIVES_BIT_MESA 0x0002
#define GL_TRACE_ARRAYS_BIT_MESA 0x0004
#define GL_TRACE_TEXTURES_BIT_MESA 0x0008
#define GL_TRACE_PIXELS_BIT_MESA 0x0010
#define GL_TRACE_ERRORS_BIT_MESA 0x0020
#define GL_TRACE_MASK_MESA 0x8755
#define GL_TRACE_NAME_MESA 0x8756
 
GLAPI void GLAPIENTRY glEnableTraceMESA( GLbitfield mask );
GLAPI void GLAPIENTRY glDisableTraceMESA( GLbitfield mask );
GLAPI void GLAPIENTRY glNewTraceMESA( GLbitfield mask, const GLubyte * traceName );
GLAPI void GLAPIENTRY glEndTraceMESA( void );
GLAPI void GLAPIENTRY glTraceAssertAttribMESA( GLbitfield attribMask );
GLAPI void GLAPIENTRY glTraceCommentMESA( const GLubyte * comment );
GLAPI void GLAPIENTRY glTraceTextureMESA( GLuint name, const GLubyte* comment );
GLAPI void GLAPIENTRY glTraceListMESA( GLuint name, const GLubyte* comment );
GLAPI void GLAPIENTRY glTracePointerMESA( GLvoid* pointer, const GLubyte* comment );
GLAPI void GLAPIENTRY glTracePointerRangeMESA( const GLvoid* first, const GLvoid* last, const GLubyte* comment );
 
#endif /* GL_MESA_trace */
 
 
/*
* ???. GL_MESA_packed_depth_stencil
* XXX obsolete
*/
#ifndef GL_MESA_packed_depth_stencil
#define GL_MESA_packed_depth_stencil 1
 
#define GL_DEPTH_STENCIL_MESA 0x8750
#define GL_UNSIGNED_INT_24_8_MESA 0x8751
#define GL_UNSIGNED_INT_8_24_REV_MESA 0x8752
#define GL_UNSIGNED_SHORT_15_1_MESA 0x8753
#define GL_UNSIGNED_SHORT_1_15_REV_MESA 0x8754
 
#endif /* GL_MESA_packed_depth_stencil */
 
 
#ifndef GL_MESA_ycbcr_texture
#define GL_MESA_ycbcr_texture 1
 
#define GL_YCBCR_MESA 0x8757
#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA /* same as Apple */
#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB /* same as Apple */
 
#endif /* GL_MESA_texture_ycbcr */
 
 
 
#ifndef GL_MESA_pack_invert
#define GL_MESA_pack_invert 1
 
#define GL_PACK_INVERT_MESA 0x8758
 
#endif /* GL_MESA_pack_invert */
 
 
 
#ifndef GL_APPLE_client_storage
#define GL_APPLE_client_storage 1
 
#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
 
#endif /* GL_APPLE_client_storage */
 
 
 
#ifndef GL_APPLE_ycbcr_422
#define GL_APPLE_ycbcr_422 1
 
#define GL_YCBCR_422_APPLE 0x85B9
#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
 
#endif /* GL_APPLE_ycbcr_422 */
 
 
 
/**********************************************************************
* Begin system-specific stuff
*/
#if defined(PRAGMA_EXPORT_SUPPORTED)
#pragma export off
#endif
 
#if defined(macintosh) && PRAGMA_IMPORT_SUPPORTED
#pragma import off
#endif
/*
* End system-specific stuff
**********************************************************************/
 
 
#ifdef __cplusplus
}
#endif
 
#endif /* __gl_h_ */
/shark/trunk/ports/mesa/include/GL/xmesa_x.h
0,0 → 1,91
 
/**************************************************************************
 
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
All Rights Reserved.
 
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sub license, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
 
The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
**************************************************************************/
 
/*
* Authors:
* Kevin E. Martin <kevin@precisioninsight.com>
*
* $Header: /home/fabio/w/shark/sharkcvs/CVSROOT/shark/ports/mesa/include/GL/xmesa_x.h,v 1.1 2003-02-28 11:41:57 pj Exp $
*/
 
#ifndef _XMESA_X_H_
#define _XMESA_X_H_
 
typedef Display XMesaDisplay;
typedef Pixmap XMesaPixmap;
typedef Colormap XMesaColormap;
typedef Drawable XMesaDrawable;
typedef Window XMesaWindow;
typedef GC XMesaGC;
typedef XVisualInfo *XMesaVisualInfo;
typedef XImage XMesaImage;
typedef XPoint XMesaPoint;
typedef XColor XMesaColor;
 
#define XMesaDestroyImage XDestroyImage
 
#define XMesaPutPixel XPutPixel
#define XMesaGetPixel XGetPixel
 
#define XMesaSetForeground XSetForeground
#define XMesaSetBackground XSetBackground
#define XMesaSetPlaneMask XSetPlaneMask
#define XMesaSetFunction XSetFunction
#define XMesaSetDashes XSetDashes
#define XMesaSetLineAttributes XSetLineAttributes
#define XMesaSetFillStyle XSetFillStyle
#define XMesaSetTile XSetTile
#define XMesaSetStipple XSetStipple
 
#define XMesaDrawPoint XDrawPoint
#define XMesaDrawPoints XDrawPoints
#define XMesaDrawLine XDrawLine
#define XMesaFillRectangle XFillRectangle
#define XMesaPutImage XPutImage
#define XMesaCopyArea XCopyArea
#define XMesaFillPolygon XFillPolygon
 
#define XMesaCreatePixmap XCreatePixmap
#define XMesaFreePixmap XFreePixmap
#define XMesaFreeGC XFreeGC
 
#define GET_COLORMAP_SIZE(__v) __v->visinfo->colormap_size
#define GET_REDMASK(__v) __v->visinfo->red_mask
#define GET_GREENMASK(__v) __v->visinfo->green_mask
#define GET_BLUEMASK(__v) __v->visinfo->blue_mask
#if defined(__cplusplus) || defined(c_plusplus)
#define GET_VISUAL_CLASS(__v) __v->visinfo->c_class
#else
#define GET_VISUAL_CLASS(__v) __v->visinfo->class
#endif
#define GET_VISUAL_DEPTH(__v) __v->visinfo->depth
#define GET_BLACK_PIXEL(__v) BlackPixel(__v->display, __v->visinfo->screen)
#define CHECK_BYTE_ORDER(__v) host_byte_order()==ImageByteOrder(__v->display)
#define CHECK_FOR_HPCR(__v) XInternAtom(__v->display, "_HP_RGB_SMOOTH_MAP_LIST", True)
 
#endif
/shark/trunk/ports/mesa/include/GL/svgamesa.h
0,0 → 1,99
/* $Id: svgamesa.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.0
* Copyright (C) 1995-2001 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* SVGA/Mesa interface for Linux.
*/
 
 
/*
* Intro to using the VGA/Mesa interface
*
* 1. #include the <vga.h> file
* 2. Call vga_init() to initialize the SVGA library.
* 3. Call vga_setmode() to specify the screen size and color depth.
* 4. Call SVGAMesaCreateContext() to setup a Mesa context. If using 8-bit
* color Mesa assumes color index mode, if using 16-bit or deeper color
* Mesa assumes RGB mode.
* 5. Call SVGAMesaMakeCurrent() to activate the Mesa context.
* 6. You can now use the Mesa API functions.
* 7. Before exiting, call SVGAMesaDestroyContext() then vga_setmode(TEXT)
* to restore the original text screen.
*
* Notes
* 1. You must run your executable as root (or use the set UID-bit) because
* the SVGA library requires it.
* 2. The SVGA driver is not fully implemented yet. See svgamesa.c for what
* has to be done yet.
*/
 
 
#ifndef SVGAMESA_H
#define SVGAMESA_H
 
 
#define SVGAMESA_MAJOR_VERSION 4
#define SVGAMESA_MINOR_VERSION 0
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#include "GL/gl.h"
 
 
 
/*
* This is the SVGAMesa context 'handle':
*/
typedef struct svgamesa_context *SVGAMesaContext;
 
 
 
/*
* doubleBuffer flag new in version 2.4
*/
extern int SVGAMesaInit( int GraphMode );
 
extern int SVGAMesaClose( void );
 
extern SVGAMesaContext SVGAMesaCreateContext( GLboolean doubleBuffer );
 
extern void SVGAMesaDestroyContext( SVGAMesaContext ctx );
 
extern void SVGAMesaMakeCurrent( SVGAMesaContext ctx );
 
extern void SVGAMesaSwapBuffers( void );
 
extern void SVGAMesaSetCI(int ndx, GLubyte red, GLubyte green, GLubyte blue);
 
extern SVGAMesaContext SVGAMesaGetCurrentContext( void );
 
#ifdef __cplusplus
}
#endif
 
 
#endif
/shark/trunk/ports/mesa/include/GL/glu_mangle.h
0,0 → 1,105
/* $Id: glu_mangle.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.0
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* $Log: not supported by cvs2svn $
* Revision 1.3 2001/09/20 22:18:47 kschultz
* add mangling for new entry points
*
* Revision 1.2 1999/09/10 02:08:19 gareth
* Added GLU 1.3 tessellation (except winding rule code).
*
* Revision 1.1.1.1 1999/08/19 00:55:40 jtg
* Imported sources
*
* Revision 3.1 1999/06/21 22:00:42 brianp
* added #ifndef GLU_MANGLE_H stuff
*
* Revision 3.0 1998/02/20 05:04:45 brianp
* initial rev
*
*/
 
#ifndef GLU_MANGLE_H
#define GLU_MANGLE_H
 
 
#define gluLookAt mgluLookAt
#define gluOrtho2D mgluOrtho2D
#define gluPerspective mgluPerspective
#define gluPickMatrix mgluPickMatrix
#define gluProject mgluProject
#define gluUnProject mgluUnProject
#define gluErrorString mgluErrorString
#define gluScaleImage mgluScaleImage
#define gluBuild1DMipmaps mgluBuild1DMipmaps
#define gluBuild2DMipmaps mgluBuild2DMipmaps
#define gluNewQuadric mgluNewQuadric
#define gluDeleteQuadric mgluDeleteQuadric
#define gluQuadricDrawStyle mgluQuadricDrawStyle
#define gluQuadricOrientation mgluQuadricOrientation
#define gluQuadricNormals mgluQuadricNormals
#define gluQuadricTexture mgluQuadricTexture
#define gluQuadricCallback mgluQuadricCallback
#define gluCylinder mgluCylinder
#define gluSphere mgluSphere
#define gluDisk mgluDisk
#define gluPartialDisk mgluPartialDisk
#define gluNewNurbsRenderer mgluNewNurbsRenderer
#define gluDeleteNurbsRenderer mgluDeleteNurbsRenderer
#define gluLoadSamplingMatrices mgluLoadSamplingMatrices
#define gluNurbsProperty mgluNurbsProperty
#define gluGetNurbsProperty mgluGetNurbsProperty
#define gluBeginCurve mgluBeginCurve
#define gluEndCurve mgluEndCurve
#define gluNurbsCurve mgluNurbsCurve
#define gluBeginSurface mgluBeginSurface
#define gluEndSurface mgluEndSurface
#define gluNurbsSurface mgluNurbsSurface
#define gluBeginTrim mgluBeginTrim
#define gluEndTrim mgluEndTrim
#define gluPwlCurve mgluPwlCurve
#define gluNurbsCallback mgluNurbsCallback
#define gluNewTess mgluNewTess
#define gluDeleteTess mgluDeleteTess
#define gluTessBeginPolygon mgluTessBeginPolygon
#define gluTessBeginContour mgluTessBeginContour
#define gluTessVertex mgluTessVertex
#define gluTessEndPolygon mgluTessEndPolygon
#define gluTessEndContour mgluTessEndContour
#define gluTessProperty mgluTessProperty
#define gluTessNormal mgluTessNormal
#define gluTessCallback mgluTessCallback
#define gluGetTessProperty mgluGetTessProperty
#define gluBeginPolygon mgluBeginPolygon
#define gluNextContour mgluNextContour
#define gluEndPolygon mgluEndPolygon
#define gluGetString mgluGetString
#define gluBuild1DMipmapLevels mgluBuild1DMipmapLevels
#define gluBuild2DMipmapLevels mgluBuild2DMipmapLevels
#define gluBuild3DMipmapLevels mgluBuild3DMipmapLevels
#define gluBuild3DMipmaps mgluBuild3DMipmaps
#define gluCheckExtension mgluCheckExtension
#define gluUnProject4 mgluUnProject4
 
#endif
/shark/trunk/ports/mesa/include/GL/glxext.h
0,0 → 1,607
#ifndef __glxext_h_
#define __glxext_h_
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*
** License Applicability. Except to the extent portions of this file are
** made subject to an alternative license as permitted in the SGI Free
** Software License B, Version 1.1 (the "License"), the contents of this
** file are subject only to the provisions of the License. You may not use
** this file except in compliance with the License. You may obtain a copy
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
**
** http://oss.sgi.com/projects/FreeB
**
** Note that, as provided in the License, the Software is distributed on an
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
**
** Original Code. The Original Code is: OpenGL Sample Implementation,
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
** Copyright in any portions created by third parties is as indicated
** elsewhere herein. All Rights Reserved.
**
** Additional Notice Provisions: This software was created using the
** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
** not been independently verified as being compliant with the OpenGL(R)
** version 1.2.1 Specification.
*/
 
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__)
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
 
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef GLAPI
#define GLAPI extern
#endif
 
/*************************************************************/
 
/* Header file version number, required by OpenGL ABI for Linux */
/* glxext.h last updated 2002/03/22 */
/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */
#define GLX_GLXEXT_VERSION 5
 
#ifndef GLX_VERSION_1_3
#define GLX_WINDOW_BIT 0x00000001
#define GLX_PIXMAP_BIT 0x00000002
#define GLX_PBUFFER_BIT 0x00000004
#define GLX_RGBA_BIT 0x00000001
#define GLX_COLOR_INDEX_BIT 0x00000002
#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
#define GLX_AUX_BUFFERS_BIT 0x00000010
#define GLX_DEPTH_BUFFER_BIT 0x00000020
#define GLX_STENCIL_BUFFER_BIT 0x00000040
#define GLX_ACCUM_BUFFER_BIT 0x00000080
#define GLX_CONFIG_CAVEAT 0x20
#define GLX_X_VISUAL_TYPE 0x22
#define GLX_TRANSPARENT_TYPE 0x23
#define GLX_TRANSPARENT_INDEX_VALUE 0x24
#define GLX_TRANSPARENT_RED_VALUE 0x25
#define GLX_TRANSPARENT_GREEN_VALUE 0x26
#define GLX_TRANSPARENT_BLUE_VALUE 0x27
#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
#define GLX_DONT_CARE 0xFFFFFFFF
#define GLX_NONE 0x8000
#define GLX_SLOW_CONFIG 0x8001
#define GLX_TRUE_COLOR 0x8002
#define GLX_DIRECT_COLOR 0x8003
#define GLX_PSEUDO_COLOR 0x8004
#define GLX_STATIC_COLOR 0x8005
#define GLX_GRAY_SCALE 0x8006
#define GLX_STATIC_GRAY 0x8007
#define GLX_TRANSPARENT_RGB 0x8008
#define GLX_TRANSPARENT_INDEX 0x8009
#define GLX_VISUAL_ID 0x800B
#define GLX_SCREEN 0x800C
#define GLX_NON_CONFORMANT_CONFIG 0x800D
#define GLX_DRAWABLE_TYPE 0x8010
#define GLX_RENDER_TYPE 0x8011
#define GLX_X_RENDERABLE 0x8012
#define GLX_FBCONFIG_ID 0x8013
#define GLX_RGBA_TYPE 0x8014
#define GLX_COLOR_INDEX_TYPE 0x8015
#define GLX_MAX_PBUFFER_WIDTH 0x8016
#define GLX_MAX_PBUFFER_HEIGHT 0x8017
#define GLX_MAX_PBUFFER_PIXELS 0x8018
#define GLX_PRESERVED_CONTENTS 0x801B
#define GLX_LARGEST_PBUFFER 0x801C
#define GLX_WIDTH 0x801D
#define GLX_HEIGHT 0x801E
#define GLX_EVENT_MASK 0x801F
#define GLX_DAMAGED 0x8020
#define GLX_SAVED 0x8021
#define GLX_WINDOW 0x8022
#define GLX_PBUFFER 0x8023
#define GLX_PBUFFER_HEIGHT 0x8040
#define GLX_PBUFFER_WIDTH 0x8041
#endif
 
#ifndef GLX_VERSION_1_4
#define GLX_SAMPLE_BUFFERS 100000
#define GLX_SAMPLES 100001
#endif
 
#ifndef GLX_ARB_get_proc_address
#endif
 
#ifndef GLX_ARB_multisample
#define GLX_SAMPLE_BUFFERS_ARB 100000
#define GLX_SAMPLES_ARB 100001
#endif
 
#ifndef GLX_SGIS_multisample
#define GLX_SAMPLE_BUFFERS_SGIS 100000
#define GLX_SAMPLES_SGIS 100001
#endif
 
#ifndef GLX_EXT_visual_info
#define GLX_X_VISUAL_TYPE_EXT 0x22
#define GLX_TRANSPARENT_TYPE_EXT 0x23
#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
#define GLX_NONE_EXT 0x8000
#define GLX_TRUE_COLOR_EXT 0x8002
#define GLX_DIRECT_COLOR_EXT 0x8003
#define GLX_PSEUDO_COLOR_EXT 0x8004
#define GLX_STATIC_COLOR_EXT 0x8005
#define GLX_GRAY_SCALE_EXT 0x8006
#define GLX_STATIC_GRAY_EXT 0x8007
#define GLX_TRANSPARENT_RGB_EXT 0x8008
#define GLX_TRANSPARENT_INDEX_EXT 0x8009
#endif
 
#ifndef GLX_SGI_swap_control
#endif
 
#ifndef GLX_SGI_video_sync
#endif
 
#ifndef GLX_SGI_make_current_read
#endif
 
#ifndef GLX_SGIX_video_source
#endif
 
#ifndef GLX_EXT_visual_rating
#define GLX_VISUAL_CAVEAT_EXT 0x20
#define GLX_SLOW_VISUAL_EXT 0x8001
#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
/* reuse GLX_NONE_EXT */
#endif
 
#ifndef GLX_EXT_import_context
#define GLX_SHARE_CONTEXT_EXT 0x800A
#define GLX_VISUAL_ID_EXT 0x800B
#define GLX_SCREEN_EXT 0x800C
#endif
 
#ifndef GLX_SGIX_fbconfig
#define GLX_WINDOW_BIT_SGIX 0x00000001
#define GLX_PIXMAP_BIT_SGIX 0x00000002
#define GLX_RGBA_BIT_SGIX 0x00000001
#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
#define GLX_DRAWABLE_TYPE_SGIX 0x8010
#define GLX_RENDER_TYPE_SGIX 0x8011
#define GLX_X_RENDERABLE_SGIX 0x8012
#define GLX_FBCONFIG_ID_SGIX 0x8013
#define GLX_RGBA_TYPE_SGIX 0x8014
#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
/* reuse GLX_SCREEN_EXT */
#endif
 
#ifndef GLX_SGIX_pbuffer
#define GLX_PBUFFER_BIT_SGIX 0x00000004
#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
#define GLX_LARGEST_PBUFFER_SGIX 0x801C
#define GLX_WIDTH_SGIX 0x801D
#define GLX_HEIGHT_SGIX 0x801E
#define GLX_EVENT_MASK_SGIX 0x801F
#define GLX_DAMAGED_SGIX 0x8020
#define GLX_SAVED_SGIX 0x8021
#define GLX_WINDOW_SGIX 0x8022
#define GLX_PBUFFER_SGIX 0x8023
#endif
 
#ifndef GLX_SGI_cushion
#endif
 
#ifndef GLX_SGIX_video_resize
#define GLX_SYNC_FRAME_SGIX 0x00000000
#define GLX_SYNC_SWAP_SGIX 0x00000001
#endif
 
#ifndef GLX_SGIX_dmbuffer
#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024
#endif
 
#ifndef GLX_SGIX_swap_group
#endif
 
#ifndef GLX_SGIX_swap_barrier
#endif
 
#ifndef GLX_SGIS_blended_overlay
#define GLX_BLENDED_RGBA_SGIS 0x8025
#endif
 
#ifndef GLX_SGIS_shared_multisample
#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
#endif
 
#ifndef GLX_SUN_get_transparent_index
#endif
 
#ifndef GLX_3DFX_multisample
#define GLX_SAMPLE_BUFFERS_3DFX 0x8050
#define GLX_SAMPLES_3DFX 0x8051
#endif
 
#ifndef GLX_MESA_copy_sub_buffer
#endif
 
#ifndef GLX_MESA_pixmap_colormap
#endif
 
#ifndef GLX_MESA_release_buffers
#endif
 
#ifndef GLX_MESA_set_3dfx_mode
#define GLX_3DFX_WINDOW_MODE_MESA 0x1
#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
#endif
 
#ifndef GLX_SGIX_visual_select_group
#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
#endif
 
#ifndef GLX_OML_swap_method
#define GLX_SWAP_METHOD_OML 0x8060
#define GLX_SWAP_EXCHANGE_OML 0x8061
#define GLX_SWAP_COPY_OML 0x8062
#define GLX_SWAP_UNDEFINED_OML 0x8063
#endif
 
#ifndef GLX_OML_sync_control
#endif
 
 
/*************************************************************/
 
#ifndef GLX_ARB_get_proc_address
typedef void (*__GLXextFuncPtr)(void);
#endif
 
#ifndef GLX_SGIX_video_source
typedef XID GLXVideoSourceSGIX;
#endif
 
#ifndef GLX_SGIX_fbconfig
typedef XID GLXFBConfigIDSGIX;
typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
#endif
 
#ifndef GLX_SGIX_pbuffer
typedef XID GLXPbufferSGIX;
typedef struct {
int type;
unsigned long serial; /* # of last request processed by server */
Bool send_event; /* true if this came for SendEvent request */
Display *display; /* display the event was read from */
GLXDrawable drawable; /* i.d. of Drawable */
int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */
int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */
unsigned int mask; /* mask indicating which buffers are affected*/
int x, y;
int width, height;
int count; /* if nonzero, at least this many more */
} GLXBufferClobberEventSGIX;
#endif
 
#ifndef GLX_VERSION_1_3
#define GLX_VERSION_1_3 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern GLXFBConfig * glXGetFBConfigs (Display *, int, int *);
extern GLXFBConfig * glXChooseFBConfig (Display *, int, const int *, int *);
extern int glXGetFBConfigAttrib (Display *, GLXFBConfig, int, int *);
extern XVisualInfo * glXGetVisualFromFBConfig (Display *, GLXFBConfig);
extern GLXWindow glXCreateWindow (Display *, GLXFBConfig, Window, const int *);
extern void glXDestroyWindow (Display *, GLXWindow);
extern GLXPixmap glXCreatePixmap (Display *, GLXFBConfig, Pixmap, const int *);
extern void glXDestroyPixmap (Display *, GLXPixmap);
extern GLXPbuffer glXCreatePbuffer (Display *, GLXFBConfig, const int *);
extern void glXDestroyPbuffer (Display *, GLXPbuffer);
extern void glXQueryDrawable (Display *, GLXDrawable, int, unsigned int *);
extern GLXContext glXCreateNewContext (Display *, GLXFBConfig, int, GLXContext, Bool);
extern Bool glXMakeContextCurrent (Display *, GLXDrawable, GLXDrawable, GLXContext);
extern GLXDrawable glXGetCurrentReadDrawable (void);
extern Display * glXGetCurrentDisplay (void);
extern int glXQueryContext (Display *, GLXContext, int, int *);
extern void glXSelectEvent (Display *, GLXDrawable, unsigned long);
extern void glXGetSelectedEvent (Display *, GLXDrawable, unsigned long *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef GLXFBConfig * ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);
typedef GLXFBConfig * ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);
typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);
typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);
typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);
typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);
typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);
typedef Display * ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);
typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);
typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
#endif
 
#ifndef GLX_VERSION_1_4
#define GLX_VERSION_1_4 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern __GLXextFuncPtr glXGetProcAddress (const GLubyte *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSPROC) (const GLubyte *procName);
#endif
 
#ifndef GLX_ARB_get_proc_address
#define GLX_ARB_get_proc_address 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName);
#endif
 
#ifndef GLX_ARB_multisample
#define GLX_ARB_multisample 1
#endif
 
#ifndef GLX_SGIS_multisample
#define GLX_SGIS_multisample 1
#endif
 
#ifndef GLX_EXT_visual_info
#define GLX_EXT_visual_info 1
#endif
 
#ifndef GLX_SGI_swap_control
#define GLX_SGI_swap_control 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern int glXSwapIntervalSGI (int);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
#endif
 
#ifndef GLX_SGI_video_sync
#define GLX_SGI_video_sync 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern int glXGetVideoSyncSGI (unsigned int *);
extern int glXWaitVideoSyncSGI (int, int, unsigned int *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int *count);
typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int *count);
#endif
 
#ifndef GLX_SGI_make_current_read
#define GLX_SGI_make_current_read 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Bool glXMakeCurrentReadSGI (Display *, GLXDrawable, GLXDrawable, GLXContext);
extern GLXDrawable glXGetCurrentReadDrawableSGI (void);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);
#endif
 
#ifdef _VL_H
#ifndef GLX_SGIX_video_source
#define GLX_SGIX_video_source 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX (Display *, int, VLServer, VLPath, int, VLNode);
extern void glXDestroyGLXVideoSourceSGIX (Display *, GLXVideoSourceSGIX);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef GLXVideoSourceSGIX ( * PFNGLXCREATEGLXVIDEOSOURCESGIXPROC) (Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode);
typedef void ( * PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC) (Display *dpy, GLXVideoSourceSGIX glxvideosource);
#endif
 
#endif /* _VL_H */
#ifndef GLX_EXT_visual_rating
#define GLX_EXT_visual_rating 1
#endif
 
#ifndef GLX_EXT_import_context
#define GLX_EXT_import_context 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Display * glXGetCurrentDisplayEXT (void);
extern int glXQueryContextInfoEXT (Display *, GLXContext, int, int *);
extern GLXContextID glXGetContextIDEXT (const GLXContext);
extern GLXContext glXImportContextEXT (Display *, GLXContextID);
extern void glXFreeContextEXT (Display *, GLXContext);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Display * ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void);
typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display *dpy, GLXContext context, int attribute, int *value);
typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);
typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display *dpy, GLXContextID contextID);
typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display *dpy, GLXContext context);
#endif
 
#ifndef GLX_SGIX_fbconfig
#define GLX_SGIX_fbconfig 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern int glXGetFBConfigAttribSGIX (Display *, GLXFBConfigSGIX, int, int *);
extern GLXFBConfigSGIX * glXChooseFBConfigSGIX (Display *, int, int *, int *);
extern GLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display *, GLXFBConfigSGIX, Pixmap);
extern GLXContext glXCreateContextWithConfigSGIX (Display *, GLXFBConfigSGIX, int, GLXContext, Bool);
extern XVisualInfo * glXGetVisualFromFBConfigSGIX (Display *, GLXFBConfigSGIX);
extern GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display *, XVisualInfo *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);
typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements);
typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap);
typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);
typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config);
typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display *dpy, XVisualInfo *vis);
#endif
 
#ifndef GLX_SGIX_pbuffer
#define GLX_SGIX_pbuffer 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern GLXPbufferSGIX glXCreateGLXPbufferSGIX (Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *);
extern void glXDestroyGLXPbufferSGIX (Display *, GLXPbufferSGIX);
extern int glXQueryGLXPbufferSGIX (Display *, GLXPbufferSGIX, int, unsigned int *);
extern void glXSelectEventSGIX (Display *, GLXDrawable, unsigned long);
extern void glXGetSelectedEventSGIX (Display *, GLXDrawable, unsigned long *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list);
typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf);
typedef int ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value);
typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long mask);
typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long *mask);
#endif
 
#ifndef GLX_SGI_cushion
#define GLX_SGI_cushion 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern void glXCushionSGI (Display *, Window, float);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef void ( * PFNGLXCUSHIONSGIPROC) (Display *dpy, Window window, float cushion);
#endif
 
#ifndef GLX_SGIX_video_resize
#define GLX_SGIX_video_resize 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern int glXBindChannelToWindowSGIX (Display *, int, int, Window);
extern int glXChannelRectSGIX (Display *, int, int, int, int, int, int);
extern int glXQueryChannelRectSGIX (Display *, int, int, int *, int *, int *, int *);
extern int glXQueryChannelDeltasSGIX (Display *, int, int, int *, int *, int *, int *);
extern int glXChannelRectSyncSGIX (Display *, int, int, GLenum);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display *display, int screen, int channel, Window window);
typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int x, int y, int w, int h);
typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display *display, int screen, int channel, int *x, int *y, int *w, int *h);
typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display *display, int screen, int channel, GLenum synctype);
#endif
 
#ifdef _DM_BUFFER_H_
#ifndef GLX_SGIX_dmbuffer
#define GLX_SGIX_dmbuffer 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Bool glXAssociateDMPbufferSGIX (Display *, GLXPbufferSGIX, DMparams *, DMbuffer);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Bool ( * PFNGLXASSOCIATEDMPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer);
#endif
 
#endif /* _DM_BUFFER_H_ */
#ifndef GLX_SGIX_swap_group
#define GLX_SGIX_swap_group 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern void glXJoinSwapGroupSGIX (Display *, GLXDrawable, GLXDrawable);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);
#endif
 
#ifndef GLX_SGIX_swap_barrier
#define GLX_SGIX_swap_barrier 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern void glXBindSwapBarrierSGIX (Display *, GLXDrawable, int);
extern Bool glXQueryMaxSwapBarriersSGIX (Display *, int, int *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);
typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);
#endif
 
#ifndef GLX_SUN_get_transparent_index
#define GLX_SUN_get_transparent_index 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Status glXGetTransparentIndexSUN (Display *, Window, Window, long *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display *dpy, Window overlay, Window underlay, long *pTransparentIndex);
#endif
 
#ifndef GLX_MESA_copy_sub_buffer
#define GLX_MESA_copy_sub_buffer 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern void glXCopySubBufferMESA (Display *, GLXDrawable, int, int, int, int);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
#endif
 
#ifndef GLX_MESA_pixmap_colormap
#define GLX_MESA_pixmap_colormap 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern GLXPixmap glXCreateGLXPixmapMESA (Display *, XVisualInfo *, Pixmap, Colormap);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
#endif
 
#ifndef GLX_MESA_release_buffers
#define GLX_MESA_release_buffers 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Bool glXReleaseBuffersMESA (Display *, GLXDrawable);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display *dpy, GLXDrawable drawable);
#endif
 
#ifndef GLX_MESA_set_3dfx_mode
#define GLX_MESA_set_3dfx_mode 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Bool glXSet3DfxModeMESA (int);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Bool ( * PFNGLXSET3DFXMODEMESAPROC) (int mode);
#endif
 
#ifndef GLX_SGIX_visual_select_group
#define GLX_SGIX_visual_select_group 1
#endif
 
#ifndef GLX_OML_swap_method
#define GLX_OML_swap_method 1
#endif
 
#if defined(__STDC_VERSION__)
#if __STDC_VERSION__ >= 199901L
/* Include ISO C99 integer types for OML_sync_control; need a better test */
#include <inttypes.h>
 
#ifndef GLX_OML_sync_control
#define GLX_OML_sync_control 1
#ifdef GLX_GLXEXT_PROTOTYPES
extern Bool glXGetSyncValuesOML (Display *, GLXDrawable, int64_t *, int64_t *, int64_t *);
extern Bool glXGetMscRateOML (Display *, GLXDrawable, int32_t *, int32_t *);
extern int64_t glXSwapBuffersMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t);
extern Bool glXWaitForMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t, int64_t *, int64_t *, int64_t *);
extern Bool glXWaitForSbcOML (Display *, GLXDrawable, int64_t, int64_t *, int64_t *, int64_t *);
#endif /* GLX_GLXEXT_PROTOTYPES */
typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc);
typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator);
typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc);
typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc);
#endif
 
#endif /* C99 version test */
#endif /* STDC test */
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/glut.h
0,0 → 1,771
#ifndef __glut_h__
#define __glut_h__
 
/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
 
/* This program is freely distributable without licensing fees and is
provided without guarantee or warrantee expressed or implied. This
program is -not- in the public domain. */
 
#include <GL/gl.h>
#include <GL/glu.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
#if defined(_WIN32)
 
/* GLUT 3.7 now tries to avoid including <windows.h>
to avoid name space pollution, but Win32's <GL/gl.h>
needs APIENTRY and WINGDIAPI defined properly.
 
tjump@spgs.com contributes:
If users are building glut code on MS Windows, then they should
make sure they include windows.h early, let's not get into a
header definitions war since MS has proven it's capability to
change header dependencies w/o publishing they have done so.
 
So, let's not include windows.h here, as it's not really required and
MS own gl/gl.h *should* include it if the dependency is there. */
 
/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA
in your compile preprocessor options. */
# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA)
# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */
/* To enable automatic SGI OpenGL for Windows library usage for GLUT,
define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */
# ifdef GLUT_USE_SGI_OPENGL
# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */
# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */
# pragma comment (lib, "glut.lib") /* link with Win32 GLUT for SGI OpenGL lib */
# else
# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */
# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */
# endif
# endif
 
/* To disable supression of annoying warnings about floats being promoted
to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor
options. */
# ifndef GLUT_NO_WARNING_DISABLE
# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */
# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
# endif
 
/* Win32 has an annoying issue where there are multiple C run-time
libraries (CRTs). If the executable is linked with a different CRT
from the GLUT DLL, the GLUT DLL will not share the same CRT static
data seen by the executable. In particular, atexit callbacks registered
in the executable will not be called if GLUT calls its (different)
exit routine). GLUT is typically built with the
"/MD" option (the CRT with multithreading DLL support), but the Visual
C++ linker default is "/ML" (the single threaded CRT).
 
One workaround to this issue is requiring users to always link with
the same CRT as GLUT is compiled with. That requires users supply a
non-standard option. GLUT 3.7 has its own built-in workaround where
the executable's "exit" function pointer is covertly passed to GLUT.
GLUT then calls the executable's exit function pointer to ensure that
any "atexit" calls registered by the application are called if GLUT
needs to exit.
 
Note that the __glut*WithExit routines should NEVER be called directly.
To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
 
/* XXX This is from Win32's <process.h> */
# if !defined(_MSC_VER) && !defined(__cdecl)
/* Define __cdecl for non-Microsoft compilers. */
# define __cdecl
# define GLUT_DEFINED___CDECL
# endif
# ifndef _CRTIMP
# ifdef _NTSDK
/* Definition compatible with NT SDK */
# define _CRTIMP
# else
/* Current definition */
# ifdef _DLL
# define _CRTIMP __declspec(dllimport)
# else
# define _CRTIMP
# endif
# endif
# define GLUT_DEFINED__CRTIMP
# endif
# ifndef GLUT_BUILDING_LIB
extern _CRTIMP void __cdecl exit(int);
# endif
 
/* GLUT callback calling convention for Win32. */
# define GLUTCALLBACK __cdecl
 
/* for callback/function pointer defs */
# define GLUTAPIENTRYV __cdecl
 
/* glut-win32 specific macros, defined to prevent collision with
and redifinition of Windows system defs, also removes requirement of
pretty much any standard windows header from this file */
 
#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__CYGWIN32__)
# define GLUTAPIENTRY __stdcall
#else
# define GLUTAPIENTRY
#endif
 
/* GLUT API entry point declarations for Win32. */
#if defined(GLUT_BUILDING_LIB) && defined(_DLL)
# define GLUTAPI __declspec(dllexport)
#elif defined(_DLL)
# define GLUTAPI __declspec(dllimport)
#else
# define GLUTAPI extern
#endif
 
#if defined(_WIN32) && !defined(_WINDEF_) && !defined(MESA)
# if !defined(MESA_MINWARN)
# pragma message( "note: WINDOWS.H not included, providing Mesa definition of CALLBACK macro" )
# pragma message( "----: and PROC typedef. If you receive compiler warnings about either ")
# pragma message( "----: being multiply defined you should include WINDOWS.H priot to gl/glut.h" )
# endif
# define CALLBACK __stdcall
typedef int (GLUTAPIENTRY *PROC)();
typedef void *HGLRC;
typedef void *HDC;
typedef unsigned long COLORREF;
#endif
 
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(MESA)
# if !defined(MESA_MINWARN)
# pragma message( "note: WINDOWS.H not included, providing Mesa definition of wgl functions" )
# pragma message( "----: and macros. If you receive compiler warnings about any being multiply ")
# pragma message( "----: defined you should include WINDOWS.H priot to gl/glut.h" )
# endif
# define WGL_FONT_LINES 0
# define WGL_FONT_POLYGONS 1
# ifdef UNICODE
# define wglUseFontBitmaps wglUseFontBitmapsW
# define wglUseFontOutlines wglUseFontOutlinesW
# else
# define wglUseFontBitmaps wglUseFontBitmapsA
# define wglUseFontOutlines wglUseFontOutlinesA
# endif /* !UNICODE */
typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT;
# pragma warning( push )
# pragma warning( disable : 4273 ) /* 'function' : inconsistent DLL linkage. dllexport assumed. */
# define WGLAPI __declspec(dllimport)
WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC);
WGLAPI int GLAPIENTRY wglMakeCurrent(HDC,HGLRC);
WGLAPI int GLAPIENTRY wglSetPixelFormat(HDC, int, const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY wglSwapBuffers(HDC hdc);
WGLAPI HDC GLAPIENTRY wglGetCurrentDC(void);
WGLAPI HGLRC GLAPIENTRY wglCreateContext(HDC);
WGLAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC,int);
WGLAPI HGLRC GLAPIENTRY wglGetCurrentContext(void);
WGLAPI PROC GLAPIENTRY wglGetProcAddress(const char*);
WGLAPI int GLAPIENTRY wglChoosePixelFormat(HDC, const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY wglCopyContext(HGLRC, HGLRC, unsigned int);
WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC);
WGLAPI int GLAPIENTRY wglDescribeLayerPlane(HDC, int, int, unsigned int,LPLAYERPLANEDESCRIPTOR);
WGLAPI int GLAPIENTRY wglDescribePixelFormat(HDC,int, unsigned int, LPPIXELFORMATDESCRIPTOR);
WGLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC, int, int, int,COLORREF *);
WGLAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc);
WGLAPI int GLAPIENTRY wglMakeCurrent(HDC, HGLRC);
WGLAPI int GLAPIENTRY wglRealizeLayerPalette(HDC, int, int);
WGLAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC, int, int, int,const COLORREF *);
WGLAPI int GLAPIENTRY wglShareLists(HGLRC, HGLRC);
WGLAPI int GLAPIENTRY wglSwapLayerBuffers(HDC, unsigned int);
WGLAPI int GLAPIENTRY wglUseFontBitmapsA(HDC, unsigned long, unsigned long, unsigned long);
WGLAPI int GLAPIENTRY wglUseFontBitmapsW(HDC, unsigned long, unsigned long, unsigned long);
WGLAPI int GLAPIENTRY wglUseFontOutlinesA(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT);
WGLAPI int GLAPIENTRY wglUseFontOutlinesW(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT);
WGLAPI int GLAPIENTRY SwapBuffers(HDC);
WGLAPI int GLAPIENTRY ChoosePixelFormat(HDC,const PIXELFORMATDESCRIPTOR *);
WGLAPI int GLAPIENTRY DescribePixelFormat(HDC,int,unsigned int,LPPIXELFORMATDESCRIPTOR);
WGLAPI int GLAPIENTRY GetPixelFormat(HDC);
WGLAPI int GLAPIENTRY SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR *);
# undef WGLAPI
# pragma warning( pop )
#endif
 
#else /* _WIN32 not defined */
 
/* Define GLUTAPIENTRY and GLUTCALLBACK to nothing if we aren't on Win32. */
# define GLUTAPIENTRY
# define GLUTAPIENTRYV
# define GLUT_APIENTRY_DEFINED
# define GLUTCALLBACK
# define GLUTAPI extern
/* Prototype exit for the non-Win32 case (see above). */
/*extern void exit(int); this screws up gcc -ansi -pedantic! */
#endif
 
 
/**
GLUT API revision history:
 
GLUT_API_VERSION is updated to reflect incompatible GLUT
API changes (interface changes, semantic changes, deletions,
or additions).
 
GLUT_API_VERSION=1 First public release of GLUT. 11/29/94
 
GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling,
extension. Supports new input devices like tablet, dial and button
box, and Spaceball. Easy to query OpenGL extensions.
 
GLUT_API_VERSION=3 glutMenuStatus added.
 
GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer,
glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
 
GLUT_API_VERSION=5 glutGetProcAddress (added by BrianP)
**/
#ifndef GLUT_API_VERSION /* allow this to be overriden */
#define GLUT_API_VERSION 5
#endif
 
/**
GLUT implementation revision history:
 
GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
API revisions and implementation revisions (ie, bug fixes).
 
GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of
GLUT Xlib-based implementation. 11/29/94
 
GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of
GLUT Xlib-based implementation providing GLUT version 2
interfaces.
 
GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95
 
GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95
 
GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95
 
GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96
 
GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner
and video resize. 1/3/97
 
GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
 
GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
 
GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
 
GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
 
GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
 
GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
**/
#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */
#define GLUT_XLIB_IMPLEMENTATION 15
#endif
 
/* Display mode bit masks. */
#define GLUT_RGB 0
#define GLUT_RGBA GLUT_RGB
#define GLUT_INDEX 1
#define GLUT_SINGLE 0
#define GLUT_DOUBLE 2
#define GLUT_ACCUM 4
#define GLUT_ALPHA 8
#define GLUT_DEPTH 16
#define GLUT_STENCIL 32
#if (GLUT_API_VERSION >= 2)
#define GLUT_MULTISAMPLE 128
#define GLUT_STEREO 256
#endif
#if (GLUT_API_VERSION >= 3)
#define GLUT_LUMINANCE 512
#endif
 
/* Mouse buttons. */
#define GLUT_LEFT_BUTTON 0
#define GLUT_MIDDLE_BUTTON 1
#define GLUT_RIGHT_BUTTON 2
 
/* Mouse button state. */
#define GLUT_DOWN 0
#define GLUT_UP 1
 
#if (GLUT_API_VERSION >= 2)
/* function keys */
#define GLUT_KEY_F1 1
#define GLUT_KEY_F2 2
#define GLUT_KEY_F3 3
#define GLUT_KEY_F4 4
#define GLUT_KEY_F5 5
#define GLUT_KEY_F6 6
#define GLUT_KEY_F7 7
#define GLUT_KEY_F8 8
#define GLUT_KEY_F9 9
#define GLUT_KEY_F10 10
#define GLUT_KEY_F11 11
#define GLUT_KEY_F12 12
/* directional keys */
#define GLUT_KEY_LEFT 100
#define GLUT_KEY_UP 101
#define GLUT_KEY_RIGHT 102
#define GLUT_KEY_DOWN 103
#define GLUT_KEY_PAGE_UP 104
#define GLUT_KEY_PAGE_DOWN 105
#define GLUT_KEY_HOME 106
#define GLUT_KEY_END 107
#define GLUT_KEY_INSERT 108
#endif
 
/* Entry/exit state. */
#define GLUT_LEFT 0
#define GLUT_ENTERED 1
 
/* Menu usage state. */
#define GLUT_MENU_NOT_IN_USE 0
#define GLUT_MENU_IN_USE 1
 
/* Visibility state. */
#define GLUT_NOT_VISIBLE 0
#define GLUT_VISIBLE 1
 
/* Window status state. */
#define GLUT_HIDDEN 0
#define GLUT_FULLY_RETAINED 1
#define GLUT_PARTIALLY_RETAINED 2
#define GLUT_FULLY_COVERED 3
 
/* Color index component selection values. */
#define GLUT_RED 0
#define GLUT_GREEN 1
#define GLUT_BLUE 2
 
/* Layers for use. */
#define GLUT_NORMAL 0
#define GLUT_OVERLAY 1
 
#if defined(_WIN32)
/* Stroke font constants (use these in GLUT program). */
#define GLUT_STROKE_ROMAN ((void*)0)
#define GLUT_STROKE_MONO_ROMAN ((void*)1)
 
/* Bitmap font constants (use these in GLUT program). */
#define GLUT_BITMAP_9_BY_15 ((void*)2)
#define GLUT_BITMAP_8_BY_13 ((void*)3)
#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
#if (GLUT_API_VERSION >= 3)
#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
#endif
#else
/* Stroke font opaque addresses (use constants instead in source code). */
GLUTAPI void *glutStrokeRoman;
GLUTAPI void *glutStrokeMonoRoman;
 
/* Stroke font constants (use these in GLUT program). */
#define GLUT_STROKE_ROMAN (&glutStrokeRoman)
#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
 
/* Bitmap font opaque addresses (use constants instead in source code). */
GLUTAPI void *glutBitmap9By15;
GLUTAPI void *glutBitmap8By13;
GLUTAPI void *glutBitmapTimesRoman10;
GLUTAPI void *glutBitmapTimesRoman24;
GLUTAPI void *glutBitmapHelvetica10;
GLUTAPI void *glutBitmapHelvetica12;
GLUTAPI void *glutBitmapHelvetica18;
 
/* Bitmap font constants (use these in GLUT program). */
#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
#if (GLUT_API_VERSION >= 3)
#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
#endif
#endif
 
/* glutGet parameters. */
#define GLUT_WINDOW_X 100
#define GLUT_WINDOW_Y 101
#define GLUT_WINDOW_WIDTH 102
#define GLUT_WINDOW_HEIGHT 103
#define GLUT_WINDOW_BUFFER_SIZE 104
#define GLUT_WINDOW_STENCIL_SIZE 105
#define GLUT_WINDOW_DEPTH_SIZE 106
#define GLUT_WINDOW_RED_SIZE 107
#define GLUT_WINDOW_GREEN_SIZE 108
#define GLUT_WINDOW_BLUE_SIZE 109
#define GLUT_WINDOW_ALPHA_SIZE 110
#define GLUT_WINDOW_ACCUM_RED_SIZE 111
#define GLUT_WINDOW_ACCUM_GREEN_SIZE 112
#define GLUT_WINDOW_ACCUM_BLUE_SIZE 113
#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 114
#define GLUT_WINDOW_DOUBLEBUFFER 115
#define GLUT_WINDOW_RGBA 116
#define GLUT_WINDOW_PARENT 117
#define GLUT_WINDOW_NUM_CHILDREN 118
#define GLUT_WINDOW_COLORMAP_SIZE 119
#if (GLUT_API_VERSION >= 2)
#define GLUT_WINDOW_NUM_SAMPLES 120
#define GLUT_WINDOW_STEREO 121
#endif
#if (GLUT_API_VERSION >= 3)
#define GLUT_WINDOW_CURSOR 122
#endif
#define GLUT_SCREEN_WIDTH 200
#define GLUT_SCREEN_HEIGHT 201
#define GLUT_SCREEN_WIDTH_MM 202
#define GLUT_SCREEN_HEIGHT_MM 203
#define GLUT_MENU_NUM_ITEMS 300
#define GLUT_DISPLAY_MODE_POSSIBLE 400
#define GLUT_INIT_WINDOW_X 500
#define GLUT_INIT_WINDOW_Y 501
#define GLUT_INIT_WINDOW_WIDTH 502
#define GLUT_INIT_WINDOW_HEIGHT 503
#define GLUT_INIT_DISPLAY_MODE 504
#if (GLUT_API_VERSION >= 2)
#define GLUT_ELAPSED_TIME 700
#endif
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
#define GLUT_WINDOW_FORMAT_ID 123
#endif
 
#if (GLUT_API_VERSION >= 2)
/* glutDeviceGet parameters. */
#define GLUT_HAS_KEYBOARD 600
#define GLUT_HAS_MOUSE 601
#define GLUT_HAS_SPACEBALL 602
#define GLUT_HAS_DIAL_AND_BUTTON_BOX 603
#define GLUT_HAS_TABLET 604
#define GLUT_NUM_MOUSE_BUTTONS 605
#define GLUT_NUM_SPACEBALL_BUTTONS 606
#define GLUT_NUM_BUTTON_BOX_BUTTONS 607
#define GLUT_NUM_DIALS 608
#define GLUT_NUM_TABLET_BUTTONS 609
#endif
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
#define GLUT_DEVICE_IGNORE_KEY_REPEAT 610
#define GLUT_DEVICE_KEY_REPEAT 611
#define GLUT_HAS_JOYSTICK 612
#define GLUT_OWNS_JOYSTICK 613
#define GLUT_JOYSTICK_BUTTONS 614
#define GLUT_JOYSTICK_AXES 615
#define GLUT_JOYSTICK_POLL_RATE 616
#endif
 
#if (GLUT_API_VERSION >= 3)
/* glutLayerGet parameters. */
#define GLUT_OVERLAY_POSSIBLE 800
#define GLUT_LAYER_IN_USE 801
#define GLUT_HAS_OVERLAY 802
#define GLUT_TRANSPARENT_INDEX 803
#define GLUT_NORMAL_DAMAGED 804
#define GLUT_OVERLAY_DAMAGED 805
 
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
/* glutVideoResizeGet parameters. */
#define GLUT_VIDEO_RESIZE_POSSIBLE 900
#define GLUT_VIDEO_RESIZE_IN_USE 901
#define GLUT_VIDEO_RESIZE_X_DELTA 902
#define GLUT_VIDEO_RESIZE_Y_DELTA 903
#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 904
#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 905
#define GLUT_VIDEO_RESIZE_X 906
#define GLUT_VIDEO_RESIZE_Y 907
#define GLUT_VIDEO_RESIZE_WIDTH 908
#define GLUT_VIDEO_RESIZE_HEIGHT 909
#endif
 
/* glutUseLayer parameters. */
#define GLUT_NORMAL 0
#define GLUT_OVERLAY 1
 
/* glutGetModifiers return mask. */
#define GLUT_ACTIVE_SHIFT 1
#define GLUT_ACTIVE_CTRL 2
#define GLUT_ACTIVE_ALT 4
 
/* glutSetCursor parameters. */
/* Basic arrows. */
#define GLUT_CURSOR_RIGHT_ARROW 0
#define GLUT_CURSOR_LEFT_ARROW 1
/* Symbolic cursor shapes. */
#define GLUT_CURSOR_INFO 2
#define GLUT_CURSOR_DESTROY 3
#define GLUT_CURSOR_HELP 4
#define GLUT_CURSOR_CYCLE 5
#define GLUT_CURSOR_SPRAY 6
#define GLUT_CURSOR_WAIT 7
#define GLUT_CURSOR_TEXT 8
#define GLUT_CURSOR_CROSSHAIR 9
/* Directional cursors. */
#define GLUT_CURSOR_UP_DOWN 10
#define GLUT_CURSOR_LEFT_RIGHT 11
/* Sizing cursors. */
#define GLUT_CURSOR_TOP_SIDE 12
#define GLUT_CURSOR_BOTTOM_SIDE 13
#define GLUT_CURSOR_LEFT_SIDE 14
#define GLUT_CURSOR_RIGHT_SIDE 15
#define GLUT_CURSOR_TOP_LEFT_CORNER 16
#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
/* Inherit from parent window. */
#define GLUT_CURSOR_INHERIT 100
/* Blank cursor. */
#define GLUT_CURSOR_NONE 101
/* Fullscreen crosshair (if available). */
#define GLUT_CURSOR_FULL_CROSSHAIR 102
#endif
 
/* GLUT initialization sub-API. */
GLUTAPI void GLUTAPIENTRY glutInit(int *argcp, char **argv);
#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
GLUTAPI void GLUTAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
#ifndef GLUT_BUILDING_LIB
static void GLUTAPIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
#define glutInit glutInit_ATEXIT_HACK
#endif
#endif
GLUTAPI void GLUTAPIENTRY glutInitDisplayMode(unsigned int mode);
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
GLUTAPI void GLUTAPIENTRY glutInitDisplayString(const char *string);
#endif
GLUTAPI void GLUTAPIENTRY glutInitWindowPosition(int x, int y);
GLUTAPI void GLUTAPIENTRY glutInitWindowSize(int width, int height);
GLUTAPI void GLUTAPIENTRY glutMainLoop(void);
 
/* GLUT window sub-API. */
GLUTAPI int GLUTAPIENTRY glutCreateWindow(const char *title);
#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
GLUTAPI int GLUTAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
#ifndef GLUT_BUILDING_LIB
static int GLUTAPIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
#endif
#endif
GLUTAPI int GLUTAPIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
GLUTAPI void GLUTAPIENTRY glutDestroyWindow(int win);
GLUTAPI void GLUTAPIENTRY glutPostRedisplay(void);
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
GLUTAPI void GLUTAPIENTRY glutPostWindowRedisplay(int win);
#endif
GLUTAPI void GLUTAPIENTRY glutSwapBuffers(void);
GLUTAPI int GLUTAPIENTRY glutGetWindow(void);
GLUTAPI void GLUTAPIENTRY glutSetWindow(int win);
GLUTAPI void GLUTAPIENTRY glutSetWindowTitle(const char *title);
GLUTAPI void GLUTAPIENTRY glutSetIconTitle(const char *title);
GLUTAPI void GLUTAPIENTRY glutPositionWindow(int x, int y);
GLUTAPI void GLUTAPIENTRY glutReshapeWindow(int width, int height);
GLUTAPI void GLUTAPIENTRY glutPopWindow(void);
GLUTAPI void GLUTAPIENTRY glutPushWindow(void);
GLUTAPI void GLUTAPIENTRY glutIconifyWindow(void);
GLUTAPI void GLUTAPIENTRY glutShowWindow(void);
GLUTAPI void GLUTAPIENTRY glutHideWindow(void);
#if (GLUT_API_VERSION >= 3)
GLUTAPI void GLUTAPIENTRY glutFullScreen(void);
GLUTAPI void GLUTAPIENTRY glutSetCursor(int cursor);
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
GLUTAPI void GLUTAPIENTRY glutWarpPointer(int x, int y);
#endif
 
/* GLUT overlay sub-API. */
GLUTAPI void GLUTAPIENTRY glutEstablishOverlay(void);
GLUTAPI void GLUTAPIENTRY glutRemoveOverlay(void);
GLUTAPI void GLUTAPIENTRY glutUseLayer(GLenum layer);
GLUTAPI void GLUTAPIENTRY glutPostOverlayRedisplay(void);
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
GLUTAPI void GLUTAPIENTRY glutPostWindowOverlayRedisplay(int win);
#endif
GLUTAPI void GLUTAPIENTRY glutShowOverlay(void);
GLUTAPI void GLUTAPIENTRY glutHideOverlay(void);
#endif
 
/* GLUT menu sub-API. */
GLUTAPI int GLUTAPIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
GLUTAPI int GLUTAPIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
#ifndef GLUT_BUILDING_LIB
static int GLUTAPIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
#endif
#endif
GLUTAPI void GLUTAPIENTRY glutDestroyMenu(int menu);
GLUTAPI int GLUTAPIENTRY glutGetMenu(void);
GLUTAPI void GLUTAPIENTRY glutSetMenu(int menu);
GLUTAPI void GLUTAPIENTRY glutAddMenuEntry(const char *label, int value);
GLUTAPI void GLUTAPIENTRY glutAddSubMenu(const char *label, int submenu);
GLUTAPI void GLUTAPIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
GLUTAPI void GLUTAPIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
GLUTAPI void GLUTAPIENTRY glutRemoveMenuItem(int item);
GLUTAPI void GLUTAPIENTRY glutAttachMenu(int button);
GLUTAPI void GLUTAPIENTRY glutDetachMenu(int button);
 
/* GLUT window callback sub-API. */
GLUTAPI void GLUTAPIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
GLUTAPI void GLUTAPIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
GLUTAPI void GLUTAPIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
GLUTAPI void GLUTAPIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
GLUTAPI void GLUTAPIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
GLUTAPI void GLUTAPIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
GLUTAPI void GLUTAPIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
GLUTAPI void GLUTAPIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
GLUTAPI void GLUTAPIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
GLUTAPI void GLUTAPIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
GLUTAPI void GLUTAPIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
#if (GLUT_API_VERSION >= 2)
GLUTAPI void GLUTAPIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
GLUTAPI void GLUTAPIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
GLUTAPI void GLUTAPIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
GLUTAPI void GLUTAPIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
GLUTAPI void GLUTAPIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
GLUTAPI void GLUTAPIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
GLUTAPI void GLUTAPIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
GLUTAPI void GLUTAPIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
#if (GLUT_API_VERSION >= 3)
GLUTAPI void GLUTAPIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
GLUTAPI void GLUTAPIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
GLUTAPI void GLUTAPIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
#endif
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
GLUTAPI void GLUTAPIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
GLUTAPI void GLUTAPIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
GLUTAPI void GLUTAPIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
#endif
#endif
#endif
 
/* GLUT color index sub-API. */
GLUTAPI void GLUTAPIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
GLUTAPI GLfloat GLUTAPIENTRY glutGetColor(int ndx, int component);
GLUTAPI void GLUTAPIENTRY glutCopyColormap(int win);
 
/* GLUT state retrieval sub-API. */
GLUTAPI int GLUTAPIENTRY glutGet(GLenum type);
GLUTAPI int GLUTAPIENTRY glutDeviceGet(GLenum type);
#if (GLUT_API_VERSION >= 2)
/* GLUT extension support sub-API */
GLUTAPI int GLUTAPIENTRY glutExtensionSupported(const char *name);
#endif
#if (GLUT_API_VERSION >= 3)
GLUTAPI int GLUTAPIENTRY glutGetModifiers(void);
GLUTAPI int GLUTAPIENTRY glutLayerGet(GLenum type);
#endif
#if (GLUT_API_VERSION >= 5)
GLUTAPI void * GLUTAPIENTRY glutGetProcAddress(const char *procName);
#endif
 
/* GLUT font sub-API */
GLUTAPI void GLUTAPIENTRY glutBitmapCharacter(void *font, int character);
GLUTAPI int GLUTAPIENTRY glutBitmapWidth(void *font, int character);
GLUTAPI void GLUTAPIENTRY glutStrokeCharacter(void *font, int character);
GLUTAPI int GLUTAPIENTRY glutStrokeWidth(void *font, int character);
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
GLUTAPI int GLUTAPIENTRY glutBitmapLength(void *font, const unsigned char *string);
GLUTAPI int GLUTAPIENTRY glutStrokeLength(void *font, const unsigned char *string);
#endif
 
/* GLUT pre-built models sub-API */
GLUTAPI void GLUTAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
GLUTAPI void GLUTAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
GLUTAPI void GLUTAPIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
GLUTAPI void GLUTAPIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
GLUTAPI void GLUTAPIENTRY glutWireCube(GLdouble size);
GLUTAPI void GLUTAPIENTRY glutSolidCube(GLdouble size);
GLUTAPI void GLUTAPIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
GLUTAPI void GLUTAPIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
GLUTAPI void GLUTAPIENTRY glutWireDodecahedron(void);
GLUTAPI void GLUTAPIENTRY glutSolidDodecahedron(void);
GLUTAPI void GLUTAPIENTRY glutWireTeapot(GLdouble size);
GLUTAPI void GLUTAPIENTRY glutSolidTeapot(GLdouble size);
GLUTAPI void GLUTAPIENTRY glutWireOctahedron(void);
GLUTAPI void GLUTAPIENTRY glutSolidOctahedron(void);
GLUTAPI void GLUTAPIENTRY glutWireTetrahedron(void);
GLUTAPI void GLUTAPIENTRY glutSolidTetrahedron(void);
GLUTAPI void GLUTAPIENTRY glutWireIcosahedron(void);
GLUTAPI void GLUTAPIENTRY glutSolidIcosahedron(void);
 
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
/* GLUT video resize sub-API. */
GLUTAPI int GLUTAPIENTRY glutVideoResizeGet(GLenum param);
GLUTAPI void GLUTAPIENTRY glutSetupVideoResizing(void);
GLUTAPI void GLUTAPIENTRY glutStopVideoResizing(void);
GLUTAPI void GLUTAPIENTRY glutVideoResize(int x, int y, int width, int height);
GLUTAPI void GLUTAPIENTRY glutVideoPan(int x, int y, int width, int height);
 
/* GLUT debugging sub-API. */
GLUTAPI void GLUTAPIENTRY glutReportErrors(void);
#endif
 
#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
/* GLUT device control sub-API. */
/* glutSetKeyRepeat modes. */
#define GLUT_KEY_REPEAT_OFF 0
#define GLUT_KEY_REPEAT_ON 1
#define GLUT_KEY_REPEAT_DEFAULT 2
 
/* Joystick button masks. */
#define GLUT_JOYSTICK_BUTTON_A 1
#define GLUT_JOYSTICK_BUTTON_B 2
#define GLUT_JOYSTICK_BUTTON_C 4
#define GLUT_JOYSTICK_BUTTON_D 8
 
GLUTAPI void GLUTAPIENTRY glutIgnoreKeyRepeat(int ignore);
GLUTAPI void GLUTAPIENTRY glutSetKeyRepeat(int repeatMode);
GLUTAPI void GLUTAPIENTRY glutForceJoystickFunc(void);
 
/* GLUT game mode sub-API. */
/* glutGameModeGet. */
#define GLUT_GAME_MODE_ACTIVE 0
#define GLUT_GAME_MODE_POSSIBLE 1
#define GLUT_GAME_MODE_WIDTH 2
#define GLUT_GAME_MODE_HEIGHT 3
#define GLUT_GAME_MODE_PIXEL_DEPTH 4
#define GLUT_GAME_MODE_REFRESH_RATE 5
#define GLUT_GAME_MODE_DISPLAY_CHANGED 6
 
GLUTAPI void GLUTAPIENTRY glutGameModeString(const char *string);
GLUTAPI int GLUTAPIENTRY glutEnterGameMode(void);
GLUTAPI void GLUTAPIENTRY glutLeaveGameMode(void);
GLUTAPI int GLUTAPIENTRY glutGameModeGet(GLenum mode);
#endif
 
#ifdef __cplusplus
}
#endif
 
#if 0
#ifdef GLUT_APIENTRY_DEFINED
# undef GLUT_APIENTRY_DEFINED
# undef APIENTRY
#endif
 
#ifdef GLUT_WINGDIAPI_DEFINED
# undef GLUT_WINGDIAPI_DEFINED
# undef WINGDIAPI
#endif
 
#ifdef GLUT_DEFINED___CDECL
# undef GLUT_DEFINED___CDECL
# undef __cdecl
#endif
 
#ifdef GLUT_DEFINED__CRTIMP
# undef GLUT_DEFINED__CRTIMP
# undef _CRTIMP
#endif
#endif
 
#endif /* __glut_h__ */
/shark/trunk/ports/mesa/include/GL/wmesa.h
0,0 → 1,168
/* $Id: wmesa.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.0
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
 
 
/*
* $Log: not supported by cvs2svn $
* Revision 1.2 2002/04/23 18:23:32 kschultz
* Fix up alpha buffer handling for Windows.
* - add two new Pixel Format Descriptors that do not have alpha bits to
* mirror the two that do.
* - add logic to wglChoosePixelFormat to match PFD's with respect to alpha.
* - Create/clear software alpha buffer as required.
* Now a wgl or GLUT program can control the creation of a software alpha
* buffer via the PFD or GLUT parms, respectively.
*
* Revision 1.1.1.1 1999/08/19 00:55:40 jtg
* Imported sources
*
* Revision 3.2 1999/01/03 02:54:45 brianp
* updated per Ted Jump
*
* Revision 3.1 1998/12/01 02:34:27 brianp
* applied Mark Kilgard's patches from November 30, 1998
*
* Revision 3.0 1998/02/20 05:06:59 brianp
* initial rev
*
*/
 
 
/*
* Windows driver by: Mark E. Peterson (markp@ic.mankato.mn.us)
* Updated by Li Wei (liwei@aiar.xjtu.edu.cn)
*
*
***************************************************************
* WMesa *
* version 2.3 *
* *
* By *
* Li Wei *
* Institute of Artificial Intelligence & Robotics *
* Xi'an Jiaotong University *
* Email: liwei@aiar.xjtu.edu.cn *
* Web page: http://sun.aiar.xjtu.edu.cn *
* *
* July 7th, 1997 *
***************************************************************
*/
 
 
#ifndef WMESA_H
#define WMESA_H
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#include "gl\gl.h"
 
#pragma warning (disable:4273)
#pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */
#pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */
#pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */
#pragma warning( disable : 4013 ) /* 'function' undefined; assuming extern returning int */
#pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */
#pragma warning( disable : 4273 ) /* 'identifier' : inconsistent DLL linkage. dllexport assumed */
#if (MESA_WARNQUIET>1)
# pragma warning( disable : 4146 ) /* unary minus operator applied to unsigned type, result still unsigned */
#endif
 
/*
* This is the WMesa context 'handle':
*/
typedef struct wmesa_context *WMesaContext;
 
 
 
/*
* Create a new WMesaContext for rendering into a window. You must
* have already created the window of correct visual type and with an
* appropriate colormap.
*
* Input:
* hWnd - Window handle
* Pal - Palette to use
* rgb_flag - GL_TRUE = RGB mode,
* GL_FALSE = color index mode
* db_flag - GL_TRUE = double-buffered,
* GL_FALSE = single buffered
* alpha_flag - GL_TRUE = create software alpha buffer,
* GL_FALSE = no software alpha buffer
*
* Note: Indexed mode requires double buffering under Windows.
*
* Return: a WMesa_context or NULL if error.
*/
extern WMesaContext WMesaCreateContext(HWND hWnd,HPALETTE* pPal,
GLboolean rgb_flag,
GLboolean db_flag,
GLboolean alpha_flag);
 
 
/*
* Destroy a rendering context as returned by WMesaCreateContext()
*/
/*extern void WMesaDestroyContext( WMesaContext ctx );*/
extern void WMesaDestroyContext( void );
 
 
 
/*
* Make the specified context the current one.
*/
extern void WMesaMakeCurrent( WMesaContext ctx );
 
 
/*
* Return a handle to the current context.
*/
extern WMesaContext WMesaGetCurrentContext( void );
 
 
/*
* Swap the front and back buffers for the current context. No action
* taken if the context is not double buffered.
*/
extern void WMesaSwapBuffers(void);
 
 
/*
* In indexed color mode we need to know when the palette changes.
*/
extern void WMesaPaletteChange(HPALETTE Pal);
 
extern void WMesaMove(void);
 
 
 
#ifdef __cplusplus
}
#endif
 
 
#endif
 
/shark/trunk/ports/mesa/include/GL/ggimesa.h
0,0 → 1,87
/* $Id: ggimesa.h,v 1.1 2003-02-28 11:41:55 pj Exp $ */
 
/*
* Mesa 3-D graphics library GGI bindings (GGIGL [giggle])
* Version: 4.0
* Copyright (C) 1995-2000 Brian Paul
* Copyright (C) 1998 Uwe Maurer
* Copyrigth (C) 2001 Filip Spacek
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
#ifndef GGIMESA_H
#define GGIMESA_H
 
#define GGIMESA_MAJOR_VERSION 4
#define GGIMESA_MINOR_VERSION 0
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include <ggi/ggi.h>
#include "GL/gl.h"
typedef struct ggi_mesa_context *ggi_mesa_context_t;
 
/*
* Initialize Mesa GGI extension
*/
int ggiMesaInit(void);
/*
* Clean up Mesa GGI exension
*/
int ggiMesaExit(void);
 
/*
* Attach Mesa GGI extension to the visual 'vis'
*/
int ggiMesaAttach(ggi_visual_t vis);
/*
* Detach Mesa GGI extension from the visual 'vis'
*/
int ggiMesaDetach(ggi_visual_t vis);
 
int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
GLboolean stereo_flag, GLint depth_size,
GLint stencil_size, GLint accum_red_size,
GLint accum_green_size, GLint accum_blue_size,
GLint accum_alpha_size, GLint num_samples);
 
/*
* Create a new context capable of displaying on the visual vis.
*/
ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis);
/*
* Destroy the context 'ctx'
*/
void ggiMesaDestroyContext(ggi_mesa_context_t ctx);
 
/*
* Make context 'ctx' the current context and bind it to visual 'vis'.
* Note that the context must have been created with respect to that visual.
*/
void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis);
 
void ggiMesaSwapBuffers(void);
 
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/glx_mangle.h
0,0 → 1,57
/* $Id: glx_mangle.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
#ifndef GLX_MANGLE_H
#define GLX_MANGLE_H
 
#define glXChooseVisual mglXChooseVisual
#define glXCreateContext mglXCreateContext
#define glXDestroyContext mglXDestroyContext
#define glXMakeCurrent mglXMakeCurrent
#define glXCopyContext mglXCopyContext
#define glXSwapBuffers mglXSwapBuffers
#define glXCreateGLXPixmap mglXCreateGLXPixmap
#define glXDestroyGLXPixmap mglXDestroyGLXPixmap
#define glXQueryExtension mglXQueryExtension
#define glXQueryVersion mglXQueryVersion
#define glXIsDirect mglXIsDirect
#define glXGetConfig mglXGetConfig
#define glXGetCurrentContext mglXGetCurrentContext
#define glXGetCurrentDrawable mglXGetCurrentDrawable
#define glXWaitGL mglXWaitGL
#define glXWaitX mglXWaitX
#define glXUseXFont mglXUseXFont
#define glXQueryExtensionsString mglXQueryExtensionsString
#define glXQueryServerString mglXQueryServerString
#define glXGetClientString mglXGetClientString
#define glXCreateGLXPixmapMESA mglXCreateGLXPixmapMESA
#define glXReleaseBuffersMESA mglXReleaseBuffersMESA
#define glXCopySubBufferMESA mglXCopySubBufferMESA
#define glXGetVideoSyncSGI mglXGetVideoSyncSGI
#define glXWaitVideoSyncSGI mglXWaitVideoSyncSGI
 
/* GLX 1.4 */
#define glXGetProcAddress mglXGetProcAddress
 
 
#endif
/shark/trunk/ports/mesa/include/GL/xmesa.h
0,0 → 1,392
/* $Id: xmesa.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Mesa/X11 interface. This header file serves as the documentation for
* the Mesa/X11 interface functions.
*
* Note: this interface isn't intended for user programs. It's primarily
* just for implementing the pseudo-GLX interface.
*/
 
 
/* Sample Usage:
 
In addition to the usual X calls to select a visual, create a colormap
and create a window, you must do the following to use the X/Mesa interface:
 
1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo.
 
2. Call XMesaCreateContext() to create an X/Mesa rendering context, given
the XMesaVisual.
 
3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window
and XMesaVisual.
 
4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and
to make the context the current one.
 
5. Make gl* calls to render your graphics.
 
6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers.
 
7. Before the X window is destroyed, call XMesaDestroyBuffer().
 
8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext.
 
*/
 
 
 
 
#ifndef XMESA_H
#define XMESA_H
 
#ifdef __VMS
#include <GL/vms_x_fix.h>
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifdef XFree86Server
#include "xmesa_xf86.h"
#else
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "xmesa_x.h"
#endif
#include "GL/gl.h"
 
#ifdef AMIWIN
#include <pragmas/xlib_pragmas.h>
extern struct Library *XLibBase;
#endif
 
 
#define XMESA_MAJOR_VERSION 4
#define XMESA_MINOR_VERSION 1
 
 
 
/*
* Values passed to XMesaGetString:
*/
#define XMESA_VERSION 1
#define XMESA_EXTENSIONS 2
 
 
/*
* Values passed to XMesaSetFXmode:
*/
#define XMESA_FX_WINDOW 1
#define XMESA_FX_FULLSCREEN 2
 
 
 
typedef struct xmesa_context *XMesaContext;
 
typedef struct xmesa_visual *XMesaVisual;
 
typedef struct xmesa_buffer *XMesaBuffer;
 
 
 
/*
* Create a new X/Mesa visual.
* Input: display - X11 display
* visinfo - an XVisualInfo pointer
* rgb_flag - GL_TRUE = RGB mode,
* GL_FALSE = color index mode
* alpha_flag - alpha buffer requested?
* db_flag - GL_TRUE = double-buffered,
* GL_FALSE = single buffered
* stereo_flag - stereo visual?
* ximage_flag - GL_TRUE = use an XImage for back buffer,
* GL_FALSE = use an off-screen pixmap for back buffer
* depth_size - requested bits/depth values, or zero
* stencil_size - requested bits/stencil values, or zero
* accum_red_size - requested bits/red accum values, or zero
* accum_green_size - requested bits/green accum values, or zero
* accum_blue_size - requested bits/blue accum values, or zero
* accum_alpha_size - requested bits/alpha accum values, or zero
* num_samples - number of samples/pixel if multisampling, or zero
* level - visual level, usually 0
* visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
* Return; a new XMesaVisual or 0 if error.
*/
extern XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
XMesaVisualInfo visinfo,
GLboolean rgb_flag,
GLboolean alpha_flag,
GLboolean db_flag,
GLboolean stereo_flag,
GLboolean ximage_flag,
GLint depth_size,
GLint stencil_size,
GLint accum_red_size,
GLint accum_green_size,
GLint accum_blue_size,
GLint accum_alpha_size,
GLint num_samples,
GLint level,
GLint visualCaveat );
 
/*
* Destroy an XMesaVisual, but not the associated XVisualInfo.
*/
extern void XMesaDestroyVisual( XMesaVisual v );
 
 
 
/*
* Create a new XMesaContext for rendering into an X11 window.
*
* Input: visual - an XMesaVisual
* share_list - another XMesaContext with which to share display
* lists or NULL if no sharing is wanted.
* Return: an XMesaContext or NULL if error.
*/
extern XMesaContext XMesaCreateContext( XMesaVisual v,
XMesaContext share_list );
 
 
/*
* Destroy a rendering context as returned by XMesaCreateContext()
*/
extern void XMesaDestroyContext( XMesaContext c );
 
 
/*
* Create an XMesaBuffer from an X window.
*/
extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w );
 
 
/*
* Create an XMesaBuffer from an X pixmap.
*/
extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
XMesaPixmap p,
XMesaColormap cmap );
 
 
/*
* Destroy an XMesaBuffer, but not the corresponding window or pixmap.
*/
extern void XMesaDestroyBuffer( XMesaBuffer b );
 
 
/*
* Return the XMesaBuffer handle which corresponds to an X drawable, if any.
*
* New in Mesa 2.3.
*/
extern XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy,
XMesaDrawable d );
 
 
 
/*
* Bind a buffer to a context and make the context the current one.
*/
extern GLboolean XMesaMakeCurrent( XMesaContext c,
XMesaBuffer b );
 
 
/*
* Bind two buffers (read and draw) to a context and make the
* context the current one.
* New in Mesa 3.3
*/
extern GLboolean XMesaMakeCurrent2( XMesaContext c,
XMesaBuffer drawBuffer,
XMesaBuffer readBuffer );
 
 
/*
* Unbind the current context from its buffer.
*/
extern GLboolean XMesaUnbindContext( XMesaContext c );
 
 
/*
* Return a handle to the current context.
*/
extern XMesaContext XMesaGetCurrentContext( void );
 
 
/*
* Return handle to the current (draw) buffer.
*/
extern XMesaBuffer XMesaGetCurrentBuffer( void );
 
 
/*
* Return handle to the current read buffer.
* New in Mesa 3.3
*/
extern XMesaBuffer XMesaGetCurrentReadBuffer( void );
 
 
/*
* Swap the front and back buffers for the given buffer. No action is
* taken if the buffer is not double buffered.
*/
extern void XMesaSwapBuffers( XMesaBuffer b );
 
 
/*
* Copy a sub-region of the back buffer to the front buffer.
*
* New in Mesa 2.6
*/
extern void XMesaCopySubBuffer( XMesaBuffer b,
int x,
int y,
int width,
int height );
 
 
/*
* Return a pointer to the the Pixmap or XImage being used as the back
* color buffer of an XMesaBuffer. This function is a way to get "under
* the hood" of X/Mesa so one can manipulate the back buffer directly.
* Input: b - the XMesaBuffer
* Output: pixmap - pointer to back buffer's Pixmap, or 0
* ximage - pointer to back buffer's XImage, or NULL
* Return: GL_TRUE = context is double buffered
* GL_FALSE = context is single buffered
*/
extern GLboolean XMesaGetBackBuffer( XMesaBuffer b,
XMesaPixmap *pixmap,
XMesaImage **ximage );
 
 
 
/*
* Return the depth buffer associated with an XMesaBuffer.
* Input: b - the XMesa buffer handle
* Output: width, height - size of buffer in pixels
* bytesPerValue - bytes per depth value (2 or 4)
* buffer - pointer to depth buffer values
* Return: GL_TRUE or GL_FALSE to indicate success or failure.
*
* New in Mesa 2.4.
*/
extern GLboolean XMesaGetDepthBuffer( XMesaBuffer b,
GLint *width,
GLint *height,
GLint *bytesPerValue,
void **buffer );
 
 
 
/*
* Flush/sync a context
*/
extern void XMesaFlush( XMesaContext c );
 
 
 
/*
* Get an X/Mesa-specific string.
* Input: name - either XMESA_VERSION or XMESA_EXTENSIONS
*/
extern const char *XMesaGetString( XMesaContext c, int name );
 
 
 
/*
* Scan for XMesaBuffers whose window/pixmap has been destroyed, then free
* any memory used by that buffer.
*
* New in Mesa 2.3.
*/
extern void XMesaGarbageCollect( void );
 
 
 
/*
* Return a dithered pixel value.
* Input: c - XMesaContext
* x, y - window coordinate
* red, green, blue, alpha - color components in [0,1]
* Return: pixel value
*
* New in Mesa 2.3.
*/
extern unsigned long XMesaDitherColor( XMesaContext xmesa,
GLint x,
GLint y,
GLfloat red,
GLfloat green,
GLfloat blue,
GLfloat alpha );
 
 
 
/*
* 3Dfx Glide driver only!
* Set 3Dfx/Glide full-screen or window rendering mode.
* Input: mode - either XMESA_FX_WINDOW (window rendering mode) or
* XMESA_FX_FULLSCREEN (full-screen rendering mode)
* Return: GL_TRUE if success
* GL_FALSE if invalid mode or if not using 3Dfx driver
*
* New in Mesa 2.6.
*/
extern GLboolean XMesaSetFXmode( GLint mode );
 
 
 
/*
* Reallocate the back/depth/stencil/accum/etc/ buffers associated with
* buffer <b> if its size has changed.
*
* New in Mesa 4.0.2
*/
extern void XMesaResizeBuffers( XMesaBuffer b );
 
 
 
/*
* Create a pbuffer.
* New in Mesa 4.1
*/
extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
unsigned int width, unsigned int height);
 
 
 
#ifdef __cplusplus
}
#endif
 
 
#endif
/shark/trunk/ports/mesa/include/GL/fxmesa.h
0,0 → 1,103
/* $Id: fxmesa.h,v 1.1 2003-02-28 11:41:55 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.0
* Copyright (C) 1995-2001 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* FXMesa - 3Dfx Glide driver for Mesa. Contributed by David Bucciarelli
*
* NOTE: This version requires Glide 2.3 or later.
*/
 
 
#ifndef FXMESA_H
#define FXMESA_H
 
 
#include <glide.h>
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#define FXMESA_MAJOR_VERSION 4
#define FXMESA_MINOR_VERSION 0
 
 
/*
* Values for attribList parameter to fxMesaCreateContext():
*/
#define FXMESA_NONE 0 /* to terminate attribList */
#define FXMESA_DOUBLEBUFFER 10
#define FXMESA_ALPHA_SIZE 11 /* followed by an integer */
#define FXMESA_DEPTH_SIZE 12 /* followed by an integer */
#define FXMESA_STENCIL_SIZE 13 /* followed by an integer */
#define FXMESA_ACCUM_SIZE 14 /* followed by an integer */
 
 
 
typedef struct tfxMesaContext *fxMesaContext;
 
 
#if defined (__BEOS__)
#pragma export on
#endif
 
 
GLAPI fxMesaContext GLAPIENTRY fxMesaCreateContext(GLuint win, GrScreenResolution_t,
GrScreenRefresh_t,
const GLint attribList[]);
 
GLAPI fxMesaContext GLAPIENTRY fxMesaCreateBestContext(GLuint win,
GLint width, GLint height,
const GLint attribList[]);
GLAPI void GLAPIENTRY fxMesaDestroyContext(fxMesaContext ctx);
 
GLAPI GLboolean GLAPIENTRY fxMesaSelectCurrentBoard(int n);
 
GLAPI void GLAPIENTRY fxMesaMakeCurrent(fxMesaContext ctx);
 
GLAPI fxMesaContext GLAPIENTRY fxMesaGetCurrentContext(void);
 
GLAPI void GLAPIENTRY fxMesaSwapBuffers(void);
 
GLAPI void GLAPIENTRY fxMesaSetNearFar(GLfloat nearVal, GLfloat farVal);
 
GLAPI void GLAPIENTRY fxMesaUpdateScreenSize(fxMesaContext ctx);
 
GLAPI int GLAPIENTRY fxQueryHardware(void);
 
GLAPI void GLAPIENTRY fxCloseHardware(void);
 
 
#if defined (__BEOS__)
#pragma export off
#endif
 
 
#ifdef __cplusplus
}
#endif
 
 
#endif
/shark/trunk/ports/mesa/include/GL/glext.h
0,0 → 1,5024
#ifndef __glext_h_
#define __glext_h_
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*
** License Applicability. Except to the extent portions of this file are
** made subject to an alternative license as permitted in the SGI Free
** Software License B, Version 1.1 (the "License"), the contents of this
** file are subject only to the provisions of the License. You may not use
** this file except in compliance with the License. You may obtain a copy
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
**
** http://oss.sgi.com/projects/FreeB
**
** Note that, as provided in the License, the Software is distributed on an
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
**
** Original Code. The Original Code is: OpenGL Sample Implementation,
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
** Inc. The Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc.
** Copyright in any portions created by third parties is as indicated
** elsewhere herein. All Rights Reserved.
**
** Additional Notice Provisions: This software was created using the
** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
** not been independently verified as being compliant with the OpenGL(R)
** version 1.2.1 Specification.
*/
 
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__)
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
 
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef GLAPI
#define GLAPI extern
#endif
 
/*************************************************************/
 
/* Header file version number, required by OpenGL ABI for Linux */
/* glext.h last updated 2002/08/21 */
/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */
#define GL_GLEXT_VERSION 17
 
#ifndef GL_VERSION_1_2
#define GL_UNSIGNED_BYTE_3_3_2 0x8032
#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
#define GL_UNSIGNED_INT_8_8_8_8 0x8035
#define GL_UNSIGNED_INT_10_10_10_2 0x8036
#define GL_RESCALE_NORMAL 0x803A
#define GL_TEXTURE_BINDING_3D 0x806A
#define GL_PACK_SKIP_IMAGES 0x806B
#define GL_PACK_IMAGE_HEIGHT 0x806C
#define GL_UNPACK_SKIP_IMAGES 0x806D
#define GL_UNPACK_IMAGE_HEIGHT 0x806E
#define GL_TEXTURE_3D 0x806F
#define GL_PROXY_TEXTURE_3D 0x8070
#define GL_TEXTURE_DEPTH 0x8071
#define GL_TEXTURE_WRAP_R 0x8072
#define GL_MAX_3D_TEXTURE_SIZE 0x8073
#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
#define GL_UNSIGNED_SHORT_5_6_5 0x8363
#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
#define GL_BGR 0x80E0
#define GL_BGRA 0x80E1
#define GL_MAX_ELEMENTS_VERTICES 0x80E8
#define GL_MAX_ELEMENTS_INDICES 0x80E9
#define GL_CLAMP_TO_EDGE 0x812F
#define GL_TEXTURE_MIN_LOD 0x813A
#define GL_TEXTURE_MAX_LOD 0x813B
#define GL_TEXTURE_BASE_LEVEL 0x813C
#define GL_TEXTURE_MAX_LEVEL 0x813D
#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
#define GL_SINGLE_COLOR 0x81F9
#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
#endif
 
#ifndef GL_ARB_imaging
#define GL_CONSTANT_COLOR 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
#define GL_CONSTANT_ALPHA 0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
#define GL_BLEND_COLOR 0x8005
#define GL_FUNC_ADD 0x8006
#define GL_MIN 0x8007
#define GL_MAX 0x8008
#define GL_BLEND_EQUATION 0x8009
#define GL_FUNC_SUBTRACT 0x800A
#define GL_FUNC_REVERSE_SUBTRACT 0x800B
#define GL_CONVOLUTION_1D 0x8010
#define GL_CONVOLUTION_2D 0x8011
#define GL_SEPARABLE_2D 0x8012
#define GL_CONVOLUTION_BORDER_MODE 0x8013
#define GL_CONVOLUTION_FILTER_SCALE 0x8014
#define GL_CONVOLUTION_FILTER_BIAS 0x8015
#define GL_REDUCE 0x8016
#define GL_CONVOLUTION_FORMAT 0x8017
#define GL_CONVOLUTION_WIDTH 0x8018
#define GL_CONVOLUTION_HEIGHT 0x8019
#define GL_MAX_CONVOLUTION_WIDTH 0x801A
#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
#define GL_HISTOGRAM 0x8024
#define GL_PROXY_HISTOGRAM 0x8025
#define GL_HISTOGRAM_WIDTH 0x8026
#define GL_HISTOGRAM_FORMAT 0x8027
#define GL_HISTOGRAM_RED_SIZE 0x8028
#define GL_HISTOGRAM_GREEN_SIZE 0x8029
#define GL_HISTOGRAM_BLUE_SIZE 0x802A
#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
#define GL_HISTOGRAM_SINK 0x802D
#define GL_MINMAX 0x802E
#define GL_MINMAX_FORMAT 0x802F
#define GL_MINMAX_SINK 0x8030
#define GL_TABLE_TOO_LARGE 0x8031
#define GL_COLOR_MATRIX 0x80B1
#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
#define GL_COLOR_TABLE 0x80D0
#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
#define GL_PROXY_COLOR_TABLE 0x80D3
#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
#define GL_COLOR_TABLE_SCALE 0x80D6
#define GL_COLOR_TABLE_BIAS 0x80D7
#define GL_COLOR_TABLE_FORMAT 0x80D8
#define GL_COLOR_TABLE_WIDTH 0x80D9
#define GL_COLOR_TABLE_RED_SIZE 0x80DA
#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
#define GL_CONSTANT_BORDER 0x8151
#define GL_REPLICATE_BORDER 0x8153
#define GL_CONVOLUTION_BORDER_COLOR 0x8154
#endif
 
#ifndef GL_VERSION_1_3
#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84C3
#define GL_TEXTURE4 0x84C4
#define GL_TEXTURE5 0x84C5
#define GL_TEXTURE6 0x84C6
#define GL_TEXTURE7 0x84C7
#define GL_TEXTURE8 0x84C8
#define GL_TEXTURE9 0x84C9
#define GL_TEXTURE10 0x84CA
#define GL_TEXTURE11 0x84CB
#define GL_TEXTURE12 0x84CC
#define GL_TEXTURE13 0x84CD
#define GL_TEXTURE14 0x84CE
#define GL_TEXTURE15 0x84CF
#define GL_TEXTURE16 0x84D0
#define GL_TEXTURE17 0x84D1
#define GL_TEXTURE18 0x84D2
#define GL_TEXTURE19 0x84D3
#define GL_TEXTURE20 0x84D4
#define GL_TEXTURE21 0x84D5
#define GL_TEXTURE22 0x84D6
#define GL_TEXTURE23 0x84D7
#define GL_TEXTURE24 0x84D8
#define GL_TEXTURE25 0x84D9
#define GL_TEXTURE26 0x84DA
#define GL_TEXTURE27 0x84DB
#define GL_TEXTURE28 0x84DC
#define GL_TEXTURE29 0x84DD
#define GL_TEXTURE30 0x84DE
#define GL_TEXTURE31 0x84DF
#define GL_ACTIVE_TEXTURE 0x84E0
#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
#define GL_MAX_TEXTURE_UNITS 0x84E2
#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
#define GL_MULTISAMPLE 0x809D
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
#define GL_SAMPLE_COVERAGE 0x80A0
#define GL_SAMPLE_BUFFERS 0x80A8
#define GL_SAMPLES 0x80A9
#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
#define GL_MULTISAMPLE_BIT 0x20000000
#define GL_NORMAL_MAP 0x8511
#define GL_REFLECTION_MAP 0x8512
#define GL_TEXTURE_CUBE_MAP 0x8513
#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
#define GL_COMPRESSED_ALPHA 0x84E9
#define GL_COMPRESSED_LUMINANCE 0x84EA
#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
#define GL_COMPRESSED_INTENSITY 0x84EC
#define GL_COMPRESSED_RGB 0x84ED
#define GL_COMPRESSED_RGBA 0x84EE
#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
#define GL_TEXTURE_COMPRESSED 0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
#define GL_CLAMP_TO_BORDER 0x812D
#define GL_CLAMP_TO_BORDER_SGIS 0x812D
#define GL_COMBINE 0x8570
#define GL_COMBINE_RGB 0x8571
#define GL_COMBINE_ALPHA 0x8572
#define GL_SOURCE0_RGB 0x8580
#define GL_SOURCE1_RGB 0x8581
#define GL_SOURCE2_RGB 0x8582
#define GL_SOURCE0_ALPHA 0x8588
#define GL_SOURCE1_ALPHA 0x8589
#define GL_SOURCE2_ALPHA 0x858A
#define GL_OPERAND0_RGB 0x8590
#define GL_OPERAND1_RGB 0x8591
#define GL_OPERAND2_RGB 0x8592
#define GL_OPERAND0_ALPHA 0x8598
#define GL_OPERAND1_ALPHA 0x8599
#define GL_OPERAND2_ALPHA 0x859A
#define GL_RGB_SCALE 0x8573
#define GL_ADD_SIGNED 0x8574
#define GL_INTERPOLATE 0x8575
#define GL_SUBTRACT 0x84E7
#define GL_CONSTANT 0x8576
#define GL_PRIMARY_COLOR 0x8577
#define GL_PREVIOUS 0x8578
#define GL_DOT3_RGB 0x86AE
#define GL_DOT3_RGBA 0x86AF
#endif
 
#ifndef GL_VERSION_1_4
#define GL_BLEND_DST_RGB 0x80C8
#define GL_BLEND_SRC_RGB 0x80C9
#define GL_BLEND_DST_ALPHA 0x80CA
#define GL_BLEND_SRC_ALPHA 0x80CB
#define GL_POINT_SIZE_MIN 0x8126
#define GL_POINT_SIZE_MAX 0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
#define GL_POINT_DISTANCE_ATTENUATION 0x8129
#define GL_GENERATE_MIPMAP 0x8191
#define GL_GENERATE_MIPMAP_HINT 0x8192
#define GL_DEPTH_COMPONENT16 0x81A5
#define GL_DEPTH_COMPONENT24 0x81A6
#define GL_DEPTH_COMPONENT32 0x81A7
#define GL_MIRRORED_REPEAT 0x8370
#define GL_FOG_COORDINATE_SOURCE 0x8450
#define GL_FOG_COORDINATE 0x8451
#define GL_FRAGMENT_DEPTH 0x8452
#define GL_CURRENT_FOG_COORDINATE 0x8453
#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
#define GL_FOG_COORDINATE_ARRAY 0x8457
#define GL_COLOR_SUM 0x8458
#define GL_CURRENT_SECONDARY_COLOR 0x8459
#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
#define GL_SECONDARY_COLOR_ARRAY 0x845E
#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
#define GL_TEXTURE_FILTER_CONTROL 0x8500
#define GL_TEXTURE_LOD_BIAS 0x8501
#define GL_INCR_WRAP 0x8507
#define GL_DECR_WRAP 0x8508
#define GL_TEXTURE_DEPTH_SIZE 0x884A
#define GL_DEPTH_TEXTURE_MODE 0x884B
#define GL_TEXTURE_COMPARE_MODE 0x884C
#define GL_TEXTURE_COMPARE_FUNC 0x884D
#define GL_COMPARE_R_TO_TEXTURE 0x884E
#endif
 
#ifndef GL_ARB_multitexture
#define GL_TEXTURE0_ARB 0x84C0
#define GL_TEXTURE1_ARB 0x84C1
#define GL_TEXTURE2_ARB 0x84C2
#define GL_TEXTURE3_ARB 0x84C3
#define GL_TEXTURE4_ARB 0x84C4
#define GL_TEXTURE5_ARB 0x84C5
#define GL_TEXTURE6_ARB 0x84C6
#define GL_TEXTURE7_ARB 0x84C7
#define GL_TEXTURE8_ARB 0x84C8
#define GL_TEXTURE9_ARB 0x84C9
#define GL_TEXTURE10_ARB 0x84CA
#define GL_TEXTURE11_ARB 0x84CB
#define GL_TEXTURE12_ARB 0x84CC
#define GL_TEXTURE13_ARB 0x84CD
#define GL_TEXTURE14_ARB 0x84CE
#define GL_TEXTURE15_ARB 0x84CF
#define GL_TEXTURE16_ARB 0x84D0
#define GL_TEXTURE17_ARB 0x84D1
#define GL_TEXTURE18_ARB 0x84D2
#define GL_TEXTURE19_ARB 0x84D3
#define GL_TEXTURE20_ARB 0x84D4
#define GL_TEXTURE21_ARB 0x84D5
#define GL_TEXTURE22_ARB 0x84D6
#define GL_TEXTURE23_ARB 0x84D7
#define GL_TEXTURE24_ARB 0x84D8
#define GL_TEXTURE25_ARB 0x84D9
#define GL_TEXTURE26_ARB 0x84DA
#define GL_TEXTURE27_ARB 0x84DB
#define GL_TEXTURE28_ARB 0x84DC
#define GL_TEXTURE29_ARB 0x84DD
#define GL_TEXTURE30_ARB 0x84DE
#define GL_TEXTURE31_ARB 0x84DF
#define GL_ACTIVE_TEXTURE_ARB 0x84E0
#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
#endif
 
#ifndef GL_ARB_transpose_matrix
#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
#endif
 
#ifndef GL_ARB_multisample
#define GL_MULTISAMPLE_ARB 0x809D
#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
#define GL_SAMPLE_COVERAGE_ARB 0x80A0
#define GL_SAMPLE_BUFFERS_ARB 0x80A8
#define GL_SAMPLES_ARB 0x80A9
#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
#define GL_MULTISAMPLE_BIT_ARB 0x20000000
#endif
 
#ifndef GL_ARB_texture_env_add
#endif
 
#ifndef GL_ARB_texture_cube_map
#define GL_NORMAL_MAP_ARB 0x8511
#define GL_REFLECTION_MAP_ARB 0x8512
#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
#endif
 
#ifndef GL_ARB_texture_compression
#define GL_COMPRESSED_ALPHA_ARB 0x84E9
#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
#define GL_COMPRESSED_RGB_ARB 0x84ED
#define GL_COMPRESSED_RGBA_ARB 0x84EE
#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
#endif
 
#ifndef GL_ARB_texture_border_clamp
#define GL_CLAMP_TO_BORDER_ARB 0x812D
#endif
 
#ifndef GL_ARB_point_parameters
#define GL_POINT_SIZE_MIN_ARB 0x8126
#define GL_POINT_SIZE_MAX_ARB 0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
#endif
 
#ifndef GL_ARB_vertex_blend
#define GL_MAX_VERTEX_UNITS_ARB 0x86A4
#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
#define GL_VERTEX_BLEND_ARB 0x86A7
#define GL_CURRENT_WEIGHT_ARB 0x86A8
#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
#define GL_WEIGHT_ARRAY_ARB 0x86AD
#define GL_MODELVIEW0_ARB 0x1700
#define GL_MODELVIEW1_ARB 0x850A
#define GL_MODELVIEW2_ARB 0x8722
#define GL_MODELVIEW3_ARB 0x8723
#define GL_MODELVIEW4_ARB 0x8724
#define GL_MODELVIEW5_ARB 0x8725
#define GL_MODELVIEW6_ARB 0x8726
#define GL_MODELVIEW7_ARB 0x8727
#define GL_MODELVIEW8_ARB 0x8728
#define GL_MODELVIEW9_ARB 0x8729
#define GL_MODELVIEW10_ARB 0x872A
#define GL_MODELVIEW11_ARB 0x872B
#define GL_MODELVIEW12_ARB 0x872C
#define GL_MODELVIEW13_ARB 0x872D
#define GL_MODELVIEW14_ARB 0x872E
#define GL_MODELVIEW15_ARB 0x872F
#define GL_MODELVIEW16_ARB 0x8730
#define GL_MODELVIEW17_ARB 0x8731
#define GL_MODELVIEW18_ARB 0x8732
#define GL_MODELVIEW19_ARB 0x8733
#define GL_MODELVIEW20_ARB 0x8734
#define GL_MODELVIEW21_ARB 0x8735
#define GL_MODELVIEW22_ARB 0x8736
#define GL_MODELVIEW23_ARB 0x8737
#define GL_MODELVIEW24_ARB 0x8738
#define GL_MODELVIEW25_ARB 0x8739
#define GL_MODELVIEW26_ARB 0x873A
#define GL_MODELVIEW27_ARB 0x873B
#define GL_MODELVIEW28_ARB 0x873C
#define GL_MODELVIEW29_ARB 0x873D
#define GL_MODELVIEW30_ARB 0x873E
#define GL_MODELVIEW31_ARB 0x873F
#endif
 
#ifndef GL_ARB_matrix_palette
#define GL_MATRIX_PALETTE_ARB 0x8840
#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841
#define GL_MAX_PALETTE_MATRICES_ARB 0x8842
#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843
#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844
#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845
#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846
#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847
#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848
#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849
#endif
 
#ifndef GL_ARB_texture_env_combine
#define GL_COMBINE_ARB 0x8570
#define GL_COMBINE_RGB_ARB 0x8571
#define GL_COMBINE_ALPHA_ARB 0x8572
#define GL_SOURCE0_RGB_ARB 0x8580
#define GL_SOURCE1_RGB_ARB 0x8581
#define GL_SOURCE2_RGB_ARB 0x8582
#define GL_SOURCE0_ALPHA_ARB 0x8588
#define GL_SOURCE1_ALPHA_ARB 0x8589
#define GL_SOURCE2_ALPHA_ARB 0x858A
#define GL_OPERAND0_RGB_ARB 0x8590
#define GL_OPERAND1_RGB_ARB 0x8591
#define GL_OPERAND2_RGB_ARB 0x8592
#define GL_OPERAND0_ALPHA_ARB 0x8598
#define GL_OPERAND1_ALPHA_ARB 0x8599
#define GL_OPERAND2_ALPHA_ARB 0x859A
#define GL_RGB_SCALE_ARB 0x8573
#define GL_ADD_SIGNED_ARB 0x8574
#define GL_INTERPOLATE_ARB 0x8575
#define GL_SUBTRACT_ARB 0x84E7
#define GL_CONSTANT_ARB 0x8576
#define GL_PRIMARY_COLOR_ARB 0x8577
#define GL_PREVIOUS_ARB 0x8578
#endif
 
#ifndef GL_ARB_texture_env_crossbar
#endif
 
#ifndef GL_ARB_texture_env_dot3
#define GL_DOT3_RGB_ARB 0x86AE
#define GL_DOT3_RGBA_ARB 0x86AF
#endif
 
#ifndef GL_ARB_texture_mirrored_repeat
#define GL_MIRRORED_REPEAT_ARB 0x8370
#endif
 
#ifndef GL_ARB_depth_texture
#define GL_DEPTH_COMPONENT16_ARB 0x81A5
#define GL_DEPTH_COMPONENT24_ARB 0x81A6
#define GL_DEPTH_COMPONENT32_ARB 0x81A7
#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
#endif
 
#ifndef GL_ARB_shadow
#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
#endif
 
#ifndef GL_ARB_shadow_ambient
#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF
#endif
 
#ifndef GL_ARB_window_pos
#endif
 
#ifndef GL_ARB_vertex_program
#define GL_VERTEX_PROGRAM_ARB 0x8620
#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
#define GL_COLOR_SUM_ARB 0x8458
#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
#define GL_PROGRAM_LENGTH_ARB 0x8627
#define GL_PROGRAM_FORMAT_ARB 0x8876
#define GL_PROGRAM_BINDING_ARB 0x8677
#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
#define GL_PROGRAM_STRING_ARB 0x8628
#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
#define GL_CURRENT_MATRIX_ARB 0x8641
#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
#define GL_MATRIX0_ARB 0x88C0
#define GL_MATRIX1_ARB 0x88C1
#define GL_MATRIX2_ARB 0x88C2
#define GL_MATRIX3_ARB 0x88C3
#define GL_MATRIX4_ARB 0x88C4
#define GL_MATRIX5_ARB 0x88C5
#define GL_MATRIX6_ARB 0x88C6
#define GL_MATRIX7_ARB 0x88C7
#define GL_MATRIX8_ARB 0x88C8
#define GL_MATRIX9_ARB 0x88C9
#define GL_MATRIX10_ARB 0x88CA
#define GL_MATRIX11_ARB 0x88CB
#define GL_MATRIX12_ARB 0x88CC
#define GL_MATRIX13_ARB 0x88CD
#define GL_MATRIX14_ARB 0x88CE
#define GL_MATRIX15_ARB 0x88CF
#define GL_MATRIX16_ARB 0x88D0
#define GL_MATRIX17_ARB 0x88D1
#define GL_MATRIX18_ARB 0x88D2
#define GL_MATRIX19_ARB 0x88D3
#define GL_MATRIX20_ARB 0x88D4
#define GL_MATRIX21_ARB 0x88D5
#define GL_MATRIX22_ARB 0x88D6
#define GL_MATRIX23_ARB 0x88D7
#define GL_MATRIX24_ARB 0x88D8
#define GL_MATRIX25_ARB 0x88D9
#define GL_MATRIX26_ARB 0x88DA
#define GL_MATRIX27_ARB 0x88DB
#define GL_MATRIX28_ARB 0x88DC
#define GL_MATRIX29_ARB 0x88DD
#define GL_MATRIX30_ARB 0x88DE
#define GL_MATRIX31_ARB 0x88DF
#endif
 
#ifndef GL_EXT_abgr
#define GL_ABGR_EXT 0x8000
#endif
 
#ifndef GL_EXT_blend_color
#define GL_CONSTANT_COLOR_EXT 0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
#define GL_CONSTANT_ALPHA_EXT 0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
#define GL_BLEND_COLOR_EXT 0x8005
#endif
 
#ifndef GL_EXT_polygon_offset
#define GL_POLYGON_OFFSET_EXT 0x8037
#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
#endif
 
#ifndef GL_EXT_texture
#define GL_ALPHA4_EXT 0x803B
#define GL_ALPHA8_EXT 0x803C
#define GL_ALPHA12_EXT 0x803D
#define GL_ALPHA16_EXT 0x803E
#define GL_LUMINANCE4_EXT 0x803F
#define GL_LUMINANCE8_EXT 0x8040
#define GL_LUMINANCE12_EXT 0x8041
#define GL_LUMINANCE16_EXT 0x8042
#define GL_LUMINANCE4_ALPHA4_EXT 0x8043
#define GL_LUMINANCE6_ALPHA2_EXT 0x8044
#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
#define GL_LUMINANCE12_ALPHA4_EXT 0x8046
#define GL_LUMINANCE12_ALPHA12_EXT 0x8047
#define GL_LUMINANCE16_ALPHA16_EXT 0x8048
#define GL_INTENSITY_EXT 0x8049
#define GL_INTENSITY4_EXT 0x804A
#define GL_INTENSITY8_EXT 0x804B
#define GL_INTENSITY12_EXT 0x804C
#define GL_INTENSITY16_EXT 0x804D
#define GL_RGB2_EXT 0x804E
#define GL_RGB4_EXT 0x804F
#define GL_RGB5_EXT 0x8050
#define GL_RGB8_EXT 0x8051
#define GL_RGB10_EXT 0x8052
#define GL_RGB12_EXT 0x8053
#define GL_RGB16_EXT 0x8054
#define GL_RGBA2_EXT 0x8055
#define GL_RGBA4_EXT 0x8056
#define GL_RGB5_A1_EXT 0x8057
#define GL_RGBA8_EXT 0x8058
#define GL_RGB10_A2_EXT 0x8059
#define GL_RGBA12_EXT 0x805A
#define GL_RGBA16_EXT 0x805B
#define GL_TEXTURE_RED_SIZE_EXT 0x805C
#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
#define GL_REPLACE_EXT 0x8062
#define GL_PROXY_TEXTURE_1D_EXT 0x8063
#define GL_PROXY_TEXTURE_2D_EXT 0x8064
#define GL_TEXTURE_TOO_LARGE_EXT 0x8065
#endif
 
#ifndef GL_EXT_texture3D
#define GL_PACK_SKIP_IMAGES_EXT 0x806B
#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
#define GL_TEXTURE_3D_EXT 0x806F
#define GL_PROXY_TEXTURE_3D_EXT 0x8070
#define GL_TEXTURE_DEPTH_EXT 0x8071
#define GL_TEXTURE_WRAP_R_EXT 0x8072
#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
#endif
 
#ifndef GL_SGIS_texture_filter4
#define GL_FILTER4_SGIS 0x8146
#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147
#endif
 
#ifndef GL_EXT_subtexture
#endif
 
#ifndef GL_EXT_copy_texture
#endif
 
#ifndef GL_EXT_histogram
#define GL_HISTOGRAM_EXT 0x8024
#define GL_PROXY_HISTOGRAM_EXT 0x8025
#define GL_HISTOGRAM_WIDTH_EXT 0x8026
#define GL_HISTOGRAM_FORMAT_EXT 0x8027
#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028
#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029
#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A
#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B
#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C
#define GL_HISTOGRAM_SINK_EXT 0x802D
#define GL_MINMAX_EXT 0x802E
#define GL_MINMAX_FORMAT_EXT 0x802F
#define GL_MINMAX_SINK_EXT 0x8030
#define GL_TABLE_TOO_LARGE_EXT 0x8031
#endif
 
#ifndef GL_EXT_convolution
#define GL_CONVOLUTION_1D_EXT 0x8010
#define GL_CONVOLUTION_2D_EXT 0x8011
#define GL_SEPARABLE_2D_EXT 0x8012
#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013
#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014
#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015
#define GL_REDUCE_EXT 0x8016
#define GL_CONVOLUTION_FORMAT_EXT 0x8017
#define GL_CONVOLUTION_WIDTH_EXT 0x8018
#define GL_CONVOLUTION_HEIGHT_EXT 0x8019
#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A
#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B
#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C
#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D
#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E
#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F
#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020
#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021
#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022
#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023
#endif
 
#ifndef GL_SGI_color_matrix
#define GL_COLOR_MATRIX_SGI 0x80B1
#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2
#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3
#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4
#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5
#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6
#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7
#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8
#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9
#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA
#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB
#endif
 
#ifndef GL_SGI_color_table
#define GL_COLOR_TABLE_SGI 0x80D0
#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1
#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2
#define GL_PROXY_COLOR_TABLE_SGI 0x80D3
#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4
#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5
#define GL_COLOR_TABLE_SCALE_SGI 0x80D6
#define GL_COLOR_TABLE_BIAS_SGI 0x80D7
#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8
#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9
#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA
#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB
#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC
#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD
#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE
#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF
#endif
 
#ifndef GL_SGIS_pixel_texture
#define GL_PIXEL_TEXTURE_SGIS 0x8353
#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354
#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355
#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356
#endif
 
#ifndef GL_SGIX_pixel_texture
#define GL_PIXEL_TEX_GEN_SGIX 0x8139
#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B
#endif
 
#ifndef GL_SGIS_texture4D
#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130
#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131
#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132
#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133
#define GL_TEXTURE_4D_SGIS 0x8134
#define GL_PROXY_TEXTURE_4D_SGIS 0x8135
#define GL_TEXTURE_4DSIZE_SGIS 0x8136
#define GL_TEXTURE_WRAP_Q_SGIS 0x8137
#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138
#define GL_TEXTURE_4D_BINDING_SGIS 0x814F
#endif
 
#ifndef GL_SGI_texture_color_table
#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC
#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD
#endif
 
#ifndef GL_EXT_cmyka
#define GL_CMYK_EXT 0x800C
#define GL_CMYKA_EXT 0x800D
#define GL_PACK_CMYK_HINT_EXT 0x800E
#define GL_UNPACK_CMYK_HINT_EXT 0x800F
#endif
 
#ifndef GL_EXT_texture_object
#define GL_TEXTURE_PRIORITY_EXT 0x8066
#define GL_TEXTURE_RESIDENT_EXT 0x8067
#define GL_TEXTURE_1D_BINDING_EXT 0x8068
#define GL_TEXTURE_2D_BINDING_EXT 0x8069
#define GL_TEXTURE_3D_BINDING_EXT 0x806A
#endif
 
#ifndef GL_SGIS_detail_texture
#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095
#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096
#define GL_LINEAR_DETAIL_SGIS 0x8097
#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098
#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099
#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A
#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B
#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C
#endif
 
#ifndef GL_SGIS_sharpen_texture
#define GL_LINEAR_SHARPEN_SGIS 0x80AD
#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE
#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF
#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0
#endif
 
#ifndef GL_EXT_packed_pixels
#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032
#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035
#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036
#endif
 
#ifndef GL_SGIS_texture_lod
#define GL_TEXTURE_MIN_LOD_SGIS 0x813A
#define GL_TEXTURE_MAX_LOD_SGIS 0x813B
#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C
#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D
#endif
 
#ifndef GL_SGIS_multisample
#define GL_MULTISAMPLE_SGIS 0x809D
#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E
#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F
#define GL_SAMPLE_MASK_SGIS 0x80A0
#define GL_1PASS_SGIS 0x80A1
#define GL_2PASS_0_SGIS 0x80A2
#define GL_2PASS_1_SGIS 0x80A3
#define GL_4PASS_0_SGIS 0x80A4
#define GL_4PASS_1_SGIS 0x80A5
#define GL_4PASS_2_SGIS 0x80A6
#define GL_4PASS_3_SGIS 0x80A7
#define GL_SAMPLE_BUFFERS_SGIS 0x80A8
#define GL_SAMPLES_SGIS 0x80A9
#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA
#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB
#define GL_SAMPLE_PATTERN_SGIS 0x80AC
#endif
 
#ifndef GL_EXT_rescale_normal
#define GL_RESCALE_NORMAL_EXT 0x803A
#endif
 
#ifndef GL_EXT_vertex_array
#define GL_VERTEX_ARRAY_EXT 0x8074
#define GL_NORMAL_ARRAY_EXT 0x8075
#define GL_COLOR_ARRAY_EXT 0x8076
#define GL_INDEX_ARRAY_EXT 0x8077
#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
#endif
 
#ifndef GL_EXT_misc_attribute
#endif
 
#ifndef GL_SGIS_generate_mipmap
#define GL_GENERATE_MIPMAP_SGIS 0x8191
#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
#endif
 
#ifndef GL_SGIX_clipmap
#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170
#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171
#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172
#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173
#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174
#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175
#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176
#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177
#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178
#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D
#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E
#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F
#endif
 
#ifndef GL_SGIX_shadow
#define GL_TEXTURE_COMPARE_SGIX 0x819A
#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B
#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C
#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D
#endif
 
#ifndef GL_SGIS_texture_edge_clamp
#define GL_CLAMP_TO_EDGE_SGIS 0x812F
#endif
 
#ifndef GL_EXT_blend_minmax
#define GL_FUNC_ADD_EXT 0x8006
#define GL_MIN_EXT 0x8007
#define GL_MAX_EXT 0x8008
#define GL_BLEND_EQUATION_EXT 0x8009
#endif
 
#ifndef GL_EXT_blend_subtract
#define GL_FUNC_SUBTRACT_EXT 0x800A
#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
#endif
 
#ifndef GL_EXT_blend_logic_op
#endif
 
#ifndef GL_SGIX_interlace
#define GL_INTERLACE_SGIX 0x8094
#endif
 
#ifndef GL_SGIX_pixel_tiles
#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E
#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F
#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140
#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141
#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142
#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143
#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144
#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145
#endif
 
#ifndef GL_SGIS_texture_select
#define GL_DUAL_ALPHA4_SGIS 0x8110
#define GL_DUAL_ALPHA8_SGIS 0x8111
#define GL_DUAL_ALPHA12_SGIS 0x8112
#define GL_DUAL_ALPHA16_SGIS 0x8113
#define GL_DUAL_LUMINANCE4_SGIS 0x8114
#define GL_DUAL_LUMINANCE8_SGIS 0x8115
#define GL_DUAL_LUMINANCE12_SGIS 0x8116
#define GL_DUAL_LUMINANCE16_SGIS 0x8117
#define GL_DUAL_INTENSITY4_SGIS 0x8118
#define GL_DUAL_INTENSITY8_SGIS 0x8119
#define GL_DUAL_INTENSITY12_SGIS 0x811A
#define GL_DUAL_INTENSITY16_SGIS 0x811B
#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C
#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D
#define GL_QUAD_ALPHA4_SGIS 0x811E
#define GL_QUAD_ALPHA8_SGIS 0x811F
#define GL_QUAD_LUMINANCE4_SGIS 0x8120
#define GL_QUAD_LUMINANCE8_SGIS 0x8121
#define GL_QUAD_INTENSITY4_SGIS 0x8122
#define GL_QUAD_INTENSITY8_SGIS 0x8123
#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124
#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125
#endif
 
#ifndef GL_SGIX_sprite
#define GL_SPRITE_SGIX 0x8148
#define GL_SPRITE_MODE_SGIX 0x8149
#define GL_SPRITE_AXIS_SGIX 0x814A
#define GL_SPRITE_TRANSLATION_SGIX 0x814B
#define GL_SPRITE_AXIAL_SGIX 0x814C
#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D
#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E
#endif
 
#ifndef GL_SGIX_texture_multi_buffer
#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E
#endif
 
#ifndef GL_EXT_point_parameters
#define GL_POINT_SIZE_MIN_EXT 0x8126
#define GL_POINT_SIZE_MAX_EXT 0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
#define GL_DISTANCE_ATTENUATION_EXT 0x8129
#endif
 
#ifndef GL_SGIS_point_parameters
#define GL_POINT_SIZE_MIN_SGIS 0x8126
#define GL_POINT_SIZE_MAX_SGIS 0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128
#define GL_DISTANCE_ATTENUATION_SGIS 0x8129
#endif
 
#ifndef GL_SGIX_instruments
#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180
#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181
#endif
 
#ifndef GL_SGIX_texture_scale_bias
#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179
#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A
#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B
#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C
#endif
 
#ifndef GL_SGIX_framezoom
#define GL_FRAMEZOOM_SGIX 0x818B
#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C
#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D
#endif
 
#ifndef GL_SGIX_tag_sample_buffer
#endif
 
#ifndef GL_FfdMaskSGIX
#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001
#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002
#endif
 
#ifndef GL_SGIX_polynomial_ffd
#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194
#define GL_TEXTURE_DEFORMATION_SGIX 0x8195
#define GL_DEFORMATIONS_MASK_SGIX 0x8196
#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197
#endif
 
#ifndef GL_SGIX_reference_plane
#define GL_REFERENCE_PLANE_SGIX 0x817D
#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E
#endif
 
#ifndef GL_SGIX_flush_raster
#endif
 
#ifndef GL_SGIX_depth_texture
#define GL_DEPTH_COMPONENT16_SGIX 0x81A5
#define GL_DEPTH_COMPONENT24_SGIX 0x81A6
#define GL_DEPTH_COMPONENT32_SGIX 0x81A7
#endif
 
#ifndef GL_SGIS_fog_function
#define GL_FOG_FUNC_SGIS 0x812A
#define GL_FOG_FUNC_POINTS_SGIS 0x812B
#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C
#endif
 
#ifndef GL_SGIX_fog_offset
#define GL_FOG_OFFSET_SGIX 0x8198
#define GL_FOG_OFFSET_VALUE_SGIX 0x8199
#endif
 
#ifndef GL_HP_image_transform
#define GL_IMAGE_SCALE_X_HP 0x8155
#define GL_IMAGE_SCALE_Y_HP 0x8156
#define GL_IMAGE_TRANSLATE_X_HP 0x8157
#define GL_IMAGE_TRANSLATE_Y_HP 0x8158
#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159
#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A
#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B
#define GL_IMAGE_MAG_FILTER_HP 0x815C
#define GL_IMAGE_MIN_FILTER_HP 0x815D
#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E
#define GL_CUBIC_HP 0x815F
#define GL_AVERAGE_HP 0x8160
#define GL_IMAGE_TRANSFORM_2D_HP 0x8161
#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162
#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163
#endif
 
#ifndef GL_HP_convolution_border_modes
#define GL_IGNORE_BORDER_HP 0x8150
#define GL_CONSTANT_BORDER_HP 0x8151
#define GL_REPLICATE_BORDER_HP 0x8153
#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154
#endif
 
#ifndef GL_INGR_palette_buffer
#endif
 
#ifndef GL_SGIX_texture_add_env
#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE
#endif
 
#ifndef GL_EXT_color_subtable
#endif
 
#ifndef GL_PGI_vertex_hints
#define GL_VERTEX_DATA_HINT_PGI 0x1A22A
#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B
#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C
#define GL_MAX_VERTEX_HINT_PGI 0x1A22D
#define GL_COLOR3_BIT_PGI 0x00010000
#define GL_COLOR4_BIT_PGI 0x00020000
#define GL_EDGEFLAG_BIT_PGI 0x00040000
#define GL_INDEX_BIT_PGI 0x00080000
#define GL_MAT_AMBIENT_BIT_PGI 0x00100000
#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000
#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000
#define GL_MAT_EMISSION_BIT_PGI 0x00800000
#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000
#define GL_MAT_SHININESS_BIT_PGI 0x02000000
#define GL_MAT_SPECULAR_BIT_PGI 0x04000000
#define GL_NORMAL_BIT_PGI 0x08000000
#define GL_TEXCOORD1_BIT_PGI 0x10000000
#define GL_TEXCOORD2_BIT_PGI 0x20000000
#define GL_TEXCOORD3_BIT_PGI 0x40000000
#define GL_TEXCOORD4_BIT_PGI 0x80000000
#define GL_VERTEX23_BIT_PGI 0x00000004
#define GL_VERTEX4_BIT_PGI 0x00000008
#endif
 
#ifndef GL_PGI_misc_hints
#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8
#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD
#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE
#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202
#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203
#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204
#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C
#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D
#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E
#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F
#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210
#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211
#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216
#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217
#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218
#define GL_FULL_STIPPLE_HINT_PGI 0x1A219
#define GL_CLIP_NEAR_HINT_PGI 0x1A220
#define GL_CLIP_FAR_HINT_PGI 0x1A221
#define GL_WIDE_LINE_HINT_PGI 0x1A222
#define GL_BACK_NORMALS_HINT_PGI 0x1A223
#endif
 
#ifndef GL_EXT_paletted_texture
#define GL_COLOR_INDEX1_EXT 0x80E2
#define GL_COLOR_INDEX2_EXT 0x80E3
#define GL_COLOR_INDEX4_EXT 0x80E4
#define GL_COLOR_INDEX8_EXT 0x80E5
#define GL_COLOR_INDEX12_EXT 0x80E6
#define GL_COLOR_INDEX16_EXT 0x80E7
#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
#endif
 
#ifndef GL_EXT_clip_volume_hint
#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
#endif
 
#ifndef GL_SGIX_list_priority
#define GL_LIST_PRIORITY_SGIX 0x8182
#endif
 
#ifndef GL_SGIX_ir_instrument1
#define GL_IR_INSTRUMENT1_SGIX 0x817F
#endif
 
#ifndef GL_SGIX_calligraphic_fragment
#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183
#endif
 
#ifndef GL_SGIX_texture_lod_bias
#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E
#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F
#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190
#endif
 
#ifndef GL_SGIX_shadow_ambient
#define GL_SHADOW_AMBIENT_SGIX 0x80BF
#endif
 
#ifndef GL_EXT_index_texture
#endif
 
#ifndef GL_EXT_index_material
#define GL_INDEX_MATERIAL_EXT 0x81B8
#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9
#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA
#endif
 
#ifndef GL_EXT_index_func
#define GL_INDEX_TEST_EXT 0x81B5
#define GL_INDEX_TEST_FUNC_EXT 0x81B6
#define GL_INDEX_TEST_REF_EXT 0x81B7
#endif
 
#ifndef GL_EXT_index_array_formats
#define GL_IUI_V2F_EXT 0x81AD
#define GL_IUI_V3F_EXT 0x81AE
#define GL_IUI_N3F_V2F_EXT 0x81AF
#define GL_IUI_N3F_V3F_EXT 0x81B0
#define GL_T2F_IUI_V2F_EXT 0x81B1
#define GL_T2F_IUI_V3F_EXT 0x81B2
#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3
#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4
#endif
 
#ifndef GL_EXT_compiled_vertex_array
#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8
#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9
#endif
 
#ifndef GL_EXT_cull_vertex
#define GL_CULL_VERTEX_EXT 0x81AA
#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB
#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC
#endif
 
#ifndef GL_SGIX_ycrcb
#define GL_YCRCB_422_SGIX 0x81BB
#define GL_YCRCB_444_SGIX 0x81BC
#endif
 
#ifndef GL_SGIX_fragment_lighting
#define GL_FRAGMENT_LIGHTING_SGIX 0x8400
#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401
#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402
#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403
#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404
#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405
#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406
#define GL_LIGHT_ENV_MODE_SGIX 0x8407
#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408
#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409
#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A
#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B
#define GL_FRAGMENT_LIGHT0_SGIX 0x840C
#define GL_FRAGMENT_LIGHT1_SGIX 0x840D
#define GL_FRAGMENT_LIGHT2_SGIX 0x840E
#define GL_FRAGMENT_LIGHT3_SGIX 0x840F
#define GL_FRAGMENT_LIGHT4_SGIX 0x8410
#define GL_FRAGMENT_LIGHT5_SGIX 0x8411
#define GL_FRAGMENT_LIGHT6_SGIX 0x8412
#define GL_FRAGMENT_LIGHT7_SGIX 0x8413
#endif
 
#ifndef GL_IBM_rasterpos_clip
#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262
#endif
 
#ifndef GL_HP_texture_lighting
#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167
#define GL_TEXTURE_POST_SPECULAR_HP 0x8168
#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169
#endif
 
#ifndef GL_EXT_draw_range_elements
#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8
#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9
#endif
 
#ifndef GL_WIN_phong_shading
#define GL_PHONG_WIN 0x80EA
#define GL_PHONG_HINT_WIN 0x80EB
#endif
 
#ifndef GL_WIN_specular_fog
#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
#endif
 
#ifndef GL_EXT_light_texture
#define GL_FRAGMENT_MATERIAL_EXT 0x8349
#define GL_FRAGMENT_NORMAL_EXT 0x834A
#define GL_FRAGMENT_COLOR_EXT 0x834C
#define GL_ATTENUATION_EXT 0x834D
#define GL_SHADOW_ATTENUATION_EXT 0x834E
#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F
#define GL_TEXTURE_LIGHT_EXT 0x8350
#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351
#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352
/* reuse GL_FRAGMENT_DEPTH_EXT */
#endif
 
#ifndef GL_SGIX_blend_alpha_minmax
#define GL_ALPHA_MIN_SGIX 0x8320
#define GL_ALPHA_MAX_SGIX 0x8321
#endif
 
#ifndef GL_SGIX_impact_pixel_texture
#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184
#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185
#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186
#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187
#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188
#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189
#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A
#endif
 
#ifndef GL_EXT_bgra
#define GL_BGR_EXT 0x80E0
#define GL_BGRA_EXT 0x80E1
#endif
 
#ifndef GL_SGIX_async
#define GL_ASYNC_MARKER_SGIX 0x8329
#endif
 
#ifndef GL_SGIX_async_pixel
#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C
#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D
#define GL_ASYNC_READ_PIXELS_SGIX 0x835E
#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F
#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360
#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361
#endif
 
#ifndef GL_SGIX_async_histogram
#define GL_ASYNC_HISTOGRAM_SGIX 0x832C
#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D
#endif
 
#ifndef GL_INTEL_texture_scissor
#endif
 
#ifndef GL_INTEL_parallel_arrays
#define GL_PARALLEL_ARRAYS_INTEL 0x83F4
#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5
#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6
#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7
#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8
#endif
 
#ifndef GL_HP_occlusion_test
#define GL_OCCLUSION_TEST_HP 0x8165
#define GL_OCCLUSION_TEST_RESULT_HP 0x8166
#endif
 
#ifndef GL_EXT_pixel_transform
#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330
#define GL_PIXEL_MAG_FILTER_EXT 0x8331
#define GL_PIXEL_MIN_FILTER_EXT 0x8332
#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333
#define GL_CUBIC_EXT 0x8334
#define GL_AVERAGE_EXT 0x8335
#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336
#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337
#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338
#endif
 
#ifndef GL_EXT_pixel_transform_color_table
#endif
 
#ifndef GL_EXT_shared_texture_palette
#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
#endif
 
#ifndef GL_EXT_separate_specular_color
#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8
#define GL_SINGLE_COLOR_EXT 0x81F9
#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA
#endif
 
#ifndef GL_EXT_secondary_color
#define GL_COLOR_SUM_EXT 0x8458
#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
#endif
 
#ifndef GL_EXT_texture_perturb_normal
#define GL_PERTURB_EXT 0x85AE
#define GL_TEXTURE_NORMAL_EXT 0x85AF
#endif
 
#ifndef GL_EXT_multi_draw_arrays
#endif
 
#ifndef GL_EXT_fog_coord
#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
#define GL_FOG_COORDINATE_EXT 0x8451
#define GL_FRAGMENT_DEPTH_EXT 0x8452
#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
#endif
 
#ifndef GL_REND_screen_coordinates
#define GL_SCREEN_COORDINATES_REND 0x8490
#define GL_INVERTED_SCREEN_W_REND 0x8491
#endif
 
#ifndef GL_EXT_coordinate_frame
#define GL_TANGENT_ARRAY_EXT 0x8439
#define GL_BINORMAL_ARRAY_EXT 0x843A
#define GL_CURRENT_TANGENT_EXT 0x843B
#define GL_CURRENT_BINORMAL_EXT 0x843C
#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E
#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F
#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440
#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441
#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442
#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443
#define GL_MAP1_TANGENT_EXT 0x8444
#define GL_MAP2_TANGENT_EXT 0x8445
#define GL_MAP1_BINORMAL_EXT 0x8446
#define GL_MAP2_BINORMAL_EXT 0x8447
#endif
 
#ifndef GL_EXT_texture_env_combine
#define GL_COMBINE_EXT 0x8570
#define GL_COMBINE_RGB_EXT 0x8571
#define GL_COMBINE_ALPHA_EXT 0x8572
#define GL_RGB_SCALE_EXT 0x8573
#define GL_ADD_SIGNED_EXT 0x8574
#define GL_INTERPOLATE_EXT 0x8575
#define GL_CONSTANT_EXT 0x8576
#define GL_PRIMARY_COLOR_EXT 0x8577
#define GL_PREVIOUS_EXT 0x8578
#define GL_SOURCE0_RGB_EXT 0x8580
#define GL_SOURCE1_RGB_EXT 0x8581
#define GL_SOURCE2_RGB_EXT 0x8582
#define GL_SOURCE0_ALPHA_EXT 0x8588
#define GL_SOURCE1_ALPHA_EXT 0x8589
#define GL_SOURCE2_ALPHA_EXT 0x858A
#define GL_OPERAND0_RGB_EXT 0x8590
#define GL_OPERAND1_RGB_EXT 0x8591
#define GL_OPERAND2_RGB_EXT 0x8592
#define GL_OPERAND0_ALPHA_EXT 0x8598
#define GL_OPERAND1_ALPHA_EXT 0x8599
#define GL_OPERAND2_ALPHA_EXT 0x859A
#endif
 
#ifndef GL_APPLE_specular_vector
#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0
#endif
 
#ifndef GL_APPLE_transform_hint
#define GL_TRANSFORM_HINT_APPLE 0x85B1
#endif
 
#ifndef GL_SGIX_fog_scale
#define GL_FOG_SCALE_SGIX 0x81FC
#define GL_FOG_SCALE_VALUE_SGIX 0x81FD
#endif
 
#ifndef GL_SUNX_constant_data
#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5
#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6
#endif
 
#ifndef GL_SUN_global_alpha
#define GL_GLOBAL_ALPHA_SUN 0x81D9
#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA
#endif
 
#ifndef GL_SUN_triangle_list
#define GL_RESTART_SUN 0x0001
#define GL_REPLACE_MIDDLE_SUN 0x0002
#define GL_REPLACE_OLDEST_SUN 0x0003
#define GL_TRIANGLE_LIST_SUN 0x81D7
#define GL_REPLACEMENT_CODE_SUN 0x81D8
#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0
#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1
#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2
#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3
#define GL_R1UI_V3F_SUN 0x85C4
#define GL_R1UI_C4UB_V3F_SUN 0x85C5
#define GL_R1UI_C3F_V3F_SUN 0x85C6
#define GL_R1UI_N3F_V3F_SUN 0x85C7
#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8
#define GL_R1UI_T2F_V3F_SUN 0x85C9
#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA
#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB
#endif
 
#ifndef GL_SUN_vertex
#endif
 
#ifndef GL_EXT_blend_func_separate
#define GL_BLEND_DST_RGB_EXT 0x80C8
#define GL_BLEND_SRC_RGB_EXT 0x80C9
#define GL_BLEND_DST_ALPHA_EXT 0x80CA
#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
#endif
 
#ifndef GL_INGR_color_clamp
#define GL_RED_MIN_CLAMP_INGR 0x8560
#define GL_GREEN_MIN_CLAMP_INGR 0x8561
#define GL_BLUE_MIN_CLAMP_INGR 0x8562
#define GL_ALPHA_MIN_CLAMP_INGR 0x8563
#define GL_RED_MAX_CLAMP_INGR 0x8564
#define GL_GREEN_MAX_CLAMP_INGR 0x8565
#define GL_BLUE_MAX_CLAMP_INGR 0x8566
#define GL_ALPHA_MAX_CLAMP_INGR 0x8567
#endif
 
#ifndef GL_INGR_interlace_read
#define GL_INTERLACE_READ_INGR 0x8568
#endif
 
#ifndef GL_EXT_stencil_wrap
#define GL_INCR_WRAP_EXT 0x8507
#define GL_DECR_WRAP_EXT 0x8508
#endif
 
#ifndef GL_EXT_422_pixels
#define GL_422_EXT 0x80CC
#define GL_422_REV_EXT 0x80CD
#define GL_422_AVERAGE_EXT 0x80CE
#define GL_422_REV_AVERAGE_EXT 0x80CF
#endif
 
#ifndef GL_NV_texgen_reflection
#define GL_NORMAL_MAP_NV 0x8511
#define GL_REFLECTION_MAP_NV 0x8512
#endif
 
#ifndef GL_EXT_texture_cube_map
#define GL_NORMAL_MAP_EXT 0x8511
#define GL_REFLECTION_MAP_EXT 0x8512
#define GL_TEXTURE_CUBE_MAP_EXT 0x8513
#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
#endif
 
#ifndef GL_SUN_convolution_border_modes
#define GL_WRAP_BORDER_SUN 0x81D4
#endif
 
#ifndef GL_EXT_texture_env_add
#endif
 
#ifndef GL_EXT_texture_lod_bias
#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
#endif
 
#ifndef GL_EXT_texture_filter_anisotropic
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
#endif
 
#ifndef GL_EXT_vertex_weighting
#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH
#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502
#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX
#define GL_MODELVIEW1_MATRIX_EXT 0x8506
#define GL_VERTEX_WEIGHTING_EXT 0x8509
#define GL_MODELVIEW0_EXT GL_MODELVIEW
#define GL_MODELVIEW1_EXT 0x850A
#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B
#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C
#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D
#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E
#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F
#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510
#endif
 
#ifndef GL_NV_light_max_exponent
#define GL_MAX_SHININESS_NV 0x8504
#define GL_MAX_SPOT_EXPONENT_NV 0x8505
#endif
 
#ifndef GL_NV_vertex_array_range
#define GL_VERTEX_ARRAY_RANGE_NV 0x851D
#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E
#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F
#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521
#endif
 
#ifndef GL_NV_register_combiners
#define GL_REGISTER_COMBINERS_NV 0x8522
#define GL_VARIABLE_A_NV 0x8523
#define GL_VARIABLE_B_NV 0x8524
#define GL_VARIABLE_C_NV 0x8525
#define GL_VARIABLE_D_NV 0x8526
#define GL_VARIABLE_E_NV 0x8527
#define GL_VARIABLE_F_NV 0x8528
#define GL_VARIABLE_G_NV 0x8529
#define GL_CONSTANT_COLOR0_NV 0x852A
#define GL_CONSTANT_COLOR1_NV 0x852B
#define GL_PRIMARY_COLOR_NV 0x852C
#define GL_SECONDARY_COLOR_NV 0x852D
#define GL_SPARE0_NV 0x852E
#define GL_SPARE1_NV 0x852F
#define GL_DISCARD_NV 0x8530
#define GL_E_TIMES_F_NV 0x8531
#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
#define GL_UNSIGNED_IDENTITY_NV 0x8536
#define GL_UNSIGNED_INVERT_NV 0x8537
#define GL_EXPAND_NORMAL_NV 0x8538
#define GL_EXPAND_NEGATE_NV 0x8539
#define GL_HALF_BIAS_NORMAL_NV 0x853A
#define GL_HALF_BIAS_NEGATE_NV 0x853B
#define GL_SIGNED_IDENTITY_NV 0x853C
#define GL_SIGNED_NEGATE_NV 0x853D
#define GL_SCALE_BY_TWO_NV 0x853E
#define GL_SCALE_BY_FOUR_NV 0x853F
#define GL_SCALE_BY_ONE_HALF_NV 0x8540
#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
#define GL_COMBINER_INPUT_NV 0x8542
#define GL_COMBINER_MAPPING_NV 0x8543
#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
#define GL_COMBINER_MUX_SUM_NV 0x8547
#define GL_COMBINER_SCALE_NV 0x8548
#define GL_COMBINER_BIAS_NV 0x8549
#define GL_COMBINER_AB_OUTPUT_NV 0x854A
#define GL_COMBINER_CD_OUTPUT_NV 0x854B
#define GL_COMBINER_SUM_OUTPUT_NV 0x854C
#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
#define GL_NUM_GENERAL_COMBINERS_NV 0x854E
#define GL_COLOR_SUM_CLAMP_NV 0x854F
#define GL_COMBINER0_NV 0x8550
#define GL_COMBINER1_NV 0x8551
#define GL_COMBINER2_NV 0x8552
#define GL_COMBINER3_NV 0x8553
#define GL_COMBINER4_NV 0x8554
#define GL_COMBINER5_NV 0x8555
#define GL_COMBINER6_NV 0x8556
#define GL_COMBINER7_NV 0x8557
/* reuse GL_TEXTURE0_ARB */
/* reuse GL_TEXTURE1_ARB */
/* reuse GL_ZERO */
/* reuse GL_NONE */
/* reuse GL_FOG */
#endif
 
#ifndef GL_NV_fog_distance
#define GL_FOG_DISTANCE_MODE_NV 0x855A
#define GL_EYE_RADIAL_NV 0x855B
#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
/* reuse GL_EYE_PLANE */
#endif
 
#ifndef GL_NV_texgen_emboss
#define GL_EMBOSS_LIGHT_NV 0x855D
#define GL_EMBOSS_CONSTANT_NV 0x855E
#define GL_EMBOSS_MAP_NV 0x855F
#endif
 
#ifndef GL_NV_blend_square
#endif
 
#ifndef GL_NV_texture_env_combine4
#define GL_COMBINE4_NV 0x8503
#define GL_SOURCE3_RGB_NV 0x8583
#define GL_SOURCE3_ALPHA_NV 0x858B
#define GL_OPERAND3_RGB_NV 0x8593
#define GL_OPERAND3_ALPHA_NV 0x859B
#endif
 
#ifndef GL_MESA_resize_buffers
#endif
 
#ifndef GL_MESA_window_pos
#endif
 
#ifndef GL_EXT_texture_compression_s3tc
#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
#endif
 
#ifndef GL_IBM_cull_vertex
#define GL_CULL_VERTEX_IBM 103050
#endif
 
#ifndef GL_IBM_multimode_draw_arrays
#endif
 
#ifndef GL_IBM_vertex_array_lists
#define GL_VERTEX_ARRAY_LIST_IBM 103070
#define GL_NORMAL_ARRAY_LIST_IBM 103071
#define GL_COLOR_ARRAY_LIST_IBM 103072
#define GL_INDEX_ARRAY_LIST_IBM 103073
#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074
#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075
#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076
#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077
#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080
#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081
#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082
#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083
#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084
#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085
#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086
#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087
#endif
 
#ifndef GL_SGIX_subsample
#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0
#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1
#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2
#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3
#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4
#endif
 
#ifndef GL_SGIX_ycrcb_subsample
#endif
 
#ifndef GL_SGIX_ycrcba
#define GL_YCRCB_SGIX 0x8318
#define GL_YCRCBA_SGIX 0x8319
#endif
 
#ifndef GL_SGI_depth_pass_instrument
#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310
#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311
#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312
#endif
 
#ifndef GL_3DFX_texture_compression_FXT1
#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1
#endif
 
#ifndef GL_3DFX_multisample
#define GL_MULTISAMPLE_3DFX 0x86B2
#define GL_SAMPLE_BUFFERS_3DFX 0x86B3
#define GL_SAMPLES_3DFX 0x86B4
#define GL_MULTISAMPLE_BIT_3DFX 0x20000000
#endif
 
#ifndef GL_3DFX_tbuffer
#endif
 
#ifndef GL_EXT_multisample
#define GL_MULTISAMPLE_EXT 0x809D
#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E
#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
#define GL_SAMPLE_MASK_EXT 0x80A0
#define GL_1PASS_EXT 0x80A1
#define GL_2PASS_0_EXT 0x80A2
#define GL_2PASS_1_EXT 0x80A3
#define GL_4PASS_0_EXT 0x80A4
#define GL_4PASS_1_EXT 0x80A5
#define GL_4PASS_2_EXT 0x80A6
#define GL_4PASS_3_EXT 0x80A7
#define GL_SAMPLE_BUFFERS_EXT 0x80A8
#define GL_SAMPLES_EXT 0x80A9
#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA
#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB
#define GL_SAMPLE_PATTERN_EXT 0x80AC
#define GL_MULTISAMPLE_BIT_EXT 0x20000000
#endif
 
#ifndef GL_SGIX_vertex_preclip
#define GL_VERTEX_PRECLIP_SGIX 0x83EE
#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
#endif
 
#ifndef GL_SGIX_convolution_accuracy
#define GL_CONVOLUTION_HINT_SGIX 0x8316
#endif
 
#ifndef GL_SGIX_resample
#define GL_PACK_RESAMPLE_SGIX 0x842C
#define GL_UNPACK_RESAMPLE_SGIX 0x842D
#define GL_RESAMPLE_REPLICATE_SGIX 0x842E
#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F
#define GL_RESAMPLE_DECIMATE_SGIX 0x8430
#endif
 
#ifndef GL_SGIS_point_line_texgen
#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0
#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1
#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2
#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3
#define GL_EYE_POINT_SGIS 0x81F4
#define GL_OBJECT_POINT_SGIS 0x81F5
#define GL_EYE_LINE_SGIS 0x81F6
#define GL_OBJECT_LINE_SGIS 0x81F7
#endif
 
#ifndef GL_SGIS_texture_color_mask
#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF
#endif
 
#ifndef GL_EXT_texture_env_dot3
#define GL_DOT3_RGB_EXT 0x8740
#define GL_DOT3_RGBA_EXT 0x8741
#endif
 
#ifndef GL_ATI_texture_mirror_once
#define GL_MIRROR_CLAMP_ATI 0x8742
#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
#endif
 
#ifndef GL_NV_fence
#define GL_ALL_COMPLETED_NV 0x84F2
#define GL_FENCE_STATUS_NV 0x84F3
#define GL_FENCE_CONDITION_NV 0x84F4
#endif
 
#ifndef GL_IBM_texture_mirrored_repeat
#define GL_MIRRORED_REPEAT_IBM 0x8370
#endif
 
#ifndef GL_NV_evaluators
#define GL_EVAL_2D_NV 0x86C0
#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1
#define GL_MAP_TESSELLATION_NV 0x86C2
#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3
#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4
#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5
#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6
#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7
#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8
#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9
#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA
#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB
#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC
#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD
#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE
#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF
#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0
#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1
#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2
#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3
#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4
#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5
#define GL_MAX_MAP_TESSELLATION_NV 0x86D6
#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7
#endif
 
#ifndef GL_NV_packed_depth_stencil
#define GL_DEPTH_STENCIL_NV 0x84F9
#define GL_UNSIGNED_INT_24_8_NV 0x84FA
#endif
 
#ifndef GL_NV_register_combiners2
#define GL_PER_STAGE_CONSTANTS_NV 0x8535
#endif
 
#ifndef GL_NV_texture_compression_vtc
#endif
 
#ifndef GL_NV_texture_rectangle
#define GL_TEXTURE_RECTANGLE_NV 0x84F5
#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6
#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
#endif
 
#ifndef GL_NV_texture_shader
#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
#define GL_SHADER_CONSISTENT_NV 0x86DD
#define GL_TEXTURE_SHADER_NV 0x86DE
#define GL_SHADER_OPERATION_NV 0x86DF
#define GL_CULL_MODES_NV 0x86E0
#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV
#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV
#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV
#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
#define GL_CONST_EYE_NV 0x86E5
#define GL_PASS_THROUGH_NV 0x86E6
#define GL_CULL_FRAGMENT_NV 0x86E7
#define GL_OFFSET_TEXTURE_2D_NV 0x86E8
#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
#define GL_DOT_PRODUCT_NV 0x86EC
#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
#define GL_HILO_NV 0x86F4
#define GL_DSDT_NV 0x86F5
#define GL_DSDT_MAG_NV 0x86F6
#define GL_DSDT_MAG_VIB_NV 0x86F7
#define GL_HILO16_NV 0x86F8
#define GL_SIGNED_HILO_NV 0x86F9
#define GL_SIGNED_HILO16_NV 0x86FA
#define GL_SIGNED_RGBA_NV 0x86FB
#define GL_SIGNED_RGBA8_NV 0x86FC
#define GL_SIGNED_RGB_NV 0x86FE
#define GL_SIGNED_RGB8_NV 0x86FF
#define GL_SIGNED_LUMINANCE_NV 0x8701
#define GL_SIGNED_LUMINANCE8_NV 0x8702
#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
#define GL_SIGNED_ALPHA_NV 0x8705
#define GL_SIGNED_ALPHA8_NV 0x8706
#define GL_SIGNED_INTENSITY_NV 0x8707
#define GL_SIGNED_INTENSITY8_NV 0x8708
#define GL_DSDT8_NV 0x8709
#define GL_DSDT8_MAG8_NV 0x870A
#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
#define GL_HI_SCALE_NV 0x870E
#define GL_LO_SCALE_NV 0x870F
#define GL_DS_SCALE_NV 0x8710
#define GL_DT_SCALE_NV 0x8711
#define GL_MAGNITUDE_SCALE_NV 0x8712
#define GL_VIBRANCE_SCALE_NV 0x8713
#define GL_HI_BIAS_NV 0x8714
#define GL_LO_BIAS_NV 0x8715
#define GL_DS_BIAS_NV 0x8716
#define GL_DT_BIAS_NV 0x8717
#define GL_MAGNITUDE_BIAS_NV 0x8718
#define GL_VIBRANCE_BIAS_NV 0x8719
#define GL_TEXTURE_BORDER_VALUES_NV 0x871A
#define GL_TEXTURE_HI_SIZE_NV 0x871B
#define GL_TEXTURE_LO_SIZE_NV 0x871C
#define GL_TEXTURE_DS_SIZE_NV 0x871D
#define GL_TEXTURE_DT_SIZE_NV 0x871E
#define GL_TEXTURE_MAG_SIZE_NV 0x871F
#endif
 
#ifndef GL_NV_texture_shader2
#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
#endif
 
#ifndef GL_NV_vertex_array_range2
#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533
#endif
 
#ifndef GL_NV_vertex_program
#define GL_VERTEX_PROGRAM_NV 0x8620
#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
#define GL_CURRENT_ATTRIB_NV 0x8626
#define GL_PROGRAM_LENGTH_NV 0x8627
#define GL_PROGRAM_STRING_NV 0x8628
#define GL_MODELVIEW_PROJECTION_NV 0x8629
#define GL_IDENTITY_NV 0x862A
#define GL_INVERSE_NV 0x862B
#define GL_TRANSPOSE_NV 0x862C
#define GL_INVERSE_TRANSPOSE_NV 0x862D
#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
#define GL_MAX_TRACK_MATRICES_NV 0x862F
#define GL_MATRIX0_NV 0x8630
#define GL_MATRIX1_NV 0x8631
#define GL_MATRIX2_NV 0x8632
#define GL_MATRIX3_NV 0x8633
#define GL_MATRIX4_NV 0x8634
#define GL_MATRIX5_NV 0x8635
#define GL_MATRIX6_NV 0x8636
#define GL_MATRIX7_NV 0x8637
#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
#define GL_CURRENT_MATRIX_NV 0x8641
#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
#define GL_PROGRAM_PARAMETER_NV 0x8644
#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
#define GL_PROGRAM_TARGET_NV 0x8646
#define GL_PROGRAM_RESIDENT_NV 0x8647
#define GL_TRACK_MATRIX_NV 0x8648
#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
#endif
 
#ifndef GL_SGIX_texture_coordinate_clamp
#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369
#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A
#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B
#endif
 
#ifndef GL_SGIX_scalebias_hint
#define GL_SCALEBIAS_HINT_SGIX 0x8322
#endif
 
#ifndef GL_OML_interlace
#define GL_INTERLACE_OML 0x8980
#define GL_INTERLACE_READ_OML 0x8981
#endif
 
#ifndef GL_OML_subsample
#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982
#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983
#endif
 
#ifndef GL_OML_resample
#define GL_PACK_RESAMPLE_OML 0x8984
#define GL_UNPACK_RESAMPLE_OML 0x8985
#define GL_RESAMPLE_REPLICATE_OML 0x8986
#define GL_RESAMPLE_ZERO_FILL_OML 0x8987
#define GL_RESAMPLE_AVERAGE_OML 0x8988
#define GL_RESAMPLE_DECIMATE_OML 0x8989
#endif
 
#ifndef GL_NV_copy_depth_to_color
#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E
#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F
#endif
 
#ifndef GL_ATI_envmap_bumpmap
#define GL_BUMP_ROT_MATRIX_ATI 0x8775
#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776
#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777
#define GL_BUMP_TEX_UNITS_ATI 0x8778
#define GL_DUDV_ATI 0x8779
#define GL_DU8DV8_ATI 0x877A
#define GL_BUMP_ENVMAP_ATI 0x877B
#define GL_BUMP_TARGET_ATI 0x877C
#endif
 
#ifndef GL_ATI_fragment_shader
#define GL_FRAGMENT_SHADER_ATI 0x8920
#define GL_REG_0_ATI 0x8921
#define GL_REG_1_ATI 0x8922
#define GL_REG_2_ATI 0x8923
#define GL_REG_3_ATI 0x8924
#define GL_REG_4_ATI 0x8925
#define GL_REG_5_ATI 0x8926
#define GL_REG_6_ATI 0x8927
#define GL_REG_7_ATI 0x8928
#define GL_REG_8_ATI 0x8929
#define GL_REG_9_ATI 0x892A
#define GL_REG_10_ATI 0x892B
#define GL_REG_11_ATI 0x892C
#define GL_REG_12_ATI 0x892D
#define GL_REG_13_ATI 0x892E
#define GL_REG_14_ATI 0x892F
#define GL_REG_15_ATI 0x8930
#define GL_REG_16_ATI 0x8931
#define GL_REG_17_ATI 0x8932
#define GL_REG_18_ATI 0x8933
#define GL_REG_19_ATI 0x8934
#define GL_REG_20_ATI 0x8935
#define GL_REG_21_ATI 0x8936
#define GL_REG_22_ATI 0x8937
#define GL_REG_23_ATI 0x8938
#define GL_REG_24_ATI 0x8939
#define GL_REG_25_ATI 0x893A
#define GL_REG_26_ATI 0x893B
#define GL_REG_27_ATI 0x893C
#define GL_REG_28_ATI 0x893D
#define GL_REG_29_ATI 0x893E
#define GL_REG_30_ATI 0x893F
#define GL_REG_31_ATI 0x8940
#define GL_CON_0_ATI 0x8941
#define GL_CON_1_ATI 0x8942
#define GL_CON_2_ATI 0x8943
#define GL_CON_3_ATI 0x8944
#define GL_CON_4_ATI 0x8945
#define GL_CON_5_ATI 0x8946
#define GL_CON_6_ATI 0x8947
#define GL_CON_7_ATI 0x8948
#define GL_CON_8_ATI 0x8949
#define GL_CON_9_ATI 0x894A
#define GL_CON_10_ATI 0x894B
#define GL_CON_11_ATI 0x894C
#define GL_CON_12_ATI 0x894D
#define GL_CON_13_ATI 0x894E
#define GL_CON_14_ATI 0x894F
#define GL_CON_15_ATI 0x8950
#define GL_CON_16_ATI 0x8951
#define GL_CON_17_ATI 0x8952
#define GL_CON_18_ATI 0x8953
#define GL_CON_19_ATI 0x8954
#define GL_CON_20_ATI 0x8955
#define GL_CON_21_ATI 0x8956
#define GL_CON_22_ATI 0x8957
#define GL_CON_23_ATI 0x8958
#define GL_CON_24_ATI 0x8959
#define GL_CON_25_ATI 0x895A
#define GL_CON_26_ATI 0x895B
#define GL_CON_27_ATI 0x895C
#define GL_CON_28_ATI 0x895D
#define GL_CON_29_ATI 0x895E
#define GL_CON_30_ATI 0x895F
#define GL_CON_31_ATI 0x8960
#define GL_MOV_ATI 0x8961
#define GL_ADD_ATI 0x8963
#define GL_MUL_ATI 0x8964
#define GL_SUB_ATI 0x8965
#define GL_DOT3_ATI 0x8966
#define GL_DOT4_ATI 0x8967
#define GL_MAD_ATI 0x8968
#define GL_LERP_ATI 0x8969
#define GL_CND_ATI 0x896A
#define GL_CND0_ATI 0x896B
#define GL_DOT2_ADD_ATI 0x896C
#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E
#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F
#define GL_NUM_PASSES_ATI 0x8970
#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971
#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972
#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973
#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974
#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975
#define GL_SWIZZLE_STR_ATI 0x8976
#define GL_SWIZZLE_STQ_ATI 0x8977
#define GL_SWIZZLE_STR_DR_ATI 0x8978
#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
#define GL_SWIZZLE_STRQ_ATI 0x897A
#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B
#define GL_RED_BIT_ATI 0x00000001
#define GL_GREEN_BIT_ATI 0x00000002
#define GL_BLUE_BIT_ATI 0x00000004
#define GL_2X_BIT_ATI 0x00000001
#define GL_4X_BIT_ATI 0x00000002
#define GL_8X_BIT_ATI 0x00000004
#define GL_HALF_BIT_ATI 0x00000008
#define GL_QUARTER_BIT_ATI 0x00000010
#define GL_EIGHTH_BIT_ATI 0x00000020
#define GL_SATURATE_BIT_ATI 0x00000040
#define GL_COMP_BIT_ATI 0x00000002
#define GL_NEGATE_BIT_ATI 0x00000004
#define GL_BIAS_BIT_ATI 0x00000008
#endif
 
#ifndef GL_ATI_pn_triangles
#define GL_PN_TRIANGLES_ATI 0x87F0
#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2
#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3
#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4
#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5
#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6
#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7
#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
#endif
 
#ifndef GL_ATI_vertex_array_object
#define GL_STATIC_ATI 0x8760
#define GL_DYNAMIC_ATI 0x8761
#define GL_PRESERVE_ATI 0x8762
#define GL_DISCARD_ATI 0x8763
#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764
#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765
#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766
#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767
#endif
 
#ifndef GL_EXT_vertex_shader
#define GL_VERTEX_SHADER_EXT 0x8780
#define GL_VERTEX_SHADER_BINDING_EXT 0x8781
#define GL_OP_INDEX_EXT 0x8782
#define GL_OP_NEGATE_EXT 0x8783
#define GL_OP_DOT3_EXT 0x8784
#define GL_OP_DOT4_EXT 0x8785
#define GL_OP_MUL_EXT 0x8786
#define GL_OP_ADD_EXT 0x8787
#define GL_OP_MADD_EXT 0x8788
#define GL_OP_FRAC_EXT 0x8789
#define GL_OP_MAX_EXT 0x878A
#define GL_OP_MIN_EXT 0x878B
#define GL_OP_SET_GE_EXT 0x878C
#define GL_OP_SET_LT_EXT 0x878D
#define GL_OP_CLAMP_EXT 0x878E
#define GL_OP_FLOOR_EXT 0x878F
#define GL_OP_ROUND_EXT 0x8790
#define GL_OP_EXP_BASE_2_EXT 0x8791
#define GL_OP_LOG_BASE_2_EXT 0x8792
#define GL_OP_POWER_EXT 0x8793
#define GL_OP_RECIP_EXT 0x8794
#define GL_OP_RECIP_SQRT_EXT 0x8795
#define GL_OP_SUB_EXT 0x8796
#define GL_OP_CROSS_PRODUCT_EXT 0x8797
#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798
#define GL_OP_MOV_EXT 0x8799
#define GL_OUTPUT_VERTEX_EXT 0x879A
#define GL_OUTPUT_COLOR0_EXT 0x879B
#define GL_OUTPUT_COLOR1_EXT 0x879C
#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D
#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E
#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F
#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0
#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1
#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2
#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3
#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4
#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5
#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6
#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7
#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8
#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9
#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA
#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB
#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC
#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD
#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE
#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF
#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0
#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1
#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2
#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3
#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4
#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5
#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6
#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7
#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8
#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9
#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA
#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB
#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC
#define GL_OUTPUT_FOG_EXT 0x87BD
#define GL_SCALAR_EXT 0x87BE
#define GL_VECTOR_EXT 0x87BF
#define GL_MATRIX_EXT 0x87C0
#define GL_VARIANT_EXT 0x87C1
#define GL_INVARIANT_EXT 0x87C2
#define GL_LOCAL_CONSTANT_EXT 0x87C3
#define GL_LOCAL_EXT 0x87C4
#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5
#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6
#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7
#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8
#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9
#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA
#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB
#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC
#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INARIANTS_EXT 0x87CD
#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE
#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF
#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0
#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1
#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2
#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3
#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4
#define GL_X_EXT 0x87D5
#define GL_Y_EXT 0x87D6
#define GL_Z_EXT 0x87D7
#define GL_W_EXT 0x87D8
#define GL_NEGATIVE_X_EXT 0x87D9
#define GL_NEGATIVE_Y_EXT 0x87DA
#define GL_NEGATIVE_Z_EXT 0x87DB
#define GL_NEGATIVE_W_EXT 0x87DC
#define GL_ZERO_EXT 0x87DD
#define GL_ONE_EXT 0x87DE
#define GL_NEGATIVE_ONE_EXT 0x87DF
#define GL_NORMALIZED_RANGE_EXT 0x87E0
#define GL_FULL_RANGE_EXT 0x87E1
#define GL_CURRENT_VERTEX_EXT 0x87E2
#define GL_MVP_MATRIX_EXT 0x87E3
#define GL_VARIANT_VALUE_EXT 0x87E4
#define GL_VARIANT_DATATYPE_EXT 0x87E5
#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6
#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7
#define GL_VARIANT_ARRAY_EXT 0x87E8
#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9
#define GL_INVARIANT_VALUE_EXT 0x87EA
#define GL_INVARIANT_DATATYPE_EXT 0x87EB
#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC
#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED
#endif
 
#ifndef GL_ATI_vertex_streams
#define GL_MAX_VERTEX_STREAMS_ATI 0x876B
#define GL_VERTEX_STREAM0_ATI 0x876C
#define GL_VERTEX_STREAM1_ATI 0x876D
#define GL_VERTEX_STREAM2_ATI 0x876E
#define GL_VERTEX_STREAM3_ATI 0x876F
#define GL_VERTEX_STREAM4_ATI 0x8770
#define GL_VERTEX_STREAM5_ATI 0x8771
#define GL_VERTEX_STREAM6_ATI 0x8772
#define GL_VERTEX_STREAM7_ATI 0x8773
#define GL_VERTEX_SOURCE_ATI 0x8774
#endif
 
#ifndef GL_ATI_element_array
#define GL_ELEMENT_ARRAY_ATI 0x8768
#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769
#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A
#endif
 
#ifndef GL_SUN_mesh_array
#define GL_QUAD_MESH_SUN 0x8614
#define GL_TRIANGLE_MESH_SUN 0x8615
#endif
 
#ifndef GL_SUN_slice_accum
#define GL_SLICE_ACCUM_SUN 0x85CC
#endif
 
#ifndef GL_NV_multisample_filter_hint
#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534
#endif
 
#ifndef GL_NV_depth_clamp
#define GL_DEPTH_CLAMP_NV 0x864F
#endif
 
#ifndef GL_NV_occlusion_query
#define GL_PIXEL_COUNTER_BITS_NV 0x8864
#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
#define GL_PIXEL_COUNT_NV 0x8866
#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
#endif
 
#ifndef GL_NV_point_sprite
#define GL_POINT_SPRITE_NV 0x8861
#define GL_COORD_REPLACE_NV 0x8862
#define GL_POINT_SPRITE_R_MODE_NV 0x8863
#endif
 
#ifndef GL_NV_texture_shader3
#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
#define GL_HILO8_NV 0x885E
#define GL_SIGNED_HILO8_NV 0x885F
#define GL_FORCE_BLUE_TO_ONE_NV 0x8860
#endif
 
#ifndef GL_NV_vertex_program1_1
#endif
 
#ifndef GL_EXT_shadow_funcs
#endif
 
#ifndef GL_EXT_stencil_two_side
#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
#endif
 
 
/*************************************************************/
 
#ifndef GL_VERSION_1_2
#define GL_VERSION_1_2 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf);
GLAPI void APIENTRY glBlendEquation (GLenum);
GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *);
GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei);
GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei);
GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint);
GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei);
GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei);
GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *);
GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *);
GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean);
GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean);
GLAPI void APIENTRY glResetHistogram (GLenum);
GLAPI void APIENTRY glResetMinmax (GLenum);
GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);
typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);
typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
#endif
 
#ifndef GL_VERSION_1_3
#define GL_VERSION_1_3 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glActiveTexture (GLenum);
GLAPI void APIENTRY glClientActiveTexture (GLenum);
GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble);
GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat);
GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint);
GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort);
GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *);
GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *);
GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *);
GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *);
GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *);
GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean);
GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, void *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m);
typedef void (APIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
#endif
 
#ifndef GL_VERSION_1_4
#define GL_VERSION_1_4 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum);
GLAPI void APIENTRY glFogCoordf (GLfloat);
GLAPI void APIENTRY glFogCoordfv (const GLfloat *);
GLAPI void APIENTRY glFogCoordd (GLdouble);
GLAPI void APIENTRY glFogCoorddv (const GLdouble *);
GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei);
GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei);
GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat);
GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *);
GLAPI void APIENTRY glPointParameteri (GLenum, GLint);
GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *);
GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte);
GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *);
GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *);
GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *);
GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint);
GLAPI void APIENTRY glSecondaryColor3iv (const GLint *);
GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *);
GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte);
GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *);
GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint);
GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *);
GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort);
GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *);
GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos2dv (const GLdouble *);
GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos2fv (const GLfloat *);
GLAPI void APIENTRY glWindowPos2i (GLint, GLint);
GLAPI void APIENTRY glWindowPos2iv (const GLint *);
GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort);
GLAPI void APIENTRY glWindowPos2sv (const GLshort *);
GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos3dv (const GLdouble *);
GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos3fv (const GLfloat *);
GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint);
GLAPI void APIENTRY glWindowPos3iv (const GLint *);
GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glWindowPos3sv (const GLshort *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
typedef void (APIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);
typedef void (APIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
typedef void (APIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);
typedef void (APIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);
typedef void (APIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);
typedef void (APIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);
typedef void (APIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *v);
#endif
 
#ifndef GL_ARB_multitexture
#define GL_ARB_multitexture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glActiveTextureARB (GLenum);
GLAPI void APIENTRY glClientActiveTextureARB (GLenum);
GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble);
GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat);
GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint);
GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort);
GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *);
GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *);
GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *);
GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint);
GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *);
GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
#endif
 
#ifndef GL_ARB_transpose_matrix
#define GL_ARB_transpose_matrix 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *);
GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *);
GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *);
GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);
typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);
#endif
 
#ifndef GL_ARB_multisample
#define GL_ARB_multisample 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
#endif
 
#ifndef GL_ARB_texture_env_add
#define GL_ARB_texture_env_add 1
#endif
 
#ifndef GL_ARB_texture_cube_map
#define GL_ARB_texture_cube_map 1
#endif
 
#ifndef GL_ARB_texture_compression
#define GL_ARB_texture_compression 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, void *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img);
#endif
 
#ifndef GL_ARB_texture_border_clamp
#define GL_ARB_texture_border_clamp 1
#endif
 
#ifndef GL_ARB_point_parameters
#define GL_ARB_point_parameters 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat);
GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);
#endif
 
#ifndef GL_ARB_vertex_blend
#define GL_ARB_vertex_blend 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *);
GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *);
GLAPI void APIENTRY glWeightivARB (GLint, const GLint *);
GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *);
GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *);
GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *);
GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *);
GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *);
GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glVertexBlendARB (GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights);
typedef void (APIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights);
typedef void (APIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights);
typedef void (APIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights);
typedef void (APIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights);
typedef void (APIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights);
typedef void (APIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights);
typedef void (APIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights);
typedef void (APIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count);
#endif
 
#ifndef GL_ARB_matrix_palette
#define GL_ARB_matrix_palette 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint);
GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *);
GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *);
GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *);
GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);
typedef void (APIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices);
typedef void (APIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices);
typedef void (APIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices);
typedef void (APIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
#endif
 
#ifndef GL_ARB_texture_env_combine
#define GL_ARB_texture_env_combine 1
#endif
 
#ifndef GL_ARB_texture_env_crossbar
#define GL_ARB_texture_env_crossbar 1
#endif
 
#ifndef GL_ARB_texture_env_dot3
#define GL_ARB_texture_env_dot3 1
#endif
 
#ifndef GL_ARB_texture_mirror_repeat
#define GL_ARB_texture_mirror_repeat 1
#endif
 
#ifndef GL_ARB_depth_texture
#define GL_ARB_depth_texture 1
#endif
 
#ifndef GL_ARB_shadow
#define GL_ARB_shadow 1
#endif
 
#ifndef GL_ARB_shadow_ambient
#define GL_ARB_shadow_ambient 1
#endif
 
#ifndef GL_ARB_window_pos
#define GL_ARB_window_pos 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *);
GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *);
GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint);
GLAPI void APIENTRY glWindowPos2ivARB (const GLint *);
GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort);
GLAPI void APIENTRY glWindowPos2svARB (const GLshort *);
GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *);
GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *);
GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint);
GLAPI void APIENTRY glWindowPos3ivARB (const GLint *);
GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glWindowPos3svARB (const GLshort *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);
typedef void (APIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);
typedef void (APIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v);
#endif
 
#ifndef GL_ARB_vertex_program
#define GL_ARB_vertex_program 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble);
GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat);
GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort);
GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *);
GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *);
GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte);
GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *);
GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *);
GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *);
GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *);
GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *);
GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *);
GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *);
GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *);
GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *);
GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint);
GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint);
GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint);
GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *);
GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *);
GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *);
GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *);
GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *);
GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *);
GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *);
GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *);
GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *);
GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *);
GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *);
GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *);
GLAPI GLboolean APIENTRY glIsProgramARB (GLuint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
typedef void (APIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
typedef void (APIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string);
typedef void (APIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);
typedef void (APIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);
typedef void (APIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);
typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
typedef void (APIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
typedef void (APIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
typedef void (APIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
typedef GLboolean (APIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program);
#endif
 
#ifndef GL_EXT_abgr
#define GL_EXT_abgr 1
#endif
 
#ifndef GL_EXT_blend_color
#define GL_EXT_blend_color 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
#endif
 
#ifndef GL_EXT_polygon_offset
#define GL_EXT_polygon_offset 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);
#endif
 
#ifndef GL_EXT_texture
#define GL_EXT_texture 1
#endif
 
#ifndef GL_EXT_texture3D
#define GL_EXT_texture3D 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
#endif
 
#ifndef GL_SGIS_texture_filter4
#define GL_SGIS_texture_filter4 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights);
typedef void (APIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights);
#endif
 
#ifndef GL_EXT_subtexture
#define GL_EXT_subtexture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
#endif
 
#ifndef GL_EXT_copy_texture
#define GL_EXT_copy_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei);
GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
#endif
 
#ifndef GL_EXT_histogram
#define GL_EXT_histogram 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean);
GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean);
GLAPI void APIENTRY glResetHistogramEXT (GLenum);
GLAPI void APIENTRY glResetMinmaxEXT (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);
typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);
typedef void (APIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target);
#endif
 
#ifndef GL_EXT_convolution
#define GL_EXT_convolution 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint);
GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei);
GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei);
GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *);
GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params);
typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
#endif
 
#ifndef GL_EXT_color_matrix
#define GL_EXT_color_matrix 1
#endif
 
#ifndef GL_SGI_color_table
#define GL_SGI_color_table 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei);
GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params);
#endif
 
#ifndef GL_SGIX_pixel_texture
#define GL_SGIX_pixel_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPixelTexGenSGIX (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);
#endif
 
#ifndef GL_SGIS_pixel_texture
#define GL_SGIS_pixel_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint);
GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *);
GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat);
GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *);
GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *);
GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params);
#endif
 
#ifndef GL_SGIS_texture4D
#define GL_SGIS_texture4D 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
typedef void (APIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels);
#endif
 
#ifndef GL_SGI_texture_color_table
#define GL_SGI_texture_color_table 1
#endif
 
#ifndef GL_EXT_cmyka
#define GL_EXT_cmyka 1
#endif
 
#ifndef GL_EXT_texture_object
#define GL_EXT_texture_object 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *);
GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint);
GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *);
GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *);
GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint);
GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef GLboolean (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences);
typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);
typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures);
typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures);
typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture);
typedef void (APIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities);
#endif
 
#ifndef GL_SGIS_detail_texture
#define GL_SGIS_detail_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *);
GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);
typedef void (APIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points);
#endif
 
#ifndef GL_SGIS_sharpen_texture
#define GL_SGIS_sharpen_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *);
GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);
typedef void (APIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points);
#endif
 
#ifndef GL_EXT_packed_pixels
#define GL_EXT_packed_pixels 1
#endif
 
#ifndef GL_SGIS_texture_lod
#define GL_SGIS_texture_lod 1
#endif
 
#ifndef GL_SGIS_multisample
#define GL_SGIS_multisample 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean);
GLAPI void APIENTRY glSamplePatternSGIS (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);
typedef void (APIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);
#endif
 
#ifndef GL_EXT_rescale_normal
#define GL_EXT_rescale_normal 1
#endif
 
#ifndef GL_EXT_vertex_array
#define GL_EXT_vertex_array 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glArrayElementEXT (GLint);
GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei);
GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *);
GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *);
GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *);
GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *);
GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);
typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params);
typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
#endif
 
#ifndef GL_EXT_misc_attribute
#define GL_EXT_misc_attribute 1
#endif
 
#ifndef GL_SGIS_generate_mipmap
#define GL_SGIS_generate_mipmap 1
#endif
 
#ifndef GL_SGIX_clipmap
#define GL_SGIX_clipmap 1
#endif
 
#ifndef GL_SGIX_shadow
#define GL_SGIX_shadow 1
#endif
 
#ifndef GL_SGIS_texture_edge_clamp
#define GL_SGIS_texture_edge_clamp 1
#endif
 
#ifndef GL_SGIS_texture_border_clamp
#define GL_SGIS_texture_border_clamp 1
#endif
 
#ifndef GL_EXT_blend_minmax
#define GL_EXT_blend_minmax 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendEquationEXT (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
#endif
 
#ifndef GL_EXT_blend_subtract
#define GL_EXT_blend_subtract 1
#endif
 
#ifndef GL_EXT_blend_logic_op
#define GL_EXT_blend_logic_op 1
#endif
 
#ifndef GL_SGIX_interlace
#define GL_SGIX_interlace 1
#endif
 
#ifndef GL_SGIX_pixel_tiles
#define GL_SGIX_pixel_tiles 1
#endif
 
#ifndef GL_SGIX_texture_select
#define GL_SGIX_texture_select 1
#endif
 
#ifndef GL_SGIX_sprite
#define GL_SGIX_sprite 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat);
GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *);
GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint);
GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params);
#endif
 
#ifndef GL_SGIX_texture_multi_buffer
#define GL_SGIX_texture_multi_buffer 1
#endif
 
#ifndef GL_EXT_point_parameters
#define GL_EXT_point_parameters 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat);
GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
#endif
 
#ifndef GL_SGIS_point_parameters
#define GL_SGIS_point_parameters 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat);
GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);
#endif
 
#ifndef GL_SGIX_instruments
#define GL_SGIX_instruments 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI GLint APIENTRY glGetInstrumentsSGIX (void);
GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *);
GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *);
GLAPI void APIENTRY glReadInstrumentsSGIX (GLint);
GLAPI void APIENTRY glStartInstrumentsSGIX (void);
GLAPI void APIENTRY glStopInstrumentsSGIX (GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef GLint (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void);
typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer);
typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p);
typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker);
typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void);
typedef void (APIENTRY * PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker);
#endif
 
#ifndef GL_SGIX_texture_scale_bias
#define GL_SGIX_texture_scale_bias 1
#endif
 
#ifndef GL_SGIX_framezoom
#define GL_SGIX_framezoom 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFrameZoomSGIX (GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor);
#endif
 
#ifndef GL_SGIX_tag_sample_buffer
#define GL_SGIX_tag_sample_buffer 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTagSampleBufferSGIX (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);
#endif
 
#ifndef GL_SGIX_polynomial_ffd
#define GL_SGIX_polynomial_ffd 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *);
GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *);
GLAPI void APIENTRY glDeformSGIX (GLbitfield);
GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points);
typedef void (APIENTRY * PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points);
typedef void (APIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask);
typedef void (APIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask);
#endif
 
#ifndef GL_SGIX_reference_plane
#define GL_SGIX_reference_plane 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation);
#endif
 
#ifndef GL_SGIX_flush_raster
#define GL_SGIX_flush_raster 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFlushRasterSGIX (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void);
#endif
 
#ifndef GL_SGIX_depth_texture
#define GL_SGIX_depth_texture 1
#endif
 
#ifndef GL_SGIS_fog_function
#define GL_SGIS_fog_function 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *);
GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points);
typedef void (APIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat *points);
#endif
 
#ifndef GL_SGIX_fog_offset
#define GL_SGIX_fog_offset 1
#endif
 
#ifndef GL_HP_image_transform
#define GL_HP_image_transform 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint);
GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params);
#endif
 
#ifndef GL_HP_convolution_border_modes
#define GL_HP_convolution_border_modes 1
#endif
 
#ifndef GL_SGIX_texture_add_env
#define GL_SGIX_texture_add_env 1
#endif
 
#ifndef GL_EXT_color_subtable
#define GL_EXT_color_subtable 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
#endif
 
#ifndef GL_PGI_vertex_hints
#define GL_PGI_vertex_hints 1
#endif
 
#ifndef GL_PGI_misc_hints
#define GL_PGI_misc_hints 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glHintPGI (GLenum, GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLHINTPGIPROC) (GLenum target, GLint mode);
#endif
 
#ifndef GL_EXT_paletted_texture
#define GL_EXT_paletted_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *);
GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
#endif
 
#ifndef GL_EXT_clip_volume_hint
#define GL_EXT_clip_volume_hint 1
#endif
 
#ifndef GL_SGIX_list_priority
#define GL_SGIX_list_priority 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat);
GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *);
GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint);
GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params);
#endif
 
#ifndef GL_SGIX_ir_instrument1
#define GL_SGIX_ir_instrument1 1
#endif
 
#ifndef GL_SGIX_calligraphic_fragment
#define GL_SGIX_calligraphic_fragment 1
#endif
 
#ifndef GL_SGIX_texture_lod_bias
#define GL_SGIX_texture_lod_bias 1
#endif
 
#ifndef GL_SGIX_shadow_ambient
#define GL_SGIX_shadow_ambient 1
#endif
 
#ifndef GL_EXT_index_texture
#define GL_EXT_index_texture 1
#endif
 
#ifndef GL_EXT_index_material
#define GL_EXT_index_material 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);
#endif
 
#ifndef GL_EXT_index_func
#define GL_EXT_index_func 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref);
#endif
 
#ifndef GL_EXT_index_array_formats
#define GL_EXT_index_array_formats 1
#endif
 
#ifndef GL_EXT_compiled_vertex_array
#define GL_EXT_compiled_vertex_array 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei);
GLAPI void APIENTRY glUnlockArraysEXT (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
#endif
 
#ifndef GL_EXT_cull_vertex
#define GL_EXT_cull_vertex 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *);
GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params);
typedef void (APIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params);
#endif
 
#ifndef GL_SGIX_ycrcb
#define GL_SGIX_ycrcb 1
#endif
 
#ifndef GL_SGIX_fragment_lighting
#define GL_SGIX_fragment_lighting 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum);
GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint);
GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat);
GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *);
GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint);
GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *);
GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint);
GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param);
#endif
 
#ifndef GL_IBM_rasterpos_clip
#define GL_IBM_rasterpos_clip 1
#endif
 
#ifndef GL_HP_texture_lighting
#define GL_HP_texture_lighting 1
#endif
 
#ifndef GL_EXT_draw_range_elements
#define GL_EXT_draw_range_elements 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
#endif
 
#ifndef GL_WIN_phong_shading
#define GL_WIN_phong_shading 1
#endif
 
#ifndef GL_WIN_specular_fog
#define GL_WIN_specular_fog 1
#endif
 
#ifndef GL_EXT_light_texture
#define GL_EXT_light_texture 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glApplyTextureEXT (GLenum);
GLAPI void APIENTRY glTextureLightEXT (GLenum);
GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);
typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);
typedef void (APIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);
#endif
 
#ifndef GL_SGIX_blend_alpha_minmax
#define GL_SGIX_blend_alpha_minmax 1
#endif
 
#ifndef GL_EXT_bgra
#define GL_EXT_bgra 1
#endif
 
#ifndef GL_SGIX_async
#define GL_SGIX_async 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint);
GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *);
GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *);
GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei);
GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei);
GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker);
typedef GLint (APIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp);
typedef GLint (APIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp);
typedef GLuint (APIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);
typedef void (APIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);
typedef GLboolean (APIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);
#endif
 
#ifndef GL_SGIX_async_pixel
#define GL_SGIX_async_pixel 1
#endif
 
#ifndef GL_SGIX_async_histogram
#define GL_SGIX_async_histogram 1
#endif
 
#ifndef GL_INTEL_parallel_arrays
#define GL_INTEL_parallel_arrays 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *);
GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *);
GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *);
GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer);
typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer);
typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer);
typedef void (APIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer);
#endif
 
#ifndef GL_HP_occlusion_test
#define GL_HP_occlusion_test 1
#endif
 
#ifndef GL_EXT_pixel_transform
#define GL_EXT_pixel_transform 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint);
GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);
#endif
 
#ifndef GL_EXT_pixel_transform_color_table
#define GL_EXT_pixel_transform_color_table 1
#endif
 
#ifndef GL_EXT_shared_texture_palette
#define GL_EXT_shared_texture_palette 1
#endif
 
#ifndef GL_EXT_separate_specular_color
#define GL_EXT_separate_specular_color 1
#endif
 
#ifndef GL_EXT_secondary_color
#define GL_EXT_secondary_color 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte);
GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *);
GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *);
GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *);
GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint);
GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *);
GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *);
GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte);
GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *);
GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint);
GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *);
GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort);
GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *);
GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
#endif
 
#ifndef GL_EXT_texture_perturb_normal
#define GL_EXT_texture_perturb_normal 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTextureNormalEXT (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
#endif
 
#ifndef GL_EXT_multi_draw_arrays
#define GL_EXT_multi_draw_arrays 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei);
GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
#endif
 
#ifndef GL_EXT_fog_coord
#define GL_EXT_fog_coord 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFogCoordfEXT (GLfloat);
GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *);
GLAPI void APIENTRY glFogCoorddEXT (GLdouble);
GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *);
GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
#endif
 
#ifndef GL_REND_screen_coordinates
#define GL_REND_screen_coordinates 1
#endif
 
#ifndef GL_EXT_coordinate_frame
#define GL_EXT_coordinate_frame 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte);
GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *);
GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *);
GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *);
GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint);
GLAPI void APIENTRY glTangent3ivEXT (const GLint *);
GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glTangent3svEXT (const GLshort *);
GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte);
GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *);
GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *);
GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *);
GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint);
GLAPI void APIENTRY glBinormal3ivEXT (const GLint *);
GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glBinormal3svEXT (const GLshort *);
GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz);
typedef void (APIENTRY * PFNGLTANGENT3BVEXTPROC) (const GLbyte *v);
typedef void (APIENTRY * PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz);
typedef void (APIENTRY * PFNGLTANGENT3DVEXTPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz);
typedef void (APIENTRY * PFNGLTANGENT3FVEXTPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz);
typedef void (APIENTRY * PFNGLTANGENT3IVEXTPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz);
typedef void (APIENTRY * PFNGLTANGENT3SVEXTPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz);
typedef void (APIENTRY * PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v);
typedef void (APIENTRY * PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz);
typedef void (APIENTRY * PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz);
typedef void (APIENTRY * PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz);
typedef void (APIENTRY * PFNGLBINORMAL3IVEXTPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz);
typedef void (APIENTRY * PFNGLBINORMAL3SVEXTPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
#endif
 
#ifndef GL_EXT_texture_env_combine
#define GL_EXT_texture_env_combine 1
#endif
 
#ifndef GL_APPLE_specular_vector
#define GL_APPLE_specular_vector 1
#endif
 
#ifndef GL_APPLE_transform_hint
#define GL_APPLE_transform_hint 1
#endif
 
#ifndef GL_SGIX_fog_scale
#define GL_SGIX_fog_scale 1
#endif
 
#ifndef GL_SUNX_constant_data
#define GL_SUNX_constant_data 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFinishTextureSUNX (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void);
#endif
 
#ifndef GL_SUN_global_alpha
#define GL_SUN_global_alpha 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte);
GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort);
GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint);
GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat);
GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble);
GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte);
GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort);
GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);
typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);
#endif
 
#ifndef GL_SUN_triangle_list
#define GL_SUN_triangle_list 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint);
GLAPI void APIENTRY glReplacementCodeusSUN (GLushort);
GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte);
GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *);
GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *);
GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *);
GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer);
#endif
 
#ifndef GL_SUN_vertex
#define GL_SUN_vertex 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat);
GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *);
GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *);
GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *);
GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
#endif
 
#ifndef GL_EXT_blend_func_separate
#define GL_EXT_blend_func_separate 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
#endif
 
#ifndef GL_INGR_blend_func_separate
#define GL_INGR_blend_func_separate 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
#endif
 
#ifndef GL_INGR_color_clamp
#define GL_INGR_color_clamp 1
#endif
 
#ifndef GL_INGR_interlace_read
#define GL_INGR_interlace_read 1
#endif
 
#ifndef GL_EXT_stencil_wrap
#define GL_EXT_stencil_wrap 1
#endif
 
#ifndef GL_EXT_422_pixels
#define GL_EXT_422_pixels 1
#endif
 
#ifndef GL_NV_texgen_reflection
#define GL_NV_texgen_reflection 1
#endif
 
#ifndef GL_SUN_convolution_border_modes
#define GL_SUN_convolution_border_modes 1
#endif
 
#ifndef GL_EXT_texture_env_add
#define GL_EXT_texture_env_add 1
#endif
 
#ifndef GL_EXT_texture_lod_bias
#define GL_EXT_texture_lod_bias 1
#endif
 
#ifndef GL_EXT_texture_filter_anisotropic
#define GL_EXT_texture_filter_anisotropic 1
#endif
 
#ifndef GL_EXT_vertex_weighting
#define GL_EXT_vertex_weighting 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glVertexWeightfEXT (GLfloat);
GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *);
GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);
typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight);
typedef void (APIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer);
#endif
 
#ifndef GL_NV_light_max_exponent
#define GL_NV_light_max_exponent 1
#endif
 
#ifndef GL_NV_vertex_array_range
#define GL_NV_vertex_array_range 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFlushVertexArrayRangeNV (void);
GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);
typedef void (APIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer);
#endif
 
#ifndef GL_NV_register_combiners
#define GL_NV_register_combiners 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *);
GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat);
GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *);
GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint);
GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum);
GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean);
GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum);
GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);
#endif
 
#ifndef GL_NV_fog_distance
#define GL_NV_fog_distance 1
#endif
 
#ifndef GL_NV_texgen_emboss
#define GL_NV_texgen_emboss 1
#endif
 
#ifndef GL_NV_blend_square
#define GL_NV_blend_square 1
#endif
 
#ifndef GL_NV_texture_env_combine4
#define GL_NV_texture_env_combine4 1
#endif
 
#ifndef GL_MESA_resize_buffers
#define GL_MESA_resize_buffers 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glResizeBuffersMESA (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void);
#endif
 
#ifndef GL_MESA_window_pos
#define GL_MESA_window_pos 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *);
GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *);
GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint);
GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *);
GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort);
GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *);
GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *);
GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *);
GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint);
GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *);
GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort);
GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *);
GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *);
GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *);
GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint);
GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *);
GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);
typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);
typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v);
typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v);
typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v);
typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);
typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v);
typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);
typedef void (APIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v);
#endif
 
#ifndef GL_IBM_cull_vertex
#define GL_IBM_cull_vertex 1
#endif
 
#ifndef GL_IBM_multimode_draw_arrays
#define GL_IBM_multimode_draw_arrays 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glMultiModeDrawArraysIBM (GLenum, const GLint *, const GLsizei *, GLsizei, GLint);
GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, GLint modestride);
#endif
 
#ifndef GL_IBM_vertex_array_lists
#define GL_IBM_vertex_array_lists 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint);
GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint);
GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
typedef void (APIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride);
#endif
 
#ifndef GL_SGIX_subsample
#define GL_SGIX_subsample 1
#endif
 
#ifndef GL_SGIX_ycrcba
#define GL_SGIX_ycrcba 1
#endif
 
#ifndef GL_SGIX_ycrcb_subsample
#define GL_SGIX_ycrcb_subsample 1
#endif
 
#ifndef GL_SGIX_depth_pass_instrument
#define GL_SGIX_depth_pass_instrument 1
#endif
 
#ifndef GL_3DFX_texture_compression_FXT1
#define GL_3DFX_texture_compression_FXT1 1
#endif
 
#ifndef GL_3DFX_multisample
#define GL_3DFX_multisample 1
#endif
 
#ifndef GL_3DFX_tbuffer
#define GL_3DFX_tbuffer 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTbufferMask3DFX (GLuint);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
#endif
 
#ifndef GL_EXT_multisample
#define GL_EXT_multisample 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean);
GLAPI void APIENTRY glSamplePatternEXT (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
typedef void (APIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);
#endif
 
#ifndef GL_SGIX_vertex_preclip
#define GL_SGIX_vertex_preclip 1
#endif
 
#ifndef GL_SGIX_convolution_accuracy
#define GL_SGIX_convolution_accuracy 1
#endif
 
#ifndef GL_SGIX_resample
#define GL_SGIX_resample 1
#endif
 
#ifndef GL_SGIS_point_line_texgen
#define GL_SGIS_point_line_texgen 1
#endif
 
#ifndef GL_SGIS_texture_color_mask
#define GL_SGIS_texture_color_mask 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
#endif
 
#ifndef GL_SGIX_igloo_interface
#define GL_SGIX_igloo_interface 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params);
#endif
 
#ifndef GL_EXT_texture_env_dot3
#define GL_EXT_texture_env_dot3 1
#endif
 
#ifndef GL_ATI_texture_mirror_once
#define GL_ATI_texture_mirror_once 1
#endif
 
#ifndef GL_NV_fence
#define GL_NV_fence 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *);
GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *);
GLAPI GLboolean APIENTRY glIsFenceNV (GLuint);
GLAPI GLboolean APIENTRY glTestFenceNV (GLuint);
GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glFinishFenceNV (GLuint);
GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
typedef void (APIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
typedef GLboolean (APIENTRY * PFNGLISFENCENVPROC) (GLuint fence);
typedef GLboolean (APIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence);
typedef void (APIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence);
typedef void (APIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
#endif
 
#ifndef GL_NV_evaluators
#define GL_NV_evaluators 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *);
GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *);
GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points);
typedef void (APIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params);
typedef void (APIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points);
typedef void (APIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);
#endif
 
#ifndef GL_NV_packed_depth_stencil
#define GL_NV_packed_depth_stencil 1
#endif
 
#ifndef GL_NV_register_combiners2
#define GL_NV_register_combiners2 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);
typedef void (APIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);
#endif
 
#ifndef GL_NV_texture_compression_vtc
#define GL_NV_texture_compression_vtc 1
#endif
 
#ifndef GL_NV_texture_rectangle
#define GL_NV_texture_rectangle 1
#endif
 
#ifndef GL_NV_texture_shader
#define GL_NV_texture_shader 1
#endif
 
#ifndef GL_NV_texture_shader2
#define GL_NV_texture_shader2 1
#endif
 
#ifndef GL_NV_vertex_array_range2
#define GL_NV_vertex_array_range2 1
#endif
 
#ifndef GL_NV_vertex_program
#define GL_NV_vertex_program 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *);
GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint);
GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *);
GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *);
GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *);
GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *);
GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *);
GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *);
GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *);
GLAPI GLboolean APIENTRY glIsProgramNV (GLuint);
GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *);
GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *);
GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *);
GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *);
GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *);
GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *);
GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum);
GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *);
GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble);
GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat);
GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort);
GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *);
GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *);
GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *);
GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte);
GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *);
GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *);
GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *);
GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *);
GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *);
GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *);
GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *);
GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *);
GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *);
GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *);
GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *);
GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *);
GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *);
GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef GLboolean (APIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences);
typedef void (APIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);
typedef void (APIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
typedef void (APIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params);
typedef void (APIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs);
typedef void (APIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params);
typedef void (APIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program);
typedef void (APIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
typedef GLboolean (APIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id);
typedef void (APIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v);
typedef void (APIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v);
typedef void (APIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
typedef void (APIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
typedef void (APIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);
typedef void (APIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
typedef void (APIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
typedef void (APIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v);
#endif
 
#ifndef GL_SGIX_texture_coordinate_clamp
#define GL_SGIX_texture_coordinate_clamp 1
#endif
 
#ifndef GL_SGIX_scalebias_hint
#define GL_SGIX_scalebias_hint 1
#endif
 
#ifndef GL_OML_interlace
#define GL_OML_interlace 1
#endif
 
#ifndef GL_OML_subsample
#define GL_OML_subsample 1
#endif
 
#ifndef GL_OML_resample
#define GL_OML_resample 1
#endif
 
#ifndef GL_NV_copy_depth_to_color
#define GL_NV_copy_depth_to_color 1
#endif
 
#ifndef GL_ATI_envmap_bumpmap
#define GL_ATI_envmap_bumpmap 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *);
GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *);
GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param);
typedef void (APIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param);
typedef void (APIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
typedef void (APIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
#endif
 
#ifndef GL_ATI_fragment_shader
#define GL_ATI_fragment_shader 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint);
GLAPI void APIENTRY glBindFragmentShaderATI (GLuint);
GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint);
GLAPI void APIENTRY glBeginFragmentShaderATI (void);
GLAPI void APIENTRY glEndFragmentShaderATI (void);
GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum);
GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum);
GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef GLuint (APIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);
typedef void (APIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);
typedef void (APIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);
typedef void (APIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void);
typedef void (APIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void);
typedef void (APIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);
typedef void (APIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);
typedef void (APIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
typedef void (APIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
typedef void (APIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
typedef void (APIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
typedef void (APIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
typedef void (APIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
typedef void (APIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value);
#endif
 
#ifndef GL_ATI_pn_triangles
#define GL_ATI_pn_triangles 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint);
GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);
#endif
 
#ifndef GL_ATI_vertex_array_object
#define GL_ATI_vertex_array_object 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum);
GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint);
GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum);
GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glDeleteObjectBufferATI (GLuint);
GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint);
GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *);
GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint);
GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef GLuint (APIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage);
typedef GLboolean (APIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);
typedef void (APIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve);
typedef void (APIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLDELETEOBJECTBUFFERATIPROC) (GLuint buffer);
typedef void (APIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
typedef void (APIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
typedef void (APIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params);
typedef void (APIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params);
#endif
 
#ifndef GL_EXT_vertex_shader
#define GL_EXT_vertex_shader 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glBeginVertexShaderEXT (void);
GLAPI void APIENTRY glEndVertexShaderEXT (void);
GLAPI void APIENTRY glBindVertexShaderEXT (GLuint);
GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint);
GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint);
GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint);
GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint);
GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum);
GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum);
GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint);
GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint);
GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint);
GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const void *);
GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const void *);
GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *);
GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *);
GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *);
GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *);
GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *);
GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *);
GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *);
GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *);
GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const void *);
GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint);
GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint);
GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum);
GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum);
GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum);
GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum);
GLAPI GLuint APIENTRY glBindParameterEXT (GLenum);
GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum);
GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *);
GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *);
GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *);
GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *);
GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void);
typedef void (APIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void);
typedef void (APIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);
typedef GLuint (APIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);
typedef void (APIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);
typedef void (APIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);
typedef void (APIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
typedef void (APIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
typedef void (APIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
typedef void (APIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
typedef void (APIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
typedef void (APIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
typedef GLuint (APIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);
typedef void (APIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr);
typedef void (APIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr);
typedef void (APIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr);
typedef void (APIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr);
typedef void (APIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr);
typedef void (APIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr);
typedef void (APIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr);
typedef void (APIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr);
typedef void (APIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr);
typedef void (APIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr);
typedef void (APIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr);
typedef void (APIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
typedef void (APIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
typedef GLuint (APIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);
typedef GLuint (APIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);
typedef GLuint (APIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);
typedef GLuint (APIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);
typedef GLuint (APIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value);
typedef GLboolean (APIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);
typedef void (APIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
typedef void (APIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
typedef void (APIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
typedef void (APIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data);
typedef void (APIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
typedef void (APIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
typedef void (APIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
typedef void (APIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
typedef void (APIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
typedef void (APIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
#endif
 
#ifndef GL_ATI_vertex_streams
#define GL_ATI_vertex_streams 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort);
GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *);
GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint);
GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *);
GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat);
GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble);
GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *);
GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort);
GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *);
GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint);
GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *);
GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *);
GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *);
GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint);
GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *);
GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *);
GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *);
GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint);
GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *);
GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *);
GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte);
GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *);
GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort);
GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *);
GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint);
GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *);
GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *);
GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble);
GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *);
GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum);
GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint);
GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x);
typedef void (APIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);
typedef void (APIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
typedef void (APIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (APIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords);
typedef void (APIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);
typedef void (APIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords);
typedef void (APIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz);
typedef void (APIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
typedef void (APIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz);
typedef void (APIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
typedef void (APIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);
typedef void (APIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
typedef void (APIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);
typedef void (APIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
typedef void (APIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);
typedef void (APIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);
#endif
 
#ifndef GL_ATI_element_array
#define GL_ATI_element_array 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *);
GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei);
GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);
typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);
#endif
 
#ifndef GL_SUN_mesh_array
#define GL_SUN_mesh_array 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width);
#endif
 
#ifndef GL_SUN_slice_accum
#define GL_SUN_slice_accum 1
#endif
 
#ifndef GL_NV_multisample_filter_hint
#define GL_NV_multisample_filter_hint 1
#endif
 
#ifndef GL_NV_depth_clamp
#define GL_NV_depth_clamp 1
#endif
 
#ifndef GL_NV_occlusion_query
#define GL_NV_occlusion_query 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *);
GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *);
GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint);
GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint);
GLAPI void APIENTRY glEndOcclusionQueryNV (void);
GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *);
GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);
typedef void (APIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);
typedef GLboolean (APIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);
typedef void (APIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
typedef void (APIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void);
typedef void (APIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);
#endif
 
#ifndef GL_NV_point_sprite
#define GL_NV_point_sprite 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint);
GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
#endif
 
#ifndef GL_NV_texture_shader3
#define GL_NV_texture_shader3 1
#endif
 
#ifndef GL_NV_vertex_program1_1
#define GL_NV_vertex_program1_1 1
#endif
 
#ifndef GL_EXT_shadow_funcs
#define GL_EXT_shadow_funcs 1
#endif
 
#ifndef GL_EXT_stencil_two_side
#define GL_EXT_stencil_two_side 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
#endif
 
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/mglmesa.h
0,0 → 1,80
/****************************************************************************
*
* Mesa bindings for SciTech MGL
*
* Copyright (C) 1996 SciTech Software.
* All rights reserved.
*
* Filename: $Workfile: mglmesa.h $
* Version: $Revision: 1.1 $
*
* Language: ANSI C
* Environment: Any
*
* Description: Header file for the Mesa/OpenGL interface bindings for the
* SciTech MGL graphics library. Uses the MGL internal
* device context structures to get direct access to the
* high performance MGL rasterization functions for maximum
* performance. Utilizes the VESA VBE/AF Accelerator Functions
* via the MGL's accelerated device driver functions, as well
* as basic DirectDraw accelerated functions provided by the
* MGL.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Date: 2003-02-28 11:41:56 $ $Author: pj $
*
****************************************************************************/
 
#ifndef __MGLMESA_H
#define __MGLMESA_H
 
#include "mgraph.h"
 
/*------------------------- Function Prototypes ---------------------------*/
 
#ifdef __cplusplus
extern "C" { /* Use "C" linkage when in C++ mode */
#endif
 
#ifndef __WINDOWS__
#define GLAPIENTRY
#endif
 
#ifdef __WINDOWS__
bool GLAPIENTRY MGLMesaInitDLL(MGLCallbacks *cb,char *version);
#endif
void GLAPIENTRY MGLMesaChooseVisual(MGLDC *dc,MGLVisual *visual);
bool GLAPIENTRY MGLMesaSetVisual(MGLDC *dc,MGLVisual *visual);
bool GLAPIENTRY MGLMesaCreateContext(MGLDC *dc,bool forceMemDC);
void GLAPIENTRY MGLMesaDestroyContext(MGLDC *dc);
void GLAPIENTRY MGLMesaMakeCurrent(MGLDC *dc);
void GLAPIENTRY MGLMesaSwapBuffers(MGLDC *dc,bool waitVRT);
 
/* Palette manipulation support. The reason we provide palette manipulation
* routines is so that when rendering in double buffered modes with a
* software backbuffer, the palette for the backbuffer is kept consistent
* with the hardware front buffer.
*/
 
void GLAPIENTRY MGLMesaSetPaletteEntry(MGLDC *dc,int entry,uchar red,uchar green,uchar blue);
void GLAPIENTRY MGLMesaSetPalette(MGLDC *dc,palette_t *pal,int numColors,int startIndex);
void GLAPIENTRY MGLMesaRealizePalette(MGLDC *dc,int numColors,int startIndex,int waitVRT);
 
#ifdef __cplusplus
} /* End of "C" linkage for C++ */
#endif /* __cplusplus */
 
#endif /* __MGLMESA_H */
/shark/trunk/ports/mesa/include/GL/gl_mangle.h
0,0 → 1,1056
#if 0 /* $Id: gl_mangle.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
# DO NOT EDIT!!! - TO REGENERATE from gl.h, EXECUTE THIS FILE IN KORN SHELL and save the output
# This file is used to create GL function protypes and aliases for the function names
 
files="gl.h glext.h"
#get regeneration header - copy everything in this file above the "REGENERATE_TO_END" line
awk '!done; /^\/\*REGENERATE_TO_END/ {done=1}' $0
echo "\n"
 
#get aliases
grep '^GLAPI' $files | sed -e 's/.*ENTRY gl\([^( ]*\).*$/#define gl\1 MANGLE(\1)/' | sort | uniq
echo "\n#endif /* GL_MANGLE_H */"
exit
#endif /* REGENERATION */
 
/*
* If you compile Mesa with USE_MGL_NAMESPACE defined then you can link
* your application both with OpenGL and Mesa. The Mesa functions will
* be redefined so they are prefixed with "mgl" instead of "gl".
* Mgl contributed by Randy Frank (rfrank@rsinc.com)
* Regneration code contributed by Ray Tice (rayt@ma.ultra.net)
*/
 
#ifndef GL_MANGLE_H
#define GL_MANGLE_H
 
#ifndef MANGLE
#define MANGLE(x) mgl##x
#endif /*MANGLE*/
 
/* Internal symbols which may collide with other OpenGL implementations. */
#define __glCoreCreateContext __mglCoreCreateContext
#define __glCoreNopDispatch __mglCoreNopDispatch
 
/*REGENERATE_TO_END-----------ALL LINES BELOW HERE GET REPLACED ON REGENERATION */
 
 
#define glAccum MANGLE(Accum)
#define glActiveTexture MANGLE(ActiveTexture)
#define glActiveTextureARB MANGLE(ActiveTextureARB)
#define glAlphaFragmentOp1ATI MANGLE(AlphaFragmentOp1ATI)
#define glAlphaFragmentOp2ATI MANGLE(AlphaFragmentOp2ATI)
#define glAlphaFragmentOp3ATI MANGLE(AlphaFragmentOp3ATI)
#define glAlphaFunc MANGLE(AlphaFunc)
#define glApplyTextureEXT MANGLE(ApplyTextureEXT)
#define glAreProgramsResidentNV MANGLE(AreProgramsResidentNV)
#define glAreTexturesResident MANGLE(AreTexturesResident)
#define glAreTexturesResidentEXT MANGLE(AreTexturesResidentEXT)
#define glArrayElement MANGLE(ArrayElement)
#define glArrayElementEXT MANGLE(ArrayElementEXT)
#define glArrayObjectATI MANGLE(ArrayObjectATI)
#define glAsyncMarkerSGIX MANGLE(AsyncMarkerSGIX)
#define glBegin MANGLE(Begin)
#define glBeginFragmentShaderATI MANGLE(BeginFragmentShaderATI)
#define glBeginVertexShaderEXT MANGLE(BeginVertexShaderEXT)
#define glBindFragmentShaderATI MANGLE(BindFragmentShaderATI)
#define glBindLightParameterEXT MANGLE(BindLightParameterEXT)
#define glBindMaterialParameterEXT MANGLE(BindMaterialParameterEXT)
#define glBindParameterEXT MANGLE(BindParameterEXT)
#define glBindProgramNV MANGLE(BindProgramNV)
#define glBindTexGenParameterEXT MANGLE(BindTexGenParameterEXT)
#define glBindTexture MANGLE(BindTexture)
#define glBindTextureEXT MANGLE(BindTextureEXT)
#define glBindTextureUnitParameterEXT MANGLE(BindTextureUnitParameterEXT)
#define glBindVertexShaderEXT MANGLE(BindVertexShaderEXT)
#define glBinormal3bEXT MANGLE(Binormal3bEXT)
#define glBinormal3bvEXT MANGLE(Binormal3bvEXT)
#define glBinormal3dEXT MANGLE(Binormal3dEXT)
#define glBinormal3dvEXT MANGLE(Binormal3dvEXT)
#define glBinormal3fEXT MANGLE(Binormal3fEXT)
#define glBinormal3fvEXT MANGLE(Binormal3fvEXT)
#define glBinormal3iEXT MANGLE(Binormal3iEXT)
#define glBinormal3ivEXT MANGLE(Binormal3ivEXT)
#define glBinormal3sEXT MANGLE(Binormal3sEXT)
#define glBinormal3svEXT MANGLE(Binormal3svEXT)
#define glBinormalPointerEXT MANGLE(BinormalPointerEXT)
#define glBitmap MANGLE(Bitmap)
#define glBlendColor MANGLE(BlendColor)
#define glBlendColorEXT MANGLE(BlendColorEXT)
#define glBlendEquation MANGLE(BlendEquation)
#define glBlendEquationEXT MANGLE(BlendEquationEXT)
#define glBlendFunc MANGLE(BlendFunc)
#define glBlendFuncSeparateEXT MANGLE(BlendFuncSeparateEXT)
#define glBlendFuncSeparateINGR MANGLE(BlendFuncSeparateINGR)
#define glCallList MANGLE(CallList)
#define glCallLists MANGLE(CallLists)
#define glClear MANGLE(Clear)
#define glClearAccum MANGLE(ClearAccum)
#define glClearColor MANGLE(ClearColor)
#define glClearDepth MANGLE(ClearDepth)
#define glClearIndex MANGLE(ClearIndex)
#define glClearStencil MANGLE(ClearStencil)
#define glClientActiveTexture MANGLE(ClientActiveTexture)
#define glClientActiveTextureARB MANGLE(ClientActiveTextureARB)
#define glClientActiveVertexStream MANGLE(ClientActiveVertexStream)
#define glClipPlane MANGLE(ClipPlane)
#define glColor3b MANGLE(Color3b)
#define glColor3bv MANGLE(Color3bv)
#define glColor3d MANGLE(Color3d)
#define glColor3dv MANGLE(Color3dv)
#define glColor3f MANGLE(Color3f)
#define glColor3fVertex3fSUN MANGLE(Color3fVertex3fSUN)
#define glColor3fVertex3fvSUN MANGLE(Color3fVertex3fvSUN)
#define glColor3fv MANGLE(Color3fv)
#define glColor3i MANGLE(Color3i)
#define glColor3iv MANGLE(Color3iv)
#define glColor3s MANGLE(Color3s)
#define glColor3sv MANGLE(Color3sv)
#define glColor3ub MANGLE(Color3ub)
#define glColor3ubv MANGLE(Color3ubv)
#define glColor3ui MANGLE(Color3ui)
#define glColor3uiv MANGLE(Color3uiv)
#define glColor3us MANGLE(Color3us)
#define glColor3usv MANGLE(Color3usv)
#define glColor4b MANGLE(Color4b)
#define glColor4bv MANGLE(Color4bv)
#define glColor4d MANGLE(Color4d)
#define glColor4dv MANGLE(Color4dv)
#define glColor4f MANGLE(Color4f)
#define glColor4fNormal3fVertex3fSUN MANGLE(Color4fNormal3fVertex3fSUN)
#define glColor4fNormal3fVertex3fvSUN MANGLE(Color4fNormal3fVertex3fvSUN)
#define glColor4fv MANGLE(Color4fv)
#define glColor4i MANGLE(Color4i)
#define glColor4iv MANGLE(Color4iv)
#define glColor4s MANGLE(Color4s)
#define glColor4sv MANGLE(Color4sv)
#define glColor4ub MANGLE(Color4ub)
#define glColor4ubVertex2fSUN MANGLE(Color4ubVertex2fSUN)
#define glColor4ubVertex2fvSUN MANGLE(Color4ubVertex2fvSUN)
#define glColor4ubVertex3fSUN MANGLE(Color4ubVertex3fSUN)
#define glColor4ubVertex3fvSUN MANGLE(Color4ubVertex3fvSUN)
#define glColor4ubv MANGLE(Color4ubv)
#define glColor4ui MANGLE(Color4ui)
#define glColor4uiv MANGLE(Color4uiv)
#define glColor4us MANGLE(Color4us)
#define glColor4usv MANGLE(Color4usv)
#define glColorFragmentOp1ATI MANGLE(ColorFragmentOp1ATI)
#define glColorFragmentOp2ATI MANGLE(ColorFragmentOp2ATI)
#define glColorFragmentOp3ATI MANGLE(ColorFragmentOp3ATI)
#define glColorMask MANGLE(ColorMask)
#define glColorMaterial MANGLE(ColorMaterial)
#define glColorPointer MANGLE(ColorPointer)
#define glColorPointerEXT MANGLE(ColorPointerEXT)
#define glColorPointerListIBM MANGLE(ColorPointerListIBM)
#define glColorPointervINTEL MANGLE(ColorPointervINTEL)
#define glColorSubTable MANGLE(ColorSubTable)
#define glColorSubTableEXT MANGLE(ColorSubTableEXT)
#define glColorTable MANGLE(ColorTable)
#define glColorTableEXT MANGLE(ColorTableEXT)
#define glColorTableParameterfv MANGLE(ColorTableParameterfv)
#define glColorTableParameterfvSGI MANGLE(ColorTableParameterfvSGI)
#define glColorTableParameteriv MANGLE(ColorTableParameteriv)
#define glColorTableParameterivSGI MANGLE(ColorTableParameterivSGI)
#define glColorTableSGI MANGLE(ColorTableSGI)
#define glCombinerInputNV MANGLE(CombinerInputNV)
#define glCombinerOutputNV MANGLE(CombinerOutputNV)
#define glCombinerParameterfNV MANGLE(CombinerParameterfNV)
#define glCombinerParameterfvNV MANGLE(CombinerParameterfvNV)
#define glCombinerParameteriNV MANGLE(CombinerParameteriNV)
#define glCombinerParameterivNV MANGLE(CombinerParameterivNV)
#define glCombinerStageParameterfvNV MANGLE(CombinerStageParameterfvNV)
#define glCompressedTexImage1D MANGLE(CompressedTexImage1D)
#define glCompressedTexImage1DARB MANGLE(CompressedTexImage1DARB)
#define glCompressedTexImage2D MANGLE(CompressedTexImage2D)
#define glCompressedTexImage2DARB MANGLE(CompressedTexImage2DARB)
#define glCompressedTexImage3D MANGLE(CompressedTexImage3D)
#define glCompressedTexImage3DARB MANGLE(CompressedTexImage3DARB)
#define glCompressedTexSubImage1D MANGLE(CompressedTexSubImage1D)
#define glCompressedTexSubImage1DARB MANGLE(CompressedTexSubImage1DARB)
#define glCompressedTexSubImage2D MANGLE(CompressedTexSubImage2D)
#define glCompressedTexSubImage2DARB MANGLE(CompressedTexSubImage2DARB)
#define glCompressedTexSubImage3D MANGLE(CompressedTexSubImage3D)
#define glCompressedTexSubImage3DARB MANGLE(CompressedTexSubImage3DARB)
#define glConvolutionFilter1D MANGLE(ConvolutionFilter1D)
#define glConvolutionFilter1DEXT MANGLE(ConvolutionFilter1DEXT)
#define glConvolutionFilter2D MANGLE(ConvolutionFilter2D)
#define glConvolutionFilter2DEXT MANGLE(ConvolutionFilter2DEXT)
#define glConvolutionParameterf MANGLE(ConvolutionParameterf)
#define glConvolutionParameterfEXT MANGLE(ConvolutionParameterfEXT)
#define glConvolutionParameterfv MANGLE(ConvolutionParameterfv)
#define glConvolutionParameterfvEXT MANGLE(ConvolutionParameterfvEXT)
#define glConvolutionParameteri MANGLE(ConvolutionParameteri)
#define glConvolutionParameteriEXT MANGLE(ConvolutionParameteriEXT)
#define glConvolutionParameteriv MANGLE(ConvolutionParameteriv)
#define glConvolutionParameterivEXT MANGLE(ConvolutionParameterivEXT)
#define glCopyColorSubTable MANGLE(CopyColorSubTable)
#define glCopyColorSubTableEXT MANGLE(CopyColorSubTableEXT)
#define glCopyColorTable MANGLE(CopyColorTable)
#define glCopyColorTableSGI MANGLE(CopyColorTableSGI)
#define glCopyConvolutionFilter1D MANGLE(CopyConvolutionFilter1D)
#define glCopyConvolutionFilter1DEXT MANGLE(CopyConvolutionFilter1DEXT)
#define glCopyConvolutionFilter2D MANGLE(CopyConvolutionFilter2D)
#define glCopyConvolutionFilter2DEXT MANGLE(CopyConvolutionFilter2DEXT)
#define glCopyPixels MANGLE(CopyPixels)
#define glCopyTexImage1D MANGLE(CopyTexImage1D)
#define glCopyTexImage1DEXT MANGLE(CopyTexImage1DEXT)
#define glCopyTexImage2D MANGLE(CopyTexImage2D)
#define glCopyTexImage2DEXT MANGLE(CopyTexImage2DEXT)
#define glCopyTexSubImage1D MANGLE(CopyTexSubImage1D)
#define glCopyTexSubImage1DEXT MANGLE(CopyTexSubImage1DEXT)
#define glCopyTexSubImage2D MANGLE(CopyTexSubImage2D)
#define glCopyTexSubImage2DEXT MANGLE(CopyTexSubImage2DEXT)
#define glCopyTexSubImage3D MANGLE(CopyTexSubImage3D)
#define glCopyTexSubImage3DEXT MANGLE(CopyTexSubImage3DEXT)
#define glCullFace MANGLE(CullFace)
#define glCullParameterdvEXT MANGLE(CullParameterdvEXT)
#define glCullParameterfvEXT MANGLE(CullParameterfvEXT)
#define glCurrentPaletteMatrixARB MANGLE(CurrentPaletteMatrixARB)
#define glDeformSGIX MANGLE(DeformSGIX)
#define glDeformationMap3dSGIX MANGLE(DeformationMap3dSGIX)
#define glDeformationMap3fSGIX MANGLE(DeformationMap3fSGIX)
#define glDeleteAsyncMarkersSGIX MANGLE(DeleteAsyncMarkersSGIX)
#define glDeleteFencesNV MANGLE(DeleteFencesNV)
#define glDeleteFragmentShaderATI MANGLE(DeleteFragmentShaderATI)
#define glDeleteLists MANGLE(DeleteLists)
#define glDeleteObjectBufferATI MANGLE(DeleteObjectBufferATI)
#define glDeleteProgramsNV MANGLE(DeleteProgramsNV)
#define glDeleteTextures MANGLE(DeleteTextures)
#define glDeleteTexturesEXT MANGLE(DeleteTexturesEXT)
#define glDeleteVertexShaderEXT MANGLE(DeleteVertexShaderEXT)
#define glDepthFunc MANGLE(DepthFunc)
#define glDepthMask MANGLE(DepthMask)
#define glDepthRange MANGLE(DepthRange)
#define glDetailTexFuncSGIS MANGLE(DetailTexFuncSGIS)
#define glDisable MANGLE(Disable)
#define glDisableClientState MANGLE(DisableClientState)
#define glDisableTraceMESA MANGLE(DisableTraceMESA)
#define glDisableVariantClientStateEXT MANGLE(DisableVariantClientStateEXT)
#define glDrawArrays MANGLE(DrawArrays)
#define glDrawArraysEXT MANGLE(DrawArraysEXT)
#define glDrawBuffer MANGLE(DrawBuffer)
#define glDrawElements MANGLE(DrawElements)
#define glDrawPixels MANGLE(DrawPixels)
#define glDrawRangeElements MANGLE(DrawRangeElements)
#define glDrawRangeElementsEXT MANGLE(DrawRangeElementsEXT)
#define glEdgeFlag MANGLE(EdgeFlag)
#define glEdgeFlagPointer MANGLE(EdgeFlagPointer)
#define glEdgeFlagPointerEXT MANGLE(EdgeFlagPointerEXT)
#define glEdgeFlagPointerListIBM MANGLE(EdgeFlagPointerListIBM)
#define glEdgeFlagv MANGLE(EdgeFlagv)
#define glEnable MANGLE(Enable)
#define glEnableClientState MANGLE(EnableClientState)
#define glEnableTraceMESA MANGLE(EnableTraceMESA)
#define glEnableVariantClientStateEXT MANGLE(EnableVariantClientStateEXT)
#define glEnd MANGLE(End)
#define glEndFragmentShaderATI MANGLE(EndFragmentShaderATI)
#define glEndList MANGLE(EndList)
#define glEndTraceMESA MANGLE(EndTraceMESA)
#define glEndVertexShaderEXT MANGLE(EndVertexShaderEXT)
#define glEvalCoord1d MANGLE(EvalCoord1d)
#define glEvalCoord1dv MANGLE(EvalCoord1dv)
#define glEvalCoord1f MANGLE(EvalCoord1f)
#define glEvalCoord1fv MANGLE(EvalCoord1fv)
#define glEvalCoord2d MANGLE(EvalCoord2d)
#define glEvalCoord2dv MANGLE(EvalCoord2dv)
#define glEvalCoord2f MANGLE(EvalCoord2f)
#define glEvalCoord2fv MANGLE(EvalCoord2fv)
#define glEvalMapsNV MANGLE(EvalMapsNV)
#define glEvalMesh1 MANGLE(EvalMesh1)
#define glEvalMesh2 MANGLE(EvalMesh2)
#define glEvalPoint1 MANGLE(EvalPoint1)
#define glEvalPoint2 MANGLE(EvalPoint2)
#define glExecuteProgramNV MANGLE(ExecuteProgramNV)
#define glExtractComponentEXT MANGLE(ExtractComponentEXT)
#define glFeedbackBuffer MANGLE(FeedbackBuffer)
#define glFinalCombinerInputNV MANGLE(FinalCombinerInputNV)
#define glFinish MANGLE(Finish)
#define glFinishAsyncSGIX MANGLE(FinishAsyncSGIX)
#define glFinishFenceNV MANGLE(FinishFenceNV)
#define glFinishTextureSUNX MANGLE(FinishTextureSUNX)
#define glFlush MANGLE(Flush)
#define glFlushRasterSGIX MANGLE(FlushRasterSGIX)
#define glFlushVertexArrayRangeNV MANGLE(FlushVertexArrayRangeNV)
#define glFogCoordPointerEXT MANGLE(FogCoordPointerEXT)
#define glFogCoordPointerListIBM MANGLE(FogCoordPointerListIBM)
#define glFogCoorddEXT MANGLE(FogCoorddEXT)
#define glFogCoorddvEXT MANGLE(FogCoorddvEXT)
#define glFogCoordfEXT MANGLE(FogCoordfEXT)
#define glFogCoordfvEXT MANGLE(FogCoordfvEXT)
#define glFogFuncSGIS MANGLE(FogFuncSGIS)
#define glFogf MANGLE(Fogf)
#define glFogfv MANGLE(Fogfv)
#define glFogi MANGLE(Fogi)
#define glFogiv MANGLE(Fogiv)
#define glFragmentColorMaterialSGIX MANGLE(FragmentColorMaterialSGIX)
#define glFragmentLightModelfSGIX MANGLE(FragmentLightModelfSGIX)
#define glFragmentLightModelfvSGIX MANGLE(FragmentLightModelfvSGIX)
#define glFragmentLightModeliSGIX MANGLE(FragmentLightModeliSGIX)
#define glFragmentLightModelivSGIX MANGLE(FragmentLightModelivSGIX)
#define glFragmentLightfSGIX MANGLE(FragmentLightfSGIX)
#define glFragmentLightfvSGIX MANGLE(FragmentLightfvSGIX)
#define glFragmentLightiSGIX MANGLE(FragmentLightiSGIX)
#define glFragmentLightivSGIX MANGLE(FragmentLightivSGIX)
#define glFragmentMaterialfSGIX MANGLE(FragmentMaterialfSGIX)
#define glFragmentMaterialfvSGIX MANGLE(FragmentMaterialfvSGIX)
#define glFragmentMaterialiSGIX MANGLE(FragmentMaterialiSGIX)
#define glFragmentMaterialivSGIX MANGLE(FragmentMaterialivSGIX)
#define glFrameZoomSGIX MANGLE(FrameZoomSGIX)
#define glFrontFace MANGLE(FrontFace)
#define glFrustum MANGLE(Frustum)
#define glGenAsyncMarkersSGIX MANGLE(GenAsyncMarkersSGIX)
#define glGenFencesNV MANGLE(GenFencesNV)
#define glGenFragmentShadersATI MANGLE(GenFragmentShadersATI)
#define glGenLists MANGLE(GenLists)
#define glGenProgramsNV MANGLE(GenProgramsNV)
#define glGenSymbolsEXT MANGLE(GenSymbolsEXT)
#define glGenTextures MANGLE(GenTextures)
#define glGenTexturesEXT MANGLE(GenTexturesEXT)
#define glGenVertexShadersEXT MANGLE(GenVertexShadersEXT)
#define glGetArrayObjectfvATI MANGLE(GetArrayObjectfvATI)
#define glGetArrayObjectivATI MANGLE(GetArrayObjectivATI)
#define glGetBooleanv MANGLE(GetBooleanv)
#define glGetClipPlane MANGLE(GetClipPlane)
#define glGetColorTable MANGLE(GetColorTable)
#define glGetColorTableEXT MANGLE(GetColorTableEXT)
#define glGetColorTableParameterfv MANGLE(GetColorTableParameterfv)
#define glGetColorTableParameterfvEXT MANGLE(GetColorTableParameterfvEXT)
#define glGetColorTableParameterfvSGI MANGLE(GetColorTableParameterfvSGI)
#define glGetColorTableParameteriv MANGLE(GetColorTableParameteriv)
#define glGetColorTableParameterivEXT MANGLE(GetColorTableParameterivEXT)
#define glGetColorTableParameterivSGI MANGLE(GetColorTableParameterivSGI)
#define glGetColorTableSGI MANGLE(GetColorTableSGI)
#define glGetCombinerInputParameterfvNV MANGLE(GetCombinerInputParameterfvNV)
#define glGetCombinerInputParameterivNV MANGLE(GetCombinerInputParameterivNV)
#define glGetCombinerOutputParameterfvNV MANGLE(GetCombinerOutputParameterfvNV)
#define glGetCombinerOutputParameterivNV MANGLE(GetCombinerOutputParameterivNV)
#define glGetCombinerStageParameterfvNV MANGLE(GetCombinerStageParameterfvNV)
#define glGetCompressedTexImage MANGLE(GetCompressedTexImage)
#define glGetCompressedTexImageARB MANGLE(GetCompressedTexImageARB)
#define glGetConvolutionFilter MANGLE(GetConvolutionFilter)
#define glGetConvolutionFilterEXT MANGLE(GetConvolutionFilterEXT)
#define glGetConvolutionParameterfv MANGLE(GetConvolutionParameterfv)
#define glGetConvolutionParameterfvEXT MANGLE(GetConvolutionParameterfvEXT)
#define glGetConvolutionParameteriv MANGLE(GetConvolutionParameteriv)
#define glGetConvolutionParameterivEXT MANGLE(GetConvolutionParameterivEXT)
#define glGetDetailTexFuncSGIS MANGLE(GetDetailTexFuncSGIS)
#define glGetDoublev MANGLE(GetDoublev)
#define glGetError MANGLE(GetError)
#define glGetFenceivNV MANGLE(GetFenceivNV)
#define glGetFinalCombinerInputParameterfvNV MANGLE(GetFinalCombinerInputParameterfvNV)
#define glGetFinalCombinerInputParameterivNV MANGLE(GetFinalCombinerInputParameterivNV)
#define glGetFloatv MANGLE(GetFloatv)
#define glGetFogFuncSGIS MANGLE(GetFogFuncSGIS)
#define glGetFragmentLightfvSGIX MANGLE(GetFragmentLightfvSGIX)
#define glGetFragmentLightivSGIX MANGLE(GetFragmentLightivSGIX)
#define glGetFragmentMaterialfvSGIX MANGLE(GetFragmentMaterialfvSGIX)
#define glGetFragmentMaterialivSGIX MANGLE(GetFragmentMaterialivSGIX)
#define glGetHistogram MANGLE(GetHistogram)
#define glGetHistogramEXT MANGLE(GetHistogramEXT)
#define glGetHistogramParameterfv MANGLE(GetHistogramParameterfv)
#define glGetHistogramParameterfvEXT MANGLE(GetHistogramParameterfvEXT)
#define glGetHistogramParameteriv MANGLE(GetHistogramParameteriv)
#define glGetHistogramParameterivEXT MANGLE(GetHistogramParameterivEXT)
#define glGetImageTransformParameterfvHP MANGLE(GetImageTransformParameterfvHP)
#define glGetImageTransformParameterivHP MANGLE(GetImageTransformParameterivHP)
#define glGetInstrumentsSGIX MANGLE(GetInstrumentsSGIX)
#define glGetIntegerv MANGLE(GetIntegerv)
#define glGetInvariantBooleanvEXT MANGLE(GetInvariantBooleanvEXT)
#define glGetInvariantFloatvEXT MANGLE(GetInvariantFloatvEXT)
#define glGetInvariantIntegervEXT MANGLE(GetInvariantIntegervEXT)
#define glGetLightfv MANGLE(GetLightfv)
#define glGetLightiv MANGLE(GetLightiv)
#define glGetListParameterfvSGIX MANGLE(GetListParameterfvSGIX)
#define glGetListParameterivSGIX MANGLE(GetListParameterivSGIX)
#define glGetLocalConstantBooleanvEXT MANGLE(GetLocalConstantBooleanvEXT)
#define glGetLocalConstantFloatvEXT MANGLE(GetLocalConstantFloatvEXT)
#define glGetLocalConstantIntegervEXT MANGLE(GetLocalConstantIntegervEXT)
#define glGetMapAttribParameterfvNV MANGLE(GetMapAttribParameterfvNV)
#define glGetMapAttribParameterivNV MANGLE(GetMapAttribParameterivNV)
#define glGetMapControlPointsNV MANGLE(GetMapControlPointsNV)
#define glGetMapParameterfvNV MANGLE(GetMapParameterfvNV)
#define glGetMapParameterivNV MANGLE(GetMapParameterivNV)
#define glGetMapdv MANGLE(GetMapdv)
#define glGetMapfv MANGLE(GetMapfv)
#define glGetMapiv MANGLE(GetMapiv)
#define glGetMaterialfv MANGLE(GetMaterialfv)
#define glGetMaterialiv MANGLE(GetMaterialiv)
#define glGetMinmax MANGLE(GetMinmax)
#define glGetMinmaxEXT MANGLE(GetMinmaxEXT)
#define glGetMinmaxParameterfv MANGLE(GetMinmaxParameterfv)
#define glGetMinmaxParameterfvEXT MANGLE(GetMinmaxParameterfvEXT)
#define glGetMinmaxParameteriv MANGLE(GetMinmaxParameteriv)
#define glGetMinmaxParameterivEXT MANGLE(GetMinmaxParameterivEXT)
#define glGetObjectBufferfvATI MANGLE(GetObjectBufferfvATI)
#define glGetObjectBufferivATI MANGLE(GetObjectBufferivATI)
#define glGetPixelMapfv MANGLE(GetPixelMapfv)
#define glGetPixelMapuiv MANGLE(GetPixelMapuiv)
#define glGetPixelMapusv MANGLE(GetPixelMapusv)
#define glGetPixelTexGenParameterfvSGIS MANGLE(GetPixelTexGenParameterfvSGIS)
#define glGetPixelTexGenParameterivSGIS MANGLE(GetPixelTexGenParameterivSGIS)
#define glGetPointerv MANGLE(GetPointerv)
#define glGetPointervEXT MANGLE(GetPointervEXT)
#define glGetPolygonStipple MANGLE(GetPolygonStipple)
#define glGetProgramParameterdvNV MANGLE(GetProgramParameterdvNV)
#define glGetProgramParameterfvNV MANGLE(GetProgramParameterfvNV)
#define glGetProgramStringNV MANGLE(GetProgramStringNV)
#define glGetProgramivNV MANGLE(GetProgramivNV)
#define glGetSeparableFilter MANGLE(GetSeparableFilter)
#define glGetSeparableFilterEXT MANGLE(GetSeparableFilterEXT)
#define glGetSharpenTexFuncSGIS MANGLE(GetSharpenTexFuncSGIS)
#define glGetString MANGLE(GetString)
#define glGetTexBumpParameterfvATI MANGLE(GetTexBumpParameterfvATI)
#define glGetTexBumpParameterivATI MANGLE(GetTexBumpParameterivATI)
#define glGetTexEnvfv MANGLE(GetTexEnvfv)
#define glGetTexEnviv MANGLE(GetTexEnviv)
#define glGetTexFilterFuncSGIS MANGLE(GetTexFilterFuncSGIS)
#define glGetTexGendv MANGLE(GetTexGendv)
#define glGetTexGenfv MANGLE(GetTexGenfv)
#define glGetTexGeniv MANGLE(GetTexGeniv)
#define glGetTexImage MANGLE(GetTexImage)
#define glGetTexLevelParameterfv MANGLE(GetTexLevelParameterfv)
#define glGetTexLevelParameteriv MANGLE(GetTexLevelParameteriv)
#define glGetTexParameterfv MANGLE(GetTexParameterfv)
#define glGetTexParameteriv MANGLE(GetTexParameteriv)
#define glGetTrackMatrixivNV MANGLE(GetTrackMatrixivNV)
#define glGetVariantArrayObjectfvATI MANGLE(GetVariantArrayObjectfvATI)
#define glGetVariantArrayObjectivATI MANGLE(GetVariantArrayObjectivATI)
#define glGetVariantBooleanvEXT MANGLE(GetVariantBooleanvEXT)
#define glGetVariantFloatvEXT MANGLE(GetVariantFloatvEXT)
#define glGetVariantIntegervEXT MANGLE(GetVariantIntegervEXT)
#define glGetVariantPointervEXT MANGLE(GetVariantPointervEXT)
#define glGetVertexAttribPointervNV MANGLE(GetVertexAttribPointervNV)
#define glGetVertexAttribdvNV MANGLE(GetVertexAttribdvNV)
#define glGetVertexAttribfvNV MANGLE(GetVertexAttribfvNV)
#define glGetVertexAttribivNV MANGLE(GetVertexAttribivNV)
#define glGlobalAlphaFactorbSUN MANGLE(GlobalAlphaFactorbSUN)
#define glGlobalAlphaFactordSUN MANGLE(GlobalAlphaFactordSUN)
#define glGlobalAlphaFactorfSUN MANGLE(GlobalAlphaFactorfSUN)
#define glGlobalAlphaFactoriSUN MANGLE(GlobalAlphaFactoriSUN)
#define glGlobalAlphaFactorsSUN MANGLE(GlobalAlphaFactorsSUN)
#define glGlobalAlphaFactorubSUN MANGLE(GlobalAlphaFactorubSUN)
#define glGlobalAlphaFactoruiSUN MANGLE(GlobalAlphaFactoruiSUN)
#define glGlobalAlphaFactorusSUN MANGLE(GlobalAlphaFactorusSUN)
#define glHint MANGLE(Hint)
#define glHintPGI MANGLE(HintPGI)
#define glHistogram MANGLE(Histogram)
#define glHistogramEXT MANGLE(HistogramEXT)
#define glIglooInterfaceSGIX MANGLE(IglooInterfaceSGIX)
#define glImageTransformParameterfHP MANGLE(ImageTransformParameterfHP)
#define glImageTransformParameterfvHP MANGLE(ImageTransformParameterfvHP)
#define glImageTransformParameteriHP MANGLE(ImageTransformParameteriHP)
#define glImageTransformParameterivHP MANGLE(ImageTransformParameterivHP)
#define glIndexFuncEXT MANGLE(IndexFuncEXT)
#define glIndexMask MANGLE(IndexMask)
#define glIndexMaterialEXT MANGLE(IndexMaterialEXT)
#define glIndexPointer MANGLE(IndexPointer)
#define glIndexPointerEXT MANGLE(IndexPointerEXT)
#define glIndexPointerListIBM MANGLE(IndexPointerListIBM)
#define glIndexd MANGLE(Indexd)
#define glIndexdv MANGLE(Indexdv)
#define glIndexf MANGLE(Indexf)
#define glIndexfv MANGLE(Indexfv)
#define glIndexi MANGLE(Indexi)
#define glIndexiv MANGLE(Indexiv)
#define glIndexs MANGLE(Indexs)
#define glIndexsv MANGLE(Indexsv)
#define glIndexub MANGLE(Indexub)
#define glIndexubv MANGLE(Indexubv)
#define glInitNames MANGLE(InitNames)
#define glInsertComponentEXT MANGLE(InsertComponentEXT)
#define glInstrumentsBufferSGIX MANGLE(InstrumentsBufferSGIX)
#define glInterleavedArrays MANGLE(InterleavedArrays)
#define glIsAsyncMarkerSGIX MANGLE(IsAsyncMarkerSGIX)
#define glIsEnabled MANGLE(IsEnabled)
#define glIsFenceNV MANGLE(IsFenceNV)
#define glIsList MANGLE(IsList)
#define glIsObjectBufferATI MANGLE(IsObjectBufferATI)
#define glIsProgramNV MANGLE(IsProgramNV)
#define glIsTexture MANGLE(IsTexture)
#define glIsTextureEXT MANGLE(IsTextureEXT)
#define glIsVariantEnabledEXT MANGLE(IsVariantEnabledEXT)
#define glLightEnviSGIX MANGLE(LightEnviSGIX)
#define glLightModelf MANGLE(LightModelf)
#define glLightModelfv MANGLE(LightModelfv)
#define glLightModeli MANGLE(LightModeli)
#define glLightModeliv MANGLE(LightModeliv)
#define glLightf MANGLE(Lightf)
#define glLightfv MANGLE(Lightfv)
#define glLighti MANGLE(Lighti)
#define glLightiv MANGLE(Lightiv)
#define glLineStipple MANGLE(LineStipple)
#define glLineWidth MANGLE(LineWidth)
#define glListBase MANGLE(ListBase)
#define glListParameterfSGIX MANGLE(ListParameterfSGIX)
#define glListParameterfvSGIX MANGLE(ListParameterfvSGIX)
#define glListParameteriSGIX MANGLE(ListParameteriSGIX)
#define glListParameterivSGIX MANGLE(ListParameterivSGIX)
#define glLoadIdentity MANGLE(LoadIdentity)
#define glLoadIdentityDeformationMapSGIX MANGLE(LoadIdentityDeformationMapSGIX)
#define glLoadMatrixd MANGLE(LoadMatrixd)
#define glLoadMatrixf MANGLE(LoadMatrixf)
#define glLoadName MANGLE(LoadName)
#define glLoadProgramNV MANGLE(LoadProgramNV)
#define glLoadTransposeMatrixd MANGLE(LoadTransposeMatrixd)
#define glLoadTransposeMatrixdARB MANGLE(LoadTransposeMatrixdARB)
#define glLoadTransposeMatrixf MANGLE(LoadTransposeMatrixf)
#define glLoadTransposeMatrixfARB MANGLE(LoadTransposeMatrixfARB)
#define glLockArraysEXT MANGLE(LockArraysEXT)
#define glLogicOp MANGLE(LogicOp)
#define glMap1d MANGLE(Map1d)
#define glMap1f MANGLE(Map1f)
#define glMap2d MANGLE(Map2d)
#define glMap2f MANGLE(Map2f)
#define glMapControlPointsNV MANGLE(MapControlPointsNV)
#define glMapGrid1d MANGLE(MapGrid1d)
#define glMapGrid1f MANGLE(MapGrid1f)
#define glMapGrid2d MANGLE(MapGrid2d)
#define glMapGrid2f MANGLE(MapGrid2f)
#define glMapParameterfvNV MANGLE(MapParameterfvNV)
#define glMapParameterivNV MANGLE(MapParameterivNV)
#define glMaterialf MANGLE(Materialf)
#define glMaterialfv MANGLE(Materialfv)
#define glMateriali MANGLE(Materiali)
#define glMaterialiv MANGLE(Materialiv)
#define glMatrixIndexPointerARB MANGLE(MatrixIndexPointerARB)
#define glMatrixIndexubvARB MANGLE(MatrixIndexubvARB)
#define glMatrixIndexuivARB MANGLE(MatrixIndexuivARB)
#define glMatrixIndexusvARB MANGLE(MatrixIndexusvARB)
#define glMatrixMode MANGLE(MatrixMode)
#define glMinmax MANGLE(Minmax)
#define glMinmaxEXT MANGLE(MinmaxEXT)
#define glMultMatrixd MANGLE(MultMatrixd)
#define glMultMatrixf MANGLE(MultMatrixf)
#define glMultTransposeMatrixd MANGLE(MultTransposeMatrixd)
#define glMultTransposeMatrixdARB MANGLE(MultTransposeMatrixdARB)
#define glMultTransposeMatrixf MANGLE(MultTransposeMatrixf)
#define glMultTransposeMatrixfARB MANGLE(MultTransposeMatrixfARB)
#define glMultiDrawArraysEXT MANGLE(MultiDrawArraysEXT)
#define glMultiDrawElementsEXT MANGLE(MultiDrawElementsEXT)
#define glMultiModeDrawArraysIBM MANGLE(MultiModeDrawArraysIBM)
#define glMultiModeDrawElementsIBM MANGLE(MultiModeDrawElementsIBM)
#define glMultiTexCoord1d MANGLE(MultiTexCoord1d)
#define glMultiTexCoord1dARB MANGLE(MultiTexCoord1dARB)
#define glMultiTexCoord1dv MANGLE(MultiTexCoord1dv)
#define glMultiTexCoord1dvARB MANGLE(MultiTexCoord1dvARB)
#define glMultiTexCoord1f MANGLE(MultiTexCoord1f)
#define glMultiTexCoord1fARB MANGLE(MultiTexCoord1fARB)
#define glMultiTexCoord1fv MANGLE(MultiTexCoord1fv)
#define glMultiTexCoord1fvARB MANGLE(MultiTexCoord1fvARB)
#define glMultiTexCoord1i MANGLE(MultiTexCoord1i)
#define glMultiTexCoord1iARB MANGLE(MultiTexCoord1iARB)
#define glMultiTexCoord1iv MANGLE(MultiTexCoord1iv)
#define glMultiTexCoord1ivARB MANGLE(MultiTexCoord1ivARB)
#define glMultiTexCoord1s MANGLE(MultiTexCoord1s)
#define glMultiTexCoord1sARB MANGLE(MultiTexCoord1sARB)
#define glMultiTexCoord1sv MANGLE(MultiTexCoord1sv)
#define glMultiTexCoord1svARB MANGLE(MultiTexCoord1svARB)
#define glMultiTexCoord2d MANGLE(MultiTexCoord2d)
#define glMultiTexCoord2dARB MANGLE(MultiTexCoord2dARB)
#define glMultiTexCoord2dv MANGLE(MultiTexCoord2dv)
#define glMultiTexCoord2dvARB MANGLE(MultiTexCoord2dvARB)
#define glMultiTexCoord2f MANGLE(MultiTexCoord2f)
#define glMultiTexCoord2fARB MANGLE(MultiTexCoord2fARB)
#define glMultiTexCoord2fv MANGLE(MultiTexCoord2fv)
#define glMultiTexCoord2fvARB MANGLE(MultiTexCoord2fvARB)
#define glMultiTexCoord2i MANGLE(MultiTexCoord2i)
#define glMultiTexCoord2iARB MANGLE(MultiTexCoord2iARB)
#define glMultiTexCoord2iv MANGLE(MultiTexCoord2iv)
#define glMultiTexCoord2ivARB MANGLE(MultiTexCoord2ivARB)
#define glMultiTexCoord2s MANGLE(MultiTexCoord2s)
#define glMultiTexCoord2sARB MANGLE(MultiTexCoord2sARB)
#define glMultiTexCoord2sv MANGLE(MultiTexCoord2sv)
#define glMultiTexCoord2svARB MANGLE(MultiTexCoord2svARB)
#define glMultiTexCoord3d MANGLE(MultiTexCoord3d)
#define glMultiTexCoord3dARB MANGLE(MultiTexCoord3dARB)
#define glMultiTexCoord3dv MANGLE(MultiTexCoord3dv)
#define glMultiTexCoord3dvARB MANGLE(MultiTexCoord3dvARB)
#define glMultiTexCoord3f MANGLE(MultiTexCoord3f)
#define glMultiTexCoord3fARB MANGLE(MultiTexCoord3fARB)
#define glMultiTexCoord3fv MANGLE(MultiTexCoord3fv)
#define glMultiTexCoord3fvARB MANGLE(MultiTexCoord3fvARB)
#define glMultiTexCoord3i MANGLE(MultiTexCoord3i)
#define glMultiTexCoord3iARB MANGLE(MultiTexCoord3iARB)
#define glMultiTexCoord3iv MANGLE(MultiTexCoord3iv)
#define glMultiTexCoord3ivARB MANGLE(MultiTexCoord3ivARB)
#define glMultiTexCoord3s MANGLE(MultiTexCoord3s)
#define glMultiTexCoord3sARB MANGLE(MultiTexCoord3sARB)
#define glMultiTexCoord3sv MANGLE(MultiTexCoord3sv)
#define glMultiTexCoord3svARB MANGLE(MultiTexCoord3svARB)
#define glMultiTexCoord4d MANGLE(MultiTexCoord4d)
#define glMultiTexCoord4dARB MANGLE(MultiTexCoord4dARB)
#define glMultiTexCoord4dv MANGLE(MultiTexCoord4dv)
#define glMultiTexCoord4dvARB MANGLE(MultiTexCoord4dvARB)
#define glMultiTexCoord4f MANGLE(MultiTexCoord4f)
#define glMultiTexCoord4fARB MANGLE(MultiTexCoord4fARB)
#define glMultiTexCoord4fv MANGLE(MultiTexCoord4fv)
#define glMultiTexCoord4fvARB MANGLE(MultiTexCoord4fvARB)
#define glMultiTexCoord4i MANGLE(MultiTexCoord4i)
#define glMultiTexCoord4iARB MANGLE(MultiTexCoord4iARB)
#define glMultiTexCoord4iv MANGLE(MultiTexCoord4iv)
#define glMultiTexCoord4ivARB MANGLE(MultiTexCoord4ivARB)
#define glMultiTexCoord4s MANGLE(MultiTexCoord4s)
#define glMultiTexCoord4sARB MANGLE(MultiTexCoord4sARB)
#define glMultiTexCoord4sv MANGLE(MultiTexCoord4sv)
#define glMultiTexCoord4svARB MANGLE(MultiTexCoord4svARB)
#define glNewList MANGLE(NewList)
#define glNewObjectBufferATI MANGLE(NewObjectBufferATI)
#define glNewTraceMESA MANGLE(NewTraceMESA)
#define glNormal3b MANGLE(Normal3b)
#define glNormal3bv MANGLE(Normal3bv)
#define glNormal3d MANGLE(Normal3d)
#define glNormal3dv MANGLE(Normal3dv)
#define glNormal3f MANGLE(Normal3f)
#define glNormal3fVertex3fSUN MANGLE(Normal3fVertex3fSUN)
#define glNormal3fVertex3fvSUN MANGLE(Normal3fVertex3fvSUN)
#define glNormal3fv MANGLE(Normal3fv)
#define glNormal3i MANGLE(Normal3i)
#define glNormal3iv MANGLE(Normal3iv)
#define glNormal3s MANGLE(Normal3s)
#define glNormal3sv MANGLE(Normal3sv)
#define glNormalPointer MANGLE(NormalPointer)
#define glNormalPointerEXT MANGLE(NormalPointerEXT)
#define glNormalPointerListIBM MANGLE(NormalPointerListIBM)
#define glNormalPointervINTEL MANGLE(NormalPointervINTEL)
#define glNormalStream3b MANGLE(NormalStream3b)
#define glNormalStream3bv MANGLE(NormalStream3bv)
#define glNormalStream3d MANGLE(NormalStream3d)
#define glNormalStream3dv MANGLE(NormalStream3dv)
#define glNormalStream3f MANGLE(NormalStream3f)
#define glNormalStream3fv MANGLE(NormalStream3fv)
#define glNormalStream3i MANGLE(NormalStream3i)
#define glNormalStream3iv MANGLE(NormalStream3iv)
#define glNormalStream3s MANGLE(NormalStream3s)
#define glNormalStream3sv MANGLE(NormalStream3sv)
#define glOrtho MANGLE(Ortho)
#define glPNTrianglesfATI MANGLE(PNTrianglesfATI)
#define glPNTrianglesiATI MANGLE(PNTrianglesiATI)
#define glPassTexCoordATI MANGLE(PassTexCoordATI)
#define glPassThrough MANGLE(PassThrough)
#define glPixelMapfv MANGLE(PixelMapfv)
#define glPixelMapuiv MANGLE(PixelMapuiv)
#define glPixelMapusv MANGLE(PixelMapusv)
#define glPixelStoref MANGLE(PixelStoref)
#define glPixelStorei MANGLE(PixelStorei)
#define glPixelTexGenParameterfSGIS MANGLE(PixelTexGenParameterfSGIS)
#define glPixelTexGenParameterfvSGIS MANGLE(PixelTexGenParameterfvSGIS)
#define glPixelTexGenParameteriSGIS MANGLE(PixelTexGenParameteriSGIS)
#define glPixelTexGenParameterivSGIS MANGLE(PixelTexGenParameterivSGIS)
#define glPixelTexGenSGIX MANGLE(PixelTexGenSGIX)
#define glPixelTransferf MANGLE(PixelTransferf)
#define glPixelTransferi MANGLE(PixelTransferi)
#define glPixelTransformParameterfEXT MANGLE(PixelTransformParameterfEXT)
#define glPixelTransformParameterfvEXT MANGLE(PixelTransformParameterfvEXT)
#define glPixelTransformParameteriEXT MANGLE(PixelTransformParameteriEXT)
#define glPixelTransformParameterivEXT MANGLE(PixelTransformParameterivEXT)
#define glPixelZoom MANGLE(PixelZoom)
#define glPointParameterfARB MANGLE(PointParameterfARB)
#define glPointParameterfEXT MANGLE(PointParameterfEXT)
#define glPointParameterfSGIS MANGLE(PointParameterfSGIS)
#define glPointParameterfvARB MANGLE(PointParameterfvARB)
#define glPointParameterfvEXT MANGLE(PointParameterfvEXT)
#define glPointParameterfvSGIS MANGLE(PointParameterfvSGIS)
#define glPointSize MANGLE(PointSize)
#define glPollAsyncSGIX MANGLE(PollAsyncSGIX)
#define glPollInstrumentsSGIX MANGLE(PollInstrumentsSGIX)
#define glPolygonMode MANGLE(PolygonMode)
#define glPolygonOffset MANGLE(PolygonOffset)
#define glPolygonOffsetEXT MANGLE(PolygonOffsetEXT)
#define glPolygonStipple MANGLE(PolygonStipple)
#define glPopAttrib MANGLE(PopAttrib)
#define glPopClientAttrib MANGLE(PopClientAttrib)
#define glPopMatrix MANGLE(PopMatrix)
#define glPopName MANGLE(PopName)
#define glPrioritizeTextures MANGLE(PrioritizeTextures)
#define glPrioritizeTexturesEXT MANGLE(PrioritizeTexturesEXT)
#define glProgramParameter4dNV MANGLE(ProgramParameter4dNV)
#define glProgramParameter4dvNV MANGLE(ProgramParameter4dvNV)
#define glProgramParameter4fNV MANGLE(ProgramParameter4fNV)
#define glProgramParameter4fvNV MANGLE(ProgramParameter4fvNV)
#define glProgramParameters4dvNV MANGLE(ProgramParameters4dvNV)
#define glProgramParameters4fvNV MANGLE(ProgramParameters4fvNV)
#define glPushAttrib MANGLE(PushAttrib)
#define glPushClientAttrib MANGLE(PushClientAttrib)
#define glPushMatrix MANGLE(PushMatrix)
#define glPushName MANGLE(PushName)
#define glRasterPos2d MANGLE(RasterPos2d)
#define glRasterPos2dv MANGLE(RasterPos2dv)
#define glRasterPos2f MANGLE(RasterPos2f)
#define glRasterPos2fv MANGLE(RasterPos2fv)
#define glRasterPos2i MANGLE(RasterPos2i)
#define glRasterPos2iv MANGLE(RasterPos2iv)
#define glRasterPos2s MANGLE(RasterPos2s)
#define glRasterPos2sv MANGLE(RasterPos2sv)
#define glRasterPos3d MANGLE(RasterPos3d)
#define glRasterPos3dv MANGLE(RasterPos3dv)
#define glRasterPos3f MANGLE(RasterPos3f)
#define glRasterPos3fv MANGLE(RasterPos3fv)
#define glRasterPos3i MANGLE(RasterPos3i)
#define glRasterPos3iv MANGLE(RasterPos3iv)
#define glRasterPos3s MANGLE(RasterPos3s)
#define glRasterPos3sv MANGLE(RasterPos3sv)
#define glRasterPos4d MANGLE(RasterPos4d)
#define glRasterPos4dv MANGLE(RasterPos4dv)
#define glRasterPos4f MANGLE(RasterPos4f)
#define glRasterPos4fv MANGLE(RasterPos4fv)
#define glRasterPos4i MANGLE(RasterPos4i)
#define glRasterPos4iv MANGLE(RasterPos4iv)
#define glRasterPos4s MANGLE(RasterPos4s)
#define glRasterPos4sv MANGLE(RasterPos4sv)
#define glReadBuffer MANGLE(ReadBuffer)
#define glReadInstrumentsSGIX MANGLE(ReadInstrumentsSGIX)
#define glReadPixels MANGLE(ReadPixels)
#define glRectd MANGLE(Rectd)
#define glRectdv MANGLE(Rectdv)
#define glRectf MANGLE(Rectf)
#define glRectfv MANGLE(Rectfv)
#define glRecti MANGLE(Recti)
#define glRectiv MANGLE(Rectiv)
#define glRects MANGLE(Rects)
#define glRectsv MANGLE(Rectsv)
#define glReferencePlaneSGIX MANGLE(ReferencePlaneSGIX)
#define glRenderMode MANGLE(RenderMode)
#define glReplacementCodePointerSUN MANGLE(ReplacementCodePointerSUN)
#define glReplacementCodeubSUN MANGLE(ReplacementCodeubSUN)
#define glReplacementCodeubvSUN MANGLE(ReplacementCodeubvSUN)
#define glReplacementCodeuiColor3fVertex3fSUN MANGLE(ReplacementCodeuiColor3fVertex3fSUN)
#define glReplacementCodeuiColor3fVertex3fvSUN MANGLE(ReplacementCodeuiColor3fVertex3fvSUN)
#define glReplacementCodeuiColor4fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiColor4fNormal3fVertex3fSUN)
#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiColor4fNormal3fVertex3fvSUN)
#define glReplacementCodeuiColor4ubVertex3fSUN MANGLE(ReplacementCodeuiColor4ubVertex3fSUN)
#define glReplacementCodeuiColor4ubVertex3fvSUN MANGLE(ReplacementCodeuiColor4ubVertex3fvSUN)
#define glReplacementCodeuiNormal3fVertex3fSUN MANGLE(ReplacementCodeuiNormal3fVertex3fSUN)
#define glReplacementCodeuiNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiNormal3fVertex3fvSUN)
#define glReplacementCodeuiSUN MANGLE(ReplacementCodeuiSUN)
#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)
#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)
#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)
#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)
#define glReplacementCodeuiTexCoord2fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fVertex3fSUN)
#define glReplacementCodeuiTexCoord2fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fVertex3fvSUN)
#define glReplacementCodeuiVertex3fSUN MANGLE(ReplacementCodeuiVertex3fSUN)
#define glReplacementCodeuiVertex3fvSUN MANGLE(ReplacementCodeuiVertex3fvSUN)
#define glReplacementCodeuivSUN MANGLE(ReplacementCodeuivSUN)
#define glReplacementCodeusSUN MANGLE(ReplacementCodeusSUN)
#define glReplacementCodeusvSUN MANGLE(ReplacementCodeusvSUN)
#define glRequestResidentProgramsNV MANGLE(RequestResidentProgramsNV)
#define glResetHistogram MANGLE(ResetHistogram)
#define glResetHistogramEXT MANGLE(ResetHistogramEXT)
#define glResetMinmax MANGLE(ResetMinmax)
#define glResetMinmaxEXT MANGLE(ResetMinmaxEXT)
#define glResizeBuffersMESA MANGLE(ResizeBuffersMESA)
#define glRotated MANGLE(Rotated)
#define glRotatef MANGLE(Rotatef)
#define glSampleCoverage MANGLE(SampleCoverage)
#define glSampleCoverageARB MANGLE(SampleCoverageARB)
#define glSampleMapATI MANGLE(SampleMapATI)
#define glSampleMaskEXT MANGLE(SampleMaskEXT)
#define glSampleMaskSGIS MANGLE(SampleMaskSGIS)
#define glSamplePass MANGLE(SamplePass)
#define glSamplePatternEXT MANGLE(SamplePatternEXT)
#define glSamplePatternSGIS MANGLE(SamplePatternSGIS)
#define glScaled MANGLE(Scaled)
#define glScalef MANGLE(Scalef)
#define glScissor MANGLE(Scissor)
#define glSecondaryColor3bEXT MANGLE(SecondaryColor3bEXT)
#define glSecondaryColor3bvEXT MANGLE(SecondaryColor3bvEXT)
#define glSecondaryColor3dEXT MANGLE(SecondaryColor3dEXT)
#define glSecondaryColor3dvEXT MANGLE(SecondaryColor3dvEXT)
#define glSecondaryColor3fEXT MANGLE(SecondaryColor3fEXT)
#define glSecondaryColor3fvEXT MANGLE(SecondaryColor3fvEXT)
#define glSecondaryColor3iEXT MANGLE(SecondaryColor3iEXT)
#define glSecondaryColor3ivEXT MANGLE(SecondaryColor3ivEXT)
#define glSecondaryColor3sEXT MANGLE(SecondaryColor3sEXT)
#define glSecondaryColor3svEXT MANGLE(SecondaryColor3svEXT)
#define glSecondaryColor3ubEXT MANGLE(SecondaryColor3ubEXT)
#define glSecondaryColor3ubvEXT MANGLE(SecondaryColor3ubvEXT)
#define glSecondaryColor3uiEXT MANGLE(SecondaryColor3uiEXT)
#define glSecondaryColor3uivEXT MANGLE(SecondaryColor3uivEXT)
#define glSecondaryColor3usEXT MANGLE(SecondaryColor3usEXT)
#define glSecondaryColor3usvEXT MANGLE(SecondaryColor3usvEXT)
#define glSecondaryColorPointerEXT MANGLE(SecondaryColorPointerEXT)
#define glSecondaryColorPointerListIBM MANGLE(SecondaryColorPointerListIBM)
#define glSelectBuffer MANGLE(SelectBuffer)
#define glSeparableFilter2D MANGLE(SeparableFilter2D)
#define glSeparableFilter2DEXT MANGLE(SeparableFilter2DEXT)
#define glSetFenceNV MANGLE(SetFenceNV)
#define glSetFragmentShaderConstantATI MANGLE(SetFragmentShaderConstantATI)
#define glSetInvariantEXT MANGLE(SetInvariantEXT)
#define glSetLocalConstantEXT MANGLE(SetLocalConstantEXT)
#define glShadeModel MANGLE(ShadeModel)
#define glShaderOp1EXT MANGLE(ShaderOp1EXT)
#define glShaderOp2EXT MANGLE(ShaderOp2EXT)
#define glShaderOp3EXT MANGLE(ShaderOp3EXT)
#define glSharpenTexFuncSGIS MANGLE(SharpenTexFuncSGIS)
#define glSpriteParameterfSGIX MANGLE(SpriteParameterfSGIX)
#define glSpriteParameterfvSGIX MANGLE(SpriteParameterfvSGIX)
#define glSpriteParameteriSGIX MANGLE(SpriteParameteriSGIX)
#define glSpriteParameterivSGIX MANGLE(SpriteParameterivSGIX)
#define glStartInstrumentsSGIX MANGLE(StartInstrumentsSGIX)
#define glStencilFunc MANGLE(StencilFunc)
#define glStencilMask MANGLE(StencilMask)
#define glStencilOp MANGLE(StencilOp)
#define glStopInstrumentsSGIX MANGLE(StopInstrumentsSGIX)
#define glSwizzleEXT MANGLE(SwizzleEXT)
#define glTagSampleBufferSGIX MANGLE(TagSampleBufferSGIX)
#define glTangent3bEXT MANGLE(Tangent3bEXT)
#define glTangent3bvEXT MANGLE(Tangent3bvEXT)
#define glTangent3dEXT MANGLE(Tangent3dEXT)
#define glTangent3dvEXT MANGLE(Tangent3dvEXT)
#define glTangent3fEXT MANGLE(Tangent3fEXT)
#define glTangent3fvEXT MANGLE(Tangent3fvEXT)
#define glTangent3iEXT MANGLE(Tangent3iEXT)
#define glTangent3ivEXT MANGLE(Tangent3ivEXT)
#define glTangent3sEXT MANGLE(Tangent3sEXT)
#define glTangent3svEXT MANGLE(Tangent3svEXT)
#define glTangentPointerEXT MANGLE(TangentPointerEXT)
#define glTbufferMask3DFX MANGLE(TbufferMask3DFX)
#define glTestFenceNV MANGLE(TestFenceNV)
#define glTexBumpParameterfvATI MANGLE(TexBumpParameterfvATI)
#define glTexBumpParameterivATI MANGLE(TexBumpParameterivATI)
#define glTexCoord1d MANGLE(TexCoord1d)
#define glTexCoord1dv MANGLE(TexCoord1dv)
#define glTexCoord1f MANGLE(TexCoord1f)
#define glTexCoord1fv MANGLE(TexCoord1fv)
#define glTexCoord1i MANGLE(TexCoord1i)
#define glTexCoord1iv MANGLE(TexCoord1iv)
#define glTexCoord1s MANGLE(TexCoord1s)
#define glTexCoord1sv MANGLE(TexCoord1sv)
#define glTexCoord2d MANGLE(TexCoord2d)
#define glTexCoord2dv MANGLE(TexCoord2dv)
#define glTexCoord2f MANGLE(TexCoord2f)
#define glTexCoord2fColor3fVertex3fSUN MANGLE(TexCoord2fColor3fVertex3fSUN)
#define glTexCoord2fColor3fVertex3fvSUN MANGLE(TexCoord2fColor3fVertex3fvSUN)
#define glTexCoord2fColor4fNormal3fVertex3fSUN MANGLE(TexCoord2fColor4fNormal3fVertex3fSUN)
#define glTexCoord2fColor4fNormal3fVertex3fvSUN MANGLE(TexCoord2fColor4fNormal3fVertex3fvSUN)
#define glTexCoord2fColor4ubVertex3fSUN MANGLE(TexCoord2fColor4ubVertex3fSUN)
#define glTexCoord2fColor4ubVertex3fvSUN MANGLE(TexCoord2fColor4ubVertex3fvSUN)
#define glTexCoord2fNormal3fVertex3fSUN MANGLE(TexCoord2fNormal3fVertex3fSUN)
#define glTexCoord2fNormal3fVertex3fvSUN MANGLE(TexCoord2fNormal3fVertex3fvSUN)
#define glTexCoord2fVertex3fSUN MANGLE(TexCoord2fVertex3fSUN)
#define glTexCoord2fVertex3fvSUN MANGLE(TexCoord2fVertex3fvSUN)
#define glTexCoord2fv MANGLE(TexCoord2fv)
#define glTexCoord2i MANGLE(TexCoord2i)
#define glTexCoord2iv MANGLE(TexCoord2iv)
#define glTexCoord2s MANGLE(TexCoord2s)
#define glTexCoord2sv MANGLE(TexCoord2sv)
#define glTexCoord3d MANGLE(TexCoord3d)
#define glTexCoord3dv MANGLE(TexCoord3dv)
#define glTexCoord3f MANGLE(TexCoord3f)
#define glTexCoord3fv MANGLE(TexCoord3fv)
#define glTexCoord3i MANGLE(TexCoord3i)
#define glTexCoord3iv MANGLE(TexCoord3iv)
#define glTexCoord3s MANGLE(TexCoord3s)
#define glTexCoord3sv MANGLE(TexCoord3sv)
#define glTexCoord4d MANGLE(TexCoord4d)
#define glTexCoord4dv MANGLE(TexCoord4dv)
#define glTexCoord4f MANGLE(TexCoord4f)
#define glTexCoord4fColor4fNormal3fVertex4fSUN MANGLE(TexCoord4fColor4fNormal3fVertex4fSUN)
#define glTexCoord4fColor4fNormal3fVertex4fvSUN MANGLE(TexCoord4fColor4fNormal3fVertex4fvSUN)
#define glTexCoord4fVertex4fSUN MANGLE(TexCoord4fVertex4fSUN)
#define glTexCoord4fVertex4fvSUN MANGLE(TexCoord4fVertex4fvSUN)
#define glTexCoord4fv MANGLE(TexCoord4fv)
#define glTexCoord4i MANGLE(TexCoord4i)
#define glTexCoord4iv MANGLE(TexCoord4iv)
#define glTexCoord4s MANGLE(TexCoord4s)
#define glTexCoord4sv MANGLE(TexCoord4sv)
#define glTexCoordPointer MANGLE(TexCoordPointer)
#define glTexCoordPointerEXT MANGLE(TexCoordPointerEXT)
#define glTexCoordPointerListIBM MANGLE(TexCoordPointerListIBM)
#define glTexCoordPointervINTEL MANGLE(TexCoordPointervINTEL)
#define glTexEnvf MANGLE(TexEnvf)
#define glTexEnvfv MANGLE(TexEnvfv)
#define glTexEnvi MANGLE(TexEnvi)
#define glTexEnviv MANGLE(TexEnviv)
#define glTexFilterFuncSGIS MANGLE(TexFilterFuncSGIS)
#define glTexGend MANGLE(TexGend)
#define glTexGendv MANGLE(TexGendv)
#define glTexGenf MANGLE(TexGenf)
#define glTexGenfv MANGLE(TexGenfv)
#define glTexGeni MANGLE(TexGeni)
#define glTexGeniv MANGLE(TexGeniv)
#define glTexImage1D MANGLE(TexImage1D)
#define glTexImage2D MANGLE(TexImage2D)
#define glTexImage3D MANGLE(TexImage3D)
#define glTexImage3DEXT MANGLE(TexImage3DEXT)
#define glTexImage4DSGIS MANGLE(TexImage4DSGIS)
#define glTexParameterf MANGLE(TexParameterf)
#define glTexParameterfv MANGLE(TexParameterfv)
#define glTexParameteri MANGLE(TexParameteri)
#define glTexParameteriv MANGLE(TexParameteriv)
#define glTexSubImage1D MANGLE(TexSubImage1D)
#define glTexSubImage1DEXT MANGLE(TexSubImage1DEXT)
#define glTexSubImage2D MANGLE(TexSubImage2D)
#define glTexSubImage2DEXT MANGLE(TexSubImage2DEXT)
#define glTexSubImage3D MANGLE(TexSubImage3D)
#define glTexSubImage3DEXT MANGLE(TexSubImage3DEXT)
#define glTexSubImage4DSGIS MANGLE(TexSubImage4DSGIS)
#define glTextureColorMaskSGIS MANGLE(TextureColorMaskSGIS)
#define glTextureLightEXT MANGLE(TextureLightEXT)
#define glTextureMaterialEXT MANGLE(TextureMaterialEXT)
#define glTextureNormalEXT MANGLE(TextureNormalEXT)
#define glTraceAssertAttribMESA MANGLE(TraceAssertAttribMESA)
#define glTraceCommentMESA MANGLE(TraceCommentMESA)
#define glTraceListMESA MANGLE(TraceListMESA)
#define glTracePointerMESA MANGLE(TracePointerMESA)
#define glTracePointerRangeMESA MANGLE(TracePointerRangeMESA)
#define glTraceTextureMESA MANGLE(TraceTextureMESA)
#define glTrackMatrixNV MANGLE(TrackMatrixNV)
#define glTranslated MANGLE(Translated)
#define glTranslatef MANGLE(Translatef)
#define glUnlockArraysEXT MANGLE(UnlockArraysEXT)
#define glUpdateObjectBufferATI MANGLE(UpdateObjectBufferATI)
#define glVariantArrayObjectATI MANGLE(VariantArrayObjectATI)
#define glVariantPointerEXT MANGLE(VariantPointerEXT)
#define glVariantbvEXT MANGLE(VariantbvEXT)
#define glVariantdvEXT MANGLE(VariantdvEXT)
#define glVariantfvEXT MANGLE(VariantfvEXT)
#define glVariantivEXT MANGLE(VariantivEXT)
#define glVariantsvEXT MANGLE(VariantsvEXT)
#define glVariantubvEXT MANGLE(VariantubvEXT)
#define glVariantuivEXT MANGLE(VariantuivEXT)
#define glVariantusvEXT MANGLE(VariantusvEXT)
#define glVertex2d MANGLE(Vertex2d)
#define glVertex2dv MANGLE(Vertex2dv)
#define glVertex2f MANGLE(Vertex2f)
#define glVertex2fv MANGLE(Vertex2fv)
#define glVertex2i MANGLE(Vertex2i)
#define glVertex2iv MANGLE(Vertex2iv)
#define glVertex2s MANGLE(Vertex2s)
#define glVertex2sv MANGLE(Vertex2sv)
#define glVertex3d MANGLE(Vertex3d)
#define glVertex3dv MANGLE(Vertex3dv)
#define glVertex3f MANGLE(Vertex3f)
#define glVertex3fv MANGLE(Vertex3fv)
#define glVertex3i MANGLE(Vertex3i)
#define glVertex3iv MANGLE(Vertex3iv)
#define glVertex3s MANGLE(Vertex3s)
#define glVertex3sv MANGLE(Vertex3sv)
#define glVertex4d MANGLE(Vertex4d)
#define glVertex4dv MANGLE(Vertex4dv)
#define glVertex4f MANGLE(Vertex4f)
#define glVertex4fv MANGLE(Vertex4fv)
#define glVertex4i MANGLE(Vertex4i)
#define glVertex4iv MANGLE(Vertex4iv)
#define glVertex4s MANGLE(Vertex4s)
#define glVertex4sv MANGLE(Vertex4sv)
#define glVertexArrayRangeNV MANGLE(VertexArrayRangeNV)
#define glVertexAttrib1dNV MANGLE(VertexAttrib1dNV)
#define glVertexAttrib1dvNV MANGLE(VertexAttrib1dvNV)
#define glVertexAttrib1fNV MANGLE(VertexAttrib1fNV)
#define glVertexAttrib1fvNV MANGLE(VertexAttrib1fvNV)
#define glVertexAttrib1sNV MANGLE(VertexAttrib1sNV)
#define glVertexAttrib1svNV MANGLE(VertexAttrib1svNV)
#define glVertexAttrib2dNV MANGLE(VertexAttrib2dNV)
#define glVertexAttrib2dvNV MANGLE(VertexAttrib2dvNV)
#define glVertexAttrib2fNV MANGLE(VertexAttrib2fNV)
#define glVertexAttrib2fvNV MANGLE(VertexAttrib2fvNV)
#define glVertexAttrib2sNV MANGLE(VertexAttrib2sNV)
#define glVertexAttrib2svNV MANGLE(VertexAttrib2svNV)
#define glVertexAttrib3dNV MANGLE(VertexAttrib3dNV)
#define glVertexAttrib3dvNV MANGLE(VertexAttrib3dvNV)
#define glVertexAttrib3fNV MANGLE(VertexAttrib3fNV)
#define glVertexAttrib3fvNV MANGLE(VertexAttrib3fvNV)
#define glVertexAttrib3sNV MANGLE(VertexAttrib3sNV)
#define glVertexAttrib3svNV MANGLE(VertexAttrib3svNV)
#define glVertexAttrib4dNV MANGLE(VertexAttrib4dNV)
#define glVertexAttrib4dvNV MANGLE(VertexAttrib4dvNV)
#define glVertexAttrib4fNV MANGLE(VertexAttrib4fNV)
#define glVertexAttrib4fvNV MANGLE(VertexAttrib4fvNV)
#define glVertexAttrib4sNV MANGLE(VertexAttrib4sNV)
#define glVertexAttrib4svNV MANGLE(VertexAttrib4svNV)
#define glVertexAttrib4ubNV MANGLE(VertexAttrib4ubNV)
#define glVertexAttrib4ubvNV MANGLE(VertexAttrib4ubvNV)
#define glVertexAttribPointerNV MANGLE(VertexAttribPointerNV)
#define glVertexAttribs1dvNV MANGLE(VertexAttribs1dvNV)
#define glVertexAttribs1fvNV MANGLE(VertexAttribs1fvNV)
#define glVertexAttribs1svNV MANGLE(VertexAttribs1svNV)
#define glVertexAttribs2dvNV MANGLE(VertexAttribs2dvNV)
#define glVertexAttribs2fvNV MANGLE(VertexAttribs2fvNV)
#define glVertexAttribs2svNV MANGLE(VertexAttribs2svNV)
#define glVertexAttribs3dvNV MANGLE(VertexAttribs3dvNV)
#define glVertexAttribs3fvNV MANGLE(VertexAttribs3fvNV)
#define glVertexAttribs3svNV MANGLE(VertexAttribs3svNV)
#define glVertexAttribs4dvNV MANGLE(VertexAttribs4dvNV)
#define glVertexAttribs4fvNV MANGLE(VertexAttribs4fvNV)
#define glVertexAttribs4svNV MANGLE(VertexAttribs4svNV)
#define glVertexAttribs4ubvNV MANGLE(VertexAttribs4ubvNV)
#define glVertexBlendARB MANGLE(VertexBlendARB)
#define glVertexBlendEnvf MANGLE(VertexBlendEnvf)
#define glVertexBlendEnvi MANGLE(VertexBlendEnvi)
#define glVertexPointer MANGLE(VertexPointer)
#define glVertexPointerEXT MANGLE(VertexPointerEXT)
#define glVertexPointerListIBM MANGLE(VertexPointerListIBM)
#define glVertexPointervINTEL MANGLE(VertexPointervINTEL)
#define glVertexStream1d MANGLE(VertexStream1d)
#define glVertexStream1dv MANGLE(VertexStream1dv)
#define glVertexStream1f MANGLE(VertexStream1f)
#define glVertexStream1fv MANGLE(VertexStream1fv)
#define glVertexStream1i MANGLE(VertexStream1i)
#define glVertexStream1iv MANGLE(VertexStream1iv)
#define glVertexStream1s MANGLE(VertexStream1s)
#define glVertexStream1sv MANGLE(VertexStream1sv)
#define glVertexStream2d MANGLE(VertexStream2d)
#define glVertexStream2dv MANGLE(VertexStream2dv)
#define glVertexStream2f MANGLE(VertexStream2f)
#define glVertexStream2fv MANGLE(VertexStream2fv)
#define glVertexStream2i MANGLE(VertexStream2i)
#define glVertexStream2iv MANGLE(VertexStream2iv)
#define glVertexStream2s MANGLE(VertexStream2s)
#define glVertexStream2sv MANGLE(VertexStream2sv)
#define glVertexStream3d MANGLE(VertexStream3d)
#define glVertexStream3dv MANGLE(VertexStream3dv)
#define glVertexStream3f MANGLE(VertexStream3f)
#define glVertexStream3fv MANGLE(VertexStream3fv)
#define glVertexStream3i MANGLE(VertexStream3i)
#define glVertexStream3iv MANGLE(VertexStream3iv)
#define glVertexStream3s MANGLE(VertexStream3s)
#define glVertexStream3sv MANGLE(VertexStream3sv)
#define glVertexStream4d MANGLE(VertexStream4d)
#define glVertexStream4dv MANGLE(VertexStream4dv)
#define glVertexStream4f MANGLE(VertexStream4f)
#define glVertexStream4fv MANGLE(VertexStream4fv)
#define glVertexStream4i MANGLE(VertexStream4i)
#define glVertexStream4iv MANGLE(VertexStream4iv)
#define glVertexStream4s MANGLE(VertexStream4s)
#define glVertexStream4sv MANGLE(VertexStream4sv)
#define glVertexWeightPointerEXT MANGLE(VertexWeightPointerEXT)
#define glVertexWeightfEXT MANGLE(VertexWeightfEXT)
#define glVertexWeightfvEXT MANGLE(VertexWeightfvEXT)
#define glViewport MANGLE(Viewport)
#define glWeightPointerARB MANGLE(WeightPointerARB)
#define glWeightbvARB MANGLE(WeightbvARB)
#define glWeightdvARB MANGLE(WeightdvARB)
#define glWeightfvARB MANGLE(WeightfvARB)
#define glWeightivARB MANGLE(WeightivARB)
#define glWeightsvARB MANGLE(WeightsvARB)
#define glWeightubvARB MANGLE(WeightubvARB)
#define glWeightuivARB MANGLE(WeightuivARB)
#define glWeightusvARB MANGLE(WeightusvARB)
#define glWindowPos2dMESA MANGLE(WindowPos2dMESA)
#define glWindowPos2dvMESA MANGLE(WindowPos2dvMESA)
#define glWindowPos2fMESA MANGLE(WindowPos2fMESA)
#define glWindowPos2fvMESA MANGLE(WindowPos2fvMESA)
#define glWindowPos2iMESA MANGLE(WindowPos2iMESA)
#define glWindowPos2ivMESA MANGLE(WindowPos2ivMESA)
#define glWindowPos2sMESA MANGLE(WindowPos2sMESA)
#define glWindowPos2svMESA MANGLE(WindowPos2svMESA)
#define glWindowPos3dMESA MANGLE(WindowPos3dMESA)
#define glWindowPos3dvMESA MANGLE(WindowPos3dvMESA)
#define glWindowPos3fMESA MANGLE(WindowPos3fMESA)
#define glWindowPos3fvMESA MANGLE(WindowPos3fvMESA)
#define glWindowPos3iMESA MANGLE(WindowPos3iMESA)
#define glWindowPos3ivMESA MANGLE(WindowPos3ivMESA)
#define glWindowPos3sMESA MANGLE(WindowPos3sMESA)
#define glWindowPos3svMESA MANGLE(WindowPos3svMESA)
#define glWindowPos4dMESA MANGLE(WindowPos4dMESA)
#define glWindowPos4dvMESA MANGLE(WindowPos4dvMESA)
#define glWindowPos4fMESA MANGLE(WindowPos4fMESA)
#define glWindowPos4fvMESA MANGLE(WindowPos4fvMESA)
#define glWindowPos4iMESA MANGLE(WindowPos4iMESA)
#define glWindowPos4ivMESA MANGLE(WindowPos4ivMESA)
#define glWindowPos4sMESA MANGLE(WindowPos4sMESA)
#define glWindowPos4svMESA MANGLE(WindowPos4svMESA)
#define glWriteMaskEXT MANGLE(WriteMaskEXT)
 
#endif /* GL_MANGLE_H */
/shark/trunk/ports/mesa/include/GL/internal/glcore.h
0,0 → 1,431
/* $XFree86: xc/lib/GL/include/GL/internal/glcore.h,v 1.7 2001/03/25 05:32:00 tsi Exp $ */
#ifndef __gl_core_h_
#define __gl_core_h_
 
/*
** License Applicability. Except to the extent portions of this file are
** made subject to an alternative license as permitted in the SGI Free
** Software License B, Version 1.1 (the "License"), the contents of this
** file are subject only to the provisions of the License. You may not use
** this file except in compliance with the License. You may obtain a copy
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
**
** http://oss.sgi.com/projects/FreeB
**
** Note that, as provided in the License, the Software is distributed on an
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
**
** Original Code. The Original Code is: OpenGL Sample Implementation,
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
** Copyright in any portions created by third parties is as indicated
** elsewhere herein. All Rights Reserved.
**
** Additional Notice Provisions: The application programming interfaces
** established by SGI in conjunction with the Original Code are The
** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
** Window System(R) (Version 1.3), released October 19, 1998. This software
** was created using the OpenGL(R) version 1.2.1 Sample Implementation
** published by SGI, but has not been independently verified as being
** compliant with the OpenGL(R) version 1.2.1 Specification.
**
*/
 
#ifndef XFree86LOADER
#include <sys/types.h>
#endif
 
#define GL_CORE_SGI 1
#define GL_CORE_MESA 2
 
typedef struct __GLcontextRec __GLcontext;
typedef struct __GLinterfaceRec __GLinterface;
 
/*
** This file defines the interface between the GL core and the surrounding
** "operating system" that supports it (currently the GLX or WGL extensions).
**
** Members (data and function pointers) are documented as imported or
** exported according to how they are used by the core rendering functions.
** Imported members are initialized by the "operating system" and used by
** the core functions. Exported members are initialized by the core functions
** and used by the "operating system".
*/
 
/*
** Mode and limit information for a context. This information is
** kept around in the context so that values can be used during
** command execution, and for returning information about the
** context to the application.
*/
typedef struct __GLcontextModesRec {
GLboolean rgbMode;
GLboolean colorIndexMode;
GLboolean doubleBufferMode;
GLboolean stereoMode;
 
GLboolean haveAccumBuffer;
GLboolean haveDepthBuffer;
GLboolean haveStencilBuffer;
 
GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */
GLuint redMask, greenMask, blueMask, alphaMask;
GLint rgbBits; /* total bits for rgb */
GLint indexBits; /* total bits for colorindex */
 
GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
GLint depthBits;
GLint stencilBits;
 
GLint numAuxBuffers;
 
GLint level;
 
GLint pixmapMode;
} __GLcontextModes;
 
/************************************************************************/
 
/*
** Structure used for allocating and freeing drawable private memory.
** (like software buffers, for example).
**
** The memory allocation routines are provided by the surrounding
** "operating system" code, and they are to be used for allocating
** software buffers and things which are associated with the drawable,
** and used by any context which draws to that drawable. There are
** separate memory allocation functions for drawables and contexts
** since drawables and contexts can be created and destroyed independently
** of one another, and the "operating system" may want to use separate
** allocation arenas for each.
**
** The freePrivate function is filled in by the core routines when they
** allocates software buffers, and stick them in "private". The freePrivate
** function will destroy anything allocated to this drawable (to be called
** when the drawable is destroyed).
*/
typedef struct __GLdrawableRegionRec __GLdrawableRegion;
typedef struct __GLdrawableBufferRec __GLdrawableBuffer;
typedef struct __GLdrawablePrivateRec __GLdrawablePrivate;
 
typedef struct __GLregionRectRec {
/* lower left (inside the rectangle) */
GLint x0, y0;
/* upper right (outside the rectangle) */
GLint x1, y1;
} __GLregionRect;
 
struct __GLdrawableRegionRec {
GLint numRects;
__GLregionRect *rects;
__GLregionRect boundingRect;
};
 
/************************************************************************/
 
/* masks for the buffers */
#define __GL_FRONT_BUFFER_MASK 0x00000001
#define __GL_FRONT_LEFT_BUFFER_MASK 0x00000001
#define __GL_FRONT_RIGHT_BUFFER_MASK 0x00000002
#define __GL_BACK_BUFFER_MASK 0x00000004
#define __GL_BACK_LEFT_BUFFER_MASK 0x00000004
#define __GL_BACK_RIGHT_BUFFER_MASK 0x00000008
#define __GL_ACCUM_BUFFER_MASK 0x00000010
#define __GL_DEPTH_BUFFER_MASK 0x00000020
#define __GL_STENCIL_BUFFER_MASK 0x00000040
#define __GL_AUX_BUFFER_MASK(i) (0x0000080 << (i))
 
#define __GL_ALL_BUFFER_MASK 0xffffffff
 
/* what Resize routines return if resize resorted to fallback case */
#define __GL_BUFFER_FALLBACK 0x10
 
typedef void (*__GLbufFallbackInitFn)(__GLdrawableBuffer *buf,
__GLdrawablePrivate *glPriv, GLint bits);
typedef void (*__GLbufMainInitFn)(__GLdrawableBuffer *buf,
__GLdrawablePrivate *glPriv, GLint bits,
__GLbufFallbackInitFn back);
 
/*
** A drawable buffer
**
** This data structure describes the context side of a drawable.
**
** According to the spec there could be multiple contexts bound to the same
** drawable at the same time (from different threads). In order to avoid
** multiple-access conflicts, locks are used to serialize access. When a
** thread needs to access (read or write) a member of the drawable, it takes
** a lock first. Some of the entries in the drawable are treated "mostly
** constant", so we take the freedom of allowing access to them without
** taking a lock (for optimization reasons).
**
** For more details regarding locking, see buffers.h in the GL core
*/
struct __GLdrawableBufferRec {
/*
** Buffer dimensions
*/
GLint width, height, depth;
 
/*
** Framebuffer base address
*/
void *base;
 
/*
** Framebuffer size (in bytes)
*/
GLuint size;
 
/*
** Size (in bytes) of each element in the framebuffer
*/
GLuint elementSize;
GLuint elementSizeLog2;
 
/*
** Element skip from one scanline to the next.
** If the buffer is part of another buffer (for example, fullscreen
** front buffer), outerWidth is the width of that buffer.
*/
GLint outerWidth;
 
/*
** outerWidth * elementSize
*/
GLint byteWidth;
 
/*
** Allocation/deallocation is done based on this handle. A handle
** is conceptually different from the framebuffer 'base'.
*/
void *handle;
 
/* imported */
GLboolean (*resize)(__GLdrawableBuffer *buf,
GLint x, GLint y, GLuint width, GLuint height,
__GLdrawablePrivate *glPriv, GLuint bufferMask);
void (*lock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
void (*unlock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
void (*fill)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv,
GLuint val, GLint x, GLint y, GLint w, GLint h);
void (*free)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
 
/* exported */
void (*freePrivate)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
#ifdef __cplusplus
void *privatePtr;
#else
void *private;
#endif
 
/* private */
void *other; /* implementation private data */
__GLbufMainInitFn mainInit;
__GLbufFallbackInitFn fallbackInit;
};
 
/*
** The context side of the drawable private
*/
struct __GLdrawablePrivateRec {
/*
** Drawable Modes
*/
__GLcontextModes *modes;
 
/*
** Drawable size
*/
GLuint width, height;
 
/*
** Origin in screen coordinates of the drawable
*/
GLint xOrigin, yOrigin;
#ifdef __GL_ALIGNED_BUFFERS
/*
** Drawable offset from screen origin
*/
GLint xOffset, yOffset;
 
/*
** Alignment restriction
*/
GLint xAlignment, yAlignment;
#endif
/*
** Should we invert the y axis?
*/
GLint yInverted;
 
/*
** Mask specifying which buffers are renderable by the hw
*/
GLuint accelBufferMask;
 
/*
** the buffers themselves
*/
__GLdrawableBuffer frontBuffer;
__GLdrawableBuffer backBuffer;
__GLdrawableBuffer accumBuffer;
__GLdrawableBuffer depthBuffer;
__GLdrawableBuffer stencilBuffer;
#if defined(__GL_NUMBER_OF_AUX_BUFFERS) && (__GL_NUMBER_OF_AUX_BUFFERS > 0)
__GLdrawableBuffer *auxBuffer;
#endif
 
__GLdrawableRegion ownershipRegion;
 
/*
** Lock for the drawable private structure
*/
void *lock;
#ifdef DEBUG
/* lock debugging info */
int lockRefCount;
int lockLine[10];
char *lockFile[10];
#endif
 
/* imported */
void *(*malloc)(size_t size);
void *(*calloc)(size_t numElem, size_t elemSize);
void *(*realloc)(void *oldAddr, size_t newSize);
void (*free)(void *addr);
 
GLboolean (*addSwapRect)(__GLdrawablePrivate *glPriv,
GLint x, GLint y, GLsizei width, GLsizei height);
void (*setClipRect)(__GLdrawablePrivate *glPriv,
GLint x, GLint y, GLsizei width, GLsizei height);
void (*updateClipRegion)(__GLdrawablePrivate *glPriv);
GLboolean (*resize)(__GLdrawablePrivate *glPriv);
void (*getDrawableSize)(__GLdrawablePrivate *glPriv,
GLint *x, GLint *y, GLuint *width, GLuint *height);
 
void (*lockDP)(__GLdrawablePrivate *glPriv, __GLcontext *gc);
void (*unlockDP)(__GLdrawablePrivate *glPriv);
 
/* exported */
#if 0 /* disable, just like in __GLimportsRec */
void *wsPriv; /* pointer to the window system DrawablePrivate */
#endif
#ifdef __cplusplus
void *privatePtr;
#else
void *private;
#endif
void (*freePrivate)(__GLdrawablePrivate *);
 
/* client data */
void *other;
};
 
/*
** Macros to lock/unlock the drawable private
*/
#if defined(DEBUG)
#define __GL_LOCK_DP(glPriv,gc) \
(*(glPriv)->lockDP)(glPriv,gc); \
(glPriv)->lockLine[(glPriv)->lockRefCount] = __LINE__; \
(glPriv)->lockFile[(glPriv)->lockRefCount] = __FILE__; \
(glPriv)->lockRefCount++
#define __GL_UNLOCK_DP(glPriv) \
(glPriv)->lockRefCount--; \
(glPriv)->lockLine[(glPriv)->lockRefCount] = 0; \
(glPriv)->lockFile[(glPriv)->lockRefCount] = NULL; \
(*(glPriv)->unlockDP)(glPriv)
#else /* DEBUG */
#define __GL_LOCK_DP(glPriv,gc) (*(glPriv)->lockDP)(glPriv,gc)
#define __GL_UNLOCK_DP(glPriv) (*(glPriv)->unlockDP)(glPriv)
#endif /* DEBUG */
 
 
/*
** Procedures which are imported by the GL from the surrounding
** "operating system". Math functions are not considered part of the
** "operating system".
*/
typedef struct __GLimportsRec {
/* Memory management */
void * (*malloc)(__GLcontext *gc, size_t size);
void *(*calloc)(__GLcontext *gc, size_t numElem, size_t elemSize);
void *(*realloc)(__GLcontext *gc, void *oldAddr, size_t newSize);
void (*free)(__GLcontext *gc, void *addr);
 
/* Error handling */
void (*warning)(__GLcontext *gc, char *fmt);
void (*fatal)(__GLcontext *gc, char *fmt);
 
/* other system calls */
char *(CAPI *getenv)(__GLcontext *gc, const char *var);
int (CAPI *atoi)(__GLcontext *gc, const char *str);
int (CAPI *sprintf)(__GLcontext *gc, char *str, const char *fmt, ...);
void *(CAPI *fopen)(__GLcontext *gc, const char *path, const char *mode);
int (CAPI *fclose)(__GLcontext *gc, void *stream);
int (CAPI *fprintf)(__GLcontext *gc, void *stream, const char *fmt, ...);
 
/* Drawing surface management */
__GLdrawablePrivate *(*getDrawablePrivate)(__GLcontext *gc);
 
#if 0
/* At some point, this field got removed from the XFree86 glcore.h file.
* we're removing it here to prevent interop problems. (Brian)
*/
/* Pointer to the window system context */
void *wscx;
#endif
 
/* Operating system dependent data goes here */
void *other;
} __GLimports;
 
/************************************************************************/
 
/*
** Procedures which are exported by the GL to the surrounding "operating
** system" so that it can manage multiple GL context's.
*/
typedef struct __GLexportsRec {
/* Context management (return GL_FALSE on failure) */
GLboolean (*destroyContext)(__GLcontext *gc);
GLboolean (*loseCurrent)(__GLcontext *gc);
GLboolean (*makeCurrent)(__GLcontext *gc);
GLboolean (*shareContext)(__GLcontext *gc, __GLcontext *gcShare);
GLboolean (*copyContext)(__GLcontext *dst, const __GLcontext *src, GLuint mask);
GLboolean (*forceCurrent)(__GLcontext *gc);
 
/* Drawing surface notification callbacks */
GLboolean (*notifyResize)(__GLcontext *gc);
void (*notifyDestroy)(__GLcontext *gc);
void (*notifySwapBuffers)(__GLcontext *gc);
 
/* Dispatch table override control for external agents like libGLS */
struct __GLdispatchStateRec* (*dispatchExec)(__GLcontext *gc);
void (*beginDispatchOverride)(__GLcontext *gc);
void (*endDispatchOverride)(__GLcontext *gc);
} __GLexports;
 
/************************************************************************/
 
/*
** This must be the first member of a __GLcontext structure. This is the
** only part of a context that is exposed to the outside world; everything
** else is opaque.
*/
struct __GLinterfaceRec {
__GLimports imports;
__GLexports exports;
};
 
extern __GLcontext *__glCoreCreateContext(__GLimports *, __GLcontextModes *);
extern void __glCoreNopDispatch(void);
 
#endif /* __gl_core_h_ */
/shark/trunk/ports/mesa/include/GL/amesa.h
0,0 → 1,67
/* $Id: amesa.h,v 1.1 2003-02-28 11:41:55 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
*
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/* Allegro (DJGPP) driver by Bernhard Tschirren (bernie-t@geocities.com) */
 
 
#ifndef AMESA_H
#define AMESA_H
 
 
#define AMESA_MAJOR_VERSION 3
#define AMESA_MINOR_VERSION 3
 
 
typedef struct amesa_visual *AMesaVisual;
typedef struct amesa_buffer *AMesaBuffer;
typedef struct amesa_context *AMesaContext;
 
 
extern AMesaVisual AMesaCreateVisual(GLboolean dbFlag, GLint depth,
GLint depthSize,
GLint stencilSize,
GLint accumSize);
 
extern void AMesaDestroyVisual(AMesaVisual visual);
 
extern AMesaBuffer AMesaCreateBuffer(AMesaVisual visual,
GLint width, GLint height);
 
extern void AMesaDestroyBuffer(AMesaBuffer buffer);
 
 
extern AMesaContext AMesaCreateContext(AMesaVisual visual,
AMesaContext sharelist);
 
extern void AMesaDestroyContext(AMesaContext context);
 
extern GLboolean AMesaMakeCurrent(AMesaContext context, AMesaBuffer buffer);
 
extern void AMesaSwapBuffers(AMesaBuffer buffer);
 
 
#endif /* AMESA_H */
/shark/trunk/ports/mesa/include/GL/glu.h
0,0 → 1,335
/*
** License Applicability. Except to the extent portions of this file are
** made subject to an alternative license as permitted in the SGI Free
** Software License B, Version 1.1 (the "License"), the contents of this
** file are subject only to the provisions of the License. You may not use
** this file except in compliance with the License. You may obtain a copy
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
**
** http://oss.sgi.com/projects/FreeB
**
** Note that, as provided in the License, the Software is distributed on an
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
**
** Original Code. The Original Code is: OpenGL Sample Implementation,
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
** Copyright in any portions created by third parties is as indicated
** elsewhere herein. All Rights Reserved.
**
** Additional Notice Provisions: This software was created using the
** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
** not been independently verified as being compliant with the OpenGL(R)
** version 1.2.1 Specification.
*/
 
#ifndef __glu_h__
#define __glu_h__
 
#if defined(USE_MGL_NAMESPACE)
#include "glu_mangle.h"
#endif
 
#include <GL/gl.h>
 
#ifndef GLAPIENTRY
#define GLAPIENTRY
#endif
 
#ifndef GLAPI
#define GLAPI
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*************************************************************/
 
/* Extensions */
#define GLU_EXT_object_space_tess 1
#define GLU_EXT_nurbs_tessellator 1
 
/* Boolean */
#define GLU_FALSE 0
#define GLU_TRUE 1
 
/* Version */
#define GLU_VERSION_1_1 1
#define GLU_VERSION_1_2 1
#define GLU_VERSION_1_3 1
 
/* StringName */
#define GLU_VERSION 100800
#define GLU_EXTENSIONS 100801
 
/* ErrorCode */
#define GLU_INVALID_ENUM 100900
#define GLU_INVALID_VALUE 100901
#define GLU_OUT_OF_MEMORY 100902
#define GLU_INVALID_OPERATION 100904
 
/* NurbsDisplay */
/* GLU_FILL */
#define GLU_OUTLINE_POLYGON 100240
#define GLU_OUTLINE_PATCH 100241
 
/* NurbsCallback */
#define GLU_NURBS_ERROR 100103
#define GLU_ERROR 100103
#define GLU_NURBS_BEGIN 100164
#define GLU_NURBS_BEGIN_EXT 100164
#define GLU_NURBS_VERTEX 100165
#define GLU_NURBS_VERTEX_EXT 100165
#define GLU_NURBS_NORMAL 100166
#define GLU_NURBS_NORMAL_EXT 100166
#define GLU_NURBS_COLOR 100167
#define GLU_NURBS_COLOR_EXT 100167
#define GLU_NURBS_TEXTURE_COORD 100168
#define GLU_NURBS_TEX_COORD_EXT 100168
#define GLU_NURBS_END 100169
#define GLU_NURBS_END_EXT 100169
#define GLU_NURBS_BEGIN_DATA 100170
#define GLU_NURBS_BEGIN_DATA_EXT 100170
#define GLU_NURBS_VERTEX_DATA 100171
#define GLU_NURBS_VERTEX_DATA_EXT 100171
#define GLU_NURBS_NORMAL_DATA 100172
#define GLU_NURBS_NORMAL_DATA_EXT 100172
#define GLU_NURBS_COLOR_DATA 100173
#define GLU_NURBS_COLOR_DATA_EXT 100173
#define GLU_NURBS_TEXTURE_COORD_DATA 100174
#define GLU_NURBS_TEX_COORD_DATA_EXT 100174
#define GLU_NURBS_END_DATA 100175
#define GLU_NURBS_END_DATA_EXT 100175
 
/* NurbsError */
#define GLU_NURBS_ERROR1 100251
#define GLU_NURBS_ERROR2 100252
#define GLU_NURBS_ERROR3 100253
#define GLU_NURBS_ERROR4 100254
#define GLU_NURBS_ERROR5 100255
#define GLU_NURBS_ERROR6 100256
#define GLU_NURBS_ERROR7 100257
#define GLU_NURBS_ERROR8 100258
#define GLU_NURBS_ERROR9 100259
#define GLU_NURBS_ERROR10 100260
#define GLU_NURBS_ERROR11 100261
#define GLU_NURBS_ERROR12 100262
#define GLU_NURBS_ERROR13 100263
#define GLU_NURBS_ERROR14 100264
#define GLU_NURBS_ERROR15 100265
#define GLU_NURBS_ERROR16 100266
#define GLU_NURBS_ERROR17 100267
#define GLU_NURBS_ERROR18 100268
#define GLU_NURBS_ERROR19 100269
#define GLU_NURBS_ERROR20 100270
#define GLU_NURBS_ERROR21 100271
#define GLU_NURBS_ERROR22 100272
#define GLU_NURBS_ERROR23 100273
#define GLU_NURBS_ERROR24 100274
#define GLU_NURBS_ERROR25 100275
#define GLU_NURBS_ERROR26 100276
#define GLU_NURBS_ERROR27 100277
#define GLU_NURBS_ERROR28 100278
#define GLU_NURBS_ERROR29 100279
#define GLU_NURBS_ERROR30 100280
#define GLU_NURBS_ERROR31 100281
#define GLU_NURBS_ERROR32 100282
#define GLU_NURBS_ERROR33 100283
#define GLU_NURBS_ERROR34 100284
#define GLU_NURBS_ERROR35 100285
#define GLU_NURBS_ERROR36 100286
#define GLU_NURBS_ERROR37 100287
 
/* NurbsProperty */
#define GLU_AUTO_LOAD_MATRIX 100200
#define GLU_CULLING 100201
#define GLU_SAMPLING_TOLERANCE 100203
#define GLU_DISPLAY_MODE 100204
#define GLU_PARAMETRIC_TOLERANCE 100202
#define GLU_SAMPLING_METHOD 100205
#define GLU_U_STEP 100206
#define GLU_V_STEP 100207
#define GLU_NURBS_MODE 100160
#define GLU_NURBS_MODE_EXT 100160
#define GLU_NURBS_TESSELLATOR 100161
#define GLU_NURBS_TESSELLATOR_EXT 100161
#define GLU_NURBS_RENDERER 100162
#define GLU_NURBS_RENDERER_EXT 100162
 
/* NurbsSampling */
#define GLU_OBJECT_PARAMETRIC_ERROR 100208
#define GLU_OBJECT_PARAMETRIC_ERROR_EXT 100208
#define GLU_OBJECT_PATH_LENGTH 100209
#define GLU_OBJECT_PATH_LENGTH_EXT 100209
#define GLU_PATH_LENGTH 100215
#define GLU_PARAMETRIC_ERROR 100216
#define GLU_DOMAIN_DISTANCE 100217
 
/* NurbsTrim */
#define GLU_MAP1_TRIM_2 100210
#define GLU_MAP1_TRIM_3 100211
 
/* QuadricDrawStyle */
#define GLU_POINT 100010
#define GLU_LINE 100011
#define GLU_FILL 100012
#define GLU_SILHOUETTE 100013
 
/* QuadricCallback */
/* GLU_ERROR */
 
/* QuadricNormal */
#define GLU_SMOOTH 100000
#define GLU_FLAT 100001
#define GLU_NONE 100002
 
/* QuadricOrientation */
#define GLU_OUTSIDE 100020
#define GLU_INSIDE 100021
 
/* TessCallback */
#define GLU_TESS_BEGIN 100100
#define GLU_BEGIN 100100
#define GLU_TESS_VERTEX 100101
#define GLU_VERTEX 100101
#define GLU_TESS_END 100102
#define GLU_END 100102
#define GLU_TESS_ERROR 100103
#define GLU_TESS_EDGE_FLAG 100104
#define GLU_EDGE_FLAG 100104
#define GLU_TESS_COMBINE 100105
#define GLU_TESS_BEGIN_DATA 100106
#define GLU_TESS_VERTEX_DATA 100107
#define GLU_TESS_END_DATA 100108
#define GLU_TESS_ERROR_DATA 100109
#define GLU_TESS_EDGE_FLAG_DATA 100110
#define GLU_TESS_COMBINE_DATA 100111
 
/* TessContour */
#define GLU_CW 100120
#define GLU_CCW 100121
#define GLU_INTERIOR 100122
#define GLU_EXTERIOR 100123
#define GLU_UNKNOWN 100124
 
/* TessProperty */
#define GLU_TESS_WINDING_RULE 100140
#define GLU_TESS_BOUNDARY_ONLY 100141
#define GLU_TESS_TOLERANCE 100142
 
/* TessError */
#define GLU_TESS_ERROR1 100151
#define GLU_TESS_ERROR2 100152
#define GLU_TESS_ERROR3 100153
#define GLU_TESS_ERROR4 100154
#define GLU_TESS_ERROR5 100155
#define GLU_TESS_ERROR6 100156
#define GLU_TESS_ERROR7 100157
#define GLU_TESS_ERROR8 100158
#define GLU_TESS_MISSING_BEGIN_POLYGON 100151
#define GLU_TESS_MISSING_BEGIN_CONTOUR 100152
#define GLU_TESS_MISSING_END_POLYGON 100153
#define GLU_TESS_MISSING_END_CONTOUR 100154
#define GLU_TESS_COORD_TOO_LARGE 100155
#define GLU_TESS_NEED_COMBINE_CALLBACK 100156
 
/* TessWinding */
#define GLU_TESS_WINDING_ODD 100130
#define GLU_TESS_WINDING_NONZERO 100131
#define GLU_TESS_WINDING_POSITIVE 100132
#define GLU_TESS_WINDING_NEGATIVE 100133
#define GLU_TESS_WINDING_ABS_GEQ_TWO 100134
 
/*************************************************************/
 
 
#ifdef __cplusplus
class GLUnurbs;
class GLUquadric;
class GLUtesselator;
#else
typedef struct GLUnurbs GLUnurbs;
typedef struct GLUquadric GLUquadric;
typedef struct GLUtesselator GLUtesselator;
#endif
 
typedef GLUnurbs GLUnurbsObj;
typedef GLUquadric GLUquadricObj;
typedef GLUtesselator GLUtesselatorObj;
typedef GLUtesselator GLUtriangulatorObj;
 
#define GLU_TESS_MAX_COORD 1.0e150
 
/* Internal convenience typedefs */
typedef void (GLAPIENTRY *_GLUfuncptr)();
 
GLAPI void GLAPIENTRY gluBeginCurve (GLUnurbs* nurb);
GLAPI void GLAPIENTRY gluBeginPolygon (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluBeginSurface (GLUnurbs* nurb);
GLAPI void GLAPIENTRY gluBeginTrim (GLUnurbs* nurb);
GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data);
GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);
GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data);
GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
GLAPI GLboolean GLAPIENTRY gluCheckExtension (const GLubyte *extName, const GLubyte *extString);
GLAPI void GLAPIENTRY gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks);
GLAPI void GLAPIENTRY gluDeleteNurbsRenderer (GLUnurbs* nurb);
GLAPI void GLAPIENTRY gluDeleteQuadric (GLUquadric* quad);
GLAPI void GLAPIENTRY gluDeleteTess (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops);
GLAPI void GLAPIENTRY gluEndCurve (GLUnurbs* nurb);
GLAPI void GLAPIENTRY gluEndPolygon (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluEndSurface (GLUnurbs* nurb);
GLAPI void GLAPIENTRY gluEndTrim (GLUnurbs* nurb);
GLAPI const GLubyte * GLAPIENTRY gluErrorString (GLenum error);
GLAPI void GLAPIENTRY gluGetNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat* data);
GLAPI const GLubyte * GLAPIENTRY gluGetString (GLenum name);
GLAPI void GLAPIENTRY gluGetTessProperty (GLUtesselator* tess, GLenum which, GLdouble* data);
GLAPI void GLAPIENTRY gluLoadSamplingMatrices (GLUnurbs* nurb, const GLfloat *model, const GLfloat *perspective, const GLint *view);
GLAPI void GLAPIENTRY gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ);
GLAPI GLUnurbs* GLAPIENTRY gluNewNurbsRenderer (void);
GLAPI GLUquadric* GLAPIENTRY gluNewQuadric (void);
GLAPI GLUtesselator* GLAPIENTRY gluNewTess (void);
GLAPI void GLAPIENTRY gluNextContour (GLUtesselator* tess, GLenum type);
GLAPI void GLAPIENTRY gluNurbsCallback (GLUnurbs* nurb, GLenum which, _GLUfuncptr CallBackFunc);
GLAPI void GLAPIENTRY gluNurbsCallbackData (GLUnurbs* nurb, GLvoid* userData);
GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData);
GLAPI void GLAPIENTRY gluNurbsCurve (GLUnurbs* nurb, GLint knotCount, GLfloat *knots, GLint stride, GLfloat *control, GLint order, GLenum type);
GLAPI void GLAPIENTRY gluNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat value);
GLAPI void GLAPIENTRY gluNurbsSurface (GLUnurbs* nurb, GLint sKnotCount, GLfloat* sKnots, GLint tKnotCount, GLfloat* tKnots, GLint sStride, GLint tStride, GLfloat* control, GLint sOrder, GLint tOrder, GLenum type);
GLAPI void GLAPIENTRY gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
GLAPI void GLAPIENTRY gluPartialDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep);
GLAPI void GLAPIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
GLAPI void GLAPIENTRY gluPickMatrix (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport);
GLAPI GLint GLAPIENTRY gluProject (GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ);
GLAPI void GLAPIENTRY gluPwlCurve (GLUnurbs* nurb, GLint count, GLfloat* data, GLint stride, GLenum type);
GLAPI void GLAPIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc);
GLAPI void GLAPIENTRY gluQuadricDrawStyle (GLUquadric* quad, GLenum draw);
GLAPI void GLAPIENTRY gluQuadricNormals (GLUquadric* quad, GLenum normal);
GLAPI void GLAPIENTRY gluQuadricOrientation (GLUquadric* quad, GLenum orientation);
GLAPI void GLAPIENTRY gluQuadricTexture (GLUquadric* quad, GLboolean texture);
GLAPI GLint GLAPIENTRY gluScaleImage (GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void *dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid* dataOut);
GLAPI void GLAPIENTRY gluSphere (GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks);
GLAPI void GLAPIENTRY gluTessBeginContour (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluTessBeginPolygon (GLUtesselator* tess, GLvoid* data);
GLAPI void GLAPIENTRY gluTessCallback (GLUtesselator* tess, GLenum which, _GLUfuncptr CallBackFunc);
GLAPI void GLAPIENTRY gluTessEndContour (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluTessEndPolygon (GLUtesselator* tess);
GLAPI void GLAPIENTRY gluTessNormal (GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ);
GLAPI void GLAPIENTRY gluTessProperty (GLUtesselator* tess, GLenum which, GLdouble data);
GLAPI void GLAPIENTRY gluTessVertex (GLUtesselator* tess, GLdouble *location, GLvoid* data);
GLAPI GLint GLAPIENTRY gluUnProject (GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* objX, GLdouble* objY, GLdouble* objZ);
GLAPI GLint GLAPIENTRY gluUnProject4 (GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble nearVal, GLdouble farVal, GLdouble* objX, GLdouble* objY, GLdouble* objZ, GLdouble* objW);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __glu_h__ */
/shark/trunk/ports/mesa/include/GL/osmesa.h
0,0 → 1,276
/* $Id: osmesa.h,v 1.1 2003-02-28 11:41:56 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Mesa Off-Screen rendering interface.
*
* This is an operating system and window system independent interface to
* Mesa which allows one to render images into a client-supplied buffer in
* main memory. Such images may manipulated or saved in whatever way the
* client wants.
*
* These are the API functions:
* OSMesaCreateContext - create a new Off-Screen Mesa rendering context
* OSMesaMakeCurrent - bind an OSMesaContext to a client's image buffer
* and make the specified context the current one.
* OSMesaDestroyContext - destroy an OSMesaContext
* OSMesaGetCurrentContext - return thread's current context ID
* OSMesaPixelStore - controls how pixels are stored in image buffer
* OSMesaGetIntegerv - return OSMesa state parameters
*
*
* The limits on the width and height of an image buffer are MAX_WIDTH and
* MAX_HEIGHT as defined in Mesa/src/config.h. Defaults are 1280 and 1024.
* You can increase them as needed but beware that many temporary arrays in
* Mesa are dimensioned by MAX_WIDTH or MAX_HEIGHT.
*/
 
 
#ifndef OSMESA_H
#define OSMESA_H
 
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
#include <GL/gl.h>
 
 
#define OSMESA_MAJOR_VERSION 4
#define OSMESA_MINOR_VERSION 1
#define OSMESA_PATCH_VERSION 0
 
 
 
/*
* Values for the format parameter of OSMesaCreateContext()
* New in version 2.0.
*/
#define OSMESA_COLOR_INDEX GL_COLOR_INDEX
#define OSMESA_RGBA GL_RGBA
#define OSMESA_BGRA 0x1
#define OSMESA_ARGB 0x2
#define OSMESA_RGB GL_RGB
#define OSMESA_BGR 0x4
#define OSMESA_RGB_565 0x5
 
 
/*
* OSMesaPixelStore() parameters:
* New in version 2.0.
*/
#define OSMESA_ROW_LENGTH 0x10
#define OSMESA_Y_UP 0x11
 
 
/*
* Accepted by OSMesaGetIntegerv:
*/
#define OSMESA_WIDTH 0x20
#define OSMESA_HEIGHT 0x21
#define OSMESA_FORMAT 0x22
#define OSMESA_TYPE 0x23
#define OSMESA_MAX_WIDTH 0x24 /* new in 4.0 */
#define OSMESA_MAX_HEIGHT 0x25 /* new in 4.0 */
 
 
typedef struct osmesa_context *OSMesaContext;
 
 
#if defined(__BEOS__) || defined(__QUICKDRAW__)
#pragma export on
#endif
 
 
/*
* Create an Off-Screen Mesa rendering context. The only attribute needed is
* an RGBA vs Color-Index mode flag.
*
* Input: format - one of OSMESA_COLOR_INDEX, OSMESA_RGBA, OSMESA_BGRA,
* OSMESA_ARGB, OSMESA_RGB, or OSMESA_BGR.
* sharelist - specifies another OSMesaContext with which to share
* display lists. NULL indicates no sharing.
* Return: an OSMesaContext or 0 if error
*/
GLAPI OSMesaContext GLAPIENTRY
OSMesaCreateContext( GLenum format, OSMesaContext sharelist );
 
 
 
/*
* Create an Off-Screen Mesa rendering context and specify desired
* size of depth buffer, stencil buffer and accumulation buffer.
* If you specify zero for depthBits, stencilBits, accumBits you
* can save some memory.
*
* New in Mesa 3.5
*/
GLAPI OSMesaContext GLAPIENTRY
OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
GLint accumBits, OSMesaContext sharelist);
 
 
/*
* Destroy an Off-Screen Mesa rendering context.
*
* Input: ctx - the context to destroy
*/
GLAPI void GLAPIENTRY
OSMesaDestroyContext( OSMesaContext ctx );
 
 
 
/*
* Bind an OSMesaContext to an image buffer. The image buffer is just a
* block of memory which the client provides. Its size must be at least
* as large as width*height*sizeof(type). Its address should be a multiple
* of 4 if using RGBA mode.
*
* Image data is stored in the order of glDrawPixels: row-major order
* with the lower-left image pixel stored in the first array position
* (ie. bottom-to-top).
*
* Since the only type initially supported is GL_UNSIGNED_BYTE, if the
* context is in RGBA mode, each pixel will be stored as a 4-byte RGBA
* value. If the context is in color indexed mode, each pixel will be
* stored as a 1-byte value.
*
* If the context's viewport hasn't been initialized yet, it will now be
* initialized to (0,0,width,height).
*
* Input: ctx - the rendering context
* buffer - the image buffer memory
* type - data type for pixel components, only GL_UNSIGNED_BYTE
* supported now
* width, height - size of image buffer in pixels, at least 1
* Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx,
* invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1,
* width>internal limit or height>internal limit.
*/
GLAPI GLboolean GLAPIENTRY
OSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
GLsizei width, GLsizei height );
 
 
 
 
/*
* Return the current Off-Screen Mesa rendering context handle.
*/
GLAPI OSMesaContext GLAPIENTRY
OSMesaGetCurrentContext( void );
 
 
 
/*
* Set pixel store/packing parameters for the current context.
* This is similar to glPixelStore.
* Input: pname - OSMESA_ROW_LENGTH
* specify actual pixels per row in image buffer
* 0 = same as image width (default)
* OSMESA_Y_UP
* zero = Y coordinates increase downward
* non-zero = Y coordinates increase upward (default)
* value - the value for the parameter pname
*
* New in version 2.0.
*/
GLAPI void GLAPIENTRY
OSMesaPixelStore( GLint pname, GLint value );
 
 
 
/*
* Return an integer value like glGetIntegerv.
* Input: pname -
* OSMESA_WIDTH return current image width
* OSMESA_HEIGHT return current image height
* OSMESA_FORMAT return image format
* OSMESA_TYPE return color component data type
* OSMESA_ROW_LENGTH return row length in pixels
* OSMESA_Y_UP returns 1 or 0 to indicate Y axis direction
* value - pointer to integer in which to return result.
*/
GLAPI void GLAPIENTRY
OSMesaGetIntegerv( GLint pname, GLint *value );
 
 
 
/*
* Return the depth buffer associated with an OSMesa context.
* Input: c - the OSMesa context
* Output: width, height - size of buffer in pixels
* bytesPerValue - bytes per depth value (2 or 4)
* buffer - pointer to depth buffer values
* Return: GL_TRUE or GL_FALSE to indicate success or failure.
*
* New in Mesa 2.4.
*/
GLAPI GLboolean GLAPIENTRY
OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
GLint *bytesPerValue, void **buffer );
 
 
 
/*
* Return the color buffer associated with an OSMesa context.
* Input: c - the OSMesa context
* Output: width, height - size of buffer in pixels
* format - buffer format (OSMESA_FORMAT)
* buffer - pointer to depth buffer values
* Return: GL_TRUE or GL_FALSE to indicate success or failure.
*
* New in Mesa 3.3.
*/
GLAPI GLboolean GLAPIENTRY
OSMesaGetColorBuffer( OSMesaContext c, GLint *width, GLint *height,
GLint *format, void **buffer );
 
 
 
/*
* Return pointer to the named function.
*
* New in Mesa 4.1
*/
GLAPI void * GLAPIENTRY
OSMesaGetProcAddress( const char *funcName );
 
 
#if defined(__BEOS__) || defined(__QUICKDRAW__)
#pragma export off
#endif
 
 
#ifdef __cplusplus
}
#endif
 
 
#endif
/shark/trunk/ports/mesa/include/GL/uglglutshapes.h
0,0 → 1,45
/* uglglutshapes.h - Public header GLUT Shapes */
 
/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
 
/* This program is freely distributable without licensing fees and is
provided without guarantee or warrantee expressed or implied. This
program is -not- in the public domain. */
 
#ifndef GLUTSHAPES_H
#define GLUTSHAPES_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include <GL/gl.h>
 
void glutWireSphere (GLdouble radius, GLint slices, GLint stacks);
void glutSolidSphere (GLdouble radius, GLint slices, GLint stacks);
void glutWireCone (GLdouble base, GLdouble height,
GLint slices, GLint stacks);
void glutSolidCone (GLdouble base, GLdouble height,
GLint slices, GLint stacks);
void glutWireCube (GLdouble size);
void glutSolidCube (GLdouble size);
void glutWireTorus (GLdouble innerRadius, GLdouble outerRadius,
GLint sides, GLint rings);
void glutSolidTorus (GLdouble innerRadius, GLdouble outerRadius,
GLint sides, GLint rings);
void glutWireDodecahedron (void);
void glutSolidDodecahedron (void);
void glutWireOctahedron (void);
void glutSolidOctahedron (void);
void glutWireTetrahedron (void);
void glutSolidTetrahedron (void);
void glutWireIcosahedron (void);
void glutSolidIcosahedron (void);
void glutWireTeapot (GLdouble size);
void glutSolidTeapot (GLdouble size);
 
#ifdef __cplusplus
}
#endif
 
#endif
/shark/trunk/ports/mesa/include/GL/xmesa_xf86.h
0,0 → 1,188
 
/**************************************************************************
 
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
All Rights Reserved.
 
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sub license, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
 
The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
**************************************************************************/
 
/*
* Authors:
* Kevin E. Martin <kevin@precisioninsight.com>
*
* $Header: /home/fabio/w/shark/sharkcvs/CVSROOT/shark/ports/mesa/include/GL/xmesa_xf86.h,v 1.1 2003-02-28 11:41:57 pj Exp $
*/
 
#ifndef _XMESA_XF86_H_
#define _XMESA_XF86_H_
 
#include "scrnintstr.h"
#include "pixmapstr.h"
 
typedef struct _XMesaImageRec XMesaImage;
 
typedef ScreenRec XMesaDisplay;
typedef PixmapPtr XMesaPixmap;
typedef ColormapPtr XMesaColormap;
typedef DrawablePtr XMesaDrawable;
typedef WindowPtr XMesaWindow;
typedef GCPtr XMesaGC;
typedef VisualPtr XMesaVisualInfo;
typedef DDXPointRec XMesaPoint;
typedef xColorItem XMesaColor;
 
#define XMesaSetGeneric(__d,__gc,__val,__mask) \
do { \
CARD32 __v[1]; \
(void) __d; \
__v[0] = __val; \
dixChangeGC(NullClient, __gc, __mask, __v, NULL); \
} while (0)
 
#define XMesaSetGenericPtr(__d,__gc,__pval,__mask) \
do { \
ChangeGCVal __v[1]; \
(void) __d; \
__v[0].ptr = __pval; \
dixChangeGC(NullClient, __gc, __mask, NULL, __v); \
} while (0)
 
#define XMesaSetDashes(__d,__gc,__do,__dl,__n) \
do { \
(void) __d; \
SetDashes(__gc, __do, __n, (unsigned char *)__dl); \
} while (0)
 
#define XMesaSetLineAttributes(__d,__gc,__lw,__ls,__cs,__js) \
do { \
CARD32 __v[4]; \
(void) __d; \
__v[0] = __lw; \
__v[1] = __ls; \
__v[2] = __cs; \
__v[3] = __js; \
dixChangeGC(NullClient, __gc, \
GCLineWidth|GCLineStyle|GCCapStyle|GCJoinStyle, \
__v, NULL); \
} while (0)
 
#define XMesaSetForeground(d,gc,v) XMesaSetGeneric(d,gc,v,GCForeground)
#define XMesaSetBackground(d,gc,v) XMesaSetGeneric(d,gc,v,GCBackground)
#define XMesaSetPlaneMask(d,gc,v) XMesaSetGeneric(d,gc,v,GCPlaneMask)
#define XMesaSetFunction(d,gc,v) XMesaSetGeneric(d,gc,v,GCFunction)
#define XMesaSetFillStyle(d,gc,v) XMesaSetGeneric(d,gc,v,GCFillStyle)
 
#define XMesaSetTile(d,gc,v) XMesaSetGenericPtr(d,gc,v,GCTile)
#define XMesaSetStipple(d,gc,v) XMesaSetGenericPtr(d,gc,v,GCStipple)
 
#define XMesaDrawPoint(__d,__b,__gc,__x,__y) \
do { \
XMesaPoint __p[1]; \
(void) __d; \
__p[0].x = __x; \
__p[0].y = __y; \
ValidateGC(__b, __gc); \
(*gc->ops->PolyPoint)(__b, __gc, CoordModeOrigin, 1, __p); \
} while (0)
 
#define XMesaDrawPoints(__d,__b,__gc,__p,__n,__m) \
do { \
(void) __d; \
ValidateGC(__b, __gc); \
(*gc->ops->PolyPoint)(__b, __gc, __m, __n, __p); \
} while (0)
 
#define XMesaDrawLine(__d,__b,__gc,__x0,__y0,__x1,__y1) \
do { \
XMesaPoint __p[2]; \
(void) __d; \
ValidateGC(__b, __gc); \
__p[0].x = __x0; \
__p[0].y = __y0; \
__p[1].x = __x1; \
__p[1].y = __y1; \
(*__gc->ops->Polylines)(__b, __gc, CoordModeOrigin, 2, __p); \
} while (0)
 
#define XMesaFillRectangle(__d,__b,__gc,__x,__y,__w,__h) \
do { \
xRectangle __r[1]; \
(void) __d; \
ValidateGC((DrawablePtr)__b, __gc); \
__r[0].x = __x; \
__r[0].y = __y; \
__r[0].width = __w; \
__r[0].height = __h; \
(*__gc->ops->PolyFillRect)((DrawablePtr)__b, __gc, 1, __r); \
} while (0)
 
#define XMesaPutImage(__d,__b,__gc,__i,__sx,__sy,__x,__y,__w,__h) \
do { \
/* Assumes: Images are always in ZPixmap format */ \
(void) __d; \
if (__sx || __sy) /* The non-trivial case */ \
XMesaPutImageHelper(__d,__b,__gc,__i,__sx,__sy,__x,__y,__w,__h); \
ValidateGC(__b, __gc); \
(*__gc->ops->PutImage)(__b, __gc, ((XMesaDrawable)(__b))->depth, \
__x, __y, __w, __h, 0, ZPixmap, \
((XMesaImage *)(__i))->data); \
} while (0)
 
#define XMesaCopyArea(__d,__sb,__db,__gc,__sx,__sy,__w,__h,__x,__y) \
do { \
(void) __d; \
ValidateGC(__db, __gc); \
(*__gc->ops->CopyArea)((DrawablePtr)__sb, __db, __gc, \
__sx, __sy, __w, __h, __x, __y); \
} while (0)
 
#define XMesaFillPolygon(__d,__b,__gc,__p,__n,__s,__m) \
do { \
(void) __d; \
ValidateGC(__b, __gc); \
(*__gc->ops->FillPolygon)(__b, __gc, __s, __m, __n, __p); \
} while (0)
 
/* CreatePixmap returns a PixmapPtr; so, it cannot be inside braces */
#define XMesaCreatePixmap(__d,__b,__w,__h,__depth) \
(*__d->CreatePixmap)(__d, __w, __h, __depth)
#define XMesaFreePixmap(__d,__b) \
(*__d->DestroyPixmap)(__b)
 
#define XMesaFreeGC(__d,__gc) \
do { \
(void) __d; \
FreeScratchGC(__gc); \
} while (0)
 
#define GET_COLORMAP_SIZE(__v) __v->visinfo->ColormapEntries
#define GET_REDMASK(__v) __v->visinfo->redMask
#define GET_GREENMASK(__v) __v->visinfo->greenMask
#define GET_BLUEMASK(__v) __v->visinfo->blueMask
#define GET_VISUAL_CLASS(__v) __v->visinfo->class
#define GET_VISUAL_DEPTH(__v) __v->visinfo->nplanes
#define GET_BLACK_PIXEL(__v) __v->display->blackPixel
#define CHECK_BYTE_ORDER(__v) GL_TRUE
#define CHECK_FOR_HPCR(__v) GL_FALSE
 
#endif
/shark/trunk/ports/mesa/include/GLView.h
0,0 → 1,196
/*******************************************************************************
/
/ File: GLView.h
/
/ Copyright 1993-98, Be Incorporated, All Rights Reserved.
/
*******************************************************************************/
 
#ifndef BGLVIEW_H
#define BGLVIEW_H
 
// added by Brian Paul:
#ifndef BGL_RGB
#define BGL_RGB 0
#define BGL_INDEX 1
#define BGL_SINGLE 0
#define BGL_DOUBLE 2
#define BGL_DIRECT 0
#define BGL_INDIRECT 4
#define BGL_ACCUM 8
#define BGL_ALPHA 16
#define BGL_DEPTH 32
#define BGL_OVERLAY 64
#define BGL_UNDERLAY 128
#define BGL_STENCIL 512
#endif
 
 
#include <GL/gl.h>
#include <AppKit.h>
#include <interface/Window.h>
#include <interface/View.h>
#include <interface/Bitmap.h>
#include <game/WindowScreen.h>
#include <game/DirectWindow.h>
 
class BGLView : public BView {
public:
 
BGLView(BRect rect, char *name,
ulong resizingMode, ulong mode,
ulong options);
virtual ~BGLView();
 
void LockGL();
void UnlockGL();
void SwapBuffers();
 
// Added for Mesa (can't be virtual!)
void CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height);
 
BView * EmbeddedView();
status_t CopyPixelsOut(BPoint source, BBitmap *dest);
status_t CopyPixelsIn(BBitmap *source, BPoint dest);
 
virtual void ErrorCallback(unsigned long errorCode); // GLenum errorCode);
virtual void Draw(BRect updateRect);
 
virtual void AttachedToWindow();
virtual void AllAttached();
virtual void DetachedFromWindow();
virtual void AllDetached();
virtual void FrameResized(float width, float height);
virtual status_t Perform(perform_code d, void *arg);
 
/* The public methods below, for the moment,
are just pass-throughs to BView */
 
virtual status_t Archive(BMessage *data, bool deep = true) const;
 
virtual void MessageReceived(BMessage *msg);
virtual void SetResizingMode(uint32 mode);
 
virtual void Show();
virtual void Hide();
 
virtual BHandler *ResolveSpecifier(BMessage *msg, int32 index,
BMessage *specifier, int32 form,
const char *property);
virtual status_t GetSupportedSuites(BMessage *data);
 
/* New public functions */
void DirectConnected( direct_buffer_info *info );
void EnableDirectMode( bool enabled );
 
private:
 
virtual void _ReservedGLView1();
virtual void _ReservedGLView2();
virtual void _ReservedGLView3();
virtual void _ReservedGLView4();
virtual void _ReservedGLView5();
virtual void _ReservedGLView6();
virtual void _ReservedGLView7();
virtual void _ReservedGLView8();
 
BGLView(const BGLView &);
BGLView &operator=(const BGLView &);
 
void dither_front();
bool confirm_dither();
void draw(BRect r);
void * m_gc;
uint32 m_options;
uint32 m_ditherCount;
BLocker m_drawLock;
BLocker m_displayLock;
#if OLD_GLVIEW
BView * m_embeddedFront;
BView * m_embeddedBack;
#else
void * m_clip_info;
void * _reserved1;
#endif
BBitmap * m_ditherMap;
BRect m_bounds;
int16 * m_errorBuffer[2];
uint64 _reserved[8];
 
/* Direct Window stuff */
private:
void drawScanline( int x1, int x2, int y, void *data );
static void scanlineHandler(struct rasStateRec *state, GLint x1, GLint x2);
void lock_draw();
void unlock_draw();
bool validateView();
};
 
 
 
class BGLScreen : public BWindowScreen {
public:
BGLScreen(char *name,
ulong screenMode, ulong options,
status_t *error, bool debug=false);
~BGLScreen();
 
void LockGL();
void UnlockGL();
void SwapBuffers();
virtual void ErrorCallback(GLenum errorCode);
 
virtual void ScreenConnected(bool connected);
virtual void FrameResized(float width, float height);
virtual status_t Perform(perform_code d, void *arg);
 
/* The public methods below, for the moment,
are just pass-throughs to BWindowScreen */
 
virtual status_t Archive(BMessage *data, bool deep = true) const;
virtual void MessageReceived(BMessage *msg);
 
virtual void Show();
virtual void Hide();
 
virtual BHandler *ResolveSpecifier(BMessage *msg,
int32 index,
BMessage *specifier,
int32 form,
const char *property);
virtual status_t GetSupportedSuites(BMessage *data);
 
private:
 
virtual void _ReservedGLScreen1();
virtual void _ReservedGLScreen2();
virtual void _ReservedGLScreen3();
virtual void _ReservedGLScreen4();
virtual void _ReservedGLScreen5();
virtual void _ReservedGLScreen6();
virtual void _ReservedGLScreen7();
virtual void _ReservedGLScreen8();
 
BGLScreen(const BGLScreen &);
BGLScreen &operator=(const BGLScreen &);
 
void * m_gc;
long m_options;
BLocker m_drawLock;
int32 m_colorSpace;
uint32 m_screen_mode;
uint64 _reserved[7];
};
 
 
#endif
 
 
 
 
 
/shark/trunk/ports/mesa/src-glut.dos/color.c
0,0 → 1,46
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
 
 
void APIENTRY glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
{
}
 
 
GLfloat APIENTRY glutGetColor (int ndx, int component)
{
return 0.0;
}
 
 
void APIENTRY glutCopyColormap (int win)
{
}
/shark/trunk/ports/mesa/src-glut.dos/state.c
0,0 → 1,70
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
#include "internal.h"
 
 
#define FREQUENCY 100
 
 
static int timer_installed=0; //SHARK
static volatile int ticks;
 
static void ticks_timer (void *p)
{
(void)p;
ticks++;
} ENDOFUNC(ticks_timer)
 
 
 
int APIENTRY glutGet (GLenum type)
{
/* switch (type) { //SHARK
case GLUT_WINDOW_RGBA:
return 1;
case GLUT_ELAPSED_TIME:
if (!timer_installed) {
timer_installed = !timer_installed;
LOCKDATA(ticks);
LOCKFUNC(ticks_timer);
pc_install_int(ticks_timer, NULL, FREQUENCY);
}
return ticks*1000/FREQUENCY;
default:
return 0;
}*/
}
 
 
int APIENTRY glutDeviceGet (GLenum type)
{
return 0;
}
/shark/trunk/ports/mesa/src-glut.dos/overlay.c
0,0 → 1,60
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
 
 
void APIENTRY glutEstablishOverlay (void)
{
}
 
 
void APIENTRY glutRemoveOverlay (void)
{
}
 
 
void APIENTRY glutUseLayer (GLenum layer)
{
}
 
 
void APIENTRY glutPostOverlayRedisplay (void)
{
}
 
 
void APIENTRY glutShowOverlay (void)
{
}
 
 
void APIENTRY glutHideOverlay (void)
{
}
/shark/trunk/ports/mesa/src-glut.dos/internal.h
0,0 → 1,78
/*
* Mesa 3-D graphics library
* Version: 4.0
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
#ifndef INTERNAL_H_included
#define INTERNAL_H_included
 
 
#include "GL/glut.h"
#include "pc_hw/pc_hw.h"
 
 
#define MAX_WINDOWS 4
 
#define DEFAULT_WIDTH 640
#define DEFAULT_HEIGHT 480
#define DEFAULT_BPP 16
 
#define DEPTH_SIZE 16
#define STENCIL_SIZE 8
#define ACCUM_SIZE 16
 
extern GLenum g_display_mode;
extern GLuint g_width;
extern GLuint g_height;
extern GLint g_mouse;
extern GLboolean g_redisplay;
extern GLint g_xpos;
extern GLint g_ypos;
 
extern void (GLUTCALLBACK *display_func) (void);
extern void (GLUTCALLBACK *reshape_func) (int width, int height);
extern void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y);
extern void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y);
extern void (GLUTCALLBACK *motion_func) (int x, int y);
extern void (GLUTCALLBACK *passive_motion_func) (int x, int y);
extern void (GLUTCALLBACK *entry_func) (int state);
extern void (GLUTCALLBACK *visibility_func) (int state);
extern void (GLUTCALLBACK *idle_func) (void);
extern void (GLUTCALLBACK *menu_state_func) (int state);
extern void (GLUTCALLBACK *special_func) (int key, int x, int y);
extern void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z);
extern void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z);
extern void (GLUTCALLBACK *spaceball_button_func) (int button, int state);
extern void (GLUTCALLBACK *button_box_func) (int button, int state);
extern void (GLUTCALLBACK *dials_func) (int dial, int value);
extern void (GLUTCALLBACK *tablet_motion_func) (int x, int y);
extern void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y);
extern void (GLUTCALLBACK *menu_status_func) (int status, int x, int y);
extern void (GLUTCALLBACK *overlay_display_func) (void);
extern void (GLUTCALLBACK *window_status_func) (int state);
 
#endif
/shark/trunk/ports/mesa/src-glut.dos/models.c
0,0 → 1,598
 
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
 
/**
(c) Copyright 1993, Silicon Graphics, Inc.
 
ALL RIGHTS RESERVED
 
Permission to use, copy, modify, and distribute this software
for any purpose and without fee is hereby granted, provided
that the above copyright notice appear in all copies and that
both the copyright notice and this permission notice appear in
supporting documentation, and that the name of Silicon
Graphics, Inc. not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission.
 
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
PERFORMANCE OF THIS SOFTWARE.
 
US Government Users Restricted Rights
 
Use, duplication, or disclosure by the Government is subject to
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
(c)(1)(ii) of the Rights in Technical Data and Computer
Software clause at DFARS 252.227-7013 and/or in similar or
successor clauses in the FAR or the DOD or NASA FAR
Supplement. Unpublished-- rights reserved under the copyright
laws of the United States. Contractor/manufacturer is Silicon
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
94039-7311.
 
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
 
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glut.h"
 
/* Some <math.h> files do not define M_PI... */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
 
static GLUquadricObj *quadObj;
 
#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
 
static void
initQuadObj(void)
{
quadObj = gluNewQuadric();
/* if (!quadObj)
__glutFatalError("out of memory."); */
}
 
/* CENTRY */
void APIENTRY
glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
{
QUAD_OBJ_INIT();
gluQuadricDrawStyle(quadObj, GLU_LINE);
gluQuadricNormals(quadObj, GLU_SMOOTH);
/* If we ever changed/used the texture or orientation state
of quadObj, we'd need to change it to the defaults here
with gluQuadricTexture and/or gluQuadricOrientation. */
gluSphere(quadObj, radius, slices, stacks);
}
 
void APIENTRY
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
{
QUAD_OBJ_INIT();
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluQuadricNormals(quadObj, GLU_SMOOTH);
/* If we ever changed/used the texture or orientation state
of quadObj, we'd need to change it to the defaults here
with gluQuadricTexture and/or gluQuadricOrientation. */
gluSphere(quadObj, radius, slices, stacks);
}
 
void APIENTRY
glutWireCone(GLdouble base, GLdouble height,
GLint slices, GLint stacks)
{
QUAD_OBJ_INIT();
gluQuadricDrawStyle(quadObj, GLU_LINE);
gluQuadricNormals(quadObj, GLU_SMOOTH);
/* If we ever changed/used the texture or orientation state
of quadObj, we'd need to change it to the defaults here
with gluQuadricTexture and/or gluQuadricOrientation. */
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
}
 
void APIENTRY
glutSolidCone(GLdouble base, GLdouble height,
GLint slices, GLint stacks)
{
QUAD_OBJ_INIT();
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluQuadricNormals(quadObj, GLU_SMOOTH);
/* If we ever changed/used the texture or orientation state
of quadObj, we'd need to change it to the defaults here
with gluQuadricTexture and/or gluQuadricOrientation. */
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
}
 
/* ENDCENTRY */
 
static void
drawBox(GLfloat size, GLenum type)
{
static GLfloat n[6][3] =
{
{-1.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{1.0, 0.0, 0.0},
{0.0, -1.0, 0.0},
{0.0, 0.0, 1.0},
{0.0, 0.0, -1.0}
};
static GLint faces[6][4] =
{
{0, 1, 2, 3},
{3, 2, 6, 7},
{7, 6, 5, 4},
{4, 5, 1, 0},
{5, 6, 2, 1},
{7, 4, 0, 3}
};
GLfloat v[8][3];
GLint i;
 
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
 
for (i = 5; i >= 0; i--) {
glBegin(type);
glNormal3fv(&n[i][0]);
glVertex3fv(&v[faces[i][0]][0]);
glVertex3fv(&v[faces[i][1]][0]);
glVertex3fv(&v[faces[i][2]][0]);
glVertex3fv(&v[faces[i][3]][0]);
glEnd();
}
}
 
/* CENTRY */
void APIENTRY
glutWireCube(GLdouble size)
{
drawBox(size, GL_LINE_LOOP);
}
 
void APIENTRY
glutSolidCube(GLdouble size)
{
drawBox(size, GL_QUADS);
}
 
/* ENDCENTRY */
 
static void
doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
{
int i, j;
GLfloat theta, phi, theta1;
GLfloat cosTheta, sinTheta;
GLfloat cosTheta1, sinTheta1;
GLfloat ringDelta, sideDelta;
 
ringDelta = 2.0 * M_PI / rings;
sideDelta = 2.0 * M_PI / nsides;
 
theta = 0.0;
cosTheta = 1.0;
sinTheta = 0.0;
for (i = rings - 1; i >= 0; i--) {
theta1 = theta + ringDelta;
cosTheta1 = cos(theta1);
sinTheta1 = sin(theta1);
glBegin(GL_QUAD_STRIP);
phi = 0.0;
for (j = nsides; j >= 0; j--) {
GLfloat cosPhi, sinPhi, dist;
 
phi += sideDelta;
cosPhi = cos(phi);
sinPhi = sin(phi);
dist = R + r * cosPhi;
 
glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
}
glEnd();
theta = theta1;
cosTheta = cosTheta1;
sinTheta = sinTheta1;
}
}
 
/* CENTRY */
void APIENTRY
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings)
{
glPushAttrib(GL_POLYGON_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
doughnut(innerRadius, outerRadius, nsides, rings);
glPopAttrib();
}
 
void APIENTRY
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings)
{
doughnut(innerRadius, outerRadius, nsides, rings);
}
 
/* ENDCENTRY */
 
static GLfloat dodec[20][3];
 
static void
initDodecahedron(void)
{
GLfloat alpha, beta;
 
alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
/* *INDENT-OFF* */
dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
/* *INDENT-ON* */
 
}
 
#define DIFF3(_a,_b,_c) { \
(_c)[0] = (_a)[0] - (_b)[0]; \
(_c)[1] = (_a)[1] - (_b)[1]; \
(_c)[2] = (_a)[2] - (_b)[2]; \
}
 
static void
crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
{
GLfloat p[3]; /* in case prod == v1 or v2 */
 
p[0] = v1[1] * v2[2] - v2[1] * v1[2];
p[1] = v1[2] * v2[0] - v2[2] * v1[0];
p[2] = v1[0] * v2[1] - v2[0] * v1[1];
prod[0] = p[0];
prod[1] = p[1];
prod[2] = p[2];
}
 
static void
normalize(GLfloat v[3])
{
GLfloat d;
 
d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (d == 0.0) {
// __glutWarning("normalize: zero length vector");
v[0] = d = 1.0;
}
d = 1 / d;
v[0] *= d;
v[1] *= d;
v[2] *= d;
}
 
static void
pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
{
GLfloat n0[3], d1[3], d2[3];
 
DIFF3(dodec[a], dodec[b], d1);
DIFF3(dodec[b], dodec[c], d2);
crossprod(d1, d2, n0);
normalize(n0);
 
glBegin(shadeType);
glNormal3fv(n0);
glVertex3fv(&dodec[a][0]);
glVertex3fv(&dodec[b][0]);
glVertex3fv(&dodec[c][0]);
glVertex3fv(&dodec[d][0]);
glVertex3fv(&dodec[e][0]);
glEnd();
}
 
static void
dodecahedron(GLenum type)
{
static int inited = 0;
 
if (inited == 0) {
inited = 1;
initDodecahedron();
}
pentagon(0, 1, 9, 16, 5, type);
pentagon(1, 0, 3, 18, 7, type);
pentagon(1, 7, 11, 10, 9, type);
pentagon(11, 7, 18, 19, 6, type);
pentagon(8, 17, 16, 9, 10, type);
pentagon(2, 14, 15, 6, 19, type);
pentagon(2, 13, 12, 4, 14, type);
pentagon(2, 19, 18, 3, 13, type);
pentagon(3, 0, 5, 12, 13, type);
pentagon(6, 15, 8, 10, 11, type);
pentagon(4, 17, 8, 15, 14, type);
pentagon(4, 12, 5, 16, 17, type);
}
 
/* CENTRY */
void APIENTRY
glutWireDodecahedron(void)
{
dodecahedron(GL_LINE_LOOP);
}
 
void APIENTRY
glutSolidDodecahedron(void)
{
dodecahedron(GL_TRIANGLE_FAN);
}
 
/* ENDCENTRY */
 
static void
recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
GLenum shadeType)
{
GLfloat q0[3], q1[3];
 
DIFF3(n1, n2, q0);
DIFF3(n2, n3, q1);
crossprod(q0, q1, q1);
normalize(q1);
 
glBegin(shadeType);
glNormal3fv(q1);
glVertex3fv(n1);
glVertex3fv(n2);
glVertex3fv(n3);
glEnd();
}
 
static void
subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
GLenum shadeType)
{
int depth;
GLfloat w0[3], w1[3], w2[3];
GLfloat l;
int i, j, k, n;
 
depth = 1;
for (i = 0; i < depth; i++) {
for (j = 0; i + j < depth; j++) {
k = depth - i - j;
for (n = 0; n < 3; n++) {
w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
/ depth;
w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
/ depth;
}
l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
w0[0] /= l;
w0[1] /= l;
w0[2] /= l;
l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
w1[0] /= l;
w1[1] /= l;
w1[2] /= l;
l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
w2[0] /= l;
w2[1] /= l;
w2[2] /= l;
recorditem(w1, w0, w2, shadeType);
}
}
}
 
static void
drawtriangle(int i, GLfloat data[][3], int ndx[][3],
GLenum shadeType)
{
GLfloat *x0, *x1, *x2;
 
x0 = data[ndx[i][0]];
x1 = data[ndx[i][1]];
x2 = data[ndx[i][2]];
subdivide(x0, x1, x2, shadeType);
}
 
/* octahedron data: The octahedron produced is centered at the
origin and has radius 1.0 */
static GLfloat odata[6][3] =
{
{1.0, 0.0, 0.0},
{-1.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{0.0, -1.0, 0.0},
{0.0, 0.0, 1.0},
{0.0, 0.0, -1.0}
};
 
static int ondex[8][3] =
{
{0, 4, 2},
{1, 2, 4},
{0, 3, 4},
{1, 4, 3},
{0, 2, 5},
{1, 5, 2},
{0, 5, 3},
{1, 3, 5}
};
 
static void
octahedron(GLenum shadeType)
{
int i;
 
for (i = 7; i >= 0; i--) {
drawtriangle(i, odata, ondex, shadeType);
}
}
 
/* CENTRY */
void APIENTRY
glutWireOctahedron(void)
{
octahedron(GL_LINE_LOOP);
}
 
void APIENTRY
glutSolidOctahedron(void)
{
octahedron(GL_TRIANGLES);
}
 
/* ENDCENTRY */
 
/* icosahedron data: These numbers are rigged to make an
icosahedron of radius 1.0 */
 
#define X .525731112119133606
#define Z .850650808352039932
 
static GLfloat idata[12][3] =
{
{-X, 0, Z},
{X, 0, Z},
{-X, 0, -Z},
{X, 0, -Z},
{0, Z, X},
{0, Z, -X},
{0, -Z, X},
{0, -Z, -X},
{Z, X, 0},
{-Z, X, 0},
{Z, -X, 0},
{-Z, -X, 0}
};
 
static int index[20][3] =
{
{0, 4, 1},
{0, 9, 4},
{9, 5, 4},
{4, 5, 8},
{4, 8, 1},
{8, 10, 1},
{8, 3, 10},
{5, 3, 8},
{5, 2, 3},
{2, 7, 3},
{7, 10, 3},
{7, 6, 10},
{7, 11, 6},
{11, 0, 6},
{0, 1, 6},
{6, 1, 10},
{9, 0, 11},
{9, 11, 2},
{9, 2, 5},
{7, 2, 11},
};
 
static void
icosahedron(GLenum shadeType)
{
int i;
 
for (i = 19; i >= 0; i--) {
drawtriangle(i, idata, index, shadeType);
}
}
 
/* CENTRY */
void APIENTRY
glutWireIcosahedron(void)
{
icosahedron(GL_LINE_LOOP);
}
 
void APIENTRY
glutSolidIcosahedron(void)
{
icosahedron(GL_TRIANGLES);
}
 
/* ENDCENTRY */
 
/* tetrahedron data: */
 
#define T 1.73205080756887729
 
static GLfloat tdata[4][3] =
{
{T, T, T},
{T, -T, -T},
{-T, T, -T},
{-T, -T, T}
};
 
static int tndex[4][3] =
{
{0, 1, 3},
{2, 1, 0},
{3, 2, 0},
{1, 2, 3}
};
 
static void
tetrahedron(GLenum shadeType)
{
int i;
 
for (i = 3; i >= 0; i--)
drawtriangle(i, tdata, tndex, shadeType);
}
 
/* CENTRY */
void APIENTRY
glutWireTetrahedron(void)
{
tetrahedron(GL_LINE_LOOP);
}
 
void APIENTRY
glutSolidTetrahedron(void)
{
tetrahedron(GL_TRIANGLES);
}
 
/* ENDCENTRY */
/shark/trunk/ports/mesa/src-glut.dos/globals.c
0,0 → 1,61
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
#include "internal.h"
 
GLenum g_display_mode = 0;
GLuint g_width = DEFAULT_WIDTH;
GLuint g_height = DEFAULT_HEIGHT;
GLint g_mouse = GL_FALSE;
GLboolean g_redisplay = GL_FALSE;
GLint g_xpos = 0;
GLint g_ypos = 0;
 
void (GLUTCALLBACK *display_func) (void) = NULL;
void (GLUTCALLBACK *reshape_func) (int width, int height) = NULL;
void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y) = NULL;
void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y) = NULL;
void (GLUTCALLBACK *motion_func) (int x, int y) = NULL;
void (GLUTCALLBACK *passive_motion_func) (int x, int y) = NULL;
void (GLUTCALLBACK *entry_func) (int state) = NULL;
void (GLUTCALLBACK *visibility_func) (int state) = NULL;
void (GLUTCALLBACK *idle_func) (void) = NULL;
void (GLUTCALLBACK *menu_state_func) (int state) = NULL;
void (GLUTCALLBACK *special_func) (int key, int x, int y) = NULL;
void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z) = NULL;
void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z) = NULL;
void (GLUTCALLBACK *spaceball_button_func) (int button, int state) = NULL;
void (GLUTCALLBACK *button_box_func) (int button, int state) = NULL;
void (GLUTCALLBACK *dials_func) (int dial, int value) = NULL;
void (GLUTCALLBACK *tablet_motion_func) (int x, int y) = NULL;
void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y) = NULL;
void (GLUTCALLBACK *menu_status_func) (int status, int x, int y) = NULL;
void (GLUTCALLBACK *overlay_display_func) (void) = NULL;
void (GLUTCALLBACK *window_status_func) (int state) = NULL;
/shark/trunk/ports/mesa/src-glut.dos/init.c
0,0 → 1,160
/*
* Mesa 3-D graphics library
* Version: 4.0
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
#include "internal.h"
 
 
void APIENTRY glutInit (int *argcp, char **argv)
{
glutGet(GLUT_ELAPSED_TIME);
}
 
 
void APIENTRY glutInitDisplayMode (unsigned int mode)
{
g_display_mode = mode;
 
pc_install_keyb();
g_mouse = pc_install_mouse();
}
 
 
void APIENTRY glutInitWindowPosition (int x, int y)
{
g_xpos = x;
g_ypos = y;
}
 
 
void APIENTRY glutInitWindowSize (int width, int height)
{
g_width = width;
g_height = height;
}
 
 
void APIENTRY glutMainLoop (void)
{
GLboolean idle;
static int old_mouse_x = 0;
static int old_mouse_y = 0;
static int old_mouse_b = 0;
 
glutPostRedisplay();
if (reshape_func) reshape_func(g_width, g_height);
if (visibility_func) visibility_func(GLUT_VISIBLE);
if (g_mouse) pc_show_mouse();
 
while (GL_TRUE) {
idle = GL_TRUE;
 
if (g_redisplay && display_func) {
idle = GL_FALSE;
g_redisplay = GL_FALSE;
 
if (g_mouse && !(g_display_mode & GLUT_DOUBLE)) pc_scare_mouse();
display_func();
if (g_mouse && !(g_display_mode & GLUT_DOUBLE)) pc_unscare_mouse();
}
 
if (pc_keypressed()) {
int key;
 
idle = GL_FALSE;
key = pc_readkey();
 
switch (key>>16) {
case KEY_F1: if (special_func) special_func(GLUT_KEY_F1, 0, 0); break;
case KEY_F2: if (special_func) special_func(GLUT_KEY_F2, 0, 0); break;
case KEY_F3: if (special_func) special_func(GLUT_KEY_F3, 0, 0); break;
case KEY_F4: if (special_func) special_func(GLUT_KEY_F4, 0, 0); break;
case KEY_F5: if (special_func) special_func(GLUT_KEY_F5, 0, 0); break;
case KEY_F6: if (special_func) special_func(GLUT_KEY_F6, 0, 0); break;
case KEY_F7: if (special_func) special_func(GLUT_KEY_F7, 0, 0); break;
case KEY_F8: if (special_func) special_func(GLUT_KEY_F8, 0, 0); break;
case KEY_F9: if (special_func) special_func(GLUT_KEY_F9, 0, 0); break;
case KEY_F10: if (special_func) special_func(GLUT_KEY_F10, 0, 0); break;
case KEY_F11: if (special_func) special_func(GLUT_KEY_F11, 0, 0); break;
case KEY_F12: if (special_func) special_func(GLUT_KEY_F12, 0, 0); break;
case KEY_LEFT: if (special_func) special_func(GLUT_KEY_LEFT, 0, 0); break;
case KEY_UP: if (special_func) special_func(GLUT_KEY_UP, 0, 0); break;
case KEY_RIGHT: if (special_func) special_func(GLUT_KEY_RIGHT, 0, 0); break;
case KEY_DOWN: if (special_func) special_func(GLUT_KEY_DOWN, 0, 0); break;
case KEY_PGUP: if (special_func) special_func(GLUT_KEY_PAGE_UP, 0, 0); break;
case KEY_PGDN: if (special_func) special_func(GLUT_KEY_PAGE_DOWN, 0, 0); break;
case KEY_HOME: if (special_func) special_func(GLUT_KEY_HOME, 0, 0); break;
case KEY_END: if (special_func) special_func(GLUT_KEY_END, 0, 0); break;
case KEY_INSERT: if (special_func) special_func(GLUT_KEY_INSERT, 0, 0); break;
default: if (keyboard_func) keyboard_func(key & 0xFF, 0, 0);
}
}
 
if (g_mouse) {
int mouse_x;
int mouse_y;
int mouse_b;
mouse_b = pc_query_mouse(&mouse_x, &mouse_y);
if (motion_func && ((mouse_x != old_mouse_x) || (mouse_y != old_mouse_y))) {
idle = GL_FALSE;
old_mouse_x = mouse_x;
old_mouse_y = mouse_y;
motion_func(old_mouse_x, old_mouse_y);
}
if (mouse_func && (mouse_b != old_mouse_b)) {
int new_mouse_b = mouse_b;
if ((old_mouse_b & 1) && !(new_mouse_b & 1))
mouse_func(GLUT_LEFT_BUTTON, GLUT_UP, mouse_x, mouse_y);
else if (!(old_mouse_b & 1) && (new_mouse_b & 1))
mouse_func(GLUT_LEFT_BUTTON, GLUT_DOWN, mouse_x, mouse_y);
if ((old_mouse_b & 2) && !(new_mouse_b & 2))
mouse_func(GLUT_RIGHT_BUTTON, GLUT_UP, mouse_x, mouse_y);
else if (!(old_mouse_b & 2) && (new_mouse_b & 2))
mouse_func(GLUT_RIGHT_BUTTON, GLUT_DOWN, mouse_x, mouse_y);
if ((old_mouse_b & 4) && !(new_mouse_b & 4))
mouse_func(GLUT_MIDDLE_BUTTON, GLUT_UP, mouse_x, mouse_y);
else if (!(old_mouse_b & 3) && (new_mouse_b & 4))
mouse_func(GLUT_MIDDLE_BUTTON, GLUT_DOWN, mouse_x, mouse_y);
idle = GL_FALSE;
old_mouse_b = new_mouse_b;
}
}
 
if (idle && idle_func)
idle_func();
}
}
/shark/trunk/ports/mesa/src-glut.dos/menu.c
0,0 → 1,86
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
 
 
int APIENTRY glutCreateMenu (void (GLUTCALLBACK *func) (int))
{
return 0;
}
 
void APIENTRY glutDestroyMenu (int menu)
{
}
 
 
int APIENTRY glutGetMenu (void)
{
return 0;
}
 
 
void APIENTRY glutSetMenu (int menu)
{
}
 
 
void APIENTRY glutAddMenuEntry (const char *label, int value)
{
}
 
 
void APIENTRY glutAddSubMenu (const char *label, int submenu)
{
}
 
 
void APIENTRY glutChangeToMenuEntry (int item, const char *label, int value)
{
}
 
 
void APIENTRY glutChangeToSubMenu (int item, const char *label, int submenu)
{
}
 
 
void APIENTRY glutRemoveMenuItem (int item)
{
}
 
 
void APIENTRY glutAttachMenu (int button)
{
}
 
 
void APIENTRY glutDetachMenu (int button)
{
}
/shark/trunk/ports/mesa/src-glut.dos/window.c
0,0 → 1,260
/*
* Mesa 3-D graphics library
* Version: 4.1
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.2 for Mesa 4.1
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
#ifndef FX
#include "GL/dmesa.h"
#else
#include "GL/fxmesa.h"
#endif
#include "internal.h"
 
 
 
static int window;
 
#ifndef FX
static DMesaVisual visual = NULL;
static DMesaContext context = NULL;
static DMesaBuffer buffer[MAX_WINDOWS];
#else
static void *visual = NULL;
static fxMesaContext context = NULL;
static int fx_attrib[32];
#endif
 
 
 
static void clean (void)
{
int i;
 
for (i=0; i<MAX_WINDOWS; i++) {
glutDestroyWindow(i+1);
}
#ifndef FX
if (context) DMesaDestroyContext(context);
if (visual) DMesaDestroyVisual(visual);
#else
if (context) fxMesaDestroyContext(context);
#endif
 
pc_close_stdout();
pc_close_stderr();
}
 
 
 
int APIENTRY glutCreateWindow (const char *title)
{
int i;
 
if (!visual) {
int screen_w = DEFAULT_WIDTH;
int screen_h = DEFAULT_HEIGHT;
 
if ((g_width<=640) && (g_height<=480)) {
screen_w = 640;
screen_h = 480;
} else if ((g_width<=800) && (g_height<=600)) {
screen_w = 800;
screen_h = 600;
} else if ((g_width<=1024) && (g_height<=768)) {
screen_w = 1024;
screen_h = 768;
}
 
#ifndef FX
if ((visual=DMesaCreateVisual(screen_w, screen_h, DEFAULT_BPP,
g_display_mode & GLUT_DOUBLE,
g_display_mode & GLUT_DEPTH ?DEPTH_SIZE :0,
g_display_mode & GLUT_STENCIL?STENCIL_SIZE:0,
g_display_mode & GLUT_ACCUM ?ACCUM_SIZE :0))==NULL) {
return 0;
}
if ((context=DMesaCreateContext(visual, NULL))==NULL) {
DMesaDestroyVisual(visual);
return 0;
}
#else
i = 0;
if (g_display_mode & GLUT_DOUBLE) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
if (g_display_mode & GLUT_DEPTH) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = DEPTH_SIZE; }
if (g_display_mode & GLUT_STENCIL) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = STENCIL_SIZE; }
if (g_display_mode & GLUT_ACCUM) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = ACCUM_SIZE; }
fx_attrib[i] = FXMESA_NONE;
if ((context=fxMesaCreateBestContext(-1, screen_w, screen_h, fx_attrib))==NULL) {
return 0;
}
visual = context;
#endif
pc_open_stdout();
pc_open_stderr();
pc_atexit(clean);
}
 
#ifndef FX
for (i=0; i<MAX_WINDOWS; i++) {
if (!buffer[i]) {
DMesaBuffer b;
if ((b=DMesaCreateBuffer(visual, g_xpos, g_ypos, g_width, g_height))==NULL) {
return 0;
}
if (!DMesaMakeCurrent(context, b)) {
DMesaDestroyBuffer(b);
return 0;
}
if (g_mouse) {
pc_mouse_area(g_xpos, g_ypos, g_xpos + g_width - 1, g_ypos + g_height - 1);
}
 
buffer[window = i] = b;
return i+1;
}
}
 
return 0;
#else
fxMesaMakeCurrent(context);
 
return 1;
#endif
}
 
 
int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
{
return GL_FALSE;
}
 
 
void APIENTRY glutDestroyWindow (int win)
{
#ifndef FX
if (buffer[win-1]) {
DMesaDestroyBuffer(buffer[win-1]);
buffer[win-1] = NULL;
}
#endif
}
 
 
void APIENTRY glutPostRedisplay (void)
{
g_redisplay = GL_TRUE;
}
 
 
void APIENTRY glutSwapBuffers (void)
{
if (g_mouse) pc_scare_mouse();
#ifndef FX
DMesaSwapBuffers(buffer[window]);
#else
fxMesaSwapBuffers();
#endif
if (g_mouse) pc_unscare_mouse();
}
 
 
int APIENTRY glutGetWindow (void)
{
return window + 1;
}
 
 
void APIENTRY glutSetWindow (int win)
{
window = win - 1;
}
 
 
void APIENTRY glutSetWindowTitle (const char *title)
{
}
 
 
void APIENTRY glutSetIconTitle (const char *title)
{
}
 
 
void APIENTRY glutPositionWindow (int x, int y)
{
#ifndef FX
if (DMesaViewport(buffer[window], x, y, g_width, g_height)) {
g_xpos = x;
g_ypos = y;
}
#endif
}
 
 
void APIENTRY glutReshapeWindow (int width, int height)
{
#ifndef FX
if (DMesaViewport(buffer[window], g_xpos, g_ypos, width, height)) {
g_width = width;
g_height = height;
if (reshape_func) {
reshape_func(width, height);
} else {
glViewport(0, 0, width, height);
}
}
#endif
}
 
 
void APIENTRY glutPopWindow (void)
{
}
 
 
void APIENTRY glutPushWindow (void)
{
}
 
 
void APIENTRY glutIconifyWindow (void)
{
}
 
 
void APIENTRY glutShowWindow (void)
{
}
 
 
void APIENTRY glutHideWindow (void)
{
}
/shark/trunk/ports/mesa/src-glut.dos/teapot.c
0,0 → 1,212
 
/* Copyright (c) Mark J. Kilgard, 1994. */
 
/**
(c) Copyright 1993, Silicon Graphics, Inc.
 
ALL RIGHTS RESERVED
 
Permission to use, copy, modify, and distribute this software
for any purpose and without fee is hereby granted, provided
that the above copyright notice appear in all copies and that
both the copyright notice and this permission notice appear in
supporting documentation, and that the name of Silicon
Graphics, Inc. not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission.
 
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
PERFORMANCE OF THIS SOFTWARE.
 
US Government Users Restricted Rights
 
Use, duplication, or disclosure by the Government is subject to
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
(c)(1)(ii) of the Rights in Technical Data and Computer
Software clause at DFARS 252.227-7013 and/or in similar or
successor clauses in the FAR or the DOD or NASA FAR
Supplement. Unpublished-- rights reserved under the copyright
laws of the United States. Contractor/manufacturer is Silicon
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
94039-7311.
 
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
 
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glut.h"
 
/* Rim, body, lid, and bottom data must be reflected in x and
y; handle and spout data across the y axis only. */
 
static int patchdata[][16] =
{
/* rim */
{102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15},
/* body */
{12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27},
{24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40},
/* lid */
{96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
101, 0, 1, 2, 3,},
{0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117},
/* bottom */
{118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
125, 120, 40, 39, 38, 37},
/* handle */
{41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56},
{53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
28, 65, 66, 67},
/* spout */
{68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83},
{80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95}
};
/* *INDENT-OFF* */
 
static float cpdata[][3] =
{
{0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
-0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
{0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
{1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
{0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
{1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
{1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
-1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
-0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
{-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
-0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
-0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
{2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
-0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
{3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
{3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
{2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
-0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
{0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
-0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
{0.84, -1.5, 0.075}
};
 
static float tex[2][2][2] =
{
{ {0, 0},
{1, 0}},
{ {0, 1},
{1, 1}}
};
 
/* *INDENT-ON* */
 
static void
teapot(GLint grid, GLdouble scale, GLenum type)
{
float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
long i, j, k, l;
 
glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_MAP2_VERTEX_3);
glEnable(GL_MAP2_TEXTURE_COORD_2);
glPushMatrix();
glRotatef(270.0, 1.0, 0.0, 0.0);
glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
glTranslatef(0.0, 0.0, -1.5);
for (i = 0; i < 10; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++) {
for (l = 0; l < 3; l++) {
p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
if (l == 1)
q[j][k][l] *= -1.0;
if (i < 6) {
r[j][k][l] =
cpdata[patchdata[i][j * 4 + (3 - k)]][l];
if (l == 0)
r[j][k][l] *= -1.0;
s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
if (l == 0)
s[j][k][l] *= -1.0;
if (l == 1)
s[j][k][l] *= -1.0;
}
}
}
}
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
&tex[0][0][0]);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
&p[0][0][0]);
glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
glEvalMesh2(type, 0, grid, 0, grid);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
&q[0][0][0]);
glEvalMesh2(type, 0, grid, 0, grid);
if (i < 6) {
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
&r[0][0][0]);
glEvalMesh2(type, 0, grid, 0, grid);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
&s[0][0][0]);
glEvalMesh2(type, 0, grid, 0, grid);
}
}
glPopMatrix();
glPopAttrib();
}
 
/* CENTRY */
void APIENTRY
glutSolidTeapot(GLdouble scale)
{
teapot(7, scale, GL_FILL);
}
 
void APIENTRY
glutWireTeapot(GLdouble scale)
{
teapot(10, scale, GL_LINE);
}
 
/* ENDCENTRY */
/shark/trunk/ports/mesa/src-glut.dos/bitmap.c
0,0 → 1,56
 
/* Copyright (c) Mark J. Kilgard, 1994. */
 
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
 
#include "glutbitmap.h"
 
void APIENTRY
glutBitmapCharacter(GLUTbitmapFont font, int c)
{
const BitmapCharRec *ch;
BitmapFontPtr fontinfo;
GLint swapbytes, lsbfirst, rowlength;
GLint skiprows, skippixels, alignment;
 
#if defined(_WIN32)
fontinfo = (BitmapFontPtr) __glutFont(font);
#else
fontinfo = (BitmapFontPtr) font;
#endif
 
if (c < fontinfo->first ||
c >= fontinfo->first + fontinfo->num_chars)
return;
ch = fontinfo->ch[c - fontinfo->first];
if (ch) {
/* Save current modes. */
glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
/* Little endian machines (DEC Alpha for example) could
benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
instead of GL_FALSE, but this would require changing the
generated bitmaps too. */
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
ch->advance, 0, ch->bitmap);
/* Restore saved modes. */
glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
}
}
/shark/trunk/ports/mesa/src-glut.dos/callback.c
0,0 → 1,152
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-1998 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
 
 
#include "GL/glut.h"
#include "internal.h"
 
 
void APIENTRY glutDisplayFunc (void (GLUTCALLBACK *func) (void))
{
display_func = func;
}
 
 
void APIENTRY glutReshapeFunc (void (GLUTCALLBACK *func) (int width, int height))
{
reshape_func = func;
}
 
 
void APIENTRY glutKeyboardFunc (void (GLUTCALLBACK *func) (unsigned char key, int x, int y))
{
keyboard_func = func;
}
 
 
void APIENTRY glutMouseFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y))
{
mouse_func = func;
}
 
 
void APIENTRY glutMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
{
motion_func = func;
}
 
 
void APIENTRY glutPassiveMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
{
passive_motion_func = func;
}
 
 
void APIENTRY glutEntryFunc (void (GLUTCALLBACK *func) (int state))
{
entry_func = func;
}
 
 
void APIENTRY glutVisibilityFunc (void (GLUTCALLBACK *func) (int state))
{
visibility_func = func;
}
 
 
void APIENTRY glutIdleFunc (void (GLUTCALLBACK *func) (void))
{
idle_func = func;
}
 
 
void APIENTRY glutTimerFunc (unsigned int millis, void (GLUTCALLBACK *func) (int value), int value)
{
}
 
 
void APIENTRY glutMenuStateFunc (void (GLUTCALLBACK *func) (int state))
{
menu_state_func = func;
}
 
 
void APIENTRY glutSpecialFunc (void (GLUTCALLBACK *func) (int key, int x, int y))
{
special_func = func;
}
 
 
void APIENTRY glutSpaceballMotionFunc (void (GLUTCALLBACK *func) (int x, int y, int z))
{
}
 
 
void APIENTRY glutSpaceballRotateFunc (void (GLUTCALLBACK *func) (int x, int y, int z))
{
}
 
 
void APIENTRY glutSpaceballButtonFunc (void (GLUTCALLBACK *func) (int button, int state))
{
}
 
 
void APIENTRY glutButtonBoxFunc (void (GLUTCALLBACK *func) (int button, int state))
{
}
 
 
void APIENTRY glutDialsFunc (void (GLUTCALLBACK *func) (int dial, int value))
{
}
 
 
void APIENTRY glutTabletMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
{
}
 
 
void APIENTRY glutTabletButtonFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y))
{
}
 
 
void APIENTRY glutMenuStatusFunc (void (GLUTCALLBACK *func) (int status, int x, int y))
{
}
 
 
void APIENTRY glutOverlayDisplayFunc (void (GLUTCALLBACK *func) (void))
{
}
 
 
void APIENTRY glutWindowStatusFunc (void (GLUTCALLBACK *func) (int state))
{
}
/shark/trunk/ports/mesa/src-glut.dos/glutbitmap.h
0,0 → 1,32
#ifndef __glutbitmap_h__
#define __glutbitmap_h__
 
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
 
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
 
#define GLUT_NO_LIB_PRAGMA /* Avoid auto library linking when building
the GLUT library itself. */
#include <GL/glut.h>
 
typedef struct {
const GLsizei width;
const GLsizei height;
const GLfloat xorig;
const GLfloat yorig;
const GLfloat advance;
const GLubyte *bitmap;
} BitmapCharRec, *BitmapCharPtr;
 
typedef struct {
const char *name;
const int num_chars;
const int first;
const BitmapCharRec * const *ch;
} BitmapFontRec, *BitmapFontPtr;
 
typedef void *GLUTbitmapFont;
 
#endif /* __glutbitmap_h__ */
/shark/trunk/ports/mesa/src/dispatch.c
0,0 → 1,91
/* $Id: dispatch.c,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* This file generates all the gl* function entyrpoints.
* But if we're using X86-optimized dispatch (X86/glapi_x86.S) then
* we don't use this code.
*
* NOTE: This file should _not_ be used when compiling Mesa for a DRI-
* based device driver.
*
*/
 
 
#include "glheader.h"
#include "glapi.h"
#include "glapitable.h"
#include "glthread.h"
 
 
#if !(defined(USE_X86_ASM) || defined(USE_SPARC_ASM))
 
#if defined(WIN32)
#define KEYWORD1 GLAPI
#else
#define KEYWORD1
#endif
 
#define KEYWORD2 GLAPIENTRY
 
#if defined(USE_MGL_NAMESPACE)
#define NAME(func) mgl##func
#else
#define NAME(func) gl##func
#endif
 
 
#if 0 /* Use this to log GL calls to stdout (for DEBUG only!) */
 
#define F stdout
#define DISPATCH(FUNC, ARGS, MESSAGE) \
fprintf MESSAGE; \
(_glapi_Dispatch->FUNC) ARGS;
 
#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \
fprintf MESSAGE; \
return (_glapi_Dispatch->FUNC) ARGS
 
#else
 
#define DISPATCH(FUNC, ARGS, MESSAGE) \
(_glapi_Dispatch->FUNC) ARGS;
 
#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \
return (_glapi_Dispatch->FUNC) ARGS
 
#endif /* logging */
 
 
#ifndef GLAPIENTRY
#define GLAPIENTRY
#endif
 
#include "glapitemp.h"
 
 
#endif /* USE_X86_ASM */
/shark/trunk/ports/mesa/src/histogram.h
0,0 → 1,62
/* $Id: histogram.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef HISTOGRAM_H
#define HISTOGRAM_H
 
#include "glheader.h"
#include "mtypes.h"
 
 
extern void _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values);
 
extern void _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
 
extern void _mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params);
 
extern void _mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params);
 
extern void _mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params);
 
extern void _mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params);
 
extern void _mesa_Histogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
 
extern void _mesa_Minmax(GLenum target, GLenum internalformat, GLboolean sink);
 
extern void _mesa_ResetHistogram(GLenum target);
 
extern void _mesa_ResetMinmax(GLenum target);
 
extern void
_mesa_update_minmax(GLcontext *ctx, GLuint n, const GLfloat rgba[][4]);
 
extern void
_mesa_update_histogram(GLcontext *ctx, GLuint n, const GLfloat rgba[][4]);
 
 
#endif
/shark/trunk/ports/mesa/src/depth.c
0,0 → 1,118
/* $Id: depth.c,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "context.h"
#include "enums.h"
#include "depth.h"
#include "macros.h"
#include "mtypes.h"
 
 
/**********************************************************************/
/***** API Functions *****/
/**********************************************************************/
 
 
 
void
_mesa_ClearDepth( GLclampd depth )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat tmp = (GLfloat) CLAMP( depth, 0.0, 1.0 );
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Depth.Clear == tmp)
return;
 
FLUSH_VERTICES(ctx, _NEW_DEPTH);
ctx->Depth.Clear = tmp;
if (ctx->Driver.ClearDepth)
(*ctx->Driver.ClearDepth)( ctx, ctx->Depth.Clear );
}
 
 
 
void
_mesa_DepthFunc( GLenum func )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glDepthFunc %s\n", _mesa_lookup_enum_by_nr(func));
 
switch (func) {
case GL_LESS: /* (default) pass if incoming z < stored z */
case GL_GEQUAL:
case GL_LEQUAL:
case GL_GREATER:
case GL_NOTEQUAL:
case GL_EQUAL:
case GL_ALWAYS:
case GL_NEVER:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glDepth.Func" );
return;
}
 
if (ctx->Depth.Func == func)
return;
 
FLUSH_VERTICES(ctx, _NEW_DEPTH);
ctx->Depth.Func = func;
 
if (ctx->Driver.DepthFunc)
ctx->Driver.DepthFunc( ctx, func );
}
 
 
 
void
_mesa_DepthMask( GLboolean flag )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glDepthMask %d\n", flag);
 
/*
* GL_TRUE indicates depth buffer writing is enabled (default)
* GL_FALSE indicates depth buffer writing is disabled
*/
if (ctx->Depth.Mask == flag)
return;
 
FLUSH_VERTICES(ctx, _NEW_DEPTH);
ctx->Depth.Mask = flag;
 
if (ctx->Driver.DepthMask)
ctx->Driver.DepthMask( ctx, flag );
}
/shark/trunk/ports/mesa/src/light.c
0,0 → 1,1294
/* $Id: light.c,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "simple_list.h"
#include "mtypes.h"
#include "math/m_xform.h"
#include "math/m_matrix.h"
 
 
/* XXX this is a bit of a hack needed for compilation within XFree86 */
#ifndef FLT_MIN
#define FLT_MIN 1e-37
#endif
 
 
void
_mesa_ShadeModel( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glShadeModel %s\n", _mesa_lookup_enum_by_nr(mode));
 
if (mode != GL_FLAT && mode != GL_SMOOTH) {
_mesa_error( ctx, GL_INVALID_ENUM, "glShadeModel" );
return;
}
 
if (ctx->Light.ShadeModel == mode)
return;
 
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.ShadeModel = mode;
ctx->_TriangleCaps ^= DD_FLATSHADE;
if (ctx->Driver.ShadeModel)
(*ctx->Driver.ShadeModel)( ctx, mode );
}
 
 
 
void
_mesa_Lightf( GLenum light, GLenum pname, GLfloat param )
{
_mesa_Lightfv( light, pname, &param );
}
 
 
void
_mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLint i = (GLint) (light - GL_LIGHT0);
struct gl_light *l = &ctx->Light.Light[i];
 
if (i < 0 || i >= (GLint) ctx->Const.MaxLights) {
_mesa_error( ctx, GL_INVALID_ENUM, "glLight(light=0x%x)", light );
return;
}
 
switch (pname) {
case GL_AMBIENT:
if (TEST_EQ_4V(l->Ambient, params))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_4V( l->Ambient, params );
break;
case GL_DIFFUSE:
if (TEST_EQ_4V(l->Diffuse, params))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_4V( l->Diffuse, params );
break;
case GL_SPECULAR:
if (TEST_EQ_4V(l->Specular, params))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_4V( l->Specular, params );
break;
case GL_POSITION: {
GLfloat tmp[4];
/* transform position by ModelView matrix */
TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->m, params );
if (TEST_EQ_4V(l->EyePosition, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_4V(l->EyePosition, tmp);
if (l->EyePosition[3] != 0.0F)
l->_Flags |= LIGHT_POSITIONAL;
else
l->_Flags &= ~LIGHT_POSITIONAL;
break;
}
case GL_SPOT_DIRECTION: {
GLfloat tmp[4];
/* transform direction by inverse modelview */
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
TRANSFORM_NORMAL( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_3V(l->EyeDirection, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_3V(l->EyeDirection, tmp);
break;
}
case GL_SPOT_EXPONENT:
if (params[0]<0.0 || params[0]>128.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLight" );
return;
}
if (l->SpotExponent == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->SpotExponent = params[0];
_mesa_invalidate_spot_exp_table( l );
break;
case GL_SPOT_CUTOFF:
if ((params[0]<0.0 || params[0]>90.0) && params[0]!=180.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLight" );
return;
}
if (l->SpotCutoff == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->SpotCutoff = params[0];
l->_CosCutoff = (GLfloat) _mesa_cos(params[0]*DEG2RAD);
if (l->_CosCutoff < 0)
l->_CosCutoff = 0;
if (l->SpotCutoff != 180.0F)
l->_Flags |= LIGHT_SPOT;
else
l->_Flags &= ~LIGHT_SPOT;
break;
case GL_CONSTANT_ATTENUATION:
if (params[0]<0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLight" );
return;
}
if (l->ConstantAttenuation == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->ConstantAttenuation = params[0];
break;
case GL_LINEAR_ATTENUATION:
if (params[0]<0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLight" );
return;
}
if (l->LinearAttenuation == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->LinearAttenuation = params[0];
break;
case GL_QUADRATIC_ATTENUATION:
if (params[0]<0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLight" );
return;
}
if (l->QuadraticAttenuation == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->QuadraticAttenuation = params[0];
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glLight(pname=0x%x)", pname );
return;
}
 
if (ctx->Driver.Lightfv)
ctx->Driver.Lightfv( ctx, light, pname, params );
}
 
 
void
_mesa_Lighti( GLenum light, GLenum pname, GLint param )
{
_mesa_Lightiv( light, pname, &param );
}
 
 
void
_mesa_Lightiv( GLenum light, GLenum pname, const GLint *params )
{
GLfloat fparam[4];
 
switch (pname) {
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_SPECULAR:
fparam[0] = INT_TO_FLOAT( params[0] );
fparam[1] = INT_TO_FLOAT( params[1] );
fparam[2] = INT_TO_FLOAT( params[2] );
fparam[3] = INT_TO_FLOAT( params[3] );
break;
case GL_POSITION:
fparam[0] = (GLfloat) params[0];
fparam[1] = (GLfloat) params[1];
fparam[2] = (GLfloat) params[2];
fparam[3] = (GLfloat) params[3];
break;
case GL_SPOT_DIRECTION:
fparam[0] = (GLfloat) params[0];
fparam[1] = (GLfloat) params[1];
fparam[2] = (GLfloat) params[2];
break;
case GL_SPOT_EXPONENT:
case GL_SPOT_CUTOFF:
case GL_CONSTANT_ATTENUATION:
case GL_LINEAR_ATTENUATION:
case GL_QUADRATIC_ATTENUATION:
fparam[0] = (GLfloat) params[0];
break;
default:
/* error will be caught later in gl_Lightfv */
;
}
 
_mesa_Lightfv( light, pname, fparam );
}
 
 
 
void
_mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLint l = (GLint) (light - GL_LIGHT0);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (l < 0 || l >= (GLint) ctx->Const.MaxLights) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetLightfv" );
return;
}
 
switch (pname) {
case GL_AMBIENT:
COPY_4V( params, ctx->Light.Light[l].Ambient );
break;
case GL_DIFFUSE:
COPY_4V( params, ctx->Light.Light[l].Diffuse );
break;
case GL_SPECULAR:
COPY_4V( params, ctx->Light.Light[l].Specular );
break;
case GL_POSITION:
COPY_4V( params, ctx->Light.Light[l].EyePosition );
break;
case GL_SPOT_DIRECTION:
COPY_3V( params, ctx->Light.Light[l].EyeDirection );
break;
case GL_SPOT_EXPONENT:
params[0] = ctx->Light.Light[l].SpotExponent;
break;
case GL_SPOT_CUTOFF:
params[0] = ctx->Light.Light[l].SpotCutoff;
break;
case GL_CONSTANT_ATTENUATION:
params[0] = ctx->Light.Light[l].ConstantAttenuation;
break;
case GL_LINEAR_ATTENUATION:
params[0] = ctx->Light.Light[l].LinearAttenuation;
break;
case GL_QUADRATIC_ATTENUATION:
params[0] = ctx->Light.Light[l].QuadraticAttenuation;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetLightfv" );
break;
}
}
 
 
 
void
_mesa_GetLightiv( GLenum light, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
GLint l = (GLint) (light - GL_LIGHT0);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (l < 0 || l >= (GLint) ctx->Const.MaxLights) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetLightiv" );
return;
}
 
switch (pname) {
case GL_AMBIENT:
params[0] = FLOAT_TO_INT(ctx->Light.Light[l].Ambient[0]);
params[1] = FLOAT_TO_INT(ctx->Light.Light[l].Ambient[1]);
params[2] = FLOAT_TO_INT(ctx->Light.Light[l].Ambient[2]);
params[3] = FLOAT_TO_INT(ctx->Light.Light[l].Ambient[3]);
break;
case GL_DIFFUSE:
params[0] = FLOAT_TO_INT(ctx->Light.Light[l].Diffuse[0]);
params[1] = FLOAT_TO_INT(ctx->Light.Light[l].Diffuse[1]);
params[2] = FLOAT_TO_INT(ctx->Light.Light[l].Diffuse[2]);
params[3] = FLOAT_TO_INT(ctx->Light.Light[l].Diffuse[3]);
break;
case GL_SPECULAR:
params[0] = FLOAT_TO_INT(ctx->Light.Light[l].Specular[0]);
params[1] = FLOAT_TO_INT(ctx->Light.Light[l].Specular[1]);
params[2] = FLOAT_TO_INT(ctx->Light.Light[l].Specular[2]);
params[3] = FLOAT_TO_INT(ctx->Light.Light[l].Specular[3]);
break;
case GL_POSITION:
params[0] = (GLint) ctx->Light.Light[l].EyePosition[0];
params[1] = (GLint) ctx->Light.Light[l].EyePosition[1];
params[2] = (GLint) ctx->Light.Light[l].EyePosition[2];
params[3] = (GLint) ctx->Light.Light[l].EyePosition[3];
break;
case GL_SPOT_DIRECTION:
params[0] = (GLint) ctx->Light.Light[l].EyeDirection[0];
params[1] = (GLint) ctx->Light.Light[l].EyeDirection[1];
params[2] = (GLint) ctx->Light.Light[l].EyeDirection[2];
break;
case GL_SPOT_EXPONENT:
params[0] = (GLint) ctx->Light.Light[l].SpotExponent;
break;
case GL_SPOT_CUTOFF:
params[0] = (GLint) ctx->Light.Light[l].SpotCutoff;
break;
case GL_CONSTANT_ATTENUATION:
params[0] = (GLint) ctx->Light.Light[l].ConstantAttenuation;
break;
case GL_LINEAR_ATTENUATION:
params[0] = (GLint) ctx->Light.Light[l].LinearAttenuation;
break;
case GL_QUADRATIC_ATTENUATION:
params[0] = (GLint) ctx->Light.Light[l].QuadraticAttenuation;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetLightiv" );
break;
}
}
 
 
 
/**********************************************************************/
/*** Light Model ***/
/**********************************************************************/
 
 
void
_mesa_LightModelfv( GLenum pname, const GLfloat *params )
{
GLenum newenum;
GLboolean newbool;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (pname) {
case GL_LIGHT_MODEL_AMBIENT:
if (TEST_EQ_4V( ctx->Light.Model.Ambient, params ))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
COPY_4V( ctx->Light.Model.Ambient, params );
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
newbool = (params[0]!=0.0);
if (ctx->Light.Model.LocalViewer == newbool)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Model.LocalViewer = newbool;
break;
case GL_LIGHT_MODEL_TWO_SIDE:
newbool = (params[0]!=0.0);
if (ctx->Light.Model.TwoSide == newbool)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Model.TwoSide = newbool;
 
if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
else
ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
if (params[0] == (GLfloat) GL_SINGLE_COLOR)
newenum = GL_SINGLE_COLOR;
else if (params[0] == (GLfloat) GL_SEPARATE_SPECULAR_COLOR)
newenum = GL_SEPARATE_SPECULAR_COLOR;
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glLightModel(param=0x0%x)",
(GLint) params[0] );
return;
}
if (ctx->Light.Model.ColorControl == newenum)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Model.ColorControl = newenum;
 
if ((ctx->Light.Enabled &&
ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR)
|| ctx->Fog.ColorSumEnabled)
ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR;
else
ctx->_TriangleCaps &= ~DD_SEPARATE_SPECULAR;
 
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glLightModel(pname=0x%x)", pname );
break;
}
 
if (ctx->Driver.LightModelfv)
ctx->Driver.LightModelfv( ctx, pname, params );
}
 
 
void
_mesa_LightModeliv( GLenum pname, const GLint *params )
{
GLfloat fparam[4];
 
switch (pname) {
case GL_LIGHT_MODEL_AMBIENT:
fparam[0] = INT_TO_FLOAT( params[0] );
fparam[1] = INT_TO_FLOAT( params[1] );
fparam[2] = INT_TO_FLOAT( params[2] );
fparam[3] = INT_TO_FLOAT( params[3] );
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
case GL_LIGHT_MODEL_TWO_SIDE:
case GL_LIGHT_MODEL_COLOR_CONTROL:
fparam[0] = (GLfloat) params[0];
break;
default:
/* Error will be caught later in gl_LightModelfv */
;
}
_mesa_LightModelfv( pname, fparam );
}
 
 
void
_mesa_LightModeli( GLenum pname, GLint param )
{
_mesa_LightModeliv( pname, &param );
}
 
 
void
_mesa_LightModelf( GLenum pname, GLfloat param )
{
_mesa_LightModelfv( pname, &param );
}
 
 
 
/********** MATERIAL **********/
 
 
/*
* Given a face and pname value (ala glColorMaterial), compute a bitmask
* of the targeted material values.
*/
GLuint
_mesa_material_bitmask( GLcontext *ctx, GLenum face, GLenum pname,
GLuint legal, const char *where )
{
GLuint bitmask = 0;
 
/* Make a bitmask indicating what material attribute(s) we're updating */
switch (pname) {
case GL_EMISSION:
bitmask |= FRONT_EMISSION_BIT | BACK_EMISSION_BIT;
break;
case GL_AMBIENT:
bitmask |= FRONT_AMBIENT_BIT | BACK_AMBIENT_BIT;
break;
case GL_DIFFUSE:
bitmask |= FRONT_DIFFUSE_BIT | BACK_DIFFUSE_BIT;
break;
case GL_SPECULAR:
bitmask |= FRONT_SPECULAR_BIT | BACK_SPECULAR_BIT;
break;
case GL_SHININESS:
bitmask |= FRONT_SHININESS_BIT | BACK_SHININESS_BIT;
break;
case GL_AMBIENT_AND_DIFFUSE:
bitmask |= FRONT_AMBIENT_BIT | BACK_AMBIENT_BIT;
bitmask |= FRONT_DIFFUSE_BIT | BACK_DIFFUSE_BIT;
break;
case GL_COLOR_INDEXES:
bitmask |= FRONT_INDEXES_BIT | BACK_INDEXES_BIT;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, where );
return 0;
}
 
if (face==GL_FRONT) {
bitmask &= FRONT_MATERIAL_BITS;
}
else if (face==GL_BACK) {
bitmask &= BACK_MATERIAL_BITS;
}
else if (face != GL_FRONT_AND_BACK) {
_mesa_error( ctx, GL_INVALID_ENUM, where );
return 0;
}
 
if (bitmask & ~legal) {
_mesa_error( ctx, GL_INVALID_ENUM, where );
return 0;
}
 
return bitmask;
}
 
 
/* Perform a straight copy between pairs of materials.
*/
void _mesa_copy_material_pairs( struct gl_material dst[2],
const struct gl_material src[2],
GLuint bitmask )
{
if (bitmask & FRONT_EMISSION_BIT) {
COPY_4FV( dst[0].Emission, src[0].Emission );
}
if (bitmask & BACK_EMISSION_BIT) {
COPY_4FV( dst[1].Emission, src[1].Emission );
}
if (bitmask & FRONT_AMBIENT_BIT) {
COPY_4FV( dst[0].Ambient, src[0].Ambient );
}
if (bitmask & BACK_AMBIENT_BIT) {
COPY_4FV( dst[1].Ambient, src[1].Ambient );
}
if (bitmask & FRONT_DIFFUSE_BIT) {
COPY_4FV( dst[0].Diffuse, src[0].Diffuse );
}
if (bitmask & BACK_DIFFUSE_BIT) {
COPY_4FV( dst[1].Diffuse, src[1].Diffuse );
}
if (bitmask & FRONT_SPECULAR_BIT) {
COPY_4FV( dst[0].Specular, src[0].Specular );
}
if (bitmask & BACK_SPECULAR_BIT) {
COPY_4FV( dst[1].Specular, src[1].Specular );
}
if (bitmask & FRONT_SHININESS_BIT) {
dst[0].Shininess = src[0].Shininess;
}
if (bitmask & BACK_SHININESS_BIT) {
dst[1].Shininess = src[1].Shininess;
}
if (bitmask & FRONT_INDEXES_BIT) {
dst[0].AmbientIndex = src[0].AmbientIndex;
dst[0].DiffuseIndex = src[0].DiffuseIndex;
dst[0].SpecularIndex = src[0].SpecularIndex;
}
if (bitmask & BACK_INDEXES_BIT) {
dst[1].AmbientIndex = src[1].AmbientIndex;
dst[1].DiffuseIndex = src[1].DiffuseIndex;
dst[1].SpecularIndex = src[1].SpecularIndex;
}
}
 
 
/*
* Check if the global material has to be updated with info that was
* associated with a vertex via glMaterial.
* This function is used when any material values get changed between
* glBegin/glEnd either by calling glMaterial() or by calling glColor()
* when GL_COLOR_MATERIAL is enabled.
*
* src[0] is front material, src[1] is back material
*
* Additionally keeps the precomputed lighting state uptodate.
*/
void _mesa_update_material( GLcontext *ctx,
const struct gl_material src[2],
GLuint bitmask )
{
struct gl_light *light, *list = &ctx->Light.EnabledList;
 
if (ctx->Light.ColorMaterialEnabled)
bitmask &= ~ctx->Light.ColorMaterialBitmask;
 
if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
_mesa_debug(ctx, "_mesa_update_material, mask 0x%x\n", bitmask);
 
if (!bitmask)
return;
 
/* update material emission */
if (bitmask & FRONT_EMISSION_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Emission, src[0].Emission );
}
if (bitmask & BACK_EMISSION_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Emission, src[1].Emission );
}
 
/* update material ambience */
if (bitmask & FRONT_AMBIENT_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Ambient, src[0].Ambient );
foreach (light, list) {
SCALE_3V( light->_MatAmbient[0], light->Ambient, src[0].Ambient);
}
}
if (bitmask & BACK_AMBIENT_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Ambient, src[1].Ambient );
foreach (light, list) {
SCALE_3V( light->_MatAmbient[1], light->Ambient, src[1].Ambient);
}
}
 
/* update BaseColor = emission + scene's ambience * material's ambience */
if (bitmask & (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT)) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_3V( ctx->Light._BaseColor[0], mat->Emission );
ACC_SCALE_3V( ctx->Light._BaseColor[0], mat->Ambient,
ctx->Light.Model.Ambient );
}
if (bitmask & (BACK_EMISSION_BIT | BACK_AMBIENT_BIT)) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_3V( ctx->Light._BaseColor[1], mat->Emission );
ACC_SCALE_3V( ctx->Light._BaseColor[1], mat->Ambient,
ctx->Light.Model.Ambient );
}
 
/* update material diffuse values */
if (bitmask & FRONT_DIFFUSE_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Diffuse, src[0].Diffuse );
foreach (light, list) {
SCALE_3V( light->_MatDiffuse[0], light->Diffuse, mat->Diffuse );
}
}
if (bitmask & BACK_DIFFUSE_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Diffuse, src[1].Diffuse );
foreach (light, list) {
SCALE_3V( light->_MatDiffuse[1], light->Diffuse, mat->Diffuse );
}
}
 
/* update material specular values */
if (bitmask & FRONT_SPECULAR_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Specular, src[0].Specular );
foreach (light, list) {
SCALE_3V( light->_MatSpecular[0], light->Specular, mat->Specular);
}
}
if (bitmask & BACK_SPECULAR_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Specular, src[1].Specular );
foreach (light, list) {
SCALE_3V( light->_MatSpecular[1], light->Specular, mat->Specular);
}
}
 
if (bitmask & FRONT_SHININESS_BIT) {
ctx->Light.Material[0].Shininess = src[0].Shininess;
_mesa_invalidate_shine_table( ctx, 0 );
}
if (bitmask & BACK_SHININESS_BIT) {
ctx->Light.Material[1].Shininess = src[1].Shininess;
_mesa_invalidate_shine_table( ctx, 1 );
}
 
if (bitmask & FRONT_INDEXES_BIT) {
ctx->Light.Material[0].AmbientIndex = src[0].AmbientIndex;
ctx->Light.Material[0].DiffuseIndex = src[0].DiffuseIndex;
ctx->Light.Material[0].SpecularIndex = src[0].SpecularIndex;
}
if (bitmask & BACK_INDEXES_BIT) {
ctx->Light.Material[1].AmbientIndex = src[1].AmbientIndex;
ctx->Light.Material[1].DiffuseIndex = src[1].DiffuseIndex;
ctx->Light.Material[1].SpecularIndex = src[1].SpecularIndex;
}
 
if (0) {
struct gl_material *mat = &ctx->Light.Material[0];
_mesa_debug(ctx, "update_mat emission : %f %f %f\n",
mat->Emission[0], mat->Emission[1], mat->Emission[2]);
_mesa_debug(ctx, "update_mat specular : %f %f %f\n",
mat->Specular[0], mat->Specular[1], mat->Specular[2]);
_mesa_debug(ctx, "update_mat diffuse : %f %f %f\n",
mat->Diffuse[0], mat->Diffuse[1], mat->Diffuse[2]);
_mesa_debug(ctx, "update_mat ambient : %f %f %f\n",
mat->Ambient[0], mat->Ambient[1], mat->Ambient[2]);
}
}
 
 
 
 
 
 
 
/*
* Update the current materials from the given rgba color
* according to the bitmask in ColorMaterialBitmask, which is
* set by glColorMaterial().
*/
void _mesa_update_color_material( GLcontext *ctx,
const GLfloat color[4] )
{
struct gl_light *light, *list = &ctx->Light.EnabledList;
GLuint bitmask = ctx->Light.ColorMaterialBitmask;
 
if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
_mesa_debug(ctx, "_mesa_update_color_material, mask 0x%x\n", bitmask);
 
/* update emissive colors */
if (bitmask & FRONT_EMISSION_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Emission, color );
}
 
if (bitmask & BACK_EMISSION_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Emission, color );
}
 
/* update light->_MatAmbient = light's ambient * material's ambient */
if (bitmask & FRONT_AMBIENT_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
foreach (light, list) {
SCALE_3V( light->_MatAmbient[0], light->Ambient, color);
}
COPY_4FV( mat->Ambient, color );
}
 
if (bitmask & BACK_AMBIENT_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
foreach (light, list) {
SCALE_3V( light->_MatAmbient[1], light->Ambient, color);
}
COPY_4FV( mat->Ambient, color );
}
 
/* update BaseColor = emission + scene's ambience * material's ambience */
if (bitmask & (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT)) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_3V( ctx->Light._BaseColor[0], mat->Emission );
ACC_SCALE_3V( ctx->Light._BaseColor[0], mat->Ambient, ctx->Light.Model.Ambient );
}
 
if (bitmask & (BACK_EMISSION_BIT | BACK_AMBIENT_BIT)) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_3V( ctx->Light._BaseColor[1], mat->Emission );
ACC_SCALE_3V( ctx->Light._BaseColor[1], mat->Ambient, ctx->Light.Model.Ambient );
}
 
/* update light->_MatDiffuse = light's diffuse * material's diffuse */
if (bitmask & FRONT_DIFFUSE_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Diffuse, color );
foreach (light, list) {
SCALE_3V( light->_MatDiffuse[0], light->Diffuse, mat->Diffuse );
}
}
 
if (bitmask & BACK_DIFFUSE_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Diffuse, color );
foreach (light, list) {
SCALE_3V( light->_MatDiffuse[1], light->Diffuse, mat->Diffuse );
}
}
 
/* update light->_MatSpecular = light's specular * material's specular */
if (bitmask & FRONT_SPECULAR_BIT) {
struct gl_material *mat = &ctx->Light.Material[0];
COPY_4FV( mat->Specular, color );
foreach (light, list) {
ACC_SCALE_3V( light->_MatSpecular[0], light->Specular, mat->Specular);
}
}
 
if (bitmask & BACK_SPECULAR_BIT) {
struct gl_material *mat = &ctx->Light.Material[1];
COPY_4FV( mat->Specular, color );
foreach (light, list) {
ACC_SCALE_3V( light->_MatSpecular[1], light->Specular, mat->Specular);
}
}
 
if (0) {
struct gl_material *mat = &ctx->Light.Material[0];
_mesa_debug(ctx, "update_color_mat emission : %f %f %f\n",
mat->Emission[0], mat->Emission[1], mat->Emission[2]);
_mesa_debug(ctx, "update_color_mat specular : %f %f %f\n",
mat->Specular[0], mat->Specular[1], mat->Specular[2]);
_mesa_debug(ctx, "update_color_mat diffuse : %f %f %f\n",
mat->Diffuse[0], mat->Diffuse[1], mat->Diffuse[2]);
_mesa_debug(ctx, "update_color_mat ambient : %f %f %f\n",
mat->Ambient[0], mat->Ambient[1], mat->Ambient[2]);
}
}
 
 
 
 
void
_mesa_ColorMaterial( GLenum face, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
GLuint bitmask;
GLuint legal = (FRONT_EMISSION_BIT | BACK_EMISSION_BIT |
FRONT_SPECULAR_BIT | BACK_SPECULAR_BIT |
FRONT_DIFFUSE_BIT | BACK_DIFFUSE_BIT |
FRONT_AMBIENT_BIT | BACK_AMBIENT_BIT);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glColorMaterial %s %s\n",
_mesa_lookup_enum_by_nr(face),
_mesa_lookup_enum_by_nr(mode));
 
bitmask = _mesa_material_bitmask(ctx, face, mode, legal, "glColorMaterial");
 
if (ctx->Light.ColorMaterialBitmask == bitmask &&
ctx->Light.ColorMaterialFace == face &&
ctx->Light.ColorMaterialMode == mode)
return;
 
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.ColorMaterialBitmask = bitmask;
ctx->Light.ColorMaterialFace = face;
ctx->Light.ColorMaterialMode = mode;
 
if (ctx->Light.ColorMaterialEnabled) {
FLUSH_CURRENT( ctx, 0 );
_mesa_update_color_material(ctx,ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
}
 
if (ctx->Driver.ColorMaterial)
(*ctx->Driver.ColorMaterial)( ctx, face, mode );
}
 
 
 
 
 
void
_mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint f;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* update materials */
 
if (face==GL_FRONT) {
f = 0;
}
else if (face==GL_BACK) {
f = 1;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMaterialfv(face)" );
return;
}
switch (pname) {
case GL_AMBIENT:
COPY_4FV( params, ctx->Light.Material[f].Ambient );
break;
case GL_DIFFUSE:
COPY_4FV( params, ctx->Light.Material[f].Diffuse );
break;
case GL_SPECULAR:
COPY_4FV( params, ctx->Light.Material[f].Specular );
break;
case GL_EMISSION:
COPY_4FV( params, ctx->Light.Material[f].Emission );
break;
case GL_SHININESS:
*params = ctx->Light.Material[f].Shininess;
break;
case GL_COLOR_INDEXES:
params[0] = ctx->Light.Material[f].AmbientIndex;
params[1] = ctx->Light.Material[f].DiffuseIndex;
params[2] = ctx->Light.Material[f].SpecularIndex;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMaterialfv(pname)" );
}
}
 
 
 
void
_mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint f;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* update materials */
 
if (face==GL_FRONT) {
f = 0;
}
else if (face==GL_BACK) {
f = 1;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMaterialiv(face)" );
return;
}
switch (pname) {
case GL_AMBIENT:
params[0] = FLOAT_TO_INT( ctx->Light.Material[f].Ambient[0] );
params[1] = FLOAT_TO_INT( ctx->Light.Material[f].Ambient[1] );
params[2] = FLOAT_TO_INT( ctx->Light.Material[f].Ambient[2] );
params[3] = FLOAT_TO_INT( ctx->Light.Material[f].Ambient[3] );
break;
case GL_DIFFUSE:
params[0] = FLOAT_TO_INT( ctx->Light.Material[f].Diffuse[0] );
params[1] = FLOAT_TO_INT( ctx->Light.Material[f].Diffuse[1] );
params[2] = FLOAT_TO_INT( ctx->Light.Material[f].Diffuse[2] );
params[3] = FLOAT_TO_INT( ctx->Light.Material[f].Diffuse[3] );
break;
case GL_SPECULAR:
params[0] = FLOAT_TO_INT( ctx->Light.Material[f].Specular[0] );
params[1] = FLOAT_TO_INT( ctx->Light.Material[f].Specular[1] );
params[2] = FLOAT_TO_INT( ctx->Light.Material[f].Specular[2] );
params[3] = FLOAT_TO_INT( ctx->Light.Material[f].Specular[3] );
break;
case GL_EMISSION:
params[0] = FLOAT_TO_INT( ctx->Light.Material[f].Emission[0] );
params[1] = FLOAT_TO_INT( ctx->Light.Material[f].Emission[1] );
params[2] = FLOAT_TO_INT( ctx->Light.Material[f].Emission[2] );
params[3] = FLOAT_TO_INT( ctx->Light.Material[f].Emission[3] );
break;
case GL_SHININESS:
*params = ROUNDF( ctx->Light.Material[f].Shininess );
break;
case GL_COLOR_INDEXES:
params[0] = ROUNDF( ctx->Light.Material[f].AmbientIndex );
params[1] = ROUNDF( ctx->Light.Material[f].DiffuseIndex );
params[2] = ROUNDF( ctx->Light.Material[f].SpecularIndex );
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMaterialfv(pname)" );
}
}
 
 
 
 
/**********************************************************************/
/***** Lighting computation *****/
/**********************************************************************/
 
 
/*
* Notes:
* When two-sided lighting is enabled we compute the color (or index)
* for both the front and back side of the primitive. Then, when the
* orientation of the facet is later learned, we can determine which
* color (or index) to use for rendering.
*
* KW: We now know orientation in advance and only shade for
* the side or sides which are actually required.
*
* Variables:
* n = normal vector
* V = vertex position
* P = light source position
* Pe = (0,0,0,1)
*
* Precomputed:
* IF P[3]==0 THEN
* // light at infinity
* IF local_viewer THEN
* _VP_inf_norm = unit vector from V to P // Precompute
* ELSE
* // eye at infinity
* _h_inf_norm = Normalize( VP + <0,0,1> ) // Precompute
* ENDIF
* ENDIF
*
* Functions:
* Normalize( v ) = normalized vector v
* Magnitude( v ) = length of vector v
*/
 
 
 
/*
* Whenever the spotlight exponent for a light changes we must call
* this function to recompute the exponent lookup table.
*/
void
_mesa_invalidate_spot_exp_table( struct gl_light *l )
{
l->_SpotExpTable[0][0] = -1;
}
 
static void validate_spot_exp_table( struct gl_light *l )
{
GLint i;
GLdouble exponent = l->SpotExponent;
GLdouble tmp = 0;
GLint clamp = 0;
 
l->_SpotExpTable[0][0] = 0.0;
 
for (i = EXP_TABLE_SIZE - 1; i > 0 ;i--) {
if (clamp == 0) {
tmp = _mesa_pow(i / (GLdouble) (EXP_TABLE_SIZE - 1), exponent);
if (tmp < FLT_MIN * 100.0) {
tmp = 0.0;
clamp = 1;
}
}
l->_SpotExpTable[i][0] = (GLfloat) tmp;
}
for (i = 0; i < EXP_TABLE_SIZE - 1; i++) {
l->_SpotExpTable[i][1] = (l->_SpotExpTable[i+1][0] -
l->_SpotExpTable[i][0]);
}
l->_SpotExpTable[EXP_TABLE_SIZE-1][1] = 0.0;
}
 
 
 
 
/* Calculate a new shine table. Doing this here saves a branch in
* lighting, and the cost of doing it early may be partially offset
* by keeping a MRU cache of shine tables for various shine values.
*/
void
_mesa_invalidate_shine_table( GLcontext *ctx, GLuint i )
{
if (ctx->_ShineTable[i])
ctx->_ShineTable[i]->refcount--;
ctx->_ShineTable[i] = 0;
}
 
static void validate_shine_table( GLcontext *ctx, GLuint i, GLfloat shininess )
{
struct gl_shine_tab *list = ctx->_ShineTabList;
struct gl_shine_tab *s;
 
foreach(s, list)
if ( s->shininess == shininess )
break;
 
if (s == list) {
GLint j;
GLfloat *m;
 
foreach(s, list)
if (s->refcount == 0)
break;
 
m = s->tab;
m[0] = 0.0;
if (shininess == 0.0) {
for (j = 1 ; j <= SHINE_TABLE_SIZE ; j++)
m[j] = 1.0;
}
else {
for (j = 1 ; j < SHINE_TABLE_SIZE ; j++) {
GLdouble t, x = j / (GLfloat) (SHINE_TABLE_SIZE - 1);
if (x < 0.005) /* underflow check */
x = 0.005;
t = _mesa_pow(x, shininess);
if (t > 1e-20)
m[j] = (GLfloat) t;
else
m[j] = 0.0;
}
m[SHINE_TABLE_SIZE] = 1.0;
}
 
s->shininess = shininess;
}
 
if (ctx->_ShineTable[i])
ctx->_ShineTable[i]->refcount--;
 
ctx->_ShineTable[i] = s;
move_to_tail( list, s );
s->refcount++;
}
 
void
_mesa_validate_all_lighting_tables( GLcontext *ctx )
{
GLint i;
GLfloat shininess;
 
shininess = ctx->Light.Material[0].Shininess;
if (!ctx->_ShineTable[0] || ctx->_ShineTable[0]->shininess != shininess)
validate_shine_table( ctx, 0, shininess );
 
shininess = ctx->Light.Material[1].Shininess;
if (!ctx->_ShineTable[1] || ctx->_ShineTable[1]->shininess != shininess)
validate_shine_table( ctx, 1, shininess );
 
for (i = 0 ; i < MAX_LIGHTS ; i++)
if (ctx->Light.Light[i]._SpotExpTable[0][0] == -1)
validate_spot_exp_table( &ctx->Light.Light[i] );
}
 
 
 
 
/*
* Examine current lighting parameters to determine if the optimized lighting
* function can be used.
* Also, precompute some lighting values such as the products of light
* source and material ambient, diffuse and specular coefficients.
*/
void
_mesa_update_lighting( GLcontext *ctx )
{
struct gl_light *light;
ctx->_NeedEyeCoords &= ~NEED_EYE_LIGHT;
ctx->_NeedNormals &= ~NEED_NORMALS_LIGHT;
ctx->Light._Flags = 0;
 
if (!ctx->Light.Enabled)
return;
 
ctx->_NeedNormals |= NEED_NORMALS_LIGHT;
 
foreach(light, &ctx->Light.EnabledList) {
ctx->Light._Flags |= light->_Flags;
}
 
ctx->Light._NeedVertices =
((ctx->Light._Flags & (LIGHT_POSITIONAL|LIGHT_SPOT)) ||
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ||
ctx->Light.Model.LocalViewer);
 
if ((ctx->Light._Flags & LIGHT_POSITIONAL) ||
ctx->Light.Model.LocalViewer)
ctx->_NeedEyeCoords |= NEED_EYE_LIGHT;
 
 
/* XXX: This test is overkill & needs to be fixed both for software and
* hardware t&l drivers. The above should be sufficient & should
* be tested to verify this.
*/
if (ctx->Light._NeedVertices)
ctx->_NeedEyeCoords |= NEED_EYE_LIGHT;
 
 
/* Precompute some shading values. Although we reference
* Light.Material here, we can get away without flushing
* FLUSH_UPDATE_CURRENT, as when any outstanding material changes
* are flushed, they will update the derived state at that time.
*/
if (ctx->Visual.rgbMode) {
GLuint sides = ctx->Light.Model.TwoSide ? 2 : 1;
GLuint side;
for (side=0; side < sides; side++) {
struct gl_material *mat = &ctx->Light.Material[side];
 
COPY_3V(ctx->Light._BaseColor[side], mat->Emission);
ACC_SCALE_3V(ctx->Light._BaseColor[side],
ctx->Light.Model.Ambient,
mat->Ambient);
}
 
foreach (light, &ctx->Light.EnabledList) {
for (side=0; side< sides; side++) {
const struct gl_material *mat = &ctx->Light.Material[side];
SCALE_3V( light->_MatDiffuse[side], light->Diffuse, mat->Diffuse );
SCALE_3V( light->_MatAmbient[side], light->Ambient, mat->Ambient );
SCALE_3V( light->_MatSpecular[side], light->Specular,
mat->Specular);
}
}
}
else {
static const GLfloat ci[3] = { .30F, .59F, .11F };
foreach(light, &ctx->Light.EnabledList) {
light->_dli = DOT3(ci, light->Diffuse);
light->_sli = DOT3(ci, light->Specular);
}
}
}
 
 
/* _NEW_MODELVIEW
* _NEW_LIGHT
* _TNL_NEW_NEED_EYE_COORDS
*
* Update on (_NEW_MODELVIEW | _NEW_LIGHT) when lighting is enabled.
* Also update on lighting space changes.
*/
void
_mesa_compute_light_positions( GLcontext *ctx )
{
struct gl_light *light;
static const GLfloat eye_z[3] = { 0, 0, 1 };
 
if (!ctx->Light.Enabled)
return;
 
if (ctx->_NeedEyeCoords) {
COPY_3V( ctx->_EyeZDir, eye_z );
}
else {
TRANSFORM_NORMAL( ctx->_EyeZDir, eye_z, ctx->ModelviewMatrixStack.Top->m );
}
 
foreach (light, &ctx->Light.EnabledList) {
 
if (ctx->_NeedEyeCoords) {
COPY_4FV( light->_Position, light->EyePosition );
}
else {
TRANSFORM_POINT( light->_Position, ctx->ModelviewMatrixStack.Top->inv,
light->EyePosition );
}
 
if (!(light->_Flags & LIGHT_POSITIONAL)) {
/* VP (VP) = Normalize( Position ) */
COPY_3V( light->_VP_inf_norm, light->_Position );
NORMALIZE_3FV( light->_VP_inf_norm );
 
if (!ctx->Light.Model.LocalViewer) {
/* _h_inf_norm = Normalize( V_to_P + <0,0,1> ) */
ADD_3V( light->_h_inf_norm, light->_VP_inf_norm, ctx->_EyeZDir);
NORMALIZE_3FV( light->_h_inf_norm );
}
light->_VP_inf_spot_attenuation = 1.0;
}
 
if (light->_Flags & LIGHT_SPOT) {
if (ctx->_NeedEyeCoords) {
COPY_3V( light->_NormDirection, light->EyeDirection );
}
else {
TRANSFORM_NORMAL( light->_NormDirection,
light->EyeDirection,
ctx->ModelviewMatrixStack.Top->m);
}
 
NORMALIZE_3FV( light->_NormDirection );
 
if (!(light->_Flags & LIGHT_POSITIONAL)) {
GLfloat PV_dot_dir = - DOT3(light->_VP_inf_norm,
light->_NormDirection);
 
if (PV_dot_dir > light->_CosCutoff) {
double x = PV_dot_dir * (EXP_TABLE_SIZE-1);
int k = (int) x;
light->_VP_inf_spot_attenuation =
(GLfloat) (light->_SpotExpTable[k][0] +
(x-k)*light->_SpotExpTable[k][1]);
}
else {
light->_VP_inf_spot_attenuation = 0;
}
}
}
}
}
/shark/trunk/ports/mesa/src/depth.h
0,0 → 1,53
/* $Id: depth.h,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef DEPTH_H
#define DEPTH_H
 
 
#include "mtypes.h"
 
 
/*
* Immediate-mode API entrpoints
*/
 
extern void
_mesa_ClearDepth( GLclampd depth );
 
 
extern void
_mesa_DepthFunc( GLenum func );
 
 
extern void
_mesa_DepthMask( GLboolean flag );
 
 
 
 
#endif
/shark/trunk/ports/mesa/src/config.h
0,0 → 1,207
/* $Id: config.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Tunable configuration parameters.
*/
 
 
 
#ifndef CONFIG_H
#define CONFIG_H
 
#ifdef HAVE_CONFIG_H
#include "conf.h"
#endif
 
 
/*
* OpenGL implementation limits
*/
 
/* Maximum modelview matrix stack depth: */
#define MAX_MODELVIEW_STACK_DEPTH 32
 
/* Maximum projection matrix stack depth: */
#define MAX_PROJECTION_STACK_DEPTH 32
 
/* Maximum texture matrix stack depth: */
#define MAX_TEXTURE_STACK_DEPTH 10
 
/* Maximum color matrix stack depth: */
#define MAX_COLOR_STACK_DEPTH 4
 
/* Vertex program matrix stacks: */
#define MAX_PROGRAM_MATRICES 8
#define MAX_PROGRAM_STACK_DEPTH 4
 
/* Maximum attribute stack depth: */
#define MAX_ATTRIB_STACK_DEPTH 16
 
/* Maximum client attribute stack depth: */
#define MAX_CLIENT_ATTRIB_STACK_DEPTH 16
 
/* Maximum recursion depth of display list calls: */
#define MAX_LIST_NESTING 64
 
/* Maximum number of lights: */
#define MAX_LIGHTS 8
 
/* Maximum user-defined clipping planes: */
#define MAX_CLIP_PLANES 6
 
/* Maximum pixel map lookup table size: */
#define MAX_PIXEL_MAP_TABLE 256
 
/* Number of auxillary color buffers: */
#define NUM_AUX_BUFFERS 0
 
/* Maximum order (degree) of curves: */
#ifdef AMIGA
# define MAX_EVAL_ORDER 12
#else
# define MAX_EVAL_ORDER 30
#endif
 
/* Maximum Name stack depth */
#define MAX_NAME_STACK_DEPTH 64
 
/* Min and Max point sizes and granularity */
#define MIN_POINT_SIZE 1.0
#define MAX_POINT_SIZE 20.0
#define POINT_SIZE_GRANULARITY 0.1
 
/* Min and Max line widths and granularity */
#define MIN_LINE_WIDTH 1.0
#define MAX_LINE_WIDTH 10.0
#define LINE_WIDTH_GRANULARITY 0.1
 
/* Max texture palette / color table size */
#define MAX_COLOR_TABLE_SIZE 256
 
/* Number of 1D/2D texture mipmap levels */
#define MAX_TEXTURE_LEVELS 12
 
/* Number of 3D texture mipmap levels */
#define MAX_3D_TEXTURE_LEVELS 8
 
/* Number of cube texture mipmap levels - GL_ARB_texture_cube_map */
#define MAX_CUBE_TEXTURE_LEVELS 12
 
/* Maximum rectangular texture size - GL_NV_texture_rectangle */
#define MAX_TEXTURE_RECT_SIZE 2048
 
/* Number of texture units - GL_ARB_multitexture */
#define MAX_TEXTURE_UNITS 8
 
/* Maximum viewport/image size: */
#define MAX_WIDTH 2048
#define MAX_HEIGHT 2048
 
/* Maxmimum size for CVA. May be overridden by the drivers. */
#define MAX_ARRAY_LOCK_SIZE 3000
 
/* Subpixel precision for antialiasing, window coordinate snapping */
#define SUB_PIXEL_BITS 4
 
/* Size of histogram tables */
#define HISTOGRAM_TABLE_SIZE 256
 
/* Max convolution filter sizes */
#define MAX_CONVOLUTION_WIDTH 9
#define MAX_CONVOLUTION_HEIGHT 9
 
/* GL_ARB_texture_compression */
#define MAX_COMPRESSED_TEXTURE_FORMATS 25
 
/* GL_EXT_texture_filter_anisotropic */
#define MAX_TEXTURE_MAX_ANISOTROPY 16.0
 
/* GL_EXT_texture_lod_bias */
#define MAX_TEXTURE_LOD_BIAS 4.0
 
 
 
/*
* Mesa-specific parameters
*/
 
 
/*
* Bits per accumulation buffer color component: 8, 16 or 32
*/
#define ACCUM_BITS 16
 
 
/*
* Bits per depth buffer value. Any reasonable value up to 31 will
* work. 32 doesn't work because of integer overflow problems in the
* rasterizer code.
*/
#ifndef DEFAULT_SOFTWARE_DEPTH_BITS
#define DEFAULT_SOFTWARE_DEPTH_BITS 16
#endif
#if DEFAULT_SOFTWARE_DEPTH_BITS <= 16
#define DEFAULT_SOFTWARE_DEPTH_TYPE GLushort
#else
#define DEFAULT_SOFTWARE_DEPTH_TYPE GLuint
#endif
 
 
 
/*
* Bits per stencil value: 8
*/
#define STENCIL_BITS 8
 
 
/*
* Bits per color channel: 8, 16 or 32
*/
#ifndef CHAN_BITS
#define CHAN_BITS 8
#endif
 
 
/*
* Color channel component order
* (changes will almost certainly cause problems at this time)
*/
#define RCOMP 0
#define GCOMP 1
#define BCOMP 2
#define ACOMP 3
 
 
 
/*
* Enable/disable features (blocks of code) by setting FEATURE_xyz to 0 or 1.
*/
#define FEATURE_NV_vertex_program 1
 
 
#endif /* CONFIG_H */
/shark/trunk/ports/mesa/src/light.h
0,0 → 1,123
/* $Id: light.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef LIGHT_H
#define LIGHT_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_ShadeModel( GLenum mode );
 
extern void
_mesa_ColorMaterial( GLenum face, GLenum mode );
 
extern void
_mesa_Lightf( GLenum light, GLenum pname, GLfloat param );
 
extern void
_mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params );
 
extern void
_mesa_Lightiv( GLenum light, GLenum pname, const GLint *params );
 
extern void
_mesa_Lighti( GLenum light, GLenum pname, GLint param );
 
extern void
_mesa_LightModelf( GLenum pname, GLfloat param );
 
extern void
_mesa_LightModelfv( GLenum pname, const GLfloat *params );
 
extern void
_mesa_LightModeli( GLenum pname, GLint param );
 
extern void
_mesa_LightModeliv( GLenum pname, const GLint *params );
 
extern void
_mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params );
 
extern void
_mesa_GetLightiv( GLenum light, GLenum pname, GLint *params );
 
extern void
_mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params );
 
extern void
_mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params );
 
 
/* Lerp between adjacent values in the f(x) lookup table, giving a
* continuous function, with adequeate overall accuracy. (Though
* still pretty good compared to a straight lookup).
* Result should be a GLfloat.
*/
#define GET_SHINE_TAB_ENTRY( table, dp, result ) \
do { \
struct gl_shine_tab *_tab = table; \
float f = (dp * (SHINE_TABLE_SIZE-1)); \
int k = (int) f; \
if (k > SHINE_TABLE_SIZE-2) \
result = (GLfloat) _mesa_pow( dp, _tab->shininess ); \
else \
result = _tab->tab[k] + (f-k)*(_tab->tab[k+1]-_tab->tab[k]); \
} while (0)
 
 
 
extern GLuint _mesa_material_bitmask( GLcontext *ctx,
GLenum face, GLenum pname,
GLuint legal,
const char * );
 
extern void _mesa_invalidate_spot_exp_table( struct gl_light *l );
 
extern void _mesa_invalidate_shine_table( GLcontext *ctx, GLuint i );
 
extern void _mesa_validate_all_lighting_tables( GLcontext *ctx );
 
extern void _mesa_update_lighting( GLcontext *ctx );
 
extern void _mesa_compute_light_positions( GLcontext *ctx );
 
extern void _mesa_update_material( GLcontext *ctx,
const struct gl_material src[2],
GLuint bitmask );
 
extern void _mesa_copy_material_pairs( struct gl_material dst[2],
const struct gl_material src[2],
GLuint bitmask );
 
extern void _mesa_update_color_material( GLcontext *ctx,
const GLfloat rgba[4] );
 
 
#endif
/shark/trunk/ports/mesa/src/points.c
0,0 → 1,222
/* $Id: points.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "context.h"
#include "macros.h"
#include "mmath.h"
#include "points.h"
#include "texstate.h"
#include "mtypes.h"
 
 
 
void
_mesa_PointSize( GLfloat size )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (size <= 0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPointSize" );
return;
}
 
if (ctx->Point.Size == size)
return;
 
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.Size = size;
ctx->Point._Size = CLAMP(size,
ctx->Const.MinPointSize,
ctx->Const.MaxPointSize);
 
if (ctx->Point._Size == 1.0F)
ctx->_TriangleCaps &= ~DD_POINT_SIZE;
else
ctx->_TriangleCaps |= DD_POINT_SIZE;
 
if (ctx->Driver.PointSize)
(*ctx->Driver.PointSize)(ctx, size);
}
 
 
 
/*
* Added by GL_NV_point_sprite
*/
void
_mesa_PointParameteriNV( GLenum pname, GLint param )
{
const GLfloat value = (GLfloat) param;
_mesa_PointParameterfvEXT(pname, &value);
}
 
 
/*
* Added by GL_NV_point_sprite
*/
void
_mesa_PointParameterivNV( GLenum pname, const GLint *params )
{
const GLfloat value = (GLfloat) params[0];
_mesa_PointParameterfvEXT(pname, &value);
}
 
 
 
/*
* Same for both GL_EXT_point_parameters and GL_ARB_point_parameters.
*/
void
_mesa_PointParameterfEXT( GLenum pname, GLfloat param)
{
_mesa_PointParameterfvEXT(pname, &param);
}
 
 
 
/*
* Same for both GL_EXT_point_parameters and GL_ARB_point_parameters.
*/
void
_mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (pname) {
case GL_DISTANCE_ATTENUATION_EXT:
if (ctx->Extensions.EXT_point_parameters) {
const GLboolean tmp = ctx->Point._Attenuated;
if (TEST_EQ_3V(ctx->Point.Params, params))
return;
 
FLUSH_VERTICES(ctx, _NEW_POINT);
COPY_3V(ctx->Point.Params, params);
 
/* Update several derived values now. This likely to be
* more efficient than trying to catch this statechange in
* state.c.
*/
ctx->Point._Attenuated = (params[0] != 1.0 ||
params[1] != 0.0 ||
params[2] != 0.0);
 
if (tmp != ctx->Point._Attenuated) {
ctx->_TriangleCaps ^= DD_POINT_ATTEN;
ctx->_NeedEyeCoords ^= NEED_EYE_POINT_ATTEN;
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)");
return;
}
break;
case GL_POINT_SIZE_MIN_EXT:
if (ctx->Extensions.EXT_point_parameters) {
if (params[0] < 0.0F) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glPointParameterf[v]{EXT,ARB}(param)" );
return;
}
if (ctx->Point.MinSize == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.MinSize = params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)");
return;
}
break;
case GL_POINT_SIZE_MAX_EXT:
if (ctx->Extensions.EXT_point_parameters) {
if (params[0] < 0.0F) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glPointParameterf[v]{EXT,ARB}(param)" );
return;
}
if (ctx->Point.MaxSize == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.MaxSize = params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)");
return;
}
break;
case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
if (ctx->Extensions.EXT_point_parameters) {
if (params[0] < 0.0F) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glPointParameterf[v]{EXT,ARB}(param)" );
return;
}
if (ctx->Point.Threshold == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.Threshold = params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)");
return;
}
break;
case GL_POINT_SPRITE_R_MODE_NV:
if (ctx->Extensions.NV_point_sprite) {
GLenum value = (GLenum) params[0];
if (value != GL_ZERO && value != GL_S && value != GL_R) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glPointParameterf[v]{EXT,ARB}(param)");
return;
}
if (ctx->Point.SpriteRMode == value)
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.SpriteRMode = value;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)");
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM,
"glPointParameterf[v]{EXT,ARB}(pname)" );
return;
}
 
if (ctx->Driver.PointParameterfv)
(*ctx->Driver.PointParameterfv)(ctx, pname, params);
}
/shark/trunk/ports/mesa/src/vtxfmt_tmp.h
0,0 → 1,472
/* $Id: vtxfmt_tmp.h,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes
*/
 
#ifndef PRE_LOOPBACK
#define PRE_LOOPBACK( FUNC )
#endif
 
static void TAG(ArrayElement)( GLint i )
{
PRE_LOOPBACK( ArrayElement );
_glapi_Dispatch->ArrayElement( i );
}
 
static void TAG(Color3f)( GLfloat r, GLfloat g, GLfloat b )
{
PRE_LOOPBACK( Color3f );
_glapi_Dispatch->Color3f( r, g, b );
}
 
static void TAG(Color3fv)( const GLfloat *v )
{
PRE_LOOPBACK( Color3fv );
_glapi_Dispatch->Color3fv( v );
}
 
static void TAG(Color3ub)( GLubyte r, GLubyte g, GLubyte b )
{
PRE_LOOPBACK( Color3ub );
_glapi_Dispatch->Color3ub( r, g, b );
}
 
static void TAG(Color3ubv)( const GLubyte *v )
{
PRE_LOOPBACK( Color3ubv );
_glapi_Dispatch->Color3ubv( v );
}
 
static void TAG(Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
{
PRE_LOOPBACK( Color4f );
_glapi_Dispatch->Color4f( r, g, b, a );
}
 
static void TAG(Color4fv)( const GLfloat *v )
{
PRE_LOOPBACK( Color4fv );
_glapi_Dispatch->Color4fv( v );
}
 
static void TAG(Color4ub)( GLubyte r, GLubyte g, GLubyte b, GLubyte a )
{
PRE_LOOPBACK( Color4ub );
_glapi_Dispatch->Color4ub( r, g, b, a );
}
 
static void TAG(Color4ubv)( const GLubyte *v )
{
PRE_LOOPBACK( Color4ubv );
_glapi_Dispatch->Color4ubv( v );
}
 
static void TAG(EdgeFlag)( GLboolean e )
{
PRE_LOOPBACK( EdgeFlag );
_glapi_Dispatch->EdgeFlag( e );
}
 
static void TAG(EdgeFlagv)( const GLboolean *v )
{
PRE_LOOPBACK( EdgeFlagv );
_glapi_Dispatch->EdgeFlagv( v );
}
 
static void TAG(EvalCoord1f)( GLfloat s )
{
PRE_LOOPBACK( EvalCoord1f );
_glapi_Dispatch->EvalCoord1f( s );
}
 
static void TAG(EvalCoord1fv)( const GLfloat *v )
{
PRE_LOOPBACK( EvalCoord1fv );
_glapi_Dispatch->EvalCoord1fv( v );
}
 
static void TAG(EvalCoord2f)( GLfloat s, GLfloat t )
{
PRE_LOOPBACK( EvalCoord2f );
_glapi_Dispatch->EvalCoord2f( s, t );
}
 
static void TAG(EvalCoord2fv)( const GLfloat *v )
{
PRE_LOOPBACK( EvalCoord2fv );
_glapi_Dispatch->EvalCoord2fv( v );
}
 
static void TAG(EvalPoint1)( GLint i )
{
PRE_LOOPBACK( EvalPoint1 );
_glapi_Dispatch->EvalPoint1( i );
}
 
static void TAG(EvalPoint2)( GLint i, GLint j )
{
PRE_LOOPBACK( EvalPoint2 );
_glapi_Dispatch->EvalPoint2( i, j );
}
 
static void TAG(FogCoordfEXT)( GLfloat f )
{
PRE_LOOPBACK( FogCoordfEXT );
_glapi_Dispatch->FogCoordfEXT( f );
}
 
static void TAG(FogCoordfvEXT)( const GLfloat *v )
{
PRE_LOOPBACK( FogCoordfvEXT );
_glapi_Dispatch->FogCoordfvEXT( v );
}
 
static void TAG(Indexi)( GLint i )
{
PRE_LOOPBACK( Indexi );
_glapi_Dispatch->Indexi( i );
}
 
static void TAG(Indexiv)( const GLint *v )
{
PRE_LOOPBACK( Indexiv );
_glapi_Dispatch->Indexiv( v );
}
 
static void TAG(Materialfv)( GLenum face, GLenum pname, const GLfloat *v )
{
PRE_LOOPBACK( Materialfv );
_glapi_Dispatch->Materialfv( face, pname, v );
}
 
static void TAG(MultiTexCoord1fARB)( GLenum target, GLfloat a )
{
PRE_LOOPBACK( MultiTexCoord1fARB );
_glapi_Dispatch->MultiTexCoord1fARB( target, a );
}
 
static void TAG(MultiTexCoord1fvARB)( GLenum target, const GLfloat *tc )
{
PRE_LOOPBACK( MultiTexCoord1fvARB );
_glapi_Dispatch->MultiTexCoord1fvARB( target, tc );
}
 
static void TAG(MultiTexCoord2fARB)( GLenum target, GLfloat s, GLfloat t )
{
PRE_LOOPBACK( MultiTexCoord2fARB );
_glapi_Dispatch->MultiTexCoord2fARB( target, s, t );
}
 
static void TAG(MultiTexCoord2fvARB)( GLenum target, const GLfloat *tc )
{
PRE_LOOPBACK( MultiTexCoord2fvARB );
_glapi_Dispatch->MultiTexCoord2fvARB( target, tc );
}
 
static void TAG(MultiTexCoord3fARB)( GLenum target, GLfloat s,
GLfloat t, GLfloat r )
{
PRE_LOOPBACK( MultiTexCoord3fARB );
_glapi_Dispatch->MultiTexCoord3fARB( target, s, t, r );
}
 
static void TAG(MultiTexCoord3fvARB)( GLenum target, const GLfloat *tc )
{
PRE_LOOPBACK( MultiTexCoord3fvARB );
_glapi_Dispatch->MultiTexCoord3fvARB( target, tc );
}
 
static void TAG(MultiTexCoord4fARB)( GLenum target, GLfloat s,
GLfloat t, GLfloat r, GLfloat q )
{
PRE_LOOPBACK( MultiTexCoord4fARB );
_glapi_Dispatch->MultiTexCoord4fARB( target, s, t, r, q );
}
 
static void TAG(MultiTexCoord4fvARB)( GLenum target, const GLfloat *tc )
{
PRE_LOOPBACK( MultiTexCoord4fvARB );
_glapi_Dispatch->MultiTexCoord4fvARB( target, tc );
}
 
static void TAG(Normal3f)( GLfloat x, GLfloat y, GLfloat z )
{
PRE_LOOPBACK( Normal3f );
_glapi_Dispatch->Normal3f( x, y, z );
}
 
static void TAG(Normal3fv)( const GLfloat *v )
{
PRE_LOOPBACK( Normal3fv );
_glapi_Dispatch->Normal3fv( v );
}
 
static void TAG(SecondaryColor3fEXT)( GLfloat r, GLfloat g, GLfloat b )
{
PRE_LOOPBACK( SecondaryColor3fEXT );
_glapi_Dispatch->SecondaryColor3fEXT( r, g, b );
}
 
static void TAG(SecondaryColor3fvEXT)( const GLfloat *v )
{
PRE_LOOPBACK( SecondaryColor3fvEXT );
_glapi_Dispatch->SecondaryColor3fvEXT( v );
}
 
static void TAG(SecondaryColor3ubEXT)( GLubyte r, GLubyte g, GLubyte b )
{
PRE_LOOPBACK( SecondaryColor3ubEXT );
_glapi_Dispatch->SecondaryColor3ubEXT( r, g, b );
}
 
static void TAG(SecondaryColor3ubvEXT)( const GLubyte *v )
{
PRE_LOOPBACK( SecondaryColor3ubvEXT );
_glapi_Dispatch->SecondaryColor3ubvEXT( v );
}
 
static void TAG(TexCoord1f)( GLfloat s )
{
PRE_LOOPBACK( TexCoord1f );
_glapi_Dispatch->TexCoord1f( s );
}
 
static void TAG(TexCoord1fv)( const GLfloat *tc )
{
PRE_LOOPBACK( TexCoord1fv );
_glapi_Dispatch->TexCoord1fv( tc );
}
 
static void TAG(TexCoord2f)( GLfloat s, GLfloat t )
{
PRE_LOOPBACK( TexCoord2f );
_glapi_Dispatch->TexCoord2f( s, t );
}
 
static void TAG(TexCoord2fv)( const GLfloat *tc )
{
PRE_LOOPBACK( TexCoord2fv );
_glapi_Dispatch->TexCoord2fv( tc );
}
 
static void TAG(TexCoord3f)( GLfloat s, GLfloat t, GLfloat r )
{
PRE_LOOPBACK( TexCoord3f );
_glapi_Dispatch->TexCoord3f( s, t, r );
}
 
static void TAG(TexCoord3fv)( const GLfloat *tc )
{
PRE_LOOPBACK( TexCoord3fv );
_glapi_Dispatch->TexCoord3fv( tc );
}
 
static void TAG(TexCoord4f)( GLfloat s, GLfloat t, GLfloat r, GLfloat q )
{
PRE_LOOPBACK( TexCoord4f );
_glapi_Dispatch->TexCoord4f( s, t, r, q );
}
 
static void TAG(TexCoord4fv)( const GLfloat *tc )
{
PRE_LOOPBACK( TexCoord4fv );
_glapi_Dispatch->TexCoord4fv( tc );
}
 
static void TAG(Vertex2f)( GLfloat x, GLfloat y )
{
PRE_LOOPBACK( Vertex2f );
_glapi_Dispatch->Vertex2f( x, y );
}
 
static void TAG(Vertex2fv)( const GLfloat *v )
{
PRE_LOOPBACK( Vertex2fv );
_glapi_Dispatch->Vertex2fv( v );
}
 
static void TAG(Vertex3f)( GLfloat x, GLfloat y, GLfloat z )
{
PRE_LOOPBACK( Vertex3f );
_glapi_Dispatch->Vertex3f( x, y, z );
}
 
static void TAG(Vertex3fv)( const GLfloat *v )
{
PRE_LOOPBACK( Vertex3fv );
_glapi_Dispatch->Vertex3fv( v );
}
 
static void TAG(Vertex4f)( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
PRE_LOOPBACK( Vertex4f );
_glapi_Dispatch->Vertex4f( x, y, z, w );
}
 
static void TAG(Vertex4fv)( const GLfloat *v )
{
PRE_LOOPBACK( Vertex4fv );
_glapi_Dispatch->Vertex4fv( v );
}
 
static void TAG(CallList)( GLuint i )
{
PRE_LOOPBACK( CallList );
_glapi_Dispatch->CallList( i );
}
 
static void TAG(Begin)( GLenum mode )
{
PRE_LOOPBACK( Begin );
_glapi_Dispatch->Begin( mode );
}
 
static void TAG(End)( void )
{
PRE_LOOPBACK( End );
_glapi_Dispatch->End();
}
 
static void TAG(Rectf)( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
{
PRE_LOOPBACK( Rectf );
_glapi_Dispatch->Rectf( x1, y1, x2, y2 );
}
 
static void TAG(DrawArrays)( GLenum mode, GLint start, GLsizei count )
{
PRE_LOOPBACK( DrawArrays );
_glapi_Dispatch->DrawArrays( mode, start, count );
}
 
static void TAG(DrawElements)( GLenum mode, GLsizei count, GLenum type,
const void *indices )
{
PRE_LOOPBACK( DrawElements );
_glapi_Dispatch->DrawElements( mode, count, type, indices );
}
 
static void TAG(DrawRangeElements)( GLenum mode, GLuint start,
GLuint end, GLsizei count,
GLenum type, const void *indices )
{
PRE_LOOPBACK( DrawRangeElements );
_glapi_Dispatch->DrawRangeElements( mode, start, end, count, type, indices );
}
 
static void TAG(EvalMesh1)( GLenum mode, GLint i1, GLint i2 )
{
PRE_LOOPBACK( EvalMesh1 );
_glapi_Dispatch->EvalMesh1( mode, i1, i2 );
}
 
static void TAG(EvalMesh2)( GLenum mode, GLint i1, GLint i2,
GLint j1, GLint j2 )
{
PRE_LOOPBACK( EvalMesh2 );
_glapi_Dispatch->EvalMesh2( mode, i1, i2, j1, j2 );
}
 
static void TAG(VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
PRE_LOOPBACK( VertexAttrib4fNV );
_glapi_Dispatch->VertexAttrib4fNV( index, x, y, z, w );
}
 
static void TAG(VertexAttrib4fvNV)( GLuint index, const GLfloat *v )
{
PRE_LOOPBACK( VertexAttrib4fNV );
_glapi_Dispatch->VertexAttrib4fvNV( index, v );
}
 
 
static GLvertexformat TAG(vtxfmt) = {
TAG(ArrayElement),
TAG(Color3f),
TAG(Color3fv),
TAG(Color3ub),
TAG(Color3ubv),
TAG(Color4f),
TAG(Color4fv),
TAG(Color4ub),
TAG(Color4ubv),
TAG(EdgeFlag),
TAG(EdgeFlagv),
TAG(EvalCoord1f),
TAG(EvalCoord1fv),
TAG(EvalCoord2f),
TAG(EvalCoord2fv),
TAG(EvalPoint1),
TAG(EvalPoint2),
TAG(FogCoordfEXT),
TAG(FogCoordfvEXT),
TAG(Indexi),
TAG(Indexiv),
TAG(Materialfv),
TAG(MultiTexCoord1fARB),
TAG(MultiTexCoord1fvARB),
TAG(MultiTexCoord2fARB),
TAG(MultiTexCoord2fvARB),
TAG(MultiTexCoord3fARB),
TAG(MultiTexCoord3fvARB),
TAG(MultiTexCoord4fARB),
TAG(MultiTexCoord4fvARB),
TAG(Normal3f),
TAG(Normal3fv),
TAG(SecondaryColor3fEXT),
TAG(SecondaryColor3fvEXT),
TAG(SecondaryColor3ubEXT),
TAG(SecondaryColor3ubvEXT),
TAG(TexCoord1f),
TAG(TexCoord1fv),
TAG(TexCoord2f),
TAG(TexCoord2fv),
TAG(TexCoord3f),
TAG(TexCoord3fv),
TAG(TexCoord4f),
TAG(TexCoord4fv),
TAG(Vertex2f),
TAG(Vertex2fv),
TAG(Vertex3f),
TAG(Vertex3fv),
TAG(Vertex4f),
TAG(Vertex4fv),
TAG(CallList),
TAG(Begin),
TAG(End),
TAG(VertexAttrib4fNV),
TAG(VertexAttrib4fvNV),
TAG(Rectf),
TAG(DrawArrays),
TAG(DrawElements),
TAG(DrawRangeElements),
TAG(EvalMesh1),
TAG(EvalMesh2)
};
 
#undef TAG
#undef PRE_LOOPBACK
/shark/trunk/ports/mesa/src/texstore.c
0,0 → 1,2116
/* $Id: texstore.c,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* Authors:
* Brian Paul
*/
 
/*
* The GL texture image functions in teximage.c basically just do
* error checking and data structure allocation. They in turn call
* device driver functions which actually copy/convert/store the user's
* texture image data.
*
* However, most device drivers will be able to use the fallback functions
* in this file. That is, most drivers will have the following bit of
* code:
* ctx->Driver.TexImage1D = _mesa_store_teximage1d;
* ctx->Driver.TexImage2D = _mesa_store_teximage2d;
* ctx->Driver.TexImage3D = _mesa_store_teximage3d;
* etc...
*
* Texture image processing is actually kind of complicated. We have to do:
* Format/type conversions
* pixel unpacking
* pixel transfer (scale, bais, lookup, convolution!, etc)
*
* These functions can handle most everything, including processing full
* images and sub-images.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "convolve.h"
#include "image.h"
#include "macros.h"
#include "imports.h"
#include "texcompress.h"
#include "texformat.h"
#include "teximage.h"
#include "texstore.h"
#include "texutil.h"
 
 
/*
* Given an internal texture format enum or 1, 2, 3, 4 return the
* corresponding _base_ internal format: GL_ALPHA, GL_LUMINANCE,
* GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA. Return the
* number of components for the format. Return -1 if invalid enum.
*/
static GLint
components_in_intformat( GLint format )
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return 1;
case 1:
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return 1;
case 2:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return 2;
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return 1;
case 3:
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return 3;
case 4:
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return 4;
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
return 1;
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16_SGIX:
case GL_DEPTH_COMPONENT24_SGIX:
case GL_DEPTH_COMPONENT32_SGIX:
return 1;
case GL_YCBCR_MESA:
return 2; /* Y + (Cb or Cr) */
default:
return -1; /* error */
}
}
 
 
/*
* This function is used to transfer the user's image data into a texture
* image buffer. We handle both full texture images and subtexture images.
* We also take care of all image transfer operations here, including
* convolution, scale/bias, colortables, etc.
*
* The destination texel type is always GLchan.
* The destination texel format is one of the 6 basic types.
*
* A hardware driver may use this as a helper routine to unpack and
* apply pixel transfer ops into a temporary image buffer. Then,
* convert the temporary image into the special hardware format.
*
* Input:
* dimensions - 1, 2, or 3
* texDestFormat - GL_LUMINANCE, GL_INTENSITY, GL_LUMINANCE_ALPHA, GL_ALPHA,
* GL_RGB or GL_RGBA (the destination format)
* texDestAddr - destination image address
* srcWidth, srcHeight, srcDepth - size (in pixels) of src and dest images
* dstXoffset, dstYoffset, dstZoffset - position to store the image within
* the destination 3D texture
* dstRowStride, dstImageStride - dest image strides in bytes
* srcFormat - source image format (GL_ALPHA, GL_RED, GL_RGB, etc)
* srcType - GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_FLOAT, etc
* srcPacking - describes packing of incoming image.
* transferOps - mask of pixel transfer operations
*/
static void
transfer_teximage(GLcontext *ctx, GLuint dimensions,
GLenum texDestFormat, GLvoid *texDestAddr,
GLint srcWidth, GLint srcHeight, GLint srcDepth,
GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
GLint dstRowStride, GLint dstImageStride,
GLenum srcFormat, GLenum srcType,
const GLvoid *srcAddr,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps)
{
GLint texComponents;
 
ASSERT(ctx);
ASSERT(dimensions >= 1 && dimensions <= 3);
ASSERT(texDestFormat == GL_LUMINANCE ||
texDestFormat == GL_INTENSITY ||
texDestFormat == GL_LUMINANCE_ALPHA ||
texDestFormat == GL_ALPHA ||
texDestFormat == GL_RGB ||
texDestFormat == GL_RGBA);
ASSERT(texDestAddr);
ASSERT(srcWidth >= 1);
ASSERT(srcHeight >= 1);
ASSERT(srcDepth >= 1);
ASSERT(dstXoffset >= 0);
ASSERT(dstYoffset >= 0);
ASSERT(dstZoffset >= 0);
ASSERT(dstRowStride >= 0);
ASSERT(dstImageStride >= 0);
ASSERT(srcAddr);
ASSERT(srcPacking);
 
texComponents = components_in_intformat(texDestFormat);
 
/* try common 2D texture cases first */
if (!transferOps && dimensions == 2 && srcType == CHAN_TYPE) {
 
if (srcFormat == texDestFormat) {
/* This will cover the common GL_RGB, GL_RGBA, GL_ALPHA,
* GL_LUMINANCE_ALPHA, etc. texture formats. Use memcpy().
*/
const GLchan *src = (const GLchan *) _mesa_image_address(
srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0, 0);
const GLint srcRowStride = _mesa_image_row_stride(srcPacking,
srcWidth, srcFormat, srcType);
const GLint widthInBytes = srcWidth * texComponents * sizeof(GLchan);
GLchan *dst = (GLchan *) texDestAddr
+ dstYoffset * (dstRowStride / sizeof(GLchan))
+ dstXoffset * texComponents;
if (srcRowStride == widthInBytes && dstRowStride == widthInBytes) {
MEMCPY(dst, src, srcHeight * widthInBytes);
}
else {
GLint i;
for (i = 0; i < srcHeight; i++) {
MEMCPY(dst, src, widthInBytes);
src += (srcRowStride / sizeof(GLchan));
dst += (dstRowStride / sizeof(GLchan));
}
}
return; /* all done */
}
else if (srcFormat == GL_RGBA && texDestFormat == GL_RGB) {
/* commonly used by Quake */
const GLchan *src = (const GLchan *) _mesa_image_address(
srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0, 0);
const GLint srcRowStride = _mesa_image_row_stride(srcPacking,
srcWidth, srcFormat, srcType);
GLchan *dst = (GLchan *) texDestAddr
+ dstYoffset * (dstRowStride / sizeof(GLchan))
+ dstXoffset * texComponents;
GLint i, j;
for (i = 0; i < srcHeight; i++) {
const GLchan *s = src;
GLchan *d = dst;
for (j = 0; j < srcWidth; j++) {
*d++ = *s++; /*red*/
*d++ = *s++; /*green*/
*d++ = *s++; /*blue*/
s++; /*alpha*/
}
src += (srcRowStride / sizeof(GLchan));
dst += (dstRowStride / sizeof(GLchan));
}
return; /* all done */
}
}
 
/*
* General case solutions
*/
if (texDestFormat == GL_COLOR_INDEX) {
/* color index texture */
const GLenum texType = CHAN_TYPE;
GLint img, row;
GLchan *dest = (GLchan *) texDestAddr
+ dstZoffset * (dstImageStride / sizeof(GLchan))
+ dstYoffset * (dstRowStride / sizeof(GLchan))
+ dstXoffset * texComponents;
for (img = 0; img < srcDepth; img++) {
GLchan *destRow = dest;
for (row = 0; row < srcHeight; row++) {
const GLvoid *src = _mesa_image_address(srcPacking,
srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
_mesa_unpack_index_span(ctx, srcWidth, texType, destRow,
srcType, src, srcPacking, transferOps);
destRow += (dstRowStride / sizeof(GLchan));
}
dest += dstImageStride;
}
}
else if (texDestFormat == GL_YCBCR_MESA) {
/* YCbCr texture */
GLint img, row;
GLushort *dest = (GLushort *) texDestAddr
+ dstZoffset * (dstImageStride / sizeof(GLushort))
+ dstYoffset * (dstRowStride / sizeof(GLushort))
+ dstXoffset * texComponents;
ASSERT(ctx->Extensions.MESA_ycbcr_texture);
for (img = 0; img < srcDepth; img++) {
GLushort *destRow = dest;
for (row = 0; row < srcHeight; row++) {
const GLvoid *srcRow = _mesa_image_address(srcPacking,
srcAddr, srcWidth, srcHeight,
srcFormat, srcType, img, row, 0);
MEMCPY(destRow, srcRow, srcWidth * sizeof(GLushort));
destRow += (dstRowStride / sizeof(GLushort));
}
dest += dstImageStride / sizeof(GLushort);
}
}
else if (texDestFormat == GL_DEPTH_COMPONENT) {
/* Depth texture (shadow maps) */
GLint img, row;
GLubyte *dest = (GLubyte *) texDestAddr
+ dstZoffset * dstImageStride
+ dstYoffset * (dstRowStride / sizeof(GLchan))
+ dstXoffset * texComponents;
for (img = 0; img < srcDepth; img++) {
GLubyte *destRow = dest;
for (row = 0; row < srcHeight; row++) {
const GLvoid *src = _mesa_image_address(srcPacking,
srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
_mesa_unpack_depth_span(ctx, srcWidth, (GLfloat *) destRow,
srcType, src, srcPacking);
destRow += (dstRowStride / sizeof(GLchan));
}
dest += dstImageStride;
}
}
else {
/* regular, color texture */
if ((dimensions == 1 && ctx->Pixel.Convolution1DEnabled) ||
(dimensions >= 2 && ctx->Pixel.Convolution2DEnabled) ||
(dimensions >= 2 && ctx->Pixel.Separable2DEnabled)) {
/*
* Fill texture image with convolution
*/
GLint img, row;
GLint convWidth = srcWidth, convHeight = srcHeight;
GLfloat *tmpImage, *convImage;
tmpImage = (GLfloat *) MALLOC(srcWidth * srcHeight * 4 * sizeof(GLfloat));
if (!tmpImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
return;
}
convImage = (GLfloat *) MALLOC(srcWidth * srcHeight * 4 * sizeof(GLfloat));
if (!convImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
FREE(tmpImage);
return;
}
 
for (img = 0; img < srcDepth; img++) {
const GLfloat *srcf;
GLfloat *dstf = tmpImage;
GLchan *dest;
 
/* unpack and do transfer ops up to convolution */
for (row = 0; row < srcHeight; row++) {
const GLvoid *src = _mesa_image_address(srcPacking,
srcAddr, srcWidth, srcHeight,
srcFormat, srcType, img, row, 0);
_mesa_unpack_float_color_span(ctx, srcWidth, GL_RGBA, dstf,
srcFormat, srcType, src, srcPacking,
transferOps & IMAGE_PRE_CONVOLUTION_BITS,
GL_TRUE);
dstf += srcWidth * 4;
}
 
/* convolve */
if (dimensions == 1) {
ASSERT(ctx->Pixel.Convolution1DEnabled);
_mesa_convolve_1d_image(ctx, &convWidth, tmpImage, convImage);
}
else {
if (ctx->Pixel.Convolution2DEnabled) {
_mesa_convolve_2d_image(ctx, &convWidth, &convHeight,
tmpImage, convImage);
}
else {
ASSERT(ctx->Pixel.Separable2DEnabled);
_mesa_convolve_sep_image(ctx, &convWidth, &convHeight,
tmpImage, convImage);
}
}
 
/* packing and transfer ops after convolution */
srcf = convImage;
dest = (GLchan *) texDestAddr
+ (dstZoffset + img) * (dstImageStride / sizeof(GLchan))
+ dstYoffset * (dstRowStride / sizeof(GLchan));
for (row = 0; row < convHeight; row++) {
_mesa_pack_float_rgba_span(ctx, convWidth,
(const GLfloat (*)[4]) srcf,
texDestFormat, CHAN_TYPE,
dest, &_mesa_native_packing,
transferOps
& IMAGE_POST_CONVOLUTION_BITS);
srcf += convWidth * 4;
dest += (dstRowStride / sizeof(GLchan));
}
}
 
FREE(convImage);
FREE(tmpImage);
}
else {
/*
* no convolution
*/
GLint img, row;
GLchan *dest = (GLchan *) texDestAddr
+ dstZoffset * (dstImageStride / sizeof(GLchan))
+ dstYoffset * (dstRowStride / sizeof(GLchan))
+ dstXoffset * texComponents;
for (img = 0; img < srcDepth; img++) {
GLchan *destRow = dest;
for (row = 0; row < srcHeight; row++) {
const GLvoid *srcRow = _mesa_image_address(srcPacking,
srcAddr, srcWidth, srcHeight,
srcFormat, srcType, img, row, 0);
_mesa_unpack_chan_color_span(ctx, srcWidth, texDestFormat,
destRow, srcFormat, srcType, srcRow,
srcPacking, transferOps);
destRow += (dstRowStride / sizeof(GLchan));
}
dest += dstImageStride / sizeof(GLchan);
}
}
}
}
 
 
 
/*
* Transfer a texture image from user space to <destAddr> applying all
* needed image transfer operations and storing the result in the format
* specified by <dstFormat>. <dstFormat> may be any format from texformat.h.
* Input:
* dimensions - 1, 2 or 3
* baseInternalFormat - base format of the internal texture format
* specified by the user. This is very important, see below.
* dstFormat - destination image format
* dstAddr - destination address
* srcWidth, srcHeight, srcDepth - size of source iamge
* dstX/Y/Zoffset - as specified by glTexSubImage
* dstRowStride - stride between dest rows in bytes
* dstImageStride - stride between dest images in bytes
* srcFormat, srcType - incoming image format and datatype
* srcAddr - source image address
* srcPacking - packing params of source image
*
* XXX this function is a bit more complicated than it should be. If
* _mesa_convert_texsubimage[123]d could handle any dest/source formats
* or if transfer_teximage() could store in any MESA_FORMAT_* format, we
* could simplify things here.
*/
void
_mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
GLenum baseInternalFormat,
const struct gl_texture_format *dstFormat,
GLvoid *dstAddr,
GLint srcWidth, GLint srcHeight, GLint srcDepth,
GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
GLint dstRowStride, GLint dstImageStride,
GLenum srcFormat, GLenum srcType,
const GLvoid *srcAddr,
const struct gl_pixelstore_attrib *srcPacking)
{
const GLint dstRowStridePixels = dstRowStride / dstFormat->TexelBytes;
const GLint dstImageStridePixels = dstImageStride / dstFormat->TexelBytes;
GLboolean makeTemp;
GLuint transferOps = ctx->_ImageTransferState;
GLboolean freeSourceData = GL_FALSE;
GLint postConvWidth = srcWidth, postConvHeight = srcHeight;
 
assert(baseInternalFormat > 0);
ASSERT(baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_INTENSITY ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_RGBA);
 
if (transferOps & IMAGE_CONVOLUTION_BIT) {
_mesa_adjust_image_for_convolution(ctx, dimensions, &postConvWidth,
&postConvHeight);
}
 
/*
* Consider this scenario: The user's source image is GL_RGB and the
* requested internal format is GL_LUMINANCE. Now suppose the device
* driver doesn't support GL_LUMINANCE and instead uses RGB16 as the
* texture format. In that case we still need to do an intermediate
* conversion to luminance format so that the incoming red channel gets
* replicated into the dest red, green and blue channels. The following
* code takes care of that.
*/
if (dstFormat->BaseFormat != baseInternalFormat) {
/* Allocate storage for temporary image in the baseInternalFormat */
const GLint texelSize = _mesa_components_in_format(baseInternalFormat)
* sizeof(GLchan);
const GLint bytes = texelSize * postConvWidth * postConvHeight *srcDepth;
const GLint tmpRowStride = texelSize * postConvWidth;
const GLint tmpImgStride = texelSize * postConvWidth * postConvHeight;
GLvoid *tmpImage = MALLOC(bytes);
if (!tmpImage)
return;
transfer_teximage(ctx, dimensions, baseInternalFormat, tmpImage,
srcWidth, srcHeight, srcDepth,
0, 0, 0, /* x/y/zoffset */
tmpRowStride, tmpImgStride,
srcFormat, srcType, srcAddr, srcPacking, transferOps);
 
/* this is our new source image */
srcWidth = postConvWidth;
srcHeight = postConvHeight;
srcFormat = baseInternalFormat;
srcType = CHAN_TYPE;
srcAddr = tmpImage;
srcPacking = &_mesa_native_packing;
freeSourceData = GL_TRUE;
transferOps = 0; /* image transfer ops were completed */
}
 
/* Let the optimized tex conversion functions take a crack at the
* image conversion if the dest format is a h/w format.
*/
if (_mesa_is_hardware_tex_format(dstFormat)) {
if (transferOps) {
makeTemp = GL_TRUE;
}
else {
if (dimensions == 1) {
makeTemp = !_mesa_convert_texsubimage1d(dstFormat->MesaFormat,
dstXoffset,
srcWidth,
srcFormat, srcType,
srcPacking, srcAddr,
dstAddr);
}
else if (dimensions == 2) {
makeTemp = !_mesa_convert_texsubimage2d(dstFormat->MesaFormat,
dstXoffset, dstYoffset,
srcWidth, srcHeight,
dstRowStridePixels,
srcFormat, srcType,
srcPacking, srcAddr,
dstAddr);
}
else {
assert(dimensions == 3);
makeTemp = !_mesa_convert_texsubimage3d(dstFormat->MesaFormat,
dstXoffset, dstYoffset, dstZoffset,
srcWidth, srcHeight, srcDepth,
dstRowStridePixels, dstImageStridePixels,
srcFormat, srcType,
srcPacking, srcAddr, dstAddr);
}
if (!makeTemp) {
/* all done! */
if (freeSourceData)
FREE((void *) srcAddr);
return;
}
}
}
else {
/* software texture format */
makeTemp = GL_FALSE;
}
 
if (makeTemp) {
GLint postConvWidth = srcWidth, postConvHeight = srcHeight;
GLenum tmpFormat;
GLuint tmpComps, tmpTexelSize;
GLint tmpRowStride, tmpImageStride;
GLubyte *tmpImage;
 
if (transferOps & IMAGE_CONVOLUTION_BIT) {
_mesa_adjust_image_for_convolution(ctx, dimensions, &postConvWidth,
&postConvHeight);
}
 
tmpFormat = dstFormat->BaseFormat;
tmpComps = _mesa_components_in_format(tmpFormat);
tmpTexelSize = tmpComps * sizeof(GLchan);
tmpRowStride = postConvWidth * tmpTexelSize;
tmpImageStride = postConvWidth * postConvHeight * tmpTexelSize;
tmpImage = (GLubyte *) MALLOC(postConvWidth * postConvHeight *
srcDepth * tmpTexelSize);
if (!tmpImage) {
if (freeSourceData)
FREE((void *) srcAddr);
return;
}
 
transfer_teximage(ctx, dimensions, tmpFormat, tmpImage,
srcWidth, srcHeight, srcDepth,
0, 0, 0, /* x/y/zoffset */
tmpRowStride, tmpImageStride,
srcFormat, srcType, srcAddr, srcPacking, transferOps);
 
if (freeSourceData)
FREE((void *) srcAddr);
 
/* the temp image is our new source image */
srcWidth = postConvWidth;
srcHeight = postConvHeight;
srcFormat = tmpFormat;
srcType = CHAN_TYPE;
srcAddr = tmpImage;
srcPacking = &_mesa_native_packing;
freeSourceData = GL_TRUE;
}
 
if (_mesa_is_hardware_tex_format(dstFormat)) {
assert(makeTemp);
if (dimensions == 1) {
GLboolean b;
b = _mesa_convert_texsubimage1d(dstFormat->MesaFormat,
dstXoffset,
srcWidth,
srcFormat, srcType,
srcPacking, srcAddr,
dstAddr);
assert(b);
}
else if (dimensions == 2) {
GLboolean b;
b = _mesa_convert_texsubimage2d(dstFormat->MesaFormat,
dstXoffset, dstYoffset,
srcWidth, srcHeight,
dstRowStridePixels,
srcFormat, srcType,
srcPacking, srcAddr,
dstAddr);
assert(b);
}
else {
GLboolean b;
b = _mesa_convert_texsubimage3d(dstFormat->MesaFormat,
dstXoffset, dstYoffset, dstZoffset,
srcWidth, srcHeight, srcDepth,
dstRowStridePixels, dstImageStridePixels,
srcFormat, srcType,
srcPacking, srcAddr, dstAddr);
assert(b);
}
}
else {
/* software format */
assert(!makeTemp);
transfer_teximage(ctx, dimensions, dstFormat->BaseFormat, dstAddr,
srcWidth, srcHeight, srcDepth,
dstXoffset, dstYoffset, dstZoffset,
dstRowStride, dstImageStride,
srcFormat, srcType, srcAddr, srcPacking, transferOps);
}
 
if (freeSourceData)
FREE((void *) srcAddr); /* the temp image */
}
 
 
 
/**
* Given a user's uncompressed texture image, this function takes care of
* pixel unpacking, pixel transfer, format conversion and compression.
*/
static void
transfer_compressed_teximage(GLcontext *ctx, GLuint dimensions,
GLsizei width, GLsizei height, GLsizei depth,
GLenum srcFormat, GLenum srcType,
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *source,
const struct gl_texture_format *dstFormat,
GLubyte *dest,
GLint dstRowStride)
{
GLchan *tempImage = NULL;
GLint srcRowStride;
GLenum baseFormat;
 
ASSERT(dimensions == 2);
/* TexelBytes is zero if and only if it's a compressed format */
ASSERT(dstFormat->TexelBytes == 0);
 
baseFormat = dstFormat->BaseFormat;
 
if (srcFormat != baseFormat || srcType != CHAN_TYPE ||
ctx->_ImageTransferState != 0 || unpacking->SwapBytes) {
/* need to convert user's image to texImage->Format, GLchan */
GLint comps = components_in_intformat(baseFormat);
GLint postConvWidth = width, postConvHeight = height;
 
/* XXX convolution untested */
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
_mesa_adjust_image_for_convolution(ctx, dimensions, &postConvWidth,
&postConvHeight);
}
 
tempImage = (GLchan*) MALLOC(width * height * comps * sizeof(GLchan));
if (!tempImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
return;
}
transfer_teximage(ctx, dimensions,
baseFormat, /* dest format */
tempImage, /* dst address */
width, height, depth, /* src size */
0, 0, 0, /* x/y/zoffset */
comps * width, /* dst row stride */
comps * width * height, /* dst image stride */
srcFormat, srcType, /* src format, type */
source, unpacking, /* src and src packing */
ctx->_ImageTransferState);
source = tempImage;
width = postConvWidth;
height = postConvHeight;
srcRowStride = width;
}
else {
if (unpacking->RowLength)
srcRowStride = unpacking->RowLength;
else
srcRowStride = width;
}
 
_mesa_compress_teximage(ctx, width, height, baseFormat,
(const GLchan *) source, srcRowStride,
dstFormat, dest, dstRowStride);
if (tempImage) {
FREE(tempImage);
}
}
 
 
 
/*
* This is the software fallback for Driver.TexImage1D()
* and Driver.CopyTexImage2D().
* The texture image type will be GLchan.
* The texture image format will be GL_COLOR_INDEX, GL_INTENSITY,
* GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_ALPHA, GL_RGB or GL_RGBA.
*/
void
_mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
GLint postConvWidth = width;
GLint texelBytes, sizeInBytes;
 
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
}
 
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type);
assert(texImage->TexFormat);
texImage->FetchTexel = texImage->TexFormat->FetchTexel1D;
 
texelBytes = texImage->TexFormat->TexelBytes;
 
/* allocate memory */
if (texImage->IsCompressed)
sizeInBytes = texImage->CompressedSize;
else
sizeInBytes = postConvWidth * texelBytes;
texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
if (!texImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
return;
}
 
if (!pixels)
return;
 
/* unpack image, apply transfer ops and store in texImage->Data */
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
width);
transfer_compressed_teximage(ctx, 1, width, 1, 1,
format, type, packing,
pixels, texImage->TexFormat,
(GLubyte *) texImage->Data, dstRowStride);
}
else {
_mesa_transfer_teximage(ctx, 1,
texImage->Format, /* base format */
texImage->TexFormat, texImage->Data,
width, 1, 1, /* src size */
0, 0, 0, /* dstX/Y/Zoffset */
0, /* dstRowStride */
0, /* dstImageStride */
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
/*
* This is the software fallback for Driver.TexImage2D()
* and Driver.CopyTexImage2D().
* The texture image type will be GLchan.
* The texture image format will be GL_COLOR_INDEX, GL_INTENSITY,
* GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_ALPHA, GL_RGB or GL_RGBA.
*/
void
_mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
GLint postConvWidth = width, postConvHeight = height;
GLint texelBytes, sizeInBytes;
 
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
&postConvHeight);
}
 
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type);
assert(texImage->TexFormat);
texImage->FetchTexel = texImage->TexFormat->FetchTexel2D;
 
texelBytes = texImage->TexFormat->TexelBytes;
 
/* allocate memory */
if (texImage->IsCompressed)
sizeInBytes = texImage->CompressedSize;
else
sizeInBytes = postConvWidth * postConvHeight * texelBytes;
texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
if (!texImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
return;
}
 
if (!pixels)
return;
 
/* unpack image, apply transfer ops and store in texImage->Data */
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
width);
transfer_compressed_teximage(ctx, 2, width, height, 1,
format, type, packing,
pixels, texImage->TexFormat,
(GLubyte *) texImage->Data, dstRowStride);
}
else {
_mesa_transfer_teximage(ctx, 2,
texImage->Format,
texImage->TexFormat, texImage->Data,
width, height, 1, /* src size */
0, 0, 0, /* dstX/Y/Zoffset */
texImage->Width * texelBytes, /* dstRowStride */
0, /* dstImageStride */
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
 
/*
* This is the software fallback for Driver.TexImage3D()
* and Driver.CopyTexImage3D().
* The texture image type will be GLchan.
* The texture image format will be GL_COLOR_INDEX, GL_INTENSITY,
* GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_ALPHA, GL_RGB or GL_RGBA.
*/
void
_mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
GLint texelBytes, sizeInBytes;
 
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type);
assert(texImage->TexFormat);
texImage->FetchTexel = texImage->TexFormat->FetchTexel3D;
 
texelBytes = texImage->TexFormat->TexelBytes;
 
/* allocate memory */
if (texImage->IsCompressed)
sizeInBytes = texImage->CompressedSize;
else
sizeInBytes = width * height * depth * texelBytes;
texImage->Data = MESA_PBUFFER_ALLOC(sizeInBytes);
if (!texImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
return;
}
 
if (!pixels)
return;
 
/* unpack image, apply transfer ops and store in texImage->Data */
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
width);
transfer_compressed_teximage(ctx, 3, width, height, depth,
format, type, packing,
pixels, texImage->TexFormat,
(GLubyte *) texImage->Data, dstRowStride);
}
else {
_mesa_transfer_teximage(ctx, 3,
texImage->Format,
texImage->TexFormat, texImage->Data,
width, height, depth, /* src size */
0, 0, 0, /* dstX/Y/Zoffset */
texImage->Width * texelBytes, /* dstRowStride */
texImage->Width * texImage->Height * texelBytes,
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
 
 
/*
* This is the software fallback for Driver.TexSubImage1D()
* and Driver.CopyTexSubImage1D().
*/
void
_mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint width,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
texImage->Width);
GLubyte *dest = _mesa_compressed_image_address(xoffset, 0, 0,
texImage->IntFormat,
texImage->Width,
texImage->Data);
transfer_compressed_teximage(ctx, 1, /* dimensions */
width, 1, 1, /* size to replace */
format, type, /* source format/type */
packing, /* source packing */
pixels, /* source data */
texImage->TexFormat,/* dest format */
dest, dstRowStride);
}
else {
_mesa_transfer_teximage(ctx, 1,
texImage->Format,
texImage->TexFormat, texImage->Data,
width, 1, 1, /* src size */
xoffset, 0, 0, /* dest offsets */
0, /* dstRowStride */
0, /* dstImageStride */
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
 
/*
* This is the software fallback for Driver.TexSubImage2D()
* and Driver.CopyTexSubImage2D().
*/
void
_mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint width, GLint height,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
texImage->Width);
GLubyte *dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
texImage->IntFormat,
texImage->Width,
texImage->Data);
transfer_compressed_teximage(ctx, 2, /* dimensions */
width, height, 1, /* size to replace */
format, type, /* source format/type */
packing, /* source packing */
pixels, /* source data */
texImage->TexFormat,/* dest format */
dest, dstRowStride);
}
else {
_mesa_transfer_teximage(ctx, 2,
texImage->Format,
texImage->TexFormat, texImage->Data,
width, height, 1, /* src size */
xoffset, yoffset, 0, /* dest offsets */
texImage->Width *texImage->TexFormat->TexelBytes,
0, /* dstImageStride */
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
/*
* This is the software fallback for Driver.TexSubImage3D().
* and Driver.CopyTexSubImage3D().
*/
void
_mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
if (texImage->IsCompressed) {
GLint dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
texImage->Width);
GLubyte *dest = _mesa_compressed_image_address(xoffset, yoffset, zoffset,
texImage->IntFormat,
texImage->Width,
texImage->Data);
transfer_compressed_teximage(ctx, 3, /* dimensions */
width, height, depth,/* size to replace */
format, type, /* source format/type */
packing, /* source packing */
pixels, /* source data */
texImage->TexFormat,/* dest format */
dest, dstRowStride);
}
else {
const GLint texelBytes = texImage->TexFormat->TexelBytes;
_mesa_transfer_teximage(ctx, 3,
texImage->Format,
texImage->TexFormat, texImage->Data,
width, height, depth, /* src size */
xoffset, yoffset, xoffset, /* dest offsets */
texImage->Width * texelBytes, /* dst row stride */
texImage->Width * texImage->Height * texelBytes,
format, type, pixels, packing);
}
 
/* GL_SGIS_generate_mipmap */
if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
_mesa_generate_mipmap(ctx, target,
&ctx->Texture.Unit[ctx->Texture.CurrentUnit],
texObj);
}
}
 
 
 
 
/*
* Fallback for Driver.CompressedTexImage1D()
*/
void
_mesa_store_compressed_teximage1d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
/* this space intentionally left blank */
}
 
 
 
/*
* Fallback for Driver.CompressedTexImage2D()
*/
void
_mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
/* This is pretty simple, basically just do a memcpy without worrying
* about the usual image unpacking or image transfer operations.
*/
ASSERT(texObj);
ASSERT(texImage);
ASSERT(texImage->Width > 0);
ASSERT(texImage->Height > 0);
ASSERT(texImage->Depth == 1);
ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
 
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, 0, 0);
assert(texImage->TexFormat);
texImage->FetchTexel = texImage->TexFormat->FetchTexel2D;
 
/* allocate storage */
texImage->Data = MESA_PBUFFER_ALLOC(imageSize);
if (!texImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
return;
}
 
/* copy the data */
ASSERT(texImage->CompressedSize == imageSize);
MEMCPY(texImage->Data, data, imageSize);
}
 
 
 
/*
* Fallback for Driver.CompressedTexImage3D()
*/
void
_mesa_store_compressed_teximage3d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint depth,
GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
/* this space intentionally left blank */
}
 
 
 
/**
* Fallback for Driver.CompressedTexSubImage1D()
*/
void
_mesa_store_compressed_texsubimage1d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLsizei width,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
/* this space intentionally left blank */
}
 
 
/**
* Fallback for Driver.CompressedTexSubImage2D()
*/
void
_mesa_store_compressed_texsubimage2d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
GLint bytesPerRow, destRowStride, srcRowStride;
GLint i, rows;
GLubyte *dest;
const GLubyte *src;
 
/* these should have been caught sooner */
ASSERT((width & 3) == 0 || width == 2 || width == 1);
ASSERT((height & 3) == 0 || height == 2 || height == 1);
ASSERT((xoffset & 3) == 0);
ASSERT((yoffset & 3) == 0);
 
srcRowStride = _mesa_compressed_row_stride(texImage->IntFormat, width);
src = (const GLubyte *) data;
 
destRowStride = _mesa_compressed_row_stride(texImage->IntFormat,
texImage->Width);
dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
texImage->IntFormat,
texImage->Width, texImage->Data);
 
bytesPerRow = srcRowStride;
rows = height / 4;
 
for (i = 0; i < rows; i++) {
MEMCPY(dest, src, bytesPerRow);
dest += destRowStride;
src += srcRowStride;
}
}
 
 
/**
* Fallback for Driver.CompressedTexSubImage3D()
*/
void
_mesa_store_compressed_texsubimage3d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
/* this space intentionally left blank */
}
 
 
 
 
 
/*
* This is the fallback for Driver.TestProxyTexImage().
*/
GLboolean
_mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat, GLenum format, GLenum type,
GLint width, GLint height, GLint depth, GLint border)
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
 
(void) format;
(void) type;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
/* We always pass.
* The core Mesa code will have already tested the image size, etc.
* If a driver has more stringent texture limits to enforce it will
* have to override this function.
*/
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type);
assert(texImage->TexFormat);
 
return GL_TRUE;
}
 
 
 
/*
* Average together two rows of a source image to produce a single new
* row in the dest image. It's legal for the two source rows to point
* to the same data. The source width must be equal to either the
* dest width or two times the dest width.
*/
static void
do_row(const struct gl_texture_format *format, GLint srcWidth,
const GLvoid *srcRowA, const GLvoid *srcRowB,
GLint dstWidth, GLvoid *dstRow)
{
const GLuint k0 = (srcWidth == dstWidth) ? 0 : 1;
const GLuint colStride = (srcWidth == dstWidth) ? 1 : 2;
 
assert(srcWidth == dstWidth || srcWidth == 2 * dstWidth);
 
switch (format->MesaFormat) {
case MESA_FORMAT_RGBA:
{
GLuint i, j, k;
const GLchan (*rowA)[4] = (const GLchan (*)[4]) srcRowA;
const GLchan (*rowB)[4] = (const GLchan (*)[4]) srcRowB;
GLchan (*dst)[4] = (GLchan (*)[4]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) / 4;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) / 4;
dst[i][2] = (rowA[j][2] + rowA[k][2] +
rowB[j][2] + rowB[k][2]) / 4;
dst[i][3] = (rowA[j][3] + rowA[k][3] +
rowB[j][3] + rowB[k][3]) / 4;
}
}
return;
case MESA_FORMAT_RGB:
{
GLuint i, j, k;
const GLchan (*rowA)[3] = (const GLchan (*)[3]) srcRowA;
const GLchan (*rowB)[3] = (const GLchan (*)[3]) srcRowB;
GLchan (*dst)[3] = (GLchan (*)[3]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) / 4;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) / 4;
dst[i][2] = (rowA[j][2] + rowA[k][2] +
rowB[j][2] + rowB[k][2]) / 4;
}
}
return;
case MESA_FORMAT_ALPHA:
case MESA_FORMAT_LUMINANCE:
case MESA_FORMAT_INTENSITY:
case MESA_FORMAT_COLOR_INDEX:
{
GLuint i, j, k;
const GLchan *rowA = (const GLchan *) srcRowA;
const GLchan *rowB = (const GLchan *) srcRowB;
GLchan *dst = (GLchan *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i] = (rowA[j] + rowA[k] + rowB[j] + rowB[k]) / 4;
}
}
return;
case MESA_FORMAT_LUMINANCE_ALPHA:
{
GLuint i, j, k;
const GLchan (*rowA)[2] = (const GLchan (*)[2]) srcRowA;
const GLchan (*rowB)[2] = (const GLchan (*)[2]) srcRowB;
GLchan (*dst)[2] = (GLchan (*)[2]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) / 4;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) / 4;
}
}
return;
case MESA_FORMAT_DEPTH_COMPONENT:
{
GLuint i, j, k;
const GLfloat *rowA = (const GLfloat *) srcRowA;
const GLfloat *rowB = (const GLfloat *) srcRowB;
GLfloat *dst = (GLfloat *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i] = (rowA[j] + rowA[k] + rowB[j] + rowB[k]) * 0.25F;
}
}
return;
/* Begin hardware formats */
case MESA_FORMAT_RGBA8888:
case MESA_FORMAT_ARGB8888:
{
GLuint i, j, k;
const GLubyte (*rowA)[4] = (const GLubyte (*)[4]) srcRowA;
const GLubyte (*rowB)[4] = (const GLubyte (*)[4]) srcRowB;
GLubyte (*dst)[4] = (GLubyte (*)[4]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) / 4;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) / 4;
dst[i][2] = (rowA[j][2] + rowA[k][2] +
rowB[j][2] + rowB[k][2]) / 4;
dst[i][3] = (rowA[j][3] + rowA[k][3] +
rowB[j][3] + rowB[k][3]) / 4;
}
}
return;
case MESA_FORMAT_RGB888:
{
GLuint i, j, k;
const GLubyte (*rowA)[3] = (const GLubyte (*)[3]) srcRowA;
const GLubyte (*rowB)[3] = (const GLubyte (*)[3]) srcRowB;
GLubyte (*dst)[3] = (GLubyte (*)[3]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) / 4;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) / 4;
dst[i][2] = (rowA[j][2] + rowA[k][2] +
rowB[j][2] + rowB[k][2]) / 4;
}
}
return;
case MESA_FORMAT_RGB565:
{
GLuint i, j, k;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
const GLint rowAr0 = rowA[j] & 0x1f;
const GLint rowAr1 = rowA[k] & 0x1f;
const GLint rowBr0 = rowB[j] & 0x1f;
const GLint rowBr1 = rowB[k] & 0x1f;
const GLint rowAg0 = (rowA[j] >> 5) & 0x3f;
const GLint rowAg1 = (rowA[k] >> 5) & 0x3f;
const GLint rowBg0 = (rowB[j] >> 5) & 0x3f;
const GLint rowBg1 = (rowB[k] >> 5) & 0x3f;
const GLint rowAb0 = (rowA[j] >> 11) & 0x1f;
const GLint rowAb1 = (rowA[k] >> 11) & 0x1f;
const GLint rowBb0 = (rowB[j] >> 11) & 0x1f;
const GLint rowBb1 = (rowB[k] >> 11) & 0x1f;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
dst[i] = (blue << 11) | (green << 5) | red;
}
}
return;
case MESA_FORMAT_ARGB4444:
{
GLuint i, j, k;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
const GLint rowAr0 = rowA[j] & 0xf;
const GLint rowAr1 = rowA[k] & 0xf;
const GLint rowBr0 = rowB[j] & 0xf;
const GLint rowBr1 = rowB[k] & 0xf;
const GLint rowAg0 = (rowA[j] >> 4) & 0xf;
const GLint rowAg1 = (rowA[k] >> 4) & 0xf;
const GLint rowBg0 = (rowB[j] >> 4) & 0xf;
const GLint rowBg1 = (rowB[k] >> 4) & 0xf;
const GLint rowAb0 = (rowA[j] >> 8) & 0xf;
const GLint rowAb1 = (rowA[k] >> 8) & 0xf;
const GLint rowBb0 = (rowB[j] >> 8) & 0xf;
const GLint rowBb1 = (rowB[k] >> 8) & 0xf;
const GLint rowAa0 = (rowA[j] >> 12) & 0xf;
const GLint rowAa1 = (rowA[k] >> 12) & 0xf;
const GLint rowBa0 = (rowB[j] >> 12) & 0xf;
const GLint rowBa1 = (rowB[k] >> 12) & 0xf;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
const GLint alpha = (rowAa0 + rowAa1 + rowBa0 + rowBa1) >> 4;
dst[i] = (alpha << 12) | (blue << 8) | (green << 4) | red;
}
}
return;
case MESA_FORMAT_ARGB1555:
{
GLuint i, j, k;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
const GLint rowAr0 = rowA[j] & 0x1f;
const GLint rowAr1 = rowA[k] & 0x1f;
const GLint rowBr0 = rowB[j] & 0x1f;
const GLint rowBr1 = rowB[k] & 0xf;
const GLint rowAg0 = (rowA[j] >> 5) & 0x1f;
const GLint rowAg1 = (rowA[k] >> 5) & 0x1f;
const GLint rowBg0 = (rowB[j] >> 5) & 0x1f;
const GLint rowBg1 = (rowB[k] >> 5) & 0x1f;
const GLint rowAb0 = (rowA[j] >> 10) & 0x1f;
const GLint rowAb1 = (rowA[k] >> 10) & 0x1f;
const GLint rowBb0 = (rowB[j] >> 10) & 0x1f;
const GLint rowBb1 = (rowB[k] >> 10) & 0x1f;
const GLint rowAa0 = (rowA[j] >> 15) & 0x1;
const GLint rowAa1 = (rowA[k] >> 15) & 0x1;
const GLint rowBa0 = (rowB[j] >> 15) & 0x1;
const GLint rowBa1 = (rowB[k] >> 15) & 0x1;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
const GLint alpha = (rowAa0 + rowAa1 + rowBa0 + rowBa1) >> 4;
dst[i] = (alpha << 15) | (blue << 10) | (green << 5) | red;
}
}
return;
case MESA_FORMAT_AL88:
{
GLuint i, j, k;
const GLubyte (*rowA)[2] = (const GLubyte (*)[2]) srcRowA;
const GLubyte (*rowB)[2] = (const GLubyte (*)[2]) srcRowB;
GLubyte (*dst)[2] = (GLubyte (*)[2]) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i][0] = (rowA[j][0] + rowA[k][0] +
rowB[j][0] + rowB[k][0]) >> 2;
dst[i][1] = (rowA[j][1] + rowA[k][1] +
rowB[j][1] + rowB[k][1]) >> 2;
}
}
return;
case MESA_FORMAT_RGB332:
{
GLuint i, j, k;
const GLubyte *rowA = (const GLubyte *) srcRowA;
const GLubyte *rowB = (const GLubyte *) srcRowB;
GLubyte *dst = (GLubyte *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
const GLint rowAr0 = rowA[j] & 0x3;
const GLint rowAr1 = rowA[k] & 0x3;
const GLint rowBr0 = rowB[j] & 0x3;
const GLint rowBr1 = rowB[k] & 0x3;
const GLint rowAg0 = (rowA[j] >> 2) & 0x7;
const GLint rowAg1 = (rowA[k] >> 2) & 0x7;
const GLint rowBg0 = (rowB[j] >> 2) & 0x7;
const GLint rowBg1 = (rowB[k] >> 2) & 0x7;
const GLint rowAb0 = (rowA[j] >> 5) & 0x7;
const GLint rowAb1 = (rowA[k] >> 5) & 0x7;
const GLint rowBb0 = (rowB[j] >> 5) & 0x7;
const GLint rowBb1 = (rowB[k] >> 5) & 0x7;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
dst[i] = (blue << 5) | (green << 2) | red;
}
}
return;
case MESA_FORMAT_A8:
case MESA_FORMAT_L8:
case MESA_FORMAT_I8:
case MESA_FORMAT_CI8:
{
GLuint i, j, k;
const GLubyte *rowA = (const GLubyte *) srcRowA;
const GLubyte *rowB = (const GLubyte *) srcRowB;
GLubyte *dst = (GLubyte *) dstRow;
for (i = j = 0, k = k0; i < (GLuint) dstWidth;
i++, j += colStride, k += colStride) {
dst[i] = (rowA[j] + rowA[k] + rowB[j] + rowB[k]) >> 2;
}
}
return;
default:
_mesa_problem(NULL, "bad format in do_row()");
}
}
 
 
/*
* These functions generate a 1/2-size mipmap image from a source image.
* Texture borders are handled by copying or averaging the source image's
* border texels, depending on the scale-down factor.
*/
 
static void
make_1d_mipmap(const struct gl_texture_format *format, GLint border,
GLint srcWidth, const GLubyte *srcPtr,
GLint dstWidth, GLubyte *dstPtr)
{
const GLint bpt = format->TexelBytes;
const GLubyte *src;
GLubyte *dst;
 
/* skip the border pixel, if any */
src = srcPtr + border * bpt;
dst = dstPtr + border * bpt;
 
/* we just duplicate the input row, kind of hack, saves code */
do_row(format, srcWidth - 2 * border, src, src,
dstWidth - 2 * border, dst);
 
if (border) {
/* copy left-most pixel from source */
MEMCPY(dstPtr, srcPtr, bpt);
/* copy right-most pixel from source */
MEMCPY(dstPtr + (dstWidth - 1) * bpt,
srcPtr + (srcWidth - 1) * bpt,
bpt);
}
}
 
 
static void
make_2d_mipmap(const struct gl_texture_format *format, GLint border,
GLint srcWidth, GLint srcHeight, const GLubyte *srcPtr,
GLint dstWidth, GLint dstHeight, GLubyte *dstPtr)
{
const GLint bpt = format->TexelBytes;
const GLint srcWidthNB = srcWidth - 2 * border; /* sizes w/out border */
const GLint dstWidthNB = dstWidth - 2 * border;
const GLint dstHeightNB = dstHeight - 2 * border;
const GLint srcRowStride = bpt * srcWidth;
const GLint dstRowStride = bpt * dstWidth;
const GLubyte *srcA, *srcB;
GLubyte *dst;
GLint row, colStride;
 
colStride = (srcWidth == dstWidth) ? 1 : 2;
 
/* Compute src and dst pointers, skipping any border */
srcA = srcPtr + border * ((srcWidth + 1) * bpt);
if (srcHeight > 1)
srcB = srcA + srcRowStride;
else
srcB = srcA;
dst = dstPtr + border * ((dstWidth + 1) * bpt);
 
for (row = 0; row < dstHeightNB; row++) {
do_row(format, srcWidthNB, srcA, srcB,
dstWidthNB, dst);
srcA += 2 * srcRowStride;
srcB += 2 * srcRowStride;
dst += dstRowStride;
}
 
/* This is ugly but probably won't be used much */
if (border > 0) {
/* fill in dest border */
/* lower-left border pixel */
MEMCPY(dstPtr, srcPtr, bpt);
/* lower-right border pixel */
MEMCPY(dstPtr + (dstWidth - 1) * bpt,
srcPtr + (srcWidth - 1) * bpt, bpt);
/* upper-left border pixel */
MEMCPY(dstPtr + dstWidth * (dstHeight - 1) * bpt,
srcPtr + srcWidth * (srcHeight - 1) * bpt, bpt);
/* upper-right border pixel */
MEMCPY(dstPtr + (dstWidth * dstHeight - 1) * bpt,
srcPtr + (srcWidth * srcHeight - 1) * bpt, bpt);
/* lower border */
do_row(format, srcWidthNB,
srcPtr + bpt,
srcPtr + bpt,
dstWidthNB, dstPtr + bpt);
/* upper border */
do_row(format, srcWidthNB,
srcPtr + (srcWidth * (srcHeight - 1) + 1) * bpt,
srcPtr + (srcWidth * (srcHeight - 1) + 1) * bpt,
dstWidthNB,
dstPtr + (dstWidth * (dstHeight - 1) + 1) * bpt);
/* left and right borders */
if (srcHeight == dstHeight) {
/* copy border pixel from src to dst */
for (row = 1; row < srcHeight; row++) {
MEMCPY(dstPtr + dstWidth * row * bpt,
srcPtr + srcWidth * row * bpt, bpt);
MEMCPY(dstPtr + (dstWidth * row + dstWidth - 1) * bpt,
srcPtr + (srcWidth * row + srcWidth - 1) * bpt, bpt);
}
}
else {
/* average two src pixels each dest pixel */
for (row = 0; row < dstHeightNB; row += 2) {
do_row(format, 1,
srcPtr + (srcWidth * (row * 2 + 1)) * bpt,
srcPtr + (srcWidth * (row * 2 + 2)) * bpt,
1, dstPtr + (dstWidth * row + 1) * bpt);
do_row(format, 1,
srcPtr + (srcWidth * (row * 2 + 1) + srcWidth - 1) * bpt,
srcPtr + (srcWidth * (row * 2 + 2) + srcWidth - 1) * bpt,
1, dstPtr + (dstWidth * row + 1 + dstWidth - 1) * bpt);
}
}
}
}
 
 
static void
make_3d_mipmap(const struct gl_texture_format *format, GLint border,
GLint srcWidth, GLint srcHeight, GLint srcDepth,
const GLubyte *srcPtr,
GLint dstWidth, GLint dstHeight, GLint dstDepth,
GLubyte *dstPtr)
{
const GLint bpt = format->TexelBytes;
const GLint srcWidthNB = srcWidth - 2 * border; /* sizes w/out border */
const GLint srcDepthNB = srcDepth - 2 * border;
const GLint dstWidthNB = dstWidth - 2 * border;
const GLint dstHeightNB = dstHeight - 2 * border;
const GLint dstDepthNB = dstDepth - 2 * border;
GLvoid *tmpRowA, *tmpRowB;
GLint img, row;
GLint bytesPerSrcImage, bytesPerDstImage;
GLint bytesPerSrcRow, bytesPerDstRow;
GLint srcImageOffset, srcRowOffset;
 
(void) srcDepthNB; /* silence warnings */
 
/* Need two temporary row buffers */
tmpRowA = MALLOC(srcWidth * bpt);
if (!tmpRowA)
return;
tmpRowB = MALLOC(srcWidth * bpt);
if (!tmpRowB) {
FREE(tmpRowA);
return;
}
 
bytesPerSrcImage = srcWidth * srcHeight * bpt;
bytesPerDstImage = dstWidth * dstHeight * bpt;
 
bytesPerSrcRow = srcWidth * bpt;
bytesPerDstRow = dstWidth * bpt;
 
/* Offset between adjacent src images to be averaged together */
srcImageOffset = (srcDepth == dstDepth) ? 0 : bytesPerSrcImage;
 
/* Offset between adjacent src rows to be averaged together */
srcRowOffset = (srcHeight == dstHeight) ? 0 : srcWidth * bpt;
 
/*
* Need to average together up to 8 src pixels for each dest pixel.
* Break that down into 3 operations:
* 1. take two rows from source image and average them together.
* 2. take two rows from next source image and average them together.
* 3. take the two averaged rows and average them for the final dst row.
*/
 
/*
_mesa_printf("mip3d %d x %d x %d -> %d x %d x %d\n",
srcWidth, srcHeight, srcDepth, dstWidth, dstHeight, dstDepth);
*/
 
for (img = 0; img < dstDepthNB; img++) {
/* first source image pointer, skipping border */
const GLubyte *imgSrcA = srcPtr
+ (bytesPerSrcImage + bytesPerSrcRow + border) * bpt * border
+ img * (bytesPerSrcImage + srcImageOffset);
/* second source image pointer, skipping border */
const GLubyte *imgSrcB = imgSrcA + srcImageOffset;
/* address of the dest image, skipping border */
GLubyte *imgDst = dstPtr
+ (bytesPerDstImage + bytesPerDstRow + border) * bpt * border
+ img * bytesPerDstImage;
 
/* setup the four source row pointers and the dest row pointer */
const GLubyte *srcImgARowA = imgSrcA;
const GLubyte *srcImgARowB = imgSrcA + srcRowOffset;
const GLubyte *srcImgBRowA = imgSrcB;
const GLubyte *srcImgBRowB = imgSrcB + srcRowOffset;
GLubyte *dstImgRow = imgDst;
 
for (row = 0; row < dstHeightNB; row++) {
/* Average together two rows from first src image */
do_row(format, srcWidthNB, srcImgARowA, srcImgARowB,
srcWidthNB, tmpRowA);
/* Average together two rows from second src image */
do_row(format, srcWidthNB, srcImgBRowA, srcImgBRowB,
srcWidthNB, tmpRowB);
/* Average together the temp rows to make the final row */
do_row(format, srcWidthNB, tmpRowA, tmpRowB,
dstWidthNB, dstImgRow);
/* advance to next rows */
srcImgARowA += bytesPerSrcRow + srcRowOffset;
srcImgARowB += bytesPerSrcRow + srcRowOffset;
srcImgBRowA += bytesPerSrcRow + srcRowOffset;
srcImgBRowB += bytesPerSrcRow + srcRowOffset;
dstImgRow += bytesPerDstRow;
}
}
 
FREE(tmpRowA);
FREE(tmpRowB);
 
/* Luckily we can leverage the make_2d_mipmap() function here! */
if (border > 0) {
/* do front border image */
make_2d_mipmap(format, 1, srcWidth, srcHeight, srcPtr,
dstWidth, dstHeight, dstPtr);
/* do back border image */
make_2d_mipmap(format, 1, srcWidth, srcHeight,
srcPtr + bytesPerSrcImage * (srcDepth - 1),
dstWidth, dstHeight,
dstPtr + bytesPerDstImage * (dstDepth - 1));
/* do four remaining border edges that span the image slices */
if (srcDepth == dstDepth) {
/* just copy border pixels from src to dst */
for (img = 0; img < dstDepthNB; img++) {
const GLubyte *src;
GLubyte *dst;
 
/* do border along [img][row=0][col=0] */
src = srcPtr + (img + 1) * bytesPerSrcImage;
dst = dstPtr + (img + 1) * bytesPerDstImage;
MEMCPY(dst, src, bpt);
 
/* do border along [img][row=dstHeight-1][col=0] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (srcHeight - 1) * bytesPerSrcRow;
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (dstHeight - 1) * bytesPerDstRow;
MEMCPY(dst, src, bpt);
 
/* do border along [img][row=0][col=dstWidth-1] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (srcWidth - 1) * bpt;
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (dstWidth - 1) * bpt;
MEMCPY(dst, src, bpt);
 
/* do border along [img][row=dstHeight-1][col=dstWidth-1] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (bytesPerSrcImage - bpt);
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (bytesPerDstImage - bpt);
MEMCPY(dst, src, bpt);
}
}
else {
/* average border pixels from adjacent src image pairs */
ASSERT(srcDepthNB == 2 * dstDepthNB);
for (img = 0; img < dstDepthNB; img++) {
const GLubyte *src;
GLubyte *dst;
 
/* do border along [img][row=0][col=0] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage;
dst = dstPtr + (img + 1) * bytesPerDstImage;
do_row(format, 1, src, src + srcImageOffset, 1, dst);
 
/* do border along [img][row=dstHeight-1][col=0] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (srcHeight - 1) * bytesPerSrcRow;
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (dstHeight - 1) * bytesPerDstRow;
do_row(format, 1, src, src + srcImageOffset, 1, dst);
 
/* do border along [img][row=0][col=dstWidth-1] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (srcWidth - 1) * bpt;
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (dstWidth - 1) * bpt;
do_row(format, 1, src, src + srcImageOffset, 1, dst);
 
/* do border along [img][row=dstHeight-1][col=dstWidth-1] */
src = srcPtr + (img * 2 + 1) * bytesPerSrcImage
+ (bytesPerSrcImage - bpt);
dst = dstPtr + (img + 1) * bytesPerDstImage
+ (bytesPerDstImage - bpt);
do_row(format, 1, src, src + srcImageOffset, 1, dst);
}
}
}
}
 
 
/*
* For GL_SGIX_generate_mipmap:
* Generate a complete set of mipmaps from texObj's base-level image.
* Stop at texObj's MaxLevel or when we get to the 1x1 texture.
*/
void
_mesa_generate_mipmap(GLcontext *ctx, GLenum target,
const struct gl_texture_unit *texUnit,
struct gl_texture_object *texObj)
{
const struct gl_texture_image *srcImage;
const struct gl_texture_format *convertFormat;
const GLubyte *srcData;
GLubyte *dstData;
GLint level, maxLevels;
 
ASSERT(texObj);
srcImage = texObj->Image[texObj->BaseLevel];
ASSERT(srcImage);
 
maxLevels = _mesa_max_texture_levels(ctx, texObj->Target);
ASSERT(maxLevels > 0); /* bad target */
 
/* Find convertFormat - the format that do_row() will process */
if (srcImage->IsCompressed) {
/* setup for compressed textures */
GLuint row;
GLint components, size;
GLchan *dst;
 
assert(texObj->Target == GL_TEXTURE_2D);
 
if (srcImage->Format == GL_RGB) {
convertFormat = &_mesa_texformat_rgb;
components = 3;
}
else if (srcImage->Format == GL_RGBA) {
convertFormat = &_mesa_texformat_rgba;
components = 4;
}
else {
_mesa_problem(ctx, "bad srcImage->Format in _mesa_generate_mipmaps");
return;
}
 
/* allocate storage for uncompressed GL_RGB or GL_RGBA images */
size = _mesa_bytes_per_pixel(srcImage->Format, CHAN_TYPE)
* srcImage->Width * srcImage->Height * srcImage->Depth + 20;
/* 20 extra bytes, just be safe when calling last FetchTexel */
srcData = MALLOC(size);
if (!srcData) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "generate mipmaps");
return;
}
dstData = MALLOC(size / 2); /* 1/4 would probably be OK */
if (!dstData) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "generate mipmaps");
FREE((void *) srcData);
return;
}
 
/* decompress base image here */
dst = (GLchan *) srcData;
for (row = 0; row < srcImage->Height; row++) {
GLuint col;
for (col = 0; col < srcImage->Width; col++) {
(*srcImage->FetchTexel)(srcImage, col, row, 0, (GLvoid *) dst);
dst += components;
}
}
}
else {
/* uncompressed */
convertFormat = srcImage->TexFormat;
}
 
for (level = texObj->BaseLevel; level < texObj->MaxLevel
&& level < maxLevels - 1; level++) {
/* generate image[level+1] from image[level] */
const struct gl_texture_image *srcImage;
struct gl_texture_image *dstImage;
GLint srcWidth, srcHeight, srcDepth;
GLint dstWidth, dstHeight, dstDepth;
GLint border, bytesPerTexel;
 
/* get src image parameters */
srcImage = texObj->Image[level];
ASSERT(srcImage);
srcWidth = srcImage->Width;
srcHeight = srcImage->Height;
srcDepth = srcImage->Depth;
border = srcImage->Border;
 
/* compute next (level+1) image size */
if (srcWidth - 2 * border > 1) {
dstWidth = (srcWidth - 2 * border) / 2 + 2 * border;
}
else {
dstWidth = srcWidth; /* can't go smaller */
}
if (srcHeight - 2 * border > 1) {
dstHeight = (srcHeight - 2 * border) / 2 + 2 * border;
}
else {
dstHeight = srcHeight; /* can't go smaller */
}
if (srcDepth - 2 * border > 1) {
dstDepth = (srcDepth - 2 * border) / 2 + 2 * border;
}
else {
dstDepth = srcDepth; /* can't go smaller */
}
 
if (dstWidth == srcWidth &&
dstHeight == srcHeight &&
dstDepth == srcDepth) {
/* all done */
if (srcImage->IsCompressed) {
FREE((void *) srcData);
FREE(dstData);
}
return;
}
 
/* get dest gl_texture_image */
dstImage = _mesa_select_tex_image(ctx, texUnit, target, level+1);
if (!dstImage) {
dstImage = _mesa_alloc_texture_image();
if (!dstImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
return;
}
_mesa_set_tex_image(texObj, target, level + 1, dstImage);
}
 
/* Free old image data */
if (dstImage->Data)
MESA_PBUFFER_FREE(dstImage->Data);
 
/* initialize new image */
_mesa_init_teximage_fields(ctx, target, dstImage, dstWidth, dstHeight,
dstDepth, border, srcImage->IntFormat);
dstImage->DriverData = NULL;
dstImage->TexFormat = srcImage->TexFormat;
dstImage->FetchTexel = srcImage->FetchTexel;
ASSERT(dstImage->TexFormat);
ASSERT(dstImage->FetchTexel);
 
/* Alloc new teximage data buffer.
* Setup src and dest data pointers.
*/
if (dstImage->IsCompressed) {
ASSERT(dstImage->CompressedSize > 0); /* set by init_teximage_fields*/
dstImage->Data = MESA_PBUFFER_ALLOC(dstImage->CompressedSize);
if (!dstImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
return;
}
/* srcData and dstData are already set */
ASSERT(srcData);
ASSERT(dstData);
}
else {
bytesPerTexel = srcImage->TexFormat->TexelBytes;
ASSERT(dstWidth * dstHeight * dstDepth * bytesPerTexel > 0);
dstImage->Data = MESA_PBUFFER_ALLOC(dstWidth * dstHeight * dstDepth
* bytesPerTexel);
if (!dstImage->Data) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");
return;
}
srcData = (const GLubyte *) srcImage->Data;
dstData = (GLubyte *) dstImage->Data;
}
 
/*
* We use simple 2x2 averaging to compute the next mipmap level.
*/
switch (target) {
case GL_TEXTURE_1D:
make_1d_mipmap(convertFormat, border,
srcWidth, srcData,
dstWidth, dstData);
break;
case GL_TEXTURE_2D:
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
make_2d_mipmap(convertFormat, border,
srcWidth, srcHeight, srcData,
dstWidth, dstHeight, dstData);
break;
case GL_TEXTURE_3D:
make_3d_mipmap(convertFormat, border,
srcWidth, srcHeight, srcDepth, srcData,
dstWidth, dstHeight, dstDepth, dstData);
break;
case GL_TEXTURE_RECTANGLE_NV:
/* no mipmaps, do nothing */
break;
default:
_mesa_problem(ctx, "bad dimensions in _mesa_generate_mipmaps");
return;
}
 
if (dstImage->IsCompressed) {
GLubyte *temp;
/* compress image from dstData into dstImage->Data */
const GLenum srcFormat = convertFormat->BaseFormat;
GLint dstRowStride = _mesa_compressed_row_stride(srcImage->IntFormat,
dstWidth);
ASSERT(srcFormat == GL_RGB || srcFormat == GL_RGBA);
_mesa_compress_teximage(ctx,
dstWidth, dstHeight, /* size */
srcFormat, /* source format */
dstData, /* source buffer */
dstWidth, /* source row stride */
dstImage->TexFormat, /* dest format */
dstImage->Data, /* dest buffer */
dstRowStride ); /* dest row stride */
 
/* swap src and dest pointers */
temp = (GLubyte *) srcData;
srcData = dstData;
dstData = temp;
}
 
} /* loop over mipmap levels */
}
/shark/trunk/ports/mesa/src/drawpix.c
0,0 → 1,284
/* $Id: drawpix.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "colormac.h"
#include "context.h"
#include "drawpix.h"
#include "feedback.h"
#include "macros.h"
#include "mmath.h"
#include "state.h"
#include "mtypes.h"
 
 
/*
* Execute glDrawPixels
*/
void
_mesa_DrawPixels( GLsizei width, GLsizei height,
GLenum format, GLenum type, const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glDrawPixels(width or height < 0" );
return;
}
 
if (ctx->RenderMode==GL_RENDER) {
GLint x, y;
if (!pixels || !ctx->Current.RasterPosValid) {
return;
}
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
/* Round, to satisfy conformance tests (matches SGI's OpenGL) */
x = IROUND(ctx->Current.RasterPos[0]);
y = IROUND(ctx->Current.RasterPos[1]);
 
ctx->OcclusionResult = GL_TRUE;
ctx->Driver.DrawPixels(ctx, x, y, width, height, format, type,
&ctx->Unpack, pixels);
}
else if (ctx->RenderMode==GL_FEEDBACK) {
/* Feedback the current raster pos info */
if (ctx->Current.RasterPosValid) {
FLUSH_CURRENT( ctx, 0 );
FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );
_mesa_feedback_vertex( ctx,
ctx->Current.RasterPos,
ctx->Current.RasterColor,
ctx->Current.RasterIndex,
ctx->Current.RasterTexCoords[0] );
}
}
else if (ctx->RenderMode==GL_SELECT) {
if (ctx->Current.RasterPosValid) {
_mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
}
}
}
 
 
 
void
_mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glReadPixels(width=%d height=%d)", width, height );
return;
}
 
if (!pixels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glReadPixels(pixels)" );
return;
}
 
if (ctx->NewState)
_mesa_update_state(ctx);
 
ctx->Driver.ReadPixels(ctx, x, y, width, height,
format, type, &ctx->Pack, pixels);
}
 
 
 
void
_mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
GLenum type )
{
GET_CURRENT_CONTEXT(ctx);
GLint destx, desty;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)" );
return;
}
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
if (ctx->RenderMode==GL_RENDER) {
/* Destination of copy: */
if (!ctx->Current.RasterPosValid) {
return;
}
 
/* Round, to satisfy conformance tests (matches SGI's OpenGL) */
destx = IROUND(ctx->Current.RasterPos[0]);
desty = IROUND(ctx->Current.RasterPos[1]);
 
ctx->OcclusionResult = GL_TRUE;
 
ctx->Driver.CopyPixels( ctx, srcx, srcy, width, height, destx, desty,
type );
}
else if (ctx->RenderMode == GL_FEEDBACK) {
if (ctx->Current.RasterPosValid) {
FLUSH_CURRENT( ctx, 0 );
FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_COPY_PIXEL_TOKEN );
_mesa_feedback_vertex( ctx,
ctx->Current.RasterPos,
ctx->Current.RasterColor,
ctx->Current.RasterIndex,
ctx->Current.RasterTexCoords[0] );
}
}
else if (ctx->RenderMode == GL_SELECT) {
_mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
}
}
 
 
 
void
_mesa_Bitmap( GLsizei width, GLsizei height,
GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
const GLubyte *bitmap )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glBitmap(width or height < 0)" );
return;
}
 
if (ctx->Current.RasterPosValid == GL_FALSE) {
return; /* do nothing */
}
 
if (ctx->RenderMode==GL_RENDER) {
if (bitmap) {
/* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
ctx->OcclusionResult = GL_TRUE;
ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
}
}
else if (ctx->RenderMode==GL_FEEDBACK) {
if (ctx->Current.RasterPosValid) {
FLUSH_CURRENT(ctx, 0);
FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_BITMAP_TOKEN );
_mesa_feedback_vertex( ctx,
ctx->Current.RasterPos,
ctx->Current.RasterColor,
ctx->Current.RasterIndex,
ctx->Current.RasterTexCoords[0] );
}
}
else if (ctx->RenderMode==GL_SELECT) {
/* Bitmaps don't generate selection hits. See appendix B of 1.1 spec. */
}
 
/* update raster position */
ctx->Current.RasterPos[0] += xmove;
ctx->Current.RasterPos[1] += ymove;
}
 
 
 
#if 0 /* experimental */
/*
* Execute glDrawDepthPixelsMESA(). This function accepts both a color
* image and depth (Z) image. Rasterization produces fragments with
* color and Z taken from these images. This function is intended for
* Z-compositing. Normally, this operation requires two glDrawPixels
* calls with stencil testing.
*/
void
_mesa_DrawDepthPixelsMESA( GLsizei width, GLsizei height,
GLenum colorFormat, GLenum colorType,
const GLvoid *colors,
GLenum depthType, const GLvoid *depths )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glDrawDepthPixelsMESA(width or height < 0" );
return;
}
 
if (ctx->RenderMode==GL_RENDER) {
GLint x, y;
if (!colors || !depths || !ctx->Current.RasterPosValid) {
return;
}
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
/* Round, to satisfy conformance tests (matches SGI's OpenGL) */
x = IROUND(ctx->Current.RasterPos[0]);
y = IROUND(ctx->Current.RasterPos[1]);
 
ctx->OcclusionResult = GL_TRUE;
ctx->Driver.DrawDepthPixelsMESA(ctx, x, y, width, height,
colorFormat, colorType, colors,
depthType, depths, &ctx->Unpack);
}
else if (ctx->RenderMode==GL_FEEDBACK) {
/* Feedback the current raster pos info */
if (ctx->Current.RasterPosValid) {
FLUSH_CURRENT( ctx, 0 );
FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );
_mesa_feedback_vertex( ctx,
ctx->Current.RasterPos,
ctx->Current.RasterColor,
ctx->Current.RasterIndex,
ctx->Current.RasterTexCoords[0] );
}
}
else if (ctx->RenderMode==GL_SELECT) {
if (ctx->Current.RasterPosValid) {
_mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
}
}
}
 
#endif
/shark/trunk/ports/mesa/src/dlist.c
0,0 → 1,6485
/* $Id: dlist.c,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "api_loopback.h"
#include "attrib.h"
#include "blend.h"
#include "buffers.h"
#include "clip.h"
#include "colormac.h"
#include "colortab.h"
#include "context.h"
#include "convolve.h"
#include "depth.h"
#include "dlist.h"
#include "enable.h"
#include "enums.h"
#include "eval.h"
#include "extensions.h"
#include "feedback.h"
#include "get.h"
#include "glapi.h"
#include "hash.h"
#include "histogram.h"
#include "image.h"
#include "light.h"
#include "lines.h"
#include "dlist.h"
#include "macros.h"
#include "matrix.h"
#include "pixel.h"
#include "points.h"
#include "polygon.h"
#include "state.h"
#include "texobj.h"
#include "teximage.h"
#include "texstate.h"
#include "mtypes.h"
#include "varray.h"
#if FEATURE_NV_vertex_program
#include "vpstate.h"
#endif
 
#include "math/m_matrix.h"
#include "math/m_xform.h"
 
 
 
/*
Functions which aren't compiled but executed immediately:
glIsList
glGenLists
glDeleteLists
glEndList --- BUT: call ctx->Driver.EndList at end of list execution?
glFeedbackBuffer
glSelectBuffer
glRenderMode
glReadPixels
glPixelStore
glFlush
glFinish
glIsEnabled
glGet*
 
Functions which cause errors if called while compiling a display list:
glNewList
*/
 
 
 
/*
* Display list instructions are stored as sequences of "nodes". Nodes
* are allocated in blocks. Each block has BLOCK_SIZE nodes. Blocks
* are linked together with a pointer.
*/
 
 
/* How many nodes to allocate at a time:
* - reduced now that we hold vertices etc. elsewhere.
*/
#define BLOCK_SIZE 256
 
 
/*
* Display list opcodes.
*
* The fact that these identifiers are assigned consecutive
* integer values starting at 0 is very important, see InstSize array usage)
*
*/
typedef enum {
OPCODE_ACCUM,
OPCODE_ALPHA_FUNC,
OPCODE_BIND_TEXTURE,
OPCODE_BITMAP,
OPCODE_BLEND_COLOR,
OPCODE_BLEND_EQUATION,
OPCODE_BLEND_FUNC,
OPCODE_BLEND_FUNC_SEPARATE,
OPCODE_CALL_LIST,
OPCODE_CALL_LIST_OFFSET,
OPCODE_CLEAR,
OPCODE_CLEAR_ACCUM,
OPCODE_CLEAR_COLOR,
OPCODE_CLEAR_DEPTH,
OPCODE_CLEAR_INDEX,
OPCODE_CLEAR_STENCIL,
OPCODE_CLIP_PLANE,
OPCODE_COLOR_MASK,
OPCODE_COLOR_MATERIAL,
OPCODE_COLOR_TABLE,
OPCODE_COLOR_TABLE_PARAMETER_FV,
OPCODE_COLOR_TABLE_PARAMETER_IV,
OPCODE_COLOR_SUB_TABLE,
OPCODE_CONVOLUTION_FILTER_1D,
OPCODE_CONVOLUTION_FILTER_2D,
OPCODE_CONVOLUTION_PARAMETER_I,
OPCODE_CONVOLUTION_PARAMETER_IV,
OPCODE_CONVOLUTION_PARAMETER_F,
OPCODE_CONVOLUTION_PARAMETER_FV,
OPCODE_COPY_COLOR_SUB_TABLE,
OPCODE_COPY_COLOR_TABLE,
OPCODE_COPY_PIXELS,
OPCODE_COPY_TEX_IMAGE1D,
OPCODE_COPY_TEX_IMAGE2D,
OPCODE_COPY_TEX_SUB_IMAGE1D,
OPCODE_COPY_TEX_SUB_IMAGE2D,
OPCODE_COPY_TEX_SUB_IMAGE3D,
OPCODE_CULL_FACE,
OPCODE_DEPTH_FUNC,
OPCODE_DEPTH_MASK,
OPCODE_DEPTH_RANGE,
OPCODE_DISABLE,
OPCODE_DRAW_BUFFER,
OPCODE_DRAW_PIXELS,
OPCODE_ENABLE,
OPCODE_EVALMESH1,
OPCODE_EVALMESH2,
OPCODE_FOG,
OPCODE_FRONT_FACE,
OPCODE_FRUSTUM,
OPCODE_HINT,
OPCODE_HISTOGRAM,
OPCODE_INDEX_MASK,
OPCODE_INIT_NAMES,
OPCODE_LIGHT,
OPCODE_LIGHT_MODEL,
OPCODE_LINE_STIPPLE,
OPCODE_LINE_WIDTH,
OPCODE_LIST_BASE,
OPCODE_LOAD_IDENTITY,
OPCODE_LOAD_MATRIX,
OPCODE_LOAD_NAME,
OPCODE_LOGIC_OP,
OPCODE_MAP1,
OPCODE_MAP2,
OPCODE_MAPGRID1,
OPCODE_MAPGRID2,
OPCODE_MATRIX_MODE,
OPCODE_MIN_MAX,
OPCODE_MULT_MATRIX,
OPCODE_ORTHO,
OPCODE_PASSTHROUGH,
OPCODE_PIXEL_MAP,
OPCODE_PIXEL_TRANSFER,
OPCODE_PIXEL_ZOOM,
OPCODE_POINT_SIZE,
OPCODE_POINT_PARAMETERS,
OPCODE_POLYGON_MODE,
OPCODE_POLYGON_STIPPLE,
OPCODE_POLYGON_OFFSET,
OPCODE_POP_ATTRIB,
OPCODE_POP_MATRIX,
OPCODE_POP_NAME,
OPCODE_PRIORITIZE_TEXTURE,
OPCODE_PUSH_ATTRIB,
OPCODE_PUSH_MATRIX,
OPCODE_PUSH_NAME,
OPCODE_RASTER_POS,
OPCODE_READ_BUFFER,
OPCODE_RESET_HISTOGRAM,
OPCODE_RESET_MIN_MAX,
OPCODE_ROTATE,
OPCODE_SCALE,
OPCODE_SCISSOR,
OPCODE_SELECT_TEXTURE_SGIS,
OPCODE_SELECT_TEXTURE_COORD_SET,
OPCODE_SHADE_MODEL,
OPCODE_STENCIL_FUNC,
OPCODE_STENCIL_MASK,
OPCODE_STENCIL_OP,
OPCODE_TEXENV,
OPCODE_TEXGEN,
OPCODE_TEXPARAMETER,
OPCODE_TEX_IMAGE1D,
OPCODE_TEX_IMAGE2D,
OPCODE_TEX_IMAGE3D,
OPCODE_TEX_SUB_IMAGE1D,
OPCODE_TEX_SUB_IMAGE2D,
OPCODE_TEX_SUB_IMAGE3D,
OPCODE_TRANSLATE,
OPCODE_VIEWPORT,
OPCODE_WINDOW_POS,
/* GL_ARB_multitexture */
OPCODE_ACTIVE_TEXTURE,
/* GL_SGIX/SGIS_pixel_texture */
OPCODE_PIXEL_TEXGEN_SGIX,
OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS,
/* GL_ARB_texture_compression */
OPCODE_COMPRESSED_TEX_IMAGE_1D,
OPCODE_COMPRESSED_TEX_IMAGE_2D,
OPCODE_COMPRESSED_TEX_IMAGE_3D,
OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D,
OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D,
OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D,
/* GL_ARB_multisample */
OPCODE_SAMPLE_COVERAGE,
/* GL_ARB_window_pos */
OPCODE_WINDOW_POS_ARB,
/* GL_NV_vertex_program */
OPCODE_BIND_PROGRAM_NV,
OPCODE_EXECUTE_PROGRAM_NV,
OPCODE_REQUEST_PROGRAMS_RESIDENT_NV,
OPCODE_LOAD_PROGRAM_NV,
OPCODE_PROGRAM_PARAMETER4F_NV,
OPCODE_TRACK_MATRIX_NV,
/* GL_EXT_stencil_two_side */
OPCODE_ACTIVE_STENCIL_FACE_EXT,
/* The following three are meta instructions */
OPCODE_ERROR, /* raise compiled-in error */
OPCODE_CONTINUE,
OPCODE_END_OF_LIST,
OPCODE_DRV_0
} OpCode;
 
 
/*
* Each instruction in the display list is stored as a sequence of
* contiguous nodes in memory.
* Each node is the union of a variety of datatypes.
*/
union node {
OpCode opcode;
GLboolean b;
GLbitfield bf;
GLubyte ub;
GLshort s;
GLushort us;
GLint i;
GLuint ui;
GLenum e;
GLfloat f;
GLvoid *data;
void *next; /* If prev node's opcode==OPCODE_CONTINUE */
};
 
 
 
/* Number of nodes of storage needed for each instruction. Sizes for
* dynamically allocated opcodes are stored in the context struct.
*/
static GLuint InstSize[ OPCODE_END_OF_LIST+1 ];
 
void mesa_print_display_list( GLuint list );
 
 
/**********************************************************************/
/***** Private *****/
/**********************************************************************/
 
 
 
 
 
/*
* Make an empty display list. This is used by glGenLists() to
* reserver display list IDs.
*/
static Node *make_empty_list( void )
{
Node *n = (Node *) MALLOC( sizeof(Node) );
n[0].opcode = OPCODE_END_OF_LIST;
return n;
}
 
 
 
/*
* Destroy all nodes in a display list.
* Input: list - display list number
*/
void _mesa_destroy_list( GLcontext *ctx, GLuint list )
{
Node *n, *block;
GLboolean done;
 
if (list==0)
return;
 
block = (Node *) _mesa_HashLookup(ctx->Shared->DisplayList, list);
n = block;
 
done = block ? GL_FALSE : GL_TRUE;
while (!done) {
 
/* check for extension opcodes first */
 
GLint i = (GLint) n[0].opcode - (GLint) OPCODE_DRV_0;
if (i >= 0 && i < (GLint) ctx->listext.nr_opcodes) {
ctx->listext.opcode[i].destroy(ctx, &n[1]);
n += ctx->listext.opcode[i].size;
}
else {
switch (n[0].opcode) {
case OPCODE_MAP1:
FREE(n[6].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_MAP2:
FREE(n[10].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_DRAW_PIXELS:
FREE( n[5].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_BITMAP:
FREE( n[7].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_COLOR_TABLE:
FREE( n[6].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_COLOR_SUB_TABLE:
FREE( n[6].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_CONVOLUTION_FILTER_1D:
FREE( n[6].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_CONVOLUTION_FILTER_2D:
FREE( n[7].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_POLYGON_STIPPLE:
FREE( n[1].data );
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_IMAGE1D:
FREE(n[8].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_IMAGE2D:
FREE( n[9]. data );
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_IMAGE3D:
FREE( n[10]. data );
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_SUB_IMAGE1D:
FREE(n[7].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_SUB_IMAGE2D:
FREE(n[9].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_TEX_SUB_IMAGE3D:
FREE(n[11].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_IMAGE_1D:
FREE(n[7].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_IMAGE_2D:
FREE(n[8].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_IMAGE_3D:
FREE(n[9].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D:
FREE(n[7].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D:
FREE(n[9].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D:
FREE(n[11].data);
n += InstSize[n[0].opcode];
break;
case OPCODE_CONTINUE:
n = (Node *) n[1].next;
FREE( block );
block = n;
break;
case OPCODE_END_OF_LIST:
FREE( block );
done = GL_TRUE;
break;
default:
/* Most frequent case */
n += InstSize[n[0].opcode];
break;
}
}
}
 
_mesa_HashRemove(ctx->Shared->DisplayList, list);
}
 
 
 
/*
* Translate the nth element of list from type to GLuint.
*/
static GLuint translate_id( GLsizei n, GLenum type, const GLvoid *list )
{
GLbyte *bptr;
GLubyte *ubptr;
GLshort *sptr;
GLushort *usptr;
GLint *iptr;
GLuint *uiptr;
GLfloat *fptr;
 
switch (type) {
case GL_BYTE:
bptr = (GLbyte *) list;
return (GLuint) *(bptr+n);
case GL_UNSIGNED_BYTE:
ubptr = (GLubyte *) list;
return (GLuint) *(ubptr+n);
case GL_SHORT:
sptr = (GLshort *) list;
return (GLuint) *(sptr+n);
case GL_UNSIGNED_SHORT:
usptr = (GLushort *) list;
return (GLuint) *(usptr+n);
case GL_INT:
iptr = (GLint *) list;
return (GLuint) *(iptr+n);
case GL_UNSIGNED_INT:
uiptr = (GLuint *) list;
return (GLuint) *(uiptr+n);
case GL_FLOAT:
fptr = (GLfloat *) list;
return (GLuint) *(fptr+n);
case GL_2_BYTES:
ubptr = ((GLubyte *) list) + 2*n;
return (GLuint) *ubptr * 256 + (GLuint) *(ubptr+1);
case GL_3_BYTES:
ubptr = ((GLubyte *) list) + 3*n;
return (GLuint) *ubptr * 65536
+ (GLuint) *(ubptr+1) * 256
+ (GLuint) *(ubptr+2);
case GL_4_BYTES:
ubptr = ((GLubyte *) list) + 4*n;
return (GLuint) *ubptr * 16777216
+ (GLuint) *(ubptr+1) * 65536
+ (GLuint) *(ubptr+2) * 256
+ (GLuint) *(ubptr+3);
default:
return 0;
}
}
 
 
 
 
/**********************************************************************/
/***** Public *****/
/**********************************************************************/
 
void _mesa_init_lists( void )
{
static int init_flag = 0;
 
if (init_flag==0) {
InstSize[OPCODE_ACCUM] = 3;
InstSize[OPCODE_ALPHA_FUNC] = 3;
InstSize[OPCODE_BIND_TEXTURE] = 3;
InstSize[OPCODE_BITMAP] = 8;
InstSize[OPCODE_BLEND_COLOR] = 5;
InstSize[OPCODE_BLEND_EQUATION] = 2;
InstSize[OPCODE_BLEND_FUNC] = 3;
InstSize[OPCODE_BLEND_FUNC_SEPARATE] = 5;
InstSize[OPCODE_CALL_LIST] = 2;
InstSize[OPCODE_CALL_LIST_OFFSET] = 3;
InstSize[OPCODE_CLEAR] = 2;
InstSize[OPCODE_CLEAR_ACCUM] = 5;
InstSize[OPCODE_CLEAR_COLOR] = 5;
InstSize[OPCODE_CLEAR_DEPTH] = 2;
InstSize[OPCODE_CLEAR_INDEX] = 2;
InstSize[OPCODE_CLEAR_STENCIL] = 2;
InstSize[OPCODE_CLIP_PLANE] = 6;
InstSize[OPCODE_COLOR_MASK] = 5;
InstSize[OPCODE_COLOR_MATERIAL] = 3;
InstSize[OPCODE_COLOR_TABLE] = 7;
InstSize[OPCODE_COLOR_TABLE_PARAMETER_FV] = 7;
InstSize[OPCODE_COLOR_TABLE_PARAMETER_IV] = 7;
InstSize[OPCODE_COLOR_SUB_TABLE] = 7;
InstSize[OPCODE_CONVOLUTION_FILTER_1D] = 7;
InstSize[OPCODE_CONVOLUTION_FILTER_2D] = 8;
InstSize[OPCODE_CONVOLUTION_PARAMETER_I] = 4;
InstSize[OPCODE_CONVOLUTION_PARAMETER_IV] = 7;
InstSize[OPCODE_CONVOLUTION_PARAMETER_F] = 4;
InstSize[OPCODE_CONVOLUTION_PARAMETER_FV] = 7;
InstSize[OPCODE_COPY_PIXELS] = 6;
InstSize[OPCODE_COPY_COLOR_SUB_TABLE] = 6;
InstSize[OPCODE_COPY_COLOR_TABLE] = 6;
InstSize[OPCODE_COPY_TEX_IMAGE1D] = 8;
InstSize[OPCODE_COPY_TEX_IMAGE2D] = 9;
InstSize[OPCODE_COPY_TEX_SUB_IMAGE1D] = 7;
InstSize[OPCODE_COPY_TEX_SUB_IMAGE2D] = 9;
InstSize[OPCODE_COPY_TEX_SUB_IMAGE3D] = 10;
InstSize[OPCODE_CULL_FACE] = 2;
InstSize[OPCODE_DEPTH_FUNC] = 2;
InstSize[OPCODE_DEPTH_MASK] = 2;
InstSize[OPCODE_DEPTH_RANGE] = 3;
InstSize[OPCODE_DISABLE] = 2;
InstSize[OPCODE_DRAW_BUFFER] = 2;
InstSize[OPCODE_DRAW_PIXELS] = 6;
InstSize[OPCODE_ENABLE] = 2;
InstSize[OPCODE_EVALMESH1] = 4;
InstSize[OPCODE_EVALMESH2] = 6;
InstSize[OPCODE_FOG] = 6;
InstSize[OPCODE_FRONT_FACE] = 2;
InstSize[OPCODE_FRUSTUM] = 7;
InstSize[OPCODE_HINT] = 3;
InstSize[OPCODE_HISTOGRAM] = 5;
InstSize[OPCODE_INDEX_MASK] = 2;
InstSize[OPCODE_INIT_NAMES] = 1;
InstSize[OPCODE_LIGHT] = 7;
InstSize[OPCODE_LIGHT_MODEL] = 6;
InstSize[OPCODE_LINE_STIPPLE] = 3;
InstSize[OPCODE_LINE_WIDTH] = 2;
InstSize[OPCODE_LIST_BASE] = 2;
InstSize[OPCODE_LOAD_IDENTITY] = 1;
InstSize[OPCODE_LOAD_MATRIX] = 17;
InstSize[OPCODE_LOAD_NAME] = 2;
InstSize[OPCODE_LOGIC_OP] = 2;
InstSize[OPCODE_MAP1] = 7;
InstSize[OPCODE_MAP2] = 11;
InstSize[OPCODE_MAPGRID1] = 4;
InstSize[OPCODE_MAPGRID2] = 7;
InstSize[OPCODE_MATRIX_MODE] = 2;
InstSize[OPCODE_MIN_MAX] = 4;
InstSize[OPCODE_MULT_MATRIX] = 17;
InstSize[OPCODE_ORTHO] = 7;
InstSize[OPCODE_PASSTHROUGH] = 2;
InstSize[OPCODE_PIXEL_MAP] = 4;
InstSize[OPCODE_PIXEL_TRANSFER] = 3;
InstSize[OPCODE_PIXEL_ZOOM] = 3;
InstSize[OPCODE_POINT_SIZE] = 2;
InstSize[OPCODE_POINT_PARAMETERS] = 5;
InstSize[OPCODE_POLYGON_MODE] = 3;
InstSize[OPCODE_POLYGON_STIPPLE] = 2;
InstSize[OPCODE_POLYGON_OFFSET] = 3;
InstSize[OPCODE_POP_ATTRIB] = 1;
InstSize[OPCODE_POP_MATRIX] = 1;
InstSize[OPCODE_POP_NAME] = 1;
InstSize[OPCODE_PRIORITIZE_TEXTURE] = 3;
InstSize[OPCODE_PUSH_ATTRIB] = 2;
InstSize[OPCODE_PUSH_MATRIX] = 1;
InstSize[OPCODE_PUSH_NAME] = 2;
InstSize[OPCODE_RASTER_POS] = 5;
InstSize[OPCODE_READ_BUFFER] = 2;
InstSize[OPCODE_RESET_HISTOGRAM] = 2;
InstSize[OPCODE_RESET_MIN_MAX] = 2;
InstSize[OPCODE_ROTATE] = 5;
InstSize[OPCODE_SCALE] = 4;
InstSize[OPCODE_SCISSOR] = 5;
InstSize[OPCODE_STENCIL_FUNC] = 4;
InstSize[OPCODE_STENCIL_MASK] = 2;
InstSize[OPCODE_STENCIL_OP] = 4;
InstSize[OPCODE_SHADE_MODEL] = 2;
InstSize[OPCODE_TEXENV] = 7;
InstSize[OPCODE_TEXGEN] = 7;
InstSize[OPCODE_TEXPARAMETER] = 7;
InstSize[OPCODE_TEX_IMAGE1D] = 9;
InstSize[OPCODE_TEX_IMAGE2D] = 10;
InstSize[OPCODE_TEX_IMAGE3D] = 11;
InstSize[OPCODE_TEX_SUB_IMAGE1D] = 8;
InstSize[OPCODE_TEX_SUB_IMAGE2D] = 10;
InstSize[OPCODE_TEX_SUB_IMAGE3D] = 12;
InstSize[OPCODE_TRANSLATE] = 4;
InstSize[OPCODE_VIEWPORT] = 5;
InstSize[OPCODE_WINDOW_POS] = 5;
InstSize[OPCODE_CONTINUE] = 2;
InstSize[OPCODE_ERROR] = 3;
InstSize[OPCODE_END_OF_LIST] = 1;
/* GL_SGIX/SGIS_pixel_texture */
InstSize[OPCODE_PIXEL_TEXGEN_SGIX] = 2;
InstSize[OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS] = 3;
/* GL_ARB_texture_compression */
InstSize[OPCODE_COMPRESSED_TEX_IMAGE_1D] = 8;
InstSize[OPCODE_COMPRESSED_TEX_IMAGE_2D] = 9;
InstSize[OPCODE_COMPRESSED_TEX_IMAGE_3D] = 10;
InstSize[OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D] = 8;
InstSize[OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D] = 10;
InstSize[OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D] = 12;
/* GL_ARB_multisample */
InstSize[OPCODE_SAMPLE_COVERAGE] = 3;
/* GL_ARB_multitexture */
InstSize[OPCODE_ACTIVE_TEXTURE] = 2;
/* GL_ARB_window_pos */
InstSize[OPCODE_WINDOW_POS_ARB] = 4;
/* GL_NV_vertex_program */
InstSize[OPCODE_BIND_PROGRAM_NV] = 3;
InstSize[OPCODE_EXECUTE_PROGRAM_NV] = 7;
InstSize[OPCODE_REQUEST_PROGRAMS_RESIDENT_NV] = 2;
InstSize[OPCODE_LOAD_PROGRAM_NV] = 4;
InstSize[OPCODE_PROGRAM_PARAMETER4F_NV] = 7;
InstSize[OPCODE_TRACK_MATRIX_NV] = 5;
/* GL_EXT_stencil_two_side */
InstSize[OPCODE_ACTIVE_STENCIL_FACE_EXT] = 2;
}
init_flag = 1;
}
 
 
/*
* Allocate space for a display list instruction.
* Input: opcode - type of instruction
* argcount - size in bytes of data required.
* Return: pointer to the usable data area (not including the internal
* opcode).
*/
void *
_mesa_alloc_instruction( GLcontext *ctx, int opcode, GLint sz )
{
Node *n, *newblock;
GLuint count = 1 + (sz + sizeof(Node) - 1) / sizeof(Node);
 
#ifdef DEBUG
if (opcode < (int) OPCODE_DRV_0) {
assert( count == InstSize[opcode] );
}
#endif
 
if (ctx->CurrentPos + count + 2 > BLOCK_SIZE) {
/* This block is full. Allocate a new block and chain to it */
n = ctx->CurrentBlock + ctx->CurrentPos;
n[0].opcode = OPCODE_CONTINUE;
newblock = (Node *) MALLOC( sizeof(Node) * BLOCK_SIZE );
if (!newblock) {
_mesa_error( ctx, GL_OUT_OF_MEMORY, "Building display list" );
return NULL;
}
n[1].next = (Node *) newblock;
ctx->CurrentBlock = newblock;
ctx->CurrentPos = 0;
}
 
n = ctx->CurrentBlock + ctx->CurrentPos;
ctx->CurrentPos += count;
 
n[0].opcode = (OpCode) opcode;
 
return (void *)&n[1];
}
 
 
/* Allow modules and drivers to get their own opcodes.
*/
int
_mesa_alloc_opcode( GLcontext *ctx,
GLuint sz,
void (*execute)( GLcontext *, void * ),
void (*destroy)( GLcontext *, void * ),
void (*print)( GLcontext *, void * ) )
{
if (ctx->listext.nr_opcodes < GL_MAX_EXT_OPCODES) {
GLuint i = ctx->listext.nr_opcodes++;
ctx->listext.opcode[i].size = 1 + (sz + sizeof(Node) - 1)/sizeof(Node);
ctx->listext.opcode[i].execute = execute;
ctx->listext.opcode[i].destroy = destroy;
ctx->listext.opcode[i].print = print;
return i + OPCODE_DRV_0;
}
return -1;
}
 
 
 
/* Mimic the old behaviour of alloc_instruction:
* - sz is in units of sizeof(Node)
* - return value a pointer to sizeof(Node) before the actual
* usable data area.
*/
#define ALLOC_INSTRUCTION(ctx, opcode, sz) \
((Node *)_mesa_alloc_instruction(ctx, opcode, sz*sizeof(Node)) - 1)
 
 
 
/*
* Display List compilation functions
*/
static void save_Accum( GLenum op, GLfloat value )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ACCUM, 2 );
if (n) {
n[1].e = op;
n[2].f = value;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Accum)( op, value );
}
}
 
 
static void save_AlphaFunc( GLenum func, GLclampf ref )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ALPHA_FUNC, 2 );
if (n) {
n[1].e = func;
n[2].f = (GLfloat) ref;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->AlphaFunc)( func, ref );
}
}
 
 
static void save_BindTexture( GLenum target, GLuint texture )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BIND_TEXTURE, 2 );
if (n) {
n[1].e = target;
n[2].ui = texture;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BindTexture)( target, texture );
}
}
 
 
static void save_Bitmap( GLsizei width, GLsizei height,
GLfloat xorig, GLfloat yorig,
GLfloat xmove, GLfloat ymove,
const GLubyte *pixels )
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = _mesa_unpack_bitmap( width, height, pixels, &ctx->Unpack );
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BITMAP, 7 );
if (n) {
n[1].i = (GLint) width;
n[2].i = (GLint) height;
n[3].f = xorig;
n[4].f = yorig;
n[5].f = xmove;
n[6].f = ymove;
n[7].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Bitmap)( width, height,
xorig, yorig, xmove, ymove, pixels );
}
}
 
 
static void save_BlendEquation( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BLEND_EQUATION, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BlendEquation)( mode );
}
}
 
 
static void save_BlendFunc( GLenum sfactor, GLenum dfactor )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BLEND_FUNC, 2 );
if (n) {
n[1].e = sfactor;
n[2].e = dfactor;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BlendFunc)( sfactor, dfactor );
}
}
 
 
static void save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorA, GLenum dfactorA)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BLEND_FUNC_SEPARATE, 4 );
if (n) {
n[1].e = sfactorRGB;
n[2].e = dfactorRGB;
n[3].e = sfactorA;
n[4].e = dfactorA;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BlendFuncSeparateEXT)( sfactorRGB, dfactorRGB,
sfactorA, dfactorA);
}
}
 
 
static void save_BlendColor( GLfloat red, GLfloat green,
GLfloat blue, GLfloat alpha )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BLEND_COLOR, 4 );
if (n) {
n[1].f = red;
n[2].f = green;
n[3].f = blue;
n[4].f = alpha;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BlendColor)( red, green, blue, alpha );
}
}
 
 
void _mesa_save_CallList( GLuint list )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
 
n = ALLOC_INSTRUCTION( ctx, OPCODE_CALL_LIST, 1 );
if (n) {
n[1].ui = list;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CallList)( list );
}
}
 
 
void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
GLboolean typeErrorFlag;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
 
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_2_BYTES:
case GL_3_BYTES:
case GL_4_BYTES:
typeErrorFlag = GL_FALSE;
break;
default:
typeErrorFlag = GL_TRUE;
}
 
for (i=0;i<n;i++) {
GLuint list = translate_id( i, type, lists );
Node *n = ALLOC_INSTRUCTION( ctx, OPCODE_CALL_LIST_OFFSET, 2 );
if (n) {
n[1].ui = list;
n[2].b = typeErrorFlag;
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CallLists)( n, type, lists );
}
}
 
 
static void save_Clear( GLbitfield mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR, 1 );
if (n) {
n[1].bf = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Clear)( mask );
}
}
 
 
static void save_ClearAccum( GLfloat red, GLfloat green,
GLfloat blue, GLfloat alpha )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR_ACCUM, 4 );
if (n) {
n[1].f = red;
n[2].f = green;
n[3].f = blue;
n[4].f = alpha;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClearAccum)( red, green, blue, alpha );
}
}
 
 
static void save_ClearColor( GLclampf red, GLclampf green,
GLclampf blue, GLclampf alpha )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR_COLOR, 4 );
if (n) {
n[1].f = red;
n[2].f = green;
n[3].f = blue;
n[4].f = alpha;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClearColor)( red, green, blue, alpha );
}
}
 
 
static void save_ClearDepth( GLclampd depth )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR_DEPTH, 1 );
if (n) {
n[1].f = (GLfloat) depth;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClearDepth)( depth );
}
}
 
 
static void save_ClearIndex( GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR_INDEX, 1 );
if (n) {
n[1].f = c;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClearIndex)( c );
}
}
 
 
static void save_ClearStencil( GLint s )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLEAR_STENCIL, 1 );
if (n) {
n[1].i = s;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClearStencil)( s );
}
}
 
 
static void save_ClipPlane( GLenum plane, const GLdouble *equ )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CLIP_PLANE, 5 );
if (n) {
n[1].e = plane;
n[2].f = (GLfloat) equ[0];
n[3].f = (GLfloat) equ[1];
n[4].f = (GLfloat) equ[2];
n[5].f = (GLfloat) equ[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ClipPlane)( plane, equ );
}
}
 
 
 
static void save_ColorMask( GLboolean red, GLboolean green,
GLboolean blue, GLboolean alpha )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_MASK, 4 );
if (n) {
n[1].b = red;
n[2].b = green;
n[3].b = blue;
n[4].b = alpha;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorMask)( red, green, blue, alpha );
}
}
 
 
static void save_ColorMaterial( GLenum face, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
 
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_MATERIAL, 2 );
if (n) {
n[1].e = face;
n[2].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorMaterial)( face, mode );
}
}
 
 
static void save_ColorTable( GLenum target, GLenum internalFormat,
GLsizei width, GLenum format, GLenum type,
const GLvoid *table )
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_1D ||
target == GL_PROXY_TEXTURE_2D ||
target == GL_PROXY_TEXTURE_3D ||
target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
/* execute immediately */
(*ctx->Exec->ColorTable)( target, internalFormat, width,
format, type, table );
}
else {
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type, table,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_TABLE, 6 );
if (n) {
n[1].e = target;
n[2].e = internalFormat;
n[3].i = width;
n[4].e = format;
n[5].e = type;
n[6].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorTable)( target, internalFormat, width,
format, type, table );
}
}
}
 
 
 
static void
save_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_TABLE_PARAMETER_FV, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].f = params[0];
if (pname == GL_COLOR_TABLE_SGI ||
pname == GL_POST_CONVOLUTION_COLOR_TABLE_SGI ||
pname == GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI) {
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
}
 
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorTableParameterfv)( target, pname, params );
}
}
 
 
static void
save_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_TABLE_PARAMETER_IV, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].i = params[0];
if (pname == GL_COLOR_TABLE_SGI ||
pname == GL_POST_CONVOLUTION_COLOR_TABLE_SGI ||
pname == GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI) {
n[4].i = params[1];
n[5].i = params[2];
n[6].i = params[3];
}
}
 
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorTableParameteriv)( target, pname, params );
}
}
 
 
 
static void save_ColorSubTable( GLenum target, GLsizei start, GLsizei count,
GLenum format, GLenum type,
const GLvoid *table)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = _mesa_unpack_image(count, 1, 1, format, type, table,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_SUB_TABLE, 6 );
if (n) {
n[1].e = target;
n[2].i = start;
n[3].i = count;
n[4].e = format;
n[5].e = type;
n[6].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ColorSubTable)(target, start, count, format, type, table);
}
}
 
 
static void
save_CopyColorSubTable(GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_COLOR_SUB_TABLE, 5 );
if (n) {
n[1].e = target;
n[2].i = start;
n[3].i = x;
n[4].i = y;
n[5].i = width;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyColorSubTable)(target, start, x, y, width);
}
}
 
 
static void
save_CopyColorTable(GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_COLOR_TABLE, 5 );
if (n) {
n[1].e = target;
n[2].e = internalformat;
n[3].i = x;
n[4].i = y;
n[5].i = width;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyColorTable)(target, internalformat, x, y, width);
}
}
 
 
static void
save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width,
GLenum format, GLenum type, const GLvoid *filter)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type, filter,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_FILTER_1D, 6 );
if (n) {
n[1].e = target;
n[2].e = internalFormat;
n[3].i = width;
n[4].e = format;
n[5].e = type;
n[6].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionFilter1D)( target, internalFormat, width,
format, type, filter );
}
}
 
 
static void
save_ConvolutionFilter2D(GLenum target, GLenum internalFormat,
GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *filter)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type, filter,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_FILTER_2D, 7 );
if (n) {
n[1].e = target;
n[2].e = internalFormat;
n[3].i = width;
n[4].i = height;
n[5].e = format;
n[6].e = type;
n[7].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionFilter2D)( target, internalFormat, width, height,
format, type, filter );
}
}
 
 
static void
save_ConvolutionParameteri(GLenum target, GLenum pname, GLint param)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_PARAMETER_I, 3 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].i = param;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionParameteri)( target, pname, param );
}
}
 
 
static void
save_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_PARAMETER_IV, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].i = params[0];
if (pname == GL_CONVOLUTION_BORDER_COLOR ||
pname == GL_CONVOLUTION_FILTER_SCALE ||
pname == GL_CONVOLUTION_FILTER_BIAS) {
n[4].i = params[1];
n[5].i = params[2];
n[6].i = params[3];
}
else {
n[4].i = n[5].i = n[6].i = 0;
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionParameteriv)( target, pname, params );
}
}
 
 
static void
save_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_PARAMETER_F, 3 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].f = param;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionParameterf)( target, pname, param );
}
}
 
 
static void
save_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_PARAMETER_FV, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].f = params[0];
if (pname == GL_CONVOLUTION_BORDER_COLOR ||
pname == GL_CONVOLUTION_FILTER_SCALE ||
pname == GL_CONVOLUTION_FILTER_BIAS) {
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
else {
n[4].f = n[5].f = n[6].f = 0.0F;
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ConvolutionParameterfv)( target, pname, params );
}
}
 
 
static void
save_CopyPixels( GLint x, GLint y,
GLsizei width, GLsizei height, GLenum type )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_PIXELS, 5 );
if (n) {
n[1].i = x;
n[2].i = y;
n[3].i = (GLint) width;
n[4].i = (GLint) height;
n[5].e = type;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyPixels)( x, y, width, height, type );
}
}
 
 
 
static void
save_CopyTexImage1D( GLenum target, GLint level, GLenum internalformat,
GLint x, GLint y, GLsizei width, GLint border )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_TEX_IMAGE1D, 7 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].e = internalformat;
n[4].i = x;
n[5].i = y;
n[6].i = width;
n[7].i = border;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyTexImage1D)( target, level, internalformat,
x, y, width, border );
}
}
 
 
static void
save_CopyTexImage2D( GLenum target, GLint level,
GLenum internalformat,
GLint x, GLint y, GLsizei width,
GLsizei height, GLint border )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_TEX_IMAGE2D, 8 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].e = internalformat;
n[4].i = x;
n[5].i = y;
n[6].i = width;
n[7].i = height;
n[8].i = border;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyTexImage2D)( target, level, internalformat,
x, y, width, height, border );
}
}
 
 
 
static void
save_CopyTexSubImage1D( GLenum target, GLint level,
GLint xoffset, GLint x, GLint y,
GLsizei width )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_TEX_SUB_IMAGE1D, 6 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = x;
n[5].i = y;
n[6].i = width;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyTexSubImage1D)( target, level, xoffset, x, y, width );
}
}
 
 
static void
save_CopyTexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint x, GLint y,
GLsizei width, GLint height )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_TEX_SUB_IMAGE2D, 8 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = x;
n[6].i = y;
n[7].i = width;
n[8].i = height;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyTexSubImage2D)( target, level, xoffset, yoffset,
x, y, width, height );
}
}
 
 
static void
save_CopyTexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y,
GLsizei width, GLint height )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COPY_TEX_SUB_IMAGE3D, 9 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = zoffset;
n[6].i = x;
n[7].i = y;
n[8].i = width;
n[9].i = height;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CopyTexSubImage3D)( target, level,
xoffset, yoffset, zoffset,
x, y, width, height );
}
}
 
 
static void save_CullFace( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CULL_FACE, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CullFace)( mode );
}
}
 
 
static void save_DepthFunc( GLenum func )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DEPTH_FUNC, 1 );
if (n) {
n[1].e = func;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->DepthFunc)( func );
}
}
 
 
static void save_DepthMask( GLboolean mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DEPTH_MASK, 1 );
if (n) {
n[1].b = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->DepthMask)( mask );
}
}
 
 
static void save_DepthRange( GLclampd nearval, GLclampd farval )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DEPTH_RANGE, 2 );
if (n) {
n[1].f = (GLfloat) nearval;
n[2].f = (GLfloat) farval;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->DepthRange)( nearval, farval );
}
}
 
 
static void save_Disable( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DISABLE, 1 );
if (n) {
n[1].e = cap;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Disable)( cap );
}
}
 
 
static void save_DrawBuffer( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DRAW_BUFFER, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->DrawBuffer)( mode );
}
}
 
 
static void save_DrawPixels( GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DRAW_PIXELS, 5 );
if (n) {
n[1].i = width;
n[2].i = height;
n[3].e = format;
n[4].e = type;
n[5].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->DrawPixels)( width, height, format, type, pixels );
}
}
 
 
 
static void save_Enable( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ENABLE, 1 );
if (n) {
n[1].e = cap;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Enable)( cap );
}
}
 
 
 
void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_EVALMESH1, 3 );
if (n) {
n[1].e = mode;
n[2].i = i1;
n[3].i = i2;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->EvalMesh1)( mode, i1, i2 );
}
}
 
 
void _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_EVALMESH2, 5 );
if (n) {
n[1].e = mode;
n[2].i = i1;
n[3].i = i2;
n[4].i = j1;
n[5].i = j2;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->EvalMesh2)( mode, i1, i2, j1, j2 );
}
}
 
 
 
 
static void save_Fogfv( GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_FOG, 5 );
if (n) {
n[1].e = pname;
n[2].f = params[0];
n[3].f = params[1];
n[4].f = params[2];
n[5].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Fogfv)( pname, params );
}
}
 
 
static void save_Fogf( GLenum pname, GLfloat param )
{
save_Fogfv(pname, &param);
}
 
 
static void save_Fogiv(GLenum pname, const GLint *params )
{
GLfloat p[4];
switch (pname) {
case GL_FOG_MODE:
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
case GL_FOG_INDEX:
p[0] = (GLfloat) *params;
break;
case GL_FOG_COLOR:
p[0] = INT_TO_FLOAT( params[0] );
p[1] = INT_TO_FLOAT( params[1] );
p[2] = INT_TO_FLOAT( params[2] );
p[3] = INT_TO_FLOAT( params[3] );
break;
default:
/* Error will be caught later in gl_Fogfv */
;
}
save_Fogfv(pname, p);
}
 
 
static void save_Fogi(GLenum pname, GLint param )
{
save_Fogiv(pname, &param);
}
 
 
static void save_FrontFace( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_FRONT_FACE, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->FrontFace)( mode );
}
}
 
 
static void save_Frustum( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_FRUSTUM, 6 );
if (n) {
n[1].f = (GLfloat) left;
n[2].f = (GLfloat) right;
n[3].f = (GLfloat) bottom;
n[4].f = (GLfloat) top;
n[5].f = (GLfloat) nearval;
n[6].f = (GLfloat) farval;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Frustum)( left, right, bottom, top, nearval, farval );
}
}
 
 
static void save_Hint( GLenum target, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_HINT, 2 );
if (n) {
n[1].e = target;
n[2].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Hint)( target, mode );
}
}
 
 
static void
save_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_HISTOGRAM, 4 );
if (n) {
n[1].e = target;
n[2].i = width;
n[3].e = internalFormat;
n[4].b = sink;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Histogram)( target, width, internalFormat, sink );
}
}
 
 
static void save_IndexMask( GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_INDEX_MASK, 1 );
if (n) {
n[1].ui = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->IndexMask)( mask );
}
}
 
 
static void save_InitNames( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_INIT_NAMES, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->InitNames)();
}
}
 
 
static void save_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LIGHT, 6 );
if (OPCODE_LIGHT) {
GLint i, nParams;
n[1].e = light;
n[2].e = pname;
switch (pname) {
case GL_AMBIENT:
nParams = 4;
break;
case GL_DIFFUSE:
nParams = 4;
break;
case GL_SPECULAR:
nParams = 4;
break;
case GL_POSITION:
nParams = 4;
break;
case GL_SPOT_DIRECTION:
nParams = 3;
break;
case GL_SPOT_EXPONENT:
nParams = 1;
break;
case GL_SPOT_CUTOFF:
nParams = 1;
break;
case GL_CONSTANT_ATTENUATION:
nParams = 1;
break;
case GL_LINEAR_ATTENUATION:
nParams = 1;
break;
case GL_QUADRATIC_ATTENUATION:
nParams = 1;
break;
default:
nParams = 0;
}
for (i = 0; i < nParams; i++) {
n[3+i].f = params[i];
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Lightfv)( light, pname, params );
}
}
 
 
static void save_Lightf( GLenum light, GLenum pname, GLfloat params )
{
save_Lightfv(light, pname, &params);
}
 
 
static void save_Lightiv( GLenum light, GLenum pname, const GLint *params )
{
GLfloat fparam[4];
switch (pname) {
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_SPECULAR:
fparam[0] = INT_TO_FLOAT( params[0] );
fparam[1] = INT_TO_FLOAT( params[1] );
fparam[2] = INT_TO_FLOAT( params[2] );
fparam[3] = INT_TO_FLOAT( params[3] );
break;
case GL_POSITION:
fparam[0] = (GLfloat) params[0];
fparam[1] = (GLfloat) params[1];
fparam[2] = (GLfloat) params[2];
fparam[3] = (GLfloat) params[3];
break;
case GL_SPOT_DIRECTION:
fparam[0] = (GLfloat) params[0];
fparam[1] = (GLfloat) params[1];
fparam[2] = (GLfloat) params[2];
break;
case GL_SPOT_EXPONENT:
case GL_SPOT_CUTOFF:
case GL_CONSTANT_ATTENUATION:
case GL_LINEAR_ATTENUATION:
case GL_QUADRATIC_ATTENUATION:
fparam[0] = (GLfloat) params[0];
break;
default:
/* error will be caught later in gl_Lightfv */
;
}
save_Lightfv( light, pname, fparam );
}
 
 
static void save_Lighti( GLenum light, GLenum pname, GLint param )
{
save_Lightiv( light, pname, &param );
}
 
 
static void save_LightModelfv( GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LIGHT_MODEL, 5 );
if (n) {
n[1].e = pname;
n[2].f = params[0];
n[3].f = params[1];
n[4].f = params[2];
n[5].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LightModelfv)( pname, params );
}
}
 
 
static void save_LightModelf( GLenum pname, GLfloat param )
{
save_LightModelfv(pname, &param);
}
 
 
static void save_LightModeliv( GLenum pname, const GLint *params )
{
GLfloat fparam[4];
switch (pname) {
case GL_LIGHT_MODEL_AMBIENT:
fparam[0] = INT_TO_FLOAT( params[0] );
fparam[1] = INT_TO_FLOAT( params[1] );
fparam[2] = INT_TO_FLOAT( params[2] );
fparam[3] = INT_TO_FLOAT( params[3] );
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
case GL_LIGHT_MODEL_TWO_SIDE:
case GL_LIGHT_MODEL_COLOR_CONTROL:
fparam[0] = (GLfloat) params[0];
break;
default:
/* Error will be caught later in gl_LightModelfv */
;
}
save_LightModelfv(pname, fparam);
}
 
 
static void save_LightModeli( GLenum pname, GLint param )
{
save_LightModeliv(pname, &param);
}
 
 
static void save_LineStipple( GLint factor, GLushort pattern )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LINE_STIPPLE, 2 );
if (n) {
n[1].i = factor;
n[2].us = pattern;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LineStipple)( factor, pattern );
}
}
 
 
static void save_LineWidth( GLfloat width )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LINE_WIDTH, 1 );
if (n) {
n[1].f = width;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LineWidth)( width );
}
}
 
 
static void save_ListBase( GLuint base )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LIST_BASE, 1 );
if (n) {
n[1].ui = base;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ListBase)( base );
}
}
 
 
static void save_LoadIdentity( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_LOAD_IDENTITY, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->LoadIdentity)();
}
}
 
 
static void save_LoadMatrixf( const GLfloat *m )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LOAD_MATRIX, 16 );
if (n) {
GLuint i;
for (i=0;i<16;i++) {
n[1+i].f = m[i];
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LoadMatrixf)( m );
}
}
 
 
static void save_LoadMatrixd( const GLdouble *m )
{
GLfloat f[16];
GLint i;
for (i = 0; i < 16; i++) {
f[i] = (GLfloat) m[i];
}
save_LoadMatrixf(f);
}
 
 
static void save_LoadName( GLuint name )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LOAD_NAME, 1 );
if (n) {
n[1].ui = name;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LoadName)( name );
}
}
 
 
static void save_LogicOp( GLenum opcode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_LOGIC_OP, 1 );
if (n) {
n[1].e = opcode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->LogicOp)( opcode );
}
}
 
 
static void save_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
GLint order, const GLdouble *points)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAP1, 6 );
if (n) {
GLfloat *pnts = _mesa_copy_map_points1d( target, stride, order, points );
n[1].e = target;
n[2].f = (GLfloat) u1;
n[3].f = (GLfloat) u2;
n[4].i = _mesa_evaluator_components(target); /* stride */
n[5].i = order;
n[6].data = (void *) pnts;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Map1d)( target, u1, u2, stride, order, points );
}
}
 
static void save_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
GLint order, const GLfloat *points)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAP1, 6 );
if (n) {
GLfloat *pnts = _mesa_copy_map_points1f( target, stride, order, points );
n[1].e = target;
n[2].f = u1;
n[3].f = u2;
n[4].i = _mesa_evaluator_components(target); /* stride */
n[5].i = order;
n[6].data = (void *) pnts;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Map1f)( target, u1, u2, stride, order, points );
}
}
 
 
static void save_Map2d( GLenum target,
GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
const GLdouble *points )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAP2, 10 );
if (n) {
GLfloat *pnts = _mesa_copy_map_points2d( target, ustride, uorder,
vstride, vorder, points );
n[1].e = target;
n[2].f = (GLfloat) u1;
n[3].f = (GLfloat) u2;
n[4].f = (GLfloat) v1;
n[5].f = (GLfloat) v2;
/* XXX verify these strides are correct */
n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride*/
n[7].i = _mesa_evaluator_components(target); /*vstride*/
n[8].i = uorder;
n[9].i = vorder;
n[10].data = (void *) pnts;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Map2d)( target,
u1, u2, ustride, uorder,
v1, v2, vstride, vorder, points );
}
}
 
 
static void save_Map2f( GLenum target,
GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
const GLfloat *points )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAP2, 10 );
if (n) {
GLfloat *pnts = _mesa_copy_map_points2f( target, ustride, uorder,
vstride, vorder, points );
n[1].e = target;
n[2].f = u1;
n[3].f = u2;
n[4].f = v1;
n[5].f = v2;
/* XXX verify these strides are correct */
n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride*/
n[7].i = _mesa_evaluator_components(target); /*vstride*/
n[8].i = uorder;
n[9].i = vorder;
n[10].data = (void *) pnts;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Map2f)( target, u1, u2, ustride, uorder,
v1, v2, vstride, vorder, points );
}
}
 
 
static void save_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAPGRID1, 3 );
if (n) {
n[1].i = un;
n[2].f = u1;
n[3].f = u2;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->MapGrid1f)( un, u1, u2 );
}
}
 
 
static void save_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
{
save_MapGrid1f(un, (GLfloat) u1, (GLfloat) u2);
}
 
 
static void save_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
GLint vn, GLfloat v1, GLfloat v2 )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MAPGRID2, 6 );
if (n) {
n[1].i = un;
n[2].f = u1;
n[3].f = u2;
n[4].i = vn;
n[5].f = v1;
n[6].f = v2;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->MapGrid2f)( un, u1, u2, vn, v1, v2 );
}
}
 
 
 
static void save_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
GLint vn, GLdouble v1, GLdouble v2 )
{
save_MapGrid2f(un, (GLfloat) u1, (GLfloat) u2,
vn, (GLfloat) v1, (GLfloat) v2);
}
 
 
static void save_MatrixMode( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MATRIX_MODE, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->MatrixMode)( mode );
}
}
 
 
static void
save_Minmax(GLenum target, GLenum internalFormat, GLboolean sink)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
 
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MIN_MAX, 3 );
if (n) {
n[1].e = target;
n[2].e = internalFormat;
n[3].b = sink;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Minmax)( target, internalFormat, sink );
}
}
 
 
static void save_MultMatrixf( const GLfloat *m )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_MULT_MATRIX, 16 );
if (n) {
GLuint i;
for (i=0;i<16;i++) {
n[1+i].f = m[i];
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->MultMatrixf)( m );
}
}
 
 
static void save_MultMatrixd( const GLdouble *m )
{
GLfloat f[16];
GLint i;
for (i = 0; i < 16; i++) {
f[i] = (GLfloat) m[i];
}
save_MultMatrixf(f);
}
 
 
static void save_NewList( GLuint list, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
/* It's an error to call this function while building a display list */
_mesa_error( ctx, GL_INVALID_OPERATION, "glNewList" );
(void) list;
(void) mode;
}
 
 
 
static void save_Ortho( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ORTHO, 6 );
if (n) {
n[1].f = (GLfloat) left;
n[2].f = (GLfloat) right;
n[3].f = (GLfloat) bottom;
n[4].f = (GLfloat) top;
n[5].f = (GLfloat) nearval;
n[6].f = (GLfloat) farval;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Ortho)( left, right, bottom, top, nearval, farval );
}
}
 
 
static void
save_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PIXEL_MAP, 3 );
if (n) {
n[1].e = map;
n[2].i = mapsize;
n[3].data = (void *) MALLOC( mapsize * sizeof(GLfloat) );
MEMCPY( n[3].data, (void *) values, mapsize * sizeof(GLfloat) );
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PixelMapfv)( map, mapsize, values );
}
}
 
 
static void
save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
{
GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
GLint i;
if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
for (i=0;i<mapsize;i++) {
fvalues[i] = (GLfloat) values[i];
}
}
else {
for (i=0;i<mapsize;i++) {
fvalues[i] = UINT_TO_FLOAT( values[i] );
}
}
save_PixelMapfv(map, mapsize, fvalues);
}
 
 
static void
save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
{
GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
GLint i;
if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
for (i=0;i<mapsize;i++) {
fvalues[i] = (GLfloat) values[i];
}
}
else {
for (i=0;i<mapsize;i++) {
fvalues[i] = USHORT_TO_FLOAT( values[i] );
}
}
save_PixelMapfv(map, mapsize, fvalues);
}
 
 
static void
save_PixelTransferf( GLenum pname, GLfloat param )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PIXEL_TRANSFER, 2 );
if (n) {
n[1].e = pname;
n[2].f = param;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PixelTransferf)( pname, param );
}
}
 
 
static void
save_PixelTransferi( GLenum pname, GLint param )
{
save_PixelTransferf( pname, (GLfloat) param );
}
 
 
static void
save_PixelZoom( GLfloat xfactor, GLfloat yfactor )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PIXEL_ZOOM, 2 );
if (n) {
n[1].f = xfactor;
n[2].f = yfactor;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PixelZoom)( xfactor, yfactor );
}
}
 
 
static void
save_PointParameterfvEXT( GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_POINT_PARAMETERS, 4 );
if (n) {
n[1].e = pname;
n[2].f = params[0];
n[3].f = params[1];
n[4].f = params[2];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PointParameterfvEXT)( pname, params );
}
}
 
 
static void save_PointParameterfEXT( GLenum pname, GLfloat param )
{
save_PointParameterfvEXT(pname, &param);
}
 
static void save_PointParameteriNV( GLenum pname, GLint param )
{
GLfloat p = (GLfloat) param;
save_PointParameterfvEXT(pname, &p);
}
 
static void save_PointParameterivNV( GLenum pname, const GLint *param )
{
GLfloat p = (GLfloat) param[0];
save_PointParameterfvEXT(pname, &p);
}
 
 
static void save_PointSize( GLfloat size )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_POINT_SIZE, 1 );
if (n) {
n[1].f = size;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PointSize)( size );
}
}
 
 
static void save_PolygonMode( GLenum face, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_POLYGON_MODE, 2 );
if (n) {
n[1].e = face;
n[2].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PolygonMode)( face, mode );
}
}
 
 
/*
* Polygon stipple must have been upacked already!
*/
static void save_PolygonStipple( const GLubyte *pattern )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_POLYGON_STIPPLE, 1 );
if (n) {
void *data;
n[1].data = MALLOC( 32 * 4 );
data = n[1].data; /* This needed for Acorn compiler */
MEMCPY( data, pattern, 32 * 4 );
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PolygonStipple)( (GLubyte*) pattern );
}
}
 
 
static void save_PolygonOffset( GLfloat factor, GLfloat units )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_POLYGON_OFFSET, 2 );
if (n) {
n[1].f = factor;
n[2].f = units;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PolygonOffset)( factor, units );
}
}
 
 
static void save_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
{
GET_CURRENT_CONTEXT(ctx);
save_PolygonOffset(factor, ctx->DepthMaxF * bias);
}
 
 
static void save_PopAttrib( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_POP_ATTRIB, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->PopAttrib)();
}
}
 
 
static void save_PopMatrix( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_POP_MATRIX, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->PopMatrix)();
}
}
 
 
static void save_PopName( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_POP_NAME, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->PopName)();
}
}
 
 
static void save_PrioritizeTextures( GLsizei num, const GLuint *textures,
const GLclampf *priorities )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
for (i=0;i<num;i++) {
Node *n;
n = ALLOC_INSTRUCTION( ctx, OPCODE_PRIORITIZE_TEXTURE, 2 );
if (n) {
n[1].ui = textures[i];
n[2].f = priorities[i];
}
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PrioritizeTextures)( num, textures, priorities );
}
}
 
 
static void save_PushAttrib( GLbitfield mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PUSH_ATTRIB, 1 );
if (n) {
n[1].bf = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PushAttrib)( mask );
}
}
 
 
static void save_PushMatrix( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
(void) ALLOC_INSTRUCTION( ctx, OPCODE_PUSH_MATRIX, 0 );
if (ctx->ExecuteFlag) {
(*ctx->Exec->PushMatrix)();
}
}
 
 
static void save_PushName( GLuint name )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PUSH_NAME, 1 );
if (n) {
n[1].ui = name;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PushName)( name );
}
}
 
 
static void save_RasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
n = ALLOC_INSTRUCTION( ctx, OPCODE_RASTER_POS, 4 );
if (n) {
n[1].f = x;
n[2].f = y;
n[3].f = z;
n[4].f = w;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->RasterPos4f)( x, y, z, w );
}
}
 
static void save_RasterPos2d(GLdouble x, GLdouble y)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
static void save_RasterPos2f(GLfloat x, GLfloat y)
{
save_RasterPos4f(x, y, 0.0F, 1.0F);
}
 
static void save_RasterPos2i(GLint x, GLint y)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
static void save_RasterPos2s(GLshort x, GLshort y)
{
save_RasterPos4f(x, y, 0.0F, 1.0F);
}
 
static void save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
static void save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
{
save_RasterPos4f(x, y, z, 1.0F);
}
 
static void save_RasterPos3i(GLint x, GLint y, GLint z)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
static void save_RasterPos3s(GLshort x, GLshort y, GLshort z)
{
save_RasterPos4f(x, y, z, 1.0F);
}
 
static void save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void save_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
{
save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
save_RasterPos4f(x, y, z, w);
}
 
static void save_RasterPos2dv(const GLdouble *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void save_RasterPos2fv(const GLfloat *v)
{
save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
}
 
static void save_RasterPos2iv(const GLint *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void save_RasterPos2sv(const GLshort *v)
{
save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
}
 
static void save_RasterPos3dv(const GLdouble *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void save_RasterPos3fv(const GLfloat *v)
{
save_RasterPos4f(v[0], v[1], v[2], 1.0F);
}
 
static void save_RasterPos3iv(const GLint *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void save_RasterPos3sv(const GLshort *v)
{
save_RasterPos4f(v[0], v[1], v[2], 1.0F);
}
 
static void save_RasterPos4dv(const GLdouble *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
static void save_RasterPos4fv(const GLfloat *v)
{
save_RasterPos4f(v[0], v[1], v[2], v[3]);
}
 
static void save_RasterPos4iv(const GLint *v)
{
save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
static void save_RasterPos4sv(const GLshort *v)
{
save_RasterPos4f(v[0], v[1], v[2], v[3]);
}
 
 
static void save_PassThrough( GLfloat token )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PASSTHROUGH, 1 );
if (n) {
n[1].f = token;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PassThrough)( token );
}
}
 
 
static void save_ReadBuffer( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_READ_BUFFER, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ReadBuffer)( mode );
}
}
 
 
static void
save_ResetHistogram(GLenum target)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_RESET_HISTOGRAM, 1 );
if (n) {
n[1].e = target;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ResetHistogram)( target );
}
}
 
 
static void
save_ResetMinmax(GLenum target)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_RESET_MIN_MAX, 1 );
if (n) {
n[1].e = target;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ResetMinmax)( target );
}
}
 
 
static void save_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ROTATE, 4 );
if (n) {
n[1].f = angle;
n[2].f = x;
n[3].f = y;
n[4].f = z;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Rotatef)( angle, x, y, z );
}
}
 
 
static void save_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z )
{
save_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
static void save_Scalef( GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_SCALE, 3 );
if (n) {
n[1].f = x;
n[2].f = y;
n[3].f = z;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Scalef)( x, y, z );
}
}
 
 
static void save_Scaled( GLdouble x, GLdouble y, GLdouble z )
{
save_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
static void save_Scissor( GLint x, GLint y, GLsizei width, GLsizei height )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_SCISSOR, 4 );
if (n) {
n[1].i = x;
n[2].i = y;
n[3].i = width;
n[4].i = height;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Scissor)( x, y, width, height );
}
}
 
 
static void save_ShadeModel( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_SHADE_MODEL, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ShadeModel)( mode );
}
}
 
 
static void save_StencilFunc( GLenum func, GLint ref, GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_STENCIL_FUNC, 3 );
if (n) {
n[1].e = func;
n[2].i = ref;
n[3].ui = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->StencilFunc)( func, ref, mask );
}
}
 
 
static void save_StencilMask( GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_STENCIL_MASK, 1 );
if (n) {
n[1].ui = mask;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->StencilMask)( mask );
}
}
 
 
static void save_StencilOp( GLenum fail, GLenum zfail, GLenum zpass )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_STENCIL_OP, 3 );
if (n) {
n[1].e = fail;
n[2].e = zfail;
n[3].e = zpass;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->StencilOp)( fail, zfail, zpass );
}
}
 
 
static void save_TexEnvfv( GLenum target, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEXENV, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].f = params[0];
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexEnvfv)( target, pname, params );
}
}
 
 
static void save_TexEnvf( GLenum target, GLenum pname, GLfloat param )
{
save_TexEnvfv( target, pname, &param );
}
 
 
static void save_TexEnvi( GLenum target, GLenum pname, GLint param )
{
GLfloat p[4];
p[0] = (GLfloat) param;
p[1] = p[2] = p[3] = 0.0;
save_TexEnvfv( target, pname, p );
}
 
 
static void save_TexEnviv( GLenum target, GLenum pname, const GLint *param )
{
GLfloat p[4];
p[0] = INT_TO_FLOAT( param[0] );
p[1] = INT_TO_FLOAT( param[1] );
p[2] = INT_TO_FLOAT( param[2] );
p[3] = INT_TO_FLOAT( param[3] );
save_TexEnvfv( target, pname, p );
}
 
 
static void save_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEXGEN, 6 );
if (n) {
n[1].e = coord;
n[2].e = pname;
n[3].f = params[0];
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexGenfv)( coord, pname, params );
}
}
 
 
static void save_TexGeniv(GLenum coord, GLenum pname, const GLint *params )
{
GLfloat p[4];
p[0] = (GLfloat) params[0];
p[1] = (GLfloat) params[1];
p[2] = (GLfloat) params[2];
p[3] = (GLfloat) params[3];
save_TexGenfv(coord, pname, p);
}
 
 
static void save_TexGend(GLenum coord, GLenum pname, GLdouble param )
{
GLfloat p = (GLfloat) param;
save_TexGenfv( coord, pname, &p );
}
 
 
static void save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params )
{
GLfloat p[4];
p[0] = (GLfloat) params[0];
p[1] = (GLfloat) params[1];
p[2] = (GLfloat) params[2];
p[3] = (GLfloat) params[3];
save_TexGenfv( coord, pname, p );
}
 
 
static void save_TexGenf( GLenum coord, GLenum pname, GLfloat param )
{
save_TexGenfv(coord, pname, &param);
}
 
 
static void save_TexGeni( GLenum coord, GLenum pname, GLint param )
{
save_TexGeniv( coord, pname, &param );
}
 
 
static void save_TexParameterfv( GLenum target,
GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEXPARAMETER, 6 );
if (n) {
n[1].e = target;
n[2].e = pname;
n[3].f = params[0];
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexParameterfv)( target, pname, params );
}
}
 
 
static void save_TexParameterf( GLenum target, GLenum pname, GLfloat param )
{
save_TexParameterfv(target, pname, &param);
}
 
 
static void save_TexParameteri( GLenum target, GLenum pname, GLint param )
{
GLfloat fparam[4];
fparam[0] = (GLfloat) param;
fparam[1] = fparam[2] = fparam[3] = 0.0;
save_TexParameterfv(target, pname, fparam);
}
 
 
static void save_TexParameteriv( GLenum target, GLenum pname, const GLint *params )
{
GLfloat fparam[4];
fparam[0] = (GLfloat) params[0];
fparam[1] = fparam[2] = fparam[3] = 0.0;
save_TexParameterfv(target, pname, fparam);
}
 
 
static void save_TexImage1D( GLenum target,
GLint level, GLint components,
GLsizei width, GLint border,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_1D) {
/* don't compile, execute immediately */
(*ctx->Exec->TexImage1D)( target, level, components, width,
border, format, type, pixels );
}
else {
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE1D, 8 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = components;
n[4].i = (GLint) width;
n[5].i = border;
n[6].e = format;
n[7].e = type;
n[8].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexImage1D)( target, level, components, width,
border, format, type, pixels );
}
}
}
 
 
static void save_TexImage2D( GLenum target,
GLint level, GLint components,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type,
const GLvoid *pixels)
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_2D) {
/* don't compile, execute immediately */
(*ctx->Exec->TexImage2D)( target, level, components, width,
height, border, format, type, pixels );
}
else {
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE2D, 9 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = components;
n[4].i = (GLint) width;
n[5].i = (GLint) height;
n[6].i = border;
n[7].e = format;
n[8].e = type;
n[9].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexImage2D)( target, level, components, width,
height, border, format, type, pixels );
}
}
}
 
 
static void save_TexImage3D( GLenum target,
GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLsizei depth,
GLint border,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_3D) {
/* don't compile, execute immediately */
(*ctx->Exec->TexImage3D)( target, level, internalFormat, width,
height, depth, border, format, type, pixels );
}
else {
Node *n;
GLvoid *image = _mesa_unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE3D, 10 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = (GLint) internalFormat;
n[4].i = (GLint) width;
n[5].i = (GLint) height;
n[6].i = (GLint) depth;
n[7].i = border;
n[8].e = format;
n[9].e = type;
n[10].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexImage3D)( target, level, internalFormat, width,
height, depth, border, format, type, pixels );
}
}
}
 
 
static void save_TexSubImage1D( GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE1D, 7 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = (GLint) width;
n[5].e = format;
n[6].e = type;
n[7].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexSubImage1D)( target, level, xoffset, width,
format, type, pixels );
}
}
 
 
static void save_TexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE2D, 9 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = (GLint) width;
n[6].i = (GLint) height;
n[7].e = format;
n[8].e = type;
n[9].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexSubImage2D)( target, level, xoffset, yoffset,
width, height, format, type, pixels );
}
}
 
 
static void save_TexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = _mesa_unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE3D, 11 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = zoffset;
n[6].i = (GLint) width;
n[7].i = (GLint) height;
n[8].i = (GLint) depth;
n[9].e = format;
n[10].e = type;
n[11].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TexSubImage3D)( target, level,
xoffset, yoffset, zoffset,
width, height, depth, format, type, pixels );
}
}
 
 
static void save_Translatef( GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TRANSLATE, 3 );
if (n) {
n[1].f = x;
n[2].f = y;
n[3].f = z;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Translatef)( x, y, z );
}
}
 
 
static void save_Translated( GLdouble x, GLdouble y, GLdouble z )
{
save_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
 
static void save_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_VIEWPORT, 4 );
if (n) {
n[1].i = x;
n[2].i = y;
n[3].i = (GLint) width;
n[4].i = (GLint) height;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->Viewport)( x, y, width, height );
}
}
 
 
static void save_WindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
n = ALLOC_INSTRUCTION( ctx, OPCODE_WINDOW_POS, 4 );
if (n) {
n[1].f = x;
n[2].f = y;
n[3].f = z;
n[4].f = w;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->WindowPos4fMESA)( x, y, z, w );
}
}
 
static void save_WindowPos2dMESA(GLdouble x, GLdouble y)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
static void save_WindowPos2fMESA(GLfloat x, GLfloat y)
{
save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
}
 
static void save_WindowPos2iMESA(GLint x, GLint y)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
static void save_WindowPos2sMESA(GLshort x, GLshort y)
{
save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
}
 
static void save_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
static void save_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)
{
save_WindowPos4fMESA(x, y, z, 1.0F);
}
 
static void save_WindowPos3iMESA(GLint x, GLint y, GLint z)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
static void save_WindowPos3sMESA(GLshort x, GLshort y, GLshort z)
{
save_WindowPos4fMESA(x, y, z, 1.0F);
}
 
static void save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
{
save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
{
save_WindowPos4fMESA(x, y, z, w);
}
 
static void save_WindowPos2dvMESA(const GLdouble *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void save_WindowPos2fvMESA(const GLfloat *v)
{
save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
}
 
static void save_WindowPos2ivMESA(const GLint *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void save_WindowPos2svMESA(const GLshort *v)
{
save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
}
 
static void save_WindowPos3dvMESA(const GLdouble *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void save_WindowPos3fvMESA(const GLfloat *v)
{
save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
}
 
static void save_WindowPos3ivMESA(const GLint *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void save_WindowPos3svMESA(const GLshort *v)
{
save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
}
 
static void save_WindowPos4dvMESA(const GLdouble *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
static void save_WindowPos4fvMESA(const GLfloat *v)
{
save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
}
 
static void save_WindowPos4ivMESA(const GLint *v)
{
save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
static void save_WindowPos4svMESA(const GLshort *v)
{
save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
}
 
 
 
/* GL_ARB_multitexture */
static void save_ActiveTextureARB( GLenum target )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ACTIVE_TEXTURE, 1 );
if (n) {
n[1].e = target;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ActiveTextureARB)( target );
}
}
 
 
/* GL_ARB_transpose_matrix */
 
static void save_LoadTransposeMatrixdARB( const GLdouble m[16] )
{
GLfloat tm[16];
_math_transposefd(tm, m);
save_LoadMatrixf(tm);
}
 
 
static void save_LoadTransposeMatrixfARB( const GLfloat m[16] )
{
GLfloat tm[16];
_math_transposef(tm, m);
save_LoadMatrixf(tm);
}
 
 
static void
save_MultTransposeMatrixdARB( const GLdouble m[16] )
{
GLfloat tm[16];
_math_transposefd(tm, m);
save_MultMatrixf(tm);
}
 
 
static void
save_MultTransposeMatrixfARB( const GLfloat m[16] )
{
GLfloat tm[16];
_math_transposef(tm, m);
save_MultMatrixf(tm);
}
 
 
static void
save_PixelTexGenSGIX(GLenum mode)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PIXEL_TEXGEN_SGIX, 1 );
if (n) {
n[1].e = mode;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PixelTexGenSGIX)( mode );
}
}
 
 
/* GL_ARB_texture_compression */
static void
save_CompressedTexImage1DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLint border, GLsizei imageSize,
const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_1D) {
/* don't compile, execute immediately */
(*ctx->Exec->CompressedTexImage1DARB)(target, level, internalFormat,
width, border, imageSize, data);
}
else {
Node *n;
GLvoid *image;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_IMAGE_1D, 7 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].e = internalFormat;
n[4].i = (GLint) width;
n[5].i = border;
n[6].i = imageSize;
n[7].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexImage1DARB)(target, level, internalFormat,
width, border, imageSize, data);
}
}
}
 
 
static void
save_CompressedTexImage2DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLint border, GLsizei imageSize,
const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_2D) {
/* don't compile, execute immediately */
(*ctx->Exec->CompressedTexImage2DARB)(target, level, internalFormat,
width, height, border, imageSize, data);
}
else {
Node *n;
GLvoid *image;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_IMAGE_2D, 8 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].e = internalFormat;
n[4].i = (GLint) width;
n[5].i = (GLint) height;
n[6].i = border;
n[7].i = imageSize;
n[8].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexImage2DARB)(target, level, internalFormat,
width, height, border, imageSize, data);
}
}
}
 
 
static void
save_CompressedTexImage3DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize, const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
if (target == GL_PROXY_TEXTURE_3D) {
/* don't compile, execute immediately */
(*ctx->Exec->CompressedTexImage3DARB)(target, level, internalFormat,
width, height, depth, border, imageSize, data);
}
else {
Node *n;
GLvoid *image;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_IMAGE_3D, 9 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].e = internalFormat;
n[4].i = (GLint) width;
n[5].i = (GLint) height;
n[6].i = (GLint) depth;
n[7].i = border;
n[8].i = imageSize;
n[9].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexImage3DARB)(target, level, internalFormat,
width, height, depth, border, imageSize, data);
}
}
}
 
 
static void
save_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format,
GLsizei imageSize, const GLvoid *data)
{
Node *n;
GLvoid *image;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage1DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D, 7 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = (GLint) width;
n[5].e = format;
n[6].i = imageSize;
n[7].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexSubImage1DARB)(target, level, xoffset,
width, format, imageSize, data);
}
}
 
 
static void
save_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLsizei imageSize,
const GLvoid *data)
{
Node *n;
GLvoid *image;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D, 9 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = (GLint) width;
n[6].i = (GLint) height;
n[7].e = format;
n[8].i = imageSize;
n[9].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexSubImage2DARB)(target, level, xoffset, yoffset,
width, height, format, imageSize, data);
}
}
 
 
static void
save_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLint zoffset, GLsizei width,
GLsizei height, GLsizei depth, GLenum format,
GLsizei imageSize, const GLvoid *data)
{
Node *n;
GLvoid *image;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
 
/* make copy of image */
image = MALLOC(imageSize);
if (!image) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage3DARB");
return;
}
MEMCPY(image, data, imageSize);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D, 11 );
if (n) {
n[1].e = target;
n[2].i = level;
n[3].i = xoffset;
n[4].i = yoffset;
n[5].i = zoffset;
n[6].i = (GLint) width;
n[7].i = (GLint) height;
n[8].i = (GLint) depth;
n[9].e = format;
n[10].i = imageSize;
n[11].data = image;
}
else if (image) {
FREE(image);
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->CompressedTexSubImage3DARB)(target, level, xoffset, yoffset,
zoffset, width, height, depth, format, imageSize, data);
}
}
 
 
/* GL_ARB_multisample */
static void
save_SampleCoverageARB(GLclampf value, GLboolean invert)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_SAMPLE_COVERAGE, 2 );
if (n) {
n[1].f = value;
n[2].b = invert;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->SampleCoverageARB)( value, invert );
}
}
 
 
/* GL_SGIS_pixel_texture */
 
static void
save_PixelTexGenParameteriSGIS(GLenum target, GLint value)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS, 2 );
if (n) {
n[1].e = target;
n[2].i = value;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->PixelTexGenParameteriSGIS)( target, value );
}
}
 
 
static void
save_PixelTexGenParameterfSGIS(GLenum target, GLfloat value)
{
save_PixelTexGenParameteriSGIS(target, (GLint) value);
}
 
 
static void
save_PixelTexGenParameterivSGIS(GLenum target, const GLint *value)
{
save_PixelTexGenParameteriSGIS(target, *value);
}
 
 
static void
save_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value)
{
save_PixelTexGenParameteriSGIS(target, (GLint) *value);
}
 
 
/*
* GL_NV_vertex_program
*/
#if FEATURE_NV_vertex_program
static void
save_BindProgramNV(GLenum target, GLuint id)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_BIND_PROGRAM_NV, 2 );
if (n) {
n[1].e = target;
n[2].ui = id;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->BindProgramNV)( target, id );
}
}
 
static void
save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_EXECUTE_PROGRAM_NV, 6 );
if (n) {
n[1].e = target;
n[2].ui = id;
n[3].f = params[0];
n[4].f = params[1];
n[5].f = params[2];
n[6].f = params[3];
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ExecuteProgramNV)(target, id, params);
}
}
 
 
static void
save_ProgramParameter4fNV(GLenum target, GLuint index,
GLfloat x, GLfloat y,
GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_PROGRAM_PARAMETER4F_NV, 6 );
if (n) {
n[1].e = target;
n[2].ui = index;
n[3].f = x;
n[4].f = y;
n[5].f = z;
n[6].f = w;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ProgramParameter4fNV)(target, index, x, y, z, w);
}
}
 
 
static void
save_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params)
{
save_ProgramParameter4fNV(target, index, params[0], params[1],
params[2], params[3]);
}
 
 
static void
save_ProgramParameter4dNV(GLenum target, GLuint index,
GLdouble x, GLdouble y,
GLdouble z, GLdouble w)
{
save_ProgramParameter4fNV(target, index, (GLfloat) x, (GLfloat) y,
(GLfloat) z, (GLfloat) w);
}
 
 
static void
save_ProgramParameter4dvNV(GLenum target, GLuint index,
const GLdouble *params)
{
save_ProgramParameter4fNV(target, index, (GLfloat) params[0],
(GLfloat) params[1], (GLfloat) params[2],
(GLfloat) params[3]);
}
 
 
static void
save_ProgramParameters4dvNV(GLenum target, GLuint index,
GLuint num, const GLdouble *params)
{
GLuint i;
for (i = 0; i < num; i++) {
save_ProgramParameter4dvNV(target, index + i, params + 4 * i);
}
}
 
 
static void
save_ProgramParameters4fvNV(GLenum target, GLuint index,
GLuint num, const GLfloat *params)
{
GLuint i;
for (i = 0; i < num; i++) {
save_ProgramParameter4fvNV(target, index + i, params + 4 * i);
}
}
 
 
 
static void
save_TrackMatrixNV(GLenum target, GLuint address,
GLenum matrix, GLenum transform)
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TRACK_MATRIX_NV, 4 );
if (n) {
n[1].e = target;
n[2].ui = address;
n[3].e = matrix;
n[4].e = transform;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->TrackMatrixNV)(target, address, matrix, transform);
}
}
#endif /* FEATURE_NV_vertex_program */
 
 
/* GL_EXT_stencil_two_side */
static void save_ActiveStencilFaceEXT( GLenum face )
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_ACTIVE_STENCIL_FACE_EXT, 1 );
if (n) {
n[1].e = face;
}
if (ctx->ExecuteFlag) {
(*ctx->Exec->ActiveStencilFaceEXT)( face );
}
}
 
 
 
/* KW: Compile commands
*
* Will appear in the list before the vertex buffer containing the
* command that provoked the error. I don't see this as a problem.
*/
void
_mesa_save_error( GLcontext *ctx, GLenum error, const char *s )
{
Node *n;
n = ALLOC_INSTRUCTION( ctx, OPCODE_ERROR, 2 );
if (n) {
n[1].e = error;
n[2].data = (void *) s;
}
/* execute already done */
}
 
 
/*
* Compile an error into current display list.
*/
void
_mesa_compile_error( GLcontext *ctx, GLenum error, const char *s )
{
if (ctx->CompileFlag)
_mesa_save_error( ctx, error, s );
 
if (ctx->ExecuteFlag)
_mesa_error( ctx, error, s );
}
 
 
 
static GLboolean
islist(GLcontext *ctx, GLuint list)
{
if (list > 0 && _mesa_HashLookup(ctx->Shared->DisplayList, list)) {
return GL_TRUE;
}
else {
return GL_FALSE;
}
}
 
 
 
/**********************************************************************/
/* Display list execution */
/**********************************************************************/
 
 
/*
* Execute a display list. Note that the ListBase offset must have already
* been added before calling this function. I.e. the list argument is
* the absolute list number, not relative to ListBase.
* Input: list - display list number
*/
static void
execute_list( GLcontext *ctx, GLuint list )
{
Node *n;
GLboolean done;
 
if (!islist(ctx,list))
return;
 
if (ctx->Driver.BeginCallList)
ctx->Driver.BeginCallList( ctx, list );
 
ctx->CallDepth++;
 
n = (Node *) _mesa_HashLookup(ctx->Shared->DisplayList, list);
 
done = GL_FALSE;
while (!done) {
OpCode opcode = n[0].opcode;
int i = (int)n[0].opcode - (int)OPCODE_DRV_0;
 
if (i >= 0 && i < (GLint) ctx->listext.nr_opcodes) {
ctx->listext.opcode[i].execute(ctx, &n[1]);
n += ctx->listext.opcode[i].size;
}
else {
switch (opcode) {
case OPCODE_ERROR:
_mesa_error( ctx, n[1].e, (const char *) n[2].data );
break;
case OPCODE_ACCUM:
(*ctx->Exec->Accum)( n[1].e, n[2].f );
break;
case OPCODE_ALPHA_FUNC:
(*ctx->Exec->AlphaFunc)( n[1].e, n[2].f );
break;
case OPCODE_BIND_TEXTURE:
(*ctx->Exec->BindTexture)( n[1].e, n[2].ui );
break;
case OPCODE_BITMAP:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->Bitmap)( (GLsizei) n[1].i, (GLsizei) n[2].i,
n[3].f, n[4].f, n[5].f, n[6].f, (const GLubyte *) n[7].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_BLEND_COLOR:
(*ctx->Exec->BlendColor)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_BLEND_EQUATION:
(*ctx->Exec->BlendEquation)( n[1].e );
break;
case OPCODE_BLEND_FUNC:
(*ctx->Exec->BlendFunc)( n[1].e, n[2].e );
break;
case OPCODE_BLEND_FUNC_SEPARATE:
(*ctx->Exec->BlendFuncSeparateEXT)(n[1].e, n[2].e, n[3].e, n[4].e);
break;
case OPCODE_CALL_LIST:
/* Generated by glCallList(), don't add ListBase */
if (ctx->CallDepth<MAX_LIST_NESTING) {
execute_list( ctx, n[1].ui );
}
break;
case OPCODE_CALL_LIST_OFFSET:
/* Generated by glCallLists() so we must add ListBase */
if (n[2].b) {
/* user specified a bad datatype at compile time */
_mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)");
}
else if (ctx->CallDepth < MAX_LIST_NESTING) {
execute_list( ctx, ctx->List.ListBase + n[1].ui );
}
break;
case OPCODE_CLEAR:
(*ctx->Exec->Clear)( n[1].bf );
break;
case OPCODE_CLEAR_COLOR:
(*ctx->Exec->ClearColor)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_CLEAR_ACCUM:
(*ctx->Exec->ClearAccum)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_CLEAR_DEPTH:
(*ctx->Exec->ClearDepth)( (GLclampd) n[1].f );
break;
case OPCODE_CLEAR_INDEX:
(*ctx->Exec->ClearIndex)( (GLfloat) n[1].ui );
break;
case OPCODE_CLEAR_STENCIL:
(*ctx->Exec->ClearStencil)( n[1].i );
break;
case OPCODE_CLIP_PLANE:
{
GLdouble eq[4];
eq[0] = n[2].f;
eq[1] = n[3].f;
eq[2] = n[4].f;
eq[3] = n[5].f;
(*ctx->Exec->ClipPlane)( n[1].e, eq );
}
break;
case OPCODE_COLOR_MASK:
(*ctx->Exec->ColorMask)( n[1].b, n[2].b, n[3].b, n[4].b );
break;
case OPCODE_COLOR_MATERIAL:
(*ctx->Exec->ColorMaterial)( n[1].e, n[2].e );
break;
case OPCODE_COLOR_TABLE:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ColorTable)( n[1].e, n[2].e, n[3].i, n[4].e,
n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_COLOR_TABLE_PARAMETER_FV:
{
GLfloat params[4];
params[0] = n[3].f;
params[1] = n[4].f;
params[2] = n[5].f;
params[3] = n[6].f;
(*ctx->Exec->ColorTableParameterfv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_COLOR_TABLE_PARAMETER_IV:
{
GLint params[4];
params[0] = n[3].i;
params[1] = n[4].i;
params[2] = n[5].i;
params[3] = n[6].i;
(*ctx->Exec->ColorTableParameteriv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_COLOR_SUB_TABLE:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ColorSubTable)( n[1].e, n[2].i, n[3].i,
n[4].e, n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_CONVOLUTION_FILTER_1D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ConvolutionFilter1D)( n[1].e, n[2].i, n[3].i,
n[4].e, n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_CONVOLUTION_FILTER_2D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ConvolutionFilter2D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e, n[6].e, n[7].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_CONVOLUTION_PARAMETER_I:
(*ctx->Exec->ConvolutionParameteri)( n[1].e, n[2].e, n[3].i );
break;
case OPCODE_CONVOLUTION_PARAMETER_IV:
{
GLint params[4];
params[0] = n[3].i;
params[1] = n[4].i;
params[2] = n[5].i;
params[3] = n[6].i;
(*ctx->Exec->ConvolutionParameteriv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_CONVOLUTION_PARAMETER_F:
(*ctx->Exec->ConvolutionParameterf)( n[1].e, n[2].e, n[3].f );
break;
case OPCODE_CONVOLUTION_PARAMETER_FV:
{
GLfloat params[4];
params[0] = n[3].f;
params[1] = n[4].f;
params[2] = n[5].f;
params[3] = n[6].f;
(*ctx->Exec->ConvolutionParameterfv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_COPY_COLOR_SUB_TABLE:
(*ctx->Exec->CopyColorSubTable)( n[1].e, n[2].i,
n[3].i, n[4].i, n[5].i );
break;
case OPCODE_COPY_COLOR_TABLE:
(*ctx->Exec->CopyColorSubTable)( n[1].e, n[2].i,
n[3].i, n[4].i, n[5].i );
break;
case OPCODE_COPY_PIXELS:
(*ctx->Exec->CopyPixels)( n[1].i, n[2].i,
(GLsizei) n[3].i, (GLsizei) n[4].i, n[5].e );
break;
case OPCODE_COPY_TEX_IMAGE1D:
(*ctx->Exec->CopyTexImage1D)( n[1].e, n[2].i, n[3].e, n[4].i,
n[5].i, n[6].i, n[7].i );
break;
case OPCODE_COPY_TEX_IMAGE2D:
(*ctx->Exec->CopyTexImage2D)( n[1].e, n[2].i, n[3].e, n[4].i,
n[5].i, n[6].i, n[7].i, n[8].i );
break;
case OPCODE_COPY_TEX_SUB_IMAGE1D:
(*ctx->Exec->CopyTexSubImage1D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i );
break;
case OPCODE_COPY_TEX_SUB_IMAGE2D:
(*ctx->Exec->CopyTexSubImage2D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].i, n[8].i );
break;
case OPCODE_COPY_TEX_SUB_IMAGE3D:
(*ctx->Exec->CopyTexSubImage3D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].i, n[8].i , n[9].i);
break;
case OPCODE_CULL_FACE:
(*ctx->Exec->CullFace)( n[1].e );
break;
case OPCODE_DEPTH_FUNC:
(*ctx->Exec->DepthFunc)( n[1].e );
break;
case OPCODE_DEPTH_MASK:
(*ctx->Exec->DepthMask)( n[1].b );
break;
case OPCODE_DEPTH_RANGE:
(*ctx->Exec->DepthRange)( (GLclampd) n[1].f, (GLclampd) n[2].f );
break;
case OPCODE_DISABLE:
(*ctx->Exec->Disable)( n[1].e );
break;
case OPCODE_DRAW_BUFFER:
(*ctx->Exec->DrawBuffer)( n[1].e );
break;
case OPCODE_DRAW_PIXELS:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->DrawPixels)( n[1].i, n[2].i, n[3].e, n[4].e,
n[5].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_ENABLE:
(*ctx->Exec->Enable)( n[1].e );
break;
case OPCODE_EVALMESH1:
(*ctx->Exec->EvalMesh1)( n[1].e, n[2].i, n[3].i );
break;
case OPCODE_EVALMESH2:
(*ctx->Exec->EvalMesh2)( n[1].e, n[2].i, n[3].i, n[4].i, n[5].i );
break;
case OPCODE_FOG:
{
GLfloat p[4];
p[0] = n[2].f;
p[1] = n[3].f;
p[2] = n[4].f;
p[3] = n[5].f;
(*ctx->Exec->Fogfv)( n[1].e, p );
}
break;
case OPCODE_FRONT_FACE:
(*ctx->Exec->FrontFace)( n[1].e );
break;
case OPCODE_FRUSTUM:
(*ctx->Exec->Frustum)( n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f );
break;
case OPCODE_HINT:
(*ctx->Exec->Hint)( n[1].e, n[2].e );
break;
case OPCODE_HISTOGRAM:
(*ctx->Exec->Histogram)( n[1].e, n[2].i, n[3].e, n[4].b );
break;
case OPCODE_INDEX_MASK:
(*ctx->Exec->IndexMask)( n[1].ui );
break;
case OPCODE_INIT_NAMES:
(*ctx->Exec->InitNames)();
break;
case OPCODE_LIGHT:
{
GLfloat p[4];
p[0] = n[3].f;
p[1] = n[4].f;
p[2] = n[5].f;
p[3] = n[6].f;
(*ctx->Exec->Lightfv)( n[1].e, n[2].e, p );
}
break;
case OPCODE_LIGHT_MODEL:
{
GLfloat p[4];
p[0] = n[2].f;
p[1] = n[3].f;
p[2] = n[4].f;
p[3] = n[5].f;
(*ctx->Exec->LightModelfv)( n[1].e, p );
}
break;
case OPCODE_LINE_STIPPLE:
(*ctx->Exec->LineStipple)( n[1].i, n[2].us );
break;
case OPCODE_LINE_WIDTH:
(*ctx->Exec->LineWidth)( n[1].f );
break;
case OPCODE_LIST_BASE:
(*ctx->Exec->ListBase)( n[1].ui );
break;
case OPCODE_LOAD_IDENTITY:
(*ctx->Exec->LoadIdentity)();
break;
case OPCODE_LOAD_MATRIX:
if (sizeof(Node)==sizeof(GLfloat)) {
(*ctx->Exec->LoadMatrixf)( &n[1].f );
}
else {
GLfloat m[16];
GLuint i;
for (i=0;i<16;i++) {
m[i] = n[1+i].f;
}
(*ctx->Exec->LoadMatrixf)( m );
}
break;
case OPCODE_LOAD_NAME:
(*ctx->Exec->LoadName)( n[1].ui );
break;
case OPCODE_LOGIC_OP:
(*ctx->Exec->LogicOp)( n[1].e );
break;
case OPCODE_MAP1:
{
GLenum target = n[1].e;
GLint ustride = _mesa_evaluator_components(target);
GLint uorder = n[5].i;
GLfloat u1 = n[2].f;
GLfloat u2 = n[3].f;
(*ctx->Exec->Map1f)( target, u1, u2, ustride, uorder,
(GLfloat *) n[6].data );
}
break;
case OPCODE_MAP2:
{
GLenum target = n[1].e;
GLfloat u1 = n[2].f;
GLfloat u2 = n[3].f;
GLfloat v1 = n[4].f;
GLfloat v2 = n[5].f;
GLint ustride = n[6].i;
GLint vstride = n[7].i;
GLint uorder = n[8].i;
GLint vorder = n[9].i;
(*ctx->Exec->Map2f)( target, u1, u2, ustride, uorder,
v1, v2, vstride, vorder,
(GLfloat *) n[10].data );
}
break;
case OPCODE_MAPGRID1:
(*ctx->Exec->MapGrid1f)( n[1].i, n[2].f, n[3].f );
break;
case OPCODE_MAPGRID2:
(*ctx->Exec->MapGrid2f)( n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f);
break;
case OPCODE_MATRIX_MODE:
(*ctx->Exec->MatrixMode)( n[1].e );
break;
case OPCODE_MIN_MAX:
(*ctx->Exec->Minmax)(n[1].e, n[2].e, n[3].b);
break;
case OPCODE_MULT_MATRIX:
if (sizeof(Node)==sizeof(GLfloat)) {
(*ctx->Exec->MultMatrixf)( &n[1].f );
}
else {
GLfloat m[16];
GLuint i;
for (i=0;i<16;i++) {
m[i] = n[1+i].f;
}
(*ctx->Exec->MultMatrixf)( m );
}
break;
case OPCODE_ORTHO:
(*ctx->Exec->Ortho)( n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f );
break;
case OPCODE_PASSTHROUGH:
(*ctx->Exec->PassThrough)( n[1].f );
break;
case OPCODE_PIXEL_MAP:
(*ctx->Exec->PixelMapfv)( n[1].e, n[2].i, (GLfloat *) n[3].data );
break;
case OPCODE_PIXEL_TRANSFER:
(*ctx->Exec->PixelTransferf)( n[1].e, n[2].f );
break;
case OPCODE_PIXEL_ZOOM:
(*ctx->Exec->PixelZoom)( n[1].f, n[2].f );
break;
case OPCODE_POINT_SIZE:
(*ctx->Exec->PointSize)( n[1].f );
break;
case OPCODE_POINT_PARAMETERS:
{
GLfloat params[3];
params[0] = n[2].f;
params[1] = n[3].f;
params[2] = n[4].f;
(*ctx->Exec->PointParameterfvEXT)( n[1].e, params );
}
break;
case OPCODE_POLYGON_MODE:
(*ctx->Exec->PolygonMode)( n[1].e, n[2].e );
break;
case OPCODE_POLYGON_STIPPLE:
(*ctx->Exec->PolygonStipple)( (GLubyte *) n[1].data );
break;
case OPCODE_POLYGON_OFFSET:
(*ctx->Exec->PolygonOffset)( n[1].f, n[2].f );
break;
case OPCODE_POP_ATTRIB:
(*ctx->Exec->PopAttrib)();
break;
case OPCODE_POP_MATRIX:
(*ctx->Exec->PopMatrix)();
break;
case OPCODE_POP_NAME:
(*ctx->Exec->PopName)();
break;
case OPCODE_PRIORITIZE_TEXTURE:
(*ctx->Exec->PrioritizeTextures)( 1, &n[1].ui, &n[2].f );
break;
case OPCODE_PUSH_ATTRIB:
(*ctx->Exec->PushAttrib)( n[1].bf );
break;
case OPCODE_PUSH_MATRIX:
(*ctx->Exec->PushMatrix)();
break;
case OPCODE_PUSH_NAME:
(*ctx->Exec->PushName)( n[1].ui );
break;
case OPCODE_RASTER_POS:
(*ctx->Exec->RasterPos4f)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_READ_BUFFER:
(*ctx->Exec->ReadBuffer)( n[1].e );
break;
case OPCODE_RESET_HISTOGRAM:
(*ctx->Exec->ResetHistogram)( n[1].e );
break;
case OPCODE_RESET_MIN_MAX:
(*ctx->Exec->ResetMinmax)( n[1].e );
break;
case OPCODE_ROTATE:
(*ctx->Exec->Rotatef)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_SCALE:
(*ctx->Exec->Scalef)( n[1].f, n[2].f, n[3].f );
break;
case OPCODE_SCISSOR:
(*ctx->Exec->Scissor)( n[1].i, n[2].i, n[3].i, n[4].i );
break;
case OPCODE_SHADE_MODEL:
(*ctx->Exec->ShadeModel)( n[1].e );
break;
case OPCODE_STENCIL_FUNC:
(*ctx->Exec->StencilFunc)( n[1].e, n[2].i, n[3].ui );
break;
case OPCODE_STENCIL_MASK:
(*ctx->Exec->StencilMask)( n[1].ui );
break;
case OPCODE_STENCIL_OP:
(*ctx->Exec->StencilOp)( n[1].e, n[2].e, n[3].e );
break;
case OPCODE_TEXENV:
{
GLfloat params[4];
params[0] = n[3].f;
params[1] = n[4].f;
params[2] = n[5].f;
params[3] = n[6].f;
(*ctx->Exec->TexEnvfv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_TEXGEN:
{
GLfloat params[4];
params[0] = n[3].f;
params[1] = n[4].f;
params[2] = n[5].f;
params[3] = n[6].f;
(*ctx->Exec->TexGenfv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_TEXPARAMETER:
{
GLfloat params[4];
params[0] = n[3].f;
params[1] = n[4].f;
params[2] = n[5].f;
params[3] = n[6].f;
(*ctx->Exec->TexParameterfv)( n[1].e, n[2].e, params );
}
break;
case OPCODE_TEX_IMAGE1D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage1D)(
n[1].e, /* target */
n[2].i, /* level */
n[3].i, /* components */
n[4].i, /* width */
n[5].e, /* border */
n[6].e, /* format */
n[7].e, /* type */
n[8].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TEX_IMAGE2D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage2D)(
n[1].e, /* target */
n[2].i, /* level */
n[3].i, /* components */
n[4].i, /* width */
n[5].i, /* height */
n[6].e, /* border */
n[7].e, /* format */
n[8].e, /* type */
n[9].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TEX_IMAGE3D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage3D)(
n[1].e, /* target */
n[2].i, /* level */
n[3].i, /* components */
n[4].i, /* width */
n[5].i, /* height */
n[6].i, /* depth */
n[7].e, /* border */
n[8].e, /* format */
n[9].e, /* type */
n[10].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TEX_SUB_IMAGE1D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage1D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e,
n[6].e, n[7].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TEX_SUB_IMAGE2D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage2D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e,
n[6].i, n[7].e, n[8].e, n[9].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TEX_SUB_IMAGE3D:
{
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage3D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].i,
n[8].i, n[9].e, n[10].e,
n[11].data );
ctx->Unpack = save; /* restore */
}
break;
case OPCODE_TRANSLATE:
(*ctx->Exec->Translatef)( n[1].f, n[2].f, n[3].f );
break;
case OPCODE_VIEWPORT:
(*ctx->Exec->Viewport)(n[1].i, n[2].i,
(GLsizei) n[3].i, (GLsizei) n[4].i);
break;
case OPCODE_WINDOW_POS:
(*ctx->Exec->WindowPos4fMESA)( n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_ACTIVE_TEXTURE: /* GL_ARB_multitexture */
(*ctx->Exec->ActiveTextureARB)( n[1].e );
break;
case OPCODE_PIXEL_TEXGEN_SGIX: /* GL_SGIX_pixel_texture */
(*ctx->Exec->PixelTexGenSGIX)( n[1].e );
break;
case OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS: /* GL_SGIS_pixel_texture */
(*ctx->Exec->PixelTexGenParameteriSGIS)( n[1].e, n[2].i );
break;
case OPCODE_COMPRESSED_TEX_IMAGE_1D: /* GL_ARB_texture_compression */
(*ctx->Exec->CompressedTexImage1DARB)(n[1].e, n[2].i, n[3].e,
n[4].i, n[5].i, n[6].i, n[7].data);
break;
case OPCODE_COMPRESSED_TEX_IMAGE_2D: /* GL_ARB_texture_compression */
(*ctx->Exec->CompressedTexImage2DARB)(n[1].e, n[2].i, n[3].e,
n[4].i, n[5].i, n[6].i, n[7].i, n[8].data);
break;
case OPCODE_COMPRESSED_TEX_IMAGE_3D: /* GL_ARB_texture_compression */
(*ctx->Exec->CompressedTexImage3DARB)(n[1].e, n[2].i, n[3].e,
n[4].i, n[5].i, n[6].i, n[7].i, n[8].i, n[9].data);
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D: /* GL_ARB_texture_compress */
(*ctx->Exec->CompressedTexSubImage1DARB)(n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e, n[6].i, n[7].data);
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D: /* GL_ARB_texture_compress */
(*ctx->Exec->CompressedTexSubImage2DARB)(n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].e, n[8].i, n[9].data);
break;
case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D: /* GL_ARB_texture_compress */
(*ctx->Exec->CompressedTexSubImage3DARB)(n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].i, n[8].i,
n[9].e, n[10].i, n[11].data);
break;
case OPCODE_SAMPLE_COVERAGE: /* GL_ARB_multisample */
(*ctx->Exec->SampleCoverageARB)(n[1].f, n[2].b);
break;
case OPCODE_WINDOW_POS_ARB: /* GL_ARB_window_pos */
(*ctx->Exec->WindowPos3fMESA)( n[1].f, n[2].f, n[3].f );
break;
case OPCODE_BIND_PROGRAM_NV: /* GL_NV_vertex_program */
(*ctx->Exec->BindProgramNV)( n[1].e, n[2].ui );
break;
case OPCODE_EXECUTE_PROGRAM_NV:
{
GLfloat v[4];
v[0] = n[3].f;
v[1] = n[4].f;
v[2] = n[5].f;
v[3] = n[6].f;
(*ctx->Exec->ExecuteProgramNV)(n[1].e, n[2].ui, v);
}
break;
case OPCODE_REQUEST_PROGRAMS_RESIDENT_NV:
/*
(*ctx->Exec->RequestResidentProgramsNV)();
*/
break;
case OPCODE_LOAD_PROGRAM_NV:
/*
(*ctx->Exec->LoadProgramNV)();
*/
break;
case OPCODE_PROGRAM_PARAMETER4F_NV:
(*ctx->Exec->ProgramParameter4fNV)(n[1].e, n[2].ui, n[3].f,
n[4].f, n[5].f, n[6].f);
break;
case OPCODE_TRACK_MATRIX_NV:
(*ctx->Exec->TrackMatrixNV)(n[1].e, n[2].ui, n[3].e, n[4].e);
break;
 
case OPCODE_CONTINUE:
n = (Node *) n[1].next;
break;
case OPCODE_END_OF_LIST:
done = GL_TRUE;
break;
default:
{
char msg[1000];
_mesa_sprintf(msg, "Error in execute_list: opcode=%d", (int) opcode);
_mesa_problem(ctx, msg);
}
done = GL_TRUE;
}
 
/* increment n to point to next compiled command */
if (opcode!=OPCODE_CONTINUE) {
n += InstSize[opcode];
}
}
}
ctx->CallDepth--;
 
if (ctx->Driver.EndCallList)
ctx->Driver.EndCallList( ctx );
}
 
 
 
 
 
/**********************************************************************/
/* GL functions */
/**********************************************************************/
 
 
 
 
/*
* Test if a display list number is valid.
*/
GLboolean
_mesa_IsList( GLuint list )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
return islist(ctx, list);
}
 
 
/*
* Delete a sequence of consecutive display lists.
*/
void
_mesa_DeleteLists( GLuint list, GLsizei range )
{
GET_CURRENT_CONTEXT(ctx);
GLuint i;
FLUSH_VERTICES(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (range<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glDeleteLists" );
return;
}
for (i=list;i<list+range;i++) {
_mesa_destroy_list( ctx, i );
}
}
 
 
 
/*
* Return a display list number, n, such that lists n through n+range-1
* are free.
*/
GLuint
_mesa_GenLists(GLsizei range )
{
GET_CURRENT_CONTEXT(ctx);
GLuint base;
FLUSH_VERTICES(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
if (range<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGenLists" );
return 0;
}
if (range==0) {
return 0;
}
 
/*
* Make this an atomic operation
*/
_glthread_LOCK_MUTEX(ctx->Shared->Mutex);
 
base = _mesa_HashFindFreeKeyBlock(ctx->Shared->DisplayList, range);
if (base) {
/* reserve the list IDs by with empty/dummy lists */
GLint i;
for (i=0; i<range; i++) {
_mesa_HashInsert(ctx->Shared->DisplayList, base+i, make_empty_list());
}
}
 
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
return base;
}
 
 
 
/*
* Begin a new display list.
*/
void
_mesa_NewList( GLuint list, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_CURRENT(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glNewList %u %s\n", list,
_mesa_lookup_enum_by_nr(mode));
 
if (list==0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glNewList" );
return;
}
 
if (mode!=GL_COMPILE && mode!=GL_COMPILE_AND_EXECUTE) {
_mesa_error( ctx, GL_INVALID_ENUM, "glNewList" );
return;
}
 
if (ctx->CurrentListPtr) {
/* already compiling a display list */
_mesa_error( ctx, GL_INVALID_OPERATION, "glNewList" );
return;
}
 
/* Allocate new display list */
ctx->CurrentListNum = list;
ctx->CurrentBlock = (Node *) MALLOC( sizeof(Node) * BLOCK_SIZE );
ctx->CurrentListPtr = ctx->CurrentBlock;
ctx->CurrentPos = 0;
ctx->CompileFlag = GL_TRUE;
ctx->ExecuteFlag = (mode == GL_COMPILE_AND_EXECUTE);
 
ctx->Driver.NewList( ctx, list, mode );
 
ctx->CurrentDispatch = ctx->Save;
_glapi_set_dispatch( ctx->CurrentDispatch );
}
 
 
 
/*
* End definition of current display list. Is the current
* ASSERT_OUTSIDE_BEGIN_END strong enough to really guarentee that
* we are outside begin/end calls?
*/
void
_mesa_EndList( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_CURRENT(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glEndList\n");
 
/* Check that a list is under construction */
if (!ctx->CurrentListPtr) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glEndList" );
return;
}
 
(void) ALLOC_INSTRUCTION( ctx, OPCODE_END_OF_LIST, 0 );
 
/* Destroy old list, if any */
_mesa_destroy_list(ctx, ctx->CurrentListNum);
/* Install the list */
_mesa_HashInsert(ctx->Shared->DisplayList, ctx->CurrentListNum, ctx->CurrentListPtr);
 
 
if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST)
mesa_print_display_list(ctx->CurrentListNum);
 
ctx->CurrentListNum = 0;
ctx->CurrentListPtr = NULL;
ctx->ExecuteFlag = GL_TRUE;
ctx->CompileFlag = GL_FALSE;
 
ctx->Driver.EndList( ctx );
 
ctx->CurrentDispatch = ctx->Exec;
_glapi_set_dispatch( ctx->CurrentDispatch );
}
 
 
 
void
_mesa_CallList( GLuint list )
{
GLboolean save_compile_flag;
GET_CURRENT_CONTEXT(ctx);
FLUSH_CURRENT(ctx, 0);
/* VERY IMPORTANT: Save the CompileFlag status, turn it off, */
/* execute the display list, and restore the CompileFlag. */
 
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "_mesa_CallList %d\n", list);
 
/* mesa_print_display_list( list ); */
 
save_compile_flag = ctx->CompileFlag;
if (save_compile_flag) {
ctx->CompileFlag = GL_FALSE;
}
 
execute_list( ctx, list );
ctx->CompileFlag = save_compile_flag;
 
/* also restore API function pointers to point to "save" versions */
if (save_compile_flag) {
ctx->CurrentDispatch = ctx->Save;
_glapi_set_dispatch( ctx->CurrentDispatch );
}
}
 
 
 
/*
* Execute glCallLists: call multiple display lists.
*/
void
_mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists )
{
GET_CURRENT_CONTEXT(ctx);
GLuint list;
GLint i;
GLboolean save_compile_flag;
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "_mesa_CallLists %d\n", n);
 
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_2_BYTES:
case GL_3_BYTES:
case GL_4_BYTES:
/* OK */
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)");
return;
}
 
/* Save the CompileFlag status, turn it off, execute display list,
* and restore the CompileFlag.
*/
save_compile_flag = ctx->CompileFlag;
ctx->CompileFlag = GL_FALSE;
 
for (i=0;i<n;i++) {
list = translate_id( i, type, lists );
execute_list( ctx, ctx->List.ListBase + list );
}
 
ctx->CompileFlag = save_compile_flag;
 
/* also restore API function pointers to point to "save" versions */
if (save_compile_flag) {
ctx->CurrentDispatch = ctx->Save;
_glapi_set_dispatch( ctx->CurrentDispatch );
}
}
 
 
 
/*
* Set the offset added to list numbers in glCallLists.
*/
void
_mesa_ListBase( GLuint base )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0); /* must be called before assert */
ASSERT_OUTSIDE_BEGIN_END(ctx);
ctx->List.ListBase = base;
}
 
 
/* Can no longer assume ctx->Exec->Func is equal to _mesa_Func.
*/
static void exec_Finish( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->Finish();
}
 
static void exec_Flush( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->Flush( );
}
 
static void exec_GetBooleanv( GLenum pname, GLboolean *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetBooleanv( pname, params );
}
 
static void exec_GetClipPlane( GLenum plane, GLdouble *equation )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetClipPlane( plane, equation );
}
 
static void exec_GetDoublev( GLenum pname, GLdouble *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetDoublev( pname, params );
}
 
static GLenum exec_GetError( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->GetError( );
}
 
static void exec_GetFloatv( GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetFloatv( pname, params );
}
 
static void exec_GetIntegerv( GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetIntegerv( pname, params );
}
 
static void exec_GetLightfv( GLenum light, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetLightfv( light, pname, params );
}
 
static void exec_GetLightiv( GLenum light, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetLightiv( light, pname, params );
}
 
static void exec_GetMapdv( GLenum target, GLenum query, GLdouble *v )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMapdv( target, query, v );
}
 
static void exec_GetMapfv( GLenum target, GLenum query, GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMapfv( target, query, v );
}
 
static void exec_GetMapiv( GLenum target, GLenum query, GLint *v )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMapiv( target, query, v );
}
 
static void exec_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMaterialfv( face, pname, params );
}
 
static void exec_GetMaterialiv( GLenum face, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMaterialiv( face, pname, params );
}
 
static void exec_GetPixelMapfv( GLenum map, GLfloat *values )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPixelMapfv( map, values );
}
 
static void exec_GetPixelMapuiv( GLenum map, GLuint *values )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPixelMapuiv( map, values );
}
 
static void exec_GetPixelMapusv( GLenum map, GLushort *values )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPixelMapusv( map, values );
}
 
static void exec_GetPolygonStipple( GLubyte *dest )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPolygonStipple( dest );
}
 
static const GLubyte *exec_GetString( GLenum name )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->GetString( name );
}
 
static void exec_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexEnvfv( target, pname, params );
}
 
static void exec_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexEnviv( target, pname, params );
}
 
static void exec_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexGendv( coord, pname, params );
}
 
static void exec_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexGenfv( coord, pname, params );
}
 
static void exec_GetTexGeniv( GLenum coord, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexGeniv( coord, pname, params );
}
 
static void exec_GetTexImage( GLenum target, GLint level, GLenum format,
GLenum type, GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexImage( target, level, format, type, pixels );
}
 
static void exec_GetTexLevelParameterfv( GLenum target, GLint level,
GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexLevelParameterfv( target, level, pname, params );
}
 
static void exec_GetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexLevelParameteriv( target, level, pname, params );
}
 
static void exec_GetTexParameterfv( GLenum target, GLenum pname,
GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexParameterfv( target, pname, params );
}
 
static void exec_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetTexParameteriv( target, pname, params );
}
 
static GLboolean exec_IsEnabled( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->IsEnabled( cap );
}
 
static void exec_PixelStoref( GLenum pname, GLfloat param )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->PixelStoref( pname, param );
}
 
static void exec_PixelStorei( GLenum pname, GLint param )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->PixelStorei( pname, param );
}
 
static void exec_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->ReadPixels( x, y, width, height, format, type, pixels );
}
 
static GLint exec_RenderMode( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->RenderMode( mode );
}
 
static void exec_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->FeedbackBuffer( size, type, buffer );
}
 
static void exec_SelectBuffer( GLsizei size, GLuint *buffer )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->SelectBuffer( size, buffer );
}
 
static GLboolean exec_AreTexturesResident(GLsizei n, const GLuint *texName,
GLboolean *residences)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->AreTexturesResident( n, texName, residences);
}
 
static void exec_ColorPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->ColorPointer( size, type, stride, ptr);
}
 
static void exec_DeleteTextures( GLsizei n, const GLuint *texName)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->DeleteTextures( n, texName);
}
 
static void exec_DisableClientState( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->DisableClientState( cap );
}
 
static void exec_EdgeFlagPointer(GLsizei stride, const void *vptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->EdgeFlagPointer( stride, vptr);
}
 
static void exec_EnableClientState( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->EnableClientState( cap );
}
 
static void exec_GenTextures( GLsizei n, GLuint *texName )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GenTextures( n, texName );
}
 
static void exec_GetPointerv( GLenum pname, GLvoid **params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPointerv( pname, params );
}
 
static void exec_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->IndexPointer( type, stride, ptr);
}
 
static void exec_InterleavedArrays(GLenum format, GLsizei stride,
const GLvoid *pointer)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->InterleavedArrays( format, stride, pointer);
}
 
static GLboolean exec_IsTexture( GLuint texture )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
return ctx->Exec->IsTexture( texture );
}
 
static void exec_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->NormalPointer( type, stride, ptr );
}
 
static void exec_PopClientAttrib(void)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->PopClientAttrib();
}
 
static void exec_PushClientAttrib(GLbitfield mask)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->PushClientAttrib( mask);
}
 
static void exec_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->TexCoordPointer( size, type, stride, ptr);
}
 
static void exec_GetCompressedTexImageARB(GLenum target, GLint level,
GLvoid *img)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetCompressedTexImageARB( target, level, img);
}
 
static void exec_VertexPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->VertexPointer( size, type, stride, ptr);
}
 
static void exec_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat,
GLint x, GLint y, GLsizei width)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->CopyConvolutionFilter1D( target, internalFormat, x, y, width);
}
 
static void exec_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat,
GLint x, GLint y, GLsizei width,
GLsizei height)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->CopyConvolutionFilter2D( target, internalFormat, x, y, width,
height);
}
 
static void exec_GetColorTable( GLenum target, GLenum format,
GLenum type, GLvoid *data )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetColorTable( target, format, type, data );
}
 
static void exec_GetColorTableParameterfv( GLenum target, GLenum pname,
GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetColorTableParameterfv( target, pname, params );
}
 
static void exec_GetColorTableParameteriv( GLenum target, GLenum pname,
GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetColorTableParameteriv( target, pname, params );
}
 
static void exec_GetConvolutionFilter(GLenum target, GLenum format, GLenum type,
GLvoid *image)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetConvolutionFilter( target, format, type, image);
}
 
static void exec_GetConvolutionParameterfv(GLenum target, GLenum pname,
GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetConvolutionParameterfv( target, pname, params);
}
 
static void exec_GetConvolutionParameteriv(GLenum target, GLenum pname,
GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetConvolutionParameteriv( target, pname, params);
}
 
static void exec_GetHistogram(GLenum target, GLboolean reset, GLenum format,
GLenum type, GLvoid *values)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetHistogram( target, reset, format, type, values);
}
 
static void exec_GetHistogramParameterfv(GLenum target, GLenum pname,
GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetHistogramParameterfv( target, pname, params);
}
 
static void exec_GetHistogramParameteriv(GLenum target, GLenum pname,
GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetHistogramParameteriv( target, pname, params);
}
 
static void exec_GetMinmax(GLenum target, GLboolean reset, GLenum format,
GLenum type, GLvoid *values)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMinmax( target, reset, format, type, values);
}
 
static void exec_GetMinmaxParameterfv(GLenum target, GLenum pname,
GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMinmaxParameterfv( target, pname, params);
}
 
static void exec_GetMinmaxParameteriv(GLenum target, GLenum pname,
GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetMinmaxParameteriv( target, pname, params);
}
 
static void exec_GetSeparableFilter(GLenum target, GLenum format, GLenum type,
GLvoid *row, GLvoid *column, GLvoid *span)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetSeparableFilter( target, format, type, row, column, span);
}
 
static void exec_SeparableFilter2D(GLenum target, GLenum internalFormat,
GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *row,
const GLvoid *column)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->SeparableFilter2D( target, internalFormat, width, height, format,
type, row, column);
}
 
static void exec_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPixelTexGenParameterivSGIS( target, value);
}
 
static void exec_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->GetPixelTexGenParameterfvSGIS( target, value);
}
 
static void exec_ColorPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->ColorPointerEXT( size, type, stride, count, ptr);
}
 
static void exec_EdgeFlagPointerEXT(GLsizei stride, GLsizei count,
const GLboolean *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->EdgeFlagPointerEXT( stride, count, ptr);
}
 
static void exec_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->IndexPointerEXT( type, stride, count, ptr);
}
 
static void exec_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->NormalPointerEXT( type, stride, count, ptr);
}
 
static void exec_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->TexCoordPointerEXT( size, type, stride, count, ptr);
}
 
static void exec_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->VertexPointerEXT( size, type, stride, count, ptr);
}
 
static void exec_LockArraysEXT(GLint first, GLsizei count)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->LockArraysEXT( first, count);
}
 
static void exec_UnlockArraysEXT( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->UnlockArraysEXT( );
}
 
static void exec_ResizeBuffersMESA( void )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->ResizeBuffersMESA( );
}
 
 
static void exec_ClientActiveTextureARB( GLenum target )
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->ClientActiveTextureARB(target);
}
 
static void exec_SecondaryColorPointerEXT(GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->SecondaryColorPointerEXT( size, type, stride, ptr);
}
 
static void exec_FogCoordPointerEXT(GLenum type, GLsizei stride,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->FogCoordPointerEXT( type, stride, ptr);
}
 
/* GL_EXT_multi_draw_arrays */
static void exec_MultiDrawArraysEXT(GLenum mode, GLint *first,
GLsizei *count, GLsizei primcount)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->MultiDrawArraysEXT( mode, first, count, primcount );
}
 
/* GL_EXT_multi_draw_arrays */
static void exec_MultiDrawElementsEXT(GLenum mode, const GLsizei *count,
GLenum type, const GLvoid **indices,
GLsizei primcount)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_VERTICES(ctx, 0);
ctx->Exec->MultiDrawElementsEXT(mode, count, type, indices, primcount);
}
 
 
 
/*
* Assign all the pointers in <table> to point to Mesa's display list
* building functions.
*
* This does not include any of the tnl functions - they are
* initialized from _mesa_init_api_defaults and from the active vtxfmt
* struct.
*/
void
_mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize )
{
_mesa_init_no_op_table(table, tableSize);
 
_mesa_loopback_init_api_table( table, GL_TRUE );
 
/* GL 1.0 */
table->Accum = save_Accum;
table->AlphaFunc = save_AlphaFunc;
table->Bitmap = save_Bitmap;
table->BlendFunc = save_BlendFunc;
table->CallList = _mesa_save_CallList;
table->CallLists = _mesa_save_CallLists;
table->Clear = save_Clear;
table->ClearAccum = save_ClearAccum;
table->ClearColor = save_ClearColor;
table->ClearDepth = save_ClearDepth;
table->ClearIndex = save_ClearIndex;
table->ClearStencil = save_ClearStencil;
table->ClipPlane = save_ClipPlane;
table->ColorMask = save_ColorMask;
table->ColorMaterial = save_ColorMaterial;
table->CopyPixels = save_CopyPixels;
table->CullFace = save_CullFace;
table->DeleteLists = _mesa_DeleteLists;
table->DepthFunc = save_DepthFunc;
table->DepthMask = save_DepthMask;
table->DepthRange = save_DepthRange;
table->Disable = save_Disable;
table->DrawBuffer = save_DrawBuffer;
table->DrawPixels = save_DrawPixels;
table->Enable = save_Enable;
table->EndList = _mesa_EndList;
table->EvalMesh1 = _mesa_save_EvalMesh1;
table->EvalMesh2 = _mesa_save_EvalMesh2;
table->Finish = exec_Finish;
table->Flush = exec_Flush;
table->Fogf = save_Fogf;
table->Fogfv = save_Fogfv;
table->Fogi = save_Fogi;
table->Fogiv = save_Fogiv;
table->FrontFace = save_FrontFace;
table->Frustum = save_Frustum;
table->GenLists = _mesa_GenLists;
table->GetBooleanv = exec_GetBooleanv;
table->GetClipPlane = exec_GetClipPlane;
table->GetDoublev = exec_GetDoublev;
table->GetError = exec_GetError;
table->GetFloatv = exec_GetFloatv;
table->GetIntegerv = exec_GetIntegerv;
table->GetLightfv = exec_GetLightfv;
table->GetLightiv = exec_GetLightiv;
table->GetMapdv = exec_GetMapdv;
table->GetMapfv = exec_GetMapfv;
table->GetMapiv = exec_GetMapiv;
table->GetMaterialfv = exec_GetMaterialfv;
table->GetMaterialiv = exec_GetMaterialiv;
table->GetPixelMapfv = exec_GetPixelMapfv;
table->GetPixelMapuiv = exec_GetPixelMapuiv;
table->GetPixelMapusv = exec_GetPixelMapusv;
table->GetPolygonStipple = exec_GetPolygonStipple;
table->GetString = exec_GetString;
table->GetTexEnvfv = exec_GetTexEnvfv;
table->GetTexEnviv = exec_GetTexEnviv;
table->GetTexGendv = exec_GetTexGendv;
table->GetTexGenfv = exec_GetTexGenfv;
table->GetTexGeniv = exec_GetTexGeniv;
table->GetTexImage = exec_GetTexImage;
table->GetTexLevelParameterfv = exec_GetTexLevelParameterfv;
table->GetTexLevelParameteriv = exec_GetTexLevelParameteriv;
table->GetTexParameterfv = exec_GetTexParameterfv;
table->GetTexParameteriv = exec_GetTexParameteriv;
table->Hint = save_Hint;
table->IndexMask = save_IndexMask;
table->InitNames = save_InitNames;
table->IsEnabled = exec_IsEnabled;
table->IsList = _mesa_IsList;
table->LightModelf = save_LightModelf;
table->LightModelfv = save_LightModelfv;
table->LightModeli = save_LightModeli;
table->LightModeliv = save_LightModeliv;
table->Lightf = save_Lightf;
table->Lightfv = save_Lightfv;
table->Lighti = save_Lighti;
table->Lightiv = save_Lightiv;
table->LineStipple = save_LineStipple;
table->LineWidth = save_LineWidth;
table->ListBase = save_ListBase;
table->LoadIdentity = save_LoadIdentity;
table->LoadMatrixd = save_LoadMatrixd;
table->LoadMatrixf = save_LoadMatrixf;
table->LoadName = save_LoadName;
table->LogicOp = save_LogicOp;
table->Map1d = save_Map1d;
table->Map1f = save_Map1f;
table->Map2d = save_Map2d;
table->Map2f = save_Map2f;
table->MapGrid1d = save_MapGrid1d;
table->MapGrid1f = save_MapGrid1f;
table->MapGrid2d = save_MapGrid2d;
table->MapGrid2f = save_MapGrid2f;
table->MatrixMode = save_MatrixMode;
table->MultMatrixd = save_MultMatrixd;
table->MultMatrixf = save_MultMatrixf;
table->NewList = save_NewList;
table->Ortho = save_Ortho;
table->PassThrough = save_PassThrough;
table->PixelMapfv = save_PixelMapfv;
table->PixelMapuiv = save_PixelMapuiv;
table->PixelMapusv = save_PixelMapusv;
table->PixelStoref = exec_PixelStoref;
table->PixelStorei = exec_PixelStorei;
table->PixelTransferf = save_PixelTransferf;
table->PixelTransferi = save_PixelTransferi;
table->PixelZoom = save_PixelZoom;
table->PointSize = save_PointSize;
table->PolygonMode = save_PolygonMode;
table->PolygonOffset = save_PolygonOffset;
table->PolygonStipple = save_PolygonStipple;
table->PopAttrib = save_PopAttrib;
table->PopMatrix = save_PopMatrix;
table->PopName = save_PopName;
table->PushAttrib = save_PushAttrib;
table->PushMatrix = save_PushMatrix;
table->PushName = save_PushName;
table->RasterPos2d = save_RasterPos2d;
table->RasterPos2dv = save_RasterPos2dv;
table->RasterPos2f = save_RasterPos2f;
table->RasterPos2fv = save_RasterPos2fv;
table->RasterPos2i = save_RasterPos2i;
table->RasterPos2iv = save_RasterPos2iv;
table->RasterPos2s = save_RasterPos2s;
table->RasterPos2sv = save_RasterPos2sv;
table->RasterPos3d = save_RasterPos3d;
table->RasterPos3dv = save_RasterPos3dv;
table->RasterPos3f = save_RasterPos3f;
table->RasterPos3fv = save_RasterPos3fv;
table->RasterPos3i = save_RasterPos3i;
table->RasterPos3iv = save_RasterPos3iv;
table->RasterPos3s = save_RasterPos3s;
table->RasterPos3sv = save_RasterPos3sv;
table->RasterPos4d = save_RasterPos4d;
table->RasterPos4dv = save_RasterPos4dv;
table->RasterPos4f = save_RasterPos4f;
table->RasterPos4fv = save_RasterPos4fv;
table->RasterPos4i = save_RasterPos4i;
table->RasterPos4iv = save_RasterPos4iv;
table->RasterPos4s = save_RasterPos4s;
table->RasterPos4sv = save_RasterPos4sv;
table->ReadBuffer = save_ReadBuffer;
table->ReadPixels = exec_ReadPixels;
table->RenderMode = exec_RenderMode;
table->Rotated = save_Rotated;
table->Rotatef = save_Rotatef;
table->Scaled = save_Scaled;
table->Scalef = save_Scalef;
table->Scissor = save_Scissor;
table->FeedbackBuffer = exec_FeedbackBuffer;
table->SelectBuffer = exec_SelectBuffer;
table->ShadeModel = save_ShadeModel;
table->StencilFunc = save_StencilFunc;
table->StencilMask = save_StencilMask;
table->StencilOp = save_StencilOp;
table->TexEnvf = save_TexEnvf;
table->TexEnvfv = save_TexEnvfv;
table->TexEnvi = save_TexEnvi;
table->TexEnviv = save_TexEnviv;
table->TexGend = save_TexGend;
table->TexGendv = save_TexGendv;
table->TexGenf = save_TexGenf;
table->TexGenfv = save_TexGenfv;
table->TexGeni = save_TexGeni;
table->TexGeniv = save_TexGeniv;
table->TexImage1D = save_TexImage1D;
table->TexImage2D = save_TexImage2D;
table->TexParameterf = save_TexParameterf;
table->TexParameterfv = save_TexParameterfv;
table->TexParameteri = save_TexParameteri;
table->TexParameteriv = save_TexParameteriv;
table->Translated = save_Translated;
table->Translatef = save_Translatef;
table->Viewport = save_Viewport;
 
/* GL 1.1 */
table->AreTexturesResident = exec_AreTexturesResident;
table->AreTexturesResidentEXT = exec_AreTexturesResident;
table->BindTexture = save_BindTexture;
table->ColorPointer = exec_ColorPointer;
table->CopyTexImage1D = save_CopyTexImage1D;
table->CopyTexImage2D = save_CopyTexImage2D;
table->CopyTexSubImage1D = save_CopyTexSubImage1D;
table->CopyTexSubImage2D = save_CopyTexSubImage2D;
table->DeleteTextures = exec_DeleteTextures;
table->DisableClientState = exec_DisableClientState;
table->EdgeFlagPointer = exec_EdgeFlagPointer;
table->EnableClientState = exec_EnableClientState;
table->GenTextures = exec_GenTextures;
table->GenTexturesEXT = exec_GenTextures;
table->GetPointerv = exec_GetPointerv;
table->IndexPointer = exec_IndexPointer;
table->InterleavedArrays = exec_InterleavedArrays;
table->IsTexture = exec_IsTexture;
table->IsTextureEXT = exec_IsTexture;
table->NormalPointer = exec_NormalPointer;
table->PopClientAttrib = exec_PopClientAttrib;
table->PrioritizeTextures = save_PrioritizeTextures;
table->PushClientAttrib = exec_PushClientAttrib;
table->TexCoordPointer = exec_TexCoordPointer;
table->TexSubImage1D = save_TexSubImage1D;
table->TexSubImage2D = save_TexSubImage2D;
table->VertexPointer = exec_VertexPointer;
 
/* GL 1.2 */
table->CopyTexSubImage3D = save_CopyTexSubImage3D;
table->TexImage3D = save_TexImage3D;
table->TexSubImage3D = save_TexSubImage3D;
 
/* GL_ARB_imaging */
/* Not all are supported */
table->BlendColor = save_BlendColor;
table->BlendEquation = save_BlendEquation;
table->ColorSubTable = save_ColorSubTable;
table->ColorTable = save_ColorTable;
table->ColorTableParameterfv = save_ColorTableParameterfv;
table->ColorTableParameteriv = save_ColorTableParameteriv;
table->ConvolutionFilter1D = save_ConvolutionFilter1D;
table->ConvolutionFilter2D = save_ConvolutionFilter2D;
table->ConvolutionParameterf = save_ConvolutionParameterf;
table->ConvolutionParameterfv = save_ConvolutionParameterfv;
table->ConvolutionParameteri = save_ConvolutionParameteri;
table->ConvolutionParameteriv = save_ConvolutionParameteriv;
table->CopyColorSubTable = save_CopyColorSubTable;
table->CopyColorTable = save_CopyColorTable;
table->CopyConvolutionFilter1D = exec_CopyConvolutionFilter1D;
table->CopyConvolutionFilter2D = exec_CopyConvolutionFilter2D;
table->GetColorTable = exec_GetColorTable;
table->GetColorTableEXT = exec_GetColorTable;
table->GetColorTableParameterfv = exec_GetColorTableParameterfv;
table->GetColorTableParameterfvEXT = exec_GetColorTableParameterfv;
table->GetColorTableParameteriv = exec_GetColorTableParameteriv;
table->GetColorTableParameterivEXT = exec_GetColorTableParameteriv;
table->GetConvolutionFilter = exec_GetConvolutionFilter;
table->GetConvolutionFilterEXT = exec_GetConvolutionFilter;
table->GetConvolutionParameterfv = exec_GetConvolutionParameterfv;
table->GetConvolutionParameterfvEXT = exec_GetConvolutionParameterfv;
table->GetConvolutionParameteriv = exec_GetConvolutionParameteriv;
table->GetConvolutionParameterivEXT = exec_GetConvolutionParameteriv;
table->GetHistogram = exec_GetHistogram;
table->GetHistogramEXT = exec_GetHistogram;
table->GetHistogramParameterfv = exec_GetHistogramParameterfv;
table->GetHistogramParameterfvEXT = exec_GetHistogramParameterfv;
table->GetHistogramParameteriv = exec_GetHistogramParameteriv;
table->GetHistogramParameterivEXT = exec_GetHistogramParameteriv;
table->GetMinmax = exec_GetMinmax;
table->GetMinmaxEXT = exec_GetMinmax;
table->GetMinmaxParameterfv = exec_GetMinmaxParameterfv;
table->GetMinmaxParameterfvEXT = exec_GetMinmaxParameterfv;
table->GetMinmaxParameteriv = exec_GetMinmaxParameteriv;
table->GetMinmaxParameterivEXT = exec_GetMinmaxParameteriv;
table->GetSeparableFilter = exec_GetSeparableFilter;
table->GetSeparableFilterEXT = exec_GetSeparableFilter;
table->Histogram = save_Histogram;
table->Minmax = save_Minmax;
table->ResetHistogram = save_ResetHistogram;
table->ResetMinmax = save_ResetMinmax;
table->SeparableFilter2D = exec_SeparableFilter2D;
 
/* 2. GL_EXT_blend_color */
#if 0
table->BlendColorEXT = save_BlendColorEXT;
#endif
 
/* 3. GL_EXT_polygon_offset */
table->PolygonOffsetEXT = save_PolygonOffsetEXT;
 
/* 6. GL_EXT_texture3d */
#if 0
table->CopyTexSubImage3DEXT = save_CopyTexSubImage3D;
table->TexImage3DEXT = save_TexImage3DEXT;
table->TexSubImage3DEXT = save_TexSubImage3D;
#endif
 
/* 15. GL_SGIX_pixel_texture */
table->PixelTexGenSGIX = save_PixelTexGenSGIX;
 
/* 15. GL_SGIS_pixel_texture */
table->PixelTexGenParameteriSGIS = save_PixelTexGenParameteriSGIS;
table->PixelTexGenParameterfSGIS = save_PixelTexGenParameterfSGIS;
table->PixelTexGenParameterivSGIS = save_PixelTexGenParameterivSGIS;
table->PixelTexGenParameterfvSGIS = save_PixelTexGenParameterfvSGIS;
table->GetPixelTexGenParameterivSGIS = exec_GetPixelTexGenParameterivSGIS;
table->GetPixelTexGenParameterfvSGIS = exec_GetPixelTexGenParameterfvSGIS;
 
/* 30. GL_EXT_vertex_array */
table->ColorPointerEXT = exec_ColorPointerEXT;
table->EdgeFlagPointerEXT = exec_EdgeFlagPointerEXT;
table->IndexPointerEXT = exec_IndexPointerEXT;
table->NormalPointerEXT = exec_NormalPointerEXT;
table->TexCoordPointerEXT = exec_TexCoordPointerEXT;
table->VertexPointerEXT = exec_VertexPointerEXT;
 
/* 37. GL_EXT_blend_minmax */
#if 0
table->BlendEquationEXT = save_BlendEquationEXT;
#endif
 
/* 54. GL_EXT_point_parameters */
table->PointParameterfEXT = save_PointParameterfEXT;
table->PointParameterfvEXT = save_PointParameterfvEXT;
 
/* 78. GL_EXT_paletted_texture */
#if 0
table->ColorTableEXT = save_ColorTable;
table->ColorSubTableEXT = save_ColorSubTable;
#endif
table->GetColorTableEXT = exec_GetColorTable;
table->GetColorTableParameterfvEXT = exec_GetColorTableParameterfv;
table->GetColorTableParameterivEXT = exec_GetColorTableParameteriv;
 
/* 97. GL_EXT_compiled_vertex_array */
table->LockArraysEXT = exec_LockArraysEXT;
table->UnlockArraysEXT = exec_UnlockArraysEXT;
 
/* 145. GL_EXT_secondary_color */
table->SecondaryColorPointerEXT = exec_SecondaryColorPointerEXT;
 
/* 148. GL_EXT_multi_draw_arrays */
table->MultiDrawArraysEXT = exec_MultiDrawArraysEXT;
table->MultiDrawElementsEXT = exec_MultiDrawElementsEXT;
 
/* 149. GL_EXT_fog_coord */
table->FogCoordPointerEXT = exec_FogCoordPointerEXT;
 
/* 173. GL_EXT_blend_func_separate */
table->BlendFuncSeparateEXT = save_BlendFuncSeparateEXT;
 
/* 196. GL_MESA_resize_buffers */
table->ResizeBuffersMESA = exec_ResizeBuffersMESA;
 
/* 197. GL_MESA_window_pos */
table->WindowPos2dMESA = save_WindowPos2dMESA;
table->WindowPos2dvMESA = save_WindowPos2dvMESA;
table->WindowPos2fMESA = save_WindowPos2fMESA;
table->WindowPos2fvMESA = save_WindowPos2fvMESA;
table->WindowPos2iMESA = save_WindowPos2iMESA;
table->WindowPos2ivMESA = save_WindowPos2ivMESA;
table->WindowPos2sMESA = save_WindowPos2sMESA;
table->WindowPos2svMESA = save_WindowPos2svMESA;
table->WindowPos3dMESA = save_WindowPos3dMESA;
table->WindowPos3dvMESA = save_WindowPos3dvMESA;
table->WindowPos3fMESA = save_WindowPos3fMESA;
table->WindowPos3fvMESA = save_WindowPos3fvMESA;
table->WindowPos3iMESA = save_WindowPos3iMESA;
table->WindowPos3ivMESA = save_WindowPos3ivMESA;
table->WindowPos3sMESA = save_WindowPos3sMESA;
table->WindowPos3svMESA = save_WindowPos3svMESA;
table->WindowPos4dMESA = save_WindowPos4dMESA;
table->WindowPos4dvMESA = save_WindowPos4dvMESA;
table->WindowPos4fMESA = save_WindowPos4fMESA;
table->WindowPos4fvMESA = save_WindowPos4fvMESA;
table->WindowPos4iMESA = save_WindowPos4iMESA;
table->WindowPos4ivMESA = save_WindowPos4ivMESA;
table->WindowPos4sMESA = save_WindowPos4sMESA;
table->WindowPos4svMESA = save_WindowPos4svMESA;
 
#if FEATURE_NV_vertex_program
/* 233. GL_NV_vertex_program */
/* The following commands DO NOT go into display lists:
* AreProgramsResidentNV, IsProgramNV, GenProgramsNV, DeleteProgramsNV,
* VertexAttribPointerNV, GetProgram*, GetVertexAttrib*
*/
table->BindProgramNV = save_BindProgramNV;
table->DeleteProgramsNV = _mesa_DeleteProgramsNV;
table->ExecuteProgramNV = save_ExecuteProgramNV;
table->GenProgramsNV = _mesa_GenProgramsNV;
table->AreProgramsResidentNV = _mesa_AreProgramsResidentNV;
table->RequestResidentProgramsNV = _mesa_RequestResidentProgramsNV;
table->GetProgramParameterfvNV = _mesa_GetProgramParameterfvNV;
table->GetProgramParameterdvNV = _mesa_GetProgramParameterdvNV;
table->GetProgramivNV = _mesa_GetProgramivNV;
table->GetProgramStringNV = _mesa_GetProgramStringNV;
table->GetTrackMatrixivNV = _mesa_GetTrackMatrixivNV;
table->GetVertexAttribdvNV = _mesa_GetVertexAttribdvNV;
table->GetVertexAttribfvNV = _mesa_GetVertexAttribfvNV;
table->GetVertexAttribivNV = _mesa_GetVertexAttribivNV;
table->GetVertexAttribPointervNV = _mesa_GetVertexAttribPointervNV;
table->IsProgramNV = _mesa_IsProgramNV;
table->LoadProgramNV = _mesa_LoadProgramNV;
table->ProgramParameter4dNV = save_ProgramParameter4dNV;
table->ProgramParameter4dvNV = save_ProgramParameter4dvNV;
table->ProgramParameter4fNV = save_ProgramParameter4fNV;
table->ProgramParameter4fvNV = save_ProgramParameter4fvNV;
table->ProgramParameters4dvNV = save_ProgramParameters4dvNV;
table->ProgramParameters4fvNV = save_ProgramParameters4fvNV;
table->TrackMatrixNV = save_TrackMatrixNV;
table->VertexAttribPointerNV = _mesa_VertexAttribPointerNV;
#endif
 
/* 262. GL_NV_point_sprite */
table->PointParameteriNV = save_PointParameteriNV;
table->PointParameterivNV = save_PointParameterivNV;
 
/* 268. GL_EXT_stencil_two_side */
table->ActiveStencilFaceEXT = save_ActiveStencilFaceEXT;
 
/* ARB 1. GL_ARB_multitexture */
table->ActiveTextureARB = save_ActiveTextureARB;
table->ClientActiveTextureARB = exec_ClientActiveTextureARB;
 
/* ARB 3. GL_ARB_transpose_matrix */
table->LoadTransposeMatrixdARB = save_LoadTransposeMatrixdARB;
table->LoadTransposeMatrixfARB = save_LoadTransposeMatrixfARB;
table->MultTransposeMatrixdARB = save_MultTransposeMatrixdARB;
table->MultTransposeMatrixfARB = save_MultTransposeMatrixfARB;
 
/* ARB 5. GL_ARB_multisample */
table->SampleCoverageARB = save_SampleCoverageARB;
 
/* ARB 12. GL_ARB_texture_compression */
table->CompressedTexImage3DARB = save_CompressedTexImage3DARB;
table->CompressedTexImage2DARB = save_CompressedTexImage2DARB;
table->CompressedTexImage1DARB = save_CompressedTexImage1DARB;
table->CompressedTexSubImage3DARB = save_CompressedTexSubImage3DARB;
table->CompressedTexSubImage2DARB = save_CompressedTexSubImage2DARB;
table->CompressedTexSubImage1DARB = save_CompressedTexSubImage1DARB;
table->GetCompressedTexImageARB = exec_GetCompressedTexImageARB;
 
/* ARB 14. GL_ARB_point_parameters */
/* re-use EXT_point_parameters functions */
 
/* ARB 25. GL_ARB_window_pos */
/* re-use MESA_window_pos functions */
}
 
 
 
/***
*** Debugging code
***/
static const char *enum_string( GLenum k )
{
return _mesa_lookup_enum_by_nr( k );
}
 
 
/*
* Print the commands in a display list. For debugging only.
* TODO: many commands aren't handled yet.
*/
static void print_list( GLcontext *ctx, GLuint list )
{
Node *n;
GLboolean done;
 
if (!glIsList(list)) {
_mesa_printf("%u is not a display list ID\n", list);
return;
}
 
n = (Node *) _mesa_HashLookup(ctx->Shared->DisplayList, list);
 
_mesa_printf("START-LIST %u, address %p\n", list, (void*)n );
 
done = n ? GL_FALSE : GL_TRUE;
while (!done) {
OpCode opcode = n[0].opcode;
GLint i = (GLint) n[0].opcode - (GLint) OPCODE_DRV_0;
 
if (i >= 0 && i < (GLint) ctx->listext.nr_opcodes) {
ctx->listext.opcode[i].print(ctx, &n[1]);
n += ctx->listext.opcode[i].size;
}
else {
switch (opcode) {
case OPCODE_ACCUM:
_mesa_printf("accum %s %g\n", enum_string(n[1].e), n[2].f );
break;
case OPCODE_BITMAP:
_mesa_printf("Bitmap %d %d %g %g %g %g %p\n", n[1].i, n[2].i,
n[3].f, n[4].f, n[5].f, n[6].f, (void *) n[7].data );
break;
case OPCODE_CALL_LIST:
_mesa_printf("CallList %d\n", (int) n[1].ui );
break;
case OPCODE_CALL_LIST_OFFSET:
_mesa_printf("CallList %d + offset %u = %u\n", (int) n[1].ui,
ctx->List.ListBase, ctx->List.ListBase + n[1].ui );
break;
case OPCODE_COLOR_TABLE_PARAMETER_FV:
_mesa_printf("ColorTableParameterfv %s %s %f %f %f %f\n",
enum_string(n[1].e), enum_string(n[2].e),
n[3].f, n[4].f, n[5].f, n[6].f);
break;
case OPCODE_COLOR_TABLE_PARAMETER_IV:
_mesa_printf("ColorTableParameteriv %s %s %d %d %d %d\n",
enum_string(n[1].e), enum_string(n[2].e),
n[3].i, n[4].i, n[5].i, n[6].i);
break;
case OPCODE_DISABLE:
_mesa_printf("Disable %s\n", enum_string(n[1].e));
break;
case OPCODE_ENABLE:
_mesa_printf("Enable %s\n", enum_string(n[1].e));
break;
case OPCODE_FRUSTUM:
_mesa_printf("Frustum %g %g %g %g %g %g\n",
n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f );
break;
case OPCODE_LINE_STIPPLE:
_mesa_printf("LineStipple %d %x\n", n[1].i, (int) n[2].us );
break;
case OPCODE_LOAD_IDENTITY:
_mesa_printf("LoadIdentity\n");
break;
case OPCODE_LOAD_MATRIX:
_mesa_printf("LoadMatrix\n");
_mesa_printf(" %8f %8f %8f %8f\n",
n[1].f, n[5].f, n[9].f, n[13].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[2].f, n[6].f, n[10].f, n[14].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[3].f, n[7].f, n[11].f, n[15].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[4].f, n[8].f, n[12].f, n[16].f);
break;
case OPCODE_MULT_MATRIX:
_mesa_printf("MultMatrix (or Rotate)\n");
_mesa_printf(" %8f %8f %8f %8f\n",
n[1].f, n[5].f, n[9].f, n[13].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[2].f, n[6].f, n[10].f, n[14].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[3].f, n[7].f, n[11].f, n[15].f);
_mesa_printf(" %8f %8f %8f %8f\n",
n[4].f, n[8].f, n[12].f, n[16].f);
break;
case OPCODE_ORTHO:
_mesa_printf("Ortho %g %g %g %g %g %g\n",
n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f );
break;
case OPCODE_POP_ATTRIB:
_mesa_printf("PopAttrib\n");
break;
case OPCODE_POP_MATRIX:
_mesa_printf("PopMatrix\n");
break;
case OPCODE_POP_NAME:
_mesa_printf("PopName\n");
break;
case OPCODE_PUSH_ATTRIB:
_mesa_printf("PushAttrib %x\n", n[1].bf );
break;
case OPCODE_PUSH_MATRIX:
_mesa_printf("PushMatrix\n");
break;
case OPCODE_PUSH_NAME:
_mesa_printf("PushName %d\n", (int) n[1].ui );
break;
case OPCODE_RASTER_POS:
_mesa_printf("RasterPos %g %g %g %g\n",
n[1].f, n[2].f,n[3].f,n[4].f);
break;
case OPCODE_ROTATE:
_mesa_printf("Rotate %g %g %g %g\n",
n[1].f, n[2].f, n[3].f, n[4].f );
break;
case OPCODE_SCALE:
_mesa_printf("Scale %g %g %g\n", n[1].f, n[2].f, n[3].f );
break;
case OPCODE_TRANSLATE:
_mesa_printf("Translate %g %g %g\n", n[1].f, n[2].f, n[3].f );
break;
case OPCODE_BIND_TEXTURE:
_mesa_printf("BindTexture %s %d\n",
_mesa_lookup_enum_by_nr(n[1].ui), n[2].ui);
break;
case OPCODE_SHADE_MODEL:
_mesa_printf("ShadeModel %s\n",
_mesa_lookup_enum_by_nr(n[1].ui));
break;
case OPCODE_MAP1:
_mesa_printf("Map1 %s %.3f %.3f %d %d\n",
_mesa_lookup_enum_by_nr(n[1].ui),
n[2].f, n[3].f, n[4].i, n[5].i);
break;
case OPCODE_MAP2:
_mesa_printf("Map2 %s %.3f %.3f %.3f %.3f %d %d %d %d\n",
_mesa_lookup_enum_by_nr(n[1].ui),
n[2].f, n[3].f, n[4].f, n[5].f,
n[6].i, n[7].i, n[8].i, n[9].i);
break;
case OPCODE_MAPGRID1:
_mesa_printf("MapGrid1 %d %.3f %.3f\n",
n[1].i, n[2].f, n[3].f);
break;
case OPCODE_MAPGRID2:
_mesa_printf("MapGrid2 %d %.3f %.3f, %d %.3f %.3f\n",
n[1].i, n[2].f, n[3].f,
n[4].i, n[5].f, n[6].f);
break;
case OPCODE_EVALMESH1:
_mesa_printf("EvalMesh1 %d %d\n", n[1].i, n[2].i);
break;
case OPCODE_EVALMESH2:
_mesa_printf("EvalMesh2 %d %d %d %d\n",
n[1].i, n[2].i, n[3].i, n[4].i);
break;
 
/*
* meta opcodes/commands
*/
case OPCODE_ERROR:
_mesa_printf("Error: %s %s\n",
enum_string(n[1].e), (const char *)n[2].data );
break;
case OPCODE_CONTINUE:
_mesa_printf("DISPLAY-LIST-CONTINUE\n");
n = (Node *) n[1].next;
break;
case OPCODE_END_OF_LIST:
_mesa_printf("END-LIST %u\n", list);
done = GL_TRUE;
break;
default:
if (opcode < 0 || opcode > OPCODE_END_OF_LIST) {
_mesa_printf("ERROR IN DISPLAY LIST: opcode = %d, address = %p\n",
opcode, (void*) n);
return;
}
else {
_mesa_printf("command %d, %u operands\n", opcode, InstSize[opcode]);
}
}
/* increment n to point to next compiled command */
if (opcode!=OPCODE_CONTINUE) {
n += InstSize[opcode];
}
}
}
}
 
 
 
/*
* Clients may call this function to help debug display list problems.
* This function is _ONLY_FOR_DEBUGGING_PURPOSES_. It may be removed,
* changed, or break in the future without notice.
*/
void mesa_print_display_list( GLuint list )
{
GET_CURRENT_CONTEXT(ctx);
print_list( ctx, list );
}
/shark/trunk/ports/mesa/src/points.h
0,0 → 1,51
/* $Id: points.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef POINTS_H
#define POINTS_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_PointSize( GLfloat size );
 
extern void
_mesa_PointParameteriNV( GLenum pname, GLint param );
 
extern void
_mesa_PointParameterivNV( GLenum pname, const GLint *params );
 
extern void
_mesa_PointParameterfEXT( GLenum pname, GLfloat param );
 
extern void
_mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params );
 
 
#endif
/shark/trunk/ports/mesa/src/texstore.h
0,0 → 1,179
/* $Id: texstore.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* Authors:
* Brian Paul
*/
 
 
#ifndef TEXSTORE_H
#define TEXSTORE_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
GLenum baseInternalFormat,
const struct gl_texture_format *texDestFormat,
GLvoid *texDestAddr,
GLint srcWidth, GLint srcHeight, GLint srcDepth,
GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
GLint dstRowStride, GLint dstImageStride,
GLenum srcFormat, GLenum srcType,
const GLvoid *srcAddr,
const struct gl_pixelstore_attrib *srcPacking);
 
 
extern void
_mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint width,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint width, GLint height,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_compressed_teximage1d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
extern void
_mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
extern void
_mesa_store_compressed_teximage3d(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint depth,
GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern void
_mesa_store_compressed_texsubimage1d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLsizei width,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
extern void
_mesa_store_compressed_texsubimage2d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
extern void
_mesa_store_compressed_texsubimage3d(GLcontext *ctx, GLenum target,
GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
 
 
extern GLboolean
_mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat, GLenum format, GLenum type,
GLint width, GLint height, GLint depth, GLint border);
 
 
extern void
_mesa_generate_mipmap(GLcontext *ctx, GLenum target,
const struct gl_texture_unit *texUnit,
struct gl_texture_object *texObj);
 
#endif
/shark/trunk/ports/mesa/src/image.c
0,0 → 1,3943
/* $Id: image.c,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "image.h"
#include "imports.h"
#include "histogram.h"
#include "macros.h"
#include "mmath.h"
#include "pixel.h"
#include "mtypes.h"
 
 
/*
* These are the image packing parameters for Mesa's internal images.
* That is, _mesa_unpack_image() returns image data in this format.
* When we execute image commands (glDrawPixels, glTexImage, etc)
* from within display lists we have to be sure to set the current
* unpacking params to these values!
*/
const struct gl_pixelstore_attrib _mesa_native_packing = {
1, /* Alignment */
0, /* RowLength */
0, /* SkipPixels */
0, /* SkipRows */
0, /* ImageHeight */
0, /* SkipImages */
GL_FALSE, /* SwapBytes */
GL_FALSE, /* LsbFirst */
GL_FALSE, /* ClientStorage */
GL_FALSE /* Invert */
};
 
 
 
/*
* Flip the 8 bits in each byte of the given array.
*
* XXX try this trick to flip bytes someday:
* v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
* v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
* v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
*/
static void
flip_bytes( GLubyte *p, GLuint n )
{
register GLuint i, a, b;
 
for (i=0;i<n;i++) {
b = (GLuint) p[i]; /* words are often faster than bytes */
a = ((b & 0x01) << 7) |
((b & 0x02) << 5) |
((b & 0x04) << 3) |
((b & 0x08) << 1) |
((b & 0x10) >> 1) |
((b & 0x20) >> 3) |
((b & 0x40) >> 5) |
((b & 0x80) >> 7);
p[i] = (GLubyte) a;
}
}
 
 
/*
* Flip the order of the 2 bytes in each word in the given array.
*/
void
_mesa_swap2( GLushort *p, GLuint n )
{
register GLuint i;
 
for (i=0;i<n;i++) {
p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
}
}
 
 
 
/*
* Flip the order of the 4 bytes in each word in the given array.
*/
void
_mesa_swap4( GLuint *p, GLuint n )
{
register GLuint i, a, b;
 
for (i=0;i<n;i++) {
b = p[i];
a = (b >> 24)
| ((b >> 8) & 0xff00)
| ((b << 8) & 0xff0000)
| ((b << 24) & 0xff000000);
p[i] = a;
}
}
 
 
 
 
/*
* Return the size, in bytes, of the given GL datatype.
* Return 0 if GL_BITMAP.
* Return -1 if invalid type enum.
*/
GLint _mesa_sizeof_type( GLenum type )
{
switch (type) {
case GL_BITMAP:
return 0;
case GL_UNSIGNED_BYTE:
return sizeof(GLubyte);
case GL_BYTE:
return sizeof(GLbyte);
case GL_UNSIGNED_SHORT:
return sizeof(GLushort);
case GL_SHORT:
return sizeof(GLshort);
case GL_UNSIGNED_INT:
return sizeof(GLuint);
case GL_INT:
return sizeof(GLint);
case GL_FLOAT:
return sizeof(GLfloat);
default:
return -1;
}
}
 
 
/*
* Same as _mesa_sizeof_packed_type() but we also accept the
* packed pixel format datatypes.
*/
GLint _mesa_sizeof_packed_type( GLenum type )
{
switch (type) {
case GL_BITMAP:
return 0;
case GL_UNSIGNED_BYTE:
return sizeof(GLubyte);
case GL_BYTE:
return sizeof(GLbyte);
case GL_UNSIGNED_SHORT:
return sizeof(GLushort);
case GL_SHORT:
return sizeof(GLshort);
case GL_UNSIGNED_INT:
return sizeof(GLuint);
case GL_INT:
return sizeof(GLint);
case GL_FLOAT:
return sizeof(GLfloat);
case GL_UNSIGNED_BYTE_3_3_2:
return sizeof(GLubyte);
case GL_UNSIGNED_BYTE_2_3_3_REV:
return sizeof(GLubyte);
case GL_UNSIGNED_SHORT_5_6_5:
return sizeof(GLushort);
case GL_UNSIGNED_SHORT_5_6_5_REV:
return sizeof(GLushort);
case GL_UNSIGNED_SHORT_4_4_4_4:
return sizeof(GLushort);
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
return sizeof(GLushort);
case GL_UNSIGNED_SHORT_5_5_5_1:
return sizeof(GLushort);
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
return sizeof(GLushort);
case GL_UNSIGNED_INT_8_8_8_8:
return sizeof(GLuint);
case GL_UNSIGNED_INT_8_8_8_8_REV:
return sizeof(GLuint);
case GL_UNSIGNED_INT_10_10_10_2:
return sizeof(GLuint);
case GL_UNSIGNED_INT_2_10_10_10_REV:
return sizeof(GLuint);
case GL_UNSIGNED_SHORT_8_8_MESA:
case GL_UNSIGNED_SHORT_8_8_REV_MESA:
return sizeof(GLushort);
default:
return -1;
}
}
 
 
 
/*
* Return the number of components in a GL enum pixel type.
* Return -1 if bad format.
*/
GLint _mesa_components_in_format( GLenum format )
{
switch (format) {
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
case GL_STENCIL_INDEX:
case GL_DEPTH_COMPONENT:
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_LUMINANCE:
case GL_INTENSITY:
return 1;
case GL_LUMINANCE_ALPHA:
return 2;
case GL_RGB:
return 3;
case GL_RGBA:
return 4;
case GL_BGR:
return 3;
case GL_BGRA:
return 4;
case GL_ABGR_EXT:
return 4;
case GL_YCBCR_MESA:
return 2;
default:
return -1;
}
}
 
 
/*
* Return bytes per pixel for given format and type
* Return -1 if bad format or type.
*/
GLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
{
GLint comps = _mesa_components_in_format( format );
if (comps < 0)
return -1;
 
switch (type) {
case GL_BITMAP:
return 0; /* special case */
case GL_BYTE:
case GL_UNSIGNED_BYTE:
return comps * sizeof(GLubyte);
case GL_SHORT:
case GL_UNSIGNED_SHORT:
return comps * sizeof(GLshort);
case GL_INT:
case GL_UNSIGNED_INT:
return comps * sizeof(GLint);
case GL_FLOAT:
return comps * sizeof(GLfloat);
case GL_UNSIGNED_BYTE_3_3_2:
case GL_UNSIGNED_BYTE_2_3_3_REV:
if (format == GL_RGB || format == GL_BGR)
return sizeof(GLubyte);
else
return -1; /* error */
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_5_6_5_REV:
if (format == GL_RGB || format == GL_BGR)
return sizeof(GLushort);
else
return -1; /* error */
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
return sizeof(GLushort);
else
return -1;
case GL_UNSIGNED_INT_8_8_8_8:
case GL_UNSIGNED_INT_8_8_8_8_REV:
case GL_UNSIGNED_INT_10_10_10_2:
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
return sizeof(GLuint);
else
return -1;
case GL_UNSIGNED_SHORT_8_8_MESA:
case GL_UNSIGNED_SHORT_8_8_REV_MESA:
if (format == GL_YCBCR_MESA)
return sizeof(GLushort);
else
return -1;
default:
return -1;
}
}
 
 
/*
* Test if the given pixel format and type are legal.
* Return GL_TRUE for legal, GL_FALSE for illegal.
*/
GLboolean
_mesa_is_legal_format_and_type( GLenum format, GLenum type )
{
switch (format) {
case GL_COLOR_INDEX:
case GL_STENCIL_INDEX:
switch (type) {
case GL_BITMAP:
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
return GL_TRUE;
default:
return GL_FALSE;
}
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_INTENSITY:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
case GL_DEPTH_COMPONENT:
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
return GL_TRUE;
default:
return GL_FALSE;
}
case GL_RGB:
case GL_BGR:
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_UNSIGNED_BYTE_3_3_2:
case GL_UNSIGNED_BYTE_2_3_3_REV:
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_5_6_5_REV:
return GL_TRUE;
default:
return GL_FALSE;
}
case GL_RGBA:
case GL_BGRA:
case GL_ABGR_EXT:
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
case GL_FLOAT:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
case GL_UNSIGNED_INT_8_8_8_8:
case GL_UNSIGNED_INT_8_8_8_8_REV:
case GL_UNSIGNED_INT_10_10_10_2:
case GL_UNSIGNED_INT_2_10_10_10_REV:
return GL_TRUE;
default:
return GL_FALSE;
}
case GL_YCBCR_MESA:
if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
return GL_TRUE;
else
return GL_FALSE;
default:
; /* fall-through */
}
return GL_FALSE;
}
 
 
 
/*
* Return the address of a pixel in an image (actually a volume).
* Pixel unpacking/packing parameters are observed according to 'packing'.
* Input: image - start of image data
* width, height - size of image
* format - image format
* type - pixel component type
* packing - the pixelstore attributes
* img - which image in the volume (0 for 1D or 2D images)
* row, column - location of pixel in the image
* Return: address of pixel at (image,row,column) in image or NULL if error.
*/
GLvoid *
_mesa_image_address( const struct gl_pixelstore_attrib *packing,
const GLvoid *image, GLsizei width,
GLsizei height, GLenum format, GLenum type,
GLint img, GLint row, GLint column )
{
GLint alignment; /* 1, 2 or 4 */
GLint pixels_per_row;
GLint rows_per_image;
GLint skiprows;
GLint skippixels;
GLint skipimages; /* for 3-D volume images */
GLubyte *pixel_addr;
 
alignment = packing->Alignment;
if (packing->RowLength > 0) {
pixels_per_row = packing->RowLength;
}
else {
pixels_per_row = width;
}
if (packing->ImageHeight > 0) {
rows_per_image = packing->ImageHeight;
}
else {
rows_per_image = height;
}
skiprows = packing->SkipRows;
skippixels = packing->SkipPixels;
skipimages = packing->SkipImages;
 
if (type==GL_BITMAP) {
/* BITMAP data */
GLint comp_per_pixel; /* components per pixel */
GLint bytes_per_comp; /* bytes per component */
GLint bytes_per_row;
GLint bytes_per_image;
 
/* Compute bytes per component */
bytes_per_comp = _mesa_sizeof_packed_type( type );
if (bytes_per_comp<0) {
return NULL;
}
 
/* Compute number of components per pixel */
comp_per_pixel = _mesa_components_in_format( format );
if (comp_per_pixel<0 && type != GL_BITMAP) {
return NULL;
}
 
bytes_per_row = alignment
* CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
 
bytes_per_image = bytes_per_row * rows_per_image;
 
pixel_addr = (GLubyte *) image
+ (skipimages + img) * bytes_per_image
+ (skiprows + row) * bytes_per_row
+ (skippixels + column) / 8;
}
else {
/* Non-BITMAP data */
GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
GLint topOfImage;
 
bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
 
/* The pixel type and format should have been error checked earlier */
assert(bytes_per_pixel > 0);
 
bytes_per_row = pixels_per_row * bytes_per_pixel;
remainder = bytes_per_row % alignment;
if (remainder > 0)
bytes_per_row += (alignment - remainder);
 
ASSERT(bytes_per_row % alignment == 0);
 
bytes_per_image = bytes_per_row * rows_per_image;
 
if (packing->Invert) {
/* set pixel_addr to the last row */
topOfImage = bytes_per_row * (height - 1);
bytes_per_row = -bytes_per_row;
}
else {
topOfImage = 0;
}
 
/* compute final pixel address */
pixel_addr = (GLubyte *) image
+ (skipimages + img) * bytes_per_image
+ topOfImage
+ (skiprows + row) * bytes_per_row
+ (skippixels + column) * bytes_per_pixel;
}
 
return (GLvoid *) pixel_addr;
}
 
 
 
/*
* Compute the stride between image rows (in bytes) for the given
* pixel packing parameters and image width, format and type.
*/
GLint
_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
GLint width, GLenum format, GLenum type )
{
ASSERT(packing);
if (type == GL_BITMAP) {
/* BITMAP data */
GLint bytes;
if (packing->RowLength == 0) {
bytes = (width + 7) / 8;
}
else {
bytes = (packing->RowLength + 7) / 8;
}
if (packing->Invert) {
/* negate the bytes per row (negative row stride) */
bytes = -bytes;
}
return bytes;
}
else {
/* Non-BITMAP data */
const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
GLint bytesPerRow, remainder;
if (bytesPerPixel <= 0)
return -1; /* error */
if (packing->RowLength == 0) {
bytesPerRow = bytesPerPixel * width;
}
else {
bytesPerRow = bytesPerPixel * packing->RowLength;
}
remainder = bytesPerRow % packing->Alignment;
if (remainder > 0)
bytesPerRow += (packing->Alignment - remainder);
if (packing->Invert)
bytesPerRow = -bytesPerRow;
return bytesPerRow;
}
}
 
 
 
/*
* Compute the stride between images in a 3D texture (in bytes) for the given
* pixel packing parameters and image width, format and type.
*/
GLint
_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
GLint width, GLint height,
GLenum format, GLenum type )
{
ASSERT(packing);
ASSERT(type != GL_BITMAP);
 
{
const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
GLint bytesPerRow, bytesPerImage, remainder;
 
if (bytesPerPixel <= 0)
return -1; /* error */
if (packing->RowLength == 0) {
bytesPerRow = bytesPerPixel * width;
}
else {
bytesPerRow = bytesPerPixel * packing->RowLength;
}
remainder = bytesPerRow % packing->Alignment;
if (remainder > 0)
bytesPerRow += (packing->Alignment - remainder);
 
if (packing->ImageHeight == 0)
bytesPerImage = bytesPerRow * height;
else
bytesPerImage = bytesPerRow * packing->ImageHeight;
 
return bytesPerImage;
}
}
 
 
 
 
/*
* Unpack a 32x32 pixel polygon stipple from user memory using the
* current pixel unpack settings.
*/
void
_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
const struct gl_pixelstore_attrib *unpacking )
{
GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
if (ptrn) {
/* Convert pattern from GLubytes to GLuints and handle big/little
* endian differences
*/
GLubyte *p = ptrn;
GLint i;
for (i = 0; i < 32; i++) {
dest[i] = (p[0] << 24)
| (p[1] << 16)
| (p[2] << 8)
| (p[3] );
p += 4;
}
FREE(ptrn);
}
}
 
 
 
/*
* Pack polygon stipple into user memory given current pixel packing
* settings.
*/
void
_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
const struct gl_pixelstore_attrib *packing )
{
/* Convert pattern from GLuints to GLubytes to handle big/little
* endian differences.
*/
GLubyte ptrn[32*4];
GLint i;
for (i = 0; i < 32; i++) {
ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff);
}
 
_mesa_pack_bitmap(32, 32, ptrn, dest, packing);
}
 
 
/*
* Unpack bitmap data. Resulting data will be in most-significant-bit-first
* order with row alignment = 1 byte.
*/
GLvoid *
_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
const struct gl_pixelstore_attrib *packing )
{
GLint bytes, row, width_in_bytes;
GLubyte *buffer, *dst;
 
if (!pixels)
return NULL;
 
/* Alloc dest storage */
bytes = ((width + 7) / 8 * height);
buffer = (GLubyte *) MALLOC( bytes );
if (!buffer)
return NULL;
 
 
width_in_bytes = CEILING( width, 8 );
dst = buffer;
for (row = 0; row < height; row++) {
const GLubyte *src = (const GLubyte *)
_mesa_image_address(packing, pixels, width, height,
GL_COLOR_INDEX, GL_BITMAP, 0, row, 0);
if (!src) {
FREE(buffer);
return NULL;
}
 
if (packing->SkipPixels == 0) {
MEMCPY( dst, src, width_in_bytes );
if (packing->LsbFirst) {
flip_bytes( dst, width_in_bytes );
}
}
else {
/* handling SkipPixels is a bit tricky (no pun intended!) */
GLint i;
if (packing->LsbFirst) {
GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
GLubyte dstMask = 128;
const GLubyte *s = src;
GLubyte *d = dst;
*d = 0;
for (i = 0; i < width; i++) {
if (*s & srcMask) {
*d |= dstMask;
}
if (srcMask == 128) {
srcMask = 1;
s++;
}
else {
srcMask = srcMask << 1;
}
if (dstMask == 1) {
dstMask = 128;
d++;
*d = 0;
}
else {
dstMask = dstMask >> 1;
}
}
}
else {
GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
GLubyte dstMask = 128;
const GLubyte *s = src;
GLubyte *d = dst;
*d = 0;
for (i = 0; i < width; i++) {
if (*s & srcMask) {
*d |= dstMask;
}
if (srcMask == 1) {
srcMask = 128;
s++;
}
else {
srcMask = srcMask >> 1;
}
if (dstMask == 1) {
dstMask = 128;
d++;
*d = 0;
}
else {
dstMask = dstMask >> 1;
}
}
}
}
dst += width_in_bytes;
}
 
return buffer;
}
 
 
/*
* Pack bitmap data.
*/
void
_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
GLubyte *dest, const struct gl_pixelstore_attrib *packing )
{
GLint row, width_in_bytes;
const GLubyte *src;
 
if (!source)
return;
 
width_in_bytes = CEILING( width, 8 );
src = source;
for (row = 0; row < height; row++) {
GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest,
width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
if (!dst)
return;
 
if (packing->SkipPixels == 0) {
MEMCPY( dst, src, width_in_bytes );
if (packing->LsbFirst) {
flip_bytes( dst, width_in_bytes );
}
}
else {
/* handling SkipPixels is a bit tricky (no pun intended!) */
GLint i;
if (packing->LsbFirst) {
GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
GLubyte dstMask = 128;
const GLubyte *s = src;
GLubyte *d = dst;
*d = 0;
for (i = 0; i < width; i++) {
if (*s & srcMask) {
*d |= dstMask;
}
if (srcMask == 128) {
srcMask = 1;
s++;
}
else {
srcMask = srcMask << 1;
}
if (dstMask == 1) {
dstMask = 128;
d++;
*d = 0;
}
else {
dstMask = dstMask >> 1;
}
}
}
else {
GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
GLubyte dstMask = 128;
const GLubyte *s = src;
GLubyte *d = dst;
*d = 0;
for (i = 0; i < width; i++) {
if (*s & srcMask) {
*d |= dstMask;
}
if (srcMask == 1) {
srcMask = 128;
s++;
}
else {
srcMask = srcMask >> 1;
}
if (dstMask == 1) {
dstMask = 128;
d++;
*d = 0;
}
else {
dstMask = dstMask >> 1;
}
}
}
}
src += width_in_bytes;
}
}
 
 
 
/*
* Used to pack an array [][4] of RGBA GLchan colors as specified
* by the dstFormat, dstType and dstPacking. Used by glReadPixels,
* glGetConvolutionFilter(), etc.
*/
void
_mesa_pack_float_rgba_span( GLcontext *ctx,
GLuint n, CONST GLfloat rgbaIn[][4],
GLenum dstFormat, GLenum dstType,
GLvoid *dstAddr,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps )
{
const GLint comps = _mesa_components_in_format(dstFormat);
GLfloat luminance[MAX_WIDTH];
GLfloat (*rgba)[4];
GLuint i;
 
if (transferOps) {
/* make copy of incoming data */
DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4); /* mac 32k limitation */
CHECKARRAY(rgbaCopy, return); /* mac 32k limitation */
 
for (i = 0; i < n; i++) {
rgbaCopy[i][0] = rgbaIn[i][0];
rgbaCopy[i][1] = rgbaIn[i][1];
rgbaCopy[i][2] = rgbaIn[i][2];
rgbaCopy[i][3] = rgbaIn[i][3];
}
 
rgba = (GLfloat (*)[4]) rgbaCopy;
 
/* scale & bias */
if (transferOps & IMAGE_SCALE_BIAS_BIT) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
}
/* color map lookup */
if (transferOps & IMAGE_MAP_COLOR_BIT) {
_mesa_map_rgba( ctx, n, rgba );
}
/* GL_COLOR_TABLE lookup */
if (transferOps & IMAGE_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* convolution */
if (transferOps & IMAGE_CONVOLUTION_BIT) {
/* this has to be done in the calling code */
}
/* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.PostConvolutionScale[RCOMP],
ctx->Pixel.PostConvolutionScale[GCOMP],
ctx->Pixel.PostConvolutionScale[BCOMP],
ctx->Pixel.PostConvolutionScale[ACOMP],
ctx->Pixel.PostConvolutionBias[RCOMP],
ctx->Pixel.PostConvolutionBias[GCOMP],
ctx->Pixel.PostConvolutionBias[BCOMP],
ctx->Pixel.PostConvolutionBias[ACOMP]);
}
/* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
}
/* color matrix transform */
if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* update histogram count */
if (transferOps & IMAGE_HISTOGRAM_BIT) {
_mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
}
/* min/max here */
if (transferOps & IMAGE_MIN_MAX_BIT) {
_mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
if (ctx->MinMax.Sink) {
UNDEFARRAY(rgbaCopy); /* mac 32k limitation */
return;
}
}
UNDEFARRAY(rgbaCopy); /* mac 32k limitation */
}
else {
/* use incoming data, not a copy */
rgba = (GLfloat (*)[4]) rgbaIn;
}
 
/* XXX clamp rgba to [0,1]? */
 
 
if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
for (i = 0; i < n; i++) {
GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
#if CHAN_TYPE == GL_FLOAT
luminance[i] = sum;
#else
luminance[i] = CLAMP(sum, 0.0F, 1.0F);
#endif
}
}
 
/*
* Pack/store the pixels. Ugh! Lots of cases!!!
*/
switch (dstType) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UBYTE(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
}
break;
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
}
break;
case GL_BYTE:
{
GLbyte *dst = (GLbyte *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_BYTE(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
}
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLushort *dst = (GLushort *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_USHORT(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
}
break;
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n * comps);
}
}
break;
case GL_SHORT:
{
GLshort *dst = (GLshort *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_SHORT(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
}
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n * comps );
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint *dst = (GLuint *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_UINT(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
}
break;
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n * comps );
}
}
break;
case GL_INT:
{
GLint *dst = (GLint *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = FLOAT_TO_INT(luminance[i]);
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
}
break;
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n * comps );
}
}
break;
case GL_FLOAT:
{
GLfloat *dst = (GLfloat *) dstAddr;
switch (dstFormat) {
case GL_RED:
for (i=0;i<n;i++)
dst[i] = rgba[i][RCOMP];
break;
case GL_GREEN:
for (i=0;i<n;i++)
dst[i] = rgba[i][GCOMP];
break;
case GL_BLUE:
for (i=0;i<n;i++)
dst[i] = rgba[i][BCOMP];
break;
case GL_ALPHA:
for (i=0;i<n;i++)
dst[i] = rgba[i][ACOMP];
break;
case GL_LUMINANCE:
for (i=0;i<n;i++)
dst[i] = luminance[i];
break;
case GL_LUMINANCE_ALPHA:
for (i=0;i<n;i++) {
dst[i*2+0] = luminance[i];
dst[i*2+1] = rgba[i][ACOMP];
}
break;
case GL_RGB:
for (i=0;i<n;i++) {
dst[i*3+0] = rgba[i][RCOMP];
dst[i*3+1] = rgba[i][GCOMP];
dst[i*3+2] = rgba[i][BCOMP];
}
break;
case GL_RGBA:
for (i=0;i<n;i++) {
dst[i*4+0] = rgba[i][RCOMP];
dst[i*4+1] = rgba[i][GCOMP];
dst[i*4+2] = rgba[i][BCOMP];
dst[i*4+3] = rgba[i][ACOMP];
}
break;
case GL_BGR:
for (i=0;i<n;i++) {
dst[i*3+0] = rgba[i][BCOMP];
dst[i*3+1] = rgba[i][GCOMP];
dst[i*3+2] = rgba[i][RCOMP];
}
break;
case GL_BGRA:
for (i=0;i<n;i++) {
dst[i*4+0] = rgba[i][BCOMP];
dst[i*4+1] = rgba[i][GCOMP];
dst[i*4+2] = rgba[i][RCOMP];
dst[i*4+3] = rgba[i][ACOMP];
}
break;
case GL_ABGR_EXT:
for (i=0;i<n;i++) {
dst[i*4+0] = rgba[i][ACOMP];
dst[i*4+1] = rgba[i][BCOMP];
dst[i*4+2] = rgba[i][GCOMP];
dst[i*4+3] = rgba[i][RCOMP];
}
break;
default:
_mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n * comps );
}
}
break;
case GL_UNSIGNED_BYTE_3_3_2:
if (dstFormat == GL_RGB) {
GLubyte *dst = (GLubyte *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
| (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
| (((GLint) (rgba[i][BCOMP] * 3.0F)) );
}
}
break;
case GL_UNSIGNED_BYTE_2_3_3_REV:
if (dstFormat == GL_RGB) {
GLubyte *dst = (GLubyte *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) )
| (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
| (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5:
if (dstFormat == GL_RGB) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
| (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5)
| (((GLint) (rgba[i][BCOMP] * 31.0F)) );
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5_REV:
if (dstFormat == GL_RGB) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) )
| (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5)
| (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
if (dstFormat == GL_RGBA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][ACOMP] * 15.0F)) );
}
}
else if (dstFormat == GL_BGRA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][ACOMP] * 15.0F)) );
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
| (((GLint) (rgba[i][RCOMP] * 15.0F)) );
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
if (dstFormat == GL_RGBA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) )
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
}
}
else if (dstFormat == GL_BGRA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) )
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) )
| (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4)
| (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8)
| (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
}
}
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
if (dstFormat == GL_RGBA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6)
| (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1)
| (((GLint) (rgba[i][ACOMP] * 1.0F)) );
}
}
else if (dstFormat == GL_BGRA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6)
| (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1)
| (((GLint) (rgba[i][ACOMP] * 1.0F)) );
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
| (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6)
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1)
| (((GLint) (rgba[i][RCOMP] * 1.0F)) );
}
}
break;
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (dstFormat == GL_RGBA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) )
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5)
| (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
| (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15);
}
}
else if (dstFormat == GL_BGRA) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) )
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5)
| (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
| (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15);
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLushort *dst = (GLushort *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) )
| (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5)
| (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
| (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15);
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8:
if (dstFormat == GL_RGBA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][ACOMP] * 255.0F)) );
}
}
else if (dstFormat == GL_BGRA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][ACOMP] * 255.0F)) );
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
| (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][RCOMP] * 255.0F)) );
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8_REV:
if (dstFormat == GL_RGBA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) )
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
}
}
else if (dstFormat == GL_BGRA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) )
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) )
| (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8)
| (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
| (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
}
}
break;
case GL_UNSIGNED_INT_10_10_10_2:
if (dstFormat == GL_RGBA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
| (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2)
| (((GLuint) (rgba[i][ACOMP] * 3.0F)) );
}
}
else if (dstFormat == GL_BGRA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
| (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2)
| (((GLuint) (rgba[i][ACOMP] * 3.0F)) );
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
| (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2)
| (((GLuint) (rgba[i][RCOMP] * 3.0F)) );
}
}
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (dstFormat == GL_RGBA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) )
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
| (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
| (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30);
}
}
else if (dstFormat == GL_BGRA) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) )
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
| (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
| (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30);
}
}
else if (dstFormat == GL_ABGR_EXT) {
GLuint *dst = (GLuint *) dstAddr;
for (i=0;i<n;i++) {
dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) )
| (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
| (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
| (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30);
}
}
break;
default:
_mesa_problem(ctx, "bad type in _mesa_pack_float_rgba_span");
}
}
 
 
 
/*
* Pack the given RGBA span into client memory at 'dest' address
* in the given pixel format and type.
* Optionally apply the enabled pixel transfer ops.
* Pack into memory using the given packing params struct.
* This is used by glReadPixels and glGetTexImage?D()
* Input: ctx - the context
* n - number of pixels in the span
* rgba - the pixels
* format - dest packing format
* type - dest packing datatype
* destination - destination packing address
* packing - pixel packing parameters
* transferOps - bitmask of IMAGE_*_BIT operations to apply
*/
void
_mesa_pack_rgba_span( GLcontext *ctx,
GLuint n, CONST GLchan srcRgba[][4],
GLenum dstFormat, GLenum dstType,
GLvoid *dstAddr,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps)
{
ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0);
 
/* Test for optimized case first */
if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
/* common simple case */
MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
}
else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
/* common simple case */
GLuint i;
GLchan *dest = (GLchan *) dstAddr;
for (i = 0; i < n; i++) {
dest[0] = srcRgba[i][RCOMP];
dest[1] = srcRgba[i][GCOMP];
dest[2] = srcRgba[i][BCOMP];
dest += 3;
}
}
else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) {
/* common simple case */
GLuint i;
GLubyte *dest = (GLubyte *) dstAddr;
for (i = 0; i < n; i++) {
dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]);
dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]);
dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]);
dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]);
dest += 4;
}
}
else {
/* general solution */
GLuint i;
DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */
CHECKARRAY(rgba, return); /* mac 32k limitation */
 
assert(n <= MAX_WIDTH);
/* convert color components to floating point */
for (i=0;i<n;i++) {
rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
}
_mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba,
dstFormat, dstType, dstAddr,
dstPacking, transferOps);
UNDEFARRAY(rgba); /* mac 32k limitation */
}
}
 
 
#define SWAP2BYTE(VALUE) \
{ \
GLubyte *bytes = (GLubyte *) &(VALUE); \
GLubyte tmp = bytes[0]; \
bytes[0] = bytes[1]; \
bytes[1] = tmp; \
}
 
#define SWAP4BYTE(VALUE) \
{ \
GLubyte *bytes = (GLubyte *) &(VALUE); \
GLubyte tmp = bytes[0]; \
bytes[0] = bytes[3]; \
bytes[3] = tmp; \
tmp = bytes[1]; \
bytes[1] = bytes[2]; \
bytes[2] = tmp; \
}
 
 
static void
extract_uint_indexes(GLuint n, GLuint indexes[],
GLenum srcFormat, GLenum srcType, const GLvoid *src,
const struct gl_pixelstore_attrib *unpack )
{
assert(srcFormat == GL_COLOR_INDEX);
 
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT);
 
switch (srcType) {
case GL_BITMAP:
{
GLubyte *ubsrc = (GLubyte *) src;
if (unpack->LsbFirst) {
GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
GLuint i;
for (i = 0; i < n; i++) {
indexes[i] = (*ubsrc & mask) ? 1 : 0;
if (mask == 128) {
mask = 1;
ubsrc++;
}
else {
mask = mask << 1;
}
}
}
else {
GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
GLuint i;
for (i = 0; i < n; i++) {
indexes[i] = (*ubsrc & mask) ? 1 : 0;
if (mask == 1) {
mask = 128;
ubsrc++;
}
else {
mask = mask >> 1;
}
}
}
}
break;
case GL_UNSIGNED_BYTE:
{
GLuint i;
const GLubyte *s = (const GLubyte *) src;
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
break;
case GL_BYTE:
{
GLuint i;
const GLbyte *s = (const GLbyte *) src;
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
break;
case GL_UNSIGNED_SHORT:
{
GLuint i;
const GLushort *s = (const GLushort *) src;
if (unpack->SwapBytes) {
for (i = 0; i < n; i++) {
GLushort value = s[i];
SWAP2BYTE(value);
indexes[i] = value;
}
}
else {
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
}
break;
case GL_SHORT:
{
GLuint i;
const GLshort *s = (const GLshort *) src;
if (unpack->SwapBytes) {
for (i = 0; i < n; i++) {
GLshort value = s[i];
SWAP2BYTE(value);
indexes[i] = value;
}
}
else {
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint i;
const GLuint *s = (const GLuint *) src;
if (unpack->SwapBytes) {
for (i = 0; i < n; i++) {
GLuint value = s[i];
SWAP4BYTE(value);
indexes[i] = value;
}
}
else {
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
}
break;
case GL_INT:
{
GLuint i;
const GLint *s = (const GLint *) src;
if (unpack->SwapBytes) {
for (i = 0; i < n; i++) {
GLint value = s[i];
SWAP4BYTE(value);
indexes[i] = value;
}
}
else {
for (i = 0; i < n; i++)
indexes[i] = s[i];
}
}
break;
case GL_FLOAT:
{
GLuint i;
const GLfloat *s = (const GLfloat *) src;
if (unpack->SwapBytes) {
for (i = 0; i < n; i++) {
GLfloat value = s[i];
SWAP4BYTE(value);
indexes[i] = (GLuint) value;
}
}
else {
for (i = 0; i < n; i++)
indexes[i] = (GLuint) s[i];
}
}
break;
default:
_mesa_problem(NULL, "bad srcType in extract_uint_indexes");
return;
}
}
 
 
 
/*
* This function extracts floating point RGBA values from arbitrary
* image data. srcFormat and srcType are the format and type parameters
* passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
*
* Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
* implements the "Conversion to floating point", "Conversion to RGB",
* and "Final Expansion to RGBA" operations.
*
* Args: n - number of pixels
* rgba - output colors
* srcFormat - format of incoming data
* srcType - datatype of incoming data
* src - source data pointer
* swapBytes - perform byteswapping of incoming data?
*/
static void
extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLenum srcFormat, GLenum srcType, const GLvoid *src,
GLboolean swapBytes)
{
GLint redIndex, greenIndex, blueIndex, alphaIndex;
GLint stride;
GLint rComp, bComp, gComp, aComp;
 
ASSERT(srcFormat == GL_RED ||
srcFormat == GL_GREEN ||
srcFormat == GL_BLUE ||
srcFormat == GL_ALPHA ||
srcFormat == GL_LUMINANCE ||
srcFormat == GL_LUMINANCE_ALPHA ||
srcFormat == GL_INTENSITY ||
srcFormat == GL_RGB ||
srcFormat == GL_BGR ||
srcFormat == GL_RGBA ||
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT);
 
ASSERT(srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT ||
srcType == GL_UNSIGNED_BYTE_3_3_2 ||
srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
srcType == GL_UNSIGNED_SHORT_5_6_5 ||
srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
srcType == GL_UNSIGNED_INT_8_8_8_8 ||
srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
srcType == GL_UNSIGNED_INT_10_10_10_2 ||
srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
 
rComp = gComp = bComp = aComp = -1;
 
switch (srcFormat) {
case GL_RED:
redIndex = 0;
greenIndex = blueIndex = alphaIndex = -1;
stride = 1;
break;
case GL_GREEN:
greenIndex = 0;
redIndex = blueIndex = alphaIndex = -1;
stride = 1;
break;
case GL_BLUE:
blueIndex = 0;
redIndex = greenIndex = alphaIndex = -1;
stride = 1;
break;
case GL_ALPHA:
redIndex = greenIndex = blueIndex = -1;
alphaIndex = 0;
stride = 1;
break;
case GL_LUMINANCE:
redIndex = greenIndex = blueIndex = 0;
alphaIndex = -1;
stride = 1;
break;
case GL_LUMINANCE_ALPHA:
redIndex = greenIndex = blueIndex = 0;
alphaIndex = 1;
stride = 2;
break;
case GL_INTENSITY:
redIndex = greenIndex = blueIndex = alphaIndex = 0;
stride = 1;
break;
case GL_RGB:
redIndex = 0;
greenIndex = 1;
blueIndex = 2;
alphaIndex = -1;
stride = 3;
break;
case GL_BGR:
redIndex = 2;
greenIndex = 1;
blueIndex = 0;
alphaIndex = -1;
stride = 3;
break;
case GL_RGBA:
redIndex = 0;
greenIndex = 1;
blueIndex = 2;
alphaIndex = 3;
rComp = 0;
gComp = 1;
bComp = 2;
aComp = 3;
stride = 4;
break;
case GL_BGRA:
redIndex = 2;
greenIndex = 1;
blueIndex = 0;
alphaIndex = 3;
rComp = 2;
gComp = 1;
bComp = 0;
aComp = 3;
stride = 4;
break;
case GL_ABGR_EXT:
redIndex = 3;
greenIndex = 2;
blueIndex = 1;
alphaIndex = 0;
rComp = 3;
gComp = 2;
bComp = 1;
aComp = 0;
stride = 4;
break;
default:
_mesa_problem(NULL, "bad srcFormat in extract float data");
return;
}
 
 
#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
if ((INDEX) < 0) { \
GLuint i; \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = DEFAULT; \
} \
} \
else if (swapBytes) { \
const TYPE *s = (const TYPE *) src; \
GLuint i; \
for (i = 0; i < n; i++) { \
TYPE value = s[INDEX]; \
if (sizeof(TYPE) == 2) { \
SWAP2BYTE(value); \
} \
else if (sizeof(TYPE) == 4) { \
SWAP4BYTE(value); \
} \
rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
s += stride; \
} \
} \
else { \
const TYPE *s = (const TYPE *) src; \
GLuint i; \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
s += stride; \
} \
}
 
switch (srcType) {
case GL_UNSIGNED_BYTE:
PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
break;
case GL_BYTE:
PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
break;
case GL_UNSIGNED_SHORT:
PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
break;
case GL_SHORT:
PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
break;
case GL_UNSIGNED_INT:
PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
break;
case GL_INT:
PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
break;
case GL_FLOAT:
PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
break;
case GL_UNSIGNED_BYTE_3_3_2:
{
const GLubyte *ubsrc = (const GLubyte *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLubyte p = ubsrc[i];
rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F);
rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F);
rgba[i][ACOMP] = 1.0F;
}
}
break;
case GL_UNSIGNED_BYTE_2_3_3_REV:
{
const GLubyte *ubsrc = (const GLubyte *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLubyte p = ubsrc[i];
rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F);
rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F);
rgba[i][ACOMP] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][ACOMP] = 1.0F;
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][ACOMP] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5_REV:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][ACOMP] = 1.0F;
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][ACOMP] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F);
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F);
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F);
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F);
}
}
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F);
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F);
}
}
break;
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F);
}
}
else {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F);
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8:
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff);
rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) );
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) );
rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff);
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8_REV:
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) );
rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff);
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff);
rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) );
}
}
break;
case GL_UNSIGNED_INT_10_10_10_2:
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
SWAP4BYTE(p);
rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F);
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F);
}
}
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
SWAP4BYTE(p);
rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F);
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F);
}
}
break;
default:
_mesa_problem(NULL, "bad srcType in extract float data");
break;
}
}
 
 
 
/*
* Unpack a row of color image data from a client buffer according to
* the pixel unpacking parameters.
* Return GLubyte values in the specified dest image format.
* This is (or will be) used by glDrawPixels and glTexImage?D().
* Input: ctx - the context
* n - number of pixels in the span
* dstFormat - format of destination color array
* dest - the destination color array
* srcFormat - source image format
* srcType - source image datatype
* source - source image pointer
* srcPacking - pixel unpacking parameters
* transferOps - bitmask of IMAGE_*_BIT values of operations to apply
*
* XXX perhaps expand this to process whole images someday.
*/
void
_mesa_unpack_chan_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLchan dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps )
{
ASSERT(dstFormat == GL_ALPHA ||
dstFormat == GL_LUMINANCE ||
dstFormat == GL_LUMINANCE_ALPHA ||
dstFormat == GL_INTENSITY ||
dstFormat == GL_RGB ||
dstFormat == GL_RGBA ||
dstFormat == GL_COLOR_INDEX);
 
ASSERT(srcFormat == GL_RED ||
srcFormat == GL_GREEN ||
srcFormat == GL_BLUE ||
srcFormat == GL_ALPHA ||
srcFormat == GL_LUMINANCE ||
srcFormat == GL_LUMINANCE_ALPHA ||
srcFormat == GL_INTENSITY ||
srcFormat == GL_RGB ||
srcFormat == GL_BGR ||
srcFormat == GL_RGBA ||
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT ||
srcFormat == GL_COLOR_INDEX);
 
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT ||
srcType == GL_UNSIGNED_BYTE_3_3_2 ||
srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
srcType == GL_UNSIGNED_SHORT_5_6_5 ||
srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
srcType == GL_UNSIGNED_INT_8_8_8_8 ||
srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
srcType == GL_UNSIGNED_INT_10_10_10_2 ||
srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
 
/* Try simple cases first */
if (transferOps == 0 ){
if (srcType == CHAN_TYPE) {
if (dstFormat == GL_RGBA) {
if (srcFormat == GL_RGBA) {
MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
return;
}
else if (srcFormat == GL_RGB) {
GLuint i;
const GLchan *src = (const GLchan *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
dst[3] = CHAN_MAX;
src += 3;
dst += 4;
}
return;
}
}
else if (dstFormat == GL_RGB) {
if (srcFormat == GL_RGB) {
MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
return;
}
else if (srcFormat == GL_RGBA) {
GLuint i;
const GLchan *src = (const GLchan *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
src += 4;
dst += 3;
}
return;
}
}
else if (dstFormat == srcFormat) {
GLint comps = _mesa_components_in_format(srcFormat);
assert(comps > 0);
MEMCPY( dest, source, n * comps * sizeof(GLchan) );
return;
}
}
/*
* Common situation, loading 8bit RGBA/RGB source images
* into 16/32 bit destination. (OSMesa16/32)
*/
else if (srcType == GL_UNSIGNED_BYTE) {
if (dstFormat == GL_RGBA) {
if (srcFormat == GL_RGB) {
GLuint i;
const GLubyte *src = (const GLubyte *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = UBYTE_TO_CHAN(src[0]);
dst[1] = UBYTE_TO_CHAN(src[1]);
dst[2] = UBYTE_TO_CHAN(src[2]);
dst[3] = CHAN_MAX;
src += 3;
dst += 4;
}
return;
}
else if (srcFormat == GL_RGBA) {
GLuint i;
const GLubyte *src = (const GLubyte *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = UBYTE_TO_CHAN(src[0]);
dst[1] = UBYTE_TO_CHAN(src[1]);
dst[2] = UBYTE_TO_CHAN(src[2]);
dst[3] = UBYTE_TO_CHAN(src[3]);
src += 4;
dst += 4;
}
return;
}
}
else if (dstFormat == GL_RGB) {
if (srcFormat == GL_RGB) {
GLuint i;
const GLubyte *src = (const GLubyte *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = UBYTE_TO_CHAN(src[0]);
dst[1] = UBYTE_TO_CHAN(src[1]);
dst[2] = UBYTE_TO_CHAN(src[2]);
src += 3;
dst += 3;
}
return;
}
else if (srcFormat == GL_RGBA) {
GLuint i;
const GLubyte *src = (const GLubyte *) source;
GLchan *dst = dest;
for (i = 0; i < n; i++) {
dst[0] = UBYTE_TO_CHAN(src[0]);
dst[1] = UBYTE_TO_CHAN(src[1]);
dst[2] = UBYTE_TO_CHAN(src[2]);
src += 4;
dst += 3;
}
return;
}
}
}
}
 
 
/* general solution begins here */
{
GLint dstComponents;
GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
GLint dstLuminanceIndex, dstIntensityIndex;
DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */
CHECKARRAY(rgba, return); /* mac 32k limitation */
 
dstComponents = _mesa_components_in_format( dstFormat );
/* source & dest image formats should have been error checked by now */
assert(dstComponents > 0);
 
/*
* Extract image data and convert to RGBA floats
*/
assert(n <= MAX_WIDTH);
if (srcFormat == GL_COLOR_INDEX) {
GLuint indexes[MAX_WIDTH];
extract_uint_indexes(n, indexes, srcFormat, srcType, source,
srcPacking);
 
if (dstFormat == GL_COLOR_INDEX
&& (transferOps & IMAGE_MAP_COLOR_BIT)) {
_mesa_map_ci(ctx, n, indexes);
}
if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
 
if (dstFormat == GL_COLOR_INDEX) {
/* convert to GLchan and return */
GLuint i;
for (i = 0; i < n; i++) {
dest[i] = (GLchan) (indexes[i] & 0xff);
}
UNDEFARRAY(rgba); /* mac 32k limitation */
return;
}
else {
/* Convert indexes to RGBA */
_mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
}
}
else {
extract_float_rgba(n, rgba, srcFormat, srcType, source,
srcPacking->SwapBytes);
 
/* scale and bias colors */
if (transferOps & IMAGE_SCALE_BIAS_BIT) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
}
/* color map lookup */
if (transferOps & IMAGE_MAP_COLOR_BIT) {
_mesa_map_rgba(ctx, n, rgba);
}
}
 
if (transferOps) {
/* GL_COLOR_TABLE lookup */
if (transferOps & IMAGE_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* convolution */
if (transferOps & IMAGE_CONVOLUTION_BIT) {
/* this has to be done in the calling code */
}
/* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.PostConvolutionScale[RCOMP],
ctx->Pixel.PostConvolutionScale[GCOMP],
ctx->Pixel.PostConvolutionScale[BCOMP],
ctx->Pixel.PostConvolutionScale[ACOMP],
ctx->Pixel.PostConvolutionBias[RCOMP],
ctx->Pixel.PostConvolutionBias[GCOMP],
ctx->Pixel.PostConvolutionBias[BCOMP],
ctx->Pixel.PostConvolutionBias[ACOMP]);
}
/* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
}
/* color matrix transform */
if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* update histogram count */
if (transferOps & IMAGE_HISTOGRAM_BIT) {
_mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
}
/* min/max here */
if (transferOps & IMAGE_MIN_MAX_BIT) {
_mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
}
}
 
/* clamp to [0,1] */
#if CHAN_TYPE != GL_FLOAT
{
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
}
}
#endif
 
/* Now determine which color channels we need to produce.
* And determine the dest index (offset) within each color tuple.
*/
switch (dstFormat) {
case GL_ALPHA:
dstAlphaIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_LUMINANCE:
dstLuminanceIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstIntensityIndex = -1;
break;
case GL_LUMINANCE_ALPHA:
dstLuminanceIndex = 0;
dstAlphaIndex = 1;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstIntensityIndex = -1;
break;
case GL_INTENSITY:
dstIntensityIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstLuminanceIndex = -1;
break;
case GL_RGB:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_RGBA:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = 3;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
default:
_mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
UNDEFARRAY(rgba); /* mac 32k limitation */
return;
}
 
 
/* Now return the GLchan data in the requested dstFormat */
 
if (dstRedIndex >= 0) {
GLchan *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
dst += dstComponents;
}
}
 
if (dstGreenIndex >= 0) {
GLchan *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
dst += dstComponents;
}
}
 
if (dstBlueIndex >= 0) {
GLchan *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
dst += dstComponents;
}
}
 
if (dstAlphaIndex >= 0) {
GLchan *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
dst += dstComponents;
}
}
 
if (dstIntensityIndex >= 0) {
GLchan *dst = dest;
GLuint i;
assert(dstIntensityIndex == 0);
assert(dstComponents == 1);
for (i = 0; i < n; i++) {
/* Intensity comes from red channel */
CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
}
}
 
if (dstLuminanceIndex >= 0) {
GLchan *dst = dest;
GLuint i;
assert(dstLuminanceIndex == 0);
for (i = 0; i < n; i++) {
/* Luminance comes from red channel */
CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
dst += dstComponents;
}
}
UNDEFARRAY(rgba); /* mac 32k limitation */
}
}
 
 
void
_mesa_unpack_float_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLfloat dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps, GLboolean clamp )
{
ASSERT(dstFormat == GL_ALPHA ||
dstFormat == GL_LUMINANCE ||
dstFormat == GL_LUMINANCE_ALPHA ||
dstFormat == GL_INTENSITY ||
dstFormat == GL_RGB ||
dstFormat == GL_RGBA ||
dstFormat == GL_COLOR_INDEX);
 
ASSERT(srcFormat == GL_RED ||
srcFormat == GL_GREEN ||
srcFormat == GL_BLUE ||
srcFormat == GL_ALPHA ||
srcFormat == GL_LUMINANCE ||
srcFormat == GL_LUMINANCE_ALPHA ||
srcFormat == GL_INTENSITY ||
srcFormat == GL_RGB ||
srcFormat == GL_BGR ||
srcFormat == GL_RGBA ||
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT ||
srcFormat == GL_COLOR_INDEX);
 
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT ||
srcType == GL_UNSIGNED_BYTE_3_3_2 ||
srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
srcType == GL_UNSIGNED_SHORT_5_6_5 ||
srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
srcType == GL_UNSIGNED_INT_8_8_8_8 ||
srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
srcType == GL_UNSIGNED_INT_10_10_10_2 ||
srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
 
/* general solution, no special cases, yet */
{
GLint dstComponents;
GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
GLint dstLuminanceIndex, dstIntensityIndex;
DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4); /* mac 32k limitation */
CHECKARRAY(rgba, return); /* mac 32k limitation */
 
dstComponents = _mesa_components_in_format( dstFormat );
/* source & dest image formats should have been error checked by now */
assert(dstComponents > 0);
 
/*
* Extract image data and convert to RGBA floats
*/
assert(n <= MAX_WIDTH);
if (srcFormat == GL_COLOR_INDEX) {
GLuint indexes[MAX_WIDTH];
extract_uint_indexes(n, indexes, srcFormat, srcType, source,
srcPacking);
 
if (dstFormat == GL_COLOR_INDEX
&& (transferOps & IMAGE_MAP_COLOR_BIT)) {
_mesa_map_ci(ctx, n, indexes);
}
if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
 
if (dstFormat == GL_COLOR_INDEX) {
/* convert to GLchan and return */
GLuint i;
for (i = 0; i < n; i++) {
dest[i] = (GLchan) (indexes[i] & 0xff);
}
UNDEFARRAY(rgba); /* mac 32k limitation */
return;
}
else {
/* Convert indexes to RGBA */
_mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
}
}
else {
extract_float_rgba(n, rgba, srcFormat, srcType, source,
srcPacking->SwapBytes);
 
/* scale and bias colors */
if (transferOps & IMAGE_SCALE_BIAS_BIT) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
}
/* color map lookup */
if (transferOps & IMAGE_MAP_COLOR_BIT) {
_mesa_map_rgba(ctx, n, rgba);
}
}
 
if (transferOps) {
/* GL_COLOR_TABLE lookup */
if (transferOps & IMAGE_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* convolution */
if (transferOps & IMAGE_CONVOLUTION_BIT) {
/* XXX to do */
}
/* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
_mesa_scale_and_bias_rgba(ctx, n, rgba,
ctx->Pixel.PostConvolutionScale[RCOMP],
ctx->Pixel.PostConvolutionScale[GCOMP],
ctx->Pixel.PostConvolutionScale[BCOMP],
ctx->Pixel.PostConvolutionScale[ACOMP],
ctx->Pixel.PostConvolutionBias[RCOMP],
ctx->Pixel.PostConvolutionBias[GCOMP],
ctx->Pixel.PostConvolutionBias[BCOMP],
ctx->Pixel.PostConvolutionBias[ACOMP]);
}
/* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
}
/* color matrix transform */
if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* update histogram count */
if (transferOps & IMAGE_HISTOGRAM_BIT) {
_mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
}
/* min/max here */
if (transferOps & IMAGE_MIN_MAX_BIT) {
_mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
}
}
 
/* clamp to [0,1] */
#if CHAN_TYPE != GL_FLOAT
if (clamp) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
}
}
#endif
 
/* Now determine which color channels we need to produce.
* And determine the dest index (offset) within each color tuple.
*/
switch (dstFormat) {
case GL_ALPHA:
dstAlphaIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_LUMINANCE:
dstLuminanceIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstIntensityIndex = -1;
break;
case GL_LUMINANCE_ALPHA:
dstLuminanceIndex = 0;
dstAlphaIndex = 1;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstIntensityIndex = -1;
break;
case GL_INTENSITY:
dstIntensityIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstLuminanceIndex = -1;
break;
case GL_RGB:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_RGBA:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = 3;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
default:
_mesa_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()");
UNDEFARRAY(rgba); /* mac 32k limitation */
return;
}
 
/* Now pack results in the requested dstFormat */
if (dstRedIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstRedIndex] = rgba[i][RCOMP];
dst += dstComponents;
}
}
 
if (dstGreenIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstGreenIndex] = rgba[i][GCOMP];
dst += dstComponents;
}
}
 
if (dstBlueIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstBlueIndex] = rgba[i][BCOMP];
dst += dstComponents;
}
}
 
if (dstAlphaIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstAlphaIndex] = rgba[i][ACOMP];
dst += dstComponents;
}
}
 
if (dstIntensityIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
assert(dstIntensityIndex == 0);
assert(dstComponents == 1);
for (i = 0; i < n; i++) {
/* Intensity comes from red channel */
dst[i] = rgba[i][RCOMP];
}
}
 
if (dstLuminanceIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
assert(dstLuminanceIndex == 0);
for (i = 0; i < n; i++) {
/* Luminance comes from red channel */
dst[0] = rgba[i][RCOMP];
dst += dstComponents;
}
}
UNDEFARRAY(rgba); /* mac 32k limitation */
}
}
 
 
 
 
/*
* Unpack a row of color index data from a client buffer according to
* the pixel unpacking parameters.
* This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
*
* Args: ctx - the context
* n - number of pixels
* dstType - destination datatype
* dest - destination array
* srcType - source pixel type
* source - source data pointer
* srcPacking - pixel unpacking parameters
* transferOps - the pixel transfer operations to apply
*/
void
_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps )
{
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT);
 
ASSERT(dstType == GL_UNSIGNED_BYTE ||
dstType == GL_UNSIGNED_SHORT ||
dstType == GL_UNSIGNED_INT);
 
 
transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
 
/*
* Try simple cases first
*/
if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
&& dstType == GL_UNSIGNED_BYTE) {
MEMCPY(dest, source, n * sizeof(GLubyte));
}
else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
&& dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
MEMCPY(dest, source, n * sizeof(GLuint));
}
else {
/*
* general solution
*/
GLuint indexes[MAX_WIDTH];
assert(n <= MAX_WIDTH);
 
extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
srcPacking);
 
if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
/* shift and offset indexes */
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
if (transferOps & IMAGE_MAP_COLOR_BIT) {
/* Apply lookup table */
_mesa_map_ci(ctx, n, indexes);
}
 
/* convert to dest type */
switch (dstType) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLubyte) (indexes[i] & 0xff);
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLuint *dst = (GLuint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLushort) (indexes[i] & 0xffff);
}
}
break;
case GL_UNSIGNED_INT:
MEMCPY(dest, indexes, n * sizeof(GLuint));
break;
default:
_mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
}
}
}
 
 
void
_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest, const GLuint *source,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps )
{
GLuint indexes[MAX_WIDTH];
 
ASSERT(n <= MAX_WIDTH);
 
transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
 
if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
/* make a copy of input */
MEMCPY(indexes, source, n * sizeof(GLuint));
if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
_mesa_shift_and_offset_ci( ctx, n, indexes);
}
if (transferOps & IMAGE_MAP_COLOR_BIT) {
_mesa_map_ci(ctx, n, indexes);
}
source = indexes;
}
 
switch (dstType) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
*dst++ = (GLubyte) source[i];
}
}
break;
case GL_BYTE:
{
GLbyte *dst = (GLbyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLbyte) source[i];
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLushort *dst = (GLushort *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLushort) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_SHORT:
{
GLshort *dst = (GLshort *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLshort) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint *dst = (GLuint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLuint) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_INT:
{
GLint *dst = (GLint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLint) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_FLOAT:
{
GLfloat *dst = (GLfloat *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLfloat) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
default:
_mesa_problem(ctx, "bad type in _mesa_pack_index_span");
}
}
 
 
 
/*
* Unpack a row of stencil data from a client buffer according to
* the pixel unpacking parameters.
* This is (or will be) used by glDrawPixels
*
* Args: ctx - the context
* n - number of pixels
* dstType - destination datatype
* dest - destination array
* srcType - source pixel type
* source - source data pointer
* srcPacking - pixel unpacking parameters
* transferOps - apply offset/bias/lookup ops?
*/
void
_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps )
{
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT);
 
ASSERT(dstType == GL_UNSIGNED_BYTE ||
dstType == GL_UNSIGNED_SHORT ||
dstType == GL_UNSIGNED_INT);
 
/* only shift and offset apply to stencil */
transferOps &= IMAGE_SHIFT_OFFSET_BIT;
 
/*
* Try simple cases first
*/
if (transferOps == 0 &&
srcType == GL_UNSIGNED_BYTE &&
dstType == GL_UNSIGNED_BYTE) {
MEMCPY(dest, source, n * sizeof(GLubyte));
}
else if (transferOps == 0 &&
srcType == GL_UNSIGNED_INT &&
dstType == GL_UNSIGNED_INT &&
!srcPacking->SwapBytes) {
MEMCPY(dest, source, n * sizeof(GLuint));
}
else {
/*
* general solution
*/
GLuint indexes[MAX_WIDTH];
assert(n <= MAX_WIDTH);
 
extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
srcPacking);
 
if (transferOps) {
if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
/* shift and offset indexes */
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
 
if (ctx->Pixel.MapStencilFlag) {
/* Apply stencil lookup table */
GLuint mask = ctx->Pixel.MapStoSsize - 1;
GLuint i;
for (i=0;i<n;i++) {
indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
}
}
}
 
/* convert to dest type */
switch (dstType) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLubyte) (indexes[i] & 0xff);
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLuint *dst = (GLuint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = (GLushort) (indexes[i] & 0xffff);
}
}
break;
case GL_UNSIGNED_INT:
MEMCPY(dest, indexes, n * sizeof(GLuint));
break;
default:
_mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
}
}
}
 
 
void
_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest, const GLstencil *source,
const struct gl_pixelstore_attrib *dstPacking )
{
GLstencil stencil[MAX_WIDTH];
 
ASSERT(n <= MAX_WIDTH);
 
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
ctx->Pixel.MapStencilFlag) {
/* make a copy of input */
MEMCPY(stencil, source, n * sizeof(GLstencil));
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
_mesa_shift_and_offset_stencil( ctx, n, stencil );
}
if (ctx->Pixel.MapStencilFlag) {
_mesa_map_stencil( ctx, n, stencil );
}
source = stencil;
}
 
switch (dstType) {
case GL_UNSIGNED_BYTE:
if (sizeof(GLstencil) == 8) {
MEMCPY( dest, source, n );
}
else {
GLubyte *dst = (GLubyte *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLubyte) source[i];
}
}
break;
case GL_BYTE:
if (sizeof(GLstencil) == 8) {
MEMCPY( dest, source, n );
}
else {
GLbyte *dst = (GLbyte *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLbyte) source[i];
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLushort *dst = (GLushort *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLushort) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_SHORT:
{
GLshort *dst = (GLshort *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLshort) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint *dst = (GLuint *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLuint) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_INT:
{
GLint *dst = (GLint *) dest;
GLuint i;
for (i=0;i<n;i++) {
*dst++ = (GLint) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_FLOAT:
{
GLfloat *dst = (GLfloat *) dest;
GLuint i;
for (i=0;i<n;i++) {
dst[i] = (GLfloat) source[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_BITMAP:
if (dstPacking->LsbFirst) {
GLubyte *dst = (GLubyte *) dest;
GLint shift = 0;
GLuint i;
for (i = 0; i < n; i++) {
if (shift == 0)
*dst = 0;
*dst |= ((source[i] != 0) << shift);
shift++;
if (shift == 8) {
shift = 0;
dst++;
}
}
}
else {
GLubyte *dst = (GLubyte *) dest;
GLint shift = 7;
GLuint i;
for (i = 0; i < n; i++) {
if (shift == 7)
*dst = 0;
*dst |= ((source[i] != 0) << shift);
shift--;
if (shift < 0) {
shift = 7;
dst++;
}
}
}
break;
default:
_mesa_problem(ctx, "bad type in _mesa_pack_index_span");
}
}
 
 
 
void
_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking )
{
switch (srcType) {
case GL_BYTE:
{
GLuint i;
const GLubyte *src = (const GLubyte *) source;
for (i = 0; i < n; i++) {
dest[i] = BYTE_TO_FLOAT(src[i]);
}
}
break;
case GL_UNSIGNED_BYTE:
{
GLuint i;
const GLubyte *src = (const GLubyte *) source;
for (i = 0; i < n; i++) {
dest[i] = UBYTE_TO_FLOAT(src[i]);
}
}
break;
case GL_SHORT:
{
GLuint i;
const GLshort *src = (const GLshort *) source;
for (i = 0; i < n; i++) {
dest[i] = SHORT_TO_FLOAT(src[i]);
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLuint i;
const GLushort *src = (const GLushort *) source;
for (i = 0; i < n; i++) {
dest[i] = USHORT_TO_FLOAT(src[i]);
}
}
break;
case GL_INT:
{
GLuint i;
const GLint *src = (const GLint *) source;
for (i = 0; i < n; i++) {
dest[i] = INT_TO_FLOAT(src[i]);
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint i;
const GLuint *src = (const GLuint *) source;
for (i = 0; i < n; i++) {
dest[i] = UINT_TO_FLOAT(src[i]);
}
}
break;
case GL_FLOAT:
MEMCPY(dest, source, n * sizeof(GLfloat));
break;
default:
_mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
return;
}
 
 
/* apply depth scale and bias and clamp to [0,1] */
if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
GLuint i;
for (i = 0; i < n; i++) {
GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
dest[i] = CLAMP(d, 0.0F, 1.0F);
}
}
}
 
 
 
/*
* Pack an array of depth values. The values are floats in [0,1].
*/
void
_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
GLenum dstType, const GLfloat *depthSpan,
const struct gl_pixelstore_attrib *dstPacking )
{
GLfloat depthCopy[MAX_WIDTH];
const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 ||
ctx->Pixel.DepthScale != 1.0;
 
ASSERT(n <= MAX_WIDTH);
 
if (bias_or_scale) {
GLuint i;
for (i = 0; i < n; i++) {
GLfloat d;
d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
depthCopy[i] = CLAMP(d, 0.0F, 1.0F);
}
depthSpan = depthCopy;
}
 
switch (dstType) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
}
}
break;
case GL_BYTE:
{
GLbyte *dst = (GLbyte *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
}
}
break;
case GL_UNSIGNED_SHORT:
{
GLushort *dst = (GLushort *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_USHORT( depthSpan[i] );
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_SHORT:
{
GLshort *dst = (GLshort *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
}
if (dstPacking->SwapBytes) {
_mesa_swap2( (GLushort *) dst, n );
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint *dst = (GLuint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_UINT( depthSpan[i] );
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_INT:
{
GLint *dst = (GLint *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = FLOAT_TO_INT( depthSpan[i] );
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
case GL_FLOAT:
{
GLfloat *dst = (GLfloat *) dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = depthSpan[i];
}
if (dstPacking->SwapBytes) {
_mesa_swap4( (GLuint *) dst, n );
}
}
break;
default:
_mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
}
}
 
 
 
 
/*
* Unpack image data. Apply byteswapping, byte flipping (bitmap).
* Return all image data in a contiguous block.
*/
void *
_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *unpack )
{
GLint bytesPerRow, compsPerRow;
GLboolean flipBytes, swap2, swap4;
 
if (!pixels)
return NULL; /* not necessarily an error */
 
if (width <= 0 || height <= 0 || depth <= 0)
return NULL; /* generate error later */
 
if (format == GL_BITMAP) {
bytesPerRow = (width + 7) >> 3;
flipBytes = !unpack->LsbFirst;
swap2 = swap4 = GL_FALSE;
compsPerRow = 0;
}
else {
const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
const GLint components = _mesa_components_in_format(format);
GLint bytesPerComp;
if (bytesPerPixel <= 0 || components <= 0)
return NULL; /* bad format or type. generate error later */
bytesPerRow = bytesPerPixel * width;
bytesPerComp = bytesPerPixel / components;
flipBytes = GL_FALSE;
swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
compsPerRow = components * width;
assert(compsPerRow >= width);
}
 
{
GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth);
GLubyte *dst;
GLint img, row;
if (!destBuffer)
return NULL; /* generate GL_OUT_OF_MEMORY later */
 
dst = destBuffer;
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
const GLvoid *src = _mesa_image_address(unpack, pixels,
width, height, format, type, img, row, 0);
MEMCPY(dst, src, bytesPerRow);
/* byte flipping/swapping */
if (flipBytes) {
flip_bytes((GLubyte *) dst, bytesPerRow);
}
else if (swap2) {
_mesa_swap2((GLushort*) dst, compsPerRow);
}
else if (swap4) {
_mesa_swap4((GLuint*) dst, compsPerRow);
}
dst += bytesPerRow;
}
}
return destBuffer;
}
}
/shark/trunk/ports/mesa/src/drawpix.h
0,0 → 1,56
/* $Id: drawpix.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef DRAWPIXELS_H
#define DRAWPIXELS_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_DrawPixels( GLsizei width, GLsizei height,
GLenum format, GLenum type, const GLvoid *pixels );
 
 
extern void
_mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid *pixels );
 
 
extern void
_mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
GLenum type );
 
 
extern void
_mesa_Bitmap( GLsizei width, GLsizei height,
GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
const GLubyte *bitmap );
 
 
#endif
/shark/trunk/ports/mesa/src/hash.c
0,0 → 1,323
/* $Id: hash.c,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "glthread.h"
#include "hash.h"
#include "context.h"
 
 
/**
* \file hash.c
* \brief Generic hash table. Used for display lists and texture objects.
* The hash functions are thread-safe.
* \author Brian Paul
* \note key=0 is illegal
*/
 
 
#define TABLE_SIZE 1023 /**< Size of lookup table/array */
 
/**
* An entry in the hash table. This struct is private to this file.
*/
struct HashEntry {
GLuint Key; /**< the entry's key */
void *Data; /**< the entry's data */
struct HashEntry *Next; /**< pointer to next entry */
};
 
/**
* The hashtable data structure. This is an opaque types (it's not
* defined in the .h file).
*/
struct _mesa_HashTable {
struct HashEntry *Table[TABLE_SIZE]; /**< the lookup table */
GLuint MaxKey; /**< highest key inserted so far */
_glthread_Mutex Mutex; /**< mutual exclusion lock */
};
 
 
 
/**
* Create a new hash table.
* \return pointer to a new, empty hash table.
*/
struct _mesa_HashTable *_mesa_NewHashTable(void)
{
struct _mesa_HashTable *table = CALLOC_STRUCT(_mesa_HashTable);
if (table) {
_glthread_INIT_MUTEX(table->Mutex);
}
return table;
}
 
 
 
/**
* Delete a hash table.
* \param table - the hash table to delete
*/
void _mesa_DeleteHashTable(struct _mesa_HashTable *table)
{
GLuint i;
assert(table);
for (i=0;i<TABLE_SIZE;i++) {
struct HashEntry *entry = table->Table[i];
while (entry) {
struct HashEntry *next = entry->Next;
FREE(entry);
entry = next;
}
}
FREE(table);
}
 
 
 
/**
* Lookup an entry in the hash table.
* \param table - the hash table
* \param key - the key
* \return pointer to user's data or NULL if key not in table
*/
void *_mesa_HashLookup(const struct _mesa_HashTable *table, GLuint key)
{
GLuint pos;
const struct HashEntry *entry;
 
assert(table);
assert(key);
 
pos = key & (TABLE_SIZE-1);
entry = table->Table[pos];
while (entry) {
if (entry->Key == key) {
return entry->Data;
}
entry = entry->Next;
}
return NULL;
}
 
 
 
/**
* Insert into the hash table. If an entry with this key already exists
* we'll replace the existing entry.
* \param table - the hash table
* \param key - the key (not zero)
* \param data - pointer to user data
*/
void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data)
{
/* search for existing entry with this key */
GLuint pos;
struct HashEntry *entry;
 
assert(table);
assert(key);
 
_glthread_LOCK_MUTEX(table->Mutex);
 
if (key > table->MaxKey)
table->MaxKey = key;
 
pos = key & (TABLE_SIZE-1);
entry = table->Table[pos];
while (entry) {
if (entry->Key == key) {
/* replace entry's data */
entry->Data = data;
_glthread_UNLOCK_MUTEX(table->Mutex);
return;
}
entry = entry->Next;
}
 
/* alloc and insert new table entry */
entry = MALLOC_STRUCT(HashEntry);
entry->Key = key;
entry->Data = data;
entry->Next = table->Table[pos];
table->Table[pos] = entry;
 
_glthread_UNLOCK_MUTEX(table->Mutex);
}
 
 
 
/**
* Remove an entry from the hash table.
* \param table - the hash table
* \param key - key of entry to remove
*/
void _mesa_HashRemove(struct _mesa_HashTable *table, GLuint key)
{
GLuint pos;
struct HashEntry *entry, *prev;
 
assert(table);
assert(key);
 
_glthread_LOCK_MUTEX(table->Mutex);
 
pos = key & (TABLE_SIZE-1);
prev = NULL;
entry = table->Table[pos];
while (entry) {
if (entry->Key == key) {
/* found it! */
if (prev) {
prev->Next = entry->Next;
}
else {
table->Table[pos] = entry->Next;
}
FREE(entry);
_glthread_UNLOCK_MUTEX(table->Mutex);
return;
}
prev = entry;
entry = entry->Next;
}
 
_glthread_UNLOCK_MUTEX(table->Mutex);
}
 
 
 
/**
* Get the key of the "first" entry in the hash table.
* This is used in the course of deleting all display lists when
* a context is destroyed.
* \param table - the hash table
* \return key for the "first" entry in the hash table.
*/
GLuint _mesa_HashFirstEntry(struct _mesa_HashTable *table)
{
GLuint pos;
assert(table);
_glthread_LOCK_MUTEX(table->Mutex);
for (pos=0; pos < TABLE_SIZE; pos++) {
if (table->Table[pos]) {
_glthread_UNLOCK_MUTEX(table->Mutex);
return table->Table[pos]->Key;
}
}
_glthread_UNLOCK_MUTEX(table->Mutex);
return 0;
}
 
 
 
/**
* Dump contents of hash table for debugging.
* \param table - the hash table
*/
void _mesa_HashPrint(const struct _mesa_HashTable *table)
{
GLuint i;
assert(table);
for (i=0;i<TABLE_SIZE;i++) {
const struct HashEntry *entry = table->Table[i];
while (entry) {
_mesa_debug(NULL, "%u %p\n", entry->Key, entry->Data);
entry = entry->Next;
}
}
}
 
 
 
/**
* Find a block of 'numKeys' adjacent unused hash keys.
* \param table - the hash table
* \param numKeys - number of keys needed
* \return Starting key of free block or 0 if failure
*/
GLuint _mesa_HashFindFreeKeyBlock(struct _mesa_HashTable *table, GLuint numKeys)
{
GLuint maxKey = ~((GLuint) 0);
_glthread_LOCK_MUTEX(table->Mutex);
if (maxKey - numKeys > table->MaxKey) {
/* the quick solution */
_glthread_UNLOCK_MUTEX(table->Mutex);
return table->MaxKey + 1;
}
else {
/* the slow solution */
GLuint freeCount = 0;
GLuint freeStart = 1;
GLuint key;
for (key=1; key!=maxKey; key++) {
if (_mesa_HashLookup(table, key)) {
/* darn, this key is already in use */
freeCount = 0;
freeStart = key+1;
}
else {
/* this key not in use, check if we've found enough */
freeCount++;
if (freeCount == numKeys) {
_glthread_UNLOCK_MUTEX(table->Mutex);
return freeStart;
}
}
}
/* cannot allocate a block of numKeys consecutive keys */
_glthread_UNLOCK_MUTEX(table->Mutex);
return 0;
}
}
 
 
 
#ifdef HASH_TEST_HARNESS
int main(int argc, char *argv[])
{
int a, b, c;
struct HashTable *t;
 
_mesa_printf("&a = %p\n", &a);
_mesa_printf("&b = %p\n", &b);
 
t = _mesa_NewHashTable();
_mesa_HashInsert(t, 501, &a);
_mesa_HashInsert(t, 10, &c);
_mesa_HashInsert(t, 0xfffffff8, &b);
_mesa_HashPrint(t);
 
_mesa_printf("Find 501: %p\n", _mesa_HashLookup(t,501));
_mesa_printf("Find 1313: %p\n", _mesa_HashLookup(t,1313));
_mesa_printf("Find block of 100: %d\n", _mesa_HashFindFreeKeyBlock(t, 100));
 
_mesa_DeleteHashTable(t);
 
return 0;
}
#endif
/shark/trunk/ports/mesa/src/dlist.h
0,0 → 1,109
/* $Id: dlist.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef DLIST_H
#define DLIST_H
 
 
#include "mtypes.h"
 
 
#define ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval) \
do { \
if (ctx->Driver.CurrentSavePrimitive <= GL_POLYGON || \
ctx->Driver.CurrentSavePrimitive == PRIM_INSIDE_UNKNOWN_PRIM) { \
_mesa_compile_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
return retval; \
} \
} while (0)
 
#define ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx) \
do { \
if (ctx->Driver.CurrentSavePrimitive <= GL_POLYGON || \
ctx->Driver.CurrentSavePrimitive == PRIM_INSIDE_UNKNOWN_PRIM) { \
_mesa_compile_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
return; \
} \
} while (0)
 
#define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx) \
do { \
ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx); \
FLUSH_VERTICES(ctx, 0); \
} while (0)
 
#define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval)\
do { \
ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval); \
FLUSH_VERTICES(ctx, 0); \
} while (0)
 
 
extern void _mesa_init_lists( void );
 
extern void _mesa_destroy_list( GLcontext *ctx, GLuint list );
 
extern void _mesa_CallList( GLuint list );
 
extern void _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists );
 
extern void _mesa_DeleteLists( GLuint list, GLsizei range );
 
extern void _mesa_EndList( void );
 
extern GLuint _mesa_GenLists( GLsizei range );
 
extern GLboolean _mesa_IsList( GLuint list );
 
extern void _mesa_ListBase( GLuint base );
 
extern void _mesa_NewList( GLuint list, GLenum mode );
 
extern void _mesa_init_dlist_table( struct _glapi_table *table,
GLuint tableSize );
 
extern void _mesa_save_error( GLcontext *ctx, GLenum error, const char *s );
 
extern void _mesa_compile_error( GLcontext *ctx, GLenum error, const char *s );
 
 
extern void *_mesa_alloc_instruction( GLcontext *ctx, int opcode, GLint sz );
 
extern int _mesa_alloc_opcode( GLcontext *ctx, GLuint sz,
void (*execute)( GLcontext *, void * ),
void (*destroy)( GLcontext *, void * ),
void (*print)( GLcontext *, void * ) );
 
extern void _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2,
GLint j1, GLint j2 );
extern void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 );
extern void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists );
extern void _mesa_save_CallList( GLuint list );
 
 
 
#endif
/shark/trunk/ports/mesa/src/blend.c
0,0 → 1,460
/* $Id: blend.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "blend.h"
#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "macros.h"
#include "mtypes.h"
 
 
void
_mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
{
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glBlendFunc %s %s\n",
_mesa_lookup_enum_by_nr(sfactor),
_mesa_lookup_enum_by_nr(dfactor));
 
switch (sfactor) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" );
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_SRC_ALPHA_SATURATE:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" );
return;
}
 
switch (dfactor) {
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" );
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" );
return;
}
 
if (ctx->Color.BlendDstRGB == dfactor &&
ctx->Color.BlendSrcRGB == sfactor &&
ctx->Color.BlendDstA == dfactor &&
ctx->Color.BlendSrcA == sfactor)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.BlendDstRGB = ctx->Color.BlendDstA = dfactor;
ctx->Color.BlendSrcRGB = ctx->Color.BlendSrcA = sfactor;
 
if (ctx->Driver.BlendFunc)
ctx->Driver.BlendFunc( ctx, sfactor, dfactor );
}
 
 
/* GL_EXT_blend_func_separate */
void
_mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorA, GLenum dfactorA )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glBlendFuncSeparate %s %s %s %s\n",
_mesa_lookup_enum_by_nr(sfactorRGB),
_mesa_lookup_enum_by_nr(dfactorRGB),
_mesa_lookup_enum_by_nr(sfactorA),
_mesa_lookup_enum_by_nr(dfactorA));
 
switch (sfactorRGB) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)");
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_SRC_ALPHA_SATURATE:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)");
return;
}
 
switch (dfactorRGB) {
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)");
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)");
return;
}
 
switch (sfactorA) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)");
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_SRC_ALPHA_SATURATE:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)");
return;
}
 
switch (dfactorA) {
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
if (!ctx->Extensions.NV_blend_square) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)");
return;
}
/* fall-through */
case GL_ZERO:
case GL_ONE:
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_CONSTANT_COLOR:
case GL_ONE_MINUS_CONSTANT_COLOR:
case GL_CONSTANT_ALPHA:
case GL_ONE_MINUS_CONSTANT_ALPHA:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)" );
return;
}
 
if (ctx->Color.BlendSrcRGB == sfactorRGB &&
ctx->Color.BlendDstRGB == dfactorRGB &&
ctx->Color.BlendSrcA == sfactorA &&
ctx->Color.BlendDstA == dfactorA)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
 
ctx->Color.BlendSrcRGB = sfactorRGB;
ctx->Color.BlendDstRGB = dfactorRGB;
ctx->Color.BlendSrcA = sfactorA;
ctx->Color.BlendDstA = dfactorA;
 
if (ctx->Driver.BlendFuncSeparate) {
(*ctx->Driver.BlendFuncSeparate)( ctx, sfactorRGB, dfactorRGB,
sfactorA, dfactorA );
}
}
 
 
 
/* This is really an extension function! */
void
_mesa_BlendEquation( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glBlendEquation %s\n",
_mesa_lookup_enum_by_nr(mode));
 
switch (mode) {
case GL_FUNC_ADD_EXT:
break;
case GL_MIN_EXT:
case GL_MAX_EXT:
if (!ctx->Extensions.EXT_blend_minmax &&
!ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
return;
}
break;
case GL_LOGIC_OP:
if (!ctx->Extensions.EXT_blend_logic_op) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
return;
}
break;
case GL_FUNC_SUBTRACT_EXT:
case GL_FUNC_REVERSE_SUBTRACT_EXT:
if (!ctx->Extensions.EXT_blend_subtract &&
!ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glBlendEquation" );
return;
}
 
if (ctx->Color.BlendEquation == mode)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.BlendEquation = mode;
 
/* This is needed to support 1.1's RGB logic ops AND
* 1.0's blending logicops.
*/
ctx->Color.ColorLogicOpEnabled = (mode==GL_LOGIC_OP &&
ctx->Color.BlendEnabled);
 
if (ctx->Driver.BlendEquation)
(*ctx->Driver.BlendEquation)( ctx, mode );
}
 
 
 
void
_mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
{
GLfloat tmp[4];
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
tmp[0] = CLAMP( red, 0.0F, 1.0F );
tmp[1] = CLAMP( green, 0.0F, 1.0F );
tmp[2] = CLAMP( blue, 0.0F, 1.0F );
tmp[3] = CLAMP( alpha, 0.0F, 1.0F );
 
if (TEST_EQ_4V(tmp, ctx->Color.BlendColor))
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
COPY_4FV( ctx->Color.BlendColor, tmp );
 
if (ctx->Driver.BlendColor)
(*ctx->Driver.BlendColor)(ctx, tmp);
}
 
 
void
_mesa_AlphaFunc( GLenum func, GLclampf ref )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (func) {
case GL_NEVER:
case GL_LESS:
case GL_EQUAL:
case GL_LEQUAL:
case GL_GREATER:
case GL_NOTEQUAL:
case GL_GEQUAL:
case GL_ALWAYS:
ref = CLAMP(ref, 0.0F, 1.0F);
 
if (ctx->Color.AlphaFunc == func && ctx->Color.AlphaRef == ref)
return; /* no change */
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.AlphaFunc = func;
ctx->Color.AlphaRef = ref;
 
if (ctx->Driver.AlphaFunc)
ctx->Driver.AlphaFunc(ctx, func, ref);
return;
 
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glAlphaFunc(func)" );
return;
}
}
 
 
void
_mesa_LogicOp( GLenum opcode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (opcode) {
case GL_CLEAR:
case GL_SET:
case GL_COPY:
case GL_COPY_INVERTED:
case GL_NOOP:
case GL_INVERT:
case GL_AND:
case GL_NAND:
case GL_OR:
case GL_NOR:
case GL_XOR:
case GL_EQUIV:
case GL_AND_REVERSE:
case GL_AND_INVERTED:
case GL_OR_REVERSE:
case GL_OR_INVERTED:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glLogicOp" );
return;
}
 
if (ctx->Color.LogicOp == opcode)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.LogicOp = opcode;
 
if (ctx->Driver.LogicOpcode)
ctx->Driver.LogicOpcode( ctx, opcode );
}
 
 
void
_mesa_IndexMask( GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Color.IndexMask == mask)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.IndexMask = mask;
 
if (ctx->Driver.IndexMask)
ctx->Driver.IndexMask( ctx, mask );
}
 
 
void
_mesa_ColorMask( GLboolean red, GLboolean green,
GLboolean blue, GLboolean alpha )
{
GET_CURRENT_CONTEXT(ctx);
GLubyte tmp[4];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glColorMask %d %d %d %d\n", red, green, blue, alpha);
 
/* Shouldn't have any information about channel depth in core mesa
* -- should probably store these as the native booleans:
*/
tmp[RCOMP] = red ? 0xff : 0x0;
tmp[GCOMP] = green ? 0xff : 0x0;
tmp[BCOMP] = blue ? 0xff : 0x0;
tmp[ACOMP] = alpha ? 0xff : 0x0;
 
if (TEST_EQ_4UBV(tmp, ctx->Color.ColorMask))
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
COPY_4UBV(ctx->Color.ColorMask, tmp);
 
if (ctx->Driver.ColorMask)
ctx->Driver.ColorMask( ctx, red, green, blue, alpha );
}
/shark/trunk/ports/mesa/src/attrib.c
0,0 → 1,1216
/* $Id: attrib.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "accum.h"
#include "attrib.h"
#include "blend.h"
#include "buffers.h"
#include "colormac.h"
#include "context.h"
#include "depth.h"
#include "enable.h"
#include "enums.h"
#include "fog.h"
#include "hint.h"
#include "light.h"
#include "lines.h"
#include "matrix.h"
#include "points.h"
#include "polygon.h"
#include "simple_list.h"
#include "stencil.h"
#include "texobj.h"
#include "texstate.h"
#include "mtypes.h"
#include "math/m_xform.h"
 
 
/*
* Allocate a new attribute state node. These nodes have a
* "kind" value and a pointer to a struct of state data.
*/
static struct gl_attrib_node *
new_attrib_node( GLbitfield kind )
{
struct gl_attrib_node *an = MALLOC_STRUCT(gl_attrib_node);
if (an) {
an->kind = kind;
}
return an;
}
 
 
void
_mesa_PushAttrib(GLbitfield mask)
{
struct gl_attrib_node *newnode;
struct gl_attrib_node *head;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glPushAttrib %x\n", (int) mask);
 
if (ctx->AttribStackDepth >= MAX_ATTRIB_STACK_DEPTH) {
_mesa_error( ctx, GL_STACK_OVERFLOW, "glPushAttrib" );
return;
}
 
/* Build linked list of attribute nodes which save all attribute */
/* groups specified by the mask. */
head = NULL;
 
if (mask & GL_ACCUM_BUFFER_BIT) {
struct gl_accum_attrib *attr;
attr = MALLOC_STRUCT( gl_accum_attrib );
MEMCPY( attr, &ctx->Accum, sizeof(struct gl_accum_attrib) );
newnode = new_attrib_node( GL_ACCUM_BUFFER_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_COLOR_BUFFER_BIT) {
struct gl_colorbuffer_attrib *attr;
attr = MALLOC_STRUCT( gl_colorbuffer_attrib );
MEMCPY( attr, &ctx->Color, sizeof(struct gl_colorbuffer_attrib) );
newnode = new_attrib_node( GL_COLOR_BUFFER_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_CURRENT_BIT) {
struct gl_current_attrib *attr;
FLUSH_CURRENT( ctx, 0 );
attr = MALLOC_STRUCT( gl_current_attrib );
MEMCPY( attr, &ctx->Current, sizeof(struct gl_current_attrib) );
newnode = new_attrib_node( GL_CURRENT_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_DEPTH_BUFFER_BIT) {
struct gl_depthbuffer_attrib *attr;
attr = MALLOC_STRUCT( gl_depthbuffer_attrib );
MEMCPY( attr, &ctx->Depth, sizeof(struct gl_depthbuffer_attrib) );
newnode = new_attrib_node( GL_DEPTH_BUFFER_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_ENABLE_BIT) {
struct gl_enable_attrib *attr;
GLuint i;
attr = MALLOC_STRUCT( gl_enable_attrib );
/* Copy enable flags from all other attributes into the enable struct. */
attr->AlphaTest = ctx->Color.AlphaEnabled;
attr->AutoNormal = ctx->Eval.AutoNormal;
attr->Blend = ctx->Color.BlendEnabled;
attr->ClipPlanes = ctx->Transform.ClipPlanesEnabled;
attr->ColorMaterial = ctx->Light.ColorMaterialEnabled;
attr->Convolution1D = ctx->Pixel.Convolution1DEnabled;
attr->Convolution2D = ctx->Pixel.Convolution2DEnabled;
attr->Separable2D = ctx->Pixel.Separable2DEnabled;
attr->CullFace = ctx->Polygon.CullFlag;
attr->DepthTest = ctx->Depth.Test;
attr->Dither = ctx->Color.DitherFlag;
attr->Fog = ctx->Fog.Enabled;
for (i=0;i<MAX_LIGHTS;i++) {
attr->Light[i] = ctx->Light.Light[i].Enabled;
}
attr->Lighting = ctx->Light.Enabled;
attr->LineSmooth = ctx->Line.SmoothFlag;
attr->LineStipple = ctx->Line.StippleFlag;
attr->Histogram = ctx->Pixel.HistogramEnabled;
attr->MinMax = ctx->Pixel.MinMaxEnabled;
attr->IndexLogicOp = ctx->Color.IndexLogicOpEnabled;
attr->ColorLogicOp = ctx->Color.ColorLogicOpEnabled;
attr->Map1Color4 = ctx->Eval.Map1Color4;
attr->Map1Index = ctx->Eval.Map1Index;
attr->Map1Normal = ctx->Eval.Map1Normal;
attr->Map1TextureCoord1 = ctx->Eval.Map1TextureCoord1;
attr->Map1TextureCoord2 = ctx->Eval.Map1TextureCoord2;
attr->Map1TextureCoord3 = ctx->Eval.Map1TextureCoord3;
attr->Map1TextureCoord4 = ctx->Eval.Map1TextureCoord4;
attr->Map1Vertex3 = ctx->Eval.Map1Vertex3;
attr->Map1Vertex4 = ctx->Eval.Map1Vertex4;
MEMCPY(attr->Map1Attrib, ctx->Eval.Map1Attrib, sizeof(ctx->Eval.Map1Attrib));
attr->Map2Color4 = ctx->Eval.Map2Color4;
attr->Map2Index = ctx->Eval.Map2Index;
attr->Map2Normal = ctx->Eval.Map2Normal;
attr->Map2TextureCoord1 = ctx->Eval.Map2TextureCoord1;
attr->Map2TextureCoord2 = ctx->Eval.Map2TextureCoord2;
attr->Map2TextureCoord3 = ctx->Eval.Map2TextureCoord3;
attr->Map2TextureCoord4 = ctx->Eval.Map2TextureCoord4;
attr->Map2Vertex3 = ctx->Eval.Map2Vertex3;
attr->Map2Vertex4 = ctx->Eval.Map2Vertex4;
MEMCPY(attr->Map2Attrib, ctx->Eval.Map2Attrib, sizeof(ctx->Eval.Map2Attrib));
attr->Normalize = ctx->Transform.Normalize;
attr->RasterPositionUnclipped = ctx->Transform.RasterPositionUnclipped;
attr->PixelTexture = ctx->Pixel.PixelTextureEnabled;
attr->PointSmooth = ctx->Point.SmoothFlag;
attr->PointSprite = ctx->Point.PointSprite;
attr->PolygonOffsetPoint = ctx->Polygon.OffsetPoint;
attr->PolygonOffsetLine = ctx->Polygon.OffsetLine;
attr->PolygonOffsetFill = ctx->Polygon.OffsetFill;
attr->PolygonSmooth = ctx->Polygon.SmoothFlag;
attr->PolygonStipple = ctx->Polygon.StippleFlag;
attr->RescaleNormals = ctx->Transform.RescaleNormals;
attr->Scissor = ctx->Scissor.Enabled;
attr->Stencil = ctx->Stencil.Enabled;
attr->MultisampleEnabled = ctx->Multisample.Enabled;
attr->SampleAlphaToCoverage = ctx->Multisample.SampleAlphaToCoverage;
attr->SampleAlphaToOne = ctx->Multisample.SampleAlphaToOne;
attr->SampleCoverage = ctx->Multisample.SampleCoverage;
attr->SampleCoverageInvert = ctx->Multisample.SampleCoverageInvert;
for (i=0; i<MAX_TEXTURE_UNITS; i++) {
attr->Texture[i] = ctx->Texture.Unit[i].Enabled;
attr->TexGen[i] = ctx->Texture.Unit[i].TexGenEnabled;
}
/* GL_NV_vertex_program */
attr->VertexProgram = ctx->VertexProgram.Enabled;
attr->VertexProgramPointSize = ctx->VertexProgram.PointSizeEnabled;
attr->VertexProgramTwoSide = ctx->VertexProgram.TwoSideEnabled;
newnode = new_attrib_node( GL_ENABLE_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_EVAL_BIT) {
struct gl_eval_attrib *attr;
attr = MALLOC_STRUCT( gl_eval_attrib );
MEMCPY( attr, &ctx->Eval, sizeof(struct gl_eval_attrib) );
newnode = new_attrib_node( GL_EVAL_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_FOG_BIT) {
struct gl_fog_attrib *attr;
attr = MALLOC_STRUCT( gl_fog_attrib );
MEMCPY( attr, &ctx->Fog, sizeof(struct gl_fog_attrib) );
newnode = new_attrib_node( GL_FOG_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_HINT_BIT) {
struct gl_hint_attrib *attr;
attr = MALLOC_STRUCT( gl_hint_attrib );
MEMCPY( attr, &ctx->Hint, sizeof(struct gl_hint_attrib) );
newnode = new_attrib_node( GL_HINT_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_LIGHTING_BIT) {
struct gl_light_attrib *attr;
FLUSH_CURRENT(ctx, 0); /* flush material changes */
attr = MALLOC_STRUCT( gl_light_attrib );
MEMCPY( attr, &ctx->Light, sizeof(struct gl_light_attrib) );
newnode = new_attrib_node( GL_LIGHTING_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_LINE_BIT) {
struct gl_line_attrib *attr;
attr = MALLOC_STRUCT( gl_line_attrib );
MEMCPY( attr, &ctx->Line, sizeof(struct gl_line_attrib) );
newnode = new_attrib_node( GL_LINE_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_LIST_BIT) {
struct gl_list_attrib *attr;
attr = MALLOC_STRUCT( gl_list_attrib );
MEMCPY( attr, &ctx->List, sizeof(struct gl_list_attrib) );
newnode = new_attrib_node( GL_LIST_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_PIXEL_MODE_BIT) {
struct gl_pixel_attrib *attr;
attr = MALLOC_STRUCT( gl_pixel_attrib );
MEMCPY( attr, &ctx->Pixel, sizeof(struct gl_pixel_attrib) );
newnode = new_attrib_node( GL_PIXEL_MODE_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_POINT_BIT) {
struct gl_point_attrib *attr;
attr = MALLOC_STRUCT( gl_point_attrib );
MEMCPY( attr, &ctx->Point, sizeof(struct gl_point_attrib) );
newnode = new_attrib_node( GL_POINT_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_POLYGON_BIT) {
struct gl_polygon_attrib *attr;
attr = MALLOC_STRUCT( gl_polygon_attrib );
MEMCPY( attr, &ctx->Polygon, sizeof(struct gl_polygon_attrib) );
newnode = new_attrib_node( GL_POLYGON_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_POLYGON_STIPPLE_BIT) {
GLuint *stipple;
stipple = (GLuint *) MALLOC( 32*sizeof(GLuint) );
MEMCPY( stipple, ctx->PolygonStipple, 32*sizeof(GLuint) );
newnode = new_attrib_node( GL_POLYGON_STIPPLE_BIT );
newnode->data = stipple;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_SCISSOR_BIT) {
struct gl_scissor_attrib *attr;
attr = MALLOC_STRUCT( gl_scissor_attrib );
MEMCPY( attr, &ctx->Scissor, sizeof(struct gl_scissor_attrib) );
newnode = new_attrib_node( GL_SCISSOR_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_STENCIL_BUFFER_BIT) {
struct gl_stencil_attrib *attr;
attr = MALLOC_STRUCT( gl_stencil_attrib );
MEMCPY( attr, &ctx->Stencil, sizeof(struct gl_stencil_attrib) );
newnode = new_attrib_node( GL_STENCIL_BUFFER_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_TEXTURE_BIT) {
struct gl_texture_attrib *attr;
GLuint u;
/* Bump the texture object reference counts so that they don't
* inadvertantly get deleted.
*/
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
ctx->Texture.Unit[u].Current1D->RefCount++;
ctx->Texture.Unit[u].Current2D->RefCount++;
ctx->Texture.Unit[u].Current3D->RefCount++;
ctx->Texture.Unit[u].CurrentCubeMap->RefCount++;
ctx->Texture.Unit[u].CurrentRect->RefCount++;
}
attr = MALLOC_STRUCT( gl_texture_attrib );
MEMCPY( attr, &ctx->Texture, sizeof(struct gl_texture_attrib) );
/* copy state of the currently bound texture objects */
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
_mesa_copy_texture_object(&attr->Unit[u].Saved1D,
attr->Unit[u].Current1D);
_mesa_copy_texture_object(&attr->Unit[u].Saved2D,
attr->Unit[u].Current2D);
_mesa_copy_texture_object(&attr->Unit[u].Saved3D,
attr->Unit[u].Current3D);
_mesa_copy_texture_object(&attr->Unit[u].SavedCubeMap,
attr->Unit[u].CurrentCubeMap);
_mesa_copy_texture_object(&attr->Unit[u].SavedRect,
attr->Unit[u].CurrentRect);
}
newnode = new_attrib_node( GL_TEXTURE_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_TRANSFORM_BIT) {
struct gl_transform_attrib *attr;
attr = MALLOC_STRUCT( gl_transform_attrib );
MEMCPY( attr, &ctx->Transform, sizeof(struct gl_transform_attrib) );
newnode = new_attrib_node( GL_TRANSFORM_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
if (mask & GL_VIEWPORT_BIT) {
struct gl_viewport_attrib *attr;
attr = MALLOC_STRUCT( gl_viewport_attrib );
MEMCPY( attr, &ctx->Viewport, sizeof(struct gl_viewport_attrib) );
newnode = new_attrib_node( GL_VIEWPORT_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
/* GL_ARB_multisample */
if (mask & GL_MULTISAMPLE_BIT_ARB) {
struct gl_multisample_attrib *attr;
attr = MALLOC_STRUCT( gl_multisample_attrib );
MEMCPY( attr, &ctx->Multisample, sizeof(struct gl_multisample_attrib) );
newnode = new_attrib_node( GL_MULTISAMPLE_BIT_ARB );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
ctx->AttribStack[ctx->AttribStackDepth] = head;
ctx->AttribStackDepth++;
}
 
 
 
static void
pop_enable_group(GLcontext *ctx, const struct gl_enable_attrib *enable)
{
GLuint i;
 
#define TEST_AND_UPDATE(VALUE, NEWVALUE, ENUM) \
if ((VALUE) != (NEWVALUE)) { \
_mesa_set_enable( ctx, ENUM, (NEWVALUE) ); \
}
 
TEST_AND_UPDATE(ctx->Color.AlphaEnabled, enable->AlphaTest, GL_ALPHA_TEST);
TEST_AND_UPDATE(ctx->Color.BlendEnabled, enable->Blend, GL_BLEND);
 
for (i=0;i<MAX_CLIP_PLANES;i++) {
const GLuint mask = 1 << i;
if ((ctx->Transform.ClipPlanesEnabled & mask) != (enable->ClipPlanes & mask))
_mesa_set_enable(ctx, (GLenum) (GL_CLIP_PLANE0 + i),
(GLboolean) ((enable->ClipPlanes & mask) ? GL_TRUE : GL_FALSE));
}
 
TEST_AND_UPDATE(ctx->Light.ColorMaterialEnabled, enable->ColorMaterial,
GL_COLOR_MATERIAL);
TEST_AND_UPDATE(ctx->Polygon.CullFlag, enable->CullFace, GL_CULL_FACE);
TEST_AND_UPDATE(ctx->Depth.Test, enable->DepthTest, GL_DEPTH_TEST);
TEST_AND_UPDATE(ctx->Color.DitherFlag, enable->Dither, GL_DITHER);
TEST_AND_UPDATE(ctx->Pixel.Convolution1DEnabled, enable->Convolution1D,
GL_CONVOLUTION_1D);
TEST_AND_UPDATE(ctx->Pixel.Convolution2DEnabled, enable->Convolution2D,
GL_CONVOLUTION_2D);
TEST_AND_UPDATE(ctx->Pixel.Separable2DEnabled, enable->Separable2D,
GL_SEPARABLE_2D);
TEST_AND_UPDATE(ctx->Fog.Enabled, enable->Fog, GL_FOG);
TEST_AND_UPDATE(ctx->Light.Enabled, enable->Lighting, GL_LIGHTING);
TEST_AND_UPDATE(ctx->Line.SmoothFlag, enable->LineSmooth, GL_LINE_SMOOTH);
TEST_AND_UPDATE(ctx->Line.StippleFlag, enable->LineStipple,
GL_LINE_STIPPLE);
TEST_AND_UPDATE(ctx->Color.IndexLogicOpEnabled, enable->IndexLogicOp,
GL_INDEX_LOGIC_OP);
TEST_AND_UPDATE(ctx->Color.ColorLogicOpEnabled, enable->ColorLogicOp,
GL_COLOR_LOGIC_OP);
 
TEST_AND_UPDATE(ctx->Eval.Map1Color4, enable->Map1Color4, GL_MAP1_COLOR_4);
TEST_AND_UPDATE(ctx->Eval.Map1Index, enable->Map1Index, GL_MAP1_INDEX);
TEST_AND_UPDATE(ctx->Eval.Map1Normal, enable->Map1Normal, GL_MAP1_NORMAL);
TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord1, enable->Map1TextureCoord1,
GL_MAP1_TEXTURE_COORD_1);
TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord2, enable->Map1TextureCoord2,
GL_MAP1_TEXTURE_COORD_2);
TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord3, enable->Map1TextureCoord3,
GL_MAP1_TEXTURE_COORD_3);
TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord4, enable->Map1TextureCoord4,
GL_MAP1_TEXTURE_COORD_4);
TEST_AND_UPDATE(ctx->Eval.Map1Vertex3, enable->Map1Vertex3,
GL_MAP1_VERTEX_3);
TEST_AND_UPDATE(ctx->Eval.Map1Vertex4, enable->Map1Vertex4,
GL_MAP1_VERTEX_4);
for (i = 0; i < 16; i++) {
TEST_AND_UPDATE(ctx->Eval.Map1Attrib[i], enable->Map1Attrib[i],
GL_MAP1_VERTEX_ATTRIB0_4_NV + i);
}
 
TEST_AND_UPDATE(ctx->Eval.Map2Color4, enable->Map2Color4, GL_MAP2_COLOR_4);
TEST_AND_UPDATE(ctx->Eval.Map2Index, enable->Map2Index, GL_MAP2_INDEX);
TEST_AND_UPDATE(ctx->Eval.Map2Normal, enable->Map2Normal, GL_MAP2_NORMAL);
TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord1, enable->Map2TextureCoord1,
GL_MAP2_TEXTURE_COORD_1);
TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord2, enable->Map2TextureCoord2,
GL_MAP2_TEXTURE_COORD_2);
TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord3, enable->Map2TextureCoord3,
GL_MAP2_TEXTURE_COORD_3);
TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord4, enable->Map2TextureCoord4,
GL_MAP2_TEXTURE_COORD_4);
TEST_AND_UPDATE(ctx->Eval.Map2Vertex3, enable->Map2Vertex3,
GL_MAP2_VERTEX_3);
TEST_AND_UPDATE(ctx->Eval.Map2Vertex4, enable->Map2Vertex4,
GL_MAP2_VERTEX_4);
for (i = 0; i < 16; i++) {
TEST_AND_UPDATE(ctx->Eval.Map2Attrib[i], enable->Map2Attrib[i],
GL_MAP2_VERTEX_ATTRIB0_4_NV + i);
}
 
TEST_AND_UPDATE(ctx->Eval.AutoNormal, enable->AutoNormal, GL_AUTO_NORMAL);
TEST_AND_UPDATE(ctx->Transform.Normalize, enable->Normalize, GL_NORMALIZE);
TEST_AND_UPDATE(ctx->Transform.RescaleNormals, enable->RescaleNormals,
GL_RESCALE_NORMAL_EXT);
TEST_AND_UPDATE(ctx->Transform.RasterPositionUnclipped,
enable->RasterPositionUnclipped,
GL_RASTER_POSITION_UNCLIPPED_IBM);
TEST_AND_UPDATE(ctx->Pixel.PixelTextureEnabled, enable->PixelTexture,
GL_POINT_SMOOTH);
TEST_AND_UPDATE(ctx->Point.SmoothFlag, enable->PointSmooth,
GL_POINT_SMOOTH);
if (ctx->Extensions.NV_point_sprite) {
TEST_AND_UPDATE(ctx->Point.PointSprite, enable->PointSprite,
GL_POINT_SPRITE_NV);
}
TEST_AND_UPDATE(ctx->Polygon.OffsetPoint, enable->PolygonOffsetPoint,
GL_POLYGON_OFFSET_POINT);
TEST_AND_UPDATE(ctx->Polygon.OffsetLine, enable->PolygonOffsetLine,
GL_POLYGON_OFFSET_LINE);
TEST_AND_UPDATE(ctx->Polygon.OffsetFill, enable->PolygonOffsetFill,
GL_POLYGON_OFFSET_FILL);
TEST_AND_UPDATE(ctx->Polygon.SmoothFlag, enable->PolygonSmooth,
GL_POLYGON_SMOOTH);
TEST_AND_UPDATE(ctx->Polygon.StippleFlag, enable->PolygonStipple,
GL_POLYGON_STIPPLE);
TEST_AND_UPDATE(ctx->Scissor.Enabled, enable->Scissor, GL_SCISSOR_TEST);
TEST_AND_UPDATE(ctx->Stencil.Enabled, enable->Stencil, GL_STENCIL_TEST);
/* XXX two-sided stencil */
TEST_AND_UPDATE(ctx->Multisample.Enabled, enable->MultisampleEnabled,
GL_MULTISAMPLE_ARB);
TEST_AND_UPDATE(ctx->Multisample.SampleAlphaToCoverage,
enable->SampleAlphaToCoverage,
GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
TEST_AND_UPDATE(ctx->Multisample.SampleAlphaToOne,
enable->SampleAlphaToOne,
GL_SAMPLE_ALPHA_TO_ONE_ARB);
TEST_AND_UPDATE(ctx->Multisample.SampleCoverage,
enable->SampleCoverage,
GL_SAMPLE_COVERAGE_ARB);
TEST_AND_UPDATE(ctx->Multisample.SampleCoverageInvert,
enable->SampleCoverageInvert,
GL_SAMPLE_COVERAGE_INVERT_ARB);
/* GL_NV_vertex_program */
TEST_AND_UPDATE(ctx->VertexProgram.Enabled,
enable->VertexProgram,
GL_VERTEX_PROGRAM_NV);
TEST_AND_UPDATE(ctx->VertexProgram.PointSizeEnabled,
enable->VertexProgramPointSize,
GL_VERTEX_PROGRAM_POINT_SIZE_NV);
TEST_AND_UPDATE(ctx->VertexProgram.TwoSideEnabled,
enable->VertexProgramTwoSide,
GL_VERTEX_PROGRAM_TWO_SIDE_NV);
 
#undef TEST_AND_UPDATE
 
/* texture unit enables */
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
if (ctx->Texture.Unit[i].Enabled != enable->Texture[i]) {
ctx->Texture.Unit[i].Enabled = enable->Texture[i];
if (ctx->Driver.Enable) {
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, i);
}
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D,
(GLboolean) (enable->Texture[i] & TEXTURE_1D_BIT) );
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D,
(GLboolean) (enable->Texture[i] & TEXTURE_2D_BIT) );
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D,
(GLboolean) (enable->Texture[i] & TEXTURE_3D_BIT) );
if (ctx->Extensions.ARB_texture_cube_map)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_CUBE_MAP_ARB,
(GLboolean) (enable->Texture[i] & TEXTURE_CUBE_BIT) );
if (ctx->Extensions.NV_texture_rectangle)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_RECTANGLE_NV,
(GLboolean) (enable->Texture[i] & TEXTURE_RECT_BIT) );
}
}
 
if (ctx->Texture.Unit[i].TexGenEnabled != enable->TexGen[i]) {
ctx->Texture.Unit[i].TexGenEnabled = enable->TexGen[i];
if (ctx->Driver.Enable) {
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, i);
}
if (enable->TexGen[i] & S_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_FALSE);
if (enable->TexGen[i] & T_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_FALSE);
if (enable->TexGen[i] & R_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_FALSE);
if (enable->TexGen[i] & Q_BIT)
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_TRUE);
else
(*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
}
}
}
 
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)(ctx, ctx->Texture.CurrentUnit);
}
}
 
 
static void
pop_texture_group(GLcontext *ctx, const struct gl_texture_attrib *texAttrib)
{
GLuint u;
 
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
const struct gl_texture_unit *unit = &texAttrib->Unit[u];
GLuint i;
 
_mesa_ActiveTextureARB(GL_TEXTURE0_ARB + u);
_mesa_set_enable(ctx, GL_TEXTURE_1D,
(GLboolean) (unit->Enabled & TEXTURE_1D_BIT ? GL_TRUE : GL_FALSE));
_mesa_set_enable(ctx, GL_TEXTURE_2D,
(GLboolean) (unit->Enabled & TEXTURE_2D_BIT ? GL_TRUE : GL_FALSE));
_mesa_set_enable(ctx, GL_TEXTURE_3D,
(GLboolean) (unit->Enabled & TEXTURE_3D_BIT ? GL_TRUE : GL_FALSE));
if (ctx->Extensions.ARB_texture_cube_map) {
_mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP_ARB,
(GLboolean) (unit->Enabled & TEXTURE_CUBE_BIT ? GL_TRUE : GL_FALSE));
}
if (ctx->Extensions.NV_texture_rectangle) {
_mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE_NV,
(GLboolean) (unit->Enabled & TEXTURE_RECT_BIT ? GL_TRUE : GL_FALSE));
}
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->EnvMode);
_mesa_TexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, unit->EnvColor);
_mesa_TexGeni(GL_S, GL_TEXTURE_GEN_MODE, unit->GenModeS);
_mesa_TexGeni(GL_T, GL_TEXTURE_GEN_MODE, unit->GenModeT);
_mesa_TexGeni(GL_R, GL_TEXTURE_GEN_MODE, unit->GenModeR);
_mesa_TexGeni(GL_Q, GL_TEXTURE_GEN_MODE, unit->GenModeQ);
_mesa_TexGenfv(GL_S, GL_OBJECT_PLANE, unit->ObjectPlaneS);
_mesa_TexGenfv(GL_T, GL_OBJECT_PLANE, unit->ObjectPlaneT);
_mesa_TexGenfv(GL_R, GL_OBJECT_PLANE, unit->ObjectPlaneR);
_mesa_TexGenfv(GL_Q, GL_OBJECT_PLANE, unit->ObjectPlaneQ);
_mesa_TexGenfv(GL_S, GL_EYE_PLANE, unit->EyePlaneS);
_mesa_TexGenfv(GL_T, GL_EYE_PLANE, unit->EyePlaneT);
_mesa_TexGenfv(GL_R, GL_EYE_PLANE, unit->EyePlaneR);
_mesa_TexGenfv(GL_Q, GL_EYE_PLANE, unit->EyePlaneQ);
if (ctx->Extensions.EXT_texture_lod_bias) {
_mesa_TexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
GL_TEXTURE_LOD_BIAS_EXT, unit->LodBias);
}
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT,
unit->CombineModeRGB);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT,
unit->CombineModeA);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT,
unit->CombineSourceRGB[0]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT,
unit->CombineSourceRGB[1]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT,
unit->CombineSourceRGB[2]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT,
unit->CombineSourceA[0]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT,
unit->CombineSourceA[1]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_EXT,
unit->CombineSourceA[2]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT,
unit->CombineOperandRGB[0]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT,
unit->CombineOperandRGB[1]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT,
unit->CombineOperandRGB[2]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT,
unit->CombineOperandA[0]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT,
unit->CombineOperandA[1]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_EXT,
unit->CombineOperandA[2]);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT,
1 << unit->CombineScaleShiftRGB);
_mesa_TexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE,
1 << unit->CombineScaleShiftA);
}
 
/* Restore texture object state */
for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
GLenum target = 0;
const struct gl_texture_object *obj = NULL;
GLfloat bordColor[4];
 
switch (i) {
case 0:
target = GL_TEXTURE_1D;
obj = &unit->Saved1D;
break;
case 1:
target = GL_TEXTURE_2D;
obj = &unit->Saved2D;
break;
case 2:
target = GL_TEXTURE_3D;
obj = &unit->Saved3D;
break;
case 3:
if (!ctx->Extensions.ARB_texture_cube_map)
continue;
target = GL_TEXTURE_CUBE_MAP_ARB;
obj = &unit->SavedCubeMap;
break;
case 4:
if (!ctx->Extensions.NV_texture_rectangle)
continue;
target = GL_TEXTURE_RECTANGLE_NV;
obj = &unit->SavedRect;
break;
default:
; /* silence warnings */
}
 
_mesa_BindTexture(target, obj->Name);
 
bordColor[0] = CHAN_TO_FLOAT(obj->BorderColor[0]);
bordColor[1] = CHAN_TO_FLOAT(obj->BorderColor[1]);
bordColor[2] = CHAN_TO_FLOAT(obj->BorderColor[2]);
bordColor[3] = CHAN_TO_FLOAT(obj->BorderColor[3]);
 
_mesa_TexParameterf(target, GL_TEXTURE_PRIORITY, obj->Priority);
_mesa_TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, bordColor);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_S, obj->WrapS);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_T, obj->WrapT);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_R, obj->WrapR);
_mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, obj->MinFilter);
_mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, obj->MagFilter);
_mesa_TexParameterf(target, GL_TEXTURE_MIN_LOD, obj->MinLod);
_mesa_TexParameterf(target, GL_TEXTURE_MAX_LOD, obj->MaxLod);
_mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, obj->BaseLevel);
_mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, obj->MaxLevel);
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
_mesa_TexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT,
obj->MaxAnisotropy);
}
if (ctx->Extensions.SGIX_shadow) {
_mesa_TexParameteri(target, GL_TEXTURE_COMPARE_SGIX,
obj->CompareFlag);
_mesa_TexParameteri(target, GL_TEXTURE_COMPARE_OPERATOR_SGIX,
obj->CompareOperator);
}
if (ctx->Extensions.SGIX_shadow_ambient) {
_mesa_TexParameterf(target, GL_SHADOW_AMBIENT_SGIX,
obj->ShadowAmbient);
}
 
}
}
_mesa_ActiveTextureARB(GL_TEXTURE0_ARB
+ texAttrib->CurrentUnit);
 
/* "un-bump" the texture object reference counts. We did that so they
* wouldn't inadvertantly get deleted while they were still referenced
* inside the attribute state stack.
*/
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
ctx->Texture.Unit[u].Current1D->RefCount--;
ctx->Texture.Unit[u].Current2D->RefCount--;
ctx->Texture.Unit[u].Current3D->RefCount--;
ctx->Texture.Unit[u].CurrentCubeMap->RefCount--;
ctx->Texture.Unit[u].CurrentRect->RefCount--;
}
}
 
 
/*
* This function is kind of long just because we have to call a lot
* of device driver functions to update device driver state.
*
* XXX As it is now, most of the pop-code calls immediate-mode Mesa functions
* in order to restore GL state. This isn't terribly efficient but it
* ensures that dirty flags and any derived state gets updated correctly.
* We could at least check if the value to restore equals the current value
* and then skip the Mesa call.
*/
void
_mesa_PopAttrib(void)
{
struct gl_attrib_node *attr, *next;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->AttribStackDepth == 0) {
_mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopAttrib" );
return;
}
 
ctx->AttribStackDepth--;
attr = ctx->AttribStack[ctx->AttribStackDepth];
 
while (attr) {
 
if (MESA_VERBOSE & VERBOSE_API) {
_mesa_debug(ctx, "glPopAttrib %s\n",
_mesa_lookup_enum_by_nr(attr->kind));
}
 
switch (attr->kind) {
case GL_ACCUM_BUFFER_BIT:
{
const struct gl_accum_attrib *accum;
accum = (const struct gl_accum_attrib *) attr->data;
_mesa_ClearAccum(accum->ClearColor[0],
accum->ClearColor[1],
accum->ClearColor[2],
accum->ClearColor[3]);
}
break;
case GL_COLOR_BUFFER_BIT:
{
const struct gl_colorbuffer_attrib *color;
color = (const struct gl_colorbuffer_attrib *) attr->data;
_mesa_ClearIndex((GLfloat) color->ClearIndex);
_mesa_ClearColor(color->ClearColor[0],
color->ClearColor[1],
color->ClearColor[2],
color->ClearColor[3]);
_mesa_IndexMask(color->IndexMask);
_mesa_ColorMask((GLboolean) (color->ColorMask[0] != 0),
(GLboolean) (color->ColorMask[1] != 0),
(GLboolean) (color->ColorMask[2] != 0),
(GLboolean) (color->ColorMask[3] != 0));
_mesa_DrawBuffer(color->DrawBuffer);
_mesa_set_enable(ctx, GL_ALPHA_TEST, color->AlphaEnabled);
_mesa_AlphaFunc(color->AlphaFunc, color->AlphaRef);
_mesa_set_enable(ctx, GL_BLEND, color->BlendEnabled);
_mesa_BlendFuncSeparateEXT(color->BlendSrcRGB,
color->BlendDstRGB,
color->BlendSrcA,
color->BlendDstA);
_mesa_BlendEquation(color->BlendEquation);
_mesa_BlendColor(color->BlendColor[0],
color->BlendColor[1],
color->BlendColor[2],
color->BlendColor[3]);
_mesa_LogicOp(color->LogicOp);
_mesa_set_enable(ctx, GL_COLOR_LOGIC_OP,
color->ColorLogicOpEnabled);
_mesa_set_enable(ctx, GL_INDEX_LOGIC_OP,
color->IndexLogicOpEnabled);
_mesa_set_enable(ctx, GL_DITHER, color->DitherFlag);
}
break;
case GL_CURRENT_BIT:
FLUSH_CURRENT( ctx, 0 );
MEMCPY( &ctx->Current, attr->data,
sizeof(struct gl_current_attrib) );
break;
case GL_DEPTH_BUFFER_BIT:
{
const struct gl_depthbuffer_attrib *depth;
depth = (const struct gl_depthbuffer_attrib *) attr->data;
_mesa_DepthFunc(depth->Func);
_mesa_ClearDepth(depth->Clear);
_mesa_set_enable(ctx, GL_DEPTH_TEST, depth->Test);
_mesa_DepthMask(depth->Mask);
if (ctx->Extensions.HP_occlusion_test)
_mesa_set_enable(ctx, GL_OCCLUSION_TEST_HP,
depth->OcclusionTest);
}
break;
case GL_ENABLE_BIT:
{
const struct gl_enable_attrib *enable;
enable = (const struct gl_enable_attrib *) attr->data;
pop_enable_group(ctx, enable);
ctx->NewState |= _NEW_ALL;
}
break;
case GL_EVAL_BIT:
MEMCPY( &ctx->Eval, attr->data, sizeof(struct gl_eval_attrib) );
ctx->NewState |= _NEW_EVAL;
break;
case GL_FOG_BIT:
{
const struct gl_fog_attrib *fog;
fog = (const struct gl_fog_attrib *) attr->data;
_mesa_set_enable(ctx, GL_FOG, fog->Enabled);
_mesa_Fogfv(GL_FOG_COLOR, fog->Color);
_mesa_Fogf(GL_FOG_DENSITY, fog->Density);
_mesa_Fogf(GL_FOG_START, fog->Start);
_mesa_Fogf(GL_FOG_END, fog->End);
_mesa_Fogf(GL_FOG_INDEX, fog->Index);
_mesa_Fogi(GL_FOG_MODE, fog->Mode);
}
break;
case GL_HINT_BIT:
{
const struct gl_hint_attrib *hint;
hint = (const struct gl_hint_attrib *) attr->data;
_mesa_Hint(GL_PERSPECTIVE_CORRECTION_HINT,
hint->PerspectiveCorrection );
_mesa_Hint(GL_POINT_SMOOTH_HINT, hint->PointSmooth);
_mesa_Hint(GL_LINE_SMOOTH_HINT, hint->LineSmooth);
_mesa_Hint(GL_POLYGON_SMOOTH_HINT, hint->PolygonSmooth);
_mesa_Hint(GL_FOG_HINT, hint->Fog);
_mesa_Hint(GL_CLIP_VOLUME_CLIPPING_HINT_EXT,
hint->ClipVolumeClipping);
if (ctx->Extensions.ARB_texture_compression)
_mesa_Hint(GL_TEXTURE_COMPRESSION_HINT_ARB,
hint->TextureCompression);
}
break;
case GL_LIGHTING_BIT:
{
GLuint i;
const struct gl_light_attrib *light;
light = (const struct gl_light_attrib *) attr->data;
/* lighting enable */
_mesa_set_enable(ctx, GL_LIGHTING, light->Enabled);
/* per-light state */
 
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE)
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
for (i = 0; i < MAX_LIGHTS; i++) {
GLenum lgt = (GLenum) (GL_LIGHT0 + i);
const struct gl_light *l = &light->Light[i];
GLfloat tmp[4];
_mesa_set_enable(ctx, lgt, l->Enabled);
_mesa_Lightfv( lgt, GL_AMBIENT, l->Ambient );
_mesa_Lightfv( lgt, GL_DIFFUSE, l->Diffuse );
_mesa_Lightfv( lgt, GL_SPECULAR, l->Specular );
TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->inv, l->EyePosition );
_mesa_Lightfv( lgt, GL_POSITION, tmp );
TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->m, l->EyeDirection );
_mesa_Lightfv( lgt, GL_SPOT_DIRECTION, tmp );
_mesa_Lightfv( lgt, GL_SPOT_EXPONENT, &l->SpotExponent );
_mesa_Lightfv( lgt, GL_SPOT_CUTOFF, &l->SpotCutoff );
_mesa_Lightfv( lgt, GL_CONSTANT_ATTENUATION,
&l->ConstantAttenuation );
_mesa_Lightfv( lgt, GL_LINEAR_ATTENUATION,
&l->LinearAttenuation );
_mesa_Lightfv( lgt, GL_QUADRATIC_ATTENUATION,
&l->QuadraticAttenuation );
}
/* light model */
_mesa_LightModelfv(GL_LIGHT_MODEL_AMBIENT,
light->Model.Ambient);
_mesa_LightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,
(GLfloat) light->Model.LocalViewer);
_mesa_LightModelf(GL_LIGHT_MODEL_TWO_SIDE,
(GLfloat) light->Model.TwoSide);
_mesa_LightModelf(GL_LIGHT_MODEL_COLOR_CONTROL,
(GLfloat) light->Model.ColorControl);
/* materials */
MEMCPY(ctx->Light.Material, light->Material,
2 * sizeof(struct gl_material));
/* shade model */
_mesa_ShadeModel(light->ShadeModel);
/* color material */
_mesa_ColorMaterial(light->ColorMaterialFace,
light->ColorMaterialMode);
_mesa_set_enable(ctx, GL_COLOR_MATERIAL,
light->ColorMaterialEnabled);
}
break;
case GL_LINE_BIT:
{
const struct gl_line_attrib *line;
line = (const struct gl_line_attrib *) attr->data;
_mesa_set_enable(ctx, GL_LINE_SMOOTH, line->SmoothFlag);
_mesa_set_enable(ctx, GL_LINE_STIPPLE, line->StippleFlag);
_mesa_LineStipple(line->StippleFactor, line->StipplePattern);
_mesa_LineWidth(line->Width);
}
break;
case GL_LIST_BIT:
MEMCPY( &ctx->List, attr->data, sizeof(struct gl_list_attrib) );
break;
case GL_PIXEL_MODE_BIT:
MEMCPY( &ctx->Pixel, attr->data, sizeof(struct gl_pixel_attrib) );
ctx->NewState |= _NEW_PIXEL;
break;
case GL_POINT_BIT:
{
const struct gl_point_attrib *point;
point = (const struct gl_point_attrib *) attr->data;
_mesa_PointSize(point->Size);
_mesa_set_enable(ctx, GL_POINT_SMOOTH, point->SmoothFlag);
if (ctx->Extensions.EXT_point_parameters) {
_mesa_PointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT,
point->Params);
_mesa_PointParameterfEXT(GL_POINT_SIZE_MIN_EXT,
point->MinSize);
_mesa_PointParameterfEXT(GL_POINT_SIZE_MAX_EXT,
point->MaxSize);
_mesa_PointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT,
point->Threshold);
}
if (ctx->Extensions.NV_point_sprite) {
GLuint u;
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
_mesa_TexEnvi(GL_POINT_SPRITE_NV, GL_COORD_REPLACE_NV,
(GLint) point->CoordReplace[u]);
}
_mesa_set_enable(ctx, GL_POINT_SPRITE_NV,point->PointSprite);
_mesa_PointParameteriNV(GL_POINT_SPRITE_R_MODE_NV,
ctx->Point.SpriteRMode);
}
}
break;
case GL_POLYGON_BIT:
{
const struct gl_polygon_attrib *polygon;
polygon = (const struct gl_polygon_attrib *) attr->data;
_mesa_CullFace(polygon->CullFaceMode);
_mesa_FrontFace(polygon->FrontFace);
_mesa_PolygonMode(GL_FRONT, polygon->FrontMode);
_mesa_PolygonMode(GL_BACK, polygon->BackMode);
_mesa_PolygonOffset(polygon->OffsetFactor,
polygon->OffsetUnits);
_mesa_set_enable(ctx, GL_POLYGON_SMOOTH, polygon->SmoothFlag);
_mesa_set_enable(ctx, GL_POLYGON_STIPPLE, polygon->StippleFlag);
_mesa_set_enable(ctx, GL_CULL_FACE, polygon->CullFlag);
_mesa_set_enable(ctx, GL_POLYGON_OFFSET_POINT,
polygon->OffsetPoint);
_mesa_set_enable(ctx, GL_POLYGON_OFFSET_LINE,
polygon->OffsetLine);
_mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL,
polygon->OffsetFill);
}
break;
case GL_POLYGON_STIPPLE_BIT:
MEMCPY( ctx->PolygonStipple, attr->data, 32*sizeof(GLuint) );
ctx->NewState |= _NEW_POLYGONSTIPPLE;
if (ctx->Driver.PolygonStipple)
ctx->Driver.PolygonStipple( ctx, (const GLubyte *) attr->data );
break;
case GL_SCISSOR_BIT:
{
const struct gl_scissor_attrib *scissor;
scissor = (const struct gl_scissor_attrib *) attr->data;
_mesa_Scissor(scissor->X, scissor->Y,
scissor->Width, scissor->Height);
_mesa_set_enable(ctx, GL_SCISSOR_TEST, scissor->Enabled);
}
break;
case GL_STENCIL_BUFFER_BIT:
{
const GLint face = 0; /* XXX stencil two side */
const struct gl_stencil_attrib *stencil;
stencil = (const struct gl_stencil_attrib *) attr->data;
_mesa_set_enable(ctx, GL_STENCIL_TEST, stencil->Enabled);
_mesa_ClearStencil(stencil->Clear);
_mesa_StencilFunc(stencil->Function[face], stencil->Ref[face],
stencil->ValueMask[face]);
_mesa_StencilMask(stencil->WriteMask[face]);
_mesa_StencilOp(stencil->FailFunc[face],
stencil->ZFailFunc[face],
stencil->ZPassFunc[face]);
}
break;
case GL_TRANSFORM_BIT:
{
GLuint i;
const struct gl_transform_attrib *xform;
xform = (const struct gl_transform_attrib *) attr->data;
_mesa_MatrixMode(xform->MatrixMode);
 
if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY)
_math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
/* restore clip planes */
for (i = 0; i < MAX_CLIP_PLANES; i++) {
const GLuint mask = 1 << 1;
const GLfloat *eyePlane = xform->EyeUserPlane[i];
COPY_4V(ctx->Transform.EyeUserPlane[i], eyePlane);
if (xform->ClipPlanesEnabled & mask) {
_mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_TRUE);
}
else {
_mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_FALSE);
}
if (ctx->Driver.ClipPlane)
ctx->Driver.ClipPlane( ctx, GL_CLIP_PLANE0 + i, eyePlane );
}
 
/* normalize/rescale */
if (xform->Normalize != ctx->Transform.Normalize)
_mesa_set_enable(ctx, GL_NORMALIZE,ctx->Transform.Normalize);
if (xform->RescaleNormals != ctx->Transform.RescaleNormals)
_mesa_set_enable(ctx, GL_RESCALE_NORMAL_EXT,
ctx->Transform.RescaleNormals);
}
break;
case GL_TEXTURE_BIT:
/* Take care of texture object reference counters */
{
const struct gl_texture_attrib *texture;
texture = (const struct gl_texture_attrib *) attr->data;
pop_texture_group(ctx, texture);
ctx->NewState |= _NEW_TEXTURE;
}
break;
case GL_VIEWPORT_BIT:
{
const struct gl_viewport_attrib *vp;
vp = (const struct gl_viewport_attrib *) attr->data;
_mesa_Viewport(vp->X, vp->Y, vp->Width, vp->Height);
_mesa_DepthRange(vp->Near, vp->Far);
}
break;
case GL_MULTISAMPLE_BIT_ARB:
{
const struct gl_multisample_attrib *ms;
ms = (const struct gl_multisample_attrib *) attr->data;
_mesa_SampleCoverageARB(ms->SampleCoverageValue,
ms->SampleCoverageInvert);
}
break;
 
default:
_mesa_problem( ctx, "Bad attrib flag in PopAttrib");
break;
}
 
next = attr->next;
FREE( attr->data );
FREE( attr );
attr = next;
}
}
 
 
#define GL_CLIENT_PACK_BIT (1<<20)
#define GL_CLIENT_UNPACK_BIT (1<<21)
 
 
void
_mesa_PushClientAttrib(GLbitfield mask)
{
struct gl_attrib_node *newnode;
struct gl_attrib_node *head;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->ClientAttribStackDepth >= MAX_CLIENT_ATTRIB_STACK_DEPTH) {
_mesa_error( ctx, GL_STACK_OVERFLOW, "glPushClientAttrib" );
return;
}
 
/* Build linked list of attribute nodes which save all attribute */
/* groups specified by the mask. */
head = NULL;
 
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
struct gl_pixelstore_attrib *attr;
/* packing attribs */
attr = MALLOC_STRUCT( gl_pixelstore_attrib );
MEMCPY( attr, &ctx->Pack, sizeof(struct gl_pixelstore_attrib) );
newnode = new_attrib_node( GL_CLIENT_PACK_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
/* unpacking attribs */
attr = MALLOC_STRUCT( gl_pixelstore_attrib );
MEMCPY( attr, &ctx->Unpack, sizeof(struct gl_pixelstore_attrib) );
newnode = new_attrib_node( GL_CLIENT_UNPACK_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
struct gl_array_attrib *attr;
attr = MALLOC_STRUCT( gl_array_attrib );
MEMCPY( attr, &ctx->Array, sizeof(struct gl_array_attrib) );
newnode = new_attrib_node( GL_CLIENT_VERTEX_ARRAY_BIT );
newnode->data = attr;
newnode->next = head;
head = newnode;
}
 
ctx->ClientAttribStack[ctx->ClientAttribStackDepth] = head;
ctx->ClientAttribStackDepth++;
}
 
 
 
 
void
_mesa_PopClientAttrib(void)
{
struct gl_attrib_node *attr, *next;
 
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->ClientAttribStackDepth == 0) {
_mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopClientAttrib" );
return;
}
 
ctx->ClientAttribStackDepth--;
attr = ctx->ClientAttribStack[ctx->ClientAttribStackDepth];
 
while (attr) {
switch (attr->kind) {
case GL_CLIENT_PACK_BIT:
MEMCPY( &ctx->Pack, attr->data,
sizeof(struct gl_pixelstore_attrib) );
ctx->NewState |= _NEW_PACKUNPACK;
break;
case GL_CLIENT_UNPACK_BIT:
MEMCPY( &ctx->Unpack, attr->data,
sizeof(struct gl_pixelstore_attrib) );
ctx->NewState |= _NEW_PACKUNPACK;
break;
case GL_CLIENT_VERTEX_ARRAY_BIT:
MEMCPY( &ctx->Array, attr->data,
sizeof(struct gl_array_attrib) );
ctx->NewState |= _NEW_ARRAY;
break;
default:
_mesa_problem( ctx, "Bad attrib flag in PopClientAttrib");
break;
}
 
next = attr->next;
FREE( attr->data );
FREE( attr );
attr = next;
}
}
/shark/trunk/ports/mesa/src/debug.c
0,0 → 1,90
/* $Id: debug.c,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "mtypes.h"
#include "context.h"
#include "imports.h"
#include "debug.h"
 
 
void
_mesa_print_state( const char *msg, GLuint state )
{
_mesa_debug(NULL,
"%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
msg,
state,
(state & _NEW_MODELVIEW) ? "ctx->ModelView, " : "",
(state & _NEW_PROJECTION) ? "ctx->Projection, " : "",
(state & _NEW_TEXTURE_MATRIX) ? "ctx->TextureMatrix, " : "",
(state & _NEW_COLOR_MATRIX) ? "ctx->ColorMatrix, " : "",
(state & _NEW_ACCUM) ? "ctx->Accum, " : "",
(state & _NEW_COLOR) ? "ctx->Color, " : "",
(state & _NEW_DEPTH) ? "ctx->Depth, " : "",
(state & _NEW_EVAL) ? "ctx->Eval/EvalMap, " : "",
(state & _NEW_FOG) ? "ctx->Fog, " : "",
(state & _NEW_HINT) ? "ctx->Hint, " : "",
(state & _NEW_LIGHT) ? "ctx->Light, " : "",
(state & _NEW_LINE) ? "ctx->Line, " : "",
(state & _NEW_PIXEL) ? "ctx->Pixel, " : "",
(state & _NEW_POINT) ? "ctx->Point, " : "",
(state & _NEW_POLYGON) ? "ctx->Polygon, " : "",
(state & _NEW_POLYGONSTIPPLE) ? "ctx->PolygonStipple, " : "",
(state & _NEW_SCISSOR) ? "ctx->Scissor, " : "",
(state & _NEW_TEXTURE) ? "ctx->Texture, " : "",
(state & _NEW_TRANSFORM) ? "ctx->Transform, " : "",
(state & _NEW_VIEWPORT) ? "ctx->Viewport, " : "",
(state & _NEW_PACKUNPACK) ? "ctx->Pack/Unpack, " : "",
(state & _NEW_ARRAY) ? "ctx->Array, " : "",
(state & _NEW_RENDERMODE) ? "ctx->RenderMode, " : "",
(state & _NEW_BUFFERS) ? "ctx->Visual, ctx->DrawBuffer,, " : "");
}
 
 
 
void
_mesa_print_tri_caps( const char *name, GLuint flags )
{
_mesa_debug(NULL,
"%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
name,
flags,
(flags & DD_FLATSHADE) ? "flat-shade, " : "",
(flags & DD_SEPARATE_SPECULAR) ? "separate-specular, " : "",
(flags & DD_TRI_LIGHT_TWOSIDE) ? "tri-light-twoside, " : "",
(flags & DD_TRI_UNFILLED) ? "tri-unfilled, " : "",
(flags & DD_TRI_STIPPLE) ? "tri-stipple, " : "",
(flags & DD_TRI_OFFSET) ? "tri-offset, " : "",
(flags & DD_TRI_SMOOTH) ? "tri-smooth, " : "",
(flags & DD_LINE_SMOOTH) ? "line-smooth, " : "",
(flags & DD_LINE_STIPPLE) ? "line-stipple, " : "",
(flags & DD_LINE_WIDTH) ? "line-wide, " : "",
(flags & DD_POINT_SMOOTH) ? "point-smooth, " : "",
(flags & DD_POINT_SIZE) ? "point-size, " : "",
(flags & DD_POINT_ATTEN) ? "point-atten, " : "",
(flags & DD_TRI_CULL_FRONT_BACK) ? "cull-all, " : ""
);
}
/shark/trunk/ports/mesa/src/mtypes.h
0,0 → 1,1898
/* $Id: mtypes.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/**
* \file mtypes.h
* \brief Main Mesa data structures.
*/
 
#ifndef TYPES_H
#define TYPES_H
 
 
#include "glheader.h"
#include "config.h" /* Hardwired parameters */
#include "glapitable.h"
#include "glthread.h"
 
#include "math/m_matrix.h" /* GLmatrix */
 
#if defined(MESA_TRACE)
#include "Trace/tr_context.h"
#endif
 
 
/* Please try to mark derived values with a leading underscore ('_').
*/
 
/*
* Color channel data type:
*/
#if CHAN_BITS == 8
typedef GLubyte GLchan;
#define CHAN_MAX 255
#define CHAN_MAXF 255.0F
#define CHAN_TYPE GL_UNSIGNED_BYTE
#elif CHAN_BITS == 16
typedef GLushort GLchan;
#define CHAN_MAX 65535
#define CHAN_MAXF 65535.0F
#define CHAN_TYPE GL_UNSIGNED_SHORT
#elif CHAN_BITS == 32
typedef GLfloat GLchan;
#define CHAN_MAX 1.0
#define CHAN_MAXF 1.0F
#define CHAN_TYPE GL_FLOAT
#else
#error "illegal number of color channel bits"
#endif
 
 
/**
* Accumulation buffer data type:
*/
#if ACCUM_BITS==8
typedef GLbyte GLaccum;
#elif ACCUM_BITS==16
typedef GLshort GLaccum;
#elif ACCUM_BITS==32
typedef GLfloat GLaccum;
#else
# error "illegal number of accumulation bits"
#endif
 
 
/**
* Stencil buffer data type:
*/
#if STENCIL_BITS==8
typedef GLubyte GLstencil;
# define STENCIL_MAX 0xff
#elif STENCIL_BITS==16
typedef GLushort GLstencil;
# define STENCIL_MAX 0xffff
#else
# error "illegal number of stencil bits"
#endif
 
 
/**
* Depth buffer data type:
*/
typedef GLuint GLdepth; /* Must be 32-bits! */
 
 
/**
* Fixed point data type:
*/
typedef int GLfixed;
 
 
 
/**
* Some forward type declarations
*/
struct _mesa_HashTable;
struct gl_texture_image;
struct gl_texture_object;
typedef struct __GLcontextRec GLcontext;
typedef struct __GLcontextModesRec GLvisual;
typedef struct gl_frame_buffer GLframebuffer;
 
 
 
/* These define the aliases between numbered vertex attributes and
* conventional OpenGL vertex attributes. We use these values in
* quite a few places. New in Mesa 4.1.
*/
#define VERT_ATTRIB_POS 0
#define VERT_ATTRIB_WEIGHT 1
#define VERT_ATTRIB_NORMAL 2
#define VERT_ATTRIB_COLOR0 3
#define VERT_ATTRIB_COLOR1 4
#define VERT_ATTRIB_FOG 5
#define VERT_ATTRIB_SIX 6
#define VERT_ATTRIB_SEVEN 7
#define VERT_ATTRIB_TEX0 8
#define VERT_ATTRIB_TEX1 9
#define VERT_ATTRIB_TEX2 10
#define VERT_ATTRIB_TEX3 11
#define VERT_ATTRIB_TEX4 12
#define VERT_ATTRIB_TEX5 13
#define VERT_ATTRIB_TEX6 14
#define VERT_ATTRIB_TEX7 15
#define VERT_ATTRIB_MAX 16
 
/* These are used in bitfields in many places */
#define VERT_BIT_POS (1 << VERT_ATTRIB_POS)
#define VERT_BIT_WEIGHT (1 << VERT_ATTRIB_WEIGHT)
#define VERT_BIT_NORMAL (1 << VERT_ATTRIB_NORMAL)
#define VERT_BIT_COLOR0 (1 << VERT_ATTRIB_COLOR0)
#define VERT_BIT_COLOR1 (1 << VERT_ATTRIB_COLOR1)
#define VERT_BIT_FOG (1 << VERT_ATTRIB_FOG)
#define VERT_BIT_SIX (1 << VERT_ATTRIB_SIX)
#define VERT_BIT_SEVEN (1 << VERT_ATTRIB_SEVEN)
#define VERT_BIT_TEX0 (1 << VERT_ATTRIB_TEX0)
#define VERT_BIT_TEX1 (1 << VERT_ATTRIB_TEX1)
#define VERT_BIT_TEX2 (1 << VERT_ATTRIB_TEX2)
#define VERT_BIT_TEX3 (1 << VERT_ATTRIB_TEX3)
#define VERT_BIT_TEX4 (1 << VERT_ATTRIB_TEX4)
#define VERT_BIT_TEX5 (1 << VERT_ATTRIB_TEX5)
#define VERT_BIT_TEX6 (1 << VERT_ATTRIB_TEX6)
#define VERT_BIT_TEX7 (1 << VERT_ATTRIB_TEX7)
 
#define VERT_BIT_TEX(u) (1 << (VERT_ATTRIB_TEX0 + (u)))
 
 
 
/**
* Maximum number of temporary vertices required for clipping. (Used
* in array_cache and tnl modules).
*/
#define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1)
 
 
/* Data structure for color tables */
struct gl_color_table {
GLenum Format; /* GL_ALPHA, GL_RGB, GL_RGB, etc */
GLenum IntFormat;
GLuint Size; /* number of entries (rows) in table */
GLvoid *Table; /* either GLfloat * or GLchan * */
GLboolean FloatTable; /* are entries stored as floats? */
GLubyte RedSize;
GLubyte GreenSize;
GLubyte BlueSize;
GLubyte AlphaSize;
GLubyte LuminanceSize;
GLubyte IntensitySize;
};
 
 
/*
* Bit flags used for updating material values.
*/
#define FRONT_AMBIENT_BIT 0x1
#define BACK_AMBIENT_BIT 0x2
#define FRONT_DIFFUSE_BIT 0x4
#define BACK_DIFFUSE_BIT 0x8
#define FRONT_SPECULAR_BIT 0x10
#define BACK_SPECULAR_BIT 0x20
#define FRONT_EMISSION_BIT 0x40
#define BACK_EMISSION_BIT 0x80
#define FRONT_SHININESS_BIT 0x100
#define BACK_SHININESS_BIT 0x200
#define FRONT_INDEXES_BIT 0x400
#define BACK_INDEXES_BIT 0x800
 
#define FRONT_MATERIAL_BITS (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT | \
FRONT_DIFFUSE_BIT | FRONT_SPECULAR_BIT | \
FRONT_SHININESS_BIT | FRONT_INDEXES_BIT)
 
#define BACK_MATERIAL_BITS (BACK_EMISSION_BIT | BACK_AMBIENT_BIT | \
BACK_DIFFUSE_BIT | BACK_SPECULAR_BIT | \
BACK_SHININESS_BIT | BACK_INDEXES_BIT)
 
#define ALL_MATERIAL_BITS (FRONT_MATERIAL_BITS | BACK_MATERIAL_BITS)
 
 
 
/*
* Specular exponent and material shininess lookup table sizes:
*/
#define EXP_TABLE_SIZE 512
#define SHINE_TABLE_SIZE 256
 
struct gl_shine_tab {
struct gl_shine_tab *next, *prev;
GLfloat tab[SHINE_TABLE_SIZE+1];
GLfloat shininess;
GLuint refcount;
};
 
 
struct gl_light {
struct gl_light *next; /* double linked list with sentinel */
struct gl_light *prev;
 
GLfloat Ambient[4]; /* ambient color */
GLfloat Diffuse[4]; /* diffuse color */
GLfloat Specular[4]; /* specular color */
GLfloat EyePosition[4]; /* position in eye coordinates */
GLfloat EyeDirection[4]; /* spotlight dir in eye coordinates */
GLfloat SpotExponent;
GLfloat SpotCutoff; /* in degress */
GLfloat _CosCutoff; /* = MAX(0, cos(SpotCutoff)) */
GLfloat ConstantAttenuation;
GLfloat LinearAttenuation;
GLfloat QuadraticAttenuation;
GLboolean Enabled; /* On/off flag */
 
/* Derived fields */
GLuint _Flags; /* State */
 
GLfloat _Position[4]; /* position in eye/obj coordinates */
GLfloat _VP_inf_norm[3]; /* Norm direction to infinite light */
GLfloat _h_inf_norm[3]; /* Norm( _VP_inf_norm + <0,0,1> ) */
GLfloat _NormDirection[4]; /* normalized spotlight direction */
GLfloat _VP_inf_spot_attenuation;
 
GLfloat _SpotExpTable[EXP_TABLE_SIZE][2]; /* to replace a pow() call */
GLfloat _MatAmbient[2][3]; /* material ambient * light ambient */
GLfloat _MatDiffuse[2][3]; /* material diffuse * light diffuse */
GLfloat _MatSpecular[2][3]; /* material spec * light specular */
GLfloat _dli; /* CI diffuse light intensity */
GLfloat _sli; /* CI specular light intensity */
};
 
 
struct gl_lightmodel {
GLfloat Ambient[4]; /* ambient color */
GLboolean LocalViewer; /* Local (or infinite) view point? */
GLboolean TwoSide; /* Two (or one) sided lighting? */
GLenum ColorControl; /* either GL_SINGLE_COLOR */
/* or GL_SEPARATE_SPECULAR_COLOR */
};
 
 
struct gl_material
{
GLfloat Ambient[4];
GLfloat Diffuse[4];
GLfloat Specular[4];
GLfloat Emission[4];
GLfloat Shininess;
GLfloat AmbientIndex; /* for color index lighting */
GLfloat DiffuseIndex; /* for color index lighting */
GLfloat SpecularIndex; /* for color index lighting */
};
 
 
/*
* Attribute structures:
* We define a struct for each attribute group to make pushing and
* popping attributes easy. Also it's a good organization.
*/
struct gl_accum_attrib {
GLfloat ClearColor[4]; /* Accumulation buffer clear color */
};
 
 
/*
* Used in _DrawDestMask and _ReadSrcMask below to identify color buffers.
*/
#define FRONT_LEFT_BIT 0x1
#define FRONT_RIGHT_BIT 0x2
#define BACK_LEFT_BIT 0x4
#define BACK_RIGHT_BIT 0x8
#define AUX0_BIT 0x10
#define AUX1_BIT 0x20
#define AUX2_BIT 0x40
#define AUX3_BIT 0x80
 
struct gl_colorbuffer_attrib {
GLuint ClearIndex; /* Index to use for glClear */
GLclampf ClearColor[4]; /* Color to use for glClear */
 
GLuint IndexMask; /* Color index write mask */
GLubyte ColorMask[4]; /* Each flag is 0xff or 0x0 */
 
GLenum DrawBuffer; /* Which buffer to draw into */
GLubyte _DrawDestMask; /* bitwise-OR of FRONT/BACK_LEFT/RIGHT_BITs */
 
/* alpha testing */
GLboolean AlphaEnabled; /* Alpha test enabled flag */
GLenum AlphaFunc; /* Alpha test function */
GLclampf AlphaRef;
 
/* blending */
GLboolean BlendEnabled; /* Blending enabled flag */
GLenum BlendSrcRGB; /* Blending source operator */
GLenum BlendDstRGB; /* Blending destination operator */
GLenum BlendSrcA; /* GL_INGR_blend_func_separate */
GLenum BlendDstA; /* GL_INGR_blend_func_separate */
GLenum BlendEquation;
GLfloat BlendColor[4];
 
/* logic op */
GLenum LogicOp; /* Logic operator */
GLboolean IndexLogicOpEnabled; /* Color index logic op enabled flag */
GLboolean ColorLogicOpEnabled; /* RGBA logic op enabled flag */
 
GLboolean DitherFlag; /* Dither enable flag */
};
 
 
struct gl_current_attrib {
/* These values valid only when FLUSH_VERTICES has been called.
*/
GLfloat Attrib[VERT_ATTRIB_MAX][4]; /* Current vertex attributes */
/* indexed by VERT_ATTRIB_* */
GLuint Index; /* Current color index */
GLboolean EdgeFlag; /* Current edge flag */
 
/* These values are always valid. BTW, note how similar this set of
* attributes is to the SWvertex datatype in the software rasterizer...
*/
GLfloat RasterPos[4]; /* Current raster position */
GLfloat RasterDistance; /* Current raster distance */
GLfloat RasterColor[4]; /* Current raster color */
GLfloat RasterSecondaryColor[4]; /* Current rast 2ndary color */
GLuint RasterIndex; /* Current raster index */
GLfloat RasterTexCoords[MAX_TEXTURE_UNITS][4];/* Current raster texcoords */
GLboolean RasterPosValid; /* Raster pos valid flag */
};
 
 
struct gl_depthbuffer_attrib {
GLenum Func; /* Function for depth buffer compare */
GLfloat Clear; /* Value to clear depth buffer to */
GLboolean Test; /* Depth buffering enabled flag */
GLboolean Mask; /* Depth buffer writable? */
GLboolean OcclusionTest; /* GL_HP_occlusion_test */
};
 
 
struct gl_enable_attrib {
GLboolean AlphaTest;
GLboolean AutoNormal;
GLboolean Blend;
GLuint ClipPlanes;
GLboolean ColorMaterial;
GLboolean Convolution1D;
GLboolean Convolution2D;
GLboolean Separable2D;
GLboolean CullFace;
GLboolean DepthTest;
GLboolean Dither;
GLboolean Fog;
GLboolean Histogram;
GLboolean Light[MAX_LIGHTS];
GLboolean Lighting;
GLboolean LineSmooth;
GLboolean LineStipple;
GLboolean IndexLogicOp;
GLboolean ColorLogicOp;
GLboolean Map1Color4;
GLboolean Map1Index;
GLboolean Map1Normal;
GLboolean Map1TextureCoord1;
GLboolean Map1TextureCoord2;
GLboolean Map1TextureCoord3;
GLboolean Map1TextureCoord4;
GLboolean Map1Vertex3;
GLboolean Map1Vertex4;
GLboolean Map1Attrib[16]; /* GL_NV_vertex_program */
GLboolean Map2Color4;
GLboolean Map2Index;
GLboolean Map2Normal;
GLboolean Map2TextureCoord1;
GLboolean Map2TextureCoord2;
GLboolean Map2TextureCoord3;
GLboolean Map2TextureCoord4;
GLboolean Map2Vertex3;
GLboolean Map2Vertex4;
GLboolean Map2Attrib[16]; /* GL_NV_vertex_program */
GLboolean MinMax;
GLboolean Normalize;
GLboolean PixelTexture;
GLboolean PointSmooth;
GLboolean PolygonOffsetPoint;
GLboolean PolygonOffsetLine;
GLboolean PolygonOffsetFill;
GLboolean PolygonSmooth;
GLboolean PolygonStipple;
GLboolean RescaleNormals;
GLboolean Scissor;
GLboolean Stencil;
GLboolean MultisampleEnabled; /* GL_ARB_multisample */
GLboolean SampleAlphaToCoverage; /* GL_ARB_multisample */
GLboolean SampleAlphaToOne; /* GL_ARB_multisample */
GLboolean SampleCoverage; /* GL_ARB_multisample */
GLboolean SampleCoverageInvert; /* GL_ARB_multisample */
GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
GLuint Texture[MAX_TEXTURE_UNITS];
GLuint TexGen[MAX_TEXTURE_UNITS];
GLboolean VertexProgram; /* GL_NV_vertex_program */
GLboolean VertexProgramPointSize; /* GL_NV_vertex_program */
GLboolean VertexProgramTwoSide; /* GL_NV_vertex_program */
GLboolean PointSprite; /* GL_NV_point_sprite */
};
 
 
struct gl_eval_attrib {
/* Enable bits */
GLboolean Map1Color4;
GLboolean Map1Index;
GLboolean Map1Normal;
GLboolean Map1TextureCoord1;
GLboolean Map1TextureCoord2;
GLboolean Map1TextureCoord3;
GLboolean Map1TextureCoord4;
GLboolean Map1Vertex3;
GLboolean Map1Vertex4;
GLboolean Map1Attrib[16]; /* GL_NV_vertex_program */
GLboolean Map2Color4;
GLboolean Map2Index;
GLboolean Map2Normal;
GLboolean Map2TextureCoord1;
GLboolean Map2TextureCoord2;
GLboolean Map2TextureCoord3;
GLboolean Map2TextureCoord4;
GLboolean Map2Vertex3;
GLboolean Map2Vertex4;
GLboolean Map2Attrib[16]; /* GL_NV_vertex_program */
GLboolean AutoNormal;
/* Map Grid endpoints and divisions and calculated du values */
GLint MapGrid1un;
GLfloat MapGrid1u1, MapGrid1u2, MapGrid1du;
GLint MapGrid2un, MapGrid2vn;
GLfloat MapGrid2u1, MapGrid2u2, MapGrid2du;
GLfloat MapGrid2v1, MapGrid2v2, MapGrid2dv;
};
 
 
struct gl_fog_attrib {
GLboolean Enabled; /* Fog enabled flag */
GLfloat Color[4]; /* Fog color */
GLfloat Density; /* Density >= 0.0 */
GLfloat Start; /* Start distance in eye coords */
GLfloat End; /* End distance in eye coords */
GLfloat Index; /* Fog index */
GLenum Mode; /* Fog mode */
GLboolean ColorSumEnabled;
GLenum FogCoordinateSource; /* GL_EXT_fog_coord */
};
 
 
struct gl_hint_attrib {
/* always one of GL_FASTEST, GL_NICEST, or GL_DONT_CARE */
GLenum PerspectiveCorrection;
GLenum PointSmooth;
GLenum LineSmooth;
GLenum PolygonSmooth;
GLenum Fog;
GLenum ClipVolumeClipping; /* GL_EXT_clip_volume_hint */
GLenum TextureCompression; /* GL_ARB_texture_compression */
GLenum GenerateMipmap; /* GL_SGIS_generate_mipmap */
};
 
 
struct gl_histogram_attrib {
GLuint Width; /* number of table entries */
GLint Format; /* GL_ALPHA, GL_RGB, etc */
GLuint Count[HISTOGRAM_TABLE_SIZE][4]; /* the histogram */
GLboolean Sink; /* terminate image transfer? */
GLubyte RedSize; /* Bits per counter */
GLubyte GreenSize;
GLubyte BlueSize;
GLubyte AlphaSize;
GLubyte LuminanceSize;
};
 
 
struct gl_minmax_attrib {
GLenum Format;
GLboolean Sink;
GLfloat Min[4], Max[4]; /* RGBA */
};
 
 
struct gl_convolution_attrib {
GLenum Format;
GLenum InternalFormat;
GLuint Width;
GLuint Height;
GLfloat Filter[MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_HEIGHT * 4];
};
 
 
#define LIGHT_SPOT 0x1
#define LIGHT_LOCAL_VIEWER 0x2
#define LIGHT_POSITIONAL 0x4
#define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER)
 
struct gl_light_attrib {
struct gl_light Light[MAX_LIGHTS]; /* Array of lights */
struct gl_lightmodel Model; /* Lighting model */
 
/* Must flush FLUSH_VERTICES before referencing:
*/
struct gl_material Material[2]; /* Material 0=front, 1=back */
 
GLboolean Enabled; /* Lighting enabled flag */
GLenum ShadeModel; /* GL_FLAT or GL_SMOOTH */
GLenum ColorMaterialFace; /* GL_FRONT, BACK or FRONT_AND_BACK */
GLenum ColorMaterialMode; /* GL_AMBIENT, GL_DIFFUSE, etc */
GLuint ColorMaterialBitmask; /* bitmask formed from Face and Mode */
GLboolean ColorMaterialEnabled;
 
struct gl_light EnabledList; /* List sentinel */
 
/* Derived for optimizations: */
GLboolean _NeedVertices; /* Use fast shader? */
GLuint _Flags; /* LIGHT_* flags, see above */
GLfloat _BaseColor[2][3];
};
 
 
struct gl_line_attrib {
GLboolean SmoothFlag; /* GL_LINE_SMOOTH enabled? */
GLboolean StippleFlag; /* GL_LINE_STIPPLE enabled? */
GLushort StipplePattern; /* Stipple pattern */
GLint StippleFactor; /* Stipple repeat factor */
GLfloat Width; /* Line width */
GLfloat _Width; /* Clamped Line width */
};
 
 
struct gl_list_attrib {
GLuint ListBase;
};
 
 
struct gl_list_opcode {
GLuint size;
void (*execute)( GLcontext *ctx, void *data );
void (*destroy)( GLcontext *ctx, void *data );
void (*print)( GLcontext *ctx, void *data );
};
 
#define GL_MAX_EXT_OPCODES 16
 
struct gl_list_extensions {
struct gl_list_opcode opcode[GL_MAX_EXT_OPCODES];
GLuint nr_opcodes;
};
 
 
struct gl_multisample_attrib {
GLboolean Enabled;
GLboolean SampleAlphaToCoverage;
GLboolean SampleAlphaToOne;
GLboolean SampleCoverage;
GLfloat SampleCoverageValue;
GLboolean SampleCoverageInvert;
};
 
 
struct gl_pixel_attrib {
GLenum ReadBuffer; /* src buffer for glRead/CopyPixels */
GLubyte _ReadSrcMask; /* Not really a mask, but like _DrawDestMask */
/* May be: FRONT_LEFT_BIT, BACK_LEFT_BIT, */
/* FRONT_RIGHT_BIT or BACK_RIGHT_BIT. */
GLfloat RedBias, RedScale;
GLfloat GreenBias, GreenScale;
GLfloat BlueBias, BlueScale;
GLfloat AlphaBias, AlphaScale;
GLfloat DepthBias, DepthScale;
GLint IndexShift, IndexOffset;
GLboolean MapColorFlag;
GLboolean MapStencilFlag;
GLfloat ZoomX, ZoomY;
/* XXX move these out of gl_pixel_attrib */
GLint MapStoSsize; /* Size of each pixel map */
GLint MapItoIsize;
GLint MapItoRsize;
GLint MapItoGsize;
GLint MapItoBsize;
GLint MapItoAsize;
GLint MapRtoRsize;
GLint MapGtoGsize;
GLint MapBtoBsize;
GLint MapAtoAsize;
GLint MapStoS[MAX_PIXEL_MAP_TABLE]; /* Pixel map tables */
GLint MapItoI[MAX_PIXEL_MAP_TABLE];
GLfloat MapItoR[MAX_PIXEL_MAP_TABLE];
GLfloat MapItoG[MAX_PIXEL_MAP_TABLE];
GLfloat MapItoB[MAX_PIXEL_MAP_TABLE];
GLfloat MapItoA[MAX_PIXEL_MAP_TABLE];
GLubyte MapItoR8[MAX_PIXEL_MAP_TABLE]; /* converted to 8-bit color */
GLubyte MapItoG8[MAX_PIXEL_MAP_TABLE];
GLubyte MapItoB8[MAX_PIXEL_MAP_TABLE];
GLubyte MapItoA8[MAX_PIXEL_MAP_TABLE];
GLfloat MapRtoR[MAX_PIXEL_MAP_TABLE];
GLfloat MapGtoG[MAX_PIXEL_MAP_TABLE];
GLfloat MapBtoB[MAX_PIXEL_MAP_TABLE];
GLfloat MapAtoA[MAX_PIXEL_MAP_TABLE];
/* GL_EXT_histogram */
GLboolean HistogramEnabled;
GLboolean MinMaxEnabled;
/* GL_SGIS_pixel_texture */
GLboolean PixelTextureEnabled;
GLenum FragmentRgbSource;
GLenum FragmentAlphaSource;
/* GL_SGI_color_matrix */
GLfloat PostColorMatrixScale[4]; /* RGBA */
GLfloat PostColorMatrixBias[4]; /* RGBA */
/* GL_SGI_color_table */
GLfloat ColorTableScale[4];
GLfloat ColorTableBias[4];
GLboolean ColorTableEnabled;
GLfloat PCCTscale[4];
GLfloat PCCTbias[4];
GLboolean PostConvolutionColorTableEnabled;
GLfloat PCMCTscale[4];
GLfloat PCMCTbias[4];
GLboolean PostColorMatrixColorTableEnabled;
/* Convolution */
GLboolean Convolution1DEnabled;
GLboolean Convolution2DEnabled;
GLboolean Separable2DEnabled;
GLfloat ConvolutionBorderColor[3][4];
GLenum ConvolutionBorderMode[3];
GLfloat ConvolutionFilterScale[3][4];
GLfloat ConvolutionFilterBias[3][4];
GLfloat PostConvolutionScale[4]; /* RGBA */
GLfloat PostConvolutionBias[4]; /* RGBA */
};
 
 
struct gl_point_attrib {
GLboolean SmoothFlag; /* True if GL_POINT_SMOOTH is enabled */
GLfloat Size; /* User-specified point size */
GLfloat _Size; /* Size clamped to Const.Min/MaxPointSize */
GLfloat Params[3]; /* GL_EXT_point_parameters */
GLfloat MinSize, MaxSize; /* GL_EXT_point_parameters */
GLfloat Threshold; /* GL_EXT_point_parameters */
GLboolean _Attenuated; /* True if Params != [1, 0, 0] */
GLboolean PointSprite; /* GL_NV_point_sprite */
GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /* GL_NV_point_sprite */
GLenum SpriteRMode; /* GL_NV_point_sprite */
};
 
 
struct gl_polygon_attrib {
GLenum FrontFace; /* Either GL_CW or GL_CCW */
GLenum FrontMode; /* Either GL_POINT, GL_LINE or GL_FILL */
GLenum BackMode; /* Either GL_POINT, GL_LINE or GL_FILL */
GLboolean _FrontBit; /* 0=GL_CCW, 1=GL_CW */
GLboolean CullFlag; /* Culling on/off flag */
GLboolean SmoothFlag; /* True if GL_POLYGON_SMOOTH is enabled */
GLboolean StippleFlag; /* True if GL_POLYGON_STIPPLE is enabled */
GLenum CullFaceMode; /* Culling mode GL_FRONT or GL_BACK */
GLfloat OffsetFactor; /* Polygon offset factor, from user */
GLfloat OffsetUnits; /* Polygon offset units, from user */
GLboolean OffsetPoint; /* Offset in GL_POINT mode */
GLboolean OffsetLine; /* Offset in GL_LINE mode */
GLboolean OffsetFill; /* Offset in GL_FILL mode */
};
 
 
struct gl_scissor_attrib {
GLboolean Enabled; /* Scissor test enabled? */
GLint X, Y; /* Lower left corner of box */
GLsizei Width, Height; /* Size of box */
};
 
 
struct gl_stencil_attrib {
GLboolean Enabled; /* Enabled flag */
GLboolean TestTwoSide; /* GL_EXT_stencil_two_side */
GLubyte ActiveFace; /* GL_EXT_stencil_two_side (0 or 1) */
GLenum Function[2]; /* Stencil function */
GLenum FailFunc[2]; /* Fail function */
GLenum ZPassFunc[2]; /* Depth buffer pass function */
GLenum ZFailFunc[2]; /* Depth buffer fail function */
GLstencil Ref[2]; /* Reference value */
GLstencil ValueMask[2]; /* Value mask */
GLstencil WriteMask[2]; /* Write mask */
GLstencil Clear; /* Clear value */
};
 
 
/* TexGenEnabled flags */
#define S_BIT 1
#define T_BIT 2
#define R_BIT 4
#define Q_BIT 8
 
/* Texture.Unit[]._ReallyEnabled flags: */
#define TEXTURE_1D_BIT 0x01
#define TEXTURE_2D_BIT 0x02
#define TEXTURE_3D_BIT 0x04
#define TEXTURE_CUBE_BIT 0x08
#define TEXTURE_RECT_BIT 0x10
 
#define NUM_TEXTURE_TARGETS 5 /* 1D, 2D, 3D, CUBE and RECT */
 
 
/* Bitmap versions of the GL_ constants. */
#define TEXGEN_SPHERE_MAP 0x1
#define TEXGEN_OBJ_LINEAR 0x2
#define TEXGEN_EYE_LINEAR 0x4
#define TEXGEN_REFLECTION_MAP_NV 0x8
#define TEXGEN_NORMAL_MAP_NV 0x10
 
#define TEXGEN_NEED_NORMALS (TEXGEN_SPHERE_MAP | \
TEXGEN_REFLECTION_MAP_NV | \
TEXGEN_NORMAL_MAP_NV)
#define TEXGEN_NEED_EYE_COORD (TEXGEN_SPHERE_MAP | \
TEXGEN_REFLECTION_MAP_NV | \
TEXGEN_NORMAL_MAP_NV | \
TEXGEN_EYE_LINEAR)
 
 
 
/* A selection of state flags to make driver and module's lives easier. */
#define ENABLE_TEXGEN0 0x1
#define ENABLE_TEXGEN1 0x2
#define ENABLE_TEXGEN2 0x4
#define ENABLE_TEXGEN3 0x8
#define ENABLE_TEXGEN4 0x10
#define ENABLE_TEXGEN5 0x20
#define ENABLE_TEXGEN6 0x40
#define ENABLE_TEXGEN7 0x80
 
#define ENABLE_TEXMAT0 0x1 /* Ie. not the identity matrix */
#define ENABLE_TEXMAT1 0x2
#define ENABLE_TEXMAT2 0x4
#define ENABLE_TEXMAT3 0x8
#define ENABLE_TEXMAT4 0x10
#define ENABLE_TEXMAT5 0x20
#define ENABLE_TEXMAT6 0x40
#define ENABLE_TEXMAT7 0x80
 
#define ENABLE_TEXGEN(i) (ENABLE_TEXGEN0 << (i))
#define ENABLE_TEXMAT(i) (ENABLE_TEXMAT0 << (i))
 
/*
* If teximage is color-index, texelOut returns GLchan[1].
* If teximage is depth, texelOut returns GLfloat[1].
* Otherwise, texelOut returns GLchan[4].
*/
typedef void (*FetchTexelFunc)( const struct gl_texture_image *texImage,
GLint col, GLint row, GLint img,
GLvoid *texelOut );
 
/* Texture format record */
struct gl_texture_format {
GLint MesaFormat; /* One of the MESA_FORMAT_* values */
 
GLenum BaseFormat; /* Either GL_ALPHA, GL_INTENSITY, GL_LUMINANCE,
* GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA,
* GL_COLOR_INDEX or GL_DEPTH_COMPONENT.
*/
GLubyte RedBits; /* Bits per texel component */
GLubyte GreenBits; /* These are just rough approximations for */
GLubyte BlueBits; /* compressed texture formats. */
GLubyte AlphaBits;
GLubyte LuminanceBits;
GLubyte IntensityBits;
GLubyte IndexBits;
GLubyte DepthBits;
 
GLint TexelBytes; /* Bytes per texel (0 for compressed formats */
 
FetchTexelFunc FetchTexel1D; /* Texel fetch function pointers */
FetchTexelFunc FetchTexel2D;
FetchTexelFunc FetchTexel3D;
};
 
 
/* Texture image record */
struct gl_texture_image {
GLenum Format; /* GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
* GL_INTENSITY, GL_RGB, GL_RGBA,
* GL_COLOR_INDEX or GL_DEPTH_COMPONENT only.
* Used for choosing TexEnv arithmetic.
*/
GLint IntFormat; /* Internal format as given by the user */
GLuint Border; /* 0 or 1 */
GLuint Width; /* = 2^WidthLog2 + 2*Border */
GLuint Height; /* = 2^HeightLog2 + 2*Border */
GLuint Depth; /* = 2^DepthLog2 + 2*Border */
GLuint RowStride; /* == Width unless IsClientData and padded */
GLuint Width2; /* = Width - 2*Border */
GLuint Height2; /* = Height - 2*Border */
GLuint Depth2; /* = Depth - 2*Border */
GLuint WidthLog2; /* = log2(Width2) */
GLuint HeightLog2; /* = log2(Height2) */
GLuint DepthLog2; /* = log2(Depth2) */
GLuint MaxLog2; /* = MAX(WidthLog2, HeightLog2) */
GLfloat WidthScale; /* used for mipmap lod computation */
GLfloat HeightScale; /* used for mipmap lod computation */
GLfloat DepthScale; /* used for mipmap lod computation */
GLvoid *Data; /* Image data, accessed via FetchTexel() */
GLboolean IsClientData; /* Data owned by client? */
 
 
const struct gl_texture_format *TexFormat;
 
FetchTexelFunc FetchTexel; /* Texel fetch function pointer */
 
GLboolean IsCompressed; /* GL_ARB_texture_compression */
GLuint CompressedSize; /* GL_ARB_texture_compression */
 
/* For device driver: */
void *DriverData; /* Arbitrary device driver data */
};
 
 
/* Texture object record */
struct gl_texture_object {
_glthread_Mutex Mutex; /* for thread safety */
GLint RefCount; /* reference count */
GLuint Name; /* an unsigned integer */
GLenum Target; /* GL_TEXTURE_1D, GL_TEXTURE_2D, etc. */
GLfloat Priority; /* in [0,1] */
GLfloat BorderColor[4]; /* unclamped */
GLchan _BorderChan[4]; /* clamped, as GLchan */
GLenum WrapS; /* Wrap modes are: GL_CLAMP, REPEAT */
GLenum WrapT; /* GL_CLAMP_TO_EDGE, and */
GLenum WrapR; /* GL_CLAMP_TO_BORDER_ARB */
GLenum MinFilter; /* minification filter */
GLenum MagFilter; /* magnification filter */
GLfloat MinLod; /* min lambda, OpenGL 1.2 */
GLfloat MaxLod; /* max lambda, OpenGL 1.2 */
GLint BaseLevel; /* min mipmap level, OpenGL 1.2 */
GLint MaxLevel; /* max mipmap level, OpenGL 1.2 */
GLfloat MaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
GLboolean CompareFlag; /* GL_SGIX_shadow */
GLenum CompareOperator; /* GL_SGIX_shadow */
GLfloat ShadowAmbient;
GLenum CompareMode; /* GL_ARB_shadow */
GLenum CompareFunc; /* GL_ARB_shadow */
GLenum DepthMode; /* GL_ARB_depth_texture */
GLint _MaxLevel; /* actual max mipmap level (q in the spec) */
GLfloat _MaxLambda; /* = _MaxLevel - BaseLevel (q - b in spec) */
GLboolean GenerateMipmap; /* GL_SGIS_generate_mipmap */
 
struct gl_texture_image *Image[MAX_TEXTURE_LEVELS];
 
/* Texture cube faces */
/* Image[] is alias for *PosX[MAX_TEXTURE_LEVELS]; */
struct gl_texture_image *NegX[MAX_TEXTURE_LEVELS];
struct gl_texture_image *PosY[MAX_TEXTURE_LEVELS];
struct gl_texture_image *NegY[MAX_TEXTURE_LEVELS];
struct gl_texture_image *PosZ[MAX_TEXTURE_LEVELS];
struct gl_texture_image *NegZ[MAX_TEXTURE_LEVELS];
 
/* GL_EXT_paletted_texture */
struct gl_color_table Palette;
 
GLboolean Complete; /* Is texture object complete? */
struct gl_texture_object *Next; /* Next in linked list */
 
/* For device driver: */
void *DriverData; /* Arbitrary device driver data */
};
 
 
/* Texture unit record */
struct gl_texture_unit {
GLuint Enabled; /* bitmask of TEXTURE_*_BIT flags */
GLuint _ReallyEnabled; /* 0 or exactly one of TEXTURE_*_BIT flags */
 
GLenum EnvMode; /* GL_MODULATE, GL_DECAL, GL_BLEND, etc. */
GLfloat EnvColor[4];
GLuint TexGenEnabled; /* Bitwise-OR of [STRQ]_BIT values */
GLenum GenModeS; /* Tex coord generation mode, either */
GLenum GenModeT; /* GL_OBJECT_LINEAR, or */
GLenum GenModeR; /* GL_EYE_LINEAR, or */
GLenum GenModeQ; /* GL_SPHERE_MAP */
GLuint _GenBitS;
GLuint _GenBitT;
GLuint _GenBitR;
GLuint _GenBitQ;
GLuint _GenFlags; /* bitwise or of GenBit[STRQ] */
GLfloat ObjectPlaneS[4];
GLfloat ObjectPlaneT[4];
GLfloat ObjectPlaneR[4];
GLfloat ObjectPlaneQ[4];
GLfloat EyePlaneS[4];
GLfloat EyePlaneT[4];
GLfloat EyePlaneR[4];
GLfloat EyePlaneQ[4];
GLfloat LodBias; /* for biasing mipmap levels */
 
/* GL_EXT_texture_env_combine */
GLenum CombineModeRGB; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */
GLenum CombineModeA; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */
GLenum CombineSourceRGB[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */
GLenum CombineSourceA[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */
GLenum CombineOperandRGB[3]; /* SRC_COLOR, ONE_MINUS_SRC_COLOR, etc */
GLenum CombineOperandA[3]; /* SRC_ALPHA, ONE_MINUS_SRC_ALPHA, etc */
GLuint CombineScaleShiftRGB; /* 0, 1 or 2 */
GLuint CombineScaleShiftA; /* 0, 1 or 2 */
 
struct gl_texture_object *Current1D;
struct gl_texture_object *Current2D;
struct gl_texture_object *Current3D;
struct gl_texture_object *CurrentCubeMap; /* GL_ARB_texture_cube_map */
struct gl_texture_object *CurrentRect; /* GL_NV_texture_rectangle */
 
struct gl_texture_object *_Current; /* Points to really enabled tex obj */
 
struct gl_texture_object Saved1D; /* only used by glPush/PopAttrib */
struct gl_texture_object Saved2D;
struct gl_texture_object Saved3D;
struct gl_texture_object SavedCubeMap;
struct gl_texture_object SavedRect;
};
 
 
/* The texture attribute group */
struct gl_texture_attrib {
/* multitexture */
GLuint CurrentUnit; /* Active texture unit */
 
GLuint _EnabledUnits; /* one bit set for each really-enabled unit */
GLuint _GenFlags; /* for texgen */
GLuint _TexGenEnabled;
GLuint _TexMatEnabled;
 
struct gl_texture_unit Unit[MAX_TEXTURE_UNITS];
 
struct gl_texture_object *Proxy1D;
struct gl_texture_object *Proxy2D;
struct gl_texture_object *Proxy3D;
struct gl_texture_object *ProxyCubeMap;
struct gl_texture_object *ProxyRect;
 
/* GL_EXT_shared_texture_palette */
GLboolean SharedPalette;
struct gl_color_table Palette;
};
 
 
struct gl_transform_attrib {
GLenum MatrixMode; /* Matrix mode */
GLfloat EyeUserPlane[MAX_CLIP_PLANES][4];
GLfloat _ClipUserPlane[MAX_CLIP_PLANES][4]; /* derived */
GLuint ClipPlanesEnabled; /* on/off bitmask */
GLboolean Normalize; /* Normalize all normals? */
GLboolean RescaleNormals; /* GL_EXT_rescale_normal */
GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
};
 
 
struct gl_viewport_attrib {
GLint X, Y; /* position */
GLsizei Width, Height; /* size */
GLfloat Near, Far; /* Depth buffer range */
GLmatrix _WindowMap; /* Mapping transformation as a matrix. */
};
 
 
/* For the attribute stack: */
struct gl_attrib_node {
GLbitfield kind;
void *data;
struct gl_attrib_node *next;
};
 
 
/*
* Client pixel packing/unpacking attributes
*/
struct gl_pixelstore_attrib {
GLint Alignment;
GLint RowLength;
GLint SkipPixels;
GLint SkipRows;
GLint ImageHeight; /* for GL_EXT_texture3D */
GLint SkipImages; /* for GL_EXT_texture3D */
GLboolean SwapBytes;
GLboolean LsbFirst;
GLboolean ClientStorage; /* GL_APPLE_client_storage */
GLboolean Invert; /* GL_MESA_pack_invert */
};
 
 
#define CA_CLIENT_DATA 0x1 /* Data not alloced by mesa */
 
 
/*
* Client vertex array attributes
*/
struct gl_client_array {
GLint Size;
GLenum Type;
GLsizei Stride; /* user-specified stride */
GLsizei StrideB; /* actual stride in bytes */
void *Ptr;
GLuint Flags;
GLuint Enabled; /* one of the _NEW_ARRAY_ bits */
};
 
 
struct gl_array_attrib {
struct gl_client_array Vertex; /* client data descriptors */
struct gl_client_array Normal;
struct gl_client_array Color;
struct gl_client_array SecondaryColor;
struct gl_client_array FogCoord;
struct gl_client_array Index;
struct gl_client_array TexCoord[MAX_TEXTURE_UNITS];
struct gl_client_array EdgeFlag;
 
struct gl_client_array VertexAttrib[16]; /* GL_NV_vertex_program */
 
GLint TexCoordInterleaveFactor;
GLint ActiveTexture; /* Client Active Texture */
GLuint LockFirst;
GLuint LockCount;
 
GLuint _Enabled; /* _NEW_ARRAY_* - bit set if array enabled */
GLuint NewState; /* _NEW_ARRAY_* */
};
 
 
struct gl_feedback {
GLenum Type;
GLuint _Mask; /* FB_* bits */
GLfloat *Buffer;
GLuint BufferSize;
GLuint Count;
};
 
 
struct gl_selection {
GLuint *Buffer;
GLuint BufferSize; /* size of SelectBuffer */
GLuint BufferCount; /* number of values in SelectBuffer */
GLuint Hits; /* number of records in SelectBuffer */
GLuint NameStackDepth;
GLuint NameStack[MAX_NAME_STACK_DEPTH];
GLboolean HitFlag;
GLfloat HitMinZ, HitMaxZ;
};
 
 
/*
* 1-D Evaluator control points
*/
struct gl_1d_map {
GLuint Order; /* Number of control points */
GLfloat u1, u2, du; /* u1, u2, 1.0/(u2-u1) */
GLfloat *Points; /* Points to contiguous control points */
};
 
 
/*
* 2-D Evaluator control points
*/
struct gl_2d_map {
GLuint Uorder; /* Number of control points in U dimension */
GLuint Vorder; /* Number of control points in V dimension */
GLfloat u1, u2, du;
GLfloat v1, v2, dv;
GLfloat *Points; /* Points to contiguous control points */
};
 
 
/*
* All evalutator control points
*/
struct gl_evaluators {
/* 1-D maps */
struct gl_1d_map Map1Vertex3;
struct gl_1d_map Map1Vertex4;
struct gl_1d_map Map1Index;
struct gl_1d_map Map1Color4;
struct gl_1d_map Map1Normal;
struct gl_1d_map Map1Texture1;
struct gl_1d_map Map1Texture2;
struct gl_1d_map Map1Texture3;
struct gl_1d_map Map1Texture4;
struct gl_1d_map Map1Attrib[16]; /* GL_NV_vertex_program */
 
/* 2-D maps */
struct gl_2d_map Map2Vertex3;
struct gl_2d_map Map2Vertex4;
struct gl_2d_map Map2Index;
struct gl_2d_map Map2Color4;
struct gl_2d_map Map2Normal;
struct gl_2d_map Map2Texture1;
struct gl_2d_map Map2Texture2;
struct gl_2d_map Map2Texture3;
struct gl_2d_map Map2Texture4;
struct gl_2d_map Map2Attrib[16]; /* GL_NV_vertex_program */
};
 
 
/*
* Vertex program tokens and datatypes
*/
 
#define VP_MAX_INSTRUCTIONS 128
 
#define VP_NUM_INPUT_REGS VERT_ATTRIB_MAX
#define VP_NUM_OUTPUT_REGS 15
#define VP_NUM_TEMP_REGS 12
#define VP_NUM_PROG_REGS 96
 
#define VP_NUM_TOTAL_REGISTERS (VP_NUM_INPUT_REGS + VP_NUM_OUTPUT_REGS + VP_NUM_TEMP_REGS + VP_NUM_PROG_REGS)
 
/* Location of register sets within the whole register file */
#define VP_INPUT_REG_START 0
#define VP_INPUT_REG_END (VP_INPUT_REG_START + VP_NUM_INPUT_REGS - 1)
#define VP_OUTPUT_REG_START (VP_INPUT_REG_END + 1)
#define VP_OUTPUT_REG_END (VP_OUTPUT_REG_START + VP_NUM_OUTPUT_REGS - 1)
#define VP_TEMP_REG_START (VP_OUTPUT_REG_END + 1)
#define VP_TEMP_REG_END (VP_TEMP_REG_START + VP_NUM_TEMP_REGS - 1)
#define VP_PROG_REG_START (VP_TEMP_REG_END + 1)
#define VP_PROG_REG_END (VP_PROG_REG_START + VP_NUM_PROG_REGS - 1)
 
 
/* Machine state (i.e. the register file) */
struct vp_machine
{
GLfloat Registers[VP_NUM_TOTAL_REGISTERS][4];
GLint AddressReg; /* might someday be a 4-vector */
};
 
 
/* Vertex program opcodes */
enum vp_opcode
{
MOV,
LIT,
RCP,
RSQ,
EXP,
LOG,
MUL,
ADD,
DP3,
DP4,
DST,
MIN,
MAX,
SLT,
SGE,
MAD,
ARL,
DPH,
RCC,
SUB,
ABS,
END
};
 
 
/* Instruction source register */
struct vp_src_register
{
GLint Register; /* or the offset from the address register */
GLuint Swizzle[4];
GLboolean Negate;
GLboolean RelAddr;
};
 
 
/* Instruction destination register */
struct vp_dst_register
{
GLint Register;
GLboolean WriteMask[4];
};
 
 
/* Vertex program instruction */
struct vp_instruction
{
enum vp_opcode Opcode;
struct vp_src_register SrcReg[3];
struct vp_dst_register DstReg;
};
 
 
/* The actual vertex program, stored in the hash table */
struct vp_program
{
GLubyte *String; /* Original user code */
struct vp_instruction *Instructions; /* Compiled instructions */
GLenum Target; /* GL_VERTEX_PROGRAM_NV or GL_VERTEX_STATE_PROGRAM_NV */
GLint RefCount; /* Since programs can be shared among contexts */
GLboolean IsPositionInvariant; /* GL_NV_vertex_program1_1 */
GLboolean Resident;
GLuint InputsRead; /* Bitmask of which input regs are read */
GLuint OutputsWritten; /* Bitmask of which output regs are written to */
};
 
 
/*
* State vars for GL_NV_vertex_program
*/
struct vertex_program_state
{
GLboolean Enabled; /* GL_VERTEX_PROGRAM_NV */
GLboolean PointSizeEnabled; /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
GLboolean TwoSideEnabled; /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
GLuint CurrentID; /* currently bound program's ID */
GLint ErrorPos; /* GL_PROGRAM_ERROR_POSITION_NV */
struct vp_program *Current; /* ptr to currently bound program */
struct vp_machine Machine; /* machine state */
 
GLenum TrackMatrix[VP_NUM_PROG_REGS / 4];
GLenum TrackMatrixTransform[VP_NUM_PROG_REGS / 4];
};
 
 
 
/*
* State which can be shared by multiple contexts:
*/
struct gl_shared_state {
_glthread_Mutex Mutex; /* for thread safety */
GLint RefCount; /* Reference count */
struct _mesa_HashTable *DisplayList; /* Display lists hash table */
struct _mesa_HashTable *TexObjects; /* Texture objects hash table */
struct gl_texture_object *TexObjectList;/* Linked list of texture objects */
 
/* Default texture objects (shared by all multi-texture units) */
struct gl_texture_object *Default1D;
struct gl_texture_object *Default2D;
struct gl_texture_object *Default3D;
struct gl_texture_object *DefaultCubeMap;
struct gl_texture_object *DefaultRect;
 
/* GL_NV_vertex_program */
struct _mesa_HashTable *VertexPrograms;
 
void *DriverData; /* Device driver shared state */
};
 
 
/*
* A "frame buffer" is a color buffer and its optional ancillary buffers:
* depth, accum, stencil, and software-simulated alpha buffers.
* In C++ terms, think of this as a base class from which device drivers
* will make derived classes.
*/
struct gl_frame_buffer {
GLvisual Visual; /* The corresponding visual */
 
GLuint Width, Height; /* size of frame buffer in pixels */
 
GLboolean UseSoftwareDepthBuffer;
GLboolean UseSoftwareAccumBuffer;
GLboolean UseSoftwareStencilBuffer;
GLboolean UseSoftwareAlphaBuffers;
 
/* Software depth (aka Z) buffer */
GLvoid *DepthBuffer; /* array [Width*Height] of GLushort or GLuint*/
 
/* Software stencil buffer */
GLstencil *Stencil; /* array [Width*Height] of GLstencil values */
 
/* Software accumulation buffer */
GLaccum *Accum; /* array [4*Width*Height] of GLaccum values */
 
/* Software alpha planes */
GLvoid *FrontLeftAlpha; /* array [Width*Height] of GLubyte */
GLvoid *BackLeftAlpha; /* array [Width*Height] of GLubyte */
GLvoid *FrontRightAlpha; /* array [Width*Height] of GLubyte */
GLvoid *BackRightAlpha; /* array [Width*Height] of GLubyte */
 
/* Drawing bounds: intersection of window size and scissor box */
GLint _Xmin, _Ymin; /* inclusive */
GLint _Xmax, _Ymax; /* exclusive */
};
 
 
/*
* Constants which may be overriden by device driver during context creation
* but are never changed after that.
*/
struct gl_constants {
GLint MaxTextureLevels;
GLint Max3DTextureLevels;
GLint MaxCubeTextureLevels; /* GL_ARB_texture_cube_map */
GLint MaxTextureRectSize; /* GL_NV_texture_rectangle */
GLuint MaxTextureUnits;
GLfloat MaxTextureMaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
GLfloat MaxTextureLodBias; /* GL_EXT_texture_lod_bias */
GLuint MaxArrayLockSize;
GLint SubPixelBits;
GLfloat MinPointSize, MaxPointSize; /* aliased */
GLfloat MinPointSizeAA, MaxPointSizeAA; /* antialiased */
GLfloat PointSizeGranularity;
GLfloat MinLineWidth, MaxLineWidth; /* aliased */
GLfloat MinLineWidthAA, MaxLineWidthAA; /* antialiased */
GLfloat LineWidthGranularity;
GLuint NumAuxBuffers;
GLuint MaxColorTableSize;
GLuint MaxConvolutionWidth;
GLuint MaxConvolutionHeight;
GLuint MaxClipPlanes;
GLuint MaxLights;
};
 
 
/*
* List of extensions.
*/
struct extension;
struct gl_extensions {
char *ext_string;
struct extension *ext_list;
/* Flags to quickly test if certain extensions are available.
* Not every extension needs to have such a flag, but it's encouraged.
*/
GLboolean ARB_depth_texture;
GLboolean ARB_imaging;
GLboolean ARB_multisample;
GLboolean ARB_multitexture;
GLboolean ARB_shadow;
GLboolean ARB_texture_border_clamp;
GLboolean ARB_texture_compression;
GLboolean ARB_texture_cube_map;
GLboolean ARB_texture_env_combine;
GLboolean ARB_texture_env_crossbar;
GLboolean ARB_texture_env_dot3;
GLboolean ARB_texture_mirrored_repeat;
GLboolean ARB_window_pos;
GLboolean ATI_texture_mirror_once;
GLboolean EXT_blend_color;
GLboolean EXT_blend_func_separate;
GLboolean EXT_blend_logic_op;
GLboolean EXT_blend_minmax;
GLboolean EXT_blend_subtract;
GLboolean EXT_clip_volume_hint;
GLboolean EXT_convolution;
GLboolean EXT_compiled_vertex_array;
GLboolean EXT_fog_coord;
GLboolean EXT_histogram;
GLboolean EXT_multi_draw_arrays;
GLboolean EXT_packed_pixels;
GLboolean EXT_paletted_texture;
GLboolean EXT_point_parameters;
GLboolean EXT_polygon_offset;
GLboolean EXT_rescale_normal;
GLboolean EXT_shadow_funcs;
GLboolean EXT_secondary_color;
GLboolean EXT_shared_texture_palette;
GLboolean EXT_stencil_wrap;
GLboolean EXT_stencil_two_side;
GLboolean EXT_texture3D;
GLboolean EXT_texture_compression_s3tc;
GLboolean EXT_texture_env_add;
GLboolean EXT_texture_env_combine;
GLboolean EXT_texture_env_dot3;
GLboolean EXT_texture_filter_anisotropic;
GLboolean EXT_texture_object;
GLboolean EXT_texture_lod_bias;
GLboolean EXT_vertex_array_set;
GLboolean HP_occlusion_test;
GLboolean IBM_rasterpos_clip;
GLboolean INGR_blend_func_separate;
GLboolean MESA_pack_invert;
GLboolean MESA_window_pos;
GLboolean MESA_resize_buffers;
GLboolean MESA_ycbcr_texture;
GLboolean NV_blend_square;
GLboolean NV_point_sprite;
GLboolean NV_texture_rectangle;
GLboolean NV_texgen_reflection;
GLboolean NV_vertex_program;
GLboolean NV_vertex_program1_1;
GLboolean SGI_color_matrix;
GLboolean SGI_color_table;
GLboolean SGIS_generate_mipmap;
GLboolean SGIS_pixel_texture;
GLboolean SGIS_texture_edge_clamp;
GLboolean SGIX_depth_texture;
GLboolean SGIX_pixel_texture;
GLboolean SGIX_shadow;
GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */
GLboolean TDFX_texture_compression_FXT1;
GLboolean APPLE_client_storage;
};
 
 
/*
* A stack of matrices (projection, modelview, color, texture, etc).
*/
struct matrix_stack
{
GLmatrix *Top; /* points into Stack */
GLmatrix *Stack; /* array [MaxDepth] of GLmatrix */
GLuint Depth; /* 0 <= Depth < MaxDepth */
GLuint MaxDepth; /* size of Stack[] array */
GLuint DirtyFlag; /* _NEW_MODELVIEW or _NEW_PROJECTION, for example */
};
 
 
/*
* Bits for image transfer operations (ctx->ImageTransferState).
*/
#define IMAGE_SCALE_BIAS_BIT 0x1
#define IMAGE_SHIFT_OFFSET_BIT 0x2
#define IMAGE_MAP_COLOR_BIT 0x4
#define IMAGE_COLOR_TABLE_BIT 0x8
#define IMAGE_CONVOLUTION_BIT 0x10
#define IMAGE_POST_CONVOLUTION_SCALE_BIAS 0x20
#define IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT 0x40
#define IMAGE_COLOR_MATRIX_BIT 0x80
#define IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT 0x100
#define IMAGE_HISTOGRAM_BIT 0x200
#define IMAGE_MIN_MAX_BIT 0x400
 
/* transfer ops up to convolution: */
#define IMAGE_PRE_CONVOLUTION_BITS (IMAGE_SCALE_BIAS_BIT | \
IMAGE_SHIFT_OFFSET_BIT | \
IMAGE_MAP_COLOR_BIT | \
IMAGE_COLOR_TABLE_BIT)
 
/* transfer ops after convolution: */
#define IMAGE_POST_CONVOLUTION_BITS (IMAGE_POST_CONVOLUTION_SCALE_BIAS | \
IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT | \
IMAGE_COLOR_MATRIX_BIT | \
IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT |\
IMAGE_HISTOGRAM_BIT | \
IMAGE_MIN_MAX_BIT)
 
 
/*
* Bits to indicate what state has changed. 6 unused flags.
*/
#define _NEW_MODELVIEW 0x1 /* ctx->ModelView */
#define _NEW_PROJECTION 0x2 /* ctx->Projection */
#define _NEW_TEXTURE_MATRIX 0x4 /* ctx->TextureMatrix */
#define _NEW_COLOR_MATRIX 0x8 /* ctx->ColorMatrix */
#define _NEW_ACCUM 0x10 /* ctx->Accum */
#define _NEW_COLOR 0x20 /* ctx->Color */
#define _NEW_DEPTH 0x40 /* ctx->Depth */
#define _NEW_EVAL 0x80 /* ctx->Eval, ctx->EvalMap */
#define _NEW_FOG 0x100 /* ctx->Fog */
#define _NEW_HINT 0x200 /* ctx->Hint */
#define _NEW_LIGHT 0x400 /* ctx->Light */
#define _NEW_LINE 0x800 /* ctx->Line */
#define _NEW_PIXEL 0x1000 /* ctx->Pixel */
#define _NEW_POINT 0x2000 /* ctx->Point */
#define _NEW_POLYGON 0x4000 /* ctx->Polygon */
#define _NEW_POLYGONSTIPPLE 0x8000 /* ctx->PolygonStipple */
#define _NEW_SCISSOR 0x10000 /* ctx->Scissor */
#define _NEW_STENCIL 0x20000 /* ctx->Stencil */
#define _NEW_TEXTURE 0x40000 /* ctx->Texture */
#define _NEW_TRANSFORM 0x80000 /* ctx->Transform */
#define _NEW_VIEWPORT 0x100000 /* ctx->Viewport */
#define _NEW_PACKUNPACK 0x200000 /* ctx->Pack, ctx->Unpack */
#define _NEW_ARRAY 0x400000 /* ctx->Array */
#define _NEW_RENDERMODE 0x800000 /* RenderMode, Feedback, Select */
#define _NEW_BUFFERS 0x1000000 /* ctx->Visual, ctx->DrawBuffer, */
#define _NEW_MULTISAMPLE 0x2000000 /* ctx->Multisample */
#define _NEW_TRACK_MATRIX 0x4000000 /* ctx->VertexProgram */
#define _NEW_PROGRAM 0x8000000 /* ctx->VertexProgram */
#define _NEW_ALL ~0
 
 
 
/* Bits to track array state changes (also used to summarize array enabled)
*/
#define _NEW_ARRAY_VERTEX VERT_BIT_POS
#define _NEW_ARRAY_WEIGHT VERT_BIT_WEIGHT
#define _NEW_ARRAY_NORMAL VERT_BIT_NORMAL
#define _NEW_ARRAY_COLOR0 VERT_BIT_COLOR0
#define _NEW_ARRAY_COLOR1 VERT_BIT_COLOR1
#define _NEW_ARRAY_FOGCOORD VERT_BIT_FOG
#define _NEW_ARRAY_INDEX VERT_BIT_SIX
#define _NEW_ARRAY_EDGEFLAG VERT_BIT_SEVEN
#define _NEW_ARRAY_TEXCOORD_0 VERT_BIT_TEX0
#define _NEW_ARRAY_TEXCOORD_1 VERT_BIT_TEX1
#define _NEW_ARRAY_TEXCOORD_2 VERT_BIT_TEX2
#define _NEW_ARRAY_TEXCOORD_3 VERT_BIT_TEX3
#define _NEW_ARRAY_TEXCOORD_4 VERT_BIT_TEX4
#define _NEW_ARRAY_TEXCOORD_5 VERT_BIT_TEX5
#define _NEW_ARRAY_TEXCOORD_6 VERT_BIT_TEX6
#define _NEW_ARRAY_TEXCOORD_7 VERT_BIT_TEX7
#define _NEW_ARRAY_ATTRIB_0 0x10000 /* start at bit 16 */
#define _NEW_ARRAY_ALL 0xffffffff
 
 
#define _NEW_ARRAY_TEXCOORD(i) (_NEW_ARRAY_TEXCOORD_0 << (i))
#define _NEW_ARRAY_ATTRIB(i) (_NEW_ARRAY_ATTRIB_0 << (i))
 
 
/* A bunch of flags that we think might be useful to drivers.
* Set in the ctx->_TriangleCaps bitfield.
*/
#define DD_FLATSHADE 0x1
#define DD_SEPARATE_SPECULAR 0x2
#define DD_TRI_CULL_FRONT_BACK 0x4 /* special case on some hw */
#define DD_TRI_LIGHT_TWOSIDE 0x8
#define DD_TRI_UNFILLED 0x10
#define DD_TRI_SMOOTH 0x20
#define DD_TRI_STIPPLE 0x40
#define DD_TRI_OFFSET 0x80
#define DD_LINE_SMOOTH 0x100
#define DD_LINE_STIPPLE 0x200
#define DD_LINE_WIDTH 0x400
#define DD_POINT_SMOOTH 0x800
#define DD_POINT_SIZE 0x1000
#define DD_POINT_ATTEN 0x2000
 
 
/* Define the state changes under which each of these bits might change
*/
#define _DD_NEW_FLATSHADE _NEW_LIGHT
#define _DD_NEW_SEPARATE_SPECULAR (_NEW_LIGHT | _NEW_FOG)
#define _DD_NEW_TRI_CULL_FRONT_BACK _NEW_POLYGON
#define _DD_NEW_TRI_LIGHT_TWOSIDE _NEW_LIGHT
#define _DD_NEW_TRI_UNFILLED _NEW_POLYGON
#define _DD_NEW_TRI_SMOOTH _NEW_POLYGON
#define _DD_NEW_TRI_STIPPLE _NEW_POLYGON
#define _DD_NEW_TRI_OFFSET _NEW_POLYGON
#define _DD_NEW_LINE_SMOOTH _NEW_LINE
#define _DD_NEW_LINE_STIPPLE _NEW_LINE
#define _DD_NEW_LINE_WIDTH _NEW_LINE
#define _DD_NEW_POINT_SMOOTH _NEW_POINT
#define _DD_NEW_POINT_SIZE _NEW_POINT
#define _DD_NEW_POINT_ATTEN _NEW_POINT
 
#define _MESA_NEW_NEED_EYE_COORDS (_NEW_LIGHT | \
_NEW_TEXTURE | \
_NEW_POINT | \
_NEW_MODELVIEW)
 
#define _MESA_NEW_NEED_NORMALS (_NEW_LIGHT | \
_NEW_TEXTURE)
 
#define _IMAGE_NEW_TRANSFER_STATE (_NEW_PIXEL | _NEW_COLOR_MATRIX)
 
 
/* Bits for ctx->_NeedNormals */
#define NEED_NORMALS_TEXGEN 0x1
#define NEED_NORMALS_LIGHT 0x2
 
/* Bits for ctx->_NeedEyeCoords */
#define NEED_EYE_TEXGEN 0x1
#define NEED_EYE_LIGHT 0x2
#define NEED_EYE_LIGHT_MODELVIEW 0x4
#define NEED_EYE_POINT_ATTEN 0x8
#define NEED_EYE_DRIVER 0x10
 
 
/*
* Forward declaration of display list datatypes:
*/
union node;
typedef union node Node;
 
 
/* This has to be included here. */
#include "dd.h"
 
 
/*
* Core Mesa's support for tnl modules:
*/
#define NUM_VERTEX_FORMAT_ENTRIES (sizeof(GLvertexformat) / sizeof(void *))
 
struct gl_tnl_module {
/* Vertex format to be lazily swapped into current dispatch.
*/
GLvertexformat *Current;
 
/* Record of functions swapped out. On restore, only need to swap
* these functions back in.
*/
void *Swapped[NUM_VERTEX_FORMAT_ENTRIES][2];
GLuint SwapCount;
};
 
 
/**
* This is the central context data structure for Mesa. Almost all
* OpenGL state is contained in this structure.
* Think of this as a base class from which device drivers will derive
* sub classes.
*/
struct __GLcontextRec {
/**
* OS related interfaces; these *must* be the first members of this
* structure, because they are exposed to the outside world (i.e. GLX
* extension).
*/
__GLimports imports;
__GLexports exports;
 
/* State possibly shared with other contexts in the address space */
struct gl_shared_state *Shared;
 
/* API function pointer tables */
struct _glapi_table *Save; /**< Display list save funcs */
struct _glapi_table *Exec; /**< Execute funcs */
struct _glapi_table *CurrentDispatch; /**< == Save or Exec !! */
 
GLboolean ExecPrefersFloat; /**< What preference for color conversion? */
GLboolean SavePrefersFloat;
 
GLvisual Visual;
GLframebuffer *DrawBuffer; /**< buffer for writing */
GLframebuffer *ReadBuffer; /**< buffer for reading */
 
/**
* Device driver function pointer table
*/
struct dd_function_table Driver;
 
void *DriverCtx; /**< Points to device driver context/state */
void *DriverMgrCtx; /**< Points to device driver manager (optional)*/
 
/* Core/Driver constants */
struct gl_constants Const;
 
/* The various 4x4 matrix stacks */
struct matrix_stack ModelviewMatrixStack;
struct matrix_stack ProjectionMatrixStack;
struct matrix_stack ColorMatrixStack;
struct matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
struct matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
struct matrix_stack *CurrentStack; /* Points to one of the above stacks */
 
/* Combined modelview and projection matrix */
GLmatrix _ModelProjectMatrix;
 
/* Display lists */
GLuint CallDepth; /* Current recursion calling depth */
GLboolean ExecuteFlag; /* Execute GL commands? */
GLboolean CompileFlag; /* Compile GL commands into display list? */
Node *CurrentListPtr; /* Head of list being compiled */
GLuint CurrentListNum; /* Number of the list being compiled */
Node *CurrentBlock; /* Pointer to current block of nodes */
GLuint CurrentPos; /* Index into current block of nodes */
 
/* Extensions */
struct gl_extensions Extensions;
 
/* Renderer attribute stack */
GLuint AttribStackDepth;
struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH];
 
/* Renderer attribute groups */
struct gl_accum_attrib Accum;
struct gl_colorbuffer_attrib Color;
struct gl_current_attrib Current;
struct gl_depthbuffer_attrib Depth;
struct gl_eval_attrib Eval;
struct gl_fog_attrib Fog;
struct gl_hint_attrib Hint;
struct gl_light_attrib Light;
struct gl_line_attrib Line;
struct gl_list_attrib List;
struct gl_multisample_attrib Multisample;
struct gl_pixel_attrib Pixel;
struct gl_point_attrib Point;
struct gl_polygon_attrib Polygon;
GLuint PolygonStipple[32];
struct gl_scissor_attrib Scissor;
struct gl_stencil_attrib Stencil;
struct gl_texture_attrib Texture;
struct gl_transform_attrib Transform;
struct gl_viewport_attrib Viewport;
 
/* Other attribute groups */
struct gl_histogram_attrib Histogram;
struct gl_minmax_attrib MinMax;
struct gl_convolution_attrib Convolution1D;
struct gl_convolution_attrib Convolution2D;
struct gl_convolution_attrib Separable2D;
 
/* Client attribute stack */
GLuint ClientAttribStackDepth;
struct gl_attrib_node *ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
 
/* Client attribute groups */
struct gl_array_attrib Array; /* Vertex arrays */
struct gl_pixelstore_attrib Pack; /* Pixel packing */
struct gl_pixelstore_attrib Unpack; /* Pixel unpacking */
 
struct gl_evaluators EvalMap; /* All evaluators */
struct gl_feedback Feedback; /* Feedback */
struct gl_selection Select; /* Selection */
 
struct gl_color_table ColorTable; /* Pre-convolution */
struct gl_color_table ProxyColorTable; /* Pre-convolution */
struct gl_color_table PostConvolutionColorTable;
struct gl_color_table ProxyPostConvolutionColorTable;
struct gl_color_table PostColorMatrixColorTable;
struct gl_color_table ProxyPostColorMatrixColorTable;
 
struct vertex_program_state VertexProgram; /* GL_NV_vertex_program */
 
GLenum ErrorValue; /* Last error code */
GLenum RenderMode; /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */
GLuint NewState; /* bitwise-or of _NEW_* flags */
 
/* Derived */
GLuint _TriangleCaps; /* bitwise-or of DD_* flags */
GLuint _ImageTransferState;/* bitwise-or of IMAGE_*_BIT flags */
GLfloat _EyeZDir[3];
GLfloat _ModelViewInvScale;
GLuint _NeedEyeCoords;
GLuint _NeedNormals; /* Are vertex normal vectors needed? */
 
struct gl_shine_tab *_ShineTable[2]; /* Active shine tables */
struct gl_shine_tab *_ShineTabList; /* Mru list of inactive shine tables */
 
struct gl_list_extensions listext; /* driver dlist extensions */
 
 
GLboolean OcclusionResult; /**< for GL_HP_occlusion_test */
GLboolean OcclusionResultSaved; /**< for GL_HP_occlusion_test */
GLuint _Facing; /* This is a hack for 2-sided stencil test. We don't */
/* have a better way to communicate this value from */
/* swrast_setup to swrast. */
 
 
/* Z buffer stuff */
GLuint DepthMax; /**< Max depth buffer value */
GLfloat DepthMaxF; /**< Float max depth buffer value */
GLfloat MRD; /**< minimum resolvable difference in Z values */
 
/** Should 3Dfx Glide driver catch signals? */
GLboolean CatchSignals;
 
/** For debugging/development only */
GLboolean NoRaster;
GLboolean FirstTimeCurrent;
 
/** Dither disable via MESA_NO_DITHER env var */
GLboolean NoDither;
 
GLboolean Rendering;
 
#if defined(MESA_TRACE)
struct _glapi_table *TraceDispatch;
trace_context_t *TraceCtx;
#else
void *TraceDispatch;
void *TraceCtx;
#endif
 
/* Core tnl module support */
struct gl_tnl_module TnlModule;
 
/* Hooks for module contexts. These will eventually live
* in the driver or elsewhere.
*/
void *swrast_context;
void *swsetup_context;
void *swtnl_context;
void *swtnl_im;
void *acache_context;
void *aelt_context;
};
 
 
/* The string names for GL_POINT, GL_LINE_LOOP, etc */
extern const char *_mesa_prim_name[GL_POLYGON+4];
 
#ifndef MESA_DEBUG
#define MESA_DEBUG
#endif
 
#ifdef MESA_DEBUG
extern int MESA_VERBOSE;
extern int MESA_DEBUG_FLAGS;
#else
# define MESA_VERBOSE 0
# define MESA_DEBUG_FLAGS 0
# ifndef NDEBUG
# define NDEBUG
# endif
#endif
 
 
enum _verbose {
VERBOSE_VARRAY = 0x0001,
VERBOSE_TEXTURE = 0x0002,
VERBOSE_IMMEDIATE = 0x0004,
VERBOSE_PIPELINE = 0x0008,
VERBOSE_DRIVER = 0x0010,
VERBOSE_STATE = 0x0020,
VERBOSE_API = 0x0040,
VERBOSE_DISPLAY_LIST = 0x0100,
VERBOSE_LIGHTING = 0x0200,
VERBOSE_PRIMS = 0x0400,
VERBOSE_VERTS = 0x0800
};
 
 
enum _debug {
DEBUG_ALWAYS_FLUSH = 0x1
};
 
 
 
#define Elements(x) sizeof(x)/sizeof(*(x))
 
 
/* Eventually let the driver specify what statechanges require a flush:
*/
#define FLUSH_VERTICES(ctx, newstate) \
do { \
if (MESA_VERBOSE & VERBOSE_STATE) \
_mesa_debug(ctx, "FLUSH_VERTICES in %s\n", __FUNCTION__); \
if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES) \
ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES); \
ctx->NewState |= newstate; \
} while (0)
 
#define FLUSH_CURRENT(ctx, newstate) \
do { \
if (MESA_VERBOSE & VERBOSE_STATE) \
_mesa_debug(ctx, "FLUSH_CURRENT in %s\n", __FUNCTION__); \
if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) \
ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \
ctx->NewState |= newstate; \
} while (0)
 
#define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval) \
do { \
if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \
_mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
return retval; \
} \
} while (0)
 
#define ASSERT_OUTSIDE_BEGIN_END(ctx) \
do { \
if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \
_mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
return; \
} \
} while (0)
 
#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx) \
do { \
ASSERT_OUTSIDE_BEGIN_END(ctx); \
FLUSH_VERTICES(ctx, 0); \
} while (0)
 
#define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \
do { \
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval); \
FLUSH_VERTICES(ctx, 0); \
} while (0)
 
 
 
 
#endif /* TYPES_H */
/shark/trunk/ports/mesa/src/image.h
0,0 → 1,175
/* $Id: image.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef IMAGE_H
#define IMAGE_H
 
 
#include "mtypes.h"
 
 
extern const struct gl_pixelstore_attrib _mesa_native_packing;
 
 
extern void
_mesa_swap2( GLushort *p, GLuint n );
 
extern void
_mesa_swap4( GLuint *p, GLuint n );
 
extern GLint
_mesa_sizeof_type( GLenum type );
 
extern GLint
_mesa_sizeof_packed_type( GLenum type );
 
extern GLint
_mesa_components_in_format( GLenum format );
 
extern GLint
_mesa_bytes_per_pixel( GLenum format, GLenum type );
 
extern GLboolean
_mesa_is_legal_format_and_type( GLenum format, GLenum type );
 
 
extern GLvoid *
_mesa_image_address( const struct gl_pixelstore_attrib *packing,
const GLvoid *image, GLsizei width,
GLsizei height, GLenum format, GLenum type,
GLint img, GLint row, GLint column );
 
 
extern GLint
_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
GLint width, GLenum format, GLenum type );
 
 
extern GLint
_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
GLint width, GLint height,
GLenum format, GLenum type );
 
extern void
_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
const struct gl_pixelstore_attrib *unpacking );
 
 
extern void
_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
const struct gl_pixelstore_attrib *packing );
 
 
extern GLvoid *
_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
const struct gl_pixelstore_attrib *packing );
 
extern void
_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
GLubyte *dest, const struct gl_pixelstore_attrib *packing );
 
 
extern void
_mesa_pack_float_rgba_span( GLcontext *ctx,
GLuint n, CONST GLfloat rgba[][4],
GLenum dstFormat, GLenum dstType, GLvoid *dstAddr,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps );
 
 
extern void
_mesa_pack_rgba_span( GLcontext *ctx,
GLuint n, CONST GLchan rgba[][4],
GLenum dstFormat, GLenum dstType, GLvoid *dstAddr,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps );
 
 
extern void
_mesa_unpack_chan_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLchan dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps );
 
 
extern void
_mesa_unpack_float_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLfloat dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps, GLboolean clamp );
 
 
extern void
_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps );
 
 
extern void
_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest, const GLuint *source,
const struct gl_pixelstore_attrib *dstPacking,
GLuint transferOps );
 
 
extern void
_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking,
GLuint transferOps );
 
extern void
_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest, const GLstencil *source,
const struct gl_pixelstore_attrib *dstPacking );
 
 
extern void
_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
GLenum srcType, const GLvoid *source,
const struct gl_pixelstore_attrib *srcPacking );
 
extern void
_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
GLenum dstType, const GLfloat *depthSpan,
const struct gl_pixelstore_attrib *dstPacking );
 
 
extern void *
_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *unpack );
 
 
#endif
/shark/trunk/ports/mesa/src/enums.c
0,0 → 1,930
/* $Id: enums.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Keith Whitwell <keith@tungstengraphics.com>
*/
 
 
#include "glheader.h"
#include "enums.h"
#include "imports.h"
 
 
typedef struct {
const char *c;
int n;
} enum_elt;
 
enum_elt all_enums[] =
{
/* Boolean values */
{ "GL_FALSE", 0 },
{ "GL_TRUE", 1 },
 
/* Data types */
{ "GL_BYTE", 0x1400 },
{ "GL_UNSIGNED_BYTE", 0x1401 },
{ "GL_SHORT", 0x1402 },
{ "GL_UNSIGNED_SHORT", 0x1403 },
{ "GL_INT", 0x1404 },
{ "GL_UNSIGNED_INT", 0x1405 },
{ "GL_FLOAT", 0x1406 },
{ "GL_DOUBLE", 0x140A },
{ "GL_2_BYTES", 0x1407 },
{ "GL_3_BYTES", 0x1408 },
{ "GL_4_BYTES", 0x1409 },
 
/* Primitives */
{ "GL_LINES", 0x0001 },
{ "GL_POINTS", 0x0000 },
{ "GL_LINE_STRIP", 0x0003 },
{ "GL_LINE_LOOP", 0x0002 },
{ "GL_TRIANGLES", 0x0004 },
{ "GL_TRIANGLE_STRIP", 0x0005 },
{ "GL_TRIANGLE_FAN", 0x0006 },
{ "GL_QUADS", 0x0007 },
{ "GL_QUAD_STRIP", 0x0008 },
{ "GL_POLYGON", 0x0009 },
{ "GL_EDGE_FLAG", 0x0B43 },
 
/* Vertex Arrays */
{ "GL_VERTEX_ARRAY", 0x8074 },
{ "GL_NORMAL_ARRAY", 0x8075 },
{ "GL_COLOR_ARRAY", 0x8076 },
{ "GL_INDEX_ARRAY", 0x8077 },
{ "GL_TEXTURE_COORD_ARRAY", 0x8078 },
{ "GL_EDGE_FLAG_ARRAY", 0x8079 },
{ "GL_VERTEX_ARRAY_SIZE", 0x807A },
{ "GL_VERTEX_ARRAY_TYPE", 0x807B },
{ "GL_VERTEX_ARRAY_STRIDE", 0x807C },
{ "GL_NORMAL_ARRAY_TYPE", 0x807E },
{ "GL_NORMAL_ARRAY_STRIDE", 0x807F },
{ "GL_COLOR_ARRAY_SIZE", 0x8081 },
{ "GL_COLOR_ARRAY_TYPE", 0x8082 },
{ "GL_COLOR_ARRAY_STRIDE", 0x8083 },
{ "GL_INDEX_ARRAY_TYPE", 0x8085 },
{ "GL_INDEX_ARRAY_STRIDE", 0x8086 },
{ "GL_TEXTURE_COORD_ARRAY_SIZE", 0x8088 },
{ "GL_TEXTURE_COORD_ARRAY_TYPE", 0x8089 },
{ "GL_TEXTURE_COORD_ARRAY_STRIDE", 0x808A },
{ "GL_EDGE_FLAG_ARRAY_STRIDE", 0x808C },
{ "GL_VERTEX_ARRAY_POINTER", 0x808E },
{ "GL_NORMAL_ARRAY_POINTER", 0x808F },
{ "GL_COLOR_ARRAY_POINTER", 0x8090 },
{ "GL_INDEX_ARRAY_POINTER", 0x8091 },
{ "GL_TEXTURE_COORD_ARRAY_POINTER", 0x8092 },
{ "GL_EDGE_FLAG_ARRAY_POINTER", 0x8093 },
{ "GL_V2F", 0x2A20 },
{ "GL_V3F", 0x2A21 },
{ "GL_C4UB_V2F", 0x2A22 },
{ "GL_C4UB_V3F", 0x2A23 },
{ "GL_C3F_V3F", 0x2A24 },
{ "GL_N3F_V3F", 0x2A25 },
{ "GL_C4F_N3F_V3F", 0x2A26 },
{ "GL_T2F_V3F", 0x2A27 },
{ "GL_T4F_V4F", 0x2A28 },
{ "GL_T2F_C4UB_V3F", 0x2A29 },
{ "GL_T2F_C3F_V3F", 0x2A2A },
{ "GL_T2F_N3F_V3F", 0x2A2B },
{ "GL_T2F_C4F_N3F_V3F", 0x2A2C },
{ "GL_T4F_C4F_N3F_V4F", 0x2A2D },
 
/* Matrix Mode */
{ "GL_MATRIX_MODE", 0x0BA0 },
{ "GL_MODELVIEW", 0x1700 },
{ "GL_PROJECTION", 0x1701 },
{ "GL_TEXTURE", 0x1702 },
 
/* Points */
{ "GL_POINT_SMOOTH", 0x0B10 },
{ "GL_POINT_SIZE", 0x0B11 },
{ "GL_POINT_SIZE_GRANULARITY ", 0x0B13 },
{ "GL_POINT_SIZE_RANGE", 0x0B12 },
 
/* Lines */
{ "GL_LINE_SMOOTH", 0x0B20 },
{ "GL_LINE_STIPPLE", 0x0B24 },
{ "GL_LINE_STIPPLE_PATTERN", 0x0B25 },
{ "GL_LINE_STIPPLE_REPEAT", 0x0B26 },
{ "GL_LINE_WIDTH", 0x0B21 },
{ "GL_LINE_WIDTH_GRANULARITY", 0x0B23 },
{ "GL_LINE_WIDTH_RANGE", 0x0B22 },
 
/* Polygons */
{ "GL_POINT", 0x1B00 },
{ "GL_LINE", 0x1B01 },
{ "GL_FILL", 0x1B02 },
{ "GL_CCW", 0x0901 },
{ "GL_CW", 0x0900 },
{ "GL_FRONT", 0x0404 },
{ "GL_BACK", 0x0405 },
{ "GL_CULL_FACE", 0x0B44 },
{ "GL_CULL_FACE_MODE", 0x0B45 },
{ "GL_POLYGON_SMOOTH", 0x0B41 },
{ "GL_POLYGON_STIPPLE", 0x0B42 },
{ "GL_FRONT_FACE", 0x0B46 },
{ "GL_POLYGON_MODE", 0x0B40 },
{ "GL_POLYGON_OFFSET_FACTOR", 0x8038 },
{ "GL_POLYGON_OFFSET_UNITS", 0x2A00 },
{ "GL_POLYGON_OFFSET_POINT", 0x2A01 },
{ "GL_POLYGON_OFFSET_LINE", 0x2A02 },
{ "GL_POLYGON_OFFSET_FILL", 0x8037 },
 
/* Display Lists */
{ "GL_COMPILE", 0x1300 },
{ "GL_COMPILE_AND_EXECUTE", 0x1301 },
{ "GL_LIST_BASE", 0x0B32 },
{ "GL_LIST_INDEX", 0x0B33 },
{ "GL_LIST_MODE", 0x0B30 },
 
/* Depth buffer */
{ "GL_NEVER", 0x0200 },
{ "GL_LESS", 0x0201 },
{ "GL_GEQUAL", 0x0206 },
{ "GL_LEQUAL", 0x0203 },
{ "GL_GREATER", 0x0204 },
{ "GL_NOTEQUAL", 0x0205 },
{ "GL_EQUAL", 0x0202 },
{ "GL_ALWAYS", 0x0207 },
{ "GL_DEPTH_TEST", 0x0B71 },
{ "GL_DEPTH_BITS", 0x0D56 },
{ "GL_DEPTH_CLEAR_VALUE", 0x0B73 },
{ "GL_DEPTH_FUNC", 0x0B74 },
{ "GL_DEPTH_RANGE", 0x0B70 },
{ "GL_DEPTH_WRITEMASK", 0x0B72 },
{ "GL_DEPTH_COMPONENT", 0x1902 },
 
/* Lighting */
{ "GL_LIGHTING", 0x0B50 },
{ "GL_LIGHT0", 0x4000 },
{ "GL_LIGHT1", 0x4001 },
{ "GL_LIGHT2", 0x4002 },
{ "GL_LIGHT3", 0x4003 },
{ "GL_LIGHT4", 0x4004 },
{ "GL_LIGHT5", 0x4005 },
{ "GL_LIGHT6", 0x4006 },
{ "GL_LIGHT7", 0x4007 },
{ "GL_SPOT_EXPONENT", 0x1205 },
{ "GL_SPOT_CUTOFF", 0x1206 },
{ "GL_CONSTANT_ATTENUATION", 0x1207 },
{ "GL_LINEAR_ATTENUATION", 0x1208 },
{ "GL_QUADRATIC_ATTENUATION", 0x1209 },
{ "GL_AMBIENT", 0x1200 },
{ "GL_DIFFUSE", 0x1201 },
{ "GL_SPECULAR", 0x1202 },
{ "GL_SHININESS", 0x1601 },
{ "GL_EMISSION", 0x1600 },
{ "GL_POSITION", 0x1203 },
{ "GL_SPOT_DIRECTION", 0x1204 },
{ "GL_AMBIENT_AND_DIFFUSE", 0x1602 },
{ "GL_COLOR_INDEXES", 0x1603 },
{ "GL_LIGHT_MODEL_TWO_SIDE", 0x0B52 },
{ "GL_LIGHT_MODEL_LOCAL_VIEWER", 0x0B51 },
{ "GL_LIGHT_MODEL_AMBIENT", 0x0B53 },
{ "GL_FRONT_AND_BACK", 0x0408 },
{ "GL_SHADE_MODEL", 0x0B54 },
{ "GL_FLAT", 0x1D00 },
{ "GL_SMOOTH", 0x1D01 },
{ "GL_COLOR_MATERIAL", 0x0B57 },
{ "GL_COLOR_MATERIAL_FACE", 0x0B55 },
{ "GL_COLOR_MATERIAL_PARAMETER", 0x0B56 },
{ "GL_NORMALIZE", 0x0BA1 },
 
/* User clipping planes */
{ "GL_CLIP_PLANE0", 0x3000 },
{ "GL_CLIP_PLANE1", 0x3001 },
{ "GL_CLIP_PLANE2", 0x3002 },
{ "GL_CLIP_PLANE3", 0x3003 },
{ "GL_CLIP_PLANE4", 0x3004 },
{ "GL_CLIP_PLANE5", 0x3005 },
 
/* Accumulation buffer */
{ "GL_ACCUM_RED_BITS", 0x0D58 },
{ "GL_ACCUM_GREEN_BITS", 0x0D59 },
{ "GL_ACCUM_BLUE_BITS", 0x0D5A },
{ "GL_ACCUM_ALPHA_BITS", 0x0D5B },
{ "GL_ACCUM_CLEAR_VALUE", 0x0B80 },
{ "GL_ACCUM", 0x0100 },
{ "GL_ADD", 0x0104 },
{ "GL_LOAD", 0x0101 },
{ "GL_MULT", 0x0103 },
{ "GL_RETURN", 0x0102 },
 
/* Alpha testing */
{ "GL_ALPHA_TEST", 0x0BC0 },
{ "GL_ALPHA_TEST_REF", 0x0BC2 },
{ "GL_ALPHA_TEST_FUNC", 0x0BC1 },
 
/* Blending */
{ "GL_BLEND", 0x0BE2 },
{ "GL_BLEND_SRC", 0x0BE1 },
{ "GL_BLEND_DST", 0x0BE0 },
{ "GL_ZERO", 0 },
{ "GL_ONE", 1 },
{ "GL_SRC_COLOR", 0x0300 },
{ "GL_ONE_MINUS_SRC_COLOR", 0x0301 },
{ "GL_DST_COLOR", 0x0306 },
{ "GL_ONE_MINUS_DST_COLOR", 0x0307 },
{ "GL_SRC_ALPHA", 0x0302 },
{ "GL_ONE_MINUS_SRC_ALPHA", 0x0303 },
{ "GL_DST_ALPHA", 0x0304 },
{ "GL_ONE_MINUS_DST_ALPHA", 0x0305 },
{ "GL_SRC_ALPHA_SATURATE", 0x0308 },
{ "GL_CONSTANT_COLOR", 0x8001 },
{ "GL_ONE_MINUS_CONSTANT_COLOR", 0x8002 },
{ "GL_CONSTANT_ALPHA", 0x8003 },
{ "GL_ONE_MINUS_CONSTANT_ALPHA", 0x8004 },
 
/* Render Mode */
{ "GL_FEEDBACK", 0x1C01 },
{ "GL_RENDER", 0x1C00 },
{ "GL_SELECT", 0x1C02 },
 
/* Feedback */
{ "GL_2D", 0x0600 },
{ "GL_3D", 0x0601 },
{ "GL_3D_COLOR", 0x0602 },
{ "GL_3D_COLOR_TEXTURE", 0x0603 },
{ "GL_4D_COLOR_TEXTURE", 0x0604 },
{ "GL_POINT_TOKEN", 0x0701 },
{ "GL_LINE_TOKEN", 0x0702 },
{ "GL_LINE_RESET_TOKEN", 0x0707 },
{ "GL_POLYGON_TOKEN", 0x0703 },
{ "GL_BITMAP_TOKEN", 0x0704 },
{ "GL_DRAW_PIXEL_TOKEN", 0x0705 },
{ "GL_COPY_PIXEL_TOKEN", 0x0706 },
{ "GL_PASS_THROUGH_TOKEN", 0x0700 },
{ "GL_FEEDBACK_BUFFER_POINTER", 0x0DF0 },
{ "GL_FEEDBACK_BUFFER_SIZE", 0x0DF1 },
{ "GL_FEEDBACK_BUFFER_TYPE", 0x0DF2 },
 
/* Selection */
{ "GL_SELECTION_BUFFER_POINTER", 0x0DF3 },
{ "GL_SELECTION_BUFFER_SIZE", 0x0DF4 },
 
/* Fog */
{ "GL_FOG", 0x0B60 },
{ "GL_FOG_MODE", 0x0B65 },
{ "GL_FOG_DENSITY", 0x0B62 },
{ "GL_FOG_COLOR", 0x0B66 },
{ "GL_FOG_INDEX", 0x0B61 },
{ "GL_FOG_START", 0x0B63 },
{ "GL_FOG_END", 0x0B64 },
{ "GL_LINEAR", 0x2601 },
{ "GL_EXP", 0x0800 },
{ "GL_EXP2", 0x0801 },
 
/* Logic Ops */
{ "GL_LOGIC_OP", 0x0BF1 },
{ "GL_INDEX_LOGIC_OP", 0x0BF1 },
{ "GL_COLOR_LOGIC_OP", 0x0BF2 },
{ "GL_LOGIC_OP_MODE", 0x0BF0 },
{ "GL_CLEAR", 0x1500 },
{ "GL_SET", 0x150F },
{ "GL_COPY", 0x1503 },
{ "GL_COPY_INVERTED", 0x150C },
{ "GL_NOOP", 0x1505 },
{ "GL_INVERT", 0x150A },
{ "GL_AND", 0x1501 },
{ "GL_NAND", 0x150E },
{ "GL_OR", 0x1507 },
{ "GL_NOR", 0x1508 },
{ "GL_XOR", 0x1506 },
{ "GL_EQUIV", 0x1509 },
{ "GL_AND_REVERSE", 0x1502 },
{ "GL_AND_INVERTED", 0x1504 },
{ "GL_OR_REVERSE", 0x150B },
{ "GL_OR_INVERTED", 0x150D },
 
/* Stencil */
{ "GL_STENCIL_TEST", 0x0B90 },
{ "GL_STENCIL_WRITEMASK", 0x0B98 },
{ "GL_STENCIL_BITS", 0x0D57 },
{ "GL_STENCIL_FUNC", 0x0B92 },
{ "GL_STENCIL_VALUE_MASK", 0x0B93 },
{ "GL_STENCIL_REF", 0x0B97 },
{ "GL_STENCIL_FAIL", 0x0B94 },
{ "GL_STENCIL_PASS_DEPTH_PASS", 0x0B96 },
{ "GL_STENCIL_PASS_DEPTH_FAIL", 0x0B95 },
{ "GL_STENCIL_CLEAR_VALUE", 0x0B91 },
{ "GL_STENCIL_INDEX", 0x1901 },
{ "GL_KEEP", 0x1E00 },
{ "GL_REPLACE", 0x1E01 },
{ "GL_INCR", 0x1E02 },
{ "GL_DECR", 0x1E03 },
 
/* Buffers, Pixel Drawing/Reading */
{ "GL_NONE", 0 },
{ "GL_LEFT", 0x0406 },
{ "GL_RIGHT", 0x0407 },
{ "GL_FRONT_LEFT", 0x0400 },
{ "GL_FRONT_RIGHT", 0x0401 },
{ "GL_BACK_LEFT", 0x0402 },
{ "GL_BACK_RIGHT", 0x0403 },
{ "GL_AUX0", 0x0409 },
{ "GL_AUX1", 0x040A },
{ "GL_AUX2", 0x040B },
{ "GL_AUX3", 0x040C },
{ "GL_COLOR_INDEX", 0x1900 },
{ "GL_RED", 0x1903 },
{ "GL_GREEN", 0x1904 },
{ "GL_BLUE", 0x1905 },
{ "GL_ALPHA", 0x1906 },
{ "GL_LUMINANCE", 0x1909 },
{ "GL_LUMINANCE_ALPHA", 0x190A },
{ "GL_ALPHA_BITS", 0x0D55 },
{ "GL_RED_BITS", 0x0D52 },
{ "GL_GREEN_BITS", 0x0D53 },
{ "GL_BLUE_BITS", 0x0D54 },
{ "GL_INDEX_BITS", 0x0D51 },
{ "GL_SUBPIXEL_BITS", 0x0D50 },
{ "GL_AUX_BUFFERS", 0x0C00 },
{ "GL_READ_BUFFER", 0x0C02 },
{ "GL_DRAW_BUFFER", 0x0C01 },
{ "GL_DOUBLEBUFFER", 0x0C32 },
{ "GL_STEREO", 0x0C33 },
{ "GL_BITMAP", 0x1A00 },
{ "GL_COLOR", 0x1800 },
{ "GL_DEPTH", 0x1801 },
{ "GL_STENCIL", 0x1802 },
{ "GL_DITHER", 0x0BD0 },
{ "GL_RGB", 0x1907 },
{ "GL_RGBA", 0x1908 },
 
/* Implementation limits */
{ "GL_MAX_LIST_NESTING", 0x0B31 },
{ "GL_MAX_ATTRIB_STACK_DEPTH", 0x0D35 },
{ "GL_MAX_MODELVIEW_STACK_DEPTH", 0x0D36 },
{ "GL_MAX_NAME_STACK_DEPTH", 0x0D37 },
{ "GL_MAX_PROJECTION_STACK_DEPTH", 0x0D38 },
{ "GL_MAX_TEXTURE_STACK_DEPTH", 0x0D39 },
{ "GL_MAX_EVAL_ORDER", 0x0D30 },
{ "GL_MAX_LIGHTS", 0x0D31 },
{ "GL_MAX_CLIP_PLANES", 0x0D32 },
{ "GL_MAX_TEXTURE_SIZE", 0x0D33 },
{ "GL_MAX_PIXEL_MAP_TABLE", 0x0D34 },
{ "GL_MAX_VIEWPORT_DIMS", 0x0D3A },
{ "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH", 0x0D3B },
 
 
{ "GL_ATTRIB_STACK_DEPTH", 0x0BB0 },
{ "GL_CLIENT_ATTRIB_STACK_DEPTH", 0x0BB1 },
{ "GL_COLOR_CLEAR_VALUE", 0x0C22 },
{ "GL_COLOR_WRITEMASK", 0x0C23 },
{ "GL_CURRENT_INDEX", 0x0B01 },
{ "GL_CURRENT_COLOR", 0x0B00 },
{ "GL_CURRENT_NORMAL", 0x0B02 },
{ "GL_CURRENT_RASTER_COLOR", 0x0B04 },
{ "GL_CURRENT_RASTER_DISTANCE", 0x0B09 },
{ "GL_CURRENT_RASTER_INDEX", 0x0B05 },
{ "GL_CURRENT_RASTER_POSITION", 0x0B07 },
{ "GL_CURRENT_RASTER_TEXTURE_COORDS", 0x0B06},
{ "GL_CURRENT_RASTER_POSITION_VALID", 0x0B08 },
{ "GL_CURRENT_TEXTURE_COORDS", 0x0B03 },
{ "GL_INDEX_CLEAR_VALUE", 0x0C20 },
{ "GL_INDEX_MODE", 0x0C30 },
{ "GL_INDEX_WRITEMASK", 0x0C21 },
{ "GL_MODELVIEW_MATRIX", 0x0BA6 },
{ "GL_MODELVIEW_STACK_DEPTH", 0x0BA3 },
{ "GL_NAME_STACK_DEPTH", 0x0D70 },
{ "GL_PROJECTION_MATRIX", 0x0BA7 },
{ "GL_PROJECTION_STACK_DEPTH", 0x0BA4 },
{ "GL_RENDER_MODE", 0x0C40 },
{ "GL_RGBA_MODE", 0x0C31 },
{ "GL_TEXTURE_MATRIX", 0x0BA8 },
{ "GL_TEXTURE_STACK_DEPTH", 0x0BA5 },
{ "GL_VIEWPORT", 0x0BA2 },
 
 
/* Evaluators */
{ "GL_AUTO_NORMAL", 0x0D80 },
{ "GL_MAP1_COLOR_4", 0x0D90 },
{ "GL_MAP1_GRID_DOMAIN", 0x0DD0 },
{ "GL_MAP1_GRID_SEGMENTS", 0x0DD1 },
{ "GL_MAP1_INDEX", 0x0D91 },
{ "GL_MAP1_NORMAL", 0x0D92 },
{ "GL_MAP1_TEXTURE_COORD_1", 0x0D93 },
{ "GL_MAP1_TEXTURE_COORD_2", 0x0D94 },
{ "GL_MAP1_TEXTURE_COORD_3", 0x0D95 },
{ "GL_MAP1_TEXTURE_COORD_4", 0x0D96 },
{ "GL_MAP1_VERTEX_3", 0x0D97 },
{ "GL_MAP1_VERTEX_4", 0x0D98 },
{ "GL_MAP2_COLOR_4", 0x0DB0 },
{ "GL_MAP2_GRID_DOMAIN", 0x0DD2 },
{ "GL_MAP2_GRID_SEGMENTS", 0x0DD3 },
{ "GL_MAP2_INDEX", 0x0DB1 },
{ "GL_MAP2_NORMAL", 0x0DB2 },
{ "GL_MAP2_TEXTURE_COORD_1", 0x0DB3 },
{ "GL_MAP2_TEXTURE_COORD_2", 0x0DB4 },
{ "GL_MAP2_TEXTURE_COORD_3", 0x0DB5 },
{ "GL_MAP2_TEXTURE_COORD_4", 0x0DB6 },
{ "GL_MAP2_VERTEX_3", 0x0DB7 },
{ "GL_MAP2_VERTEX_4", 0x0DB8 },
{ "GL_COEFF", 0x0A00 },
{ "GL_DOMAIN", 0x0A02 },
{ "GL_ORDER", 0x0A01 },
 
/* Hints */
{ "GL_FOG_HINT", 0x0C54 },
{ "GL_LINE_SMOOTH_HINT", 0x0C52 },
{ "GL_PERSPECTIVE_CORRECTION_HINT", 0x0C50 },
{ "GL_POINT_SMOOTH_HINT", 0x0C51 },
{ "GL_POLYGON_SMOOTH_HINT", 0x0C53 },
{ "GL_DONT_CARE", 0x1100 },
{ "GL_FASTEST", 0x1101 },
{ "GL_NICEST", 0x1102 },
 
/* Scissor box */
{ "GL_SCISSOR_TEST", 0x0C11 },
{ "GL_SCISSOR_BOX", 0x0C10 },
 
/* Pixel Mode / Transfer */
{ "GL_MAP_COLOR", 0x0D10 },
{ "GL_MAP_STENCIL", 0x0D11 },
{ "GL_INDEX_SHIFT", 0x0D12 },
{ "GL_INDEX_OFFSET", 0x0D13 },
{ "GL_RED_SCALE", 0x0D14 },
{ "GL_RED_BIAS", 0x0D15 },
{ "GL_GREEN_SCALE", 0x0D18 },
{ "GL_GREEN_BIAS", 0x0D19 },
{ "GL_BLUE_SCALE", 0x0D1A },
{ "GL_BLUE_BIAS", 0x0D1B },
{ "GL_ALPHA_SCALE", 0x0D1C },
{ "GL_ALPHA_BIAS", 0x0D1D },
{ "GL_DEPTH_SCALE", 0x0D1E },
{ "GL_DEPTH_BIAS", 0x0D1F },
{ "GL_PIXEL_MAP_S_TO_S_SIZE", 0x0CB1 },
{ "GL_PIXEL_MAP_I_TO_I_SIZE", 0x0CB0 },
{ "GL_PIXEL_MAP_I_TO_R_SIZE", 0x0CB2 },
{ "GL_PIXEL_MAP_I_TO_G_SIZE", 0x0CB3 },
{ "GL_PIXEL_MAP_I_TO_B_SIZE", 0x0CB4 },
{ "GL_PIXEL_MAP_I_TO_A_SIZE", 0x0CB5 },
{ "GL_PIXEL_MAP_R_TO_R_SIZE", 0x0CB6 },
{ "GL_PIXEL_MAP_G_TO_G_SIZE", 0x0CB7 },
{ "GL_PIXEL_MAP_B_TO_B_SIZE", 0x0CB8 },
{ "GL_PIXEL_MAP_A_TO_A_SIZE", 0x0CB9 },
{ "GL_PIXEL_MAP_S_TO_S", 0x0C71 },
{ "GL_PIXEL_MAP_I_TO_I", 0x0C70 },
{ "GL_PIXEL_MAP_I_TO_R", 0x0C72 },
{ "GL_PIXEL_MAP_I_TO_G", 0x0C73 },
{ "GL_PIXEL_MAP_I_TO_B", 0x0C74 },
{ "GL_PIXEL_MAP_I_TO_A", 0x0C75 },
{ "GL_PIXEL_MAP_R_TO_R", 0x0C76 },
{ "GL_PIXEL_MAP_G_TO_G", 0x0C77 },
{ "GL_PIXEL_MAP_B_TO_B", 0x0C78 },
{ "GL_PIXEL_MAP_A_TO_A", 0x0C79 },
{ "GL_PACK_ALIGNMENT", 0x0D05 },
{ "GL_PACK_LSB_FIRST", 0x0D01 },
{ "GL_PACK_ROW_LENGTH", 0x0D02 },
{ "GL_PACK_SKIP_PIXELS", 0x0D04 },
{ "GL_PACK_SKIP_ROWS", 0x0D03 },
{ "GL_PACK_SWAP_BYTES", 0x0D00 },
{ "GL_UNPACK_ALIGNMENT", 0x0CF5 },
{ "GL_UNPACK_LSB_FIRST", 0x0CF1 },
{ "GL_UNPACK_ROW_LENGTH", 0x0CF2 },
{ "GL_UNPACK_SKIP_PIXELS", 0x0CF4 },
{ "GL_UNPACK_SKIP_ROWS", 0x0CF3 },
{ "GL_UNPACK_SWAP_BYTES", 0x0CF0 },
{ "GL_ZOOM_X", 0x0D16 },
{ "GL_ZOOM_Y", 0x0D17 },
 
/* Texture mapping */
{ "GL_TEXTURE_ENV", 0x2300 },
{ "GL_TEXTURE_ENV_MODE", 0x2200 },
{ "GL_TEXTURE_1D", 0x0DE0 },
{ "GL_TEXTURE_2D", 0x0DE1 },
{ "GL_TEXTURE_WRAP_S", 0x2802 },
{ "GL_TEXTURE_WRAP_T", 0x2803 },
{ "GL_TEXTURE_MAG_FILTER", 0x2800 },
{ "GL_TEXTURE_MIN_FILTER", 0x2801 },
{ "GL_TEXTURE_ENV_COLOR", 0x2201 },
{ "GL_TEXTURE_GEN_S", 0x0C60 },
{ "GL_TEXTURE_GEN_T", 0x0C61 },
{ "GL_TEXTURE_GEN_MODE", 0x2500 },
{ "GL_TEXTURE_BORDER_COLOR", 0x1004 },
{ "GL_TEXTURE_WIDTH", 0x1000 },
{ "GL_TEXTURE_HEIGHT", 0x1001 },
{ "GL_TEXTURE_BORDER", 0x1005 },
{ "GL_TEXTURE_COMPONENTS", 0x1003 },
{ "GL_TEXTURE_RED_SIZE", 0x805C },
{ "GL_TEXTURE_GREEN_SIZE", 0x805D },
{ "GL_TEXTURE_BLUE_SIZE", 0x805E },
{ "GL_TEXTURE_ALPHA_SIZE", 0x805F },
{ "GL_TEXTURE_LUMINANCE_SIZE", 0x8060 },
{ "GL_TEXTURE_INTENSITY_SIZE", 0x8061 },
{ "GL_NEAREST_MIPMAP_NEAREST", 0x2700 },
{ "GL_NEAREST_MIPMAP_LINEAR", 0x2702 },
{ "GL_LINEAR_MIPMAP_NEAREST", 0x2701 },
{ "GL_LINEAR_MIPMAP_LINEAR", 0x2703 },
{ "GL_OBJECT_LINEAR", 0x2401 },
{ "GL_OBJECT_PLANE", 0x2501 },
{ "GL_EYE_LINEAR", 0x2400 },
{ "GL_EYE_PLANE", 0x2502 },
{ "GL_SPHERE_MAP", 0x2402 },
{ "GL_DECAL", 0x2101 },
{ "GL_MODULATE", 0x2100 },
{ "GL_NEAREST", 0x2600 },
{ "GL_REPEAT", 0x2901 },
{ "GL_CLAMP", 0x2900 },
{ "GL_S", 0x2000 },
{ "GL_T", 0x2001 },
{ "GL_R", 0x2002 },
{ "GL_Q", 0x2003 },
{ "GL_TEXTURE_GEN_R", 0x0C62 },
{ "GL_TEXTURE_GEN_Q", 0x0C63 },
 
/* GL 1.1 texturing */
{ "GL_PROXY_TEXTURE_1D", 0x8063 },
{ "GL_PROXY_TEXTURE_2D", 0x8064 },
{ "GL_TEXTURE_PRIORITY", 0x8066 },
{ "GL_TEXTURE_RESIDENT", 0x8067 },
{ "GL_TEXTURE_BINDING_1D", 0x8068 },
{ "GL_TEXTURE_BINDING_2D", 0x8069 },
{ "GL_TEXTURE_INTERNAL_FORMAT", 0x1003 },
 
/* GL 1.2 texturing */
{ "GL_PACK_SKIP_IMAGES", 0x806B },
{ "GL_PACK_IMAGE_HEIGHT", 0x806C },
{ "GL_UNPACK_SKIP_IMAGES", 0x806D },
{ "GL_UNPACK_IMAGE_HEIGHT", 0x806E },
{ "GL_TEXTURE_3D", 0x806F },
{ "GL_PROXY_TEXTURE_3D", 0x8070 },
{ "GL_TEXTURE_DEPTH", 0x8071 },
{ "GL_TEXTURE_WRAP_R", 0x8072 },
{ "GL_MAX_3D_TEXTURE_SIZE", 0x8073 },
{ "GL_TEXTURE_BINDING_3D", 0x806A },
 
/* Internal texture formats (GL 1.1) */
{ "GL_ALPHA4", 0x803B },
{ "GL_ALPHA8", 0x803C },
{ "GL_ALPHA12", 0x803D },
{ "GL_ALPHA16", 0x803E },
{ "GL_LUMINANCE4", 0x803F },
{ "GL_LUMINANCE8", 0x8040 },
{ "GL_LUMINANCE12", 0x8041 },
{ "GL_LUMINANCE16", 0x8042 },
{ "GL_LUMINANCE4_ALPHA4", 0x8043 },
{ "GL_LUMINANCE6_ALPHA2", 0x8044 },
{ "GL_LUMINANCE8_ALPHA8", 0x8045 },
{ "GL_LUMINANCE12_ALPHA4", 0x8046 },
{ "GL_LUMINANCE12_ALPHA12", 0x8047 },
{ "GL_LUMINANCE16_ALPHA16", 0x8048 },
{ "GL_INTENSITY", 0x8049 },
{ "GL_INTENSITY4", 0x804A },
{ "GL_INTENSITY8", 0x804B },
{ "GL_INTENSITY12", 0x804C },
{ "GL_INTENSITY16", 0x804D },
{ "GL_R3_G3_B2", 0x2A10 },
{ "GL_RGB4", 0x804F },
{ "GL_RGB5", 0x8050 },
{ "GL_RGB8", 0x8051 },
{ "GL_RGB10", 0x8052 },
{ "GL_RGB12", 0x8053 },
{ "GL_RGB16", 0x8054 },
{ "GL_RGBA2", 0x8055 },
{ "GL_RGBA4", 0x8056 },
{ "GL_RGB5_A1", 0x8057 },
{ "GL_RGBA8", 0x8058 },
{ "GL_RGB10_A2", 0x8059 },
{ "GL_RGBA12", 0x805A },
{ "GL_RGBA16", 0x805B },
 
/* Utility */
{ "GL_VENDOR", 0x1F00 },
{ "GL_RENDERER", 0x1F01 },
{ "GL_VERSION", 0x1F02 },
{ "GL_EXTENSIONS", 0x1F03 },
 
/* Errors */
{ "GL_INVALID_VALUE", 0x0501 },
{ "GL_INVALID_ENUM", 0x0500 },
{ "GL_INVALID_OPERATION", 0x0502 },
{ "GL_STACK_OVERFLOW", 0x0503 },
{ "GL_STACK_UNDERFLOW", 0x0504 },
{ "GL_OUT_OF_MEMORY", 0x0505 },
 
/*
* Extensions
*/
 
{ "GL_CONSTANT_COLOR_EXT", 0x8001 },
{ "GL_ONE_MINUS_CONSTANT_COLOR_EXT", 0x8002 },
{ "GL_CONSTANT_ALPHA_EXT", 0x8003 },
{ "GL_ONE_MINUS_CONSTANT_ALPHA_EXT", 0x8004 },
{ "GL_BLEND_EQUATION_EXT", 0x8009 },
{ "GL_MIN_EXT", 0x8007 },
{ "GL_MAX_EXT", 0x8008 },
{ "GL_FUNC_ADD_EXT", 0x8006 },
{ "GL_FUNC_SUBTRACT_EXT", 0x800A },
{ "GL_FUNC_REVERSE_SUBTRACT_EXT", 0x800B },
{ "GL_BLEND_COLOR_EXT", 0x8005 },
 
{ "GL_POLYGON_OFFSET_EXT", 0x8037 },
{ "GL_POLYGON_OFFSET_FACTOR_EXT", 0x8038 },
{ "GL_POLYGON_OFFSET_BIAS_EXT", 0x8039 },
 
 
{ "GL_VERTEX_ARRAY_EXT", 0x8074 },
{ "GL_NORMAL_ARRAY_EXT", 0x8075 },
{ "GL_COLOR_ARRAY_EXT", 0x8076 },
{ "GL_INDEX_ARRAY_EXT", 0x8077 },
{ "GL_TEXTURE_COORD_ARRAY_EXT", 0x8078 },
{ "GL_EDGE_FLAG_ARRAY_EXT", 0x8079 },
{ "GL_VERTEX_ARRAY_SIZE_EXT", 0x807A },
{ "GL_VERTEX_ARRAY_TYPE_EXT", 0x807B },
{ "GL_VERTEX_ARRAY_STRIDE_EXT", 0x807C },
{ "GL_VERTEX_ARRAY_COUNT_EXT", 0x807D },
{ "GL_NORMAL_ARRAY_TYPE_EXT", 0x807E },
{ "GL_NORMAL_ARRAY_STRIDE_EXT", 0x807F },
{ "GL_NORMAL_ARRAY_COUNT_EXT", 0x8080 },
{ "GL_COLOR_ARRAY_SIZE_EXT", 0x8081 },
{ "GL_COLOR_ARRAY_TYPE_EXT", 0x8082 },
{ "GL_COLOR_ARRAY_STRIDE_EXT", 0x8083 },
{ "GL_COLOR_ARRAY_COUNT_EXT", 0x8084 },
{ "GL_INDEX_ARRAY_TYPE_EXT", 0x8085 },
{ "GL_INDEX_ARRAY_STRIDE_EXT", 0x8086 },
{ "GL_INDEX_ARRAY_COUNT_EXT", 0x8087 },
{ "GL_TEXTURE_COORD_ARRAY_SIZE_EXT", 0x8088 },
{ "GL_TEXTURE_COORD_ARRAY_TYPE_EXT", 0x8089 },
{ "GL_TEXTURE_COORD_ARRAY_STRIDE_EXT", 0x808A },
{ "GL_TEXTURE_COORD_ARRAY_COUNT_EXT", 0x808B },
{ "GL_EDGE_FLAG_ARRAY_STRIDE_EXT", 0x808C },
{ "GL_EDGE_FLAG_ARRAY_COUNT_EXT", 0x808D },
{ "GL_VERTEX_ARRAY_POINTER_EXT", 0x808E },
{ "GL_NORMAL_ARRAY_POINTER_EXT", 0x808F },
{ "GL_COLOR_ARRAY_POINTER_EXT", 0x8090 },
{ "GL_INDEX_ARRAY_POINTER_EXT", 0x8091 },
{ "GL_TEXTURE_COORD_ARRAY_POINTER_EXT", 0x8092 },
{ "GL_EDGE_FLAG_ARRAY_POINTER_EXT", 0x8093 },
 
{ "GL_TEXTURE_PRIORITY_EXT", 0x8066 },
{ "GL_TEXTURE_RESIDENT_EXT", 0x8067 },
{ "GL_TEXTURE_1D_BINDING_EXT", 0x8068 },
{ "GL_TEXTURE_2D_BINDING_EXT", 0x8069 },
 
{ "GL_PACK_SKIP_IMAGES_EXT", 0x806B },
{ "GL_PACK_IMAGE_HEIGHT_EXT", 0x806C },
{ "GL_UNPACK_SKIP_IMAGES_EXT", 0x806D },
{ "GL_UNPACK_IMAGE_HEIGHT_EXT", 0x806E },
{ "GL_TEXTURE_3D_EXT", 0x806F },
{ "GL_PROXY_TEXTURE_3D_EXT", 0x8070 },
{ "GL_TEXTURE_DEPTH_EXT", 0x8071 },
{ "GL_TEXTURE_WRAP_R_EXT", 0x8072 },
{ "GL_MAX_3D_TEXTURE_SIZE_EXT", 0x8073 },
{ "GL_TEXTURE_3D_BINDING_EXT", 0x806A },
 
{ "GL_TABLE_TOO_LARGE_EXT", 0x8031 },
{ "GL_COLOR_TABLE_FORMAT_EXT", 0x80D8 },
{ "GL_COLOR_TABLE_WIDTH_EXT", 0x80D9 },
{ "GL_COLOR_TABLE_RED_SIZE_EXT", 0x80DA },
{ "GL_COLOR_TABLE_GREEN_SIZE_EXT", 0x80DB },
{ "GL_COLOR_TABLE_BLUE_SIZE_EXT", 0x80DC },
{ "GL_COLOR_TABLE_ALPHA_SIZE_EXT", 0x80DD },
{ "GL_COLOR_TABLE_LUMINANCE_SIZE_EXT", 0x80DE },
{ "GL_COLOR_TABLE_INTENSITY_SIZE_EXT", 0x80DF },
{ "GL_TEXTURE_INDEX_SIZE_EXT", 0x80ED },
{ "GL_COLOR_INDEX1_EXT", 0x80E2 },
{ "GL_COLOR_INDEX2_EXT", 0x80E3 },
{ "GL_COLOR_INDEX4_EXT", 0x80E4 },
{ "GL_COLOR_INDEX8_EXT", 0x80E5 },
{ "GL_COLOR_INDEX12_EXT", 0x80E6 },
{ "GL_COLOR_INDEX16_EXT", 0x80E7 },
 
{ "GL_SHARED_TEXTURE_PALETTE_EXT", 0x81FB },
 
{ "GL_POINT_SIZE_MIN_EXT", 0x8126 },
{ "GL_POINT_SIZE_MAX_EXT", 0x8127 },
{ "GL_POINT_FADE_THRESHOLD_SIZE_EXT", 0x8128 },
{ "GL_DISTANCE_ATTENUATION_EXT", 0x8129 },
 
{ "GL_RESCALE_NORMAL_EXT", 0x803A },
 
{ "GL_ABGR_EXT", 0x8000 },
 
{ "GL_INCR_WRAP_EXT", 0x8507 },
{ "GL_DECR_WRAP_EXT", 0x8508 },
 
{ "GL_CLAMP_TO_EDGE_SGIS", 0x812F },
 
{ "GL_BLEND_DST_RGB_INGR", 0x80C8 },
{ "GL_BLEND_SRC_RGB_INGR", 0x80C9 },
{ "GL_BLEND_DST_ALPHA_INGR", 0x80CA },
{ "GL_BLEND_SRC_ALPHA_INGR", 0x80CB },
 
{ "GL_RESCALE_NORMAL", 0x803A },
{ "GL_CLAMP_TO_EDGE", 0x812F },
{ "GL_MAX_ELEMENTS_VERTICES", 0xF0E8 },
{ "GL_MAX_ELEMENTS_INDICES", 0xF0E9 },
{ "GL_BGR", 0x80E0 },
{ "GL_BGRA", 0x80E1 },
{ "GL_UNSIGNED_BYTE_3_3_2", 0x8032 },
{ "GL_UNSIGNED_BYTE_2_3_3_REV", 0x8362 },
{ "GL_UNSIGNED_SHORT_5_6_5", 0x8363 },
{ "GL_UNSIGNED_SHORT_5_6_5_REV", 0x8364 },
{ "GL_UNSIGNED_SHORT_4_4_4_4", 0x8033 },
{ "GL_UNSIGNED_SHORT_4_4_4_4_REV", 0x8365 },
{ "GL_UNSIGNED_SHORT_5_5_5_1", 0x8034 },
{ "GL_UNSIGNED_SHORT_1_5_5_5_REV", 0x8366 },
{ "GL_UNSIGNED_INT_8_8_8_8", 0x8035 },
{ "GL_UNSIGNED_INT_8_8_8_8_REV", 0x8367 },
{ "GL_UNSIGNED_INT_10_10_10_2", 0x8036 },
{ "GL_UNSIGNED_INT_2_10_10_10_REV", 0x8368 },
{ "GL_LIGHT_MODEL_COLOR_CONTROL", 0x81F8 },
{ "GL_SINGLE_COLOR", 0x81F9 },
{ "GL_SEPARATE_SPECULAR_COLOR", 0x81FA },
{ "GL_TEXTURE_MIN_LOD", 0x813A },
{ "GL_TEXTURE_MAX_LOD", 0x813B },
{ "GL_TEXTURE_BASE_LEVEL", 0x813C },
{ "GL_TEXTURE_MAX_LEVEL", 0x813D },
 
{ "GL_TEXTURE0_ARB", 0x84C0 },
{ "GL_TEXTURE1_ARB", 0x84C1 },
{ "GL_TEXTURE2_ARB", 0x84C2 },
{ "GL_TEXTURE3_ARB", 0x84C3 },
{ "GL_ACTIVE_TEXTURE_ARB", 0x84E0 },
{ "GL_CLIENT_ACTIVE_TEXTURE_ARB", 0x84E1 },
{ "GL_MAX_TEXTURE_UNITS_ARB", 0x84E2 },
 
{ "GL_OCCLUSION_TEST_HP", 0x8165 },
{ "GL_OCCLUSION_TEST_RESULT_HP", 0x8166 },
 
{ "GL_TEXTURE_FILTER_CONTROL_EXT", 0x8500 },
{ "GL_TEXTUER_LOD_BIAS_EXT", 0x8501 },
 
{ "GL_NORMAL_MAP_NV", 0x8511 },
{ "GL_REFLECTION_MAP_NV", 0x8512 },
 
{ "GL_PREFER_DOUBLEBUFFER_HINT_PGI", 107000 },
{ "GL_STRICT_DEPTHFUNC_HINT_PGI", 107030 },
{ "GL_STRICT_LIGHTING_HINT_PGI", 107031 },
{ "GL_STRICT_SCISSOR_HINT_PGI", 107032 },
{ "GL_FULL_STIPPLE_HINT_PGI", 107033 },
{ "GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI", 107011 },
{ "GL_NATIVE_GRAPHICS_END_HINT_PGI", 107012 },
{ "GL_CONSERVE_MEMORY_HINT_PGI", 107005 },
{ "GL_RECLAIM_MEMORY_HINT_PGI", 107006 },
{ "GL_ALWAYS_FAST_HINT_PGI", 107020 },
{ "GL_ALWAYS_SOFT_HINT_PGI", 107021 },
{ "GL_ALLOW_DRAW_OBJ_HINT_PGI", 107022 },
{ "GL_ALLOW_DRAW_WIN_HINT_PGI", 107023 },
{ "GL_ALLOW_DRAW_FRG_HINT_PGI", 107024 },
{ "GL_ALLOW_DRAW_SPN_HINT_PGI", 107024 },
{ "GL_ALLOW_DRAW_MEM_HINT_PGI", 107025 },
{ "GL_CLIP_NEAR_HINT_PGI", 107040 },
{ "GL_CLIP_FAR_HINT_PGI", 107041 },
{ "GL_WIDE_LINE_HINT_PGI", 107042 },
{ "GL_BACK_NORMALS_HINT_PGI", 107043 },
{ "GL_NATIVE_GRAPHICS_HANDLE_PGI", 107010 },
 
/* GL_EXT_compiled_vertex_array */
{ "GL_ARRAY_ELEMENT_LOCK_FIRST_EXT", 0x81A8},
{ "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT", 0x81A9},
 
/* GL_EXT_clip_volume_hint */
{ "GL_CLIP_VOLUME_CLIPPING_HINT_EXT", 0x80F0},
 
/* GL_EXT_texture_env_combine */
{ "GL_COMBINE_EXT", 0x8570 },
{ "GL_COMBINE_RGB_EXT", 0x8571 },
{ "GL_COMBINE_ALPHA_EXT", 0x8572 },
{ "GL_SOURCE0_RGB_EXT", 0x8580 },
{ "GL_SOURCE1_RGB_EXT", 0x8581 },
{ "GL_SOURCE2_RGB_EXT", 0x8582 },
{ "GL_SOURCE0_ALPHA_EXT", 0x8588 },
{ "GL_SOURCE1_ALPHA_EXT", 0x8589 },
{ "GL_SOURCE2_ALPHA_EXT", 0x858A },
{ "GL_OPERAND0_RGB_EXT", 0x8590 },
{ "GL_OPERAND1_RGB_EXT", 0x8591 },
{ "GL_OPERAND2_RGB_EXT", 0x8592 },
{ "GL_OPERAND0_ALPHA_EXT", 0x8598 },
{ "GL_OPERAND1_ALPHA_EXT", 0x8599 },
{ "GL_OPERAND2_ALPHA_EXT", 0x859A },
{ "GL_RGB_SCALE_EXT", 0x8573 },
{ "GL_ADD_SIGNED_EXT", 0x8574 },
{ "GL_INTERPOLATE_EXT", 0x8575 },
{ "GL_CONSTANT_EXT", 0x8576 },
{ "GL_PRIMARY_COLOR_EXT", 0x8577 },
{ "GL_PREVIOUS_EXT", 0x8578 },
 
/* GL_ARB_texture_env_combine */
{ "GL_SUBTRACT_ARB", 0x84E7 },
 
/* GL_EXT_texture_env_dot3 */
{ "GL_DOT3_RGB_EXT", 0x8740 },
{ "GL_DOT3_RGBA_EXT", 0x8741 },
 
/* GL_ARB_texture_env_dot3 */
{ "GL_DOT3_RGB_EXT", 0x86ae },
{ "GL_DOT3_RGBA_EXT", 0x86af },
 
/* GL_ARB_texture_border_clamp */
{ "GL_CLAMP_TO_BORDER_ARB", 0x812D },
};
 
#define Elements(x) sizeof(x)/sizeof(*x)
 
typedef int (GLWINAPIV *cfunc)(const void *, const void *);
 
static enum_elt **index1 = 0;
static int sorted = 0;
 
static int compar_name( const enum_elt *a, const enum_elt *b )
{
return _mesa_strcmp(a->c, b->c);
}
 
 
/* note the extra level of indirection
*/
static int compar_nr( const enum_elt **a, const enum_elt **b )
{
return (*a)->n - (*b)->n;
}
 
 
static void sort_enums( void )
{
GLuint i;
index1 = (enum_elt **)MALLOC( Elements(all_enums) * sizeof(enum_elt *) );
sorted = 1;
 
if (!index1)
return; /* what else can we do? */
 
qsort( all_enums, Elements(all_enums), sizeof(*all_enums),
(cfunc) compar_name );
 
for (i = 0 ; i < Elements(all_enums) ; i++)
index1[i] = &all_enums[i];
 
qsort( index1, Elements(all_enums), sizeof(*index1), (cfunc) compar_nr );
}
 
 
 
int _mesa_lookup_enum_by_name( const char *symbol )
{
enum_elt tmp;
enum_elt *e;
 
if (!sorted)
sort_enums();
 
if (!symbol)
return 0;
 
tmp.c = symbol;
e = (enum_elt *)bsearch( &tmp, all_enums, Elements(all_enums),
sizeof(*all_enums), (cfunc) compar_name );
 
return e ? e->n : -1;
}
 
 
static char token_tmp[20];
 
const char *_mesa_lookup_enum_by_nr( int nr )
{
enum_elt tmp, *e, **f;
 
if (!sorted)
sort_enums();
 
tmp.n = nr;
e = &tmp;
 
f = (enum_elt **)bsearch( &e, index1, Elements(all_enums),
sizeof(*index1), (cfunc) compar_nr );
 
if (f) {
return (*f)->c;
}
else {
/* this isn't re-entrant safe, no big deal here */
_mesa_sprintf(token_tmp, "0x%x", nr);
return token_tmp;
}
}
/shark/trunk/ports/mesa/src/accum.c
0,0 → 1,88
/* $Id: accum.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "accum.h"
#include "context.h"
#include "imports.h"
#include "macros.h"
#include "state.h"
#include "mtypes.h"
 
 
void
_mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
{
GLfloat tmp[4];
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
tmp[0] = CLAMP( red, -1.0F, 1.0F );
tmp[1] = CLAMP( green, -1.0F, 1.0F );
tmp[2] = CLAMP( blue, -1.0F, 1.0F );
tmp[3] = CLAMP( alpha, -1.0F, 1.0F );
 
if (TEST_EQ_4V(tmp, ctx->Accum.ClearColor))
return;
 
FLUSH_VERTICES(ctx, _NEW_ACCUM);
COPY_4FV( ctx->Accum.ClearColor, tmp );
}
 
/* Should really be a driver-supplied function?
*/
void
_mesa_Accum( GLenum op, GLfloat value )
{
GET_CURRENT_CONTEXT(ctx);
GLuint xpos, ypos, width, height;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->Visual.accumRedBits == 0 || ctx->DrawBuffer != ctx->ReadBuffer) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glAccum");
return;
}
 
if (ctx->NewState)
_mesa_update_state( ctx );
 
/* Determine region to operate upon. */
if (ctx->Scissor.Enabled) {
xpos = ctx->Scissor.X;
ypos = ctx->Scissor.Y;
width = ctx->Scissor.Width;
height = ctx->Scissor.Height;
}
else {
/* whole window */
xpos = 0;
ypos = 0;
width = ctx->DrawBuffer->Width;
height = ctx->DrawBuffer->Height;
}
 
ctx->Driver.Accum( ctx, op, value, xpos, ypos, width, height );
}
/shark/trunk/ports/mesa/src/vtxfmt.c
0,0 → 1,177
/* $Id: vtxfmt.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Keith Whitwell <keith@tungstengraphics.com>
* Gareth Hughes
*/
 
#include "glheader.h"
#include "api_loopback.h"
#include "context.h"
#include "imports.h"
#include "mtypes.h"
#include "state.h"
#include "vtxfmt.h"
 
 
/* The neutral vertex format. This wraps all tnl module functions,
* verifying that the currently-installed module is valid and then
* installing the function pointers in a lazy fashion. It records the
* function pointers that have been swapped out, which allows a fast
* restoration of the neutral module in almost all cases -- a typical
* app might only require 4-6 functions to be modified from the neutral
* baseline, and only restoring these is certainly preferable to doing
* the entire module's 60 or so function pointers.
*/
 
#define PRE_LOOPBACK( FUNC ) \
{ \
GET_CURRENT_CONTEXT(ctx); \
struct gl_tnl_module *tnl = &(ctx->TnlModule); \
\
ASSERT( tnl->Current ); \
ASSERT( tnl->SwapCount < NUM_VERTEX_FORMAT_ENTRIES ); \
\
/* Save the swapped function's dispatch entry so it can be */ \
/* restored later. */ \
tnl->Swapped[tnl->SwapCount][0] = (void *)&(ctx->Exec->FUNC); \
tnl->Swapped[tnl->SwapCount][1] = (void *)TAG(FUNC); \
tnl->SwapCount++; \
\
if ( 0 ) \
_mesa_debug(ctx, " swapping gl" #FUNC"...\n" ); \
\
/* Install the tnl function pointer. */ \
ctx->Exec->FUNC = tnl->Current->FUNC; \
}
 
#define TAG(x) neutral_##x
#include "vtxfmt_tmp.h"
 
 
 
static void install_vtxfmt( struct _glapi_table *tab, GLvertexformat *vfmt )
{
tab->ArrayElement = vfmt->ArrayElement;
tab->Color3f = vfmt->Color3f;
tab->Color3fv = vfmt->Color3fv;
tab->Color3ub = vfmt->Color3ub;
tab->Color3ubv = vfmt->Color3ubv;
tab->Color4f = vfmt->Color4f;
tab->Color4fv = vfmt->Color4fv;
tab->Color4ub = vfmt->Color4ub;
tab->Color4ubv = vfmt->Color4ubv;
tab->EdgeFlag = vfmt->EdgeFlag;
tab->EdgeFlagv = vfmt->EdgeFlagv;
tab->EvalCoord1f = vfmt->EvalCoord1f;
tab->EvalCoord1fv = vfmt->EvalCoord1fv;
tab->EvalCoord2f = vfmt->EvalCoord2f;
tab->EvalCoord2fv = vfmt->EvalCoord2fv;
tab->EvalPoint1 = vfmt->EvalPoint1;
tab->EvalPoint2 = vfmt->EvalPoint2;
tab->FogCoordfEXT = vfmt->FogCoordfEXT;
tab->FogCoordfvEXT = vfmt->FogCoordfvEXT;
tab->Indexi = vfmt->Indexi;
tab->Indexiv = vfmt->Indexiv;
tab->Materialfv = vfmt->Materialfv;
tab->MultiTexCoord1fARB = vfmt->MultiTexCoord1fARB;
tab->MultiTexCoord1fvARB = vfmt->MultiTexCoord1fvARB;
tab->MultiTexCoord2fARB = vfmt->MultiTexCoord2fARB;
tab->MultiTexCoord2fvARB = vfmt->MultiTexCoord2fvARB;
tab->MultiTexCoord3fARB = vfmt->MultiTexCoord3fARB;
tab->MultiTexCoord3fvARB = vfmt->MultiTexCoord3fvARB;
tab->MultiTexCoord4fARB = vfmt->MultiTexCoord4fARB;
tab->MultiTexCoord4fvARB = vfmt->MultiTexCoord4fvARB;
tab->Normal3f = vfmt->Normal3f;
tab->Normal3fv = vfmt->Normal3fv;
tab->SecondaryColor3fEXT = vfmt->SecondaryColor3fEXT;
tab->SecondaryColor3fvEXT = vfmt->SecondaryColor3fvEXT;
tab->SecondaryColor3ubEXT = vfmt->SecondaryColor3ubEXT;
tab->SecondaryColor3ubvEXT = vfmt->SecondaryColor3ubvEXT;
tab->TexCoord1f = vfmt->TexCoord1f;
tab->TexCoord1fv = vfmt->TexCoord1fv;
tab->TexCoord2f = vfmt->TexCoord2f;
tab->TexCoord2fv = vfmt->TexCoord2fv;
tab->TexCoord3f = vfmt->TexCoord3f;
tab->TexCoord3fv = vfmt->TexCoord3fv;
tab->TexCoord4f = vfmt->TexCoord4f;
tab->TexCoord4fv = vfmt->TexCoord4fv;
tab->Vertex2f = vfmt->Vertex2f;
tab->Vertex2fv = vfmt->Vertex2fv;
tab->Vertex3f = vfmt->Vertex3f;
tab->Vertex3fv = vfmt->Vertex3fv;
tab->Vertex4f = vfmt->Vertex4f;
tab->Vertex4fv = vfmt->Vertex4fv;
tab->CallList = vfmt->CallList;
tab->Begin = vfmt->Begin;
tab->End = vfmt->End;
tab->VertexAttrib4fNV = vfmt->VertexAttrib4fNV;
tab->Rectf = vfmt->Rectf;
tab->DrawArrays = vfmt->DrawArrays;
tab->DrawElements = vfmt->DrawElements;
tab->DrawRangeElements = vfmt->DrawRangeElements;
tab->EvalMesh1 = vfmt->EvalMesh1;
tab->EvalMesh2 = vfmt->EvalMesh2;
assert(tab->EvalMesh2);
}
 
 
void _mesa_init_exec_vtxfmt( GLcontext *ctx )
{
install_vtxfmt( ctx->Exec, &neutral_vtxfmt );
ctx->TnlModule.SwapCount = 0;
}
 
 
void _mesa_install_exec_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt )
{
ctx->TnlModule.Current = vfmt;
_mesa_restore_exec_vtxfmt( ctx );
if ( ctx->ExecPrefersFloat != vfmt->prefer_float_colors )
_mesa_loopback_prefer_float( ctx->Exec, vfmt->prefer_float_colors );
}
 
void _mesa_install_save_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt )
{
install_vtxfmt( ctx->Save, vfmt );
if ( ctx->SavePrefersFloat != vfmt->prefer_float_colors )
_mesa_loopback_prefer_float( ctx->Save, vfmt->prefer_float_colors );
}
 
 
void _mesa_restore_exec_vtxfmt( GLcontext *ctx )
{
struct gl_tnl_module *tnl = &(ctx->TnlModule);
GLuint i;
 
/* Restore the neutral tnl module wrapper.
*/
for ( i = 0 ; i < tnl->SwapCount ; i++ ) {
*(void **)tnl->Swapped[i][0] = tnl->Swapped[i][1];
}
 
tnl->SwapCount = 0;
}
/shark/trunk/ports/mesa/src/hash.h
0,0 → 1,59
/* $Id: hash.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef HASH_H
#define HASH_H
 
 
#include "glheader.h"
 
 
/**
* Opaque hash table type.
*/
struct HashTable;
 
 
 
extern struct _mesa_HashTable *_mesa_NewHashTable(void);
 
extern void _mesa_DeleteHashTable(struct _mesa_HashTable *table);
 
extern void *_mesa_HashLookup(const struct _mesa_HashTable *table, GLuint key);
 
extern void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data);
 
extern void _mesa_HashRemove(struct _mesa_HashTable *table, GLuint key);
 
extern GLuint _mesa_HashFirstEntry(struct _mesa_HashTable *table);
 
extern void _mesa_HashPrint(const struct _mesa_HashTable *table);
 
extern GLuint _mesa_HashFindFreeKeyBlock(struct _mesa_HashTable *table, GLuint numKeys);
 
 
#endif
/shark/trunk/ports/mesa/src/blend.h
0,0 → 1,68
/* $Id: blend.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef BLEND_H
#define BLEND_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_BlendFunc( GLenum sfactor, GLenum dfactor );
 
 
extern void
_mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorA, GLenum dfactorA );
 
 
extern void
_mesa_BlendEquation( GLenum mode );
 
 
extern void
_mesa_BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
 
 
extern void
_mesa_AlphaFunc( GLenum func, GLclampf ref );
 
 
extern void
_mesa_LogicOp( GLenum opcode );
 
 
extern void
_mesa_IndexMask( GLuint mask );
 
extern void
_mesa_ColorMask( GLboolean red, GLboolean green,
GLboolean blue, GLboolean alpha );
 
 
#endif
/shark/trunk/ports/mesa/src/glthread.c
0,0 → 1,368
/* $Id: glthread.c,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* XXX There's probably some work to do in order to make this file
* truly reusable outside of Mesa. First, the glheader.h include must go.
*/
 
 
#include "glheader.h"
#include "glthread.h"
 
 
/*
* This file should still compile even when THREADS is not defined.
* This is to make things easier to deal with on the makefile scene..
*/
#ifdef THREADS
#include <errno.h>
 
/*
* Error messages
*/
#define INIT_TSD_ERROR "_glthread_: failed to allocate key for thread specific data"
#define GET_TSD_ERROR "_glthread_: failed to get thread specific data"
#define SET_TSD_ERROR "_glthread_: thread failed to set thread specific data"
 
 
/*
* Magic number to determine if a TSD object has been initialized.
* Kind of a hack but there doesn't appear to be a better cross-platform
* solution.
*/
#define INIT_MAGIC 0xff8adc98
 
 
 
/*
* POSIX Threads -- The best way to go if your platform supports them.
* Solaris >= 2.5 have POSIX threads, IRIX >= 6.4 reportedly
* has them, and many of the free Unixes now have them.
* Be sure to use appropriate -mt or -D_REENTRANT type
* compile flags when building.
*/
#ifdef PTHREADS
 
unsigned long
_glthread_GetID(void)
{
return (unsigned long) pthread_self();
}
 
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) {
perror(INIT_TSD_ERROR);
exit(-1);
}
tsd->initMagic = INIT_MAGIC;
}
 
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
if (tsd->initMagic != (int) INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
return pthread_getspecific(tsd->key);
}
 
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
if (tsd->initMagic != (int) INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
if (pthread_setspecific(tsd->key, ptr) != 0) {
perror(SET_TSD_ERROR);
exit(-1);
}
}
 
#endif /* PTHREADS */
 
 
 
/*
* Solaris/Unix International Threads -- Use only if POSIX threads
* aren't available on your Unix platform. Solaris 2.[34] are examples
* of platforms where this is the case. Be sure to use -mt and/or
* -D_REENTRANT when compiling.
*/
#ifdef SOLARIS_THREADS
#define USE_LOCK_FOR_KEY /* undef this to try a version without
lock for the global key... */
 
unsigned long
_glthread_GetID(void)
{
abort(); /* XXX not implemented yet */
return (unsigned long) 0;
}
 
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
if ((errno = mutex_init(&tsd->keylock, 0, NULL)) != 0 ||
(errno = thr_keycreate(&(tsd->key), free)) != 0) {
perror(INIT_TSD_ERROR);
exit(-1);
}
tsd->initMagic = INIT_MAGIC;
}
 
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
void* ret;
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
#ifdef USE_LOCK_FOR_KEY
mutex_lock(&tsd->keylock);
thr_getspecific(tsd->key, &ret);
mutex_unlock(&tsd->keylock);
#else
if ((errno = thr_getspecific(tsd->key, &ret)) != 0) {
perror(GET_TSD_ERROR);
exit(-1);
}
#endif
return ret;
}
 
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
if ((errno = thr_setspecific(tsd->key, ptr)) != 0) {
perror(SET_TSD_ERROR);
exit(-1);
}
}
 
#undef USE_LOCK_FOR_KEY
#endif /* SOLARIS_THREADS */
 
 
 
/*
* Win32 Threads. The only available option for Windows 95/NT.
* Be sure that you compile using the Multithreaded runtime, otherwise
* bad things will happen.
*/
#ifdef WIN32_THREADS
 
unsigned long
_glthread_GetID(void)
{
abort(); /* XXX not implemented yet */
return (unsigned long) 0;
}
 
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
tsd->key = TlsAlloc();
if (tsd->key == 0xffffffff) {
/* Can Windows handle stderr messages for non-console
applications? Does Windows have perror? */
/* perror(SET_INIT_ERROR);*/
exit(-1);
}
tsd->initMagic = INIT_MAGIC;
}
 
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
return TlsGetValue(tsd->key);
}
 
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
/* the following code assumes that the _glthread_TSD has been initialized
to zero at creation */
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
if (TlsSetValue(tsd->key, ptr) == 0) {
/* Can Windows handle stderr messages for non-console
applications? Does Windows have perror? */
/* perror(SET_TSD_ERROR);*/
exit(-1);
}
}
 
#endif /* WIN32_THREADS */
 
 
 
/*
* XFree86 has its own thread wrapper, Xthreads.h
* We wrap it again for GL.
*/
#ifdef XTHREADS
 
unsigned long
_glthread_GetID(void)
{
return (unsigned long) xthread_self();
}
 
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
if (xthread_key_create(&tsd->key, NULL) != 0) {
perror(INIT_TSD_ERROR);
exit(-1);
}
tsd->initMagic = INIT_MAGIC;
}
 
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
void *ptr;
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
xthread_get_specific(tsd->key, &ptr);
return ptr;
}
 
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
if (tsd->initMagic != INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
xthread_set_specific(tsd->key, ptr);
}
 
#endif /* XTHREAD */
 
 
 
/*
* BeOS threads
*/
#ifdef BEOS_THREADS
 
unsigned long
_glthread_GetID(void)
{
return (unsigned long) find_thread(NULL);
}
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
tsd->key = tls_allocate();
tsd->initMagic = INIT_MAGIC;
}
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
if (tsd->initMagic != (int) INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
return tls_get(tsd->key);
}
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
if (tsd->initMagic != (int) INIT_MAGIC) {
_glthread_InitTSD(tsd);
}
tls_set(tsd->key, ptr);
}
 
#endif /* BEOS_THREADS */
 
 
 
#else /* THREADS */
 
 
/*
* no-op functions
*/
 
unsigned long
_glthread_GetID(void)
{
return 0;
}
 
 
void
_glthread_InitTSD(_glthread_TSD *tsd)
{
(void) tsd;
}
 
 
void *
_glthread_GetTSD(_glthread_TSD *tsd)
{
(void) tsd;
return NULL;
}
 
 
void
_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
{
(void) tsd;
(void) ptr;
}
 
 
#endif /* THREADS */
/shark/trunk/ports/mesa/src/attrib.h
0,0 → 1,47
/* $Id: attrib.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef ATTRIB_H
#define ATTRIB_h
 
 
#include "mtypes.h"
 
extern void
_mesa_PushAttrib( GLbitfield mask );
 
extern void
_mesa_PopAttrib( void );
 
extern void
_mesa_PushClientAttrib( GLbitfield mask );
 
extern void
_mesa_PopClientAttrib( void );
 
 
#endif
/shark/trunk/ports/mesa/src/debug.h
0,0 → 1,34
/* $Id: debug.h,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#ifndef _DEBUG_H
#define _DEBUG_H
 
void _mesa_print_tri_caps( const char *name, GLuint flags );
void _mesa_print_enable_flags( const char *msg, GLuint flags );
void _mesa_print_state( const char *msg, GLuint state );
 
#endif
/shark/trunk/ports/mesa/src/glapioffsets.h
0,0 → 1,660
/* DO NOT EDIT - This file generated automatically by gloffsets.py script */
#ifndef _GLAPI_OFFSETS_H_
#define _GLAPI_OFFSETS_H_
 
#define _gloffset_NewList 0
#define _gloffset_EndList 1
#define _gloffset_CallList 2
#define _gloffset_CallLists 3
#define _gloffset_DeleteLists 4
#define _gloffset_GenLists 5
#define _gloffset_ListBase 6
#define _gloffset_Begin 7
#define _gloffset_Bitmap 8
#define _gloffset_Color3b 9
#define _gloffset_Color3bv 10
#define _gloffset_Color3d 11
#define _gloffset_Color3dv 12
#define _gloffset_Color3f 13
#define _gloffset_Color3fv 14
#define _gloffset_Color3i 15
#define _gloffset_Color3iv 16
#define _gloffset_Color3s 17
#define _gloffset_Color3sv 18
#define _gloffset_Color3ub 19
#define _gloffset_Color3ubv 20
#define _gloffset_Color3ui 21
#define _gloffset_Color3uiv 22
#define _gloffset_Color3us 23
#define _gloffset_Color3usv 24
#define _gloffset_Color4b 25
#define _gloffset_Color4bv 26
#define _gloffset_Color4d 27
#define _gloffset_Color4dv 28
#define _gloffset_Color4f 29
#define _gloffset_Color4fv 30
#define _gloffset_Color4i 31
#define _gloffset_Color4iv 32
#define _gloffset_Color4s 33
#define _gloffset_Color4sv 34
#define _gloffset_Color4ub 35
#define _gloffset_Color4ubv 36
#define _gloffset_Color4ui 37
#define _gloffset_Color4uiv 38
#define _gloffset_Color4us 39
#define _gloffset_Color4usv 40
#define _gloffset_EdgeFlag 41
#define _gloffset_EdgeFlagv 42
#define _gloffset_End 43
#define _gloffset_Indexd 44
#define _gloffset_Indexdv 45
#define _gloffset_Indexf 46
#define _gloffset_Indexfv 47
#define _gloffset_Indexi 48
#define _gloffset_Indexiv 49
#define _gloffset_Indexs 50
#define _gloffset_Indexsv 51
#define _gloffset_Normal3b 52
#define _gloffset_Normal3bv 53
#define _gloffset_Normal3d 54
#define _gloffset_Normal3dv 55
#define _gloffset_Normal3f 56
#define _gloffset_Normal3fv 57
#define _gloffset_Normal3i 58
#define _gloffset_Normal3iv 59
#define _gloffset_Normal3s 60
#define _gloffset_Normal3sv 61
#define _gloffset_RasterPos2d 62
#define _gloffset_RasterPos2dv 63
#define _gloffset_RasterPos2f 64
#define _gloffset_RasterPos2fv 65
#define _gloffset_RasterPos2i 66
#define _gloffset_RasterPos2iv 67
#define _gloffset_RasterPos2s 68
#define _gloffset_RasterPos2sv 69
#define _gloffset_RasterPos3d 70
#define _gloffset_RasterPos3dv 71
#define _gloffset_RasterPos3f 72
#define _gloffset_RasterPos3fv 73
#define _gloffset_RasterPos3i 74
#define _gloffset_RasterPos3iv 75
#define _gloffset_RasterPos3s 76
#define _gloffset_RasterPos3sv 77
#define _gloffset_RasterPos4d 78
#define _gloffset_RasterPos4dv 79
#define _gloffset_RasterPos4f 80
#define _gloffset_RasterPos4fv 81
#define _gloffset_RasterPos4i 82
#define _gloffset_RasterPos4iv 83
#define _gloffset_RasterPos4s 84
#define _gloffset_RasterPos4sv 85
#define _gloffset_Rectd 86
#define _gloffset_Rectdv 87
#define _gloffset_Rectf 88
#define _gloffset_Rectfv 89
#define _gloffset_Recti 90
#define _gloffset_Rectiv 91
#define _gloffset_Rects 92
#define _gloffset_Rectsv 93
#define _gloffset_TexCoord1d 94
#define _gloffset_TexCoord1dv 95
#define _gloffset_TexCoord1f 96
#define _gloffset_TexCoord1fv 97
#define _gloffset_TexCoord1i 98
#define _gloffset_TexCoord1iv 99
#define _gloffset_TexCoord1s 100
#define _gloffset_TexCoord1sv 101
#define _gloffset_TexCoord2d 102
#define _gloffset_TexCoord2dv 103
#define _gloffset_TexCoord2f 104
#define _gloffset_TexCoord2fv 105
#define _gloffset_TexCoord2i 106
#define _gloffset_TexCoord2iv 107
#define _gloffset_TexCoord2s 108
#define _gloffset_TexCoord2sv 109
#define _gloffset_TexCoord3d 110
#define _gloffset_TexCoord3dv 111
#define _gloffset_TexCoord3f 112
#define _gloffset_TexCoord3fv 113
#define _gloffset_TexCoord3i 114
#define _gloffset_TexCoord3iv 115
#define _gloffset_TexCoord3s 116
#define _gloffset_TexCoord3sv 117
#define _gloffset_TexCoord4d 118
#define _gloffset_TexCoord4dv 119
#define _gloffset_TexCoord4f 120
#define _gloffset_TexCoord4fv 121
#define _gloffset_TexCoord4i 122
#define _gloffset_TexCoord4iv 123
#define _gloffset_TexCoord4s 124
#define _gloffset_TexCoord4sv 125
#define _gloffset_Vertex2d 126
#define _gloffset_Vertex2dv 127
#define _gloffset_Vertex2f 128
#define _gloffset_Vertex2fv 129
#define _gloffset_Vertex2i 130
#define _gloffset_Vertex2iv 131
#define _gloffset_Vertex2s 132
#define _gloffset_Vertex2sv 133
#define _gloffset_Vertex3d 134
#define _gloffset_Vertex3dv 135
#define _gloffset_Vertex3f 136
#define _gloffset_Vertex3fv 137
#define _gloffset_Vertex3i 138
#define _gloffset_Vertex3iv 139
#define _gloffset_Vertex3s 140
#define _gloffset_Vertex3sv 141
#define _gloffset_Vertex4d 142
#define _gloffset_Vertex4dv 143
#define _gloffset_Vertex4f 144
#define _gloffset_Vertex4fv 145
#define _gloffset_Vertex4i 146
#define _gloffset_Vertex4iv 147
#define _gloffset_Vertex4s 148
#define _gloffset_Vertex4sv 149
#define _gloffset_ClipPlane 150
#define _gloffset_ColorMaterial 151
#define _gloffset_CullFace 152
#define _gloffset_Fogf 153
#define _gloffset_Fogfv 154
#define _gloffset_Fogi 155
#define _gloffset_Fogiv 156
#define _gloffset_FrontFace 157
#define _gloffset_Hint 158
#define _gloffset_Lightf 159
#define _gloffset_Lightfv 160
#define _gloffset_Lighti 161
#define _gloffset_Lightiv 162
#define _gloffset_LightModelf 163
#define _gloffset_LightModelfv 164
#define _gloffset_LightModeli 165
#define _gloffset_LightModeliv 166
#define _gloffset_LineStipple 167
#define _gloffset_LineWidth 168
#define _gloffset_Materialf 169
#define _gloffset_Materialfv 170
#define _gloffset_Materiali 171
#define _gloffset_Materialiv 172
#define _gloffset_PointSize 173
#define _gloffset_PolygonMode 174
#define _gloffset_PolygonStipple 175
#define _gloffset_Scissor 176
#define _gloffset_ShadeModel 177
#define _gloffset_TexParameterf 178
#define _gloffset_TexParameterfv 179
#define _gloffset_TexParameteri 180
#define _gloffset_TexParameteriv 181
#define _gloffset_TexImage1D 182
#define _gloffset_TexImage2D 183
#define _gloffset_TexEnvf 184
#define _gloffset_TexEnvfv 185
#define _gloffset_TexEnvi 186
#define _gloffset_TexEnviv 187
#define _gloffset_TexGend 188
#define _gloffset_TexGendv 189
#define _gloffset_TexGenf 190
#define _gloffset_TexGenfv 191
#define _gloffset_TexGeni 192
#define _gloffset_TexGeniv 193
#define _gloffset_FeedbackBuffer 194
#define _gloffset_SelectBuffer 195
#define _gloffset_RenderMode 196
#define _gloffset_InitNames 197
#define _gloffset_LoadName 198
#define _gloffset_PassThrough 199
#define _gloffset_PopName 200
#define _gloffset_PushName 201
#define _gloffset_DrawBuffer 202
#define _gloffset_Clear 203
#define _gloffset_ClearAccum 204
#define _gloffset_ClearIndex 205
#define _gloffset_ClearColor 206
#define _gloffset_ClearStencil 207
#define _gloffset_ClearDepth 208
#define _gloffset_StencilMask 209
#define _gloffset_ColorMask 210
#define _gloffset_DepthMask 211
#define _gloffset_IndexMask 212
#define _gloffset_Accum 213
#define _gloffset_Disable 214
#define _gloffset_Enable 215
#define _gloffset_Finish 216
#define _gloffset_Flush 217
#define _gloffset_PopAttrib 218
#define _gloffset_PushAttrib 219
#define _gloffset_Map1d 220
#define _gloffset_Map1f 221
#define _gloffset_Map2d 222
#define _gloffset_Map2f 223
#define _gloffset_MapGrid1d 224
#define _gloffset_MapGrid1f 225
#define _gloffset_MapGrid2d 226
#define _gloffset_MapGrid2f 227
#define _gloffset_EvalCoord1d 228
#define _gloffset_EvalCoord1dv 229
#define _gloffset_EvalCoord1f 230
#define _gloffset_EvalCoord1fv 231
#define _gloffset_EvalCoord2d 232
#define _gloffset_EvalCoord2dv 233
#define _gloffset_EvalCoord2f 234
#define _gloffset_EvalCoord2fv 235
#define _gloffset_EvalMesh1 236
#define _gloffset_EvalPoint1 237
#define _gloffset_EvalMesh2 238
#define _gloffset_EvalPoint2 239
#define _gloffset_AlphaFunc 240
#define _gloffset_BlendFunc 241
#define _gloffset_LogicOp 242
#define _gloffset_StencilFunc 243
#define _gloffset_StencilOp 244
#define _gloffset_DepthFunc 245
#define _gloffset_PixelZoom 246
#define _gloffset_PixelTransferf 247
#define _gloffset_PixelTransferi 248
#define _gloffset_PixelStoref 249
#define _gloffset_PixelStorei 250
#define _gloffset_PixelMapfv 251
#define _gloffset_PixelMapuiv 252
#define _gloffset_PixelMapusv 253
#define _gloffset_ReadBuffer 254
#define _gloffset_CopyPixels 255
#define _gloffset_ReadPixels 256
#define _gloffset_DrawPixels 257
#define _gloffset_GetBooleanv 258
#define _gloffset_GetClipPlane 259
#define _gloffset_GetDoublev 260
#define _gloffset_GetError 261
#define _gloffset_GetFloatv 262
#define _gloffset_GetIntegerv 263
#define _gloffset_GetLightfv 264
#define _gloffset_GetLightiv 265
#define _gloffset_GetMapdv 266
#define _gloffset_GetMapfv 267
#define _gloffset_GetMapiv 268
#define _gloffset_GetMaterialfv 269
#define _gloffset_GetMaterialiv 270
#define _gloffset_GetPixelMapfv 271
#define _gloffset_GetPixelMapuiv 272
#define _gloffset_GetPixelMapusv 273
#define _gloffset_GetPolygonStipple 274
#define _gloffset_GetString 275
#define _gloffset_GetTexEnvfv 276
#define _gloffset_GetTexEnviv 277
#define _gloffset_GetTexGendv 278
#define _gloffset_GetTexGenfv 279
#define _gloffset_GetTexGeniv 280
#define _gloffset_GetTexImage 281
#define _gloffset_GetTexParameterfv 282
#define _gloffset_GetTexParameteriv 283
#define _gloffset_GetTexLevelParameterfv 284
#define _gloffset_GetTexLevelParameteriv 285
#define _gloffset_IsEnabled 286
#define _gloffset_IsList 287
#define _gloffset_DepthRange 288
#define _gloffset_Frustum 289
#define _gloffset_LoadIdentity 290
#define _gloffset_LoadMatrixf 291
#define _gloffset_LoadMatrixd 292
#define _gloffset_MatrixMode 293
#define _gloffset_MultMatrixf 294
#define _gloffset_MultMatrixd 295
#define _gloffset_Ortho 296
#define _gloffset_PopMatrix 297
#define _gloffset_PushMatrix 298
#define _gloffset_Rotated 299
#define _gloffset_Rotatef 300
#define _gloffset_Scaled 301
#define _gloffset_Scalef 302
#define _gloffset_Translated 303
#define _gloffset_Translatef 304
#define _gloffset_Viewport 305
#define _gloffset_ArrayElement 306
#define _gloffset_BindTexture 307
#define _gloffset_ColorPointer 308
#define _gloffset_DisableClientState 309
#define _gloffset_DrawArrays 310
#define _gloffset_DrawElements 311
#define _gloffset_EdgeFlagPointer 312
#define _gloffset_EnableClientState 313
#define _gloffset_IndexPointer 314
#define _gloffset_Indexub 315
#define _gloffset_Indexubv 316
#define _gloffset_InterleavedArrays 317
#define _gloffset_NormalPointer 318
#define _gloffset_PolygonOffset 319
#define _gloffset_TexCoordPointer 320
#define _gloffset_VertexPointer 321
#define _gloffset_AreTexturesResident 322
#define _gloffset_CopyTexImage1D 323
#define _gloffset_CopyTexImage2D 324
#define _gloffset_CopyTexSubImage1D 325
#define _gloffset_CopyTexSubImage2D 326
#define _gloffset_DeleteTextures 327
#define _gloffset_GenTextures 328
#define _gloffset_GetPointerv 329
#define _gloffset_IsTexture 330
#define _gloffset_PrioritizeTextures 331
#define _gloffset_TexSubImage1D 332
#define _gloffset_TexSubImage2D 333
#define _gloffset_PopClientAttrib 334
#define _gloffset_PushClientAttrib 335
#define _gloffset_BlendColor 336
#define _gloffset_BlendEquation 337
#define _gloffset_DrawRangeElements 338
#define _gloffset_ColorTable 339
#define _gloffset_ColorTableParameterfv 340
#define _gloffset_ColorTableParameteriv 341
#define _gloffset_CopyColorTable 342
#define _gloffset_GetColorTable 343
#define _gloffset_GetColorTableParameterfv 344
#define _gloffset_GetColorTableParameteriv 345
#define _gloffset_ColorSubTable 346
#define _gloffset_CopyColorSubTable 347
#define _gloffset_ConvolutionFilter1D 348
#define _gloffset_ConvolutionFilter2D 349
#define _gloffset_ConvolutionParameterf 350
#define _gloffset_ConvolutionParameterfv 351
#define _gloffset_ConvolutionParameteri 352
#define _gloffset_ConvolutionParameteriv 353
#define _gloffset_CopyConvolutionFilter1D 354
#define _gloffset_CopyConvolutionFilter2D 355
#define _gloffset_GetConvolutionFilter 356
#define _gloffset_GetConvolutionParameterfv 357
#define _gloffset_GetConvolutionParameteriv 358
#define _gloffset_GetSeparableFilter 359
#define _gloffset_SeparableFilter2D 360
#define _gloffset_GetHistogram 361
#define _gloffset_GetHistogramParameterfv 362
#define _gloffset_GetHistogramParameteriv 363
#define _gloffset_GetMinmax 364
#define _gloffset_GetMinmaxParameterfv 365
#define _gloffset_GetMinmaxParameteriv 366
#define _gloffset_Histogram 367
#define _gloffset_Minmax 368
#define _gloffset_ResetHistogram 369
#define _gloffset_ResetMinmax 370
#define _gloffset_TexImage3D 371
#define _gloffset_TexSubImage3D 372
#define _gloffset_CopyTexSubImage3D 373
#define _gloffset_ActiveTextureARB 374
#define _gloffset_ClientActiveTextureARB 375
#define _gloffset_MultiTexCoord1dARB 376
#define _gloffset_MultiTexCoord1dvARB 377
#define _gloffset_MultiTexCoord1fARB 378
#define _gloffset_MultiTexCoord1fvARB 379
#define _gloffset_MultiTexCoord1iARB 380
#define _gloffset_MultiTexCoord1ivARB 381
#define _gloffset_MultiTexCoord1sARB 382
#define _gloffset_MultiTexCoord1svARB 383
#define _gloffset_MultiTexCoord2dARB 384
#define _gloffset_MultiTexCoord2dvARB 385
#define _gloffset_MultiTexCoord2fARB 386
#define _gloffset_MultiTexCoord2fvARB 387
#define _gloffset_MultiTexCoord2iARB 388
#define _gloffset_MultiTexCoord2ivARB 389
#define _gloffset_MultiTexCoord2sARB 390
#define _gloffset_MultiTexCoord2svARB 391
#define _gloffset_MultiTexCoord3dARB 392
#define _gloffset_MultiTexCoord3dvARB 393
#define _gloffset_MultiTexCoord3fARB 394
#define _gloffset_MultiTexCoord3fvARB 395
#define _gloffset_MultiTexCoord3iARB 396
#define _gloffset_MultiTexCoord3ivARB 397
#define _gloffset_MultiTexCoord3sARB 398
#define _gloffset_MultiTexCoord3svARB 399
#define _gloffset_MultiTexCoord4dARB 400
#define _gloffset_MultiTexCoord4dvARB 401
#define _gloffset_MultiTexCoord4fARB 402
#define _gloffset_MultiTexCoord4fvARB 403
#define _gloffset_MultiTexCoord4iARB 404
#define _gloffset_MultiTexCoord4ivARB 405
#define _gloffset_MultiTexCoord4sARB 406
#define _gloffset_MultiTexCoord4svARB 407
#define _gloffset_LoadTransposeMatrixfARB 408
#define _gloffset_LoadTransposeMatrixdARB 409
#define _gloffset_MultTransposeMatrixfARB 410
#define _gloffset_MultTransposeMatrixdARB 411
#define _gloffset_SampleCoverageARB 412
#define _gloffset___unused413 413
#define _gloffset_PolygonOffsetEXT 414
#define _gloffset_GetTexFilterFuncSGIS 415
#define _gloffset_TexFilterFuncSGIS 416
#define _gloffset_GetHistogramEXT 417
#define _gloffset_GetHistogramParameterfvEXT 418
#define _gloffset_GetHistogramParameterivEXT 419
#define _gloffset_GetMinmaxEXT 420
#define _gloffset_GetMinmaxParameterfvEXT 421
#define _gloffset_GetMinmaxParameterivEXT 422
#define _gloffset_GetConvolutionFilterEXT 423
#define _gloffset_GetConvolutionParameterfvEXT 424
#define _gloffset_GetConvolutionParameterivEXT 425
#define _gloffset_GetSeparableFilterEXT 426
#define _gloffset_GetColorTableSGI 427
#define _gloffset_GetColorTableParameterfvSGI 428
#define _gloffset_GetColorTableParameterivSGI 429
#define _gloffset_PixelTexGenSGIX 430
#define _gloffset_PixelTexGenParameteriSGIS 431
#define _gloffset_PixelTexGenParameterivSGIS 432
#define _gloffset_PixelTexGenParameterfSGIS 433
#define _gloffset_PixelTexGenParameterfvSGIS 434
#define _gloffset_GetPixelTexGenParameterivSGIS 435
#define _gloffset_GetPixelTexGenParameterfvSGIS 436
#define _gloffset_TexImage4DSGIS 437
#define _gloffset_TexSubImage4DSGIS 438
#define _gloffset_AreTexturesResidentEXT 439
#define _gloffset_GenTexturesEXT 440
#define _gloffset_IsTextureEXT 441
#define _gloffset_DetailTexFuncSGIS 442
#define _gloffset_GetDetailTexFuncSGIS 443
#define _gloffset_SharpenTexFuncSGIS 444
#define _gloffset_GetSharpenTexFuncSGIS 445
#define _gloffset_SampleMaskSGIS 446
#define _gloffset_SamplePatternSGIS 447
#define _gloffset_ColorPointerEXT 448
#define _gloffset_EdgeFlagPointerEXT 449
#define _gloffset_IndexPointerEXT 450
#define _gloffset_NormalPointerEXT 451
#define _gloffset_TexCoordPointerEXT 452
#define _gloffset_VertexPointerEXT 453
#define _gloffset_SpriteParameterfSGIX 454
#define _gloffset_SpriteParameterfvSGIX 455
#define _gloffset_SpriteParameteriSGIX 456
#define _gloffset_SpriteParameterivSGIX 457
#define _gloffset_PointParameterfEXT 458
#define _gloffset_PointParameterfvEXT 459
#define _gloffset_GetInstrumentsSGIX 460
#define _gloffset_InstrumentsBufferSGIX 461
#define _gloffset_PollInstrumentsSGIX 462
#define _gloffset_ReadInstrumentsSGIX 463
#define _gloffset_StartInstrumentsSGIX 464
#define _gloffset_StopInstrumentsSGIX 465
#define _gloffset_FrameZoomSGIX 466
#define _gloffset_TagSampleBufferSGIX 467
#define _gloffset_ReferencePlaneSGIX 468
#define _gloffset_FlushRasterSGIX 469
#define _gloffset_GetListParameterfvSGIX 470
#define _gloffset_GetListParameterivSGIX 471
#define _gloffset_ListParameterfSGIX 472
#define _gloffset_ListParameterfvSGIX 473
#define _gloffset_ListParameteriSGIX 474
#define _gloffset_ListParameterivSGIX 475
#define _gloffset_FragmentColorMaterialSGIX 476
#define _gloffset_FragmentLightfSGIX 477
#define _gloffset_FragmentLightfvSGIX 478
#define _gloffset_FragmentLightiSGIX 479
#define _gloffset_FragmentLightivSGIX 480
#define _gloffset_FragmentLightModelfSGIX 481
#define _gloffset_FragmentLightModelfvSGIX 482
#define _gloffset_FragmentLightModeliSGIX 483
#define _gloffset_FragmentLightModelivSGIX 484
#define _gloffset_FragmentMaterialfSGIX 485
#define _gloffset_FragmentMaterialfvSGIX 486
#define _gloffset_FragmentMaterialiSGIX 487
#define _gloffset_FragmentMaterialivSGIX 488
#define _gloffset_GetFragmentLightfvSGIX 489
#define _gloffset_GetFragmentLightivSGIX 490
#define _gloffset_GetFragmentMaterialfvSGIX 491
#define _gloffset_GetFragmentMaterialivSGIX 492
#define _gloffset_LightEnviSGIX 493
#define _gloffset_VertexWeightfEXT 494
#define _gloffset_VertexWeightfvEXT 495
#define _gloffset_VertexWeightPointerEXT 496
#define _gloffset_FlushVertexArrayRangeNV 497
#define _gloffset_VertexArrayRangeNV 498
#define _gloffset_CombinerParameterfvNV 499
#define _gloffset_CombinerParameterfNV 500
#define _gloffset_CombinerParameterivNV 501
#define _gloffset_CombinerParameteriNV 502
#define _gloffset_CombinerInputNV 503
#define _gloffset_CombinerOutputNV 504
#define _gloffset_FinalCombinerInputNV 505
#define _gloffset_GetCombinerInputParameterfvNV 506
#define _gloffset_GetCombinerInputParameterivNV 507
#define _gloffset_GetCombinerOutputParameterfvNV 508
#define _gloffset_GetCombinerOutputParameterivNV 509
#define _gloffset_GetFinalCombinerInputParameterfvNV 510
#define _gloffset_GetFinalCombinerInputParameterivNV 511
#define _gloffset_ResizeBuffersMESA 512
#define _gloffset_WindowPos2dMESA 513
#define _gloffset_WindowPos2dvMESA 514
#define _gloffset_WindowPos2fMESA 515
#define _gloffset_WindowPos2fvMESA 516
#define _gloffset_WindowPos2iMESA 517
#define _gloffset_WindowPos2ivMESA 518
#define _gloffset_WindowPos2sMESA 519
#define _gloffset_WindowPos2svMESA 520
#define _gloffset_WindowPos3dMESA 521
#define _gloffset_WindowPos3dvMESA 522
#define _gloffset_WindowPos3fMESA 523
#define _gloffset_WindowPos3fvMESA 524
#define _gloffset_WindowPos3iMESA 525
#define _gloffset_WindowPos3ivMESA 526
#define _gloffset_WindowPos3sMESA 527
#define _gloffset_WindowPos3svMESA 528
#define _gloffset_WindowPos4dMESA 529
#define _gloffset_WindowPos4dvMESA 530
#define _gloffset_WindowPos4fMESA 531
#define _gloffset_WindowPos4fvMESA 532
#define _gloffset_WindowPos4iMESA 533
#define _gloffset_WindowPos4ivMESA 534
#define _gloffset_WindowPos4sMESA 535
#define _gloffset_WindowPos4svMESA 536
#define _gloffset_BlendFuncSeparateEXT 537
#define _gloffset_IndexMaterialEXT 538
#define _gloffset_IndexFuncEXT 539
#define _gloffset_LockArraysEXT 540
#define _gloffset_UnlockArraysEXT 541
#define _gloffset_CullParameterdvEXT 542
#define _gloffset_CullParameterfvEXT 543
#define _gloffset_HintPGI 544
#define _gloffset_FogCoordfEXT 545
#define _gloffset_FogCoordfvEXT 546
#define _gloffset_FogCoorddEXT 547
#define _gloffset_FogCoorddvEXT 548
#define _gloffset_FogCoordPointerEXT 549
#define _gloffset_GetColorTableEXT 550
#define _gloffset_GetColorTableParameterivEXT 551
#define _gloffset_GetColorTableParameterfvEXT 552
#define _gloffset_TbufferMask3DFX 553
#define _gloffset_CompressedTexImage3DARB 554
#define _gloffset_CompressedTexImage2DARB 555
#define _gloffset_CompressedTexImage1DARB 556
#define _gloffset_CompressedTexSubImage3DARB 557
#define _gloffset_CompressedTexSubImage2DARB 558
#define _gloffset_CompressedTexSubImage1DARB 559
#define _gloffset_GetCompressedTexImageARB 560
#define _gloffset_SecondaryColor3bEXT 561
#define _gloffset_SecondaryColor3bvEXT 562
#define _gloffset_SecondaryColor3dEXT 563
#define _gloffset_SecondaryColor3dvEXT 564
#define _gloffset_SecondaryColor3fEXT 565
#define _gloffset_SecondaryColor3fvEXT 566
#define _gloffset_SecondaryColor3iEXT 567
#define _gloffset_SecondaryColor3ivEXT 568
#define _gloffset_SecondaryColor3sEXT 569
#define _gloffset_SecondaryColor3svEXT 570
#define _gloffset_SecondaryColor3ubEXT 571
#define _gloffset_SecondaryColor3ubvEXT 572
#define _gloffset_SecondaryColor3uiEXT 573
#define _gloffset_SecondaryColor3uivEXT 574
#define _gloffset_SecondaryColor3usEXT 575
#define _gloffset_SecondaryColor3usvEXT 576
#define _gloffset_SecondaryColorPointerEXT 577
#define _gloffset_AreProgramsResidentNV 578
#define _gloffset_BindProgramNV 579
#define _gloffset_DeleteProgramsNV 580
#define _gloffset_ExecuteProgramNV 581
#define _gloffset_GenProgramsNV 582
#define _gloffset_GetProgramParameterdvNV 583
#define _gloffset_GetProgramParameterfvNV 584
#define _gloffset_GetProgramivNV 585
#define _gloffset_GetProgramStringNV 586
#define _gloffset_GetTrackMatrixivNV 587
#define _gloffset_GetVertexAttribdvNV 588
#define _gloffset_GetVertexAttribfvNV 589
#define _gloffset_GetVertexAttribivNV 590
#define _gloffset_GetVertexAttribPointervNV 591
#define _gloffset_IsProgramNV 592
#define _gloffset_LoadProgramNV 593
#define _gloffset_ProgramParameter4dNV 594
#define _gloffset_ProgramParameter4dvNV 595
#define _gloffset_ProgramParameter4fNV 596
#define _gloffset_ProgramParameter4fvNV 597
#define _gloffset_ProgramParameters4dvNV 598
#define _gloffset_ProgramParameters4fvNV 599
#define _gloffset_RequestResidentProgramsNV 600
#define _gloffset_TrackMatrixNV 601
#define _gloffset_VertexAttribPointerNV 602
#define _gloffset_VertexAttrib1dNV 603
#define _gloffset_VertexAttrib1dvNV 604
#define _gloffset_VertexAttrib1fNV 605
#define _gloffset_VertexAttrib1fvNV 606
#define _gloffset_VertexAttrib1sNV 607
#define _gloffset_VertexAttrib1svNV 608
#define _gloffset_VertexAttrib2dNV 609
#define _gloffset_VertexAttrib2dvNV 610
#define _gloffset_VertexAttrib2fNV 611
#define _gloffset_VertexAttrib2fvNV 612
#define _gloffset_VertexAttrib2sNV 613
#define _gloffset_VertexAttrib2svNV 614
#define _gloffset_VertexAttrib3dNV 615
#define _gloffset_VertexAttrib3dvNV 616
#define _gloffset_VertexAttrib3fNV 617
#define _gloffset_VertexAttrib3fvNV 618
#define _gloffset_VertexAttrib3sNV 619
#define _gloffset_VertexAttrib3svNV 620
#define _gloffset_VertexAttrib4dNV 621
#define _gloffset_VertexAttrib4dvNV 622
#define _gloffset_VertexAttrib4fNV 623
#define _gloffset_VertexAttrib4fvNV 624
#define _gloffset_VertexAttrib4sNV 625
#define _gloffset_VertexAttrib4svNV 626
#define _gloffset_VertexAttrib4ubNV 627
#define _gloffset_VertexAttrib4ubvNV 628
#define _gloffset_VertexAttribs1dvNV 629
#define _gloffset_VertexAttribs1fvNV 630
#define _gloffset_VertexAttribs1svNV 631
#define _gloffset_VertexAttribs2dvNV 632
#define _gloffset_VertexAttribs2fvNV 633
#define _gloffset_VertexAttribs2svNV 634
#define _gloffset_VertexAttribs3dvNV 635
#define _gloffset_VertexAttribs3fvNV 636
#define _gloffset_VertexAttribs3svNV 637
#define _gloffset_VertexAttribs4dvNV 638
#define _gloffset_VertexAttribs4fvNV 639
#define _gloffset_VertexAttribs4svNV 640
#define _gloffset_VertexAttribs4ubvNV 641
#define _gloffset_PointParameteriNV 642
#define _gloffset_PointParameterivNV 643
#define _gloffset_MultiDrawArraysEXT 644
#define _gloffset_MultiDrawElementsEXT 645
#define _gloffset_ActiveStencilFaceEXT 646
#define _gloffset_DeleteFencesNV 647
#define _gloffset_GenFencesNV 648
#define _gloffset_IsFenceNV 649
#define _gloffset_TestFenceNV 650
#define _gloffset_GetFenceivNV 651
#define _gloffset_FinishFenceNV 652
#define _gloffset_SetFenceNV 653
 
#endif
/shark/trunk/ports/mesa/src/enums.h
0,0 → 1,34
/* $Id: enums.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef _ENUMS_H_
#define _ENUMS_H_
 
extern const char *_mesa_lookup_enum_by_nr( int nr );
extern int _mesa_lookup_enum_by_name( const char *symbol );
 
#endif
/shark/trunk/ports/mesa/src/dd.h
0,0 → 1,700
/* $Id: dd.h,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
 
#ifndef DD_INCLUDED
#define DD_INCLUDED
 
/* THIS FILE ONLY INCLUDED BY mtypes.h !!!!! */
 
struct gl_pixelstore_attrib;
 
/* Mask bits sent to the driver Clear() function */
#define DD_FRONT_LEFT_BIT FRONT_LEFT_BIT /* 1 */
#define DD_FRONT_RIGHT_BIT FRONT_RIGHT_BIT /* 2 */
#define DD_BACK_LEFT_BIT BACK_LEFT_BIT /* 4 */
#define DD_BACK_RIGHT_BIT BACK_RIGHT_BIT /* 8 */
#define DD_AUX0 AUX0_BIT /* future use */
#define DD_AUX1 AUX1_BIT /* future use */
#define DD_AUX2 AUX2_BIT /* future use */
#define DD_AUX3 AUX3_BIT /* future use */
#define DD_DEPTH_BIT GL_DEPTH_BUFFER_BIT /* 0x00000100 */
#define DD_ACCUM_BIT GL_ACCUM_BUFFER_BIT /* 0x00000200 */
#define DD_STENCIL_BIT GL_STENCIL_BUFFER_BIT /* 0x00000400 */
 
 
/*
* Device Driver function table.
*/
struct dd_function_table {
 
const GLubyte * (*GetString)( GLcontext *ctx, GLenum name );
/* Return a string as needed by glGetString().
* Only the GL_RENDERER token must be implemented. Otherwise,
* NULL can be returned.
*/
 
void (*UpdateState)( GLcontext *ctx, GLuint new_state );
/*
* UpdateState() is called to notify the driver after Mesa has made
* some internal state changes. This is in addition to any
* statechange callbacks Mesa may already have made.
*/
 
void (*Clear)( GLcontext *ctx, GLbitfield mask, GLboolean all,
GLint x, GLint y, GLint width, GLint height );
/* Clear the color/depth/stencil/accum buffer(s).
* 'mask' is a bitmask of the DD_*_BIT values defined above that indicates
* which buffers need to be cleared.
* If 'all' is true then the clear the whole buffer, else clear only the
* region defined by (x,y,width,height).
* This function must obey the glColorMask, glIndexMask and glStencilMask
* settings!
* Software Mesa can do masked clears if the device driver can't.
*/
 
void (*DrawBuffer)( GLcontext *ctx, GLenum buffer );
/*
* Specifies the current buffer for writing. Called via glDrawBuffer().
* Note the driver must organize fallbacks (eg with swrast) if it
* cannot implement the requested mode.
*/
 
 
void (*ReadBuffer)( GLcontext *ctx, GLenum buffer );
/*
* Specifies the current buffer for reading. Called via glReadBuffer().
*/
 
void (*GetBufferSize)( GLframebuffer *buffer,
GLuint *width, GLuint *height );
/*
* Returns the width and height of the named buffer/window.
* Mesa uses this to determine when the driver's window size has changed.
*/
 
void (*ResizeBuffers)( GLframebuffer *buffer );
/*
* Resize the driver's depth/stencil/accum/back buffers to match the
* size given in the GLframebuffer struct. This is typically called
* when Mesa detects that a window size has changed.
*/
 
void (*Finish)( GLcontext *ctx );
/*
* This is called whenever glFinish() is called.
*/
 
void (*Flush)( GLcontext *ctx );
/*
* This is called whenever glFlush() is called.
*/
 
void (*Error)( GLcontext *ctx );
/*
* Called whenever an error is generated. ctx->ErrorValue contains
* the error value.
*/
 
 
/***
*** For hardware accumulation buffer:
***/
void (*Accum)( GLcontext *ctx, GLenum op, GLfloat value,
GLint xpos, GLint ypos, GLint width, GLint height );
/* Execute glAccum command within the given scissor region.
*/
 
 
/***
*** glDraw/Read/CopyPixels and glBitmap functions:
***/
 
void (*DrawPixels)( GLcontext *ctx,
GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *unpack,
const GLvoid *pixels );
/* This is called by glDrawPixels.
* 'unpack' describes how to unpack the source image data.
*/
 
void (*ReadPixels)( GLcontext *ctx,
GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *unpack,
GLvoid *dest );
/* Called by glReadPixels.
*/
 
void (*CopyPixels)( GLcontext *ctx,
GLint srcx, GLint srcy,
GLsizei width, GLsizei height,
GLint dstx, GLint dsty, GLenum type );
/* Do a glCopyPixels. This function must respect all rasterization
* state, glPixelTransfer, glPixelZoom, etc.
*/
 
void (*Bitmap)( GLcontext *ctx,
GLint x, GLint y, GLsizei width, GLsizei height,
const struct gl_pixelstore_attrib *unpack,
const GLubyte *bitmap );
/* This is called by glBitmap. Works the same as DrawPixels, above.
*/
 
/***
*** Texture image functions:
***/
const struct gl_texture_format *
(*ChooseTextureFormat)( GLcontext *ctx, GLint internalFormat,
GLenum srcFormat, GLenum srcType );
/* This is called by the _mesa_store_tex[sub]image[123]d() fallback
* functions. The driver should examine <internalFormat> and return a
* pointer to an appropriate gl_texture_format.
*/
 
void (*TexImage1D)( GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*TexImage2D)( GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*TexImage3D)( GLcontext *ctx, GLenum target, GLint level,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
/* Called by glTexImage1/2/3D.
* Arguments:
* <target>, <level>, <format>, <type> and <pixels> are user specified.
* <packing> indicates the image packing of pixels.
* <texObj> is the target texture object.
* <texImage> is the target texture image. It will have the texture
* width, height, depth, border and internalFormat information.
* <retainInternalCopy> is returned by this function and indicates whether
* core Mesa should keep an internal copy of the texture image.
* Drivers should call a fallback routine from texstore.c if needed.
*/
 
void (*TexSubImage1D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLsizei width,
GLenum format, GLenum type,
const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*TexSubImage2D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*TexSubImage3D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type,
const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
/* Called by glTexSubImage1/2/3D.
* Arguments:
* <target>, <level>, <xoffset>, <yoffset>, <zoffset>, <width>, <height>,
* <depth>, <format>, <type> and <pixels> are user specified.
* <packing> indicates the image packing of pixels.
* <texObj> is the target texture object.
* <texImage> is the target texture image. It will have the texture
* width, height, border and internalFormat information.
* The driver should use a fallback routine from texstore.c if needed.
*/
 
void (*CopyTexImage1D)( GLcontext *ctx, GLenum target, GLint level,
GLenum internalFormat, GLint x, GLint y,
GLsizei width, GLint border );
void (*CopyTexImage2D)( GLcontext *ctx, GLenum target, GLint level,
GLenum internalFormat, GLint x, GLint y,
GLsizei width, GLsizei height, GLint border );
/* Called by glCopyTexImage1D and glCopyTexImage2D.
* Drivers should use a fallback routine from texstore.c if needed.
*/
 
void (*CopyTexSubImage1D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset,
GLint x, GLint y, GLsizei width );
void (*CopyTexSubImage2D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint x, GLint y,
GLsizei width, GLsizei height );
void (*CopyTexSubImage3D)( GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y,
GLsizei width, GLsizei height );
/* Called by glCopyTexSubImage1/2/3D.
* Drivers should use a fallback routine from texstore.c if needed.
*/
 
GLboolean (*TestProxyTexImage)(GLcontext *ctx, GLenum target,
GLint level, GLint internalFormat,
GLenum format, GLenum type,
GLint width, GLint height,
GLint depth, GLint border);
/* Called by glTexImage[123]D when user specifies a proxy texture
* target. Return GL_TRUE if the proxy test passes, return GL_FALSE
* if the test fails.
*/
 
/***
*** Compressed texture functions:
***/
 
void (*CompressedTexImage1D)( GLcontext *ctx, GLenum target,
GLint level, GLint internalFormat,
GLsizei width, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*CompressedTexImage2D)( GLcontext *ctx, GLenum target,
GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
void (*CompressedTexImage3D)( GLcontext *ctx, GLenum target,
GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLsizei depth,
GLint border,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage );
/* Called by glCompressedTexImage1/2/3D.
* Arguments:
* <target>, <level>, <internalFormat>, <data> are user specified.
* <texObj> is the target texture object.
* <texImage> is the target texture image. It will have the texture
* width, height, depth, border and internalFormat information.
* <retainInternalCopy> is returned by this function and indicates whether
* core Mesa should keep an internal copy of the texture image.
* Return GL_TRUE if operation completed, return GL_FALSE if core Mesa
* should do the job.
*/
 
void (*CompressedTexSubImage1D)(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLsizei width,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
void (*CompressedTexSubImage2D)(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLint height,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
void (*CompressedTexSubImage3D)(GLcontext *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLint height, GLint depth,
GLenum format,
GLsizei imageSize, const GLvoid *data,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
/* Called by glCompressedTexSubImage1/2/3D.
* Arguments:
* <target>, <level>, <x/z/zoffset>, <width>, <height>, <depth>,
* <imageSize>, and <data> are user specified.
* <texObj> is the target texture object.
* <texImage> is the target texture image. It will have the texture
* width, height, depth, border and internalFormat information.
* Return GL_TRUE if operation completed, return GL_FALSE if core Mesa
* should do the job.
*/
 
/***
*** Texture object functions:
***/
 
void (*BindTexture)( GLcontext *ctx, GLenum target,
struct gl_texture_object *tObj );
/* Called by glBindTexture().
*/
 
void (*CreateTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
/* Called when a texture object is created.
*/
 
void (*DeleteTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
/* Called when a texture object is about to be deallocated. Driver
* should free anything attached to the DriverData pointers.
*/
 
GLboolean (*IsTextureResident)( GLcontext *ctx,
struct gl_texture_object *t );
/* Called by glAreTextureResident().
*/
 
void (*PrioritizeTexture)( GLcontext *ctx, struct gl_texture_object *t,
GLclampf priority );
/* Called by glPrioritizeTextures().
*/
 
void (*ActiveTexture)( GLcontext *ctx, GLuint texUnitNumber );
/* Called by glActiveTextureARB to set current texture unit.
*/
 
void (*UpdateTexturePalette)( GLcontext *ctx,
struct gl_texture_object *tObj );
/* Called when the texture's color lookup table is changed.
* If tObj is NULL then the shared texture palette ctx->Texture.Palette
* is to be updated.
*/
 
/***
*** Imaging functionality:
***/
void (*CopyColorTable)( GLcontext *ctx,
GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width );
 
void (*CopyColorSubTable)( GLcontext *ctx,
GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width );
 
void (*CopyConvolutionFilter1D)( GLcontext *ctx, GLenum target,
GLenum internalFormat,
GLint x, GLint y, GLsizei width );
 
void (*CopyConvolutionFilter2D)( GLcontext *ctx, GLenum target,
GLenum internalFormat,
GLint x, GLint y,
GLsizei width, GLsizei height );
 
 
 
/***
*** State-changing functions (drawing functions are above)
***
*** These functions are called by their corresponding OpenGL API functions.
*** They're ALSO called by the gl_PopAttrib() function!!!
*** May add more functions like these to the device driver in the future.
***/
void (*AlphaFunc)(GLcontext *ctx, GLenum func, GLfloat ref);
void (*BlendColor)(GLcontext *ctx, const GLfloat color[4]);
void (*BlendEquation)(GLcontext *ctx, GLenum mode);
void (*BlendFunc)(GLcontext *ctx, GLenum sfactor, GLenum dfactor);
void (*BlendFuncSeparate)(GLcontext *ctx,
GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorA, GLenum dfactorA);
void (*ClearColor)(GLcontext *ctx, const GLfloat color[4]);
void (*ClearDepth)(GLcontext *ctx, GLclampd d);
void (*ClearIndex)(GLcontext *ctx, GLuint index);
void (*ClearStencil)(GLcontext *ctx, GLint s);
void (*ClipPlane)(GLcontext *ctx, GLenum plane, const GLfloat *equation );
void (*ColorMask)(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
GLboolean bmask, GLboolean amask );
void (*ColorMaterial)(GLcontext *ctx, GLenum face, GLenum mode);
void (*CullFace)(GLcontext *ctx, GLenum mode);
void (*FrontFace)(GLcontext *ctx, GLenum mode);
void (*DepthFunc)(GLcontext *ctx, GLenum func);
void (*DepthMask)(GLcontext *ctx, GLboolean flag);
void (*DepthRange)(GLcontext *ctx, GLclampd nearval, GLclampd farval);
void (*Enable)(GLcontext* ctx, GLenum cap, GLboolean state);
void (*Fogfv)(GLcontext *ctx, GLenum pname, const GLfloat *params);
void (*Hint)(GLcontext *ctx, GLenum target, GLenum mode);
void (*IndexMask)(GLcontext *ctx, GLuint mask);
void (*Lightfv)(GLcontext *ctx, GLenum light,
GLenum pname, const GLfloat *params );
void (*LightModelfv)(GLcontext *ctx, GLenum pname, const GLfloat *params);
void (*LineStipple)(GLcontext *ctx, GLint factor, GLushort pattern );
void (*LineWidth)(GLcontext *ctx, GLfloat width);
void (*LogicOpcode)(GLcontext *ctx, GLenum opcode);
void (*PointParameterfv)(GLcontext *ctx, GLenum pname,
const GLfloat *params);
void (*PointSize)(GLcontext *ctx, GLfloat size);
void (*PolygonMode)(GLcontext *ctx, GLenum face, GLenum mode);
void (*PolygonOffset)(GLcontext *ctx, GLfloat factor, GLfloat units);
void (*PolygonStipple)(GLcontext *ctx, const GLubyte *mask );
void (*RenderMode)(GLcontext *ctx, GLenum mode );
void (*Scissor)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
void (*ShadeModel)(GLcontext *ctx, GLenum mode);
void (*StencilFunc)(GLcontext *ctx, GLenum func, GLint ref, GLuint mask);
void (*StencilMask)(GLcontext *ctx, GLuint mask);
void (*StencilOp)(GLcontext *ctx, GLenum fail, GLenum zfail, GLenum zpass);
void (*ActiveStencilFace)(GLcontext *ctx, GLuint face);
void (*TexGen)(GLcontext *ctx, GLenum coord, GLenum pname,
const GLfloat *params);
void (*TexEnv)(GLcontext *ctx, GLenum target, GLenum pname,
const GLfloat *param);
void (*TexParameter)(GLcontext *ctx, GLenum target,
struct gl_texture_object *texObj,
GLenum pname, const GLfloat *params);
void (*TextureMatrix)(GLcontext *ctx, GLuint unit, const GLmatrix *mat);
void (*Viewport)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
 
/***
*** Vertex array functions
***
*** Called by the corresponding OpenGL functions.
***/
void (*VertexPointer)(GLcontext *ctx, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*NormalPointer)(GLcontext *ctx, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*ColorPointer)(GLcontext *ctx, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*FogCoordPointer)(GLcontext *ctx, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*IndexPointer)(GLcontext *ctx, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*SecondaryColorPointer)(GLcontext *ctx, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*TexCoordPointer)(GLcontext *ctx, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr);
void (*EdgeFlagPointer)(GLcontext *ctx, GLsizei stride, const GLvoid *ptr);
void (*VertexAttribPointer)(GLcontext *ctx, GLuint index, GLint size,
GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
/*** State-query functions
***
*** Return GL_TRUE if query was completed, GL_FALSE otherwise.
***/
GLboolean (*GetBooleanv)(GLcontext *ctx, GLenum pname, GLboolean *result);
GLboolean (*GetDoublev)(GLcontext *ctx, GLenum pname, GLdouble *result);
GLboolean (*GetFloatv)(GLcontext *ctx, GLenum pname, GLfloat *result);
GLboolean (*GetIntegerv)(GLcontext *ctx, GLenum pname, GLint *result);
GLboolean (*GetPointerv)(GLcontext *ctx, GLenum pname, GLvoid **result);
 
/***
*** Support for multiple t&l engines
***/
 
GLuint NeedValidate;
/* Bitmask of state changes that require the current tnl module to be
* validated, using ValidateTnlModule() below.
*/
 
void (*ValidateTnlModule)( GLcontext *ctx, GLuint new_state );
/* Validate the current tnl module. This is called directly after
* UpdateState() when a state change that has occured matches the
* NeedValidate bitmask above. This ensures all computed values are
* up to date, thus allowing the driver to decide if the current tnl
* module needs to be swapped out.
*
* This must be non-NULL if a driver installs a custom tnl module and
* sets the NeedValidate bitmask, but may be NULL otherwise.
*/
 
 
#define PRIM_OUTSIDE_BEGIN_END GL_POLYGON+1
#define PRIM_INSIDE_UNKNOWN_PRIM GL_POLYGON+2
#define PRIM_UNKNOWN GL_POLYGON+3
 
GLuint CurrentExecPrimitive;
/* Set by the driver-supplied t&l engine. Set to
* PRIM_OUTSIDE_BEGIN_END when outside begin/end.
*/
 
GLuint CurrentSavePrimitive;
/* Current state of an in-progress compilation. May take on any of
* the additional values defined above.
*/
 
 
#define FLUSH_STORED_VERTICES 0x1
#define FLUSH_UPDATE_CURRENT 0x2
GLuint NeedFlush;
/* Set by the driver-supplied t&l engine whenever vertices are
* buffered between begin/end objects or ctx->Current is not uptodate.
*
* The FlushVertices() call below may be used to resolve
* these conditions.
*/
 
void (*FlushVertices)( GLcontext *ctx, GLuint flags );
/* If inside begin/end, ASSERT(0).
* Otherwise,
* if (flags & FLUSH_STORED_VERTICES) flushes any buffered vertices,
* if (flags & FLUSH_UPDATE_CURRENT) updates ctx->Current
* and ctx->Light.Material
*
* Note that the default t&l engine never clears the
* FLUSH_UPDATE_CURRENT bit, even after performing the update.
*/
 
void (*LightingSpaceChange)( GLcontext *ctx );
/* Notify driver that the special derived value _NeedEyeCoords has
* changed.
*/
 
void (*NewList)( GLcontext *ctx, GLuint list, GLenum mode );
void (*EndList)( GLcontext *ctx );
/* Let the t&l component know what is going on with display lists
* in time to make changes to dispatch tables, etc.
* Called by glNewList() and glEndList(), respectively.
*/
 
void (*BeginCallList)( GLcontext *ctx, GLuint list );
void (*EndCallList)( GLcontext *ctx );
/* Notify the t&l component before and after calling a display list.
* Called by glCallList(s), but not recursively.
*/
 
void (*MakeCurrent)( GLcontext *ctx, GLframebuffer *drawBuffer,
GLframebuffer *readBuffer );
/* Let the t&l component know when the context becomes current.
*/
 
 
void (*LockArraysEXT)( GLcontext *ctx, GLint first, GLsizei count );
void (*UnlockArraysEXT)( GLcontext *ctx );
/* Called by glLockArraysEXT() and glUnlockArraysEXT(), respectively.
*/
};
 
 
 
/*
* Transform/Clip/Lighting interface
*/
typedef struct {
void (*ArrayElement)( GLint ); /* NOTE */
void (*Color3f)( GLfloat, GLfloat, GLfloat );
void (*Color3fv)( const GLfloat * );
void (*Color3ub)( GLubyte, GLubyte, GLubyte );
void (*Color3ubv)( const GLubyte * );
void (*Color4f)( GLfloat, GLfloat, GLfloat, GLfloat );
void (*Color4fv)( const GLfloat * );
void (*Color4ub)( GLubyte, GLubyte, GLubyte, GLubyte );
void (*Color4ubv)( const GLubyte * );
void (*EdgeFlag)( GLboolean );
void (*EdgeFlagv)( const GLboolean * );
void (*EvalCoord1f)( GLfloat ); /* NOTE */
void (*EvalCoord1fv)( const GLfloat * ); /* NOTE */
void (*EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */
void (*EvalCoord2fv)( const GLfloat * ); /* NOTE */
void (*EvalPoint1)( GLint ); /* NOTE */
void (*EvalPoint2)( GLint, GLint ); /* NOTE */
void (*FogCoordfEXT)( GLfloat );
void (*FogCoordfvEXT)( const GLfloat * );
void (*Indexi)( GLint );
void (*Indexiv)( const GLint * );
void (*Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */
void (*MultiTexCoord1fARB)( GLenum, GLfloat );
void (*MultiTexCoord1fvARB)( GLenum, const GLfloat * );
void (*MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat );
void (*MultiTexCoord2fvARB)( GLenum, const GLfloat * );
void (*MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat );
void (*MultiTexCoord3fvARB)( GLenum, const GLfloat * );
void (*MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat );
void (*MultiTexCoord4fvARB)( GLenum, const GLfloat * );
void (*Normal3f)( GLfloat, GLfloat, GLfloat );
void (*Normal3fv)( const GLfloat * );
void (*SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat );
void (*SecondaryColor3fvEXT)( const GLfloat * );
void (*SecondaryColor3ubEXT)( GLubyte, GLubyte, GLubyte );
void (*SecondaryColor3ubvEXT)( const GLubyte * );
void (*TexCoord1f)( GLfloat );
void (*TexCoord1fv)( const GLfloat * );
void (*TexCoord2f)( GLfloat, GLfloat );
void (*TexCoord2fv)( const GLfloat * );
void (*TexCoord3f)( GLfloat, GLfloat, GLfloat );
void (*TexCoord3fv)( const GLfloat * );
void (*TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat );
void (*TexCoord4fv)( const GLfloat * );
void (*Vertex2f)( GLfloat, GLfloat );
void (*Vertex2fv)( const GLfloat * );
void (*Vertex3f)( GLfloat, GLfloat, GLfloat );
void (*Vertex3fv)( const GLfloat * );
void (*Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat );
void (*Vertex4fv)( const GLfloat * );
void (*CallList)( GLuint ); /* NOTE */
void (*Begin)( GLenum );
void (*End)( void );
void (*VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w );
void (*VertexAttrib4fvNV)( GLuint index, const GLfloat *v );
 
/* Drivers present a reduced set of the functions possible in
* begin/end objects. Core mesa provides translation stubs for the
* remaining functions to map down to these entrypoints.
*
* These are the initial values to be installed into dispatch by
* mesa. If the t&l driver wants to modify the dispatch table
* while installed, it must do so itself. It would be possible for
* the vertexformat to install it's own initial values for these
* functions, but this way there is an obvious list of what is
* expected of the driver.
*
* If the driver wants to hook in entrypoints other than those
* listed above, it must restore them to their original values in
* the disable() callback, below.
*/
 
void (*Rectf)( GLfloat, GLfloat, GLfloat, GLfloat );
/*
*/
 
void (*DrawArrays)( GLenum mode, GLint start, GLsizei count );
void (*DrawElements)( GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices );
void (*DrawRangeElements)( GLenum mode, GLuint start,
GLuint end, GLsizei count,
GLenum type, const GLvoid *indices );
/* These may or may not belong here. Heuristic: If an array is
* enabled, the installed vertex format should support that array and
* it's current size natively.
*/
 
void (*EvalMesh1)( GLenum mode, GLint i1, GLint i2 );
void (*EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );
/* If you don't support eval, fallback to the default vertex format
* on receiving an eval call and use the pipeline mechanism to
* provide partial t&l acceleration.
*
* Mesa will provide a set of helper functions to do eval within
* accelerated vertex formats, eventually...
*/
 
GLboolean prefer_float_colors;
/* Should core try to send colors to glColor4f or glColor4chan,
* where it has a choice?
*/
} GLvertexformat;
 
 
#endif /* DD_INCLUDED */
/shark/trunk/ports/mesa/src/vtxfmt.h
0,0 → 1,41
/* $Id: vtxfmt.h,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Keith Whitwell <keith@tungstengraphics.com>
* Gareth Hughes
*/
 
#ifndef _VTXFMT_H_
#define _VTXFMT_H_
 
extern void _mesa_init_exec_vtxfmt( GLcontext *ctx );
 
extern void _mesa_install_exec_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt );
extern void _mesa_install_save_vtxfmt( GLcontext *ctx, GLvertexformat *vfmt );
 
extern void _mesa_restore_exec_vtxfmt( GLcontext *ctx );
 
#endif
/shark/trunk/ports/mesa/src/accum.h
0,0 → 1,43
/* $Id: accum.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef ACCUM_H
#define ACCUM_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_Accum( GLenum op, GLfloat value );
 
 
extern void
_mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha );
 
 
#endif
/shark/trunk/ports/mesa/src/glthread.h
0,0 → 1,286
/* $Id: glthread.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Thread support for gl dispatch.
*
* Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
* and Christoph Poliwoda (poliwoda@volumegraphics.com)
* Revised by Keith Whitwell
* Adapted for new gl dispatcher by Brian Paul
*
*
*
* DOCUMENTATION
*
* This thread module exports the following types:
* _glthread_TSD Thread-specific data area
* _glthread_Thread Thread datatype
* _glthread_Mutex Mutual exclusion lock
*
* Macros:
* _glthread_DECLARE_STATIC_MUTEX(name) Declare a non-local mutex
* _glthread_INIT_MUTEX(name) Initialize a mutex
* _glthread_LOCK_MUTEX(name) Lock a mutex
* _glthread_UNLOCK_MUTEX(name) Unlock a mutex
*
* Functions:
* _glthread_GetID(v) Get integer thread ID
* _glthread_InitTSD() Initialize thread-specific data
* _glthread_GetTSD() Get thread-specific data
* _glthread_SetTSD() Set thread-specific data
*
*/
 
/*
* If this file is accidentally included by a non-threaded build,
* it should not cause the build to fail, or otherwise cause problems.
* In general, it should only be included when needed however.
*/
 
#ifndef GLTHREAD_H
#define GLTHREAD_H
 
 
#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(XTHREADS)
#define THREADS
#endif
 
#ifdef VMS
#include <GL/vms_x_fix.h>
#endif
 
/*
* POSIX threads. This should be your choice in the Unix world
* whenever possible. When building with POSIX threads, be sure
* to enable any compiler flags which will cause the MT-safe
* libc (if one exists) to be used when linking, as well as any
* header macros for MT-safe errno, etc. For Solaris, this is the -mt
* compiler flag. On Solaris with gcc, use -D_REENTRANT to enable
* proper compiling for MT-safe libc etc.
*/
#if defined(PTHREADS)
#include <pthread.h> /* POSIX threads headers */
 
typedef struct {
pthread_key_t key;
int initMagic;
} _glthread_TSD;
 
typedef pthread_t _glthread_Thread;
 
typedef pthread_mutex_t _glthread_Mutex;
 
#define _glthread_DECLARE_STATIC_MUTEX(name) \
static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
 
#define _glthread_INIT_MUTEX(name) \
pthread_mutex_init(&(name), NULL)
 
#define _glthread_LOCK_MUTEX(name) \
(void) pthread_mutex_lock(&(name))
 
#define _glthread_UNLOCK_MUTEX(name) \
(void) pthread_mutex_unlock(&(name))
 
#endif /* PTHREADS */
 
 
 
 
/*
* Solaris threads. Use only up to Solaris 2.4.
* Solaris 2.5 and higher provide POSIX threads.
* Be sure to compile with -mt on the Solaris compilers, or
* use -D_REENTRANT if using gcc.
*/
#ifdef SOLARIS_THREADS
#include <thread.h>
 
typedef struct {
thread_key_t key;
mutex_t keylock;
int initMagic;
} _glthread_TSD;
 
typedef thread_t _glthread_Thread;
 
typedef mutex_t _glthread_Mutex;
 
/* XXX need to really implement mutex-related macros */
#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = 0
#define _glthread_INIT_MUTEX(name) (void) name
#define _glthread_LOCK_MUTEX(name) (void) name
#define _glthread_UNLOCK_MUTEX(name) (void) name
 
#endif /* SOLARIS_THREADS */
 
 
 
 
/*
* Windows threads. Should work with Windows NT and 95.
* IMPORTANT: Link with multithreaded runtime library when THREADS are
* used!
*/
#ifdef WIN32_THREADS
#include <windows.h>
 
typedef struct {
DWORD key;
int initMagic;
} _glthread_TSD;
 
typedef HANDLE _glthread_Thread;
 
typedef CRITICAL_SECTION _glthread_Mutex;
 
/* XXX need to really implement mutex-related macros */
#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = 0
#define _glthread_INIT_MUTEX(name) (void) name
#define _glthread_LOCK_MUTEX(name) (void) name
#define _glthread_UNLOCK_MUTEX(name) (void) name
 
#endif /* WIN32_THREADS */
 
 
 
 
/*
* XFree86 has its own thread wrapper, Xthreads.h
* We wrap it again for GL.
*/
#ifdef XTHREADS
#include "Xthreads.h"
 
typedef struct {
xthread_key_t key;
int initMagic;
} _glthread_TSD;
 
typedef xthread_t _glthread_Thread;
 
typedef xmutex_rec _glthread_Mutex;
 
#ifdef XMUTEX_INITIALIZER
#define _glthread_DECLARE_STATIC_MUTEX(name) \
static _glthread_Mutex name = XMUTEX_INITIALIZER
#else
#define _glthread_DECLARE_STATIC_MUTEX(name) \
static _glthread_Mutex name
#endif
 
#define _glthread_INIT_MUTEX(name) \
xmutex_init(&(name))
 
#define _glthread_LOCK_MUTEX(name) \
(void) xmutex_lock(&(name))
 
#define _glthread_UNLOCK_MUTEX(name) \
(void) xmutex_unlock(&(name))
 
#endif /* XTHREADS */
 
 
 
/*
* BeOS threads. R5.x required.
*/
#ifdef BEOS_THREADS
#include <kernel/OS.h>
#include <support/TLS.h>
 
typedef struct {
int32 key;
int initMagic;
} _glthread_TSD;
 
typedef thread_id _glthread_Thread;
 
/* Use Benaphore, aka speeder semaphore */
typedef struct {
int32 lock;
sem_id sem;
} benaphore;
typedef benaphore _glthread_Mutex;
 
#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = { 0,
create_sem(0, #name"_benaphore") }
#define _glthread_INIT_MUTEX(name) name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
#define _glthread_LOCK_MUTEX(name) if((atomic_add(&(name.lock), 1)) >= 1) acquire_sem(name.sem)
#define _glthread_UNLOCK_MUTEX(name) if((atomic_add(&(name.lock), -1)) > 1) release_sem(name.sem)
 
#endif /* BEOS_THREADS */
 
 
 
#ifndef THREADS
 
/*
* THREADS not defined
*/
 
typedef GLuint _glthread_TSD;
 
typedef GLuint _glthread_Thread;
 
typedef GLuint _glthread_Mutex;
 
#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = 0
 
#define _glthread_INIT_MUTEX(name) (void) name
 
#define _glthread_LOCK_MUTEX(name) (void) name
 
#define _glthread_UNLOCK_MUTEX(name) (void) name
 
#endif /* THREADS */
 
 
 
/*
* Platform independent thread specific data API.
*/
 
extern unsigned long
_glthread_GetID(void);
 
 
extern void
_glthread_InitTSD(_glthread_TSD *);
 
 
extern void *
_glthread_GetTSD(_glthread_TSD *);
 
 
extern void
_glthread_SetTSD(_glthread_TSD *, void *);
 
 
 
#endif /* THREADS_H */
/shark/trunk/ports/mesa/src/extensions.c
0,0 → 1,468
/* $Id: extensions.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "context.h"
#include "extensions.h"
#include "simple_list.h"
#include "mtypes.h"
 
 
#define MAX_EXT_NAMELEN 80
 
struct extension {
struct extension *next, *prev;
GLint enabled;
GLboolean *flag; /* optional flag stored elsewhere */
char name[MAX_EXT_NAMELEN+1];
void (*notify)( GLcontext *, GLboolean );
};
 
#define F(x) (int)&(((struct gl_extensions *)0)->x)
#define ON GL_TRUE
#define OFF GL_FALSE
 
static struct {
GLboolean enabled;
const char *name;
int flag_offset;
} default_extensions[] = {
{ OFF, "GL_ARB_depth_texture", F(ARB_depth_texture) },
{ OFF, "GL_ARB_imaging", F(ARB_imaging) },
{ OFF, "GL_ARB_multisample", F(ARB_multisample) },
{ OFF, "GL_ARB_multitexture", F(ARB_multitexture) },
{ OFF, "GL_ARB_point_parameters", F(EXT_point_parameters) },
{ OFF, "GL_ARB_shadow", F(ARB_shadow) },
{ OFF, "GL_ARB_shadow_ambient", F(SGIX_shadow_ambient) },
{ OFF, "GL_ARB_texture_border_clamp", F(ARB_texture_border_clamp) },
{ OFF, "GL_ARB_texture_compression", F(ARB_texture_compression) },
{ OFF, "GL_ARB_texture_cube_map", F(ARB_texture_cube_map) },
{ OFF, "GL_ARB_texture_env_add", F(EXT_texture_env_add) },
{ OFF, "GL_ARB_texture_env_combine", F(ARB_texture_env_combine) },
{ OFF, "GL_ARB_texture_env_crossbar", F(ARB_texture_env_crossbar) },
{ OFF, "GL_ARB_texture_env_dot3", F(ARB_texture_env_dot3) },
{ OFF, "GL_ARB_texture_mirrored_repeat", F(ARB_texture_mirrored_repeat)},
{ ON, "GL_ARB_transpose_matrix", 0 },
{ ON, "GL_ARB_window_pos", F(ARB_window_pos) },
{ OFF, "GL_ATI_texture_mirror_once", F(ATI_texture_mirror_once)},
{ ON, "GL_EXT_abgr", 0 },
{ ON, "GL_EXT_bgra", 0 },
{ OFF, "GL_EXT_blend_color", F(EXT_blend_color) },
{ OFF, "GL_EXT_blend_func_separate", F(EXT_blend_func_separate) },
{ OFF, "GL_EXT_blend_logic_op", F(EXT_blend_logic_op) },
{ OFF, "GL_EXT_blend_minmax", F(EXT_blend_minmax) },
{ OFF, "GL_EXT_blend_subtract", F(EXT_blend_subtract) },
{ ON, "GL_EXT_clip_volume_hint", F(EXT_clip_volume_hint) },
{ OFF, "GL_EXT_convolution", F(EXT_convolution) },
{ ON, "GL_EXT_compiled_vertex_array", F(EXT_compiled_vertex_array) },
{ OFF, "GL_EXT_fog_coord", F(EXT_fog_coord) },
{ OFF, "GL_EXT_histogram", F(EXT_histogram) },
{ OFF, "GL_EXT_multi_draw_arrays", F(EXT_multi_draw_arrays) },
{ ON, "GL_EXT_packed_pixels", F(EXT_packed_pixels) },
{ OFF, "GL_EXT_paletted_texture", F(EXT_paletted_texture) },
{ OFF, "GL_EXT_point_parameters", F(EXT_point_parameters) },
{ ON, "GL_EXT_polygon_offset", F(EXT_polygon_offset) },
{ ON, "GL_EXT_rescale_normal", F(EXT_rescale_normal) },
{ OFF, "GL_EXT_secondary_color", F(EXT_secondary_color) },
{ OFF, "GL_EXT_shadow_funcs", F(EXT_shadow_funcs) },
{ OFF, "GL_EXT_shared_texture_palette", F(EXT_shared_texture_palette) },
{ OFF, "GL_EXT_stencil_wrap", F(EXT_stencil_wrap) },
{ OFF, "GL_EXT_stencil_two_side", F(EXT_stencil_two_side) },
{ ON, "GL_EXT_texture3D", F(EXT_texture3D) },
{ OFF, "GL_EXT_texture_compression_s3tc", F(EXT_texture_compression_s3tc) },
{ OFF, "GL_EXT_texture_edge_clamp", F(SGIS_texture_edge_clamp) },
{ OFF, "GL_EXT_texture_env_add", F(EXT_texture_env_add) },
{ OFF, "GL_EXT_texture_env_combine", F(EXT_texture_env_combine) },
{ OFF, "GL_EXT_texture_env_dot3", F(EXT_texture_env_dot3) },
{ OFF, "GL_EXT_texture_filter_anisotropic", F(EXT_texture_filter_anisotropic) },
{ ON, "GL_EXT_texture_object", F(EXT_texture_object) },
{ OFF, "GL_EXT_texture_lod_bias", F(EXT_texture_lod_bias) },
{ ON, "GL_EXT_vertex_array", 0 },
{ OFF, "GL_EXT_vertex_array_set", F(EXT_vertex_array_set) },
{ OFF, "GL_HP_occlusion_test", F(HP_occlusion_test) },
{ ON, "GL_IBM_rasterpos_clip", F(IBM_rasterpos_clip) },
{ OFF, "GL_IBM_texture_mirrored_repeat", F(ARB_texture_mirrored_repeat)},
{ OFF, "GL_INGR_blend_func_separate", F(INGR_blend_func_separate) },
{ OFF, "GL_MESA_pack_invert", F(MESA_pack_invert) },
{ OFF, "GL_MESA_packed_depth_stencil", 0 },
{ OFF, "GL_MESA_resize_buffers", F(MESA_resize_buffers) },
{ OFF, "GL_MESA_ycbcr_texture", F(MESA_ycbcr_texture) },
{ ON, "GL_MESA_window_pos", F(MESA_window_pos) },
{ OFF, "GL_NV_blend_square", F(NV_blend_square) },
{ OFF, "GL_NV_point_sprite", F(NV_point_sprite) },
{ OFF, "GL_NV_texture_rectangle", F(NV_texture_rectangle) },
{ ON, "GL_NV_texgen_reflection", F(NV_texgen_reflection) },
{ OFF, "GL_NV_vertex_program", F(NV_vertex_program) },
{ OFF, "GL_NV_vertex_program1_1", F(NV_vertex_program1_1) },
{ OFF, "GL_SGI_color_matrix", F(SGI_color_matrix) },
{ OFF, "GL_SGI_color_table", F(SGI_color_table) },
{ OFF, "GL_SGIS_generate_mipmap", F(SGIS_generate_mipmap) },
{ OFF, "GL_SGIS_pixel_texture", F(SGIS_pixel_texture) },
{ OFF, "GL_SGIS_texture_border_clamp", F(ARB_texture_border_clamp) },
{ OFF, "GL_SGIS_texture_edge_clamp", F(SGIS_texture_edge_clamp) },
{ OFF, "GL_SGIX_depth_texture", F(SGIX_depth_texture) },
{ OFF, "GL_SGIX_pixel_texture", F(SGIX_pixel_texture) },
{ OFF, "GL_SGIX_shadow", F(SGIX_shadow) },
{ OFF, "GL_SGIX_shadow_ambient", F(SGIX_shadow_ambient) },
{ OFF, "GL_3DFX_texture_compression_FXT1", F(TDFX_texture_compression_FXT1) },
{ OFF, "GL_APPLE_client_storage", F(APPLE_client_storage) }
};
 
 
 
 
/*
* Enable all extensions suitable for a software-only renderer.
* This is a convenience function used by the XMesa, OSMesa, GGI drivers, etc.
*/
void
_mesa_enable_sw_extensions(GLcontext *ctx)
{
const char *extensions[] = {
"GL_ARB_depth_texture",
"GL_ARB_imaging",
"GL_ARB_multitexture",
"GL_ARB_point_parameters",
"GL_ARB_shadow",
"GL_ARB_shadow_ambient",
"GL_ARB_texture_border_clamp",
"GL_ARB_texture_cube_map",
"GL_ARB_texture_env_add",
"GL_ARB_texture_env_combine",
"GL_ARB_texture_env_crossbar",
"GL_ARB_texture_env_dot3",
"GL_ARB_texture_mirrored_repeat",
"GL_ATI_texture_mirror_once",
"GL_EXT_blend_color",
"GL_EXT_blend_func_separate",
"GL_EXT_blend_logic_op",
"GL_EXT_blend_minmax",
"GL_EXT_blend_subtract",
"GL_EXT_convolution",
"GL_EXT_fog_coord",
"GL_EXT_histogram",
"GL_EXT_paletted_texture",
"GL_EXT_point_parameters",
"GL_EXT_shadow_funcs",
"GL_EXT_secondary_color",
"GL_EXT_shared_texture_palette",
"GL_EXT_stencil_wrap",
"GL_EXT_stencil_two_side",
"GL_EXT_texture_edge_clamp",
"GL_EXT_texture_env_add",
"GL_EXT_texture_env_combine",
"GL_EXT_texture_env_dot3",
"GL_EXT_texture_lod_bias",
"GL_HP_occlusion_test",
"GL_IBM_texture_mirrored_repeat",
"GL_INGR_blend_func_separate",
"GL_MESA_pack_invert",
"GL_MESA_resize_buffers",
"GL_MESA_ycbcr_texture",
"GL_NV_blend_square",
"GL_NV_point_sprite",
"GL_NV_texture_rectangle",
"GL_NV_texgen_reflection",
#if FEATURE_NV_vertex_program
"GL_NV_vertex_program",
"GL_NV_vertex_program1_1",
#endif
"GL_SGI_color_matrix",
"GL_SGI_color_table",
"GL_SGIS_generate_mipmap",
"GL_SGIS_pixel_texture",
"GL_SGIS_texture_edge_clamp",
"GL_SGIS_texture_border_clamp",
"GL_SGIX_depth_texture",
"GL_SGIX_pixel_texture",
"GL_SGIX_shadow",
"GL_SGIX_shadow_ambient",
NULL
};
GLuint i;
 
for (i = 0; extensions[i]; i++) {
_mesa_enable_extension(ctx, extensions[i]);
}
}
 
 
/*
* Enable GL_ARB_imaging and all the EXT extensions that are subsets of it.
*/
void
_mesa_enable_imaging_extensions(GLcontext *ctx)
{
const char *extensions[] = {
"GL_ARB_imaging",
"GL_EXT_blend_color",
"GL_EXT_blend_minmax",
"GL_EXT_blend_subtract",
"GL_EXT_convolution",
"GL_EXT_histogram",
"GL_SGI_color_matrix",
"GL_SGI_color_table",
NULL
};
GLuint i;
 
for (i = 0; extensions[i]; i++) {
_mesa_enable_extension(ctx, extensions[i]);
}
}
 
 
 
/*
* Enable all OpenGL 1.3 features and extensions.
*/
void
_mesa_enable_1_3_extensions(GLcontext *ctx)
{
const char *extensions[] = {
"GL_ARB_multisample",
"GL_ARB_multitexture",
"GL_ARB_texture_border_clamp",
"GL_ARB_texture_compression",
"GL_ARB_texture_cube_map",
"GL_ARB_texture_env_add",
"GL_ARB_texture_env_combine",
"GL_ARB_texture_env_dot3",
"GL_ARB_transpose_matrix",
NULL
};
GLuint i;
 
for (i = 0; extensions[i]; i++) {
_mesa_enable_extension(ctx, extensions[i]);
}
}
 
 
 
/*
* Enable all OpenGL 1.4 features and extensions.
*/
void
_mesa_enable_1_4_extensions(GLcontext *ctx)
{
const char *extensions[] = {
"GL_ARB_depth_texture",
"GL_ARB_point_parameters",
"GL_ARB_shadow",
"GL_ARB_texture_env_crossbar",
"GL_ARB_texture_mirrored_repeat",
"GL_ARB_window_pos",
"GL_EXT_blend_color",
"GL_EXT_blend_func_separate",
"GL_EXT_blend_logic_op",
"GL_EXT_blend_minmax",
"GL_EXT_blend_subtract",
"GL_EXT_fog_coord",
"GL_EXT_multi_draw_arrays",
"GL_EXT_secondary_color",
"GL_EXT_stencil_wrap",
"GL_SGIS_generate_mipmap",
NULL
};
GLuint i;
 
for (i = 0; extensions[i]; i++) {
_mesa_enable_extension(ctx, extensions[i]);
}
}
 
 
 
/*
* Add a new extenstion. This would be called from a Mesa driver.
*/
void
_mesa_add_extension( GLcontext *ctx,
GLboolean enabled,
const char *name,
GLboolean *flag_ptr )
{
/* We should never try to add an extension after
* _mesa_extensions_get_string() has been called!
*/
assert(ctx->Extensions.ext_string == 0);
 
{
struct extension *t = MALLOC_STRUCT(extension);
t->enabled = enabled;
_mesa_strncpy(t->name, name, MAX_EXT_NAMELEN);
t->name[MAX_EXT_NAMELEN] = 0;
t->flag = flag_ptr;
if (t->flag)
*t->flag = enabled;
insert_at_tail( ctx->Extensions.ext_list, t );
}
}
 
 
/*
* Either enable or disable the named extension.
*/
static void
set_extension( GLcontext *ctx, const char *name, GLint state )
{
/* XXX we should assert that ext_string is null. We should never be
* enabling/disabling extensions after _mesa_extensions_get_string()
* has been called!
*/
struct extension *i;
foreach( i, ctx->Extensions.ext_list )
if (_mesa_strncmp(i->name, name, MAX_EXT_NAMELEN) == 0)
break;
 
if (i == ctx->Extensions.ext_list) {
/* this is an error. Drivers should never try to enable/disable
* an extension which is unknown to Mesa or wasn't added by calling
* _mesa_add_extension().
*/
return;
}
 
if (i->flag)
*(i->flag) = state;
i->enabled = state;
}
 
 
 
void
_mesa_enable_extension( GLcontext *ctx, const char *name )
{
if (ctx->Extensions.ext_string == 0)
set_extension( ctx, name, 1 );
}
 
 
void
_mesa_disable_extension( GLcontext *ctx, const char *name )
{
if (ctx->Extensions.ext_string == 0)
set_extension( ctx, name, 0 );
}
 
 
/*
* Test if the named extension is enabled in this context.
*/
GLboolean
_mesa_extension_is_enabled( GLcontext *ctx, const char *name)
{
struct extension *i;
foreach( i, ctx->Extensions.ext_list )
if (_mesa_strncmp(i->name, name, MAX_EXT_NAMELEN) == 0) {
if (i->enabled)
return GL_TRUE;
else
return GL_FALSE;
}
 
return GL_FALSE;
}
 
 
void
_mesa_extensions_dtr( GLcontext *ctx )
{
struct extension *i, *nexti;
 
if (ctx->Extensions.ext_string) {
FREE( ctx->Extensions.ext_string );
ctx->Extensions.ext_string = 0;
}
 
if (ctx->Extensions.ext_list) {
foreach_s( i, nexti, ctx->Extensions.ext_list ) {
remove_from_list( i );
FREE( i );
}
 
FREE(ctx->Extensions.ext_list);
ctx->Extensions.ext_list = 0;
}
}
 
 
void
_mesa_extensions_ctr( GLcontext *ctx )
{
GLuint i;
GLboolean *base = (GLboolean *)&ctx->Extensions;
 
ctx->Extensions.ext_string = NULL;
ctx->Extensions.ext_list = MALLOC_STRUCT(extension);
make_empty_list( ctx->Extensions.ext_list );
 
for (i = 0 ; i < Elements(default_extensions) ; i++) {
GLboolean *ptr = NULL;
 
if (default_extensions[i].flag_offset)
ptr = base + default_extensions[i].flag_offset;
 
(void) _mesa_add_extension( ctx,
default_extensions[i].enabled,
default_extensions[i].name,
ptr);
}
}
 
 
const char *
_mesa_extensions_get_string( GLcontext *ctx )
{
if (ctx->Extensions.ext_string == 0)
{
struct extension *i;
char *str;
GLuint len = 0;
foreach (i, ctx->Extensions.ext_list)
if (i->enabled)
len += _mesa_strlen(i->name) + 1;
 
if (len == 0)
return "";
 
str = (char *) _mesa_malloc(len * sizeof(char));
ctx->Extensions.ext_string = str;
 
foreach (i, ctx->Extensions.ext_list)
if (i->enabled) {
_mesa_strcpy(str, i->name);
str += _mesa_strlen(str);
*str++ = ' ';
}
 
*(str-1) = 0;
}
 
return ctx->Extensions.ext_string;
}
/shark/trunk/ports/mesa/src/stencil.c
0,0 → 1,214
/* $Id: stencil.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "context.h"
#include "depth.h"
#include "macros.h"
#include "stencil.h"
#include "mtypes.h"
#include "enable.h"
 
 
void
_mesa_ClearStencil( GLint s )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Stencil.Clear == (GLstencil) s)
return;
 
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.Clear = (GLstencil) s;
 
if (ctx->Driver.ClearStencil) {
(*ctx->Driver.ClearStencil)( ctx, s );
}
}
 
 
 
void
_mesa_StencilFunc( GLenum func, GLint ref, GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
const GLint face = ctx->Stencil.ActiveFace;
GLint maxref;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (func) {
case GL_NEVER:
case GL_LESS:
case GL_LEQUAL:
case GL_GREATER:
case GL_GEQUAL:
case GL_EQUAL:
case GL_NOTEQUAL:
case GL_ALWAYS:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glStencilFunc" );
return;
}
 
maxref = (1 << STENCIL_BITS) - 1;
ref = (GLstencil) CLAMP( ref, 0, maxref );
 
if (ctx->Stencil.Function[face] == func &&
ctx->Stencil.ValueMask[face] == (GLstencil) mask &&
ctx->Stencil.Ref[face] == ref)
return;
 
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.Function[face] = func;
ctx->Stencil.Ref[face] = ref;
ctx->Stencil.ValueMask[face] = (GLstencil) mask;
 
if (ctx->Driver.StencilFunc) {
(*ctx->Driver.StencilFunc)( ctx, func, ref, mask );
}
}
 
 
 
void
_mesa_StencilMask( GLuint mask )
{
GET_CURRENT_CONTEXT(ctx);
const GLint face = ctx->Stencil.ActiveFace;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Stencil.WriteMask[face] == (GLstencil) mask)
return;
 
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.WriteMask[face] = (GLstencil) mask;
 
if (ctx->Driver.StencilMask) {
(*ctx->Driver.StencilMask)( ctx, mask );
}
}
 
 
 
void
_mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
{
GET_CURRENT_CONTEXT(ctx);
const GLint face = ctx->Stencil.ActiveFace;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (fail) {
case GL_KEEP:
case GL_ZERO:
case GL_REPLACE:
case GL_INCR:
case GL_DECR:
case GL_INVERT:
break;
case GL_INCR_WRAP_EXT:
case GL_DECR_WRAP_EXT:
if (!ctx->Extensions.EXT_stencil_wrap) {
break;
}
/* FALL-THROUGH */
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp");
return;
}
switch (zfail) {
case GL_KEEP:
case GL_ZERO:
case GL_REPLACE:
case GL_INCR:
case GL_DECR:
case GL_INVERT:
break;
case GL_INCR_WRAP_EXT:
case GL_DECR_WRAP_EXT:
if (ctx->Extensions.EXT_stencil_wrap) {
break;
}
/* FALL-THROUGH */
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp");
return;
}
switch (zpass) {
case GL_KEEP:
case GL_ZERO:
case GL_REPLACE:
case GL_INCR:
case GL_DECR:
case GL_INVERT:
break;
case GL_INCR_WRAP_EXT:
case GL_DECR_WRAP_EXT:
if (ctx->Extensions.EXT_stencil_wrap) {
break;
}
/* FALL-THROUGH */
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp");
return;
}
 
if (ctx->Stencil.ZFailFunc[face] == zfail &&
ctx->Stencil.ZPassFunc[face] == zpass &&
ctx->Stencil.FailFunc[face] == fail)
return;
 
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.ZFailFunc[face] = zfail;
ctx->Stencil.ZPassFunc[face] = zpass;
ctx->Stencil.FailFunc[face] = fail;
 
if (ctx->Driver.StencilOp) {
(*ctx->Driver.StencilOp)(ctx, fail, zfail, zpass);
}
}
 
 
/* GL_EXT_stencil_two_side */
void
_mesa_ActiveStencilFaceEXT(GLenum face)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (face == GL_FRONT || face == GL_BACK) {
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.ActiveFace = (face == GL_FRONT) ? 0 : 1;
}
 
if (ctx->Driver.ActiveStencilFace) {
(*ctx->Driver.ActiveStencilFace)( ctx, (GLuint) ctx->Stencil.ActiveFace );
}
}
 
/shark/trunk/ports/mesa/src/colormac.h
0,0 → 1,136
/* $Id: colormac.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
 
/*
* Color-related macros
*/
 
#ifndef COLORMAC_H
#define COLORMAC_H
 
 
#include "glheader.h"
#include "config.h"
#include "macros.h"
#include "mmath.h"
/* Do not reference mtypes.h from this file.
*/
 
 
#if CHAN_BITS == 8
 
#define BYTE_TO_CHAN(b) ((b) < 0 ? 0 : (GLchan) (b))
#define UBYTE_TO_CHAN(b) (b)
#define SHORT_TO_CHAN(s) ((s) < 0 ? 0 : (GLchan) ((s) >> 7))
#define USHORT_TO_CHAN(s) ((GLchan) ((s) >> 8))
#define INT_TO_CHAN(i) ((i) < 0 ? 0 : (GLchan) ((i) >> 23))
#define UINT_TO_CHAN(i) ((GLchan) ((i) >> 24))
 
#define CHAN_TO_UBYTE(c) (c)
#define CHAN_TO_FLOAT(c) UBYTE_TO_FLOAT(c)
 
#define CLAMPED_FLOAT_TO_CHAN(c, f) CLAMPED_FLOAT_TO_UBYTE(c, f)
#define UNCLAMPED_FLOAT_TO_CHAN(c, f) UNCLAMPED_FLOAT_TO_UBYTE(c, f)
 
#define COPY_CHAN4(DST, SRC) COPY_4UBV(DST, SRC)
 
#define CHAN_PRODUCT(a, b) ((GLubyte) (((GLint)(a) * ((GLint)(b) + 1)) >> 8))
 
 
#elif CHAN_BITS == 16
 
#define BYTE_TO_CHAN(b) ((b) < 0 ? 0 : (((GLchan) (b)) * 516))
#define UBYTE_TO_CHAN(b) ((((GLchan) (b)) << 8) | ((GLchan) (b)))
#define SHORT_TO_CHAN(s) ((s) < 0 ? 0 : (GLchan) (s))
#define USHORT_TO_CHAN(s) (s)
#define INT_TO_CHAN(i) ((i) < 0 ? 0 : (GLchan) ((i) >> 15))
#define UINT_TO_CHAN(i) ((GLchan) ((i) >> 16))
 
#define CHAN_TO_UBYTE(c) ((c) >> 8)
#define CHAN_TO_FLOAT(c) ((GLfloat) ((c) * (1.0 / CHAN_MAXF)))
 
#define CLAMPED_FLOAT_TO_CHAN(c, f) CLAMPED_FLOAT_TO_USHORT(c, f)
#define UNCLAMPED_FLOAT_TO_CHAN(c, f) UNCLAMPED_FLOAT_TO_USHORT(c, f)
 
#define COPY_CHAN4(DST, SRC) COPY_4V(DST, SRC)
 
#define CHAN_PRODUCT(a, b) ((GLchan) ((((GLuint) (a)) * ((GLuint) (b))) / 65535))
 
 
#elif CHAN_BITS == 32
 
/* XXX floating-point color channels not fully thought-out */
#define BYTE_TO_CHAN(b) ((GLfloat) ((b) * (1.0F / 127.0F)))
#define UBYTE_TO_CHAN(b) ((GLfloat) ((b) * (1.0F / 255.0F)))
#define SHORT_TO_CHAN(s) ((GLfloat) ((s) * (1.0F / 32767.0F)))
#define USHORT_TO_CHAN(s) ((GLfloat) ((s) * (1.0F / 65535.0F)))
#define INT_TO_CHAN(i) ((GLfloat) ((i) * (1.0F / 2147483647.0F)))
#define UINT_TO_CHAN(i) ((GLfloat) ((i) * (1.0F / 4294967295.0F)))
 
#define CHAN_TO_UBYTE(c) FLOAT_TO_UBYTE(c)
#define CHAN_TO_FLOAT(c) (c)
 
#define CLAMPED_FLOAT_TO_CHAN(c, f) c = (f)
#define UNCLAMPED_FLOAT_TO_CHAN(c, f) c = (f)
 
#define COPY_CHAN4(DST, SRC) COPY_4V(DST, SRC)
 
#define CHAN_PRODUCT(a, b) ((a) * (b))
 
#else
 
#error unexpected CHAN_BITS size
 
#endif
 
 
 
/*
* Convert 3 channels at once.
*/
#define UNCLAMPED_FLOAT_TO_RGB_CHAN(dst, f) \
do { \
UNCLAMPED_FLOAT_TO_CHAN(dst[0], f[0]); \
UNCLAMPED_FLOAT_TO_CHAN(dst[1], f[1]); \
UNCLAMPED_FLOAT_TO_CHAN(dst[2], f[2]); \
} while (0)
 
 
/*
* Convert 4 channels at once.
*/
#define UNCLAMPED_FLOAT_TO_RGBA_CHAN(dst, f) \
do { \
UNCLAMPED_FLOAT_TO_CHAN(dst[0], f[0]); \
UNCLAMPED_FLOAT_TO_CHAN(dst[1], f[1]); \
UNCLAMPED_FLOAT_TO_CHAN(dst[2], f[2]); \
UNCLAMPED_FLOAT_TO_CHAN(dst[3], f[3]); \
} while (0)
 
 
#endif /* COLORMAC_H */
/shark/trunk/ports/mesa/src/extensions.h
0,0 → 1,57
/* $Id: extensions.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef _EXTENSIONS_H_
#define _EXTENSIONS_H_
 
#include "mtypes.h"
 
 
extern void _mesa_enable_sw_extensions(GLcontext *ctx);
 
extern void _mesa_enable_imaging_extensions(GLcontext *ctx);
 
extern void _mesa_enable_1_3_extensions(GLcontext *ctx);
 
extern void _mesa_enable_1_4_extensions(GLcontext *ctx);
 
extern void _mesa_add_extension( GLcontext *ctx, GLboolean enabled,
const char *name, GLboolean *flag_ptr );
 
extern void _mesa_enable_extension( GLcontext *ctx, const char *name );
 
extern void _mesa_disable_extension( GLcontext *ctx, const char *name );
 
extern GLboolean _mesa_extension_is_enabled( GLcontext *ctx, const char *name);
 
extern void _mesa_extensions_dtr( GLcontext *ctx );
 
extern void _mesa_extensions_ctr( GLcontext *ctx );
 
extern const char *_mesa_extensions_get_string( GLcontext *ctx );
 
#endif
/shark/trunk/ports/mesa/src/stencil.h
0,0 → 1,55
/* $Id: stencil.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef STENCIL_H
#define STENCIL_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_ClearStencil( GLint s );
 
 
extern void
_mesa_StencilFunc( GLenum func, GLint ref, GLuint mask );
 
 
extern void
_mesa_StencilMask( GLuint mask );
 
 
extern void
_mesa_StencilOp( GLenum fail, GLenum zfail, GLenum zpass );
 
 
extern void
_mesa_ActiveStencilFaceEXT(GLenum face);
 
 
#endif
/shark/trunk/ports/mesa/src/lines.c
0,0 → 1,88
/* $Id: lines.c,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "context.h"
#include "depth.h"
#include "lines.h"
#include "macros.h"
#include "mmath.h"
#include "texstate.h"
#include "mtypes.h"
 
 
void
_mesa_LineWidth( GLfloat width )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (width<=0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLineWidth" );
return;
}
 
if (ctx->Line.Width == width)
return;
 
FLUSH_VERTICES(ctx, _NEW_LINE);
ctx->Line.Width = width;
ctx->Line._Width = CLAMP(width,
ctx->Const.MinLineWidth,
ctx->Const.MaxLineWidth);
 
 
if (width != 1.0)
ctx->_TriangleCaps |= DD_LINE_WIDTH;
else
ctx->_TriangleCaps &= ~DD_LINE_WIDTH;
 
if (ctx->Driver.LineWidth)
(*ctx->Driver.LineWidth)(ctx, width);
}
 
 
 
void
_mesa_LineStipple( GLint factor, GLushort pattern )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
factor = CLAMP( factor, 1, 256 );
 
if (ctx->Line.StippleFactor == factor &&
ctx->Line.StipplePattern == pattern)
return;
 
FLUSH_VERTICES(ctx, _NEW_LINE);
ctx->Line.StippleFactor = factor;
ctx->Line.StipplePattern = pattern;
 
if (ctx->Driver.LineStipple)
ctx->Driver.LineStipple( ctx, factor, pattern );
}
/shark/trunk/ports/mesa/src/lines.h
0,0 → 1,42
/* $Id: lines.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef LINES_H
#define LINES_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_LineWidth( GLfloat width );
 
extern void
_mesa_LineStipple( GLint factor, GLushort pattern );
 
 
#endif
/shark/trunk/ports/mesa/src/glheader.h
0,0 → 1,296
/* $Id: glheader.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef GLHEADER_H
#define GLHEADER_H
 
 
/*
* This is the top-most include file of the Mesa sources.
* It includes gl.h and all system headers which are needed.
* Other Mesa source files should _not_ directly include any system
* headers. This allows Mesa to be integrated into XFree86 and
* allows system-dependent hacks/work-arounds to be collected in one place.
*
* If you touch this file, everything gets recompiled!
*
* This file should be included before any other header in the .c files.
*
* Put compiler/OS/assembly pragmas and macros here to avoid
* cluttering other source files.
*/
 
 
 
#if defined(XFree86LOADER) && defined(IN_MODULE)
#include "xf86_ansic.h"
#else
#include <assert.h>
#include <ctype.h>
/* If we can use Compaq's Fast Math Library on Alpha */
#if defined(__alpha__) && defined(CCPML)
#include <cpml.h>
#else
#include <math.h>
#endif
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#if defined(__linux__) && defined(__i386__)
#include <fpu_control.h>
#endif
#endif
#include <float.h>
#include <stdarg.h>
 
 
#ifdef HAVE_CONFIG_H
#include "conf.h"
#endif
 
 
#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__)
# define __WIN32__
# define finite _finite
#endif
 
#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__))
# pragma warning( disable : 4068 ) /* unknown pragma */
# pragma warning( disable : 4710 ) /* function 'foo' not inlined */
# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */
# pragma warning( disable : 4127 ) /* conditional expression is constant */
# if defined(MESA_MINWARN)
# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */
# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */
# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */
# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */
# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */
# endif
# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */
# define GLAPI __declspec(dllexport)
# define WGLAPI __declspec(dllexport)
# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */
# define GLAPI __declspec(dllimport)
# define WGLAPI __declspec(dllimport)
# else /* for use with static link lib build of Win32 edition only */
# define GLAPI extern
# define WGLAPI __declspec(dllimport)
# endif /* _STATIC_MESA support */
# define GLAPIENTRY __stdcall
# define GLAPIENTRYP __stdcall *
# define GLCALLBACK __stdcall
# define GLCALLBACKP __stdcall *
# if defined(__CYGWIN__)
# define GLCALLBACKPCAST *
# else
# define GLCALLBACKPCAST __stdcall *
# endif
# define GLWINAPI __stdcall
# define GLWINAPIV __cdecl
#else
/* non-Windows compilation */
# define GLAPI extern
# define GLAPIENTRY
# define GLAPIENTRYP *
# define GLCALLBACK
# define GLCALLBACKP *
# define GLCALLBACKPCAST *
# define GLWINAPI
# define GLWINAPIV
#endif /* WIN32 / CYGWIN bracket */
 
/* compatability guard so we don't need to change client code */
 
#if defined(_WIN32) && !defined(_WINDEF_) && !defined(_GNU_H_WINDOWS32_BASE) && !defined(OPENSTEP) && !defined(__CYGWIN__)
#if 0
# define CALLBACK GLCALLBACK
typedef void *HGLRC;
typedef void *HDC;
#endif
typedef int (GLAPIENTRY *PROC)();
typedef unsigned long COLORREF;
#endif
 
 
/* Make sure we include glext.h from gl.h */
#define GL_GLEXT_PROTOTYPES
 
 
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP)
# define WGL_FONT_LINES 0
# define WGL_FONT_POLYGONS 1
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
# ifdef UNICODE
# define wglUseFontBitmaps wglUseFontBitmapsW
# define wglUseFontOutlines wglUseFontOutlinesW
# else
# define wglUseFontBitmaps wglUseFontBitmapsA
# define wglUseFontOutlines wglUseFontOutlinesA
# endif /* !UNICODE */
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT;
typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR;
#if !defined(GLX_USE_MESA)
#include <gl/mesa_wgl.h>
#endif
#endif
 
 
/*
* Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN.
* Do not use them unless absolutely necessary!
* Try to use a runtime test instead.
* For now, only used by some DRI hardware drivers for color/texel packing.
*/
#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
#if defined(__linux__)
#include <byteswap.h>
#define CPU_TO_LE32( x ) bswap_32( x )
#else /*__linux__*/
#define CPU_TO_LE32( x ) ( x ) /* fix me for non-Linux big-endian! */
#endif /*__linux__*/
#define MESA_BIG_ENDIAN 1
#else
#define CPU_TO_LE32( x ) ( x )
#define MESA_LITTLE_ENDIAN 1
#endif
#define LE32_TO_CPU( x ) CPU_TO_LE32( x )
 
 
/* This is a macro on IRIX */
#ifdef _P
#undef _P
#endif
 
 
 
#include "GL/gl.h"
#include "GL/glext.h"
 
 
#ifndef CAPI
#ifdef WIN32
#define CAPI _cdecl
#else
#define CAPI
#endif
#endif
#include <GL/internal/glcore.h>
 
 
 
/* Disable unreachable code warnings for Watcom C++ */
#ifdef __WATCOMC__
#pragma disable_message(201)
#endif
 
 
/* Turn off macro checking systems used by other libraries */
#ifdef CHECK
#undef CHECK
#endif
 
 
/* Create a macro so that asm functions can be linked into compilers other
* than GNU C
*/
#ifndef _ASMAPI
#if !defined( __GNUC__ ) && !defined( VMS )
#define _ASMAPI __cdecl
#else
#define _ASMAPI
#endif
#ifdef PTR_DECL_IN_FRONT
#define _ASMAPIP * _ASMAPI
#else
#define _ASMAPIP _ASMAPI *
#endif
#endif
 
#ifdef USE_X86_ASM
#define _NORMAPI _ASMAPI
#define _NORMAPIP _ASMAPIP
#else
#define _NORMAPI
#define _NORMAPIP *
#endif
 
 
/* Function inlining */
#if defined(__GNUC__)
# define INLINE __inline__
#elif defined(__MSC__)
# define INLINE __inline
#elif defined(_MSC_VER)
# define INLINE __inline
#elif defined(__ICL)
# define INLINE __inline
#else
# define INLINE
#endif
 
 
/*
* Provide a reasonable replacement for __FUNCTION__ when using
* non-GNU C compilers.
*/
#if !defined(__GNUC__)
#define STRINGIZE(x) #x
#define STRINGIZE_EVAL(x) STRINGIZE(x)
#define __FUNCTION__ STRINGIZE_EVAL(__FILE__) ", line " STRINGIZE_EVAL(__LINE__)
#endif
 
 
/* Some compilers don't like some of Mesa's const usage */
#ifdef NO_CONST
# define CONST
#else
# define CONST const
#endif
 
 
#ifdef DEBUG
# define ASSERT(X) assert(X)
#else
# define ASSERT(X)
#endif
 
 
/*
* Sometimes we treat GLfloats as GLints. On x86 systems, moving a float
* as a int (thereby using integer registers instead of fp registers) is
* a performance win. Typically, this can be done with ordinary casts.
* But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0)
* these casts generate warnings.
* The following union typedef is used to solve that.
*/
typedef union { GLfloat f; GLint i; } fi_type;
 
 
#endif /* GLHEADER_H */
/shark/trunk/ports/mesa/src/api_validate.c
0,0 → 1,142
/* $Id: api_validate.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "api_validate.h"
#include "context.h"
#include "imports.h"
#include "mtypes.h"
#include "state.h"
 
 
GLboolean
_mesa_validate_DrawElements(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (count <= 0) {
if (count < 0)
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawElements(count)" );
return GL_FALSE;
}
 
if (mode < 0 ||
mode > GL_POLYGON) {
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" );
return GL_FALSE;
}
 
if (type != GL_UNSIGNED_INT &&
type != GL_UNSIGNED_BYTE &&
type != GL_UNSIGNED_SHORT)
{
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)" );
return GL_FALSE;
}
 
if (ctx->NewState)
_mesa_update_state( ctx );
 
if (ctx->Array.Vertex.Enabled
|| (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled))
return GL_TRUE;
else
return GL_FALSE;
 
return GL_TRUE;
}
 
 
GLboolean
_mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
GLuint start, GLuint end,
GLsizei count, GLenum type,
const GLvoid *indices)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (count <= 0) {
if (count < 0)
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawElements(count)" );
return GL_FALSE;
}
 
if (mode < 0 || mode > GL_POLYGON) {
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" );
return GL_FALSE;
}
 
if (end < start) {
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(end<start)");
return GL_FALSE;
}
 
if (type != GL_UNSIGNED_INT &&
type != GL_UNSIGNED_BYTE &&
type != GL_UNSIGNED_SHORT) {
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)" );
return GL_FALSE;
}
 
if (ctx->NewState)
_mesa_update_state( ctx );
 
if (ctx->Array.Vertex.Enabled
|| (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled))
return GL_TRUE;
else
return GL_FALSE;
}
 
 
 
GLboolean
_mesa_validate_DrawArrays(GLcontext *ctx,
GLenum mode, GLint start, GLsizei count)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (count<0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glDrawArrays(count)" );
return GL_FALSE;
}
 
if (mode < 0 || mode > GL_POLYGON) {
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" );
return GL_FALSE;
}
 
if (ctx->NewState)
_mesa_update_state( ctx );
 
if (ctx->Array.Vertex.Enabled
|| (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled))
return GL_TRUE;
else
return GL_FALSE;
}
/shark/trunk/ports/mesa/src/api_loopback.c
0,0 → 1,1875
/* $Id: api_loopback.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Keith Whitwell <keith@tungstengraphics.com>
*/
 
 
#include "glheader.h"
#include "glapi.h"
#include "glapitable.h"
#include "macros.h"
#include "colormac.h"
#include "api_loopback.h"
 
/* KW: A set of functions to convert unusual Color/Normal/Vertex/etc
* calls to a smaller set of driver-provided formats. Currently just
* go back to dispatch to find these (eg. call glNormal3f directly),
* hence 'loopback'.
*
* The driver must supply all of the remaining entry points, which are
* listed in dd.h. The easiest way for a driver to do this is to
* install the supplied software t&l module.
*/
#define COLORUBV(v) glColor4ubv(v)
#define COLORF(r,g,b,a) glColor4f(r,g,b,a)
#define VERTEX2(x,y) glVertex2f(x,y)
#define VERTEX3(x,y,z) glVertex3f(x,y,z)
#define VERTEX4(x,y,z,w) glVertex4f(x,y,z,w)
#define NORMAL(x,y,z) glNormal3f(x,y,z)
#define TEXCOORD1(s) glTexCoord1f(s)
#define TEXCOORD2(s,t) glTexCoord2f(s,t)
#define TEXCOORD3(s,t,u) glTexCoord3f(s,t,u)
#define TEXCOORD4(s,t,u,v) glTexCoord4f(s,t,u,v)
#define INDEX(c) glIndexi(c)
#define MULTI_TEXCOORD1(z,s) glMultiTexCoord1fARB(z,s)
#define MULTI_TEXCOORD2(z,s,t) glMultiTexCoord2fARB(z,s,t)
#define MULTI_TEXCOORD3(z,s,t,u) glMultiTexCoord3fARB(z,s,t,u)
#define MULTI_TEXCOORD4(z,s,t,u,v) glMultiTexCoord4fARB(z,s,t,u,v)
#define EVALCOORD1(x) glEvalCoord1f(x)
#define EVALCOORD2(x,y) glEvalCoord2f(x,y)
#define MATERIALFV(a,b,c) glMaterialfv(a,b,c)
#define RECTF(a,b,c,d) glRectf(a,b,c,d)
 
#define ATTRIB(index, x, y, z, w) _glapi_Dispatch->VertexAttrib4fNV(index, x, y, z, w)
 
 
#define FOGCOORDF(x) _glapi_Dispatch->FogCoordfEXT(x)
#define SECONDARYCOLORUB(a,b,c) _glapi_Dispatch->SecondaryColor3ubEXT(a,b,c)
#define SECONDARYCOLORF(a,b,c) _glapi_Dispatch->SecondaryColor3fEXT(a,b,c)
 
 
static void
loopback_Color3b( GLbyte red, GLbyte green, GLbyte blue )
{
GLubyte col[4];
col[0] = BYTE_TO_UBYTE(red);
col[1] = BYTE_TO_UBYTE(green);
col[2] = BYTE_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3d( GLdouble red, GLdouble green, GLdouble blue )
{
GLubyte col[4];
GLfloat r = (GLfloat) red;
GLfloat g = (GLfloat) green;
GLfloat b = (GLfloat) blue;
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
col[3] = 255;
COLORUBV( col );
}
 
static void
loopback_Color3i( GLint red, GLint green, GLint blue )
{
GLubyte col[4];
col[0] = INT_TO_UBYTE(red);
col[1] = INT_TO_UBYTE(green);
col[2] = INT_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3s( GLshort red, GLshort green, GLshort blue )
{
GLubyte col[4];
col[0] = SHORT_TO_UBYTE(red);
col[1] = SHORT_TO_UBYTE(green);
col[2] = SHORT_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3ui( GLuint red, GLuint green, GLuint blue )
{
GLubyte col[4];
col[0] = UINT_TO_UBYTE(red);
col[1] = UINT_TO_UBYTE(green);
col[2] = UINT_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3us( GLushort red, GLushort green, GLushort blue )
{
GLubyte col[4];
col[0] = USHORT_TO_UBYTE(red);
col[1] = USHORT_TO_UBYTE(green);
col[2] = USHORT_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha )
{
GLubyte col[4];
col[0] = BYTE_TO_UBYTE(red);
col[1] = BYTE_TO_UBYTE(green);
col[2] = BYTE_TO_UBYTE(blue);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha )
{
GLubyte col[4];
GLfloat r = (GLfloat) red;
GLfloat g = (GLfloat) green;
GLfloat b = (GLfloat) blue;
GLfloat a = (GLfloat) alpha;
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
UNCLAMPED_FLOAT_TO_UBYTE(col[3], a);
COLORUBV( col );
}
 
static void
loopback_Color4i( GLint red, GLint green, GLint blue, GLint alpha )
{
GLubyte col[4];
col[0] = INT_TO_UBYTE(red);
col[1] = INT_TO_UBYTE(green);
col[2] = INT_TO_UBYTE(blue);
col[3] = INT_TO_UBYTE(alpha);
COLORUBV(col);
}
 
static void
loopback_Color4s( GLshort red, GLshort green, GLshort blue,
GLshort alpha )
{
GLubyte col[4];
col[0] = SHORT_TO_UBYTE(red);
col[1] = SHORT_TO_UBYTE(green);
col[2] = SHORT_TO_UBYTE(blue);
col[3] = SHORT_TO_UBYTE(alpha);
COLORUBV(col);
}
 
static void
loopback_Color4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha )
{
GLubyte col[4];
col[0] = UINT_TO_UBYTE(red);
col[1] = UINT_TO_UBYTE(green);
col[2] = UINT_TO_UBYTE(blue);
col[3] = UINT_TO_UBYTE(alpha);
COLORUBV(col);
}
 
static void
loopback_Color4us( GLushort red, GLushort green, GLushort blue,
GLushort alpha )
{
GLubyte col[4];
col[0] = USHORT_TO_UBYTE(red);
col[1] = USHORT_TO_UBYTE(green);
col[2] = USHORT_TO_UBYTE(blue);
col[3] = USHORT_TO_UBYTE(alpha);
COLORUBV(col);
}
 
static void
loopback_Color3bv( const GLbyte *v )
{
GLubyte col[4];
col[0] = BYTE_TO_UBYTE(v[0]);
col[1] = BYTE_TO_UBYTE(v[1]);
col[2] = BYTE_TO_UBYTE(v[2]);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3dv( const GLdouble *v )
{
GLubyte col[4];
GLfloat r = (GLfloat) v[0];
GLfloat g = (GLfloat) v[1];
GLfloat b = (GLfloat) v[2];
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
col[3] = 255;
COLORUBV( col );
}
 
static void
loopback_Color3iv( const GLint *v )
{
GLubyte col[4];
col[0] = INT_TO_UBYTE(v[0]);
col[1] = INT_TO_UBYTE(v[1]);
col[2] = INT_TO_UBYTE(v[2]);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3sv( const GLshort *v )
{
GLubyte col[4];
col[0] = SHORT_TO_UBYTE(v[0]);
col[1] = SHORT_TO_UBYTE(v[1]);
col[2] = SHORT_TO_UBYTE(v[2]);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3uiv( const GLuint *v )
{
GLubyte col[4];
col[0] = UINT_TO_UBYTE(v[0]);
col[1] = UINT_TO_UBYTE(v[1]);
col[2] = UINT_TO_UBYTE(v[2]);
col[3] = 255;
COLORUBV(col);
}
 
static void
loopback_Color3usv( const GLushort *v )
{
GLubyte col[4];
col[0] = USHORT_TO_UBYTE(v[0]);
col[1] = USHORT_TO_UBYTE(v[1]);
col[2] = USHORT_TO_UBYTE(v[2]);
col[3] = 255;
COLORUBV(col);
 
}
 
static void
loopback_Color4bv( const GLbyte *v )
{
GLubyte col[4];
col[0] = BYTE_TO_UBYTE(v[0]);
col[1] = BYTE_TO_UBYTE(v[1]);
col[2] = BYTE_TO_UBYTE(v[2]);
col[3] = BYTE_TO_UBYTE(v[3]);
COLORUBV(col);
}
 
static void
loopback_Color4dv( const GLdouble *v )
{
GLubyte col[4];
GLfloat r = (GLfloat) v[0];
GLfloat g = (GLfloat) v[1];
GLfloat b = (GLfloat) v[2];
GLfloat a = (GLfloat) v[3];
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
UNCLAMPED_FLOAT_TO_UBYTE(col[3], a);
COLORUBV( col );
}
 
static void
loopback_Color4iv( const GLint *v )
{
GLubyte col[4];
col[0] = INT_TO_UBYTE(v[0]);
col[1] = INT_TO_UBYTE(v[1]);
col[2] = INT_TO_UBYTE(v[2]);
col[3] = INT_TO_UBYTE(v[3]);
COLORUBV(col);
}
 
static void
loopback_Color4sv( const GLshort *v)
{
GLubyte col[4];
col[0] = SHORT_TO_UBYTE(v[0]);
col[1] = SHORT_TO_UBYTE(v[1]);
col[2] = SHORT_TO_UBYTE(v[2]);
col[3] = SHORT_TO_UBYTE(v[3]);
COLORUBV(col);
}
 
static void
loopback_Color4uiv( const GLuint *v)
{
GLubyte col[4];
col[0] = UINT_TO_UBYTE(v[0]);
col[1] = UINT_TO_UBYTE(v[1]);
col[2] = UINT_TO_UBYTE(v[2]);
col[3] = UINT_TO_UBYTE(v[3]);
COLORUBV(col);
}
 
static void
loopback_Color4usv( const GLushort *v)
{
GLubyte col[4];
col[0] = USHORT_TO_UBYTE(v[0]);
col[1] = USHORT_TO_UBYTE(v[1]);
col[2] = USHORT_TO_UBYTE(v[2]);
col[3] = USHORT_TO_UBYTE(v[3]);
COLORUBV(col);
}
 
static void
loopback_Color3b_f( GLbyte red, GLbyte green, GLbyte blue )
{
COLORF( BYTE_TO_FLOAT(red),
BYTE_TO_FLOAT(green),
BYTE_TO_FLOAT(blue),
1.0 );
}
 
static void
loopback_Color3d_f( GLdouble red, GLdouble green, GLdouble blue )
{
COLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue, 1.0 );
}
 
static void
loopback_Color3i_f( GLint red, GLint green, GLint blue )
{
COLORF( INT_TO_FLOAT(red), INT_TO_FLOAT(green),
INT_TO_FLOAT(blue), 1.0);
}
 
static void
loopback_Color3s_f( GLshort red, GLshort green, GLshort blue )
{
COLORF( SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
SHORT_TO_FLOAT(blue), 1.0);
}
 
static void
loopback_Color3ui_f( GLuint red, GLuint green, GLuint blue )
{
COLORF( UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
UINT_TO_FLOAT(blue), 1.0 );
}
 
static void
loopback_Color3us_f( GLushort red, GLushort green, GLushort blue )
{
COLORF( USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
USHORT_TO_FLOAT(blue), 1.0 );
}
 
 
static void
loopback_Color3bv_f( const GLbyte *v )
{
COLORF( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
BYTE_TO_FLOAT(v[2]), 1.0 );
}
 
static void
loopback_Color3dv_f( const GLdouble *v )
{
COLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0 );
}
 
static void
loopback_Color3iv_f( const GLint *v )
{
COLORF( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]) );
}
 
static void
loopback_Color3sv_f( const GLshort *v )
{
COLORF( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
SHORT_TO_FLOAT(v[2]), 1.0 );
}
 
static void
loopback_Color3uiv_f( const GLuint *v )
{
COLORF( UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
UINT_TO_FLOAT(v[2]), 1.0 );
}
 
static void
loopback_Color3usv_f( const GLushort *v )
{
COLORF( USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
USHORT_TO_FLOAT(v[2]), 1.0 );
}
 
 
static void
loopback_Color4b_f( GLbyte red, GLbyte green, GLbyte blue,
GLbyte alpha )
{
COLORF( BYTE_TO_FLOAT(red), BYTE_TO_FLOAT(green),
BYTE_TO_FLOAT(blue), BYTE_TO_FLOAT(alpha) );
}
 
static void
loopback_Color4d_f( GLdouble red, GLdouble green, GLdouble blue,
GLdouble alpha )
{
COLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue, (GLfloat) alpha );
}
 
static void
loopback_Color4i_f( GLint red, GLint green, GLint blue, GLint alpha )
{
COLORF( INT_TO_FLOAT(red), INT_TO_FLOAT(green),
INT_TO_FLOAT(blue), INT_TO_FLOAT(alpha) );
}
 
static void
loopback_Color4s_f( GLshort red, GLshort green, GLshort blue,
GLshort alpha )
{
COLORF( SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
SHORT_TO_FLOAT(blue), SHORT_TO_FLOAT(alpha) );
}
 
static void
loopback_Color4ui_f( GLuint red, GLuint green, GLuint blue, GLuint alpha )
{
COLORF( UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
UINT_TO_FLOAT(blue), UINT_TO_FLOAT(alpha) );
}
 
static void
loopback_Color4us_f( GLushort red, GLushort green, GLushort blue, GLushort alpha )
{
COLORF( USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
USHORT_TO_FLOAT(blue), USHORT_TO_FLOAT(alpha) );
}
 
 
static void
loopback_Color4iv_f( const GLint *v )
{
COLORF( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]) );
}
 
 
static void
loopback_Color4bv_f( const GLbyte *v )
{
COLORF( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]) );
}
 
static void
loopback_Color4dv_f( const GLdouble *v )
{
COLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] );
}
 
 
static void
loopback_Color4sv_f( const GLshort *v)
{
COLORF( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]) );
}
 
 
static void
loopback_Color4uiv_f( const GLuint *v)
{
COLORF( UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]) );
}
 
static void
loopback_Color4usv_f( const GLushort *v)
{
COLORF( USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]) );
}
 
static void
loopback_FogCoorddEXT( GLdouble d )
{
FOGCOORDF( (GLfloat) d );
}
 
static void
loopback_FogCoorddvEXT( const GLdouble *v )
{
FOGCOORDF( (GLfloat) *v );
}
 
 
static void
loopback_Indexd( GLdouble c )
{
INDEX( (GLint) c );
}
 
static void
loopback_Indexf( GLfloat c )
{
INDEX( (GLuint) (GLint) c );
}
 
static void
loopback_Indexs( GLshort c )
{
INDEX( (GLint) c );
}
 
static void
loopback_Indexub( GLubyte c )
{
INDEX( (GLint) c );
}
 
static void
loopback_Indexdv( const GLdouble *c )
{
INDEX( (GLint) (GLint) *c );
}
 
static void
loopback_Indexfv( const GLfloat *c )
{
INDEX( (GLint) (GLint) *c );
}
 
static void
loopback_Indexiv( const GLint *c )
{
INDEX( *c );
}
 
static void
loopback_Indexsv( const GLshort *c )
{
INDEX( (GLint) *c );
}
 
static void
loopback_Indexubv( const GLubyte *c )
{
INDEX( (GLint) *c );
}
 
static void
loopback_Normal3b( GLbyte nx, GLbyte ny, GLbyte nz )
{
NORMAL( BYTE_TO_FLOAT(nx), BYTE_TO_FLOAT(ny), BYTE_TO_FLOAT(nz) );
}
 
static void
loopback_Normal3d( GLdouble nx, GLdouble ny, GLdouble nz )
{
NORMAL((GLfloat) nx, (GLfloat) ny, (GLfloat) nz);
}
 
static void
loopback_Normal3i( GLint nx, GLint ny, GLint nz )
{
NORMAL( INT_TO_FLOAT(nx), INT_TO_FLOAT(ny), INT_TO_FLOAT(nz) );
}
 
static void
loopback_Normal3s( GLshort nx, GLshort ny, GLshort nz )
{
NORMAL( SHORT_TO_FLOAT(nx), SHORT_TO_FLOAT(ny), SHORT_TO_FLOAT(nz) );
}
 
static void
loopback_Normal3bv( const GLbyte *v )
{
NORMAL( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]) );
}
 
static void
loopback_Normal3dv( const GLdouble *v )
{
NORMAL( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_Normal3iv( const GLint *v )
{
NORMAL( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]) );
}
 
static void
loopback_Normal3sv( const GLshort *v )
{
NORMAL( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]) );
}
 
static void
loopback_TexCoord1d( GLdouble s )
{
TEXCOORD1((GLfloat) s);
}
 
static void
loopback_TexCoord1i( GLint s )
{
TEXCOORD1((GLfloat) s);
}
 
static void
loopback_TexCoord1s( GLshort s )
{
TEXCOORD1((GLfloat) s);
}
 
static void
loopback_TexCoord2d( GLdouble s, GLdouble t )
{
TEXCOORD2((GLfloat) s,(GLfloat) t);
}
 
static void
loopback_TexCoord2s( GLshort s, GLshort t )
{
TEXCOORD2((GLfloat) s,(GLfloat) t);
}
 
static void
loopback_TexCoord2i( GLint s, GLint t )
{
TEXCOORD2((GLfloat) s,(GLfloat) t);
}
 
static void
loopback_TexCoord3d( GLdouble s, GLdouble t, GLdouble r )
{
TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r);
}
 
static void
loopback_TexCoord3i( GLint s, GLint t, GLint r )
{
TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r);
}
 
static void
loopback_TexCoord3s( GLshort s, GLshort t, GLshort r )
{
TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r);
}
 
static void
loopback_TexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q )
{
TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
}
 
static void
loopback_TexCoord4i( GLint s, GLint t, GLint r, GLint q )
{
TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
}
 
static void
loopback_TexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q )
{
TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
}
 
static void
loopback_TexCoord1dv( const GLdouble *v )
{
TEXCOORD1((GLfloat) v[0]);
}
 
static void
loopback_TexCoord1iv( const GLint *v )
{
TEXCOORD1((GLfloat) v[0]);
}
 
static void
loopback_TexCoord1sv( const GLshort *v )
{
TEXCOORD1((GLfloat) v[0]);
}
 
static void
loopback_TexCoord2dv( const GLdouble *v )
{
TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]);
}
 
static void
loopback_TexCoord2iv( const GLint *v )
{
TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]);
}
 
static void
loopback_TexCoord2sv( const GLshort *v )
{
TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]);
}
 
static void
loopback_TexCoord3dv( const GLdouble *v )
{
TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]);
}
 
static void
loopback_TexCoord3iv( const GLint *v )
{
TEXCOORD3((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]);
}
 
static void
loopback_TexCoord3sv( const GLshort *v )
{
TEXCOORD3((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]);
}
 
static void
loopback_TexCoord4dv( const GLdouble *v )
{
TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
}
 
static void
loopback_TexCoord4iv( const GLint *v )
{
TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
}
 
static void
loopback_TexCoord4sv( const GLshort *v )
{
TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
}
 
static void
loopback_Vertex2d( GLdouble x, GLdouble y )
{
VERTEX2( (GLfloat) x, (GLfloat) y );
}
 
static void
loopback_Vertex2i( GLint x, GLint y )
{
VERTEX2( (GLfloat) x, (GLfloat) y );
}
 
static void
loopback_Vertex2s( GLshort x, GLshort y )
{
VERTEX2( (GLfloat) x, (GLfloat) y );
}
 
static void
loopback_Vertex3d( GLdouble x, GLdouble y, GLdouble z )
{
VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z );
}
 
static void
loopback_Vertex3i( GLint x, GLint y, GLint z )
{
VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z );
}
 
static void
loopback_Vertex3s( GLshort x, GLshort y, GLshort z )
{
VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z );
}
 
static void
loopback_Vertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w )
{
VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w );
}
 
static void
loopback_Vertex4i( GLint x, GLint y, GLint z, GLint w )
{
VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w );
}
 
static void
loopback_Vertex4s( GLshort x, GLshort y, GLshort z, GLshort w )
{
VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w );
}
 
static void
loopback_Vertex2dv( const GLdouble *v )
{
VERTEX2( (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_Vertex2iv( const GLint *v )
{
VERTEX2( (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_Vertex2sv( const GLshort *v )
{
VERTEX2( (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_Vertex3dv( const GLdouble *v )
{
VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_Vertex3iv( const GLint *v )
{
VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_Vertex3sv( const GLshort *v )
{
VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_Vertex4dv( const GLdouble *v )
{
VERTEX4( (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_Vertex4iv( const GLint *v )
{
VERTEX4( (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_Vertex4sv( const GLshort *v )
{
VERTEX4( (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_MultiTexCoord1dARB(GLenum target, GLdouble s)
{
MULTI_TEXCOORD1( target, (GLfloat) s );
}
 
static void
loopback_MultiTexCoord1dvARB(GLenum target, const GLdouble *v)
{
MULTI_TEXCOORD1( target, (GLfloat) v[0] );
}
 
static void
loopback_MultiTexCoord1iARB(GLenum target, GLint s)
{
MULTI_TEXCOORD1( target, (GLfloat) s );
}
 
static void
loopback_MultiTexCoord1ivARB(GLenum target, const GLint *v)
{
MULTI_TEXCOORD1( target, (GLfloat) v[0] );
}
 
static void
loopback_MultiTexCoord1sARB(GLenum target, GLshort s)
{
MULTI_TEXCOORD1( target, (GLfloat) s );
}
 
static void
loopback_MultiTexCoord1svARB(GLenum target, const GLshort *v)
{
MULTI_TEXCOORD1( target, (GLfloat) v[0] );
}
 
static void
loopback_MultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t)
{
MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t );
}
 
static void
loopback_MultiTexCoord2dvARB(GLenum target, const GLdouble *v)
{
MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_MultiTexCoord2iARB(GLenum target, GLint s, GLint t)
{
MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t );
}
 
static void
loopback_MultiTexCoord2ivARB(GLenum target, const GLint *v)
{
MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_MultiTexCoord2sARB(GLenum target, GLshort s, GLshort t)
{
MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t );
}
 
static void
loopback_MultiTexCoord2svARB(GLenum target, const GLshort *v)
{
MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] );
}
 
static void
loopback_MultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r)
{
MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r );
}
 
static void
loopback_MultiTexCoord3dvARB(GLenum target, const GLdouble *v)
{
MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_MultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r)
{
MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r );
}
 
static void
loopback_MultiTexCoord3ivARB(GLenum target, const GLint *v)
{
MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_MultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r)
{
MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r );
}
 
static void
loopback_MultiTexCoord3svARB(GLenum target, const GLshort *v)
{
MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
 
static void
loopback_MultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t,
(GLfloat) r, (GLfloat) q );
}
 
static void
loopback_MultiTexCoord4dvARB(GLenum target, const GLdouble *v)
{
MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_MultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q)
{
MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t,
(GLfloat) r, (GLfloat) q );
}
 
static void
loopback_MultiTexCoord4ivARB(GLenum target, const GLint *v)
{
MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_MultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
{
MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t,
(GLfloat) r, (GLfloat) q );
}
 
static void
loopback_MultiTexCoord4svARB(GLenum target, const GLshort *v)
{
MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3] );
}
 
static void
loopback_EvalCoord2dv( const GLdouble *u )
{
EVALCOORD2( (GLfloat) u[0], (GLfloat) u[1] );
}
 
static void
loopback_EvalCoord2fv( const GLfloat *u )
{
EVALCOORD2( u[0], u[1] );
}
 
static void
loopback_EvalCoord2d( GLdouble u, GLdouble v )
{
EVALCOORD2( (GLfloat) u, (GLfloat) v );
}
 
static void
loopback_EvalCoord1dv( const GLdouble *u )
{
EVALCOORD1( (GLfloat) *u );
}
 
static void
loopback_EvalCoord1fv( const GLfloat *u )
{
EVALCOORD1( (GLfloat) *u );
}
 
static void
loopback_EvalCoord1d( GLdouble u )
{
EVALCOORD1( (GLfloat) u );
}
 
static void
loopback_Materialf( GLenum face, GLenum pname, GLfloat param )
{
GLfloat fparam[4];
fparam[0] = param;
MATERIALFV( face, pname, fparam );
}
 
static void
loopback_Materiali(GLenum face, GLenum pname, GLint param )
{
GLfloat p = (GLfloat) param;
MATERIALFV(face, pname, &p);
}
 
static void
loopback_Materialiv(GLenum face, GLenum pname, const GLint *params )
{
GLfloat fparam[4];
switch (pname) {
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_SPECULAR:
case GL_EMISSION:
case GL_AMBIENT_AND_DIFFUSE:
fparam[0] = INT_TO_FLOAT( params[0] );
fparam[1] = INT_TO_FLOAT( params[1] );
fparam[2] = INT_TO_FLOAT( params[2] );
fparam[3] = INT_TO_FLOAT( params[3] );
break;
case GL_SHININESS:
fparam[0] = (GLfloat) params[0];
break;
case GL_COLOR_INDEXES:
fparam[0] = (GLfloat) params[0];
fparam[1] = (GLfloat) params[1];
fparam[2] = (GLfloat) params[2];
break;
default:
;
}
MATERIALFV(face, pname, fparam);
}
 
 
static void
loopback_Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
{
RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2);
}
 
static void
loopback_Rectdv(const GLdouble *v1, const GLdouble *v2)
{
RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]);
}
 
static void
loopback_Rectfv(const GLfloat *v1, const GLfloat *v2)
{
RECTF(v1[0], v1[1], v2[0], v2[1]);
}
 
static void
loopback_Recti(GLint x1, GLint y1, GLint x2, GLint y2)
{
RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2);
}
 
static void
loopback_Rectiv(const GLint *v1, const GLint *v2)
{
RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]);
}
 
static void
loopback_Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
{
RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2);
}
 
static void
loopback_Rectsv(const GLshort *v1, const GLshort *v2)
{
RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]);
}
 
static void
loopback_SecondaryColor3bEXT( GLbyte red, GLbyte green, GLbyte blue )
{
SECONDARYCOLORUB( BYTE_TO_UBYTE(red),
BYTE_TO_UBYTE(green),
BYTE_TO_UBYTE(blue) );
}
 
static void
loopback_SecondaryColor3dEXT( GLdouble red, GLdouble green, GLdouble blue )
{
GLubyte col[3];
GLfloat r = (GLfloat) red;
GLfloat g = (GLfloat) green;
GLfloat b = (GLfloat) blue;
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
SECONDARYCOLORUB( col[0], col[1], col[2] );
}
 
static void
loopback_SecondaryColor3iEXT( GLint red, GLint green, GLint blue )
{
SECONDARYCOLORUB( INT_TO_UBYTE(red),
INT_TO_UBYTE(green),
INT_TO_UBYTE(blue));
}
 
static void
loopback_SecondaryColor3sEXT( GLshort red, GLshort green, GLshort blue )
{
SECONDARYCOLORUB(SHORT_TO_UBYTE(red),
SHORT_TO_UBYTE(green),
SHORT_TO_UBYTE(blue));
}
 
static void
loopback_SecondaryColor3uiEXT( GLuint red, GLuint green, GLuint blue )
{
SECONDARYCOLORUB(UINT_TO_UBYTE(red),
UINT_TO_UBYTE(green),
UINT_TO_UBYTE(blue));
}
 
static void
loopback_SecondaryColor3usEXT( GLushort red, GLushort green, GLushort blue )
{
SECONDARYCOLORUB(USHORT_TO_UBYTE(red),
USHORT_TO_UBYTE(green),
USHORT_TO_UBYTE(blue));
}
 
static void
loopback_SecondaryColor3bvEXT( const GLbyte *v )
{
const GLfloat a = BYTE_TO_FLOAT(v[0]);
const GLfloat b = BYTE_TO_FLOAT(v[1]);
const GLfloat c = BYTE_TO_FLOAT(v[2]);
SECONDARYCOLORF(a,b,c);
}
 
static void
loopback_SecondaryColor3dvEXT( const GLdouble *v )
{
GLubyte col[3];
GLfloat r = (GLfloat) v[0];
GLfloat g = (GLfloat) v[1];
GLfloat b = (GLfloat) v[2];
UNCLAMPED_FLOAT_TO_UBYTE(col[0], r);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], g);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], b);
SECONDARYCOLORUB( col[0], col[1], col[2] );
}
 
static void
loopback_SecondaryColor3ivEXT( const GLint *v )
{
SECONDARYCOLORUB(INT_TO_UBYTE(v[0]),
INT_TO_UBYTE(v[1]),
INT_TO_UBYTE(v[2]));
}
 
static void
loopback_SecondaryColor3svEXT( const GLshort *v )
{
SECONDARYCOLORUB(SHORT_TO_UBYTE(v[0]),
SHORT_TO_UBYTE(v[1]),
SHORT_TO_UBYTE(v[2]));
}
 
static void
loopback_SecondaryColor3uivEXT( const GLuint *v )
{
SECONDARYCOLORUB(UINT_TO_UBYTE(v[0]),
UINT_TO_UBYTE(v[1]),
UINT_TO_UBYTE(v[2]));
}
 
static void
loopback_SecondaryColor3usvEXT( const GLushort *v )
{
SECONDARYCOLORUB(USHORT_TO_UBYTE(v[0]),
USHORT_TO_UBYTE(v[1]),
USHORT_TO_UBYTE(v[2]));
}
 
 
static void
loopback_SecondaryColor3bEXT_f( GLbyte red, GLbyte green, GLbyte blue )
{
SECONDARYCOLORF( BYTE_TO_FLOAT(red),
BYTE_TO_FLOAT(green),
BYTE_TO_FLOAT(blue) );
}
 
static void
loopback_SecondaryColor3dEXT_f( GLdouble red, GLdouble green, GLdouble blue )
{
SECONDARYCOLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue );
}
 
static void
loopback_SecondaryColor3iEXT_f( GLint red, GLint green, GLint blue )
{
SECONDARYCOLORF( INT_TO_FLOAT(red),
INT_TO_FLOAT(green),
INT_TO_FLOAT(blue));
}
 
static void
loopback_SecondaryColor3sEXT_f( GLshort red, GLshort green, GLshort blue )
{
SECONDARYCOLORF(SHORT_TO_FLOAT(red),
SHORT_TO_FLOAT(green),
SHORT_TO_FLOAT(blue));
}
 
static void
loopback_SecondaryColor3uiEXT_f( GLuint red, GLuint green, GLuint blue )
{
SECONDARYCOLORF(UINT_TO_FLOAT(red),
UINT_TO_FLOAT(green),
UINT_TO_FLOAT(blue));
}
 
static void
loopback_SecondaryColor3usEXT_f( GLushort red, GLushort green, GLushort blue )
{
SECONDARYCOLORF(USHORT_TO_FLOAT(red),
USHORT_TO_FLOAT(green),
USHORT_TO_FLOAT(blue));
}
 
static void
loopback_SecondaryColor3bvEXT_f( const GLbyte *v )
{
SECONDARYCOLORF(BYTE_TO_FLOAT(v[0]),
BYTE_TO_FLOAT(v[1]),
BYTE_TO_FLOAT(v[2]));
}
 
static void
loopback_SecondaryColor3dvEXT_f( const GLdouble *v )
{
SECONDARYCOLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
}
static void
loopback_SecondaryColor3ivEXT_f( const GLint *v )
{
SECONDARYCOLORF(INT_TO_FLOAT(v[0]),
INT_TO_FLOAT(v[1]),
INT_TO_FLOAT(v[2]));
}
 
static void
loopback_SecondaryColor3svEXT_f( const GLshort *v )
{
SECONDARYCOLORF(SHORT_TO_FLOAT(v[0]),
SHORT_TO_FLOAT(v[1]),
SHORT_TO_FLOAT(v[2]));
}
 
static void
loopback_SecondaryColor3uivEXT_f( const GLuint *v )
{
SECONDARYCOLORF(UINT_TO_FLOAT(v[0]),
UINT_TO_FLOAT(v[1]),
UINT_TO_FLOAT(v[2]));
}
 
static void
loopback_SecondaryColor3usvEXT_f( const GLushort *v )
{
SECONDARYCOLORF(USHORT_TO_FLOAT(v[0]),
USHORT_TO_FLOAT(v[1]),
USHORT_TO_FLOAT(v[2]));
}
 
 
/*
* GL_NV_vertex_program
*/
 
static void
loopback_VertexAttrib1sNV(GLuint index, GLshort x)
{
ATTRIB(index, (GLfloat) x, 0.0F, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib1fNV(GLuint index, GLfloat x)
{
ATTRIB(index, x, 0.0F, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib1dNV(GLuint index, GLdouble x)
{
ATTRIB(index, (GLfloat) x, 0.0F, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2sNV(GLuint index, GLshort x, GLshort y)
{
ATTRIB(index, (GLfloat) x, y, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y)
{
ATTRIB(index, (GLfloat) x, y, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y)
{
ATTRIB(index, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z)
{
ATTRIB(index, (GLfloat) x, y, z, 1.0F);
}
 
static void
loopback_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
ATTRIB(index, x, y, z, 1.0F);
}
 
static void
loopback_VertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
static void
loopback_VertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
{
ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void
loopback_VertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
ATTRIB(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
static void
loopback_VertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
{
ATTRIB(index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y),
UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w));
}
 
static void
loopback_VertexAttrib1svNV(GLuint index, const GLshort *v)
{
ATTRIB(index, (GLfloat) v[0], 0.0F, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib1fvNV(GLuint index, const GLfloat *v)
{
ATTRIB(index, v[0], 0.0F, 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib1dvNV(GLuint index, const GLdouble *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2svNV(GLuint index, const GLshort *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2fvNV(GLuint index, const GLfloat *v)
{
ATTRIB(index, v[0], v[1], 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib2dvNV(GLuint index, const GLdouble *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
static void
loopback_VertexAttrib3svNV(GLuint index, const GLshort *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void
loopback_VertexAttrib3fvNV(GLuint index, const GLfloat *v)
{
ATTRIB(index, v[0], v[1], v[2], 1.0F);
}
 
static void
loopback_VertexAttrib3dvNV(GLuint index, const GLdouble *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void
loopback_VertexAttrib4svNV(GLuint index, const GLshort *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
static void
loopback_VertexAttrib4fvNV(GLuint index, const GLfloat *v)
{
ATTRIB(index, v[0], v[1], v[2], v[3]);
}
 
static void
loopback_VertexAttrib4dvNV(GLuint index, const GLdouble *v)
{
ATTRIB(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
}
 
static void
loopback_VertexAttrib4ubvNV(GLuint index, const GLubyte *v)
{
ATTRIB(index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
}
 
 
static void
loopback_VertexAttribs1svNV(GLuint index, GLsizei n, const GLshort *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib1svNV(index + i, v + i);
}
 
static void
loopback_VertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib1fvNV(index + i, v + i);
}
 
static void
loopback_VertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib1dvNV(index + i, v + i);
}
 
static void
loopback_VertexAttribs2svNV(GLuint index, GLsizei n, const GLshort *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib2svNV(index + i, v + 2 * i);
}
 
static void
loopback_VertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib2fvNV(index + i, v + 2 * i);
}
 
static void
loopback_VertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib2dvNV(index + i, v + 2 * i);
}
 
static void
loopback_VertexAttribs3svNV(GLuint index, GLsizei n, const GLshort *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib3svNV(index + i, v + 3 * i);
}
 
static void
loopback_VertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib3fvNV(index + i, v + 3 * i);
}
 
static void
loopback_VertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib3dvNV(index + i, v + 3 * i);
}
 
static void
loopback_VertexAttribs4svNV(GLuint index, GLsizei n, const GLshort *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib4svNV(index + i, v + 4 * i);
}
 
static void
loopback_VertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib4fvNV(index + i, v + 4 * i);
}
 
static void
loopback_VertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib4dvNV(index + i, v + 4 * i);
}
 
static void
loopback_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v)
{
GLint i;
for (i = n - 1; i >= 0; i--)
loopback_VertexAttrib4ubvNV(index + i, v + 4 * i);
}
 
 
 
void
_mesa_loopback_prefer_float( struct _glapi_table *dest,
GLboolean prefer_float_colors )
{
if (!prefer_float_colors) {
dest->Color3b = loopback_Color3b;
dest->Color3d = loopback_Color3d;
dest->Color3i = loopback_Color3i;
dest->Color3s = loopback_Color3s;
dest->Color3ui = loopback_Color3ui;
dest->Color3us = loopback_Color3us;
dest->Color4b = loopback_Color4b;
dest->Color4d = loopback_Color4d;
dest->Color4i = loopback_Color4i;
dest->Color4s = loopback_Color4s;
dest->Color4ui = loopback_Color4ui;
dest->Color4us = loopback_Color4us;
dest->Color3bv = loopback_Color3bv;
dest->Color3dv = loopback_Color3dv;
dest->Color3iv = loopback_Color3iv;
dest->Color3sv = loopback_Color3sv;
dest->Color3uiv = loopback_Color3uiv;
dest->Color3usv = loopback_Color3usv;
dest->Color4bv = loopback_Color4bv;
dest->Color4dv = loopback_Color4dv;
dest->Color4iv = loopback_Color4iv;
dest->Color4sv = loopback_Color4sv;
dest->Color4uiv = loopback_Color4uiv;
dest->Color4usv = loopback_Color4usv;
dest->SecondaryColor3bEXT = loopback_SecondaryColor3bEXT;
dest->SecondaryColor3dEXT = loopback_SecondaryColor3dEXT;
dest->SecondaryColor3iEXT = loopback_SecondaryColor3iEXT;
dest->SecondaryColor3sEXT = loopback_SecondaryColor3sEXT;
dest->SecondaryColor3uiEXT = loopback_SecondaryColor3uiEXT;
dest->SecondaryColor3usEXT = loopback_SecondaryColor3usEXT;
dest->SecondaryColor3bvEXT = loopback_SecondaryColor3bvEXT;
dest->SecondaryColor3dvEXT = loopback_SecondaryColor3dvEXT;
dest->SecondaryColor3ivEXT = loopback_SecondaryColor3ivEXT;
dest->SecondaryColor3svEXT = loopback_SecondaryColor3svEXT;
dest->SecondaryColor3uivEXT = loopback_SecondaryColor3uivEXT;
dest->SecondaryColor3usvEXT = loopback_SecondaryColor3usvEXT;
}
else {
dest->Color3b = loopback_Color3b_f;
dest->Color3d = loopback_Color3d_f;
dest->Color3i = loopback_Color3i_f;
dest->Color3s = loopback_Color3s_f;
dest->Color3ui = loopback_Color3ui_f;
dest->Color3us = loopback_Color3us_f;
dest->Color4b = loopback_Color4b_f;
dest->Color4d = loopback_Color4d_f;
dest->Color4i = loopback_Color4i_f;
dest->Color4s = loopback_Color4s_f;
dest->Color4ui = loopback_Color4ui_f;
dest->Color4us = loopback_Color4us_f;
dest->Color3bv = loopback_Color3bv_f;
dest->Color3dv = loopback_Color3dv_f;
dest->Color3iv = loopback_Color3iv_f;
dest->Color3sv = loopback_Color3sv_f;
dest->Color3uiv = loopback_Color3uiv_f;
dest->Color3usv = loopback_Color3usv_f;
dest->Color4bv = loopback_Color4bv_f;
dest->Color4dv = loopback_Color4dv_f;
dest->Color4iv = loopback_Color4iv_f;
dest->Color4sv = loopback_Color4sv_f;
dest->Color4uiv = loopback_Color4uiv_f;
dest->Color4usv = loopback_Color4usv_f;
dest->SecondaryColor3bEXT = loopback_SecondaryColor3bEXT_f;
dest->SecondaryColor3dEXT = loopback_SecondaryColor3dEXT_f;
dest->SecondaryColor3iEXT = loopback_SecondaryColor3iEXT_f;
dest->SecondaryColor3sEXT = loopback_SecondaryColor3sEXT_f;
dest->SecondaryColor3uiEXT = loopback_SecondaryColor3uiEXT_f;
dest->SecondaryColor3usEXT = loopback_SecondaryColor3usEXT_f;
dest->SecondaryColor3bvEXT = loopback_SecondaryColor3bvEXT_f;
dest->SecondaryColor3dvEXT = loopback_SecondaryColor3dvEXT_f;
dest->SecondaryColor3ivEXT = loopback_SecondaryColor3ivEXT_f;
dest->SecondaryColor3svEXT = loopback_SecondaryColor3svEXT_f;
dest->SecondaryColor3uivEXT = loopback_SecondaryColor3uivEXT_f;
dest->SecondaryColor3usvEXT = loopback_SecondaryColor3usvEXT_f;
}
}
 
/* Passing prefer_float_colors as true will mean that all colors
* *except* Color{34}ub{v} are passed as floats. Setting it false will
* mean all colors *except* Color{34}f{v} are passed as ubytes.
*
* This code never registers handlers for any of the entry points
* listed in vtxfmt.h.
*/
void
_mesa_loopback_init_api_table( struct _glapi_table *dest,
GLboolean prefer_float_colors )
{
_mesa_loopback_prefer_float( dest, prefer_float_colors );
 
dest->Indexd = loopback_Indexd;
dest->Indexf = loopback_Indexf;
dest->Indexs = loopback_Indexs;
dest->Indexub = loopback_Indexub;
dest->Indexdv = loopback_Indexdv;
dest->Indexfv = loopback_Indexfv;
dest->Indexiv = loopback_Indexiv;
dest->Indexsv = loopback_Indexsv;
dest->Indexubv = loopback_Indexubv;
dest->Normal3b = loopback_Normal3b;
dest->Normal3d = loopback_Normal3d;
dest->Normal3i = loopback_Normal3i;
dest->Normal3s = loopback_Normal3s;
dest->Normal3bv = loopback_Normal3bv;
dest->Normal3dv = loopback_Normal3dv;
dest->Normal3iv = loopback_Normal3iv;
dest->Normal3sv = loopback_Normal3sv;
dest->TexCoord1d = loopback_TexCoord1d;
dest->TexCoord1i = loopback_TexCoord1i;
dest->TexCoord1s = loopback_TexCoord1s;
dest->TexCoord2d = loopback_TexCoord2d;
dest->TexCoord2s = loopback_TexCoord2s;
dest->TexCoord2i = loopback_TexCoord2i;
dest->TexCoord3d = loopback_TexCoord3d;
dest->TexCoord3i = loopback_TexCoord3i;
dest->TexCoord3s = loopback_TexCoord3s;
dest->TexCoord4d = loopback_TexCoord4d;
dest->TexCoord4i = loopback_TexCoord4i;
dest->TexCoord4s = loopback_TexCoord4s;
dest->TexCoord1dv = loopback_TexCoord1dv;
dest->TexCoord1iv = loopback_TexCoord1iv;
dest->TexCoord1sv = loopback_TexCoord1sv;
dest->TexCoord2dv = loopback_TexCoord2dv;
dest->TexCoord2iv = loopback_TexCoord2iv;
dest->TexCoord2sv = loopback_TexCoord2sv;
dest->TexCoord3dv = loopback_TexCoord3dv;
dest->TexCoord3iv = loopback_TexCoord3iv;
dest->TexCoord3sv = loopback_TexCoord3sv;
dest->TexCoord4dv = loopback_TexCoord4dv;
dest->TexCoord4iv = loopback_TexCoord4iv;
dest->TexCoord4sv = loopback_TexCoord4sv;
dest->Vertex2d = loopback_Vertex2d;
dest->Vertex2i = loopback_Vertex2i;
dest->Vertex2s = loopback_Vertex2s;
dest->Vertex3d = loopback_Vertex3d;
dest->Vertex3i = loopback_Vertex3i;
dest->Vertex3s = loopback_Vertex3s;
dest->Vertex4d = loopback_Vertex4d;
dest->Vertex4i = loopback_Vertex4i;
dest->Vertex4s = loopback_Vertex4s;
dest->Vertex2dv = loopback_Vertex2dv;
dest->Vertex2iv = loopback_Vertex2iv;
dest->Vertex2sv = loopback_Vertex2sv;
dest->Vertex3dv = loopback_Vertex3dv;
dest->Vertex3iv = loopback_Vertex3iv;
dest->Vertex3sv = loopback_Vertex3sv;
dest->Vertex4dv = loopback_Vertex4dv;
dest->Vertex4iv = loopback_Vertex4iv;
dest->Vertex4sv = loopback_Vertex4sv;
dest->MultiTexCoord1dARB = loopback_MultiTexCoord1dARB;
dest->MultiTexCoord1dvARB = loopback_MultiTexCoord1dvARB;
dest->MultiTexCoord1iARB = loopback_MultiTexCoord1iARB;
dest->MultiTexCoord1ivARB = loopback_MultiTexCoord1ivARB;
dest->MultiTexCoord1sARB = loopback_MultiTexCoord1sARB;
dest->MultiTexCoord1svARB = loopback_MultiTexCoord1svARB;
dest->MultiTexCoord2dARB = loopback_MultiTexCoord2dARB;
dest->MultiTexCoord2dvARB = loopback_MultiTexCoord2dvARB;
dest->MultiTexCoord2iARB = loopback_MultiTexCoord2iARB;
dest->MultiTexCoord2ivARB = loopback_MultiTexCoord2ivARB;
dest->MultiTexCoord2sARB = loopback_MultiTexCoord2sARB;
dest->MultiTexCoord2svARB = loopback_MultiTexCoord2svARB;
dest->MultiTexCoord3dARB = loopback_MultiTexCoord3dARB;
dest->MultiTexCoord3dvARB = loopback_MultiTexCoord3dvARB;
dest->MultiTexCoord3iARB = loopback_MultiTexCoord3iARB;
dest->MultiTexCoord3ivARB = loopback_MultiTexCoord3ivARB;
dest->MultiTexCoord3sARB = loopback_MultiTexCoord3sARB;
dest->MultiTexCoord3svARB = loopback_MultiTexCoord3svARB;
dest->MultiTexCoord4dARB = loopback_MultiTexCoord4dARB;
dest->MultiTexCoord4dvARB = loopback_MultiTexCoord4dvARB;
dest->MultiTexCoord4iARB = loopback_MultiTexCoord4iARB;
dest->MultiTexCoord4ivARB = loopback_MultiTexCoord4ivARB;
dest->MultiTexCoord4sARB = loopback_MultiTexCoord4sARB;
dest->MultiTexCoord4svARB = loopback_MultiTexCoord4svARB;
dest->EvalCoord2dv = loopback_EvalCoord2dv;
dest->EvalCoord2fv = loopback_EvalCoord2fv;
dest->EvalCoord2d = loopback_EvalCoord2d;
dest->EvalCoord1dv = loopback_EvalCoord1dv;
dest->EvalCoord1fv = loopback_EvalCoord1fv;
dest->EvalCoord1d = loopback_EvalCoord1d;
dest->Materialf = loopback_Materialf;
dest->Materiali = loopback_Materiali;
dest->Materialiv = loopback_Materialiv;
dest->Rectd = loopback_Rectd;
dest->Rectdv = loopback_Rectdv;
dest->Rectfv = loopback_Rectfv;
dest->Recti = loopback_Recti;
dest->Rectiv = loopback_Rectiv;
dest->Rects = loopback_Rects;
dest->Rectsv = loopback_Rectsv;
dest->FogCoorddEXT = loopback_FogCoorddEXT;
dest->FogCoorddvEXT = loopback_FogCoorddvEXT;
 
dest->VertexAttrib1sNV = loopback_VertexAttrib1sNV;
dest->VertexAttrib1fNV = loopback_VertexAttrib1fNV;
dest->VertexAttrib1dNV = loopback_VertexAttrib1dNV;
dest->VertexAttrib2sNV = loopback_VertexAttrib2sNV;
dest->VertexAttrib2fNV = loopback_VertexAttrib2fNV;
dest->VertexAttrib2dNV = loopback_VertexAttrib2dNV;
dest->VertexAttrib3sNV = loopback_VertexAttrib3sNV;
dest->VertexAttrib3fNV = loopback_VertexAttrib3fNV;
dest->VertexAttrib3dNV = loopback_VertexAttrib3dNV;
dest->VertexAttrib4sNV = loopback_VertexAttrib4sNV;
dest->VertexAttrib4dNV = loopback_VertexAttrib4dNV;
dest->VertexAttrib4ubNV = loopback_VertexAttrib4ubNV;
 
dest->VertexAttrib1svNV = loopback_VertexAttrib1svNV;
dest->VertexAttrib1fvNV = loopback_VertexAttrib1fvNV;
dest->VertexAttrib1dvNV = loopback_VertexAttrib1dvNV;
dest->VertexAttrib2svNV = loopback_VertexAttrib2svNV;
dest->VertexAttrib2fvNV = loopback_VertexAttrib2fvNV;
dest->VertexAttrib2dvNV = loopback_VertexAttrib2dvNV;
dest->VertexAttrib3svNV = loopback_VertexAttrib3svNV;
dest->VertexAttrib3fvNV = loopback_VertexAttrib3fvNV;
dest->VertexAttrib3dvNV = loopback_VertexAttrib3dvNV;
dest->VertexAttrib4svNV = loopback_VertexAttrib4svNV;
dest->VertexAttrib4fvNV = loopback_VertexAttrib4fvNV;
dest->VertexAttrib4dvNV = loopback_VertexAttrib4dvNV;
dest->VertexAttrib4ubvNV = loopback_VertexAttrib4ubvNV;
 
dest->VertexAttribs1svNV = loopback_VertexAttribs1svNV;
dest->VertexAttribs1fvNV = loopback_VertexAttribs1fvNV;
dest->VertexAttribs1dvNV = loopback_VertexAttribs1dvNV;
dest->VertexAttribs2svNV = loopback_VertexAttribs2svNV;
dest->VertexAttribs2fvNV = loopback_VertexAttribs2fvNV;
dest->VertexAttribs2dvNV = loopback_VertexAttribs2dvNV;
dest->VertexAttribs3svNV = loopback_VertexAttribs3svNV;
dest->VertexAttribs3fvNV = loopback_VertexAttribs3fvNV;
dest->VertexAttribs3dvNV = loopback_VertexAttribs3dvNV;
dest->VertexAttribs4svNV = loopback_VertexAttribs4svNV;
dest->VertexAttribs4fvNV = loopback_VertexAttribs4fvNV;
dest->VertexAttribs4dvNV = loopback_VertexAttribs4dvNV;
dest->VertexAttribs4ubvNV = loopback_VertexAttribs4ubvNV;
 
}
/shark/trunk/ports/mesa/src/texutil_tmp.h
0,0 → 1,479
/* $Id: texutil_tmp.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.0.2
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Gareth Hughes
*/
 
 
/*
* For 2D and 3D texture images, we generate functions for
* - conversion without pixel unpacking and standard stride
* - conversion without pixel unpacking and non-standard stride
* - conversion with pixel unpacking and standard stride
* - conversion with pixel unpacking and non-standard stride
*
*
* Macros which need to be defined before including this file:
* TAG(x) - the function name wrapper
* DST_TYPE - the destination texel datatype (GLuint, GLushort, etc)
* DST_TEXELS_PER_DWORD - number of dest texels that'll fit in 4 bytes
* CONVERT_TEXEL - code to convert from source to dest texel
* CONVER_TEXEL_DWORD - if multiple texels fit in 4 bytes, this macros
* will convert/store multiple texels at once
* CONVERT_DIRECT - if defined, just memcpy texels from src to dest
* SRC_TEXEL_BYTES - bytes per source texel
* PRESERVE_DST_TYPE - if defined, don't undefined these macros at end
*/
 
 
#define DST_TEXEL_BYTES (4 / DST_TEXELS_PER_DWORD)
#define DST_ROW_BYTES (convert->width * DST_TEXEL_BYTES)
#define DST_ROW_STRIDE (convert->dstImageWidth * DST_TEXEL_BYTES)
#define DST_IMG_STRIDE (convert->dstImageWidth * \
convert->dstImageHeight * DST_TEXEL_BYTES)
 
 
/* =============================================================
* PRE: No pixelstore attribs, width == dstImageWidth.
*/
static GLboolean
TAG(texsubimage2d)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ "\n" );
#endif
 
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, convert->height * DST_ROW_BYTES );
#else
{
const GLint texels = convert->width * convert->height;
const GLint dwords = texels / DST_TEXELS_PER_DWORD;
const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
GLint i;
for ( i = 0 ; i < dwords ; i++ ) {
CONVERT_TEXEL_DWORD( *dst++, src );
src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
}
for ( i = 0; i < leftover; i++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
}
#endif
 
return GL_TRUE;
}
 
/* PRE: As above, height == dstImageHeight also.
*/
static GLboolean
TAG(texsubimage3d)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->height +
convert->yoffset) * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ "\n" );
#endif
 
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, convert->depth * convert->height * DST_ROW_BYTES );
#else
{
const GLint texels = convert->width * convert->height * convert->depth;
const GLint dwords = texels / DST_TEXELS_PER_DWORD;
const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
GLint i;
for ( i = 0 ; i < dwords ; i++ ) {
CONVERT_TEXEL_DWORD( *dst++, src );
src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
}
for ( i = 0; i < leftover; i++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
}
#endif
 
return GL_TRUE;
}
 
 
 
/* =============================================================
* PRE: No pixelstore attribs, width != dstImageWidth.
*/
static GLboolean
TAG(texsubimage2d_stride)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
GLint adjust;
GLint row, col;
 
adjust = convert->dstImageWidth - convert->width;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
_mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
 
for ( row = 0 ; row < convert->height ; row++ ) {
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
dst += adjust;
}
 
return GL_TRUE;
}
 
/* PRE: As above, or height != dstImageHeight also.
*/
static GLboolean
TAG(texsubimage3d_stride)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->dstImageHeight +
convert->yoffset) * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
GLint adjust;
GLint row, col, img;
 
adjust = convert->dstImageWidth - convert->width;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
_mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
 
for ( img = 0 ; img < convert->depth ; img++ ) {
for ( row = 0 ; row < convert->height ; row++ ) {
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
dst += adjust;
}
/* FIXME: ... */
}
 
return GL_TRUE;
}
 
 
 
/* =============================================================
* PRE: Require pixelstore attribs, width == dstImageWidth.
*/
static GLboolean
TAG(texsubimage2d_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcRowStride =
_mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
GLint row, col;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ "\n" );
#endif
 
if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
/* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
* or width = 2 and texels/dword = 4).
*/
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
for ( row = 0 ; row < convert->height ; row++ ) {
const GLubyte *srcRow = src;
for ( col = 0; col < convert->width; col++ ) {
CONVERT_TEXEL(*dst, src);
src += SRC_TEXEL_BYTES;
}
src = srcRow + srcRowStride;
}
}
else {
/* the common case */
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, DST_ROW_STRIDE );
src += srcRowStride;
dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
#else
const GLubyte *srcRow = src;
for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
CONVERT_TEXEL_DWORD( *dst++, src );
src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
}
src = srcRow + srcRowStride;
#endif
}
}
 
return GL_TRUE;
}
 
/* PRE: as above, height == dstImageHeight also.
*/
static GLboolean
TAG(texsubimage3d_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcImgStride = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 1, 0, 0 ) - src;
const GLint srcRowStride =
_mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
GLint row, col, img;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ "\n" );
#endif
 
if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
/* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
* or width = 2 and texels/dword = 4).
*/
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->height +
convert->yoffset) * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
for ( img = 0 ; img < convert->depth ; img++ ) {
const GLubyte *srcImage = src;
for ( row = 0 ; row < convert->height ; row++ ) {
const GLubyte *srcRow = src;
for ( col = 0; col < convert->width; col++ ) {
CONVERT_TEXEL(*dst, src);
src += SRC_TEXEL_BYTES;
}
src = srcRow + srcRowStride;
}
src = srcImage + srcImgStride;
}
}
else {
/* the common case */
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->height +
convert->yoffset) * convert->width +
convert->xoffset) * DST_TEXEL_BYTES);
for ( img = 0 ; img < convert->depth ; img++ ) {
const GLubyte *srcImage = src;
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, DST_ROW_STRIDE );
src += srcRowStride;
dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
#else
const GLubyte *srcRow = src;
for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
CONVERT_TEXEL_DWORD( *dst++, src );
src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
}
src = srcRow + srcRowStride;
#endif
}
src = srcImage + srcImgStride;
}
}
 
return GL_TRUE;
}
 
 
 
/* =============================================================
* PRE: Require pixelstore attribs, width != dstImageWidth.
*/
static GLboolean
TAG(texsubimage2d_stride_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcRowStride =
_mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
GLint adjust;
GLint row, col;
(void) col;
 
adjust = convert->dstImageWidth - convert->width;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
_mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
 
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, DST_ROW_BYTES );
src += srcRowStride;
dst += convert->dstImageWidth;
#else
const GLubyte *srcRow = src;
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
src = srcRow + srcRowStride;
dst += adjust;
#endif
}
 
return GL_TRUE;
}
 
/* PRE: As above, or height != dstImageHeight also.
*/
static GLboolean
TAG(texsubimage3d_stride_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 0, 0, 0 );
const GLint srcImgStride = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
convert->width, convert->height,
convert->format, convert->type, 1, 0, 0 ) - src;
const GLint srcRowStride =
_mesa_image_row_stride( convert->unpacking, convert->width,
convert->format, convert->type );
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
((convert->zoffset * convert->dstImageHeight +
convert->yoffset) * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
GLint adjust;
GLint row, col, img;
(void) col;
 
adjust = convert->dstImageWidth - convert->width;
 
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
_mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
 
for ( img = 0 ; img < convert->depth ; img++ ) {
const GLubyte *srcImage = src;
for ( row = 0 ; row < convert->height ; row++ ) {
#ifdef CONVERT_DIRECT
MEMCPY( dst, src, DST_ROW_BYTES );
src += srcRowStride;
dst += convert->dstImageWidth;
#else
const GLubyte *srcRow = src;
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
}
src = srcRow + srcRowStride;
dst += adjust;
#endif
}
src = srcImage + srcImgStride;
}
 
return GL_TRUE;
}
 
 
 
static convert_func TAG(texsubimage2d_tab)[] = {
TAG(texsubimage2d),
TAG(texsubimage2d_stride),
TAG(texsubimage2d_unpack),
TAG(texsubimage2d_stride_unpack),
};
 
static convert_func TAG(texsubimage3d_tab)[] = {
TAG(texsubimage3d),
TAG(texsubimage3d_stride),
TAG(texsubimage3d_unpack),
TAG(texsubimage3d_stride_unpack),
};
 
 
#ifndef PRESERVE_DST_TYPE
#undef DST_TYPE
#undef DST_TEXELS_PER_DWORD
#endif
 
#undef SRC_TEXEL_BYTES
#undef DST_TEXEL_BYTES
#undef DST_ROW_BYTES
#undef DST_ROW_STRIDE
 
#undef CONVERT_TEXEL
#undef CONVERT_TEXEL_DWORD
#undef CONVERT_DIRECT
 
#undef TAG
 
#undef PRESERVE_DST_TYPE
/shark/trunk/ports/mesa/src/feedback.c
0,0 → 1,405
/* $Id: feedback.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "feedback.h"
#include "macros.h"
#include "mmath.h"
#include "mtypes.h"
 
 
 
#define FB_3D 0x01
#define FB_4D 0x02
#define FB_INDEX 0x04
#define FB_COLOR 0x08
#define FB_TEXTURE 0X10
 
 
 
void
_mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode==GL_FEEDBACK) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glFeedbackBuffer" );
return;
}
if (size<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(size<0)" );
return;
}
if (!buffer) {
_mesa_error( ctx, GL_INVALID_VALUE, "glFeedbackBuffer(buffer==NULL)" );
ctx->Feedback.BufferSize = 0;
return;
}
 
switch (type) {
case GL_2D:
ctx->Feedback._Mask = 0;
break;
case GL_3D:
ctx->Feedback._Mask = FB_3D;
break;
case GL_3D_COLOR:
ctx->Feedback._Mask = (FB_3D |
(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX));
break;
case GL_3D_COLOR_TEXTURE:
ctx->Feedback._Mask = (FB_3D |
(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX) |
FB_TEXTURE);
break;
case GL_4D_COLOR_TEXTURE:
ctx->Feedback._Mask = (FB_3D | FB_4D |
(ctx->Visual.rgbMode ? FB_COLOR : FB_INDEX) |
FB_TEXTURE);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glFeedbackBuffer" );
return;
}
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE); /* Always flush */
ctx->Feedback.Type = type;
ctx->Feedback.BufferSize = size;
ctx->Feedback.Buffer = buffer;
ctx->Feedback.Count = 0; /* Becaues of this. */
}
 
 
void
_mesa_PassThrough( GLfloat token )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode==GL_FEEDBACK) {
FLUSH_VERTICES(ctx, 0);
FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_PASS_THROUGH_TOKEN );
FEEDBACK_TOKEN( ctx, token );
}
}
 
 
 
/*
* Put a vertex into the feedback buffer.
*/
void _mesa_feedback_vertex( GLcontext *ctx,
const GLfloat win[4],
const GLfloat color[4],
GLuint index,
const GLfloat texcoord[4] )
{
FEEDBACK_TOKEN( ctx, win[0] );
FEEDBACK_TOKEN( ctx, win[1] );
if (ctx->Feedback._Mask & FB_3D) {
FEEDBACK_TOKEN( ctx, win[2] );
}
if (ctx->Feedback._Mask & FB_4D) {
FEEDBACK_TOKEN( ctx, win[3] );
}
if (ctx->Feedback._Mask & FB_INDEX) {
FEEDBACK_TOKEN( ctx, (GLfloat) index );
}
if (ctx->Feedback._Mask & FB_COLOR) {
FEEDBACK_TOKEN( ctx, color[0] );
FEEDBACK_TOKEN( ctx, color[1] );
FEEDBACK_TOKEN( ctx, color[2] );
FEEDBACK_TOKEN( ctx, color[3] );
}
if (ctx->Feedback._Mask & FB_TEXTURE) {
FEEDBACK_TOKEN( ctx, texcoord[0] );
FEEDBACK_TOKEN( ctx, texcoord[1] );
FEEDBACK_TOKEN( ctx, texcoord[2] );
FEEDBACK_TOKEN( ctx, texcoord[3] );
}
}
 
 
/**********************************************************************/
/* Selection */
/**********************************************************************/
 
 
/*
* NOTE: this function can't be put in a display list.
*/
void
_mesa_SelectBuffer( GLsizei size, GLuint *buffer )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode==GL_SELECT) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glSelectBuffer" );
return; /* KW: added return */
}
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE); /* why bother? */
ctx->Select.Buffer = buffer;
ctx->Select.BufferSize = size;
ctx->Select.BufferCount = 0;
ctx->Select.HitFlag = GL_FALSE;
ctx->Select.HitMinZ = 1.0;
ctx->Select.HitMaxZ = 0.0;
}
 
 
#define WRITE_RECORD( CTX, V ) \
if (CTX->Select.BufferCount < CTX->Select.BufferSize) { \
CTX->Select.Buffer[CTX->Select.BufferCount] = (V); \
} \
CTX->Select.BufferCount++;
 
 
 
void _mesa_update_hitflag( GLcontext *ctx, GLfloat z )
{
ctx->Select.HitFlag = GL_TRUE;
if (z < ctx->Select.HitMinZ) {
ctx->Select.HitMinZ = z;
}
if (z > ctx->Select.HitMaxZ) {
ctx->Select.HitMaxZ = z;
}
}
 
 
static void write_hit_record( GLcontext *ctx )
{
GLuint i;
GLuint zmin, zmax, zscale = (~0u);
 
/* HitMinZ and HitMaxZ are in [0,1]. Multiply these values by */
/* 2^32-1 and round to nearest unsigned integer. */
 
assert( ctx != NULL ); /* this line magically fixes a SunOS 5.x/gcc bug */
zmin = (GLuint) ((GLfloat) zscale * ctx->Select.HitMinZ);
zmax = (GLuint) ((GLfloat) zscale * ctx->Select.HitMaxZ);
 
WRITE_RECORD( ctx, ctx->Select.NameStackDepth );
WRITE_RECORD( ctx, zmin );
WRITE_RECORD( ctx, zmax );
for (i = 0; i < ctx->Select.NameStackDepth; i++) {
WRITE_RECORD( ctx, ctx->Select.NameStack[i] );
}
 
ctx->Select.Hits++;
ctx->Select.HitFlag = GL_FALSE;
ctx->Select.HitMinZ = 1.0;
ctx->Select.HitMaxZ = -1.0;
}
 
 
 
void
_mesa_InitNames( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
/* Record the hit before the HitFlag is wiped out again. */
if (ctx->RenderMode == GL_SELECT) {
if (ctx->Select.HitFlag) {
write_hit_record( ctx );
}
}
ctx->Select.NameStackDepth = 0;
ctx->Select.HitFlag = GL_FALSE;
ctx->Select.HitMinZ = 1.0;
ctx->Select.HitMaxZ = 0.0;
ctx->NewState |= _NEW_RENDERMODE;
}
 
 
 
void
_mesa_LoadName( GLuint name )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode != GL_SELECT) {
return;
}
if (ctx->Select.NameStackDepth == 0) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glLoadName" );
return;
}
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
 
if (ctx->Select.HitFlag) {
write_hit_record( ctx );
}
if (ctx->Select.NameStackDepth < MAX_NAME_STACK_DEPTH) {
ctx->Select.NameStack[ctx->Select.NameStackDepth-1] = name;
}
else {
ctx->Select.NameStack[MAX_NAME_STACK_DEPTH-1] = name;
}
}
 
 
void
_mesa_PushName( GLuint name )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode != GL_SELECT) {
return;
}
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
if (ctx->Select.HitFlag) {
write_hit_record( ctx );
}
if (ctx->Select.NameStackDepth >= MAX_NAME_STACK_DEPTH) {
_mesa_error( ctx, GL_STACK_OVERFLOW, "glPushName" );
}
else
ctx->Select.NameStack[ctx->Select.NameStackDepth++] = name;
}
 
 
 
void
_mesa_PopName( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->RenderMode != GL_SELECT) {
return;
}
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
if (ctx->Select.HitFlag) {
write_hit_record( ctx );
}
if (ctx->Select.NameStackDepth == 0) {
_mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopName" );
}
else
ctx->Select.NameStackDepth--;
}
 
 
 
/**********************************************************************/
/* Render Mode */
/**********************************************************************/
 
 
 
/*
* NOTE: this function can't be put in a display list.
*/
GLint
_mesa_RenderMode( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
GLint result;
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glRenderMode %s\n", _mesa_lookup_enum_by_nr(mode));
 
FLUSH_VERTICES(ctx, _NEW_RENDERMODE);
 
switch (ctx->RenderMode) {
case GL_RENDER:
result = 0;
break;
case GL_SELECT:
if (ctx->Select.HitFlag) {
write_hit_record( ctx );
}
if (ctx->Select.BufferCount > ctx->Select.BufferSize) {
/* overflow */
#ifdef DEBUG
_mesa_warning(ctx, "Feedback buffer overflow");
#endif
result = -1;
}
else {
result = ctx->Select.Hits;
}
ctx->Select.BufferCount = 0;
ctx->Select.Hits = 0;
ctx->Select.NameStackDepth = 0;
break;
case GL_FEEDBACK:
if (ctx->Feedback.Count > ctx->Feedback.BufferSize) {
/* overflow */
result = -1;
}
else {
result = ctx->Feedback.Count;
}
ctx->Feedback.Count = 0;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
return 0;
}
 
switch (mode) {
case GL_RENDER:
break;
case GL_SELECT:
if (ctx->Select.BufferSize==0) {
/* haven't called glSelectBuffer yet */
_mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
}
break;
case GL_FEEDBACK:
if (ctx->Feedback.BufferSize==0) {
/* haven't called glFeedbackBuffer yet */
_mesa_error( ctx, GL_INVALID_OPERATION, "glRenderMode" );
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glRenderMode" );
return 0;
}
 
ctx->RenderMode = mode;
if (ctx->Driver.RenderMode)
ctx->Driver.RenderMode( ctx, mode );
 
return result;
}
/shark/trunk/ports/mesa/src/polygon.c
0,0 → 1,205
/* $Id: polygon.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "context.h"
#include "image.h"
#include "enums.h"
#include "macros.h"
#include "polygon.h"
#include "mtypes.h"
 
 
void
_mesa_CullFace( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glCullFace %s\n", _mesa_lookup_enum_by_nr(mode));
 
if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" );
return;
}
 
if (ctx->Polygon.CullFaceMode == mode)
return;
 
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.CullFaceMode = mode;
 
if (ctx->Driver.CullFace)
ctx->Driver.CullFace( ctx, mode );
}
 
 
 
void
_mesa_FrontFace( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glFrontFace %s\n", _mesa_lookup_enum_by_nr(mode));
 
if (mode!=GL_CW && mode!=GL_CCW) {
_mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
return;
}
 
if (ctx->Polygon.FrontFace == mode)
return;
 
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.FrontFace = mode;
 
ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW);
 
if (ctx->Driver.FrontFace)
ctx->Driver.FrontFace( ctx, mode );
}
 
 
 
void
_mesa_PolygonMode( GLenum face, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glPolygonMode %s %s\n",
_mesa_lookup_enum_by_nr(face),
_mesa_lookup_enum_by_nr(mode));
 
if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
_mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
return;
}
 
switch (face) {
case GL_FRONT:
if (ctx->Polygon.FrontMode == mode)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.FrontMode = mode;
break;
case GL_FRONT_AND_BACK:
if (ctx->Polygon.FrontMode == mode &&
ctx->Polygon.BackMode == mode)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.FrontMode = mode;
ctx->Polygon.BackMode = mode;
break;
case GL_BACK:
if (ctx->Polygon.BackMode == mode)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.BackMode = mode;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
return;
}
 
ctx->_TriangleCaps &= ~DD_TRI_UNFILLED;
if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL)
ctx->_TriangleCaps |= DD_TRI_UNFILLED;
 
if (ctx->Driver.PolygonMode) {
(*ctx->Driver.PolygonMode)( ctx, face, mode );
}
}
 
 
 
void
_mesa_PolygonStipple( const GLubyte *pattern )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glPolygonStipple\n");
 
FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE);
_mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
 
if (ctx->Driver.PolygonStipple)
ctx->Driver.PolygonStipple( ctx, (const GLubyte *) ctx->PolygonStipple );
}
 
 
 
void
_mesa_GetPolygonStipple( GLubyte *dest )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glGetPolygonStipple\n");
 
_mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
}
 
 
 
void
_mesa_PolygonOffset( GLfloat factor, GLfloat units )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glPolygonOffset %f %f\n", factor, units);
 
if (ctx->Polygon.OffsetFactor == factor &&
ctx->Polygon.OffsetUnits == units)
return;
 
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.OffsetFactor = factor;
ctx->Polygon.OffsetUnits = units;
 
if (ctx->Driver.PolygonOffset)
ctx->Driver.PolygonOffset( ctx, factor, units );
}
 
 
 
void
_mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
{
GET_CURRENT_CONTEXT(ctx);
_mesa_PolygonOffset(factor, bias * ctx->DepthMaxF );
}
/shark/trunk/ports/mesa/src/clip.c
0,0 → 1,120
/* $Id: clip.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "clip.h"
#include "context.h"
#include "macros.h"
#include "mmath.h"
#include "mtypes.h"
 
#include "math/m_xform.h"
#include "math/m_matrix.h"
 
 
 
/**********************************************************************/
/* Get/Set User clip-planes. */
/**********************************************************************/
 
 
 
void
_mesa_ClipPlane( GLenum plane, const GLdouble *eq )
{
GET_CURRENT_CONTEXT(ctx);
GLint p;
GLfloat equation[4];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
if (p < 0 || p >= (GLint) ctx->Const.MaxClipPlanes) {
_mesa_error( ctx, GL_INVALID_ENUM, "glClipPlane" );
return;
}
 
equation[0] = (GLfloat) eq[0];
equation[1] = (GLfloat) eq[1];
equation[2] = (GLfloat) eq[2];
equation[3] = (GLfloat) eq[3];
 
/*
* The equation is transformed by the transpose of the inverse of the
* current modelview matrix and stored in the resulting eye coordinates.
*
* KW: Eqn is then transformed to the current clip space, where user
* clipping now takes place. The clip-space equations are recalculated
* whenever the projection matrix changes.
*/
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY)
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
 
_mesa_transform_vector( equation, equation,
ctx->ModelviewMatrixStack.Top->inv );
 
if (TEST_EQ_4V(ctx->Transform.EyeUserPlane[p], equation))
return;
 
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
COPY_4FV(ctx->Transform.EyeUserPlane[p], equation);
 
/* Update derived state. This state also depends on the projection
* matrix, and is recalculated on changes to the projection matrix by
* code in _mesa_update_state().
*/
if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY)
_math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
_mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
ctx->Transform.EyeUserPlane[p],
ctx->ProjectionMatrixStack.Top->inv );
}
 
if (ctx->Driver.ClipPlane)
ctx->Driver.ClipPlane( ctx, plane, equation );
}
 
 
void
_mesa_GetClipPlane( GLenum plane, GLdouble *equation )
{
GET_CURRENT_CONTEXT(ctx);
GLint p;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
p = (GLint) (plane - GL_CLIP_PLANE0);
if (p < 0 || p >= (GLint) ctx->Const.MaxClipPlanes) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetClipPlane" );
return;
}
 
equation[0] = (GLdouble) ctx->Transform.EyeUserPlane[p][0];
equation[1] = (GLdouble) ctx->Transform.EyeUserPlane[p][1];
equation[2] = (GLdouble) ctx->Transform.EyeUserPlane[p][2];
equation[3] = (GLdouble) ctx->Transform.EyeUserPlane[p][3];
}
/shark/trunk/ports/mesa/src/api_validate.h
0,0 → 1,50
/* $Id: api_validate.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef API_VALIDATE_H
#define API_VALIDATE_H
 
 
#include "mtypes.h"
 
extern GLboolean
_mesa_validate_DrawArrays(GLcontext *ctx,
GLenum mode, GLint start, GLsizei count);
 
extern GLboolean
_mesa_validate_DrawElements(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices);
 
extern GLboolean
_mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
GLuint start, GLuint end,
GLsizei count, GLenum type,
const GLvoid *indices);
 
 
#endif
/shark/trunk/ports/mesa/src/api_loopback.h
0,0 → 1,40
/* $Id: api_loopback.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#ifndef API_LOOPBACK_H
#define API_LOOPBACK_H
 
#include "glheader.h"
 
struct _glapi_table;
 
extern void _mesa_loopback_prefer_float( struct _glapi_table *dest,
GLboolean prefer_float_colors );
 
extern void _mesa_loopback_init_api_table( struct _glapi_table *dest,
GLboolean prefer_float_colors );
 
#endif
/shark/trunk/ports/mesa/src/feedback.h
0,0 → 1,77
/* $Id: feedback.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef FEEDBACK_H
#define FEEDBACK_H
 
 
#include "mtypes.h"
 
 
#define FEEDBACK_TOKEN( CTX, T ) \
if (CTX->Feedback.Count < CTX->Feedback.BufferSize) { \
CTX->Feedback.Buffer[CTX->Feedback.Count] = (GLfloat) (T); \
} \
CTX->Feedback.Count++;
 
 
extern void _mesa_feedback_vertex( GLcontext *ctx,
const GLfloat win[4],
const GLfloat color[4],
GLuint index,
const GLfloat texcoord[4] );
 
 
extern void _mesa_update_hitflag( GLcontext *ctx, GLfloat z );
 
 
extern void
_mesa_PassThrough( GLfloat token );
 
extern void
_mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer );
 
extern void
_mesa_SelectBuffer( GLsizei size, GLuint *buffer );
 
extern void
_mesa_InitNames( void );
 
extern void
_mesa_LoadName( GLuint name );
 
extern void
_mesa_PushName( GLuint name );
 
extern void
_mesa_PopName( void );
 
extern GLint
_mesa_RenderMode( GLenum mode );
 
 
#endif
/shark/trunk/ports/mesa/src/vsnprintf.c
0,0 → 1,163
/*
* Revision 12: http://theos.com/~deraadt/snprintf.c
*
* Copyright (c) 1997 Theo de Raadt
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
#include <sys/param.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <signal.h>
#include <stdio.h>
#if __STDC__
#include <stdarg.h>
#include <stdlib.h>
#else
#include <varargs.h>
#endif
#include <setjmp.h>
#include <unistd.h>
#include <string.h>
 
#ifndef roundup
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#endif
 
#ifdef __sgi
#define size_t ssize_t
#endif
 
static int pgsize;
static char *curobj;
static int caught;
static sigjmp_buf bail;
 
#define EXTRABYTES 2 /* XXX: why 2? you don't want to know */
 
static char *
msetup(str, n)
char *str;
size_t n;
{
char *e;
 
if (n == 0)
return NULL;
if (pgsize == 0)
pgsize = getpagesize();
curobj = (char *)malloc(n + EXTRABYTES + pgsize * 2);
if (curobj == NULL)
return NULL;
e = curobj + n + EXTRABYTES;
e = (char *)roundup((unsigned long)e, pgsize);
if (mprotect(e, pgsize, PROT_NONE) == -1) {
free(curobj);
curobj = NULL;
return NULL;
}
e = e - n - EXTRABYTES;
*e = '\0';
return (e);
}
 
static void
mcatch( int a )
{
siglongjmp(bail, 1);
}
 
static void
mcleanup(str, n, p)
char *str;
size_t n;
char *p;
{
strncpy(str, p, n-1);
str[n-1] = '\0';
if (mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
PROT_READ|PROT_WRITE|PROT_EXEC) == -1)
mprotect((caddr_t)(p + n + EXTRABYTES), pgsize,
PROT_READ|PROT_WRITE);
free(curobj);
}
 
int
#if __STDC__
vsnprintf(char *str, size_t n, char const *fmt, va_list ap)
#else
vsnprintf(str, n, fmt, ap)
char *str;
size_t n;
char *fmt;
char *ap;
#endif
{
struct sigaction osa, nsa;
char *p;
int ret = n + 1; /* if we bail, indicated we overflowed */
 
memset(&nsa, 0, sizeof nsa);
nsa.sa_handler = mcatch;
sigemptyset(&nsa.sa_mask);
 
p = msetup(str, n);
if (p == NULL) {
*str = '\0';
return 0;
}
if (sigsetjmp(bail, 1) == 0) {
if (sigaction(SIGSEGV, &nsa, &osa) == -1) {
mcleanup(str, n, p);
return (0);
}
ret = vsprintf(p, fmt, ap);
}
mcleanup(str, n, p);
(void) sigaction(SIGSEGV, &osa, NULL);
return (ret);
}
 
int
#if __STDC__
snprintf(char *str, size_t n, char const *fmt, ...)
#else
snprintf(str, n, fmt, va_alist)
char *str;
size_t n;
char *fmt;
va_dcl
#endif
{
va_list ap;
#if __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
 
return (vsnprintf(str, n, fmt, ap));
va_end(ap);
}
 
 
 
/shark/trunk/ports/mesa/src/macros.h
0,0 → 1,527
/* $Id: macros.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.0.3
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* A collection of useful macros.
*/
 
 
#ifndef MACROS_H
#define MACROS_H
 
 
#include "glheader.h"
/* Do not reference mtypes.h from this file.
*/
 
 
/* Limits: */
#define MAX_GLUSHORT 0xffff
#define MAX_GLUINT 0xffffffff
 
 
/* Pi */
#ifndef M_PI
#define M_PI (3.1415926)
#endif
 
 
/* Degrees to radians conversion: */
#define DEG2RAD (M_PI/180.0)
 
 
#ifndef NULL
#define NULL 0
#endif
 
 
/* Stepping a GLfloat pointer by a byte stride
*/
#define STRIDE_F(p, i) (p = (GLfloat *)((GLubyte *)p + i))
#define STRIDE_UI(p, i) (p = (GLuint *)((GLubyte *)p + i))
#define STRIDE_4UB(p, i) (p = (GLubyte (*)[4])((GLubyte *)p + i))
#define STRIDE_4CHAN(p, i) (p = (GLchan (*)[4])((GLubyte *)p + i))
#define STRIDE_CHAN(p, i) (p = (GLchan *)((GLubyte *)p + i))
#define STRIDE_T(p, t, i) (p = (t)((GLubyte *)p + i))
 
 
#define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0
#define ZERO_3V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = 0
#define ZERO_4V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0
 
 
#define TEST_EQ_4V(a,b) ((a)[0] == (b)[0] && \
(a)[1] == (b)[1] && \
(a)[2] == (b)[2] && \
(a)[3] == (b)[3])
 
#define TEST_EQ_3V(a,b) ((a)[0] == (b)[0] && \
(a)[1] == (b)[1] && \
(a)[2] == (b)[2])
 
#if defined(__i386__)
#define TEST_EQ_4UBV(DST, SRC) *((GLuint*)(DST)) == *((GLuint*)(SRC))
#else
#define TEST_EQ_4UBV(DST, SRC) TEST_EQ_4V(DST, SRC)
#endif
 
 
 
/* Copy short vectors: */
#define COPY_2V( DST, SRC ) \
do { \
(DST)[0] = (SRC)[0]; \
(DST)[1] = (SRC)[1]; \
} while (0)
 
#define COPY_3V( DST, SRC ) \
do { \
(DST)[0] = (SRC)[0]; \
(DST)[1] = (SRC)[1]; \
(DST)[2] = (SRC)[2]; \
} while (0)
 
#define COPY_4V( DST, SRC ) \
do { \
(DST)[0] = (SRC)[0]; \
(DST)[1] = (SRC)[1]; \
(DST)[2] = (SRC)[2]; \
(DST)[3] = (SRC)[3]; \
} while (0)
 
#define COPY_2V_CAST( DST, SRC, CAST ) \
do { \
(DST)[0] = (CAST)(SRC)[0]; \
(DST)[1] = (CAST)(SRC)[1]; \
} while (0)
 
#define COPY_3V_CAST( DST, SRC, CAST ) \
do { \
(DST)[0] = (CAST)(SRC)[0]; \
(DST)[1] = (CAST)(SRC)[1]; \
(DST)[2] = (CAST)(SRC)[2]; \
} while (0)
 
#define COPY_4V_CAST( DST, SRC, CAST ) \
do { \
(DST)[0] = (CAST)(SRC)[0]; \
(DST)[1] = (CAST)(SRC)[1]; \
(DST)[2] = (CAST)(SRC)[2]; \
(DST)[3] = (CAST)(SRC)[3]; \
} while (0)
 
#if defined(__i386__)
#define COPY_4UBV(DST, SRC) \
do { \
*((GLuint*)(DST)) = *((GLuint*)(SRC)); \
} while (0)
#else
/* The GLuint cast might fail if DST or SRC are not dword-aligned (RISC) */
#define COPY_4UBV(DST, SRC) \
do { \
(DST)[0] = (SRC)[0]; \
(DST)[1] = (SRC)[1]; \
(DST)[2] = (SRC)[2]; \
(DST)[3] = (SRC)[3]; \
} while (0)
#endif
 
#define COPY_2FV( DST, SRC ) \
do { \
const GLfloat *_tmp = (SRC); \
(DST)[0] = _tmp[0]; \
(DST)[1] = _tmp[1]; \
} while (0)
 
#define COPY_3FV( DST, SRC ) \
do { \
const GLfloat *_tmp = (SRC); \
(DST)[0] = _tmp[0]; \
(DST)[1] = _tmp[1]; \
(DST)[2] = _tmp[2]; \
} while (0)
 
#define COPY_4FV( DST, SRC ) \
do { \
const GLfloat *_tmp = (SRC); \
(DST)[0] = _tmp[0]; \
(DST)[1] = _tmp[1]; \
(DST)[2] = _tmp[2]; \
(DST)[3] = _tmp[3]; \
} while (0)
 
 
 
#define COPY_SZ_4V(DST, SZ, SRC) \
do { \
switch (SZ) { \
case 4: (DST)[3] = (SRC)[3]; \
case 3: (DST)[2] = (SRC)[2]; \
case 2: (DST)[1] = (SRC)[1]; \
case 1: (DST)[0] = (SRC)[0]; \
} \
} while(0)
 
#define COPY_CLEAN_4V(DST, SZ, SRC) \
do { \
ASSIGN_4V( DST, 0, 0, 0, 1 ); \
COPY_SZ_4V( DST, SZ, SRC ); \
} while (0)
 
#define SUB_4V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] - (SRCB)[0]; \
(DST)[1] = (SRCA)[1] - (SRCB)[1]; \
(DST)[2] = (SRCA)[2] - (SRCB)[2]; \
(DST)[3] = (SRCA)[3] - (SRCB)[3]; \
} while (0)
 
#define ADD_4V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] + (SRCB)[0]; \
(DST)[1] = (SRCA)[1] + (SRCB)[1]; \
(DST)[2] = (SRCA)[2] + (SRCB)[2]; \
(DST)[3] = (SRCA)[3] + (SRCB)[3]; \
} while (0)
 
#define SCALE_4V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] * (SRCB)[0]; \
(DST)[1] = (SRCA)[1] * (SRCB)[1]; \
(DST)[2] = (SRCA)[2] * (SRCB)[2]; \
(DST)[3] = (SRCA)[3] * (SRCB)[3]; \
} while (0)
 
#define ACC_4V( DST, SRC ) \
do { \
(DST)[0] += (SRC)[0]; \
(DST)[1] += (SRC)[1]; \
(DST)[2] += (SRC)[2]; \
(DST)[3] += (SRC)[3]; \
} while (0)
 
#define ACC_SCALE_4V( DST, SRCA, SRCB ) \
do { \
(DST)[0] += (SRCA)[0] * (SRCB)[0]; \
(DST)[1] += (SRCA)[1] * (SRCB)[1]; \
(DST)[2] += (SRCA)[2] * (SRCB)[2]; \
(DST)[3] += (SRCA)[3] * (SRCB)[3]; \
} while (0)
 
#define ACC_SCALE_SCALAR_4V( DST, S, SRCB ) \
do { \
(DST)[0] += S * (SRCB)[0]; \
(DST)[1] += S * (SRCB)[1]; \
(DST)[2] += S * (SRCB)[2]; \
(DST)[3] += S * (SRCB)[3]; \
} while (0)
 
#define SCALE_SCALAR_4V( DST, S, SRCB ) \
do { \
(DST)[0] = S * (SRCB)[0]; \
(DST)[1] = S * (SRCB)[1]; \
(DST)[2] = S * (SRCB)[2]; \
(DST)[3] = S * (SRCB)[3]; \
} while (0)
 
 
#define SELF_SCALE_SCALAR_4V( DST, S ) \
do { \
(DST)[0] *= S; \
(DST)[1] *= S; \
(DST)[2] *= S; \
(DST)[3] *= S; \
} while (0)
 
 
/*
* Similarly for 3-vectors.
*/
#define SUB_3V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] - (SRCB)[0]; \
(DST)[1] = (SRCA)[1] - (SRCB)[1]; \
(DST)[2] = (SRCA)[2] - (SRCB)[2]; \
} while (0)
 
#define ADD_3V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] + (SRCB)[0]; \
(DST)[1] = (SRCA)[1] + (SRCB)[1]; \
(DST)[2] = (SRCA)[2] + (SRCB)[2]; \
} while (0)
 
#define SCALE_3V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] * (SRCB)[0]; \
(DST)[1] = (SRCA)[1] * (SRCB)[1]; \
(DST)[2] = (SRCA)[2] * (SRCB)[2]; \
} while (0)
 
#define SELF_SCALE_3V( DST, SRC ) \
do { \
(DST)[0] *= (SRC)[0]; \
(DST)[1] *= (SRC)[1]; \
(DST)[2] *= (SRC)[2]; \
} while (0)
 
#define ACC_3V( DST, SRC ) \
do { \
(DST)[0] += (SRC)[0]; \
(DST)[1] += (SRC)[1]; \
(DST)[2] += (SRC)[2]; \
} while (0)
 
#define ACC_SCALE_3V( DST, SRCA, SRCB ) \
do { \
(DST)[0] += (SRCA)[0] * (SRCB)[0]; \
(DST)[1] += (SRCA)[1] * (SRCB)[1]; \
(DST)[2] += (SRCA)[2] * (SRCB)[2]; \
} while (0)
 
#define SCALE_SCALAR_3V( DST, S, SRCB ) \
do { \
(DST)[0] = S * (SRCB)[0]; \
(DST)[1] = S * (SRCB)[1]; \
(DST)[2] = S * (SRCB)[2]; \
} while (0)
 
#define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \
do { \
(DST)[0] += S * (SRCB)[0]; \
(DST)[1] += S * (SRCB)[1]; \
(DST)[2] += S * (SRCB)[2]; \
} while (0)
 
#define SELF_SCALE_SCALAR_3V( DST, S ) \
do { \
(DST)[0] *= S; \
(DST)[1] *= S; \
(DST)[2] *= S; \
} while (0)
 
#define ACC_SCALAR_3V( DST, S ) \
do { \
(DST)[0] += S; \
(DST)[1] += S; \
(DST)[2] += S; \
} while (0)
 
/* And also for 2-vectors
*/
#define SUB_2V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] - (SRCB)[0]; \
(DST)[1] = (SRCA)[1] - (SRCB)[1]; \
} while (0)
 
#define ADD_2V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] + (SRCB)[0]; \
(DST)[1] = (SRCA)[1] + (SRCB)[1]; \
} while (0)
 
#define SCALE_2V( DST, SRCA, SRCB ) \
do { \
(DST)[0] = (SRCA)[0] * (SRCB)[0]; \
(DST)[1] = (SRCA)[1] * (SRCB)[1]; \
} while (0)
 
#define ACC_2V( DST, SRC ) \
do { \
(DST)[0] += (SRC)[0]; \
(DST)[1] += (SRC)[1]; \
} while (0)
 
#define ACC_SCALE_2V( DST, SRCA, SRCB ) \
do { \
(DST)[0] += (SRCA)[0] * (SRCB)[0]; \
(DST)[1] += (SRCA)[1] * (SRCB)[1]; \
} while (0)
 
#define SCALE_SCALAR_2V( DST, S, SRCB ) \
do { \
(DST)[0] = S * (SRCB)[0]; \
(DST)[1] = S * (SRCB)[1]; \
} while (0)
 
#define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \
do { \
(DST)[0] += S * (SRCB)[0]; \
(DST)[1] += S * (SRCB)[1]; \
} while (0)
 
#define SELF_SCALE_SCALAR_2V( DST, S ) \
do { \
(DST)[0] *= S; \
(DST)[1] *= S; \
} while (0)
 
#define ACC_SCALAR_2V( DST, S ) \
do { \
(DST)[0] += S; \
(DST)[1] += S; \
} while (0)
 
 
 
/* Assign scalers to short vectors: */
#define ASSIGN_2V( V, V0, V1 ) \
do { \
V[0] = V0; \
V[1] = V1; \
} while(0)
 
#define ASSIGN_3V( V, V0, V1, V2 ) \
do { \
V[0] = V0; \
V[1] = V1; \
V[2] = V2; \
} while(0)
 
#define ASSIGN_4V( V, V0, V1, V2, V3 ) \
do { \
V[0] = V0; \
V[1] = V1; \
V[2] = V2; \
V[3] = V3; \
} while(0)
 
 
 
 
/* Absolute value (for Int, Float, Double): */
#define ABSI(X) ((X) < 0 ? -(X) : (X))
#define ABSF(X) ((X) < 0.0F ? -(X) : (X))
#define ABSD(X) ((X) < 0.0 ? -(X) : (X))
 
 
 
/* Round a floating-point value to the nearest integer: */
#define ROUNDF(X) ( (X)<0.0F ? ((GLint) ((X)-0.5F)) : ((GLint) ((X)+0.5F)) )
 
 
/* Compute ceiling of integer quotient of A divided by B: */
#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
 
 
/* Clamp X to [MIN,MAX]: */
#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) )
 
/* Assign X to CLAMP(X, MIN, MAX) */
#define CLAMP_SELF(x, mn, mx) \
( (x)<(mn) ? ((x) = (mn)) : ((x)>(mx) ? ((x)=(mx)) : (x)) )
 
 
 
/* Min of two values: */
#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) )
 
/* MAX of two values: */
#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) )
 
/* Dot product of two 2-element vectors */
#define DOT2( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] )
 
/* Dot product of two 3-element vectors */
#define DOT3( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] )
 
/* Dot product of two 4-element vectors */
#define DOT4( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + \
(a)[2]*(b)[2] + (a)[3]*(b)[3] )
 
#define DOT4V(v,a,b,c,d) (v[0]*(a) + v[1]*(b) + v[2]*(c) + v[3]*(d))
 
 
#define CROSS3(n, u, v) \
do { \
(n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \
(n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \
(n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]; \
} while (0)
 
 
 
/* Generic color packing macros
* XXX We may move these into texutil.h at some point.
*/
 
#define PACK_COLOR_8888( a, b, c, d ) \
(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
 
#define PACK_COLOR_888( a, b, c ) \
(((a) << 16) | ((b) << 8) | (c))
 
#define PACK_COLOR_565( a, b, c ) \
((((a) & 0xf8) << 8) | (((b) & 0xfc) << 3) | (((c) & 0xf8) >> 3))
 
#define PACK_COLOR_1555( a, b, c, d ) \
((((b) & 0xf8) << 7) | (((c) & 0xf8) << 2) | (((d) & 0xf8) >> 3) | \
((a) ? 0x8000 : 0))
 
#define PACK_COLOR_4444( a, b, c, d ) \
((((a) & 0xf0) << 8) | (((b) & 0xf0) << 4) | ((c) & 0xf0) | ((d) >> 4))
 
#define PACK_COLOR_88( a, b ) \
(((a) << 8) | (b))
 
#define PACK_COLOR_332( a, b, c ) \
(((a) & 0xe0) | (((b) & 0xe0) >> 3) | (((c) & 0xc0) >> 6))
 
 
#ifdef MESA_BIG_ENDIAN
 
#define PACK_COLOR_8888_LE( a, b, c, d ) PACK_COLOR_8888( d, c, b, a )
 
#define PACK_COLOR_565_LE( a, b, c ) \
(((a) & 0xf8) | (((b) & 0xe0) >> 5) | (((b) & 0x1c) << 11) | \
(((c) & 0xf8) << 5))
 
#define PACK_COLOR_1555_LE( a, b, c, d ) \
((((b) & 0xf8) >> 1) | (((c) & 0xc0) >> 6) | (((c) & 0x38) << 10) | \
(((d) & 0xf8) << 5) | ((a) ? 0x80 : 0))
 
#define PACK_COLOR_4444_LE( a, b, c, d ) PACK_COLOR_4444( c, d, a, b )
 
#define PACK_COLOR_88_LE( a, b ) PACK_COLOR_88( b, a )
 
#else /* little endian */
 
#define PACK_COLOR_8888_LE( a, b, c, d ) PACK_COLOR_8888( a, b, c, d )
 
#define PACK_COLOR_565_LE( a, b, c ) PACK_COLOR_565( a, b, c )
 
#define PACK_COLOR_1555_LE( a, b, c, d ) PACK_COLOR_1555( a, b, c, d )
 
#define PACK_COLOR_4444_LE( a, b, c, d ) PACK_COLOR_4444( a, b, c, d )
 
#define PACK_COLOR_88_LE( a, b ) PACK_COLOR_88( a, b )
 
#endif /* endianness */
 
 
#endif
/shark/trunk/ports/mesa/src/convolve.c
0,0 → 1,1422
/* $Id: convolve.c,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Image convolution functions.
*
* Notes: filter kernel elements are indexed by <n> and <m> as in
* the GL spec.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "convolve.h"
#include "context.h"
#include "image.h"
#include "mtypes.h"
#include "state.h"
 
 
/*
* Given an internalFormat token passed to glConvolutionFilter
* or glSeparableFilter, return the corresponding base format.
* Return -1 if invalid token.
*/
static GLint
base_filter_format( GLenum format )
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return GL_ALPHA;
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return GL_LUMINANCE_ALPHA;
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return GL_INTENSITY;
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return GL_RGB;
case 4:
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
default:
return -1; /* error */
}
}
 
 
void
_mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)
{
GLint baseFormat;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target != GL_CONVOLUTION_1D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter1D(target)");
return;
}
 
baseFormat = base_filter_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter1D(internalFormat)");
return;
}
 
if (width < 0 || width > MAX_CONVOLUTION_WIDTH) {
_mesa_error(ctx, GL_INVALID_VALUE, "glConvolutionFilter1D(width)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glConvolutionFilter1D(format or type)");
return;
}
 
if (format == GL_COLOR_INDEX ||
format == GL_STENCIL_INDEX ||
format == GL_DEPTH_COMPONENT ||
format == GL_INTENSITY ||
type == GL_BITMAP) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter1D(format or type)");
return;
}
 
ctx->Convolution1D.Format = format;
ctx->Convolution1D.InternalFormat = internalFormat;
ctx->Convolution1D.Width = width;
ctx->Convolution1D.Height = 1;
 
/* unpack filter image */
_mesa_unpack_float_color_span(ctx, width, GL_RGBA,
ctx->Convolution1D.Filter,
format, type, image, &ctx->Unpack,
0, GL_FALSE);
 
/* apply scale and bias */
{
const GLfloat *scale = ctx->Pixel.ConvolutionFilterScale[0];
const GLfloat *bias = ctx->Pixel.ConvolutionFilterBias[0];
GLint i;
for (i = 0; i < width; i++) {
GLfloat r = ctx->Convolution1D.Filter[i * 4 + 0];
GLfloat g = ctx->Convolution1D.Filter[i * 4 + 1];
GLfloat b = ctx->Convolution1D.Filter[i * 4 + 2];
GLfloat a = ctx->Convolution1D.Filter[i * 4 + 3];
r = r * scale[0] + bias[0];
g = g * scale[1] + bias[1];
b = b * scale[2] + bias[2];
a = a * scale[3] + bias[3];
ctx->Convolution1D.Filter[i * 4 + 0] = r;
ctx->Convolution1D.Filter[i * 4 + 1] = g;
ctx->Convolution1D.Filter[i * 4 + 2] = b;
ctx->Convolution1D.Filter[i * 4 + 3] = a;
}
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)
{
GLint baseFormat;
GLint i, components;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target != GL_CONVOLUTION_2D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter2D(target)");
return;
}
 
baseFormat = base_filter_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter2D(internalFormat)");
return;
}
 
if (width < 0 || width > MAX_CONVOLUTION_WIDTH) {
_mesa_error(ctx, GL_INVALID_VALUE, "glConvolutionFilter2D(width)");
return;
}
if (height < 0 || height > MAX_CONVOLUTION_HEIGHT) {
_mesa_error(ctx, GL_INVALID_VALUE, "glConvolutionFilter2D(height)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glConvolutionFilter2D(format or type)");
return;
}
if (format == GL_COLOR_INDEX ||
format == GL_STENCIL_INDEX ||
format == GL_DEPTH_COMPONENT ||
format == GL_INTENSITY ||
type == GL_BITMAP) {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter2D(format or type)");
return;
}
 
components = _mesa_components_in_format(format);
assert(components > 0); /* this should have been caught earlier */
 
ctx->Convolution2D.Format = format;
ctx->Convolution2D.InternalFormat = internalFormat;
ctx->Convolution2D.Width = width;
ctx->Convolution2D.Height = height;
 
/* Unpack filter image. We always store filters in RGBA format. */
for (i = 0; i < height; i++) {
const GLvoid *src = _mesa_image_address(&ctx->Unpack, image, width,
height, format, type, 0, i, 0);
GLfloat *dst = ctx->Convolution2D.Filter + i * width * 4;
_mesa_unpack_float_color_span(ctx, width, GL_RGBA, dst,
format, type, src, &ctx->Unpack,
0, GL_FALSE);
}
 
/* apply scale and bias */
{
const GLfloat *scale = ctx->Pixel.ConvolutionFilterScale[1];
const GLfloat *bias = ctx->Pixel.ConvolutionFilterBias[1];
for (i = 0; i < width * height; i++) {
GLfloat r = ctx->Convolution2D.Filter[i * 4 + 0];
GLfloat g = ctx->Convolution2D.Filter[i * 4 + 1];
GLfloat b = ctx->Convolution2D.Filter[i * 4 + 2];
GLfloat a = ctx->Convolution2D.Filter[i * 4 + 3];
r = r * scale[0] + bias[0];
g = g * scale[1] + bias[1];
b = b * scale[2] + bias[2];
a = a * scale[3] + bias[3];
ctx->Convolution2D.Filter[i * 4 + 0] = r;
ctx->Convolution2D.Filter[i * 4 + 1] = g;
ctx->Convolution2D.Filter[i * 4 + 2] = b;
ctx->Convolution2D.Filter[i * 4 + 3] = a;
}
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param)
{
GET_CURRENT_CONTEXT(ctx);
GLuint c;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
break;
case GL_CONVOLUTION_2D:
c = 1;
break;
case GL_SEPARABLE_2D:
c = 2;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterf(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_MODE:
if (param == (GLfloat) GL_REDUCE ||
param == (GLfloat) GL_CONSTANT_BORDER ||
param == (GLfloat) GL_REPLICATE_BORDER) {
ctx->Pixel.ConvolutionBorderMode[c] = (GLenum) param;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterf(params)");
return;
}
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterf(pname)");
return;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_convolution_attrib *conv;
GLuint c;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
conv = &ctx->Convolution1D;
break;
case GL_CONVOLUTION_2D:
c = 1;
conv = &ctx->Convolution2D;
break;
case GL_SEPARABLE_2D:
c = 2;
conv = &ctx->Separable2D;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterfv(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_COLOR:
COPY_4V(ctx->Pixel.ConvolutionBorderColor[c], params);
break;
case GL_CONVOLUTION_BORDER_MODE:
if (params[0] == (GLfloat) GL_REDUCE ||
params[0] == (GLfloat) GL_CONSTANT_BORDER ||
params[0] == (GLfloat) GL_REPLICATE_BORDER) {
ctx->Pixel.ConvolutionBorderMode[c] = (GLenum) params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterfv(params)");
return;
}
break;
case GL_CONVOLUTION_FILTER_SCALE:
COPY_4V(ctx->Pixel.ConvolutionFilterScale[c], params);
break;
case GL_CONVOLUTION_FILTER_BIAS:
COPY_4V(ctx->Pixel.ConvolutionFilterBias[c], params);
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameterfv(pname)");
return;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ConvolutionParameteri(GLenum target, GLenum pname, GLint param)
{
GET_CURRENT_CONTEXT(ctx);
GLuint c;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
break;
case GL_CONVOLUTION_2D:
c = 1;
break;
case GL_SEPARABLE_2D:
c = 2;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteri(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_MODE:
if (param == (GLint) GL_REDUCE ||
param == (GLint) GL_CONSTANT_BORDER ||
param == (GLint) GL_REPLICATE_BORDER) {
ctx->Pixel.ConvolutionBorderMode[c] = (GLenum) param;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteri(params)");
return;
}
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteri(pname)");
return;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_convolution_attrib *conv;
GLuint c;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
conv = &ctx->Convolution1D;
break;
case GL_CONVOLUTION_2D:
c = 1;
conv = &ctx->Convolution2D;
break;
case GL_SEPARABLE_2D:
c = 2;
conv = &ctx->Separable2D;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteriv(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_COLOR:
ctx->Pixel.ConvolutionBorderColor[c][0] = INT_TO_FLOAT(params[0]);
ctx->Pixel.ConvolutionBorderColor[c][1] = INT_TO_FLOAT(params[1]);
ctx->Pixel.ConvolutionBorderColor[c][2] = INT_TO_FLOAT(params[2]);
ctx->Pixel.ConvolutionBorderColor[c][3] = INT_TO_FLOAT(params[3]);
break;
case GL_CONVOLUTION_BORDER_MODE:
if (params[0] == (GLint) GL_REDUCE ||
params[0] == (GLint) GL_CONSTANT_BORDER ||
params[0] == (GLint) GL_REPLICATE_BORDER) {
ctx->Pixel.ConvolutionBorderMode[c] = (GLenum) params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteriv(params)");
return;
}
break;
case GL_CONVOLUTION_FILTER_SCALE:
/* COPY_4V(ctx->Pixel.ConvolutionFilterScale[c], params); */
/* need cast to prevent compiler warnings */
ctx->Pixel.ConvolutionFilterScale[c][0] = (GLfloat) params[0];
ctx->Pixel.ConvolutionFilterScale[c][1] = (GLfloat) params[1];
ctx->Pixel.ConvolutionFilterScale[c][2] = (GLfloat) params[2];
ctx->Pixel.ConvolutionFilterScale[c][3] = (GLfloat) params[3];
break;
case GL_CONVOLUTION_FILTER_BIAS:
/* COPY_4V(ctx->Pixel.ConvolutionFilterBias[c], params); */
/* need cast to prevent compiler warnings */
ctx->Pixel.ConvolutionFilterBias[c][0] = (GLfloat) params[0];
ctx->Pixel.ConvolutionFilterBias[c][1] = (GLfloat) params[1];
ctx->Pixel.ConvolutionFilterBias[c][2] = (GLfloat) params[2];
ctx->Pixel.ConvolutionFilterBias[c][3] = (GLfloat) params[3];
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glConvolutionParameteriv(pname)");
return;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width)
{
GLint baseFormat;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target != GL_CONVOLUTION_1D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glCopyConvolutionFilter1D(target)");
return;
}
 
baseFormat = base_filter_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glCopyConvolutionFilter1D(internalFormat)");
return;
}
 
if (width < 0 || width > MAX_CONVOLUTION_WIDTH) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCopyConvolutionFilter1D(width)");
return;
}
 
ctx->Driver.CopyConvolutionFilter1D( ctx, target,
internalFormat, x, y, width);
}
 
 
void
_mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height)
{
GLint baseFormat;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target != GL_CONVOLUTION_2D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glCopyConvolutionFilter2D(target)");
return;
}
 
baseFormat = base_filter_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glCopyConvolutionFilter2D(internalFormat)");
return;
}
 
if (width < 0 || width > MAX_CONVOLUTION_WIDTH) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCopyConvolutionFilter2D(width)");
return;
}
if (height < 0 || height > MAX_CONVOLUTION_HEIGHT) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCopyConvolutionFilter2D(height)");
return;
}
 
ctx->Driver.CopyConvolutionFilter2D( ctx, target, internalFormat, x, y,
width, height );
 
}
 
 
void
_mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
{
const struct gl_convolution_attrib *filter;
GLuint row;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetConvolutionFilter(format or type)");
return;
}
 
if (format == GL_COLOR_INDEX ||
format == GL_STENCIL_INDEX ||
format == GL_DEPTH_COMPONENT ||
format == GL_INTENSITY ||
type == GL_BITMAP) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(format or type)");
return;
}
 
switch (target) {
case GL_CONVOLUTION_1D:
filter = &(ctx->Convolution1D);
break;
case GL_CONVOLUTION_2D:
filter = &(ctx->Convolution2D);
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(target)");
return;
}
 
for (row = 0; row < filter->Height; row++) {
GLvoid *dst = _mesa_image_address( &ctx->Pack, image, filter->Width,
filter->Height, format, type,
0, row, 0);
const GLfloat *src = filter->Filter + row * filter->Width * 4;
_mesa_pack_float_rgba_span(ctx, filter->Width,
(const GLfloat (*)[4]) src,
format, type, dst, &ctx->Pack, 0);
}
}
 
 
void
_mesa_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
const struct gl_convolution_attrib *conv;
GLuint c;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
conv = &ctx->Convolution1D;
break;
case GL_CONVOLUTION_2D:
c = 1;
conv = &ctx->Convolution2D;
break;
case GL_SEPARABLE_2D:
c = 2;
conv = &ctx->Separable2D;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionParameterfv(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_COLOR:
COPY_4V(params, ctx->Pixel.ConvolutionBorderColor[c]);
break;
case GL_CONVOLUTION_BORDER_MODE:
*params = (GLfloat) ctx->Pixel.ConvolutionBorderMode[c];
break;
case GL_CONVOLUTION_FILTER_SCALE:
COPY_4V(params, ctx->Pixel.ConvolutionFilterScale[c]);
break;
case GL_CONVOLUTION_FILTER_BIAS:
COPY_4V(params, ctx->Pixel.ConvolutionFilterBias[c]);
break;
case GL_CONVOLUTION_FORMAT:
*params = (GLfloat) conv->Format;
break;
case GL_CONVOLUTION_WIDTH:
*params = (GLfloat) conv->Width;
break;
case GL_CONVOLUTION_HEIGHT:
*params = (GLfloat) conv->Height;
break;
case GL_MAX_CONVOLUTION_WIDTH:
*params = (GLfloat) ctx->Const.MaxConvolutionWidth;
break;
case GL_MAX_CONVOLUTION_HEIGHT:
*params = (GLfloat) ctx->Const.MaxConvolutionHeight;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionParameterfv(pname)");
return;
}
}
 
 
void
_mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
const struct gl_convolution_attrib *conv;
GLuint c;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (target) {
case GL_CONVOLUTION_1D:
c = 0;
conv = &ctx->Convolution1D;
break;
case GL_CONVOLUTION_2D:
c = 1;
conv = &ctx->Convolution2D;
break;
case GL_SEPARABLE_2D:
c = 2;
conv = &ctx->Separable2D;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionParameteriv(target)");
return;
}
 
switch (pname) {
case GL_CONVOLUTION_BORDER_COLOR:
params[0] = FLOAT_TO_INT(ctx->Pixel.ConvolutionBorderColor[c][0]);
params[1] = FLOAT_TO_INT(ctx->Pixel.ConvolutionBorderColor[c][1]);
params[2] = FLOAT_TO_INT(ctx->Pixel.ConvolutionBorderColor[c][2]);
params[3] = FLOAT_TO_INT(ctx->Pixel.ConvolutionBorderColor[c][3]);
break;
case GL_CONVOLUTION_BORDER_MODE:
*params = (GLint) ctx->Pixel.ConvolutionBorderMode[c];
break;
case GL_CONVOLUTION_FILTER_SCALE:
params[0] = (GLint) ctx->Pixel.ConvolutionFilterScale[c][0];
params[1] = (GLint) ctx->Pixel.ConvolutionFilterScale[c][1];
params[2] = (GLint) ctx->Pixel.ConvolutionFilterScale[c][2];
params[3] = (GLint) ctx->Pixel.ConvolutionFilterScale[c][3];
break;
case GL_CONVOLUTION_FILTER_BIAS:
params[0] = (GLint) ctx->Pixel.ConvolutionFilterBias[c][0];
params[1] = (GLint) ctx->Pixel.ConvolutionFilterBias[c][1];
params[2] = (GLint) ctx->Pixel.ConvolutionFilterBias[c][2];
params[3] = (GLint) ctx->Pixel.ConvolutionFilterBias[c][3];
break;
case GL_CONVOLUTION_FORMAT:
*params = (GLint) conv->Format;
break;
case GL_CONVOLUTION_WIDTH:
*params = (GLint) conv->Width;
break;
case GL_CONVOLUTION_HEIGHT:
*params = (GLint) conv->Height;
break;
case GL_MAX_CONVOLUTION_WIDTH:
*params = (GLint) ctx->Const.MaxConvolutionWidth;
break;
case GL_MAX_CONVOLUTION_HEIGHT:
*params = (GLint) ctx->Const.MaxConvolutionHeight;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionParameteriv(pname)");
return;
}
}
 
 
void
_mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
{
const GLint colStart = MAX_CONVOLUTION_WIDTH * 4;
const struct gl_convolution_attrib *filter;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
if (target != GL_SEPARABLE_2D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetSeparableFilter(target)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetConvolutionFilter(format or type)");
return;
}
 
if (format == GL_COLOR_INDEX ||
format == GL_STENCIL_INDEX ||
format == GL_DEPTH_COMPONENT ||
format == GL_INTENSITY ||
type == GL_BITMAP) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(format or type)");
return;
}
 
filter = &ctx->Separable2D;
 
/* Row filter */
{
GLvoid *dst = _mesa_image_address( &ctx->Pack, row, filter->Width,
filter->Height, format, type,
0, 0, 0);
_mesa_pack_float_rgba_span(ctx, filter->Width,
(const GLfloat (*)[4]) filter->Filter,
format, type, dst, &ctx->Pack, 0);
}
 
/* Column filter */
{
GLvoid *dst = _mesa_image_address( &ctx->Pack, column, filter->Width,
1, format, type,
0, 0, 0);
const GLfloat *src = filter->Filter + colStart;
_mesa_pack_float_rgba_span(ctx, filter->Height,
(const GLfloat (*)[4]) src,
format, type, dst, &ctx->Pack, 0);
}
 
(void) span; /* unused at this time */
}
 
 
void
_mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)
{
const GLint colStart = MAX_CONVOLUTION_WIDTH * 4;
GLint baseFormat;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target != GL_SEPARABLE_2D) {
_mesa_error(ctx, GL_INVALID_ENUM, "glSeparableFilter2D(target)");
return;
}
 
baseFormat = base_filter_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glSeparableFilter2D(internalFormat)");
return;
}
 
if (width < 0 || width > MAX_CONVOLUTION_WIDTH) {
_mesa_error(ctx, GL_INVALID_VALUE, "glSeparableFilter2D(width)");
return;
}
if (height < 0 || height > MAX_CONVOLUTION_HEIGHT) {
_mesa_error(ctx, GL_INVALID_VALUE, "glSeparableFilter2D(height)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glSeparableFilter2D(format or type)");
return;
}
 
if (format == GL_COLOR_INDEX ||
format == GL_STENCIL_INDEX ||
format == GL_DEPTH_COMPONENT ||
format == GL_INTENSITY ||
type == GL_BITMAP) {
_mesa_error(ctx, GL_INVALID_ENUM, "glSeparableFilter2D(format or type)");
return;
}
 
ctx->Separable2D.Format = format;
ctx->Separable2D.InternalFormat = internalFormat;
ctx->Separable2D.Width = width;
ctx->Separable2D.Height = height;
 
/* unpack row filter */
_mesa_unpack_float_color_span(ctx, width, GL_RGBA,
ctx->Separable2D.Filter,
format, type, row, &ctx->Unpack,
0, GL_FALSE);
 
/* apply scale and bias */
{
const GLfloat *scale = ctx->Pixel.ConvolutionFilterScale[2];
const GLfloat *bias = ctx->Pixel.ConvolutionFilterBias[2];
GLint i;
for (i = 0; i < width; i++) {
GLfloat r = ctx->Separable2D.Filter[i * 4 + 0];
GLfloat g = ctx->Separable2D.Filter[i * 4 + 1];
GLfloat b = ctx->Separable2D.Filter[i * 4 + 2];
GLfloat a = ctx->Separable2D.Filter[i * 4 + 3];
r = r * scale[0] + bias[0];
g = g * scale[1] + bias[1];
b = b * scale[2] + bias[2];
a = a * scale[3] + bias[3];
ctx->Separable2D.Filter[i * 4 + 0] = r;
ctx->Separable2D.Filter[i * 4 + 1] = g;
ctx->Separable2D.Filter[i * 4 + 2] = b;
ctx->Separable2D.Filter[i * 4 + 3] = a;
}
}
 
/* unpack column filter */
_mesa_unpack_float_color_span(ctx, width, GL_RGBA,
&ctx->Separable2D.Filter[colStart],
format, type, column, &ctx->Unpack,
0, GL_FALSE);
 
/* apply scale and bias */
{
const GLfloat *scale = ctx->Pixel.ConvolutionFilterScale[2];
const GLfloat *bias = ctx->Pixel.ConvolutionFilterBias[2];
GLint i;
for (i = 0; i < width; i++) {
GLfloat r = ctx->Separable2D.Filter[i * 4 + 0 + colStart];
GLfloat g = ctx->Separable2D.Filter[i * 4 + 1 + colStart];
GLfloat b = ctx->Separable2D.Filter[i * 4 + 2 + colStart];
GLfloat a = ctx->Separable2D.Filter[i * 4 + 3 + colStart];
r = r * scale[0] + bias[0];
g = g * scale[1] + bias[1];
b = b * scale[2] + bias[2];
a = a * scale[3] + bias[3];
ctx->Separable2D.Filter[i * 4 + 0 + colStart] = r;
ctx->Separable2D.Filter[i * 4 + 1 + colStart] = g;
ctx->Separable2D.Filter[i * 4 + 2 + colStart] = b;
ctx->Separable2D.Filter[i * 4 + 3 + colStart] = a;
}
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
/**********************************************************************/
/*** image convolution functions ***/
/**********************************************************************/
 
static void
convolve_1d_reduce(GLint srcWidth, const GLfloat src[][4],
GLint filterWidth, const GLfloat filter[][4],
GLfloat dest[][4])
{
GLint dstWidth;
GLint i, n;
 
if (filterWidth >= 1)
dstWidth = srcWidth - (filterWidth - 1);
else
dstWidth = srcWidth;
 
if (dstWidth <= 0)
return; /* null result */
 
for (i = 0; i < dstWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (n = 0; n < filterWidth; n++) {
sumR += src[i + n][RCOMP] * filter[n][RCOMP];
sumG += src[i + n][GCOMP] * filter[n][GCOMP];
sumB += src[i + n][BCOMP] * filter[n][BCOMP];
sumA += src[i + n][ACOMP] * filter[n][ACOMP];
}
dest[i][RCOMP] = sumR;
dest[i][GCOMP] = sumG;
dest[i][BCOMP] = sumB;
dest[i][ACOMP] = sumA;
}
}
 
 
static void
convolve_1d_constant(GLint srcWidth, const GLfloat src[][4],
GLint filterWidth, const GLfloat filter[][4],
GLfloat dest[][4],
const GLfloat borderColor[4])
{
const GLint halfFilterWidth = filterWidth / 2;
GLint i, n;
 
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (n = 0; n < filterWidth; n++) {
if (i + n < halfFilterWidth || i + n - halfFilterWidth >= srcWidth) {
sumR += borderColor[RCOMP] * filter[n][RCOMP];
sumG += borderColor[GCOMP] * filter[n][GCOMP];
sumB += borderColor[BCOMP] * filter[n][BCOMP];
sumA += borderColor[ACOMP] * filter[n][ACOMP];
}
else {
sumR += src[i + n - halfFilterWidth][RCOMP] * filter[n][RCOMP];
sumG += src[i + n - halfFilterWidth][GCOMP] * filter[n][GCOMP];
sumB += src[i + n - halfFilterWidth][BCOMP] * filter[n][BCOMP];
sumA += src[i + n - halfFilterWidth][ACOMP] * filter[n][ACOMP];
}
}
dest[i][RCOMP] = sumR;
dest[i][GCOMP] = sumG;
dest[i][BCOMP] = sumB;
dest[i][ACOMP] = sumA;
}
}
 
 
static void
convolve_1d_replicate(GLint srcWidth, const GLfloat src[][4],
GLint filterWidth, const GLfloat filter[][4],
GLfloat dest[][4])
{
const GLint halfFilterWidth = filterWidth / 2;
GLint i, n;
 
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (n = 0; n < filterWidth; n++) {
if (i + n < halfFilterWidth) {
sumR += src[0][RCOMP] * filter[n][RCOMP];
sumG += src[0][GCOMP] * filter[n][GCOMP];
sumB += src[0][BCOMP] * filter[n][BCOMP];
sumA += src[0][ACOMP] * filter[n][ACOMP];
}
else if (i + n - halfFilterWidth >= srcWidth) {
sumR += src[srcWidth - 1][RCOMP] * filter[n][RCOMP];
sumG += src[srcWidth - 1][GCOMP] * filter[n][GCOMP];
sumB += src[srcWidth - 1][BCOMP] * filter[n][BCOMP];
sumA += src[srcWidth - 1][ACOMP] * filter[n][ACOMP];
}
else {
sumR += src[i + n - halfFilterWidth][RCOMP] * filter[n][RCOMP];
sumG += src[i + n - halfFilterWidth][GCOMP] * filter[n][GCOMP];
sumB += src[i + n - halfFilterWidth][BCOMP] * filter[n][BCOMP];
sumA += src[i + n - halfFilterWidth][ACOMP] * filter[n][ACOMP];
}
}
dest[i][RCOMP] = sumR;
dest[i][GCOMP] = sumG;
dest[i][BCOMP] = sumB;
dest[i][ACOMP] = sumA;
}
}
 
 
static void
convolve_2d_reduce(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat filter[][4],
GLfloat dest[][4])
{
GLint dstWidth, dstHeight;
GLint i, j, n, m;
 
if (filterWidth >= 1)
dstWidth = srcWidth - (filterWidth - 1);
else
dstWidth = srcWidth;
 
if (filterHeight >= 1)
dstHeight = srcHeight - (filterHeight - 1);
else
dstHeight = srcHeight;
 
if (dstWidth <= 0 || dstHeight <= 0)
return;
 
for (j = 0; j < dstHeight; j++) {
for (i = 0; i < dstWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
const GLint k = (j + m) * srcWidth + i + n;
const GLint f = m * filterWidth + n;
sumR += src[k][RCOMP] * filter[f][RCOMP];
sumG += src[k][GCOMP] * filter[f][GCOMP];
sumB += src[k][BCOMP] * filter[f][BCOMP];
sumA += src[k][ACOMP] * filter[f][ACOMP];
}
}
dest[j * dstWidth + i][RCOMP] = sumR;
dest[j * dstWidth + i][GCOMP] = sumG;
dest[j * dstWidth + i][BCOMP] = sumB;
dest[j * dstWidth + i][ACOMP] = sumA;
}
}
}
 
 
static void
convolve_2d_constant(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat filter[][4],
GLfloat dest[][4],
const GLfloat borderColor[4])
{
const GLint halfFilterWidth = filterWidth / 2;
const GLint halfFilterHeight = filterHeight / 2;
GLint i, j, n, m;
 
for (j = 0; j < srcHeight; j++) {
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
const GLint f = m * filterWidth + n;
const GLint is = i + n - halfFilterWidth;
const GLint js = j + m - halfFilterHeight;
if (is < 0 || is >= srcWidth ||
js < 0 || js >= srcHeight) {
sumR += borderColor[RCOMP] * filter[f][RCOMP];
sumG += borderColor[GCOMP] * filter[f][GCOMP];
sumB += borderColor[BCOMP] * filter[f][BCOMP];
sumA += borderColor[ACOMP] * filter[f][ACOMP];
}
else {
const GLint k = js * srcWidth + is;
sumR += src[k][RCOMP] * filter[f][RCOMP];
sumG += src[k][GCOMP] * filter[f][GCOMP];
sumB += src[k][BCOMP] * filter[f][BCOMP];
sumA += src[k][ACOMP] * filter[f][ACOMP];
}
}
}
dest[j * srcWidth + i][RCOMP] = sumR;
dest[j * srcWidth + i][GCOMP] = sumG;
dest[j * srcWidth + i][BCOMP] = sumB;
dest[j * srcWidth + i][ACOMP] = sumA;
}
}
}
 
 
static void
convolve_2d_replicate(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat filter[][4],
GLfloat dest[][4])
{
const GLint halfFilterWidth = filterWidth / 2;
const GLint halfFilterHeight = filterHeight / 2;
GLint i, j, n, m;
 
for (j = 0; j < srcHeight; j++) {
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
const GLint f = m * filterWidth + n;
GLint is = i + n - halfFilterWidth;
GLint js = j + m - halfFilterHeight;
GLint k;
if (is < 0)
is = 0;
else if (is >= srcWidth)
is = srcWidth - 1;
if (js < 0)
js = 0;
else if (js >= srcHeight)
js = srcHeight - 1;
k = js * srcWidth + is;
sumR += src[k][RCOMP] * filter[f][RCOMP];
sumG += src[k][GCOMP] * filter[f][GCOMP];
sumB += src[k][BCOMP] * filter[f][BCOMP];
sumA += src[k][ACOMP] * filter[f][ACOMP];
}
}
dest[j * srcWidth + i][RCOMP] = sumR;
dest[j * srcWidth + i][GCOMP] = sumG;
dest[j * srcWidth + i][BCOMP] = sumB;
dest[j * srcWidth + i][ACOMP] = sumA;
}
}
}
 
 
static void
convolve_sep_reduce(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat rowFilt[][4],
const GLfloat colFilt[][4],
GLfloat dest[][4])
{
GLint dstWidth, dstHeight;
GLint i, j, n, m;
 
if (filterWidth >= 1)
dstWidth = srcWidth - (filterWidth - 1);
else
dstWidth = srcWidth;
 
if (filterHeight >= 1)
dstHeight = srcHeight - (filterHeight - 1);
else
dstHeight = srcHeight;
 
if (dstWidth <= 0 || dstHeight <= 0)
return;
 
for (j = 0; j < dstHeight; j++) {
for (i = 0; i < dstWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
GLint k = (j + m) * srcWidth + i + n;
sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP];
sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP];
sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP];
sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP];
}
}
dest[j * dstWidth + i][RCOMP] = sumR;
dest[j * dstWidth + i][GCOMP] = sumG;
dest[j * dstWidth + i][BCOMP] = sumB;
dest[j * dstWidth + i][ACOMP] = sumA;
}
}
}
 
 
static void
convolve_sep_constant(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat rowFilt[][4],
const GLfloat colFilt[][4],
GLfloat dest[][4],
const GLfloat borderColor[4])
{
const GLint halfFilterWidth = filterWidth / 2;
const GLint halfFilterHeight = filterHeight / 2;
GLint i, j, n, m;
 
for (j = 0; j < srcHeight; j++) {
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
const GLint is = i + n - halfFilterWidth;
const GLint js = j + m - halfFilterHeight;
if (is < 0 || is >= srcWidth ||
js < 0 || js >= srcHeight) {
sumR += borderColor[RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP];
sumG += borderColor[GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP];
sumB += borderColor[BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP];
sumA += borderColor[ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP];
}
else {
GLint k = js * srcWidth + is;
sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP];
sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP];
sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP];
sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP];
}
 
}
}
dest[j * srcWidth + i][RCOMP] = sumR;
dest[j * srcWidth + i][GCOMP] = sumG;
dest[j * srcWidth + i][BCOMP] = sumB;
dest[j * srcWidth + i][ACOMP] = sumA;
}
}
}
 
 
static void
convolve_sep_replicate(GLint srcWidth, GLint srcHeight,
const GLfloat src[][4],
GLint filterWidth, GLint filterHeight,
const GLfloat rowFilt[][4],
const GLfloat colFilt[][4],
GLfloat dest[][4])
{
const GLint halfFilterWidth = filterWidth / 2;
const GLint halfFilterHeight = filterHeight / 2;
GLint i, j, n, m;
 
for (j = 0; j < srcHeight; j++) {
for (i = 0; i < srcWidth; i++) {
GLfloat sumR = 0.0;
GLfloat sumG = 0.0;
GLfloat sumB = 0.0;
GLfloat sumA = 0.0;
for (m = 0; m < filterHeight; m++) {
for (n = 0; n < filterWidth; n++) {
GLint is = i + n - halfFilterWidth;
GLint js = j + m - halfFilterHeight;
GLint k;
if (is < 0)
is = 0;
else if (is >= srcWidth)
is = srcWidth - 1;
if (js < 0)
js = 0;
else if (js >= srcHeight)
js = srcHeight - 1;
k = js * srcWidth + is;
sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP];
sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP];
sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP];
sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP];
}
}
dest[j * srcWidth + i][RCOMP] = sumR;
dest[j * srcWidth + i][GCOMP] = sumG;
dest[j * srcWidth + i][BCOMP] = sumB;
dest[j * srcWidth + i][ACOMP] = sumA;
}
}
}
 
 
 
void
_mesa_convolve_1d_image(const GLcontext *ctx, GLsizei *width,
const GLfloat *srcImage, GLfloat *dstImage)
{
switch (ctx->Pixel.ConvolutionBorderMode[0]) {
case GL_REDUCE:
convolve_1d_reduce(*width, (const GLfloat (*)[4]) srcImage,
ctx->Convolution1D.Width,
(const GLfloat (*)[4]) ctx->Convolution1D.Filter,
(GLfloat (*)[4]) dstImage);
*width = *width - (MAX2(ctx->Convolution1D.Width, 1) - 1);
break;
case GL_CONSTANT_BORDER:
convolve_1d_constant(*width, (const GLfloat (*)[4]) srcImage,
ctx->Convolution1D.Width,
(const GLfloat (*)[4]) ctx->Convolution1D.Filter,
(GLfloat (*)[4]) dstImage,
ctx->Pixel.ConvolutionBorderColor[0]);
break;
case GL_REPLICATE_BORDER:
convolve_1d_replicate(*width, (const GLfloat (*)[4]) srcImage,
ctx->Convolution1D.Width,
(const GLfloat (*)[4]) ctx->Convolution1D.Filter,
(GLfloat (*)[4]) dstImage);
break;
default:
;
}
}
 
 
void
_mesa_convolve_2d_image(const GLcontext *ctx, GLsizei *width, GLsizei *height,
const GLfloat *srcImage, GLfloat *dstImage)
{
switch (ctx->Pixel.ConvolutionBorderMode[1]) {
case GL_REDUCE:
convolve_2d_reduce(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Convolution2D.Width,
ctx->Convolution2D.Height,
(const GLfloat (*)[4]) ctx->Convolution2D.Filter,
(GLfloat (*)[4]) dstImage);
*width = *width - (MAX2(ctx->Convolution2D.Width, 1) - 1);
*height = *height - (MAX2(ctx->Convolution2D.Height, 1) - 1);
break;
case GL_CONSTANT_BORDER:
convolve_2d_constant(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Convolution2D.Width,
ctx->Convolution2D.Height,
(const GLfloat (*)[4]) ctx->Convolution2D.Filter,
(GLfloat (*)[4]) dstImage,
ctx->Pixel.ConvolutionBorderColor[1]);
break;
case GL_REPLICATE_BORDER:
convolve_2d_replicate(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Convolution2D.Width,
ctx->Convolution2D.Height,
(const GLfloat (*)[4])ctx->Convolution2D.Filter,
(GLfloat (*)[4]) dstImage);
break;
default:
;
}
}
 
 
void
_mesa_convolve_sep_image(const GLcontext *ctx,
GLsizei *width, GLsizei *height,
const GLfloat *srcImage, GLfloat *dstImage)
{
const GLfloat *rowFilter = ctx->Separable2D.Filter;
const GLfloat *colFilter = rowFilter + 4 * MAX_CONVOLUTION_WIDTH;
 
switch (ctx->Pixel.ConvolutionBorderMode[2]) {
case GL_REDUCE:
convolve_sep_reduce(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Separable2D.Width,
ctx->Separable2D.Height,
(const GLfloat (*)[4]) rowFilter,
(const GLfloat (*)[4]) colFilter,
(GLfloat (*)[4]) dstImage);
*width = *width - (MAX2(ctx->Separable2D.Width, 1) - 1);
*height = *height - (MAX2(ctx->Separable2D.Height, 1) - 1);
break;
case GL_CONSTANT_BORDER:
convolve_sep_constant(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Separable2D.Width,
ctx->Separable2D.Height,
(const GLfloat (*)[4]) rowFilter,
(const GLfloat (*)[4]) colFilter,
(GLfloat (*)[4]) dstImage,
ctx->Pixel.ConvolutionBorderColor[2]);
break;
case GL_REPLICATE_BORDER:
convolve_sep_replicate(*width, *height,
(const GLfloat (*)[4]) srcImage,
ctx->Separable2D.Width,
ctx->Separable2D.Height,
(const GLfloat (*)[4]) rowFilter,
(const GLfloat (*)[4]) colFilter,
(GLfloat (*)[4]) dstImage);
break;
default:
;
}
}
 
 
 
/*
* This function computes an image's size after convolution.
* If the convolution border mode is GL_REDUCE, the post-convolution
* image will be smaller than the original.
*/
void
_mesa_adjust_image_for_convolution(const GLcontext *ctx, GLuint dimensions,
GLsizei *width, GLsizei *height)
{
if (ctx->Pixel.Convolution1DEnabled
&& dimensions == 1
&& ctx->Pixel.ConvolutionBorderMode[0] == GL_REDUCE) {
*width = *width - (MAX2(ctx->Convolution1D.Width, 1) - 1);
}
else if (ctx->Pixel.Convolution2DEnabled
&& dimensions > 1
&& ctx->Pixel.ConvolutionBorderMode[1] == GL_REDUCE) {
*width = *width - (MAX2(ctx->Convolution2D.Width, 1) - 1);
*height = *height - (MAX2(ctx->Convolution2D.Height, 1) - 1);
}
else if (ctx->Pixel.Separable2DEnabled
&& dimensions > 1
&& ctx->Pixel.ConvolutionBorderMode[2] == GL_REDUCE) {
*width = *width - (MAX2(ctx->Separable2D.Width, 1) - 1);
*height = *height - (MAX2(ctx->Separable2D.Height, 1) - 1);
}
}
/shark/trunk/ports/mesa/src/clip.h
0,0 → 1,40
/* $Id: clip.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
 
 
 
#ifndef CLIP_H
#define CLIP_H
 
#include "mtypes.h"
 
extern void _mesa_ClipPlane( GLenum plane, const GLdouble *equation );
 
extern void _mesa_GetClipPlane( GLenum plane, GLdouble *equation );
 
#endif
/shark/trunk/ports/mesa/src/polygon.h
0,0 → 1,57
/* $Id: polygon.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef POLYGON_H
#define POLYGON_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_CullFace( GLenum mode );
 
extern void
_mesa_FrontFace( GLenum mode );
 
extern void
_mesa_PolygonMode( GLenum face, GLenum mode );
 
extern void
_mesa_PolygonOffset( GLfloat factor, GLfloat units );
 
extern void
_mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias );
 
extern void
_mesa_PolygonStipple( const GLubyte *mask );
 
extern void
_mesa_GetPolygonStipple( GLubyte *mask );
 
 
#endif
/shark/trunk/ports/mesa/src/texutil.c
0,0 → 1,1035
/* $Id: texutil.c,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes
*/
 
/*
* Description:
* Functions for texture image conversion. This takes care of converting
* typical GL_RGBA/GLubyte textures into hardware-specific formats.
* We can handle non-standard row strides and pixel unpacking parameters.
*/
 
 
#include "glheader.h"
#include "context.h"
#include "enums.h"
#include "image.h"
#include "imports.h"
#include "macros.h"
#include "mtypes.h"
#include "texformat.h"
#include "texutil.h"
 
 
#define DEBUG_TEXUTIL 0
 
 
#ifdef MESA_BIG_ENDIAN
#define APPEND16( a, b ) ( (a) << 16 | (b) )
#else
#define APPEND16( a, b ) ( (a) | (b) << 16 )
#endif
 
 
struct convert_info {
GLint xoffset, yoffset, zoffset; /* Subimage offset */
GLint width, height, depth; /* Subimage region */
 
GLint dstImageWidth, dstImageHeight; /* Dest image size */
/* Needed for subimage replacement */
GLenum format, type; /* Source (user) format and type */
 
const struct gl_pixelstore_attrib *unpacking;
 
const GLvoid *srcImage;
GLvoid *dstImage;
 
GLint index;
};
 
typedef GLboolean (*convert_func)( const struct convert_info *convert );
 
/* bitvalues for convert->index */
#define CONVERT_STRIDE_BIT 0x1
#define CONVERT_UNPACKING_BIT 0x2
 
 
 
/* =============================================================
* Convert to RGBA8888 textures:
*/
 
#define DST_TYPE GLuint
#define DST_TEXELS_PER_DWORD 1
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[2], src[1], src[0] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_rgba8888_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[0], src[1], src[2], src[3] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_rgba8888
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[0], src[1], src[2], 0xff )
 
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
 
#define SRC_TEXEL_BYTES 3
 
#define TAG(x) x##_bgr888_to_rgba8888
#include "texutil_tmp.h"
 
 
#define CONVERT_RGBA8888( name ) \
static GLboolean \
convert_##name##_rgba8888( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_ABGR_EXT && \
convert->type == GL_UNSIGNED_INT_8_8_8_8_REV ) \
{ \
tab = name##_tab_rgba8888_direct; \
} \
else if ( convert->format == GL_RGBA && \
( convert->type == GL_UNSIGNED_BYTE || \
convert->type == GL_UNSIGNED_INT_8_8_8_8 ) ) \
{ \
tab = name##_tab_abgr8888_to_rgba8888; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_rgba8888; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_RGBA8888( texsubimage2d )
CONVERT_RGBA8888( texsubimage3d )
 
 
 
/* =============================================================
* Convert to ARGB8888 textures:
*/
 
#define DST_TYPE GLuint
#define DST_TEXELS_PER_DWORD 1
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[2], src[1], src[0] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_argb8888_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_argb8888
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( 0xff, src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
 
#define SRC_TEXEL_BYTES 3
 
#define TAG(x) x##_bgr888_to_argb8888
#include "texutil_tmp.h"
 
 
#define CONVERT_ARGB8888( name ) \
static GLboolean \
convert_##name##_argb8888( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_INT_8_8_8_8_REV ) \
{ \
tab = name##_tab_argb8888_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb8888; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_argb8888; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_ARGB8888( texsubimage2d )
CONVERT_ARGB8888( texsubimage3d )
 
 
 
/* =============================================================
* Convert to RGB888 textures:
*/
 
static GLboolean
convert_texsubimage2d_rgb888( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
 
static GLboolean
convert_texsubimage3d_rgb888( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
 
 
 
/* =============================================================
* Convert to RGB565 textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_rgb565_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_565_LE( src[0], src[1], src[2] ), \
PACK_COLOR_565_LE( src[3], src[4], src[5] ) )
 
#define SRC_TEXEL_BYTES 3
 
#define TAG(x) x##_bgr888_to_rgb565
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_565_LE( src[0], src[1], src[2] ), \
PACK_COLOR_565_LE( src[4], src[5], src[6] ) )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_rgb565
#include "texutil_tmp.h"
 
 
#define CONVERT_RGB565( name ) \
static GLboolean \
convert_##name##_rgb565( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_SHORT_5_6_5 ) \
{ \
tab = name##_tab_rgb565_direct; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_rgb565; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_rgb565; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_RGB565( texsubimage2d )
CONVERT_RGB565( texsubimage3d )
 
 
 
/* =============================================================
* Convert to ARGB4444 textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_argb4444_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] ), \
PACK_COLOR_4444_LE( src[7], src[4], src[5], src[6] ) )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_argb4444
#include "texutil_tmp.h"
 
 
#define CONVERT_ARGB4444( name ) \
static GLboolean \
convert_##name##_argb4444( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_SHORT_4_4_4_4_REV ) \
{ \
tab = name##_tab_argb4444_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb4444; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_ARGB4444( texsubimage2d )
CONVERT_ARGB4444( texsubimage3d )
 
 
 
/* =============================================================
* Convert to ARGB1555 textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_argb1555_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#ifdef MESA_BIG_ENDIAN
 
#define CONVERT_TEXEL( dst, src ) \
{ const GLushort s = *(GLushort *)src; \
dst = (s >> 9) | ((s & 0x1ff) << 7); }
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
{ const GLuint s = ((fi_type *)src)->i; \
dst = (((s & 0xfe00fe00) >> 9) | \
((s & 0x01ff01ff) << 7)); }
 
#else
 
#define CONVERT_TEXEL( dst, src ) \
{ const GLushort s = *(GLushort *)src; \
dst = (s >> 1) | ((s & 1) << 15); }
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
{ const GLuint s = ((fi_type *)src)->i; \
dst = (((s & 0xfffefffe) >> 1) | \
((s & 0x00010001) << 15)); }
 
#endif
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_rgba5551_to_argb1555
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] ), \
PACK_COLOR_1555_LE( src[7], src[4], src[5], src[6] ) )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_argb1555
#include "texutil_tmp.h"
 
 
#define CONVERT_ARGB1555( name ) \
static GLboolean \
convert_##name##_argb1555( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_SHORT_1_5_5_5_REV ) \
{ \
tab = name##_tab_argb1555_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_SHORT_5_5_5_1 ) \
{ \
tab = name##_tab_rgba5551_to_argb1555; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb1555; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_ARGB1555( texsubimage2d )
CONVERT_ARGB1555( texsubimage3d )
 
 
 
/* =============================================================
* AL88 textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[0], src[1] )
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_al88_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[0], 0x00 )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( src[0], 0x00 ), \
PACK_COLOR_88_LE( src[1], 0x00 ) )
 
#define SRC_TEXEL_BYTES 1
 
#define TAG(x) x##_a8_to_al88
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( 0xff, src[0] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( 0xff, src[0] ), \
PACK_COLOR_88_LE( 0xff, src[1] ) )
 
#define SRC_TEXEL_BYTES 1
 
#define TAG(x) x##_l8_to_al88
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
 
 
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[3], src[0] )
 
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( src[3], src[0] ), \
PACK_COLOR_88_LE( src[7], src[4] ) )
 
#define SRC_TEXEL_BYTES 4
 
#define TAG(x) x##_abgr8888_to_al88
#include "texutil_tmp.h"
 
 
#define CONVERT_AL88( name ) \
static GLboolean \
convert_##name##_al88( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_LUMINANCE_ALPHA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_al88_direct; \
} \
else if ( convert->format == GL_ALPHA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_a8_to_al88; \
} \
else if ( convert->format == GL_LUMINANCE && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_l8_to_al88; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_al88; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_AL88( texsubimage2d )
CONVERT_AL88( texsubimage3d )
 
 
 
/* =============================================================
* Convert to RGB332 textures:
*/
 
static GLboolean
convert_texsubimage2d_rgb332( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
 
static GLboolean
convert_texsubimage3d_rgb332( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
 
 
 
/* =============================================================
* CI8 (and all other single-byte texel) textures:
*/
 
#define DST_TYPE GLubyte
#define DST_TEXELS_PER_DWORD 4
 
#define CONVERT_TEXEL( dst, src ) dst = src[0]
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 1
 
#define TAG(x) x##_ci8_direct
#include "texutil_tmp.h"
 
 
#define CONVERT_CI8( name ) \
static GLboolean \
convert_##name##_ci8( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( ( convert->format == GL_ALPHA || \
convert->format == GL_LUMINANCE || \
convert->format == GL_INTENSITY || \
convert->format == GL_COLOR_INDEX ) && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_ci8_direct; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
 
CONVERT_CI8( texsubimage2d )
CONVERT_CI8( texsubimage3d )
 
 
/* =============================================================
* convert to YCBCR textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = (src[0] << 8) | src[1];
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_ycbcr_direct
#include "texutil_tmp.h"
 
 
#define CONVERT_YCBCR( name ) \
static GLboolean \
convert_##name##_ycbcr( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if (convert->format != GL_YCBCR_MESA) { \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
tab = name##_tab_ycbcr_direct; \
\
return tab[index]( convert ); \
}
 
CONVERT_YCBCR( texsubimage2d )
CONVERT_YCBCR( texsubimage3d )
 
 
/* =============================================================
* convert to YCBCR_REV textures:
*/
 
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
 
#define CONVERT_TEXEL( dst, src ) \
dst = (src[1] << 8) | src[0];
 
#define CONVERT_DIRECT
 
#define SRC_TEXEL_BYTES 2
 
#define TAG(x) x##_ycbcr_rev_direct
#include "texutil_tmp.h"
 
 
#define CONVERT_YCBCR_REV( name ) \
static GLboolean \
convert_##name##_ycbcr_rev( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if (convert->format != GL_YCBCR_MESA) { \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
tab = name##_tab_ycbcr_rev_direct; \
\
return tab[index]( convert ); \
}
 
CONVERT_YCBCR_REV( texsubimage2d )
CONVERT_YCBCR_REV( texsubimage3d )
 
 
 
/* =============================================================
* Global entry points
*/
 
static convert_func convert_texsubimage2d_tab[] = {
convert_texsubimage2d_rgba8888,
convert_texsubimage2d_argb8888,
convert_texsubimage2d_rgb888,
convert_texsubimage2d_rgb565,
convert_texsubimage2d_argb4444,
convert_texsubimage2d_argb1555,
convert_texsubimage2d_al88,
convert_texsubimage2d_rgb332,
convert_texsubimage2d_ci8, /* These are all the same... */
convert_texsubimage2d_ci8,
convert_texsubimage2d_ci8,
convert_texsubimage2d_ci8,
convert_texsubimage2d_ycbcr,
convert_texsubimage2d_ycbcr_rev,
};
 
static convert_func convert_texsubimage3d_tab[] = {
convert_texsubimage3d_rgba8888,
convert_texsubimage3d_argb8888,
convert_texsubimage3d_rgb888,
convert_texsubimage3d_rgb565,
convert_texsubimage3d_argb4444,
convert_texsubimage3d_argb1555,
convert_texsubimage3d_al88,
convert_texsubimage3d_rgb332,
convert_texsubimage3d_ci8, /* These are all the same... */
convert_texsubimage3d_ci8,
convert_texsubimage3d_ci8,
convert_texsubimage3d_ci8,
convert_texsubimage3d_ycbcr,
convert_texsubimage3d_ycbcr_rev,
};
 
 
/* See if we need to care about the pixel store attributes when we're
* converting the texture image. This should be stored as
* unpacking->_SomeBoolean and updated when the values change, to avoid
* testing every time...
*/
static INLINE GLboolean
convert_needs_unpacking( const struct gl_pixelstore_attrib *unpacking,
GLenum format, GLenum type )
{
if ( ( unpacking->Alignment == 1 ||
( unpacking->Alignment == 4 && /* Pick up the common Q3A case... */
format == GL_RGBA && type == GL_UNSIGNED_BYTE ) ) &&
unpacking->RowLength == 0 &&
unpacking->SkipPixels == 0 &&
unpacking->SkipRows == 0 &&
unpacking->ImageHeight == 0 &&
unpacking->SkipImages == 0 &&
unpacking->SwapBytes == GL_FALSE &&
unpacking->LsbFirst == GL_FALSE ) {
return GL_FALSE;
} else {
return GL_TRUE;
}
}
 
 
GLboolean
_mesa_convert_texsubimage1d( GLint mesaFormat,
GLint xoffset,
GLint width,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
 
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
 
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
 
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = 0;
convert.width = width;
convert.height = 1;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
 
convert.index = 0;
 
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
 
ASSERT(convert.index < 4);
 
return convert_texsubimage2d_tab[mesaFormat]( &convert );
}
 
 
/* Convert a user's 2D image into a texture image. This basically
* repacks pixel data into the special texture formats used by core Mesa
* and the DRI drivers. This function can do full images or subimages.
*
* We return a boolean because this function may not accept some kinds
* of source image formats and/or types. For example, if the incoming
* format/type = GL_BGR, GL_UNSIGNED_INT this function probably won't
* be able to do the conversion.
*
* In that case, the incoming image should first be simplified to one of
* the "canonical" formats (GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
* GL_INTENSITY, GL_RGB, GL_RGBA) and types (GL_CHAN). We can do that
* with the _mesa_transfer_teximage() function. That function will also
* do image transfer operations such as scale/bias and convolution.
*
* Input:
* mesaFormat - one of the MESA_FORMAT_* values from texformat.h
* xoffset, yoffset - position in dest image to put data
* width, height - incoming image size, also size of dest region.
* dstImageWidth - width (row stride) of dest image in pixels
* format, type - incoming image format and type
* unpacking - describes incoming image unpacking
* srcImage - pointer to source image
* destImage - pointer to dest image
*/
GLboolean
_mesa_convert_texsubimage2d( GLint mesaFormat, /* dest */
GLint xoffset, GLint yoffset,
GLint width, GLint height,
GLint destImageWidth,
GLenum format, GLenum type, /* source */
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
 
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
 
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
 
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = yoffset;
convert.width = width;
convert.height = height;
convert.dstImageWidth = destImageWidth;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
 
convert.index = 0;
 
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
 
if ( width != destImageWidth )
convert.index |= CONVERT_STRIDE_BIT;
 
return convert_texsubimage2d_tab[mesaFormat]( &convert );
}
 
GLboolean
_mesa_convert_texsubimage3d( GLint mesaFormat, /* dest */
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLint dstImageWidth, GLint dstImageHeight,
GLenum format, GLenum type, /* source */
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
 
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
 
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
 
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = yoffset;
convert.zoffset = zoffset;
convert.width = width;
convert.height = height;
convert.depth = depth;
convert.dstImageWidth = dstImageWidth;
convert.dstImageHeight = dstImageHeight;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
 
convert.index = 0;
 
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
 
if ( width != dstImageWidth || height != dstImageHeight )
convert.index |= CONVERT_STRIDE_BIT;
 
return convert_texsubimage3d_tab[mesaFormat]( &convert );
}
 
 
 
/* Nearest filtering only (for broken hardware that can't support
* all aspect ratios). This can be made a lot faster, but I don't
* really care enough...
*/
void _mesa_rescale_teximage2d( GLuint bytesPerPixel, GLuint dstRowStride,
GLint srcWidth, GLint srcHeight,
GLint dstWidth, GLint dstHeight,
const GLvoid *srcImage, GLvoid *dstImage )
{
GLint row, col;
 
#define INNER_LOOP( TYPE, HOP, WOP ) \
for ( row = 0 ; row < dstHeight ; row++ ) { \
GLint srcRow = row HOP hScale; \
for ( col = 0 ; col < dstWidth ; col++ ) { \
GLint srcCol = col WOP wScale; \
dst[col] = src[srcRow * srcWidth + srcCol]; \
} \
dst = (TYPE *) ((GLubyte *) dst + dstRowStride); \
} \
 
#define RESCALE_IMAGE( TYPE ) \
do { \
const TYPE *src = (const TYPE *)srcImage; \
TYPE *dst = (TYPE *)dstImage; \
\
if ( srcHeight <= dstHeight ) { \
const GLint hScale = dstHeight / srcHeight; \
if ( srcWidth <= dstWidth ) { \
const GLint wScale = dstWidth / srcWidth; \
INNER_LOOP( TYPE, /, / ); \
} \
else { \
const GLint wScale = srcWidth / dstWidth; \
INNER_LOOP( TYPE, /, * ); \
} \
} \
else { \
const GLint hScale = srcHeight / dstHeight; \
if ( srcWidth <= dstWidth ) { \
const GLint wScale = dstWidth / srcWidth; \
INNER_LOOP( TYPE, *, / ); \
} \
else { \
const GLint wScale = srcWidth / dstWidth; \
INNER_LOOP( TYPE, *, * ); \
} \
} \
} while (0)
 
switch ( bytesPerPixel ) {
case 4:
RESCALE_IMAGE( GLuint );
break;
 
case 2:
RESCALE_IMAGE( GLushort );
break;
 
case 1:
RESCALE_IMAGE( GLubyte );
break;
default:
_mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d");
}
}
/shark/trunk/ports/mesa/src/convolve.h
0,0 → 1,108
/* $Id: convolve.h,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef CONVOLVE_H
#define CONVOLVE_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_ConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width,
GLenum format, GLenum type, const GLvoid *image);
 
extern void
_mesa_ConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width,
GLsizei height, GLenum format, GLenum type,
const GLvoid *image);
 
extern void
_mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat params);
 
extern void
_mesa_ConvolutionParameterfv(GLenum target, GLenum pname,
const GLfloat *params);
 
extern void
_mesa_ConvolutionParameteri(GLenum target, GLenum pname, GLint params);
 
extern void
_mesa_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params);
 
extern void
_mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width);
 
extern void
_mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width, GLsizei height);
 
extern void
_mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type,
GLvoid *image);
 
extern void
_mesa_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params);
 
extern void
_mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params);
 
extern void
_mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type,
GLvoid *row, GLvoid *column, GLvoid *span);
 
extern void
_mesa_SeparableFilter2D(GLenum target, GLenum internalformat,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *row, const GLvoid *column);
 
 
 
extern void
_mesa_convolve_1d_image(const GLcontext *ctx, GLsizei *width,
const GLfloat *srcImage, GLfloat *dstImage);
 
 
extern void
_mesa_convolve_2d_image(const GLcontext *ctx, GLsizei *width, GLsizei *height,
const GLfloat *srcImage, GLfloat *dstImage);
 
 
extern void
_mesa_convolve_sep_image(const GLcontext *ctx,
GLsizei *width, GLsizei *height,
const GLfloat *srcImage, GLfloat *dstImage);
 
 
extern void
_mesa_adjust_image_for_convolution(const GLcontext *ctx, GLuint dimensions,
GLsizei *width, GLsizei *height);
 
 
#endif
/shark/trunk/ports/mesa/src/texstate.c
0,0 → 1,2560
/* $Id: texstate.c,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "extensions.h"
#include "macros.h"
#include "texobj.h"
#include "teximage.h"
#include "texstate.h"
#include "mtypes.h"
#include "math/m_xform.h"
#include "math/m_matrix.h"
 
 
 
#ifdef SPECIALCAST
/* Needed for an Amiga compiler */
#define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))
#define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))
#else
/* all other compilers */
#define ENUM_TO_FLOAT(X) ((GLfloat)(X))
#define ENUM_TO_DOUBLE(X) ((GLdouble)(X))
#endif
 
 
 
void
_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst )
{
GLuint i;
 
ASSERT(src);
ASSERT(dst);
 
dst->Texture.CurrentUnit = src->Texture.CurrentUnit;
dst->Texture._GenFlags = src->Texture._GenFlags;
dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled;
dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled;
dst->Texture.SharedPalette = src->Texture.SharedPalette;
 
/* per-unit state */
for (i = 0; i < src->Const.MaxTextureUnits; i++) {
dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled;
dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode;
COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor);
dst->Texture.Unit[i].TexGenEnabled = src->Texture.Unit[i].TexGenEnabled;
dst->Texture.Unit[i].GenModeS = src->Texture.Unit[i].GenModeS;
dst->Texture.Unit[i].GenModeT = src->Texture.Unit[i].GenModeT;
dst->Texture.Unit[i].GenModeR = src->Texture.Unit[i].GenModeR;
dst->Texture.Unit[i].GenModeQ = src->Texture.Unit[i].GenModeQ;
dst->Texture.Unit[i]._GenBitS = src->Texture.Unit[i]._GenBitS;
dst->Texture.Unit[i]._GenBitT = src->Texture.Unit[i]._GenBitT;
dst->Texture.Unit[i]._GenBitR = src->Texture.Unit[i]._GenBitR;
dst->Texture.Unit[i]._GenBitQ = src->Texture.Unit[i]._GenBitQ;
dst->Texture.Unit[i]._GenFlags = src->Texture.Unit[i]._GenFlags;
COPY_4V(dst->Texture.Unit[i].ObjectPlaneS, src->Texture.Unit[i].ObjectPlaneS);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneT, src->Texture.Unit[i].ObjectPlaneT);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneR, src->Texture.Unit[i].ObjectPlaneR);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneQ, src->Texture.Unit[i].ObjectPlaneQ);
COPY_4V(dst->Texture.Unit[i].EyePlaneS, src->Texture.Unit[i].EyePlaneS);
COPY_4V(dst->Texture.Unit[i].EyePlaneT, src->Texture.Unit[i].EyePlaneT);
COPY_4V(dst->Texture.Unit[i].EyePlaneR, src->Texture.Unit[i].EyePlaneR);
COPY_4V(dst->Texture.Unit[i].EyePlaneQ, src->Texture.Unit[i].EyePlaneQ);
dst->Texture.Unit[i].LodBias = src->Texture.Unit[i].LodBias;
 
/* GL_EXT_texture_env_combine */
dst->Texture.Unit[i].CombineModeRGB = src->Texture.Unit[i].CombineModeRGB;
dst->Texture.Unit[i].CombineModeA = src->Texture.Unit[i].CombineModeA;
COPY_3V(dst->Texture.Unit[i].CombineSourceRGB, src->Texture.Unit[i].CombineSourceRGB);
COPY_3V(dst->Texture.Unit[i].CombineSourceA, src->Texture.Unit[i].CombineSourceA);
COPY_3V(dst->Texture.Unit[i].CombineOperandRGB, src->Texture.Unit[i].CombineOperandRGB);
COPY_3V(dst->Texture.Unit[i].CombineOperandA, src->Texture.Unit[i].CombineOperandA);
dst->Texture.Unit[i].CombineScaleShiftRGB = src->Texture.Unit[i].CombineScaleShiftRGB;
dst->Texture.Unit[i].CombineScaleShiftA = src->Texture.Unit[i].CombineScaleShiftA;
 
/* texture object state */
_mesa_copy_texture_object(dst->Texture.Unit[i].Current1D,
src->Texture.Unit[i].Current1D);
_mesa_copy_texture_object(dst->Texture.Unit[i].Current2D,
src->Texture.Unit[i].Current2D);
_mesa_copy_texture_object(dst->Texture.Unit[i].Current3D,
src->Texture.Unit[i].Current3D);
_mesa_copy_texture_object(dst->Texture.Unit[i].CurrentCubeMap,
src->Texture.Unit[i].CurrentCubeMap);
_mesa_copy_texture_object(dst->Texture.Unit[i].CurrentRect,
src->Texture.Unit[i].CurrentRect);
}
}
 
 
/**********************************************************************/
/* Texture Environment */
/**********************************************************************/
 
 
void
_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
#define TE_ERROR(errCode, msg, value) \
_mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
 
if (target == GL_TEXTURE_ENV) {
switch (pname) {
case GL_TEXTURE_ENV_MODE:
{
const GLenum mode = (GLenum) (GLint) *param;
if (mode == GL_MODULATE ||
mode == GL_BLEND ||
mode == GL_DECAL ||
mode == GL_REPLACE ||
(mode == GL_ADD && ctx->Extensions.EXT_texture_env_add) ||
(mode == GL_COMBINE_EXT &&
(ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine))) {
/* legal */
if (texUnit->EnvMode == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->EnvMode = mode;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
}
break;
case GL_TEXTURE_ENV_COLOR:
{
GLfloat tmp[4];
tmp[0] = CLAMP( param[0], 0.0F, 1.0F );
tmp[1] = CLAMP( param[1], 0.0F, 1.0F );
tmp[2] = CLAMP( param[2], 0.0F, 1.0F );
tmp[3] = CLAMP( param[3], 0.0F, 1.0F );
if (TEST_EQ_4V(tmp, texUnit->EnvColor))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
COPY_4FV(texUnit->EnvColor, tmp);
}
break;
case GL_COMBINE_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum mode = (GLenum) (GLint) *param;
switch (mode) {
case GL_REPLACE:
case GL_MODULATE:
case GL_ADD:
case GL_ADD_SIGNED_EXT:
case GL_INTERPOLATE_EXT:
/* OK */
break;
case GL_SUBTRACT_ARB:
if (!ctx->Extensions.ARB_texture_env_combine) {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
break;
case GL_DOT3_RGB_EXT:
case GL_DOT3_RGBA_EXT:
if (!ctx->Extensions.EXT_texture_env_dot3) {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
break;
case GL_DOT3_RGB_ARB:
case GL_DOT3_RGBA_ARB:
if (!ctx->Extensions.ARB_texture_env_dot3) {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
break;
default:
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
if (texUnit->CombineModeRGB == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineModeRGB = mode;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_COMBINE_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum mode = (GLenum) (GLint) *param;
if (mode == GL_REPLACE ||
mode == GL_MODULATE ||
mode == GL_ADD ||
mode == GL_ADD_SIGNED_EXT ||
mode == GL_INTERPOLATE_EXT ||
(mode == GL_SUBTRACT_ARB &&
ctx->Extensions.ARB_texture_env_combine)) {
/* legal */
if (texUnit->CombineModeA == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineModeA = mode;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_SOURCE0_RGB_EXT:
case GL_SOURCE1_RGB_EXT:
case GL_SOURCE2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum source = (GLenum) (GLint) *param;
const GLuint s = pname - GL_SOURCE0_RGB_EXT;
if (source == GL_TEXTURE ||
source == GL_CONSTANT_EXT ||
source == GL_PRIMARY_COLOR_EXT ||
source == GL_PREVIOUS_EXT ||
(ctx->Extensions.ARB_texture_env_crossbar &&
source >= GL_TEXTURE0_ARB &&
source < GL_TEXTURE0_ARB + ctx->Const.MaxTextureUnits)) {
/* legal */
if (texUnit->CombineSourceRGB[s] == source)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineSourceRGB[s] = source;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_SOURCE0_ALPHA_EXT:
case GL_SOURCE1_ALPHA_EXT:
case GL_SOURCE2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum source = (GLenum) (GLint) *param;
const GLuint s = pname - GL_SOURCE0_ALPHA_EXT;
if (source == GL_TEXTURE ||
source == GL_CONSTANT_EXT ||
source == GL_PRIMARY_COLOR_EXT ||
source == GL_PREVIOUS_EXT ||
(ctx->Extensions.ARB_texture_env_crossbar &&
source >= GL_TEXTURE0_ARB &&
source < GL_TEXTURE0_ARB + ctx->Const.MaxTextureUnits)) {
/* legal */
if (texUnit->CombineSourceA[s] == source)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineSourceA[s] = source;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_OPERAND0_RGB_EXT:
case GL_OPERAND1_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum operand = (GLenum) (GLint) *param;
const GLuint s = pname - GL_OPERAND0_RGB_EXT;
switch (operand) {
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
if (texUnit->CombineOperandRGB[s] == operand)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineOperandRGB[s] = operand;
break;
default:
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_OPERAND0_ALPHA_EXT:
case GL_OPERAND1_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum operand = (GLenum) (GLint) *param;
switch (operand) {
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
if (texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT] ==
operand)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT] = operand;
break;
default:
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_OPERAND2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum operand = (GLenum) (GLint) *param;
switch (operand) {
case GL_SRC_COLOR: /* ARB combine only */
case GL_ONE_MINUS_SRC_COLOR: /* ARB combine only */
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */
if (texUnit->CombineOperandRGB[2] == operand)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineOperandRGB[2] = operand;
default:
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_OPERAND2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
const GLenum operand = (GLenum) (GLint) *param;
switch (operand) {
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */
if (texUnit->CombineOperandA[2] == operand)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineOperandA[2] = operand;
break;
default:
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
return;
}
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_RGB_SCALE_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
GLuint newshift;
if (*param == 1.0) {
newshift = 0;
}
else if (*param == 2.0) {
newshift = 1;
}
else if (*param == 4.0) {
newshift = 2;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE,
"glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
return;
}
if (texUnit->CombineScaleShiftRGB == newshift)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineScaleShiftRGB = newshift;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
case GL_ALPHA_SCALE:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
GLuint newshift;
if (*param == 1.0) {
newshift = 0;
}
else if (*param == 2.0) {
newshift = 1;
}
else if (*param == 4.0) {
newshift = 2;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE,
"glTexEnv(GL_ALPHA_SCALE not 1, 2 or 4)" );
return;
}
if (texUnit->CombineScaleShiftA == newshift)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->CombineScaleShiftA = newshift;
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
return;
}
}
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
/* GL_EXT_texture_lod_bias */
if (!ctx->Extensions.EXT_texture_lod_bias) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
return;
}
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
if (texUnit->LodBias == param[0])
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->LodBias = CLAMP(param[0], -ctx->Const.MaxTextureLodBias,
ctx->Const.MaxTextureLodBias);
}
else {
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
return;
}
}
else if (target == GL_POINT_SPRITE_NV) {
/* GL_NV_point_sprite */
if (!ctx->Extensions.NV_point_sprite) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
return;
}
if (pname == GL_COORD_REPLACE_NV) {
const GLenum value = (GLenum) param[0];
if (value == GL_TRUE || value == GL_FALSE) {
/* It's kind of weird to set point state via glTexEnv,
* but that's what the spec calls for.
*/
const GLboolean state = (GLboolean) value;
if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", value);
return;
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
return;
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
_mesa_lookup_enum_by_nr(target),
_mesa_lookup_enum_by_nr(pname),
*param,
_mesa_lookup_enum_by_nr((GLenum) (GLint) *param));
 
/* Tell device driver about the new texture environment */
if (ctx->Driver.TexEnv) {
(*ctx->Driver.TexEnv)( ctx, target, pname, param );
}
}
 
 
void
_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
{
_mesa_TexEnvfv( target, pname, &param );
}
 
 
 
void
_mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
{
GLfloat p[4];
p[0] = (GLfloat) param;
p[1] = p[2] = p[3] = 0.0;
_mesa_TexEnvfv( target, pname, p );
}
 
 
void
_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
{
GLfloat p[4];
if (pname == GL_TEXTURE_ENV_COLOR) {
p[0] = INT_TO_FLOAT( param[0] );
p[1] = INT_TO_FLOAT( param[1] );
p[2] = INT_TO_FLOAT( param[2] );
p[3] = INT_TO_FLOAT( param[3] );
}
else {
p[0] = (GLfloat) param[0];
p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */
}
_mesa_TexEnvfv( target, pname, p );
}
 
 
void
_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target == GL_TEXTURE_ENV) {
switch (pname) {
case GL_TEXTURE_ENV_MODE:
*params = ENUM_TO_FLOAT(texUnit->EnvMode);
break;
case GL_TEXTURE_ENV_COLOR:
COPY_4FV( params, texUnit->EnvColor );
break;
case GL_COMBINE_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineModeRGB;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_COMBINE_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineModeA;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE0_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceRGB[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE1_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceRGB[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceRGB[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE0_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceA[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE1_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceA[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_SOURCE2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineSourceA[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND0_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandRGB[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND1_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandRGB[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandRGB[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND0_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandA[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND1_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandA[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_OPERAND2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLfloat) texUnit->CombineOperandA[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
}
break;
case GL_RGB_SCALE_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
if (texUnit->CombineScaleShiftRGB == 0)
*params = 1.0;
else if (texUnit->CombineScaleShiftRGB == 1)
*params = 2.0;
else
*params = 4.0;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
return;
}
break;
case GL_ALPHA_SCALE:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
if (texUnit->CombineScaleShiftA == 0)
*params = 1.0;
else if (texUnit->CombineScaleShiftA == 1)
*params = 2.0;
else
*params = 4.0;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
}
}
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
/* GL_EXT_texture_lod_bias */
if (!ctx->Extensions.EXT_texture_lod_bias) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
return;
}
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
*params = texUnit->LodBias;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
return;
}
}
else if (target == GL_POINT_SPRITE_NV) {
/* GL_NV_point_sprite */
if (!ctx->Extensions.NV_point_sprite) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
return;
}
if (pname == GL_COORD_REPLACE_NV) {
*params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
return;
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
return;
}
}
 
 
void
_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target == GL_TEXTURE_ENV) {
switch (pname) {
case GL_TEXTURE_ENV_MODE:
*params = (GLint) texUnit->EnvMode;
break;
case GL_TEXTURE_ENV_COLOR:
params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
break;
case GL_COMBINE_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineModeRGB;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_COMBINE_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineModeA;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE0_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE1_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceRGB[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE0_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE1_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_SOURCE2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineSourceA[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND0_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND1_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND2_RGB_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandRGB[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND0_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND1_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[1];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_OPERAND2_ALPHA_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
*params = (GLint) texUnit->CombineOperandA[2];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
}
break;
case GL_RGB_SCALE_EXT:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
if (texUnit->CombineScaleShiftRGB == 0)
*params = 1;
else if (texUnit->CombineScaleShiftRGB == 1)
*params = 2;
else
*params = 4;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
return;
}
break;
case GL_ALPHA_SCALE:
if (ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine) {
if (texUnit->CombineScaleShiftA == 0)
*params = 1;
else if (texUnit->CombineScaleShiftA == 1)
*params = 2;
else
*params = 4;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
}
}
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
/* GL_EXT_texture_lod_bias */
if (!ctx->Extensions.EXT_texture_lod_bias) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
return;
}
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
*params = (GLint) texUnit->LodBias;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
return;
}
}
else if (target == GL_POINT_SPRITE_NV) {
/* GL_NV_point_sprite */
if (!ctx->Extensions.NV_point_sprite) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
return;
}
if (pname == GL_COORD_REPLACE_NV) {
*params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
return;
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
return;
}
}
 
 
 
 
/**********************************************************************/
/* Texture Parameters */
/**********************************************************************/
 
 
void
_mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param )
{
_mesa_TexParameterfv(target, pname, &param);
}
 
 
void
_mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
GLenum eparam = (GLenum) (GLint) params[0];
struct gl_texture_object *texObj;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "texPARAM %s %s %d...\n",
_mesa_lookup_enum_by_nr(target),
_mesa_lookup_enum_by_nr(pname),
eparam);
 
 
switch (target) {
case GL_TEXTURE_1D:
texObj = texUnit->Current1D;
break;
case GL_TEXTURE_2D:
texObj = texUnit->Current2D;
break;
case GL_TEXTURE_3D_EXT:
texObj = texUnit->Current3D;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
return;
}
texObj = texUnit->CurrentCubeMap;
break;
case GL_TEXTURE_RECTANGLE_NV:
if (!ctx->Extensions.NV_texture_rectangle) {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
return;
}
texObj = texUnit->CurrentRect;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
return;
}
 
switch (pname) {
case GL_TEXTURE_MIN_FILTER:
/* A small optimization */
if (texObj->MinFilter == eparam)
return;
if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MinFilter = eparam;
}
else if ((eparam==GL_NEAREST_MIPMAP_NEAREST ||
eparam==GL_LINEAR_MIPMAP_NEAREST ||
eparam==GL_NEAREST_MIPMAP_LINEAR ||
eparam==GL_LINEAR_MIPMAP_LINEAR) &&
texObj->Target != GL_TEXTURE_RECTANGLE_NV) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MinFilter = eparam;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
break;
case GL_TEXTURE_MAG_FILTER:
/* A small optimization */
if (texObj->MagFilter == eparam)
return;
 
if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MagFilter = eparam;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
break;
case GL_TEXTURE_WRAP_S:
if (texObj->WrapS == eparam)
return;
if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE ||
(eparam == GL_CLAMP_TO_BORDER_ARB &&
ctx->Extensions.ARB_texture_border_clamp)) {
/* any texture target */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapS = eparam;
}
else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV &&
(eparam == GL_REPEAT ||
(eparam == GL_MIRRORED_REPEAT_ARB &&
ctx->Extensions.ARB_texture_mirrored_repeat) ||
(eparam == GL_MIRROR_CLAMP_ATI &&
ctx->Extensions.ATI_texture_mirror_once) ||
(eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI &&
ctx->Extensions.ATI_texture_mirror_once))) {
/* non-rectangle texture */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapS = eparam;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
break;
case GL_TEXTURE_WRAP_T:
if (texObj->WrapT == eparam)
return;
if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE ||
(eparam == GL_CLAMP_TO_BORDER_ARB &&
ctx->Extensions.ARB_texture_border_clamp)) {
/* any texture target */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapT = eparam;
}
else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV &&
(eparam == GL_REPEAT ||
(eparam == GL_MIRRORED_REPEAT_ARB &&
ctx->Extensions.ARB_texture_mirrored_repeat) ||
(eparam == GL_MIRROR_CLAMP_ATI &&
ctx->Extensions.ATI_texture_mirror_once) ||
(eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI &&
ctx->Extensions.ATI_texture_mirror_once))) {
/* non-rectangle texture */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapT = eparam;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
break;
case GL_TEXTURE_WRAP_R_EXT:
if (texObj->WrapR == eparam)
return;
if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE ||
(eparam == GL_CLAMP_TO_BORDER_ARB &&
ctx->Extensions.ARB_texture_border_clamp)) {
/* any texture target */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapR = eparam;
}
else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV &&
(eparam == GL_REPEAT ||
(eparam == GL_MIRRORED_REPEAT_ARB &&
ctx->Extensions.ARB_texture_mirrored_repeat) ||
(eparam == GL_MIRROR_CLAMP_ATI &&
ctx->Extensions.ATI_texture_mirror_once) ||
(eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI &&
ctx->Extensions.ATI_texture_mirror_once))) {
/* non-rectangle texture */
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->WrapR = eparam;
}
else {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
}
break;
case GL_TEXTURE_BORDER_COLOR:
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->BorderColor[RCOMP] = params[0];
texObj->BorderColor[GCOMP] = params[1];
texObj->BorderColor[BCOMP] = params[2];
texObj->BorderColor[ACOMP] = params[3];
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]);
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]);
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]);
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]);
break;
case GL_TEXTURE_MIN_LOD:
if (texObj->MinLod == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MinLod = params[0];
break;
case GL_TEXTURE_MAX_LOD:
if (texObj->MaxLod == params[0])
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MaxLod = params[0];
break;
case GL_TEXTURE_BASE_LEVEL:
if (params[0] < 0.0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
if (target == GL_TEXTURE_RECTANGLE_NV && params[0] != 0.0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->BaseLevel = (GLint) params[0];
break;
case GL_TEXTURE_MAX_LEVEL:
if (params[0] < 0.0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MaxLevel = (GLint) params[0];
break;
case GL_TEXTURE_PRIORITY:
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->Priority = CLAMP( params[0], 0.0F, 1.0F );
break;
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
if (params[0] < 1.0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
return;
}
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->MaxAnisotropy = params[0];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");
return;
}
break;
case GL_TEXTURE_COMPARE_SGIX:
if (ctx->Extensions.SGIX_shadow) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)");
return;
}
break;
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
if (ctx->Extensions.SGIX_shadow) {
GLenum op = (GLenum) params[0];
if (op == GL_TEXTURE_LEQUAL_R_SGIX ||
op == GL_TEXTURE_GEQUAL_R_SGIX) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->CompareOperator = op;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)");
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_TEXTURE_COMPARE_OPERATOR_SGIX)");
return;
}
break;
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
if (ctx->Extensions.SGIX_shadow_ambient) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F);
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)");
return;
}
break;
case GL_GENERATE_MIPMAP_SGIS:
if (ctx->Extensions.SGIS_generate_mipmap) {
texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)");
return;
}
break;
case GL_TEXTURE_COMPARE_MODE_ARB:
if (ctx->Extensions.ARB_shadow) {
const GLenum mode = (GLenum) params[0];
if (mode == GL_NONE || mode == GL_COMPARE_R_TO_TEXTURE_ARB) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->CompareMode = mode;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(bad GL_TEXTURE_COMPARE_MODE_ARB)");
return;
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_TEXTURE_COMPARE_MODE_ARB)");
return;
}
break;
case GL_TEXTURE_COMPARE_FUNC_ARB:
if (ctx->Extensions.ARB_shadow) {
const GLenum func = (GLenum) params[0];
if (func == GL_LEQUAL || func == GL_GEQUAL) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->CompareFunc = func;
}
else if (ctx->Extensions.EXT_shadow_funcs &&
(func == GL_EQUAL ||
func == GL_NOTEQUAL ||
func == GL_LESS ||
func == GL_GREATER ||
func == GL_ALWAYS ||
func == GL_NEVER)) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->CompareFunc = func;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)");
return;
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_TEXTURE_COMPARE_FUNC_ARB)");
return;
}
break;
case GL_DEPTH_TEXTURE_MODE_ARB:
if (ctx->Extensions.ARB_depth_texture) {
const GLenum result = (GLenum) params[0];
if (result == GL_LUMINANCE || result == GL_INTENSITY
|| result == GL_ALPHA) {
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texObj->DepthMode = result;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(bad GL_DEPTH_TEXTURE_MODE_ARB)");
return;
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=GL_DEPTH_TEXTURE_MODE_ARB)");
return;
}
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexParameter(pname=0x%x)", pname);
return;
}
 
texObj->Complete = GL_FALSE;
 
if (ctx->Driver.TexParameter) {
(*ctx->Driver.TexParameter)( ctx, target, texObj, pname, params );
}
}
 
 
void
_mesa_TexParameteri( GLenum target, GLenum pname, GLint param )
{
GLfloat fparam[4];
fparam[0] = (GLfloat) param;
fparam[1] = fparam[2] = fparam[3] = 0.0;
_mesa_TexParameterfv(target, pname, fparam);
}
 
 
void
_mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params )
{
GLfloat fparam[4];
if (pname == GL_TEXTURE_BORDER_COLOR) {
fparam[0] = INT_TO_FLOAT(params[0]);
fparam[1] = INT_TO_FLOAT(params[1]);
fparam[2] = INT_TO_FLOAT(params[2]);
fparam[3] = INT_TO_FLOAT(params[3]);
}
else {
fparam[0] = (GLfloat) params[0];
fparam[1] = fparam[2] = fparam[3] = 0.0F;
}
_mesa_TexParameterfv(target, pname, fparam);
}
 
 
void
_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
GLenum pname, GLfloat *params )
{
GLint iparam;
_mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
*params = (GLfloat) iparam;
}
 
 
static GLuint
tex_image_dimensions(GLcontext *ctx, GLenum target)
{
switch (target) {
case GL_TEXTURE_1D:
case GL_PROXY_TEXTURE_1D:
return 1;
case GL_TEXTURE_2D:
case GL_PROXY_TEXTURE_2D:
return 2;
case GL_TEXTURE_3D:
case GL_PROXY_TEXTURE_3D:
return 3;
case GL_TEXTURE_CUBE_MAP_ARB:
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
case GL_TEXTURE_RECTANGLE_NV:
case GL_PROXY_TEXTURE_RECTANGLE_NV:
return ctx->Extensions.NV_texture_rectangle ? 2 : 0;
default:
_mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
return 0;
}
}
 
 
void
_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
const struct gl_texture_image *img = NULL;
GLuint dimensions;
GLboolean isProxy;
GLint maxLevels;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
/* this will catch bad target values */
dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */
if (dimensions == 0) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
return;
}
 
switch (target) {
case GL_TEXTURE_1D:
case GL_PROXY_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_PROXY_TEXTURE_2D:
maxLevels = ctx->Const.MaxTextureLevels;
break;
case GL_TEXTURE_3D:
case GL_PROXY_TEXTURE_3D:
maxLevels = ctx->Const.Max3DTextureLevels;
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
maxLevels = ctx->Const.MaxCubeTextureLevels;
break;
case GL_TEXTURE_RECTANGLE_NV:
case GL_PROXY_TEXTURE_RECTANGLE_NV:
maxLevels = 1;
break;
default:
_mesa_problem(ctx, "switch in _mesa_GetTexLevelParameter");
return;
}
 
if (level < 0 || level >= maxLevels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
return;
}
 
img = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!img || !img->TexFormat) {
/* undefined texture image */
if (pname == GL_TEXTURE_COMPONENTS)
*params = 1;
else
*params = 0;
return;
}
 
isProxy = (target == GL_PROXY_TEXTURE_1D) ||
(target == GL_PROXY_TEXTURE_2D) ||
(target == GL_PROXY_TEXTURE_3D) ||
(target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) ||
(target == GL_PROXY_TEXTURE_RECTANGLE_NV);
 
switch (pname) {
case GL_TEXTURE_WIDTH:
*params = img->Width;
return;
case GL_TEXTURE_HEIGHT:
*params = img->Height;
return;
case GL_TEXTURE_DEPTH:
*params = img->Depth;
return;
case GL_TEXTURE_INTERNAL_FORMAT:
*params = img->IntFormat;
return;
case GL_TEXTURE_BORDER:
*params = img->Border;
return;
case GL_TEXTURE_RED_SIZE:
if (img->Format == GL_RGB || img->Format == GL_RGBA)
*params = img->TexFormat->RedBits;
else
*params = 0;
return;
case GL_TEXTURE_GREEN_SIZE:
if (img->Format == GL_RGB || img->Format == GL_RGBA)
*params = img->TexFormat->GreenBits;
else
*params = 0;
return;
case GL_TEXTURE_BLUE_SIZE:
if (img->Format == GL_RGB || img->Format == GL_RGBA)
*params = img->TexFormat->BlueBits;
else
*params = 0;
return;
case GL_TEXTURE_ALPHA_SIZE:
if (img->Format == GL_ALPHA || img->Format == GL_LUMINANCE_ALPHA ||
img->Format == GL_RGBA)
*params = img->TexFormat->AlphaBits;
else
*params = 0;
return;
case GL_TEXTURE_INTENSITY_SIZE:
if (img->Format != GL_INTENSITY)
*params = 0;
else if (img->TexFormat->IntensityBits > 0)
*params = img->TexFormat->IntensityBits;
else /* intensity probably stored as rgb texture */
*params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
return;
case GL_TEXTURE_LUMINANCE_SIZE:
if (img->Format != GL_LUMINANCE &&
img->Format != GL_LUMINANCE_ALPHA)
*params = 0;
else if (img->TexFormat->LuminanceBits > 0)
*params = img->TexFormat->LuminanceBits;
else /* luminance probably stored as rgb texture */
*params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
return;
case GL_TEXTURE_INDEX_SIZE_EXT:
if (img->Format == GL_COLOR_INDEX)
*params = img->TexFormat->IndexBits;
else
*params = 0;
return;
case GL_DEPTH_BITS:
/* XXX this isn't in the GL_SGIX_depth_texture spec
* but seems appropriate.
*/
if (ctx->Extensions.SGIX_depth_texture)
*params = img->TexFormat->DepthBits;
else
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTexLevelParameter[if]v(pname)");
return;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB:
if (ctx->Extensions.ARB_texture_compression) {
if (img->IsCompressed && !isProxy)
*params = img->CompressedSize;
else
_mesa_error(ctx, GL_INVALID_OPERATION,
"glGetTexLevelParameter[if]v(pname)");
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTexLevelParameter[if]v(pname)");
}
return;
case GL_TEXTURE_COMPRESSED_ARB:
if (ctx->Extensions.ARB_texture_compression) {
*params = (GLint) img->IsCompressed;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTexLevelParameter[if]v(pname)");
}
return;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetTexLevelParameter[if]v(pname)");
}
}
 
 
 
void
_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_object *obj;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
obj = _mesa_select_tex_object(ctx, texUnit, target);
if (!obj) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)");
return;
}
 
switch (pname) {
case GL_TEXTURE_MAG_FILTER:
*params = ENUM_TO_FLOAT(obj->MagFilter);
return;
case GL_TEXTURE_MIN_FILTER:
*params = ENUM_TO_FLOAT(obj->MinFilter);
return;
case GL_TEXTURE_WRAP_S:
*params = ENUM_TO_FLOAT(obj->WrapS);
return;
case GL_TEXTURE_WRAP_T:
*params = ENUM_TO_FLOAT(obj->WrapT);
return;
case GL_TEXTURE_WRAP_R_EXT:
*params = ENUM_TO_FLOAT(obj->WrapR);
return;
case GL_TEXTURE_BORDER_COLOR:
params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
return;
case GL_TEXTURE_RESIDENT:
{
GLboolean resident;
if (ctx->Driver.IsTextureResident)
resident = ctx->Driver.IsTextureResident(ctx, obj);
else
resident = GL_TRUE;
*params = ENUM_TO_FLOAT(resident);
}
return;
case GL_TEXTURE_PRIORITY:
*params = obj->Priority;
return;
case GL_TEXTURE_MIN_LOD:
*params = obj->MinLod;
return;
case GL_TEXTURE_MAX_LOD:
*params = obj->MaxLod;
return;
case GL_TEXTURE_BASE_LEVEL:
*params = (GLfloat) obj->BaseLevel;
return;
case GL_TEXTURE_MAX_LEVEL:
*params = (GLfloat) obj->MaxLevel;
return;
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
*params = obj->MaxAnisotropy;
return;
}
break;
case GL_TEXTURE_COMPARE_SGIX:
if (ctx->Extensions.SGIX_shadow) {
*params = (GLfloat) obj->CompareFlag;
return;
}
break;
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
if (ctx->Extensions.SGIX_shadow) {
*params = (GLfloat) obj->CompareOperator;
return;
}
break;
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
if (ctx->Extensions.SGIX_shadow_ambient) {
*params = obj->ShadowAmbient;
return;
}
break;
case GL_GENERATE_MIPMAP_SGIS:
if (ctx->Extensions.SGIS_generate_mipmap) {
*params = (GLfloat) obj->GenerateMipmap;
return;
}
break;
case GL_TEXTURE_COMPARE_MODE_ARB:
if (ctx->Extensions.ARB_shadow) {
*params = (GLfloat) obj->CompareMode;
return;
}
break;
case GL_TEXTURE_COMPARE_FUNC_ARB:
if (ctx->Extensions.ARB_shadow) {
*params = (GLfloat) obj->CompareFunc;
return;
}
break;
case GL_DEPTH_TEXTURE_MODE_ARB:
if (ctx->Extensions.ARB_depth_texture) {
*params = (GLfloat) obj->DepthMode;
return;
}
break;
default:
; /* silence warnings */
}
/* If we get here, pname was an unrecognized enum */
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" );
}
 
 
void
_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_object *obj;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
obj = _mesa_select_tex_object(ctx, texUnit, target);
if (!obj) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)");
return;
}
 
switch (pname) {
case GL_TEXTURE_MAG_FILTER:
*params = (GLint) obj->MagFilter;
return;
case GL_TEXTURE_MIN_FILTER:
*params = (GLint) obj->MinFilter;
return;
case GL_TEXTURE_WRAP_S:
*params = (GLint) obj->WrapS;
return;
case GL_TEXTURE_WRAP_T:
*params = (GLint) obj->WrapT;
return;
case GL_TEXTURE_WRAP_R_EXT:
*params = (GLint) obj->WrapR;
return;
case GL_TEXTURE_BORDER_COLOR:
{
GLfloat b[4];
b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
params[0] = FLOAT_TO_INT(b[0]);
params[1] = FLOAT_TO_INT(b[1]);
params[2] = FLOAT_TO_INT(b[2]);
params[3] = FLOAT_TO_INT(b[3]);
}
return;
case GL_TEXTURE_RESIDENT:
{
GLboolean resident;
if (ctx->Driver.IsTextureResident)
resident = ctx->Driver.IsTextureResident(ctx, obj);
else
resident = GL_TRUE;
*params = (GLint) resident;
}
return;
case GL_TEXTURE_PRIORITY:
*params = (GLint) obj->Priority;
return;
case GL_TEXTURE_MIN_LOD:
*params = (GLint) obj->MinLod;
return;
case GL_TEXTURE_MAX_LOD:
*params = (GLint) obj->MaxLod;
return;
case GL_TEXTURE_BASE_LEVEL:
*params = obj->BaseLevel;
return;
case GL_TEXTURE_MAX_LEVEL:
*params = obj->MaxLevel;
return;
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
*params = (GLint) obj->MaxAnisotropy;
return;
}
break;
case GL_TEXTURE_COMPARE_SGIX:
if (ctx->Extensions.SGIX_shadow) {
*params = (GLint) obj->CompareFlag;
return;
}
break;
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
if (ctx->Extensions.SGIX_shadow) {
*params = (GLint) obj->CompareOperator;
return;
}
break;
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
if (ctx->Extensions.SGIX_shadow_ambient) {
*params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient);
return;
}
break;
case GL_GENERATE_MIPMAP_SGIS:
if (ctx->Extensions.SGIS_generate_mipmap) {
*params = (GLint) obj->GenerateMipmap;
return;
}
break;
case GL_TEXTURE_COMPARE_MODE_ARB:
if (ctx->Extensions.ARB_shadow) {
*params = (GLint) obj->CompareMode;
return;
}
break;
case GL_TEXTURE_COMPARE_FUNC_ARB:
if (ctx->Extensions.ARB_shadow) {
*params = (GLint) obj->CompareFunc;
return;
}
break;
case GL_DEPTH_TEXTURE_MODE_ARB:
if (ctx->Extensions.ARB_depth_texture) {
*params = (GLint) obj->DepthMode;
return;
}
break;
default:
; /* silence warnings */
}
/* If we get here, pname was an unrecognized enum */
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" );
}
 
 
 
 
/**********************************************************************/
/* Texture Coord Generation */
/**********************************************************************/
 
 
void
_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint tUnit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "texGEN %s %s %x...\n",
_mesa_lookup_enum_by_nr(coord),
_mesa_lookup_enum_by_nr(pname),
*(int *)params);
 
switch (coord) {
case GL_S:
if (pname==GL_TEXTURE_GEN_MODE) {
GLenum mode = (GLenum) (GLint) *params;
GLuint bits;
switch (mode) {
case GL_OBJECT_LINEAR:
bits = TEXGEN_OBJ_LINEAR;
break;
case GL_EYE_LINEAR:
bits = TEXGEN_EYE_LINEAR;
break;
case GL_REFLECTION_MAP_NV:
bits = TEXGEN_REFLECTION_MAP_NV;
break;
case GL_NORMAL_MAP_NV:
bits = TEXGEN_NORMAL_MAP_NV;
break;
case GL_SPHERE_MAP:
bits = TEXGEN_SPHERE_MAP;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
return;
}
if (texUnit->GenModeS == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->GenModeS = mode;
texUnit->_GenBitS = bits;
}
else if (pname==GL_OBJECT_PLANE) {
if (TEST_EQ_4V(texUnit->ObjectPlaneS, params))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->ObjectPlaneS[0] = params[0];
texUnit->ObjectPlaneS[1] = params[1];
texUnit->ObjectPlaneS[2] = params[2];
texUnit->ObjectPlaneS[3] = params[3];
}
else if (pname==GL_EYE_PLANE) {
GLfloat tmp[4];
 
/* Transform plane equation by the inverse modelview matrix */
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_4V(texUnit->EyePlaneS, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
COPY_4FV(texUnit->EyePlaneS, tmp);
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
return;
}
break;
case GL_T:
if (pname==GL_TEXTURE_GEN_MODE) {
GLenum mode = (GLenum) (GLint) *params;
GLuint bitt;
switch (mode) {
case GL_OBJECT_LINEAR:
bitt = TEXGEN_OBJ_LINEAR;
break;
case GL_EYE_LINEAR:
bitt = TEXGEN_EYE_LINEAR;
break;
case GL_REFLECTION_MAP_NV:
bitt = TEXGEN_REFLECTION_MAP_NV;
break;
case GL_NORMAL_MAP_NV:
bitt = TEXGEN_NORMAL_MAP_NV;
break;
case GL_SPHERE_MAP:
bitt = TEXGEN_SPHERE_MAP;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
return;
}
if (texUnit->GenModeT == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->GenModeT = mode;
texUnit->_GenBitT = bitt;
}
else if (pname==GL_OBJECT_PLANE) {
if (TEST_EQ_4V(texUnit->ObjectPlaneT, params))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->ObjectPlaneT[0] = params[0];
texUnit->ObjectPlaneT[1] = params[1];
texUnit->ObjectPlaneT[2] = params[2];
texUnit->ObjectPlaneT[3] = params[3];
}
else if (pname==GL_EYE_PLANE) {
GLfloat tmp[4];
/* Transform plane equation by the inverse modelview matrix */
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_4V(texUnit->EyePlaneT, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
COPY_4FV(texUnit->EyePlaneT, tmp);
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
return;
}
break;
case GL_R:
if (pname==GL_TEXTURE_GEN_MODE) {
GLenum mode = (GLenum) (GLint) *params;
GLuint bitr;
switch (mode) {
case GL_OBJECT_LINEAR:
bitr = TEXGEN_OBJ_LINEAR;
break;
case GL_REFLECTION_MAP_NV:
bitr = TEXGEN_REFLECTION_MAP_NV;
break;
case GL_NORMAL_MAP_NV:
bitr = TEXGEN_NORMAL_MAP_NV;
break;
case GL_EYE_LINEAR:
bitr = TEXGEN_EYE_LINEAR;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
return;
}
if (texUnit->GenModeR == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->GenModeR = mode;
texUnit->_GenBitR = bitr;
}
else if (pname==GL_OBJECT_PLANE) {
if (TEST_EQ_4V(texUnit->ObjectPlaneR, params))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->ObjectPlaneR[0] = params[0];
texUnit->ObjectPlaneR[1] = params[1];
texUnit->ObjectPlaneR[2] = params[2];
texUnit->ObjectPlaneR[3] = params[3];
}
else if (pname==GL_EYE_PLANE) {
GLfloat tmp[4];
/* Transform plane equation by the inverse modelview matrix */
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_4V(texUnit->EyePlaneR, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
COPY_4FV(texUnit->EyePlaneR, tmp);
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
return;
}
break;
case GL_Q:
if (pname==GL_TEXTURE_GEN_MODE) {
GLenum mode = (GLenum) (GLint) *params;
GLuint bitq;
switch (mode) {
case GL_OBJECT_LINEAR:
bitq = TEXGEN_OBJ_LINEAR;
break;
case GL_EYE_LINEAR:
bitq = TEXGEN_EYE_LINEAR;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
return;
}
if (texUnit->GenModeQ == mode)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->GenModeQ = mode;
texUnit->_GenBitQ = bitq;
}
else if (pname==GL_OBJECT_PLANE) {
if (TEST_EQ_4V(texUnit->ObjectPlaneQ, params))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->ObjectPlaneQ[0] = params[0];
texUnit->ObjectPlaneQ[1] = params[1];
texUnit->ObjectPlaneQ[2] = params[2];
texUnit->ObjectPlaneQ[3] = params[3];
}
else if (pname==GL_EYE_PLANE) {
GLfloat tmp[4];
/* Transform plane equation by the inverse modelview matrix */
if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_4V(texUnit->EyePlaneQ, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
COPY_4FV(texUnit->EyePlaneQ, tmp);
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" );
return;
}
 
if (ctx->Driver.TexGen)
ctx->Driver.TexGen( ctx, coord, pname, params );
}
 
 
void
_mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params )
{
GLfloat p[4];
p[0] = (GLfloat) params[0];
p[1] = (GLfloat) params[1];
p[2] = (GLfloat) params[2];
p[3] = (GLfloat) params[3];
_mesa_TexGenfv(coord, pname, p);
}
 
 
void
_mesa_TexGend(GLenum coord, GLenum pname, GLdouble param )
{
GLfloat p = (GLfloat) param;
_mesa_TexGenfv( coord, pname, &p );
}
 
 
void
_mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params )
{
GLfloat p[4];
p[0] = (GLfloat) params[0];
p[1] = (GLfloat) params[1];
p[2] = (GLfloat) params[2];
p[3] = (GLfloat) params[3];
_mesa_TexGenfv( coord, pname, p );
}
 
 
void
_mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param )
{
_mesa_TexGenfv(coord, pname, &param);
}
 
 
void
_mesa_TexGeni( GLenum coord, GLenum pname, GLint param )
{
_mesa_TexGeniv( coord, pname, &param );
}
 
 
 
void
_mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint tUnit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (coord) {
case GL_S:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeS);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneS );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneS );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
return;
}
break;
case GL_T:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeT);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneT );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneT );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
return;
}
break;
case GL_R:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeR);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneR );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneR );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
return;
}
break;
case GL_Q:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeQ);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneQ );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneQ );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" );
return;
}
}
 
 
 
void
_mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint tUnit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (coord) {
case GL_S:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_FLOAT(texUnit->GenModeS);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneS );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneS );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
return;
}
break;
case GL_T:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_FLOAT(texUnit->GenModeT);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneT );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneT );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
return;
}
break;
case GL_R:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_FLOAT(texUnit->GenModeR);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneR );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneR );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
return;
}
break;
case GL_Q:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = ENUM_TO_FLOAT(texUnit->GenModeQ);
}
else if (pname==GL_OBJECT_PLANE) {
COPY_4V( params, texUnit->ObjectPlaneQ );
}
else if (pname==GL_EYE_PLANE) {
COPY_4V( params, texUnit->EyePlaneQ );
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" );
return;
}
}
 
 
 
void
_mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint tUnit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (coord) {
case GL_S:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = texUnit->GenModeS;
}
else if (pname==GL_OBJECT_PLANE) {
params[0] = (GLint) texUnit->ObjectPlaneS[0];
params[1] = (GLint) texUnit->ObjectPlaneS[1];
params[2] = (GLint) texUnit->ObjectPlaneS[2];
params[3] = (GLint) texUnit->ObjectPlaneS[3];
}
else if (pname==GL_EYE_PLANE) {
params[0] = (GLint) texUnit->EyePlaneS[0];
params[1] = (GLint) texUnit->EyePlaneS[1];
params[2] = (GLint) texUnit->EyePlaneS[2];
params[3] = (GLint) texUnit->EyePlaneS[3];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
return;
}
break;
case GL_T:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = texUnit->GenModeT;
}
else if (pname==GL_OBJECT_PLANE) {
params[0] = (GLint) texUnit->ObjectPlaneT[0];
params[1] = (GLint) texUnit->ObjectPlaneT[1];
params[2] = (GLint) texUnit->ObjectPlaneT[2];
params[3] = (GLint) texUnit->ObjectPlaneT[3];
}
else if (pname==GL_EYE_PLANE) {
params[0] = (GLint) texUnit->EyePlaneT[0];
params[1] = (GLint) texUnit->EyePlaneT[1];
params[2] = (GLint) texUnit->EyePlaneT[2];
params[3] = (GLint) texUnit->EyePlaneT[3];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
return;
}
break;
case GL_R:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = texUnit->GenModeR;
}
else if (pname==GL_OBJECT_PLANE) {
params[0] = (GLint) texUnit->ObjectPlaneR[0];
params[1] = (GLint) texUnit->ObjectPlaneR[1];
params[2] = (GLint) texUnit->ObjectPlaneR[2];
params[3] = (GLint) texUnit->ObjectPlaneR[3];
}
else if (pname==GL_EYE_PLANE) {
params[0] = (GLint) texUnit->EyePlaneR[0];
params[1] = (GLint) texUnit->EyePlaneR[1];
params[2] = (GLint) texUnit->EyePlaneR[2];
params[3] = (GLint) texUnit->EyePlaneR[3];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
return;
}
break;
case GL_Q:
if (pname==GL_TEXTURE_GEN_MODE) {
params[0] = texUnit->GenModeQ;
}
else if (pname==GL_OBJECT_PLANE) {
params[0] = (GLint) texUnit->ObjectPlaneQ[0];
params[1] = (GLint) texUnit->ObjectPlaneQ[1];
params[2] = (GLint) texUnit->ObjectPlaneQ[2];
params[3] = (GLint) texUnit->ObjectPlaneQ[3];
}
else if (pname==GL_EYE_PLANE) {
params[0] = (GLint) texUnit->EyePlaneQ[0];
params[1] = (GLint) texUnit->EyePlaneQ[1];
params[2] = (GLint) texUnit->EyePlaneQ[2];
params[3] = (GLint) texUnit->EyePlaneQ[3];
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" );
return;
}
}
 
 
/* GL_ARB_multitexture */
void
_mesa_ActiveTextureARB( GLenum target )
{
GET_CURRENT_CONTEXT(ctx);
GLuint texUnit = target - GL_TEXTURE0_ARB;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glActiveTexture %s\n",
_mesa_lookup_enum_by_nr(target));
 
if (texUnit > ctx->Const.MaxTextureUnits) {
_mesa_error(ctx, GL_INVALID_ENUM, "glActiveTextureARB(target)");
return;
}
 
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
ctx->Texture.CurrentUnit = texUnit;
if (ctx->Driver.ActiveTexture) {
(*ctx->Driver.ActiveTexture)( ctx, (GLuint) texUnit );
}
}
 
 
/* GL_ARB_multitexture */
void
_mesa_ClientActiveTextureARB( GLenum target )
{
GET_CURRENT_CONTEXT(ctx);
GLuint texUnit = target - GL_TEXTURE0_ARB;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (texUnit > ctx->Const.MaxTextureUnits) {
_mesa_error(ctx, GL_INVALID_ENUM, "glClientActiveTextureARB(target)");
return;
}
 
FLUSH_VERTICES(ctx, _NEW_ARRAY);
ctx->Array.ActiveTexture = texUnit;
}
 
 
 
/**********************************************************************/
/* Pixel Texgen Extensions */
/**********************************************************************/
 
void
_mesa_PixelTexGenSGIX(GLenum mode)
{
GLenum newRgbSource, newAlphaSource;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (mode) {
case GL_NONE:
newRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
newAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
break;
case GL_ALPHA:
newRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
newAlphaSource = GL_CURRENT_RASTER_COLOR;
break;
case GL_RGB:
newRgbSource = GL_CURRENT_RASTER_COLOR;
newAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
break;
case GL_RGBA:
newRgbSource = GL_CURRENT_RASTER_COLOR;
newAlphaSource = GL_CURRENT_RASTER_COLOR;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenSGIX(mode)");
return;
}
 
if (newRgbSource == ctx->Pixel.FragmentRgbSource &&
newAlphaSource == ctx->Pixel.FragmentAlphaSource)
return;
 
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.FragmentRgbSource = newRgbSource;
ctx->Pixel.FragmentAlphaSource = newAlphaSource;
}
 
 
void
_mesa_PixelTexGenParameterfSGIS(GLenum target, GLfloat value)
{
_mesa_PixelTexGenParameteriSGIS(target, (GLint) value);
}
 
 
void
_mesa_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value)
{
_mesa_PixelTexGenParameteriSGIS(target, (GLint) *value);
}
 
 
void
_mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (value != GL_CURRENT_RASTER_COLOR && value != GL_PIXEL_GROUP_COLOR_SGIS) {
_mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenParameterSGIS(value)");
return;
}
 
switch (target) {
case GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS:
if (ctx->Pixel.FragmentRgbSource == (GLenum) value)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.FragmentRgbSource = (GLenum) value;
break;
case GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS:
if (ctx->Pixel.FragmentAlphaSource == (GLenum) value)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.FragmentAlphaSource = (GLenum) value;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenParameterSGIS(target)");
return;
}
}
 
 
void
_mesa_PixelTexGenParameterivSGIS(GLenum target, const GLint *value)
{
_mesa_PixelTexGenParameteriSGIS(target, *value);
}
 
 
void
_mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target == GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS) {
*value = (GLfloat) ctx->Pixel.FragmentRgbSource;
}
else if (target == GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS) {
*value = (GLfloat) ctx->Pixel.FragmentAlphaSource;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelTexGenParameterfvSGIS(target)");
}
}
 
 
void
_mesa_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target == GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS) {
*value = (GLint) ctx->Pixel.FragmentRgbSource;
}
else if (target == GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS) {
*value = (GLint) ctx->Pixel.FragmentAlphaSource;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelTexGenParameterivSGIS(target)");
}
}
/shark/trunk/ports/mesa/src/hint.c
0,0 → 1,123
/* $Id: hint.c,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "enums.h"
#include "context.h"
#include "hint.h"
#include "imports.h"
 
 
 
void
_mesa_Hint( GLenum target, GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glHint %s %d\n",
_mesa_lookup_enum_by_nr(target), mode);
 
if (mode != GL_NICEST && mode != GL_FASTEST && mode != GL_DONT_CARE) {
_mesa_error(ctx, GL_INVALID_ENUM, "glHint(mode)");
return;
}
 
switch (target) {
case GL_FOG_HINT:
if (ctx->Hint.Fog == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.Fog = mode;
break;
case GL_LINE_SMOOTH_HINT:
if (ctx->Hint.LineSmooth == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.LineSmooth = mode;
break;
case GL_PERSPECTIVE_CORRECTION_HINT:
if (ctx->Hint.PerspectiveCorrection == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.PerspectiveCorrection = mode;
break;
case GL_POINT_SMOOTH_HINT:
if (ctx->Hint.PointSmooth == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.PointSmooth = mode;
break;
case GL_POLYGON_SMOOTH_HINT:
if (ctx->Hint.PolygonSmooth == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.PolygonSmooth = mode;
break;
 
/* GL_EXT_clip_volume_hint */
case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
if (ctx->Hint.ClipVolumeClipping == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.ClipVolumeClipping = mode;
break;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSION_HINT_ARB:
if (!ctx->Extensions.ARB_texture_compression) {
_mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)");
return;
}
if (ctx->Hint.TextureCompression == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.TextureCompression = mode;
break;
 
/* GL_SGIS_generate_mipmap */
case GL_GENERATE_MIPMAP_HINT_SGIS:
if (!ctx->Extensions.SGIS_generate_mipmap) {
_mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)");
return;
}
if (ctx->Hint.GenerateMipmap == mode)
return;
FLUSH_VERTICES(ctx, _NEW_HINT);
ctx->Hint.GenerateMipmap = mode;
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)");
return;
}
 
if (ctx->Driver.Hint) {
(*ctx->Driver.Hint)( ctx, target, mode );
}
}
/shark/trunk/ports/mesa/src/texutil.h
0,0 → 1,73
/* $Id: texutil.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes
*/
 
 
#ifndef TEXUTIL_H
#define TEXUTIL_H
 
#include "mtypes.h"
#include "texformat.h"
 
extern GLboolean
_mesa_convert_texsubimage1d( GLint mesaFormat,
GLint xoffset,
GLint width,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *packing,
const GLvoid *srcImage, GLvoid *dstImage );
 
extern GLboolean
_mesa_convert_texsubimage2d( GLint mesaFormat,
GLint xoffset, GLint yoffset,
GLint width, GLint height,
GLint imageWidth,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *packing,
const GLvoid *srcImage, GLvoid *dstImage );
 
extern GLboolean
_mesa_convert_texsubimage3d( GLint mesaFormat,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLint imageWidth, GLint imageHeight,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *packing,
const GLvoid *srcImage, GLvoid *dstImage );
 
/* Nearest filtering only (for broken hardware that can't support
* all aspect ratios). FIXME: Make this a subimage update as well...
*/
extern void
_mesa_rescale_teximage2d( GLuint bytesPerPixel, GLuint dstRowStride,
GLint srcWidth, GLint srcHeight,
GLint dstWidth, GLint dstHeight,
const GLvoid *srcImage, GLvoid *dstImage );
 
 
#endif
/shark/trunk/ports/mesa/src/varray.c
0,0 → 1,835
/* $Id: varray.c,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "context.h"
#include "enable.h"
#include "enums.h"
#include "dlist.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "state.h"
#include "texstate.h"
#include "mtypes.h"
#include "varray.h"
#include "math/m_translate.h"
 
 
 
void
_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (size < 2 || size > 4) {
_mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(size)" );
return;
}
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(stride)" );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
_mesa_debug(ctx, "glVertexPointer( sz %d type %s stride %d )\n", size,
_mesa_lookup_enum_by_nr( type ), stride);
 
/* always need to check that <type> is legal */
switch (type) {
case GL_SHORT:
ctx->Array.Vertex.StrideB = size * sizeof(GLshort);
break;
case GL_INT:
ctx->Array.Vertex.StrideB = size * sizeof(GLint);
break;
case GL_FLOAT:
ctx->Array.Vertex.StrideB = size * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.Vertex.StrideB = size * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" );
return;
}
 
if (stride)
ctx->Array.Vertex.StrideB = stride;
 
ctx->Array.Vertex.Size = size;
ctx->Array.Vertex.Type = type;
ctx->Array.Vertex.Stride = stride;
ctx->Array.Vertex.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_VERTEX;
 
if (ctx->Driver.VertexPointer)
ctx->Driver.VertexPointer( ctx, size, type, stride, ptr );
}
 
 
 
 
void
_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
_mesa_debug(ctx, "glNormalPointer( type %s stride %d )\n",
_mesa_lookup_enum_by_nr( type ), stride);
 
switch (type) {
case GL_BYTE:
ctx->Array.Normal.StrideB = 3 * sizeof(GLbyte);
break;
case GL_SHORT:
ctx->Array.Normal.StrideB = 3 * sizeof(GLshort);
break;
case GL_INT:
ctx->Array.Normal.StrideB = 3 * sizeof(GLint);
break;
case GL_FLOAT:
ctx->Array.Normal.StrideB = 3 * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.Normal.StrideB = 3 * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" );
return;
}
if (stride)
ctx->Array.Normal.StrideB = stride;
 
ctx->Array.Normal.Size = 3;
ctx->Array.Normal.Type = type;
ctx->Array.Normal.Stride = stride;
ctx->Array.Normal.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_NORMAL;
 
if (ctx->Driver.NormalPointer)
ctx->Driver.NormalPointer( ctx, type, stride, ptr );
}
 
 
 
void
_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (size < 3 || size > 4) {
_mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" );
return;
}
if (stride<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
_mesa_debug(ctx, "glColorPointer( sz %d type %s stride %d )\n", size,
_mesa_lookup_enum_by_nr( type ), stride);
 
switch (type) {
case GL_BYTE:
ctx->Array.Color.StrideB = size * sizeof(GLbyte);
break;
case GL_UNSIGNED_BYTE:
ctx->Array.Color.StrideB = size * sizeof(GLubyte);
break;
case GL_SHORT:
ctx->Array.Color.StrideB = size * sizeof(GLshort);
break;
case GL_UNSIGNED_SHORT:
ctx->Array.Color.StrideB = size * sizeof(GLushort);
break;
case GL_INT:
ctx->Array.Color.StrideB = size * sizeof(GLint);
break;
case GL_UNSIGNED_INT:
ctx->Array.Color.StrideB = size * sizeof(GLuint);
break;
case GL_FLOAT:
ctx->Array.Color.StrideB = size * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.Color.StrideB = size * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" );
return;
}
 
if (stride)
ctx->Array.Color.StrideB = stride;
 
ctx->Array.Color.Size = size;
ctx->Array.Color.Type = type;
ctx->Array.Color.Stride = stride;
ctx->Array.Color.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_COLOR0;
 
if (ctx->Driver.ColorPointer)
ctx->Driver.ColorPointer( ctx, size, type, stride, ptr );
}
 
 
 
void
_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glFogCoordPointer(stride)" );
return;
}
 
switch (type) {
case GL_FLOAT:
ctx->Array.FogCoord.StrideB = sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.FogCoord.StrideB = sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" );
return;
}
 
if (stride)
ctx->Array.FogCoord.StrideB = stride;
 
ctx->Array.FogCoord.Size = 1;
ctx->Array.FogCoord.Type = type;
ctx->Array.FogCoord.Stride = stride;
ctx->Array.FogCoord.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_FOGCOORD;
 
if (ctx->Driver.FogCoordPointer)
ctx->Driver.FogCoordPointer( ctx, type, stride, ptr );
}
 
 
void
_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glIndexPointer(stride)" );
return;
}
 
switch (type) {
case GL_UNSIGNED_BYTE:
ctx->Array.Index.StrideB = sizeof(GLubyte);
break;
case GL_SHORT:
ctx->Array.Index.StrideB = sizeof(GLshort);
break;
case GL_INT:
ctx->Array.Index.StrideB = sizeof(GLint);
break;
case GL_FLOAT:
ctx->Array.Index.StrideB = sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.Index.StrideB = sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" );
return;
}
 
if (stride)
ctx->Array.Index.StrideB = stride;
 
ctx->Array.Index.Size = 1;
ctx->Array.Index.Type = type;
ctx->Array.Index.Stride = stride;
ctx->Array.Index.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_INDEX;
 
if (ctx->Driver.IndexPointer)
ctx->Driver.IndexPointer( ctx, type, stride, ptr );
}
 
 
void
_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (size != 3 && size != 4) {
_mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(size)" );
return;
}
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(stride)" );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
_mesa_debug(ctx, "glSecondaryColorPointer( sz %d type %s stride %d )\n",
size, _mesa_lookup_enum_by_nr( type ), stride);
 
switch (type) {
case GL_BYTE:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLbyte);
break;
case GL_UNSIGNED_BYTE:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLubyte);
break;
case GL_SHORT:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLshort);
break;
case GL_UNSIGNED_SHORT:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLushort);
break;
case GL_INT:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLint);
break;
case GL_UNSIGNED_INT:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLuint);
break;
case GL_FLOAT:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.SecondaryColor.StrideB = size * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type)" );
return;
}
 
if (stride)
ctx->Array.SecondaryColor.StrideB = stride;
 
ctx->Array.SecondaryColor.Size = 3; /* hardwire */
ctx->Array.SecondaryColor.Type = type;
ctx->Array.SecondaryColor.Stride = stride;
ctx->Array.SecondaryColor.Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_COLOR1;
 
if (ctx->Driver.SecondaryColorPointer)
ctx->Driver.SecondaryColorPointer( ctx, size, type, stride, ptr );
}
 
 
 
void
_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
GLuint texUnit = ctx->Array.ActiveTexture;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (size < 1 || size > 4) {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" );
return;
}
if (stride < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" );
return;
}
 
if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
_mesa_debug(ctx, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n",
texUnit, size, _mesa_lookup_enum_by_nr( type ), stride);
 
/* always need to check that <type> is legal */
switch (type) {
case GL_SHORT:
ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLshort);
break;
case GL_INT:
ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLint);
break;
case GL_FLOAT:
ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" );
return;
}
 
if (stride)
ctx->Array.TexCoord[texUnit].StrideB = stride;
 
ctx->Array.TexCoord[texUnit].Size = size;
ctx->Array.TexCoord[texUnit].Type = type;
ctx->Array.TexCoord[texUnit].Stride = stride;
ctx->Array.TexCoord[texUnit].Ptr = (void *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_TEXCOORD(texUnit);
 
if (ctx->Driver.TexCoordPointer)
ctx->Driver.TexCoordPointer( ctx, size, type, stride, ptr );
}
 
 
void
_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr)
{
GET_CURRENT_CONTEXT(ctx);
const GLboolean *ptr = (GLboolean *)vptr;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (stride<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" );
return;
}
ctx->Array.EdgeFlag.Stride = stride;
ctx->Array.EdgeFlag.StrideB = stride ? stride : sizeof(GLboolean);
ctx->Array.EdgeFlag.Ptr = (GLboolean *) ptr;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_EDGEFLAG;
 
if (ctx->Driver.EdgeFlagPointer)
ctx->Driver.EdgeFlagPointer( ctx, stride, ptr );
}
 
 
void _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (index >= VERT_ATTRIB_MAX) {
_mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
return;
}
 
if (size < 1 || size > 4) {
_mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size)");
return;
}
 
if (stride < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(stride)");
return;
}
 
if (type == GL_UNSIGNED_BYTE && size != 4) {
_mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
return;
}
 
/* check for valid 'type' and compute StrideB right away */
switch (type) {
case GL_UNSIGNED_BYTE:
ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLubyte);
break;
case GL_SHORT:
ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLshort);
break;
case GL_FLOAT:
ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLfloat);
break;
case GL_DOUBLE:
ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLdouble);
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type)" );
return;
}
 
if (stride)
ctx->Array.VertexAttrib[index].StrideB = stride;
 
ctx->Array.VertexAttrib[index].Stride = stride;
ctx->Array.VertexAttrib[index].Size = size;
ctx->Array.VertexAttrib[index].Type = type;
ctx->Array.VertexAttrib[index].Ptr = (void *) ptr;
 
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
 
if (ctx->Driver.VertexAttribPointer)
ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr );
}
 
 
void
_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr)
{
(void) count;
_mesa_VertexPointer(size, type, stride, ptr);
}
 
 
void
_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr)
{
(void) count;
_mesa_NormalPointer(type, stride, ptr);
}
 
 
void
_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr)
{
(void) count;
_mesa_ColorPointer(size, type, stride, ptr);
}
 
 
void
_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr)
{
(void) count;
_mesa_IndexPointer(type, stride, ptr);
}
 
 
void
_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr)
{
(void) count;
_mesa_TexCoordPointer(size, type, stride, ptr);
}
 
 
void
_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
{
(void) count;
_mesa_EdgeFlagPointer(stride, ptr);
}
 
 
 
 
void
_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
{
GET_CURRENT_CONTEXT(ctx);
GLboolean tflag, cflag, nflag; /* enable/disable flags */
GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */
 
GLenum ctype = 0; /* color type */
GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
GLint defstride; /* default stride */
GLint c, f;
GLint coordUnitSave;
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
f = sizeof(GLfloat);
c = f * ((4*sizeof(GLubyte) + (f-1)) / f);
 
if (stride<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
return;
}
 
switch (format) {
case GL_V2F:
tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE;
tcomps = 0; ccomps = 0; vcomps = 2;
voffset = 0;
defstride = 2*f;
break;
case GL_V3F:
tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE;
tcomps = 0; ccomps = 0; vcomps = 3;
voffset = 0;
defstride = 3*f;
break;
case GL_C4UB_V2F:
tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
tcomps = 0; ccomps = 4; vcomps = 2;
ctype = GL_UNSIGNED_BYTE;
coffset = 0;
voffset = c;
defstride = c + 2*f;
break;
case GL_C4UB_V3F:
tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
tcomps = 0; ccomps = 4; vcomps = 3;
ctype = GL_UNSIGNED_BYTE;
coffset = 0;
voffset = c;
defstride = c + 3*f;
break;
case GL_C3F_V3F:
tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE;
tcomps = 0; ccomps = 3; vcomps = 3;
ctype = GL_FLOAT;
coffset = 0;
voffset = 3*f;
defstride = 6*f;
break;
case GL_N3F_V3F:
tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE;
tcomps = 0; ccomps = 0; vcomps = 3;
noffset = 0;
voffset = 3*f;
defstride = 6*f;
break;
case GL_C4F_N3F_V3F:
tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE;
tcomps = 0; ccomps = 4; vcomps = 3;
ctype = GL_FLOAT;
coffset = 0;
noffset = 4*f;
voffset = 7*f;
defstride = 10*f;
break;
case GL_T2F_V3F:
tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE;
tcomps = 2; ccomps = 0; vcomps = 3;
voffset = 2*f;
defstride = 5*f;
break;
case GL_T4F_V4F:
tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE;
tcomps = 4; ccomps = 0; vcomps = 4;
voffset = 4*f;
defstride = 8*f;
break;
case GL_T2F_C4UB_V3F:
tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE;
tcomps = 2; ccomps = 4; vcomps = 3;
ctype = GL_UNSIGNED_BYTE;
coffset = 2*f;
voffset = c+2*f;
defstride = c+5*f;
break;
case GL_T2F_C3F_V3F:
tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE;
tcomps = 2; ccomps = 3; vcomps = 3;
ctype = GL_FLOAT;
coffset = 2*f;
voffset = 5*f;
defstride = 8*f;
break;
case GL_T2F_N3F_V3F:
tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE;
tcomps = 2; ccomps = 0; vcomps = 3;
noffset = 2*f;
voffset = 5*f;
defstride = 8*f;
break;
case GL_T2F_C4F_N3F_V3F:
tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE;
tcomps = 2; ccomps = 4; vcomps = 3;
ctype = GL_FLOAT;
coffset = 2*f;
noffset = 6*f;
voffset = 9*f;
defstride = 12*f;
break;
case GL_T4F_C4F_N3F_V4F:
tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE;
tcomps = 4; ccomps = 4; vcomps = 4;
ctype = GL_FLOAT;
coffset = 4*f;
noffset = 8*f;
voffset = 11*f;
defstride = 15*f;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
return;
}
 
if (stride==0) {
stride = defstride;
}
 
_mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
_mesa_DisableClientState( GL_INDEX_ARRAY );
 
/* Texcoords */
coordUnitSave = ctx->Array.ActiveTexture;
if (tflag) {
GLint i;
GLint factor = ctx->Array.TexCoordInterleaveFactor;
for (i = 0; i < factor; i++) {
_mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
_mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
_mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
(GLubyte *) pointer + i * coffset );
}
for (i = factor; i < (GLint) ctx->Const.MaxTextureUnits; i++) {
_mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
_mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
}
}
else {
GLint i;
for (i = 0; i < (GLint) ctx->Const.MaxTextureUnits; i++) {
_mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) );
_mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
}
}
/* Restore texture coordinate unit index */
_mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + coordUnitSave) );
 
 
/* Color */
if (cflag) {
_mesa_EnableClientState( GL_COLOR_ARRAY );
_mesa_ColorPointer( ccomps, ctype, stride,
(GLubyte*) pointer + coffset );
}
else {
_mesa_DisableClientState( GL_COLOR_ARRAY );
}
 
 
/* Normals */
if (nflag) {
_mesa_EnableClientState( GL_NORMAL_ARRAY );
_mesa_NormalPointer( GL_FLOAT, stride,
(GLubyte*) pointer + noffset );
}
else {
_mesa_DisableClientState( GL_NORMAL_ARRAY );
}
 
_mesa_EnableClientState( GL_VERTEX_ARRAY );
_mesa_VertexPointer( vcomps, GL_FLOAT, stride,
(GLubyte *) pointer + voffset );
}
 
 
 
void
_mesa_LockArraysEXT(GLint first, GLsizei count)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
 
if (first == 0 && count > 0 &&
count <= (GLint) ctx->Const.MaxArrayLockSize) {
ctx->Array.LockFirst = first;
ctx->Array.LockCount = count;
}
else {
ctx->Array.LockFirst = 0;
ctx->Array.LockCount = 0;
}
 
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_ALL;
 
if (ctx->Driver.LockArraysEXT)
ctx->Driver.LockArraysEXT( ctx, first, count );
}
 
 
void
_mesa_UnlockArraysEXT( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glUnlockArrays\n");
 
ctx->Array.LockFirst = 0;
ctx->Array.LockCount = 0;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_ALL;
 
if (ctx->Driver.UnlockArraysEXT)
ctx->Driver.UnlockArraysEXT( ctx );
}
 
 
 
/* GL_EXT_multi_draw_arrays */
/* Somebody forgot to spec the first and count parameters as const! <sigh> */
void
_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first,
GLsizei *count, GLsizei primcount )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {
(ctx->Exec->DrawArrays)(mode, first[i], count[i]);
}
}
}
 
 
/* GL_EXT_multi_draw_arrays */
void
_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
const GLvoid **indices, GLsizei primcount )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
for (i = 0; i < primcount; i++) {
if (count[i] > 0) {
(ctx->Exec->DrawElements)(mode, count[i], type, indices[i]);
}
}
}
/shark/trunk/ports/mesa/src/api_noop.c
0,0 → 1,631
/* $Id: api_noop.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "api_noop.h"
#include "api_validate.h"
#include "context.h"
#include "colormac.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "mtypes.h"
 
 
/* In states where certain vertex components are required for t&l or
* rasterization, we still need to keep track of the current values.
* These functions provide this service by keeping uptodate the
* 'ctx->Current' struct for all data elements not included in the
* currently enabled hardware vertex.
*
*/
void _mesa_noop_EdgeFlag( GLboolean b )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.EdgeFlag = b;
}
 
void _mesa_noop_EdgeFlagv( const GLboolean *b )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.EdgeFlag = *b;
}
 
void _mesa_noop_FogCoordfEXT( GLfloat a )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = a;
}
 
void _mesa_noop_FogCoordfvEXT( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = *v;
}
 
void _mesa_noop_Indexi( GLint i )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.Index = i;
}
 
void _mesa_noop_Indexiv( const GLint *v )
{
GET_CURRENT_CONTEXT(ctx);
ctx->Current.Index = *v;
}
 
void _mesa_noop_Normal3f( GLfloat a, GLfloat b, GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
COPY_FLOAT(dest[2], c);
}
 
void _mesa_noop_Normal3fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
COPY_FLOAT(dest[2], v[2]);
}
 
void _mesa_noop_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_material mat[2];
GLuint bitmask = _mesa_material_bitmask( ctx, face, pname, ~0,
"_mesa_noop_Materialfv" );
if (bitmask == 0)
return;
 
if (bitmask & FRONT_AMBIENT_BIT) {
COPY_4FV( mat[0].Ambient, params );
}
if (bitmask & BACK_AMBIENT_BIT) {
COPY_4FV( mat[1].Ambient, params );
}
if (bitmask & FRONT_DIFFUSE_BIT) {
COPY_4FV( mat[0].Diffuse, params );
}
if (bitmask & BACK_DIFFUSE_BIT) {
COPY_4FV( mat[1].Diffuse, params );
}
if (bitmask & FRONT_SPECULAR_BIT) {
COPY_4FV( mat[0].Specular, params );
}
if (bitmask & BACK_SPECULAR_BIT) {
COPY_4FV( mat[1].Specular, params );
}
if (bitmask & FRONT_EMISSION_BIT) {
COPY_4FV( mat[0].Emission, params );
}
if (bitmask & BACK_EMISSION_BIT) {
COPY_4FV( mat[1].Emission, params );
}
if (bitmask & FRONT_SHININESS_BIT) {
GLfloat shininess = CLAMP( params[0], 0.0F, 128.0F );
mat[0].Shininess = shininess;
}
if (bitmask & BACK_SHININESS_BIT) {
GLfloat shininess = CLAMP( params[0], 0.0F, 128.0F );
mat[1].Shininess = shininess;
}
if (bitmask & FRONT_INDEXES_BIT) {
mat[0].AmbientIndex = params[0];
mat[0].DiffuseIndex = params[1];
mat[0].SpecularIndex = params[2];
}
if (bitmask & BACK_INDEXES_BIT) {
mat[1].AmbientIndex = params[0];
mat[1].DiffuseIndex = params[1];
mat[1].SpecularIndex = params[2];
}
 
_mesa_update_material( ctx, mat, bitmask );
}
 
void _mesa_noop_Color4ub( GLubyte a, GLubyte b, GLubyte c, GLubyte d )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = UBYTE_TO_FLOAT(a);
color[1] = UBYTE_TO_FLOAT(b);
color[2] = UBYTE_TO_FLOAT(c);
color[3] = UBYTE_TO_FLOAT(d);
}
 
void _mesa_noop_Color4ubv( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = UBYTE_TO_FLOAT(v[0]);
color[1] = UBYTE_TO_FLOAT(v[1]);
color[2] = UBYTE_TO_FLOAT(v[2]);
color[3] = UBYTE_TO_FLOAT(v[3]);
}
 
void _mesa_noop_Color4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = a;
color[1] = b;
color[2] = c;
color[3] = d;
}
 
void _mesa_noop_Color4fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = v[0];
color[1] = v[1];
color[2] = v[2];
color[3] = v[3];
}
 
void _mesa_noop_Color3ub( GLubyte a, GLubyte b, GLubyte c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = UBYTE_TO_FLOAT(a);
color[1] = UBYTE_TO_FLOAT(b);
color[2] = UBYTE_TO_FLOAT(c);
color[3] = 1.0;
}
 
void _mesa_noop_Color3ubv( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = UBYTE_TO_FLOAT(v[0]);
color[1] = UBYTE_TO_FLOAT(v[1]);
color[2] = UBYTE_TO_FLOAT(v[2]);
color[3] = 1.0;
}
 
void _mesa_noop_Color3f( GLfloat a, GLfloat b, GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = a;
color[1] = b;
color[2] = c;
color[3] = 1.0;
}
 
void _mesa_noop_Color3fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
color[0] = v[0];
color[1] = v[1];
color[2] = v[2];
color[3] = 1.0;
}
 
void _mesa_noop_MultiTexCoord1fARB( GLenum target, GLfloat a )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], a);
dest[1] = 0;
dest[2] = 0;
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord1fvARB( GLenum target, const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], v[0]);
dest[1] = 0;
dest[2] = 0;
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord2fARB( GLenum target, GLfloat a, GLfloat b )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
dest[2] = 0;
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord2fvARB( GLenum target, const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
dest[2] = 0;
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord3fARB( GLenum target, GLfloat a, GLfloat b, GLfloat c)
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
COPY_FLOAT(dest[2], c);
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord3fvARB( GLenum target, const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
COPY_FLOAT(dest[2], v[2]);
dest[3] = 1;
}
}
 
void _mesa_noop_MultiTexCoord4fARB( GLenum target, GLfloat a, GLfloat b,
GLfloat c, GLfloat d )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
COPY_FLOAT(dest[2], c);
dest[3] = d;
}
}
 
void _mesa_noop_MultiTexCoord4fvARB( GLenum target, const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = target - GL_TEXTURE0_ARB;
 
/* unit is unsigned -- cannot be less than zero.
*/
if (unit < MAX_TEXTURE_UNITS)
{
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
COPY_FLOAT(dest[2], v[2]);
COPY_FLOAT(dest[3], v[3]);
}
}
 
void _mesa_noop_SecondaryColor3ubEXT( GLubyte a, GLubyte b, GLubyte c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
color[0] = UBYTE_TO_FLOAT(a);
color[1] = UBYTE_TO_FLOAT(b);
color[2] = UBYTE_TO_FLOAT(c);
color[3] = 1.0;
}
 
void _mesa_noop_SecondaryColor3ubvEXT( const GLubyte *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
color[0] = UBYTE_TO_FLOAT(v[0]);
color[1] = UBYTE_TO_FLOAT(v[1]);
color[2] = UBYTE_TO_FLOAT(v[2]);
color[3] = 1.0;
}
 
void _mesa_noop_SecondaryColor3fEXT( GLfloat a, GLfloat b, GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
color[0] = a;
color[1] = b;
color[2] = c;
color[3] = 1.0;
}
 
void _mesa_noop_SecondaryColor3fvEXT( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *color = ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
color[0] = v[0];
color[1] = v[1];
color[2] = v[2];
color[3] = 1.0;
}
 
void _mesa_noop_TexCoord1f( GLfloat a )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], a);
dest[1] = 0;
dest[2] = 0;
dest[3] = 1;
}
 
void _mesa_noop_TexCoord1fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], v[0]);
dest[1] = 0;
dest[2] = 0;
dest[3] = 1;
}
 
void _mesa_noop_TexCoord2f( GLfloat a, GLfloat b )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
dest[2] = 0;
dest[3] = 1;
}
 
void _mesa_noop_TexCoord2fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
dest[2] = 0;
dest[3] = 1;
}
 
void _mesa_noop_TexCoord3f( GLfloat a, GLfloat b, GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
COPY_FLOAT(dest[2], c);
dest[3] = 1;
}
 
void _mesa_noop_TexCoord3fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
COPY_FLOAT(dest[2], v[2]);
dest[3] = 1;
}
 
void _mesa_noop_TexCoord4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], a);
COPY_FLOAT(dest[1], b);
COPY_FLOAT(dest[2], c);
COPY_FLOAT(dest[3], d);
}
 
void _mesa_noop_TexCoord4fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
GLfloat *dest = ctx->Current.Attrib[VERT_ATTRIB_TEX0];
COPY_FLOAT(dest[0], v[0]);
COPY_FLOAT(dest[1], v[1]);
COPY_FLOAT(dest[2], v[2]);
COPY_FLOAT(dest[3], v[3]);
}
 
/* Useful outside begin/end?
*/
void _mesa_noop_Vertex2fv( const GLfloat *v )
{
(void) v;
}
 
void _mesa_noop_Vertex3fv( const GLfloat *v )
{
(void) v;
}
 
void _mesa_noop_Vertex4fv( const GLfloat *v )
{
(void) v;
}
 
void _mesa_noop_Vertex2f( GLfloat a, GLfloat b )
{
(void) a; (void) b;
}
 
void _mesa_noop_Vertex3f( GLfloat a, GLfloat b, GLfloat c )
{
(void) a; (void) b; (void) c;
}
 
void _mesa_noop_Vertex4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d )
{
(void) a; (void) b; (void) c; (void) d;
}
 
 
 
void _mesa_noop_VertexAttrib4fNV( GLuint index, GLfloat x,
GLfloat y, GLfloat z, GLfloat w )
{
GET_CURRENT_CONTEXT(ctx);
if (index < 16) {
ASSIGN_4V(ctx->Current.Attrib[index], x, y, z, w);
}
}
 
void _mesa_noop_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
if (index < 16) {
ASSIGN_4V(ctx->Current.Attrib[index], v[0], v[1], v[2], v[3]);
}
}
 
 
 
/* Execute a glRectf() function. This is not suitable for GL_COMPILE
* modes (as the test for outside begin/end is not compiled),
* but may be useful for drivers in circumstances which exclude
* display list interactions.
*
* (None of the functions in this file are suitable for GL_COMPILE
* modes).
*/
void _mesa_noop_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
{
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
}
 
glBegin( GL_QUADS );
glVertex2f( x1, y1 );
glVertex2f( x2, y1 );
glVertex2f( x2, y2 );
glVertex2f( x1, y2 );
glEnd();
}
 
 
/* Some very basic support for arrays. Drivers without explicit array
* support can hook these in, but still need to supply an array-elt
* implementation.
*/
void _mesa_noop_DrawArrays(GLenum mode, GLint start, GLsizei count)
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
 
if (!_mesa_validate_DrawArrays( ctx, mode, start, count ))
return;
 
glBegin(mode);
for (i = start ; i <= count ; i++)
glArrayElement( i );
glEnd();
}
 
 
void _mesa_noop_DrawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices)
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
 
if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))
return;
 
glBegin(mode);
 
switch (type) {
case GL_UNSIGNED_BYTE:
for (i = 0 ; i < count ; i++)
glArrayElement( ((GLubyte *)indices)[i] );
break;
case GL_UNSIGNED_SHORT:
for (i = 0 ; i < count ; i++)
glArrayElement( ((GLushort *)indices)[i] );
break;
case GL_UNSIGNED_INT:
for (i = 0 ; i < count ; i++)
glArrayElement( ((GLuint *)indices)[i] );
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glDrawElements(type)" );
break;
}
 
glEnd();
}
 
void _mesa_noop_DrawRangeElements(GLenum mode,
GLuint start, GLuint end,
GLsizei count, GLenum type,
const GLvoid *indices)
{
GET_CURRENT_CONTEXT(ctx);
 
if (_mesa_validate_DrawRangeElements( ctx, mode,
start, end,
count, type, indices ))
glDrawElements( mode, count, type, indices );
}
/shark/trunk/ports/mesa/src/mmath.c
0,0 → 1,178
/* $Id: mmath.c,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "mmath.h"
 
 
static int in_fast_math;
 
/*
* A High Speed, Low Precision Square Root
* by Paul Lalonde and Robert Dawson
* from "Graphics Gems", Academic Press, 1990
*/
 
/*
* SPARC implementation of a fast square root by table
* lookup.
* SPARC floating point format is as follows:
*
* BIT 31 30 23 22 0
* sign exponent mantissa
*/
static short sqrttab[0x100]; /* declare table of square roots */
 
static void init_sqrt(void)
{
#ifdef FAST_MATH
unsigned short i;
fi_type fi; /* to access the bits of a float in C quickly */
/* we use a union defined in glheader.h */
 
for(i=0; i<= 0x7f; i++) {
fi.i = 0;
 
/*
* Build a float with the bit pattern i as mantissa
* and an exponent of 0, stored as 127
*/
 
fi.i = (i << 16) | (127 << 23);
fi.f = _mesa_sqrt(fi.f);
 
/*
* Take the square root then strip the first 7 bits of
* the mantissa into the table
*/
 
sqrttab[i] = (fi.i & 0x7fffff) >> 16;
 
/*
* Repeat the process, this time with an exponent of
* 1, stored as 128
*/
 
fi.i = 0;
fi.i = (i << 16) | (128 << 23);
fi.f = sqrt(fi.f);
sqrttab[i+0x80] = (fi.i & 0x7fffff) >> 16;
}
#else
(void) sqrttab; /* silence compiler warnings */
#endif /*FAST_MATH*/
}
 
 
float gl_sqrt( float x )
{
#ifdef FAST_MATH
fi_type num;
/* to access the bits of a float in C
* we use a union from glheader.h */
 
short e; /* the exponent */
if (x == 0.0F) return 0.0F; /* check for square root of 0 */
num.f = x;
e = (num.i >> 23) - 127; /* get the exponent - on a SPARC the */
/* exponent is stored with 127 added */
num.i &= 0x7fffff; /* leave only the mantissa */
if (e & 0x01) num.i |= 0x800000;
/* the exponent is odd so we have to */
/* look it up in the second half of */
/* the lookup table, so we set the */
/* high bit */
e >>= 1; /* divide the exponent by two */
/* note that in C the shift */
/* operators are sign preserving */
/* for signed operands */
/* Do the table lookup, based on the quaternary mantissa,
* then reconstruct the result back into a float
*/
num.i = ((sqrttab[num.i >> 16]) << 16) | ((e + 127) << 23);
return num.f;
#else
return (GLfloat) _mesa_sqrt(x);
#endif
}
 
 
/* ubyte -> float conversion */
float _mesa_ubyte_to_float_color_tab[256];
 
 
/*
* Initialize tables, etc for fast math functions.
*/
void
_mesa_init_math(void)
{
static GLboolean initialized = GL_FALSE;
 
if (!initialized) {
int i;
for (i = 0; i < 256; i++) {
_mesa_ubyte_to_float_color_tab[i] = (float) i / 255.0F;
}
 
init_sqrt();
 
initialized = GL_TRUE;
in_fast_math = 0;
 
#if defined(_FPU_GETCW) && defined(_FPU_SETCW)
{
const char *debug = _mesa_getenv("MESA_DEBUG");
if (debug && _mesa_strcmp(debug, "FP")==0) {
/* die on FP exceptions */
fpu_control_t mask;
_FPU_GETCW(mask);
mask &= ~(_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM
| _FPU_MASK_OM | _FPU_MASK_UM);
_FPU_SETCW(mask);
}
}
#endif
}
}
 
 
 
/*
* Return number of bits set in given GLuint.
*/
GLuint
_mesa_bitcount(GLuint n)
{
GLuint bits;
for (bits = 0; n > 0; n = n >> 1) {
if (n & 1) {
bits++;
}
}
return bits;
}
/shark/trunk/ports/mesa/src/texstate.h
0,0 → 1,167
/* $Id: texstate.h,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef TEXSTATE_H
#define TEXSTATE_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst );
 
 
/*** Called from API ***/
 
extern void
_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params );
 
extern void
_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params );
 
extern void
_mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params );
 
extern void
_mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params );
 
extern void
_mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params );
 
extern void
_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
GLenum pname, GLfloat *params );
 
extern void
_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
GLenum pname, GLint *params );
 
extern void
_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params );
 
extern void
_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params );
 
 
extern void
_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param );
 
extern void
_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param );
 
extern void
_mesa_TexEnvi( GLenum target, GLenum pname, GLint param );
 
extern void
_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param );
 
 
extern void
_mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params );
 
extern void
_mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param );
 
 
extern void
_mesa_TexParameteri( GLenum target, GLenum pname, GLint param );
 
extern void
_mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params );
 
 
extern void
_mesa_TexGend( GLenum coord, GLenum pname, GLdouble param );
 
extern void
_mesa_TexGendv( GLenum coord, GLenum pname, const GLdouble *params );
 
extern void
_mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param );
 
extern void
_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params );
 
extern void
_mesa_TexGeni( GLenum coord, GLenum pname, GLint param );
 
extern void
_mesa_TexGeniv( GLenum coord, GLenum pname, const GLint *params );
 
 
 
 
/*
* GL_ARB_multitexture
*/
extern void
_mesa_ActiveTextureARB( GLenum target );
 
extern void
_mesa_ClientActiveTextureARB( GLenum target );
 
 
/*
* Pixel Texture Extensions
*/
 
extern void
_mesa_PixelTexGenSGIX(GLenum mode);
 
extern void
_mesa_PixelTexGenParameterfSGIS(GLenum target, GLfloat value);
 
#ifdef VMS
#define _mesa_PixelTexGenParameterfvSGIS _mesa_PixelTexGenParameterfv
#endif
extern void
_mesa_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value);
 
extern void
_mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value);
 
#ifdef VMS
#define _mesa_PixelTexGenParameterivSGIS _mesa_PixelTexGenParameteriv
#endif
extern void
_mesa_PixelTexGenParameterivSGIS(GLenum target, const GLint *value);
 
#ifdef VMS
#define _mesa_GetPixelTexGenParameterfvSGIS _mesa_GetPixelTexGenParameterfv
#endif
extern void
_mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value);
 
#ifdef VMS
#define _mesa_GetPixelTexGenParameterivSGIS _mesa_GetPixelTexGenParameteriv
#endif
extern void
_mesa_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value);
 
 
#endif
/shark/trunk/ports/mesa/src/hint.h
0,0 → 1,39
/* $Id: hint.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef HINT_H
#define HINT_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_Hint( GLenum target, GLenum mode );
 
 
#endif
/shark/trunk/ports/mesa/src/api_noop.h
0,0 → 1,155
/* $Id: api_noop.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#ifndef _API_NOOP_H
#define _API_NOOP_H
 
 
#include "glheader.h"
#include "mtypes.h"
#include "context.h"
 
/* In states where certain vertex components are required for t&l or
* rasterization, we still need to keep track of the current values.
* These functions provide this service by keeping uptodate the
* 'ctx->Current' struct for all data elements not included in the
* currently enabled hardware vertex.
*
*/
extern void _mesa_noop_EdgeFlag( GLboolean b );
 
extern void _mesa_noop_EdgeFlagv( const GLboolean *b );
 
extern void _mesa_noop_FogCoordfEXT( GLfloat a );
 
extern void _mesa_noop_FogCoordfvEXT( const GLfloat *v );
 
extern void _mesa_noop_Indexi( GLint i );
 
extern void _mesa_noop_Indexiv( const GLint *v );
 
extern void _mesa_noop_Normal3f( GLfloat a, GLfloat b, GLfloat c );
 
extern void _mesa_noop_Normal3fv( const GLfloat *v );
 
extern void _mesa_noop_Materialfv( GLenum face, GLenum pname, const GLfloat *param );
 
extern void _mesa_noop_Color4ub( GLubyte a, GLubyte b, GLubyte c, GLubyte d );
 
extern void _mesa_noop_Color4ubv( const GLubyte *v );
 
extern void _mesa_noop_Color4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d );
 
extern void _mesa_noop_Color4fv( const GLfloat *v );
 
extern void _mesa_noop_Color3ub( GLubyte a, GLubyte b, GLubyte c );
 
extern void _mesa_noop_Color3ubv( const GLubyte *v );
 
extern void _mesa_noop_Color3f( GLfloat a, GLfloat b, GLfloat c );
 
extern void _mesa_noop_Color3fv( const GLfloat *v );
 
extern void _mesa_noop_MultiTexCoord1fARB( GLenum target, GLfloat a );
 
extern void _mesa_noop_MultiTexCoord1fvARB( GLenum target, const GLfloat *v );
 
extern void _mesa_noop_MultiTexCoord2fARB( GLenum target, GLfloat a,
GLfloat b );
 
extern void _mesa_noop_MultiTexCoord2fvARB( GLenum target, const GLfloat *v );
 
extern void _mesa_noop_MultiTexCoord3fARB( GLenum target, GLfloat a,
GLfloat b, GLfloat c);
 
extern void _mesa_noop_MultiTexCoord3fvARB( GLenum target, const GLfloat *v );
 
extern void _mesa_noop_MultiTexCoord4fARB( GLenum target, GLfloat a,
GLfloat b, GLfloat c, GLfloat d );
 
extern void _mesa_noop_MultiTexCoord4fvARB( GLenum target, const GLfloat *v );
 
extern void _mesa_noop_SecondaryColor3ubEXT( GLubyte a, GLubyte b, GLubyte c );
 
extern void _mesa_noop_SecondaryColor3ubvEXT( const GLubyte *v );
 
extern void _mesa_noop_SecondaryColor3fEXT( GLfloat a, GLfloat b, GLfloat c );
 
extern void _mesa_noop_SecondaryColor3fvEXT( const GLfloat *v );
 
extern void _mesa_noop_TexCoord1f( GLfloat a );
 
extern void _mesa_noop_TexCoord1fv( const GLfloat *v );
 
extern void _mesa_noop_TexCoord2f( GLfloat a, GLfloat b );
 
extern void _mesa_noop_TexCoord2fv( const GLfloat *v );
 
extern void _mesa_noop_TexCoord3f( GLfloat a, GLfloat b, GLfloat c );
 
extern void _mesa_noop_TexCoord3fv( const GLfloat *v );
 
extern void _mesa_noop_TexCoord4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d );
 
extern void _mesa_noop_TexCoord4fv( const GLfloat *v );
 
extern void _mesa_noop_Vertex2fv( const GLfloat *v );
 
extern void _mesa_noop_Vertex3fv( const GLfloat *v );
 
extern void _mesa_noop_Vertex4fv( const GLfloat *v );
 
extern void _mesa_noop_Vertex2f( GLfloat a, GLfloat b );
 
extern void _mesa_noop_Vertex3f( GLfloat a, GLfloat b, GLfloat c );
 
extern void _mesa_noop_Vertex4f( GLfloat a, GLfloat b, GLfloat c, GLfloat d );
 
extern void _mesa_noop_VertexAttrib4fNV( GLuint index, GLfloat x,
GLfloat y, GLfloat z, GLfloat w );
 
extern void _mesa_noop_VertexAttrib4fvNV( GLuint index, const GLfloat *v );
 
 
 
/* Not strictly a noop -- translate Rectf down to Begin/End and
* vertices. Closer to the loopback operations, but doesn't meet the
* criteria for inclusion there (cannot be used in the Save table).
*/
extern void _mesa_noop_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 );
 
 
extern void _mesa_noop_DrawArrays(GLenum mode, GLint start, GLsizei count);
extern void _mesa_noop_DrawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices);
extern void _mesa_noop_DrawRangeElements(GLenum mode,
GLuint start, GLuint end,
GLsizei count, GLenum type,
const GLvoid *indices);
 
 
 
#endif
/shark/trunk/ports/mesa/src/varray.h
0,0 → 1,123
/* $Id: varray.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef VARRAY_H
#define VARRAY_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr);
 
extern void
_mesa_UnlockArraysEXT( void );
 
extern void
_mesa_LockArraysEXT(GLint first, GLsizei count);
 
 
extern void
_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *ptr);
 
 
extern void
_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr);
 
 
extern void
_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr);
 
 
extern void
_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr);
 
 
extern void
_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
const GLvoid *ptr);
 
 
extern void
_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
GLsizei count, const GLvoid *ptr);
 
 
extern void
_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr);
 
 
extern void
_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr);
 
 
extern void
_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *pointer);
 
 
extern void
_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
 
 
extern void
_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first,
GLsizei *count, GLsizei primcount );
 
extern void
_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
const GLvoid **indices, GLsizei primcount );
 
 
#endif
/shark/trunk/ports/mesa/src/mmath.h
0,0 → 1,678
/* $Id: mmath.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Faster arithmetic functions. If the FAST_MATH preprocessor symbol is
* defined on the command line (-DFAST_MATH) then we'll use some (hopefully)
* faster functions for sqrt(), etc.
*/
 
 
#ifndef MMATH_H
#define MMATH_H
 
 
#include "glheader.h"
#include "imports.h"
/* Do not reference mtypes.h from this file.
*/
 
/*
* Set the x86 FPU control word to guarentee only 32 bits of presision
* are stored in registers. Allowing the FPU to store more introduces
* differences between situations where numbers are pulled out of memory
* vs. situations where the compiler is able to optimize register usage.
*
* In the worst case, we force the compiler to use a memory access to
* truncate the float, by specifying the 'volatile' keyword.
*/
#if defined(__GNUC__) && defined(__i386__)
 
/* Hardware default: All exceptions masked, extended double precision,
* round to nearest. IEEE compliant.
*/
#define DEFAULT_X86_FPU 0x037f
 
/* All exceptions masked, single precision, round to nearest.
*/
#define FAST_X86_FPU 0x003f
 
/* Set it up how we want it. The fldcw instruction will cause any
* pending FP exceptions to be raised prior to entering the block, and
* we clear any pending exceptions before exiting the block. Hence, asm
* code has free reign over the FPU while in the fast math block.
*/
#if defined(NO_FAST_MATH)
#define START_FAST_MATH(x) \
do { \
static GLuint mask = DEFAULT_X86_FPU; \
__asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \
__asm__ ( "fldcw %0" : : "m" (mask) ); \
} while (0)
#else
#define START_FAST_MATH(x) \
do { \
static GLuint mask = FAST_X86_FPU; \
__asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \
__asm__ ( "fldcw %0" : : "m" (mask) ); \
} while (0)
#endif
 
/* Put it back how the application had it, and clear any exceptions that
* may have occurred in the FAST_MATH block.
*/
#define END_FAST_MATH(x) \
do { \
__asm__ ( "fnclex ; fldcw %0" : : "m" (*&(x)) ); \
} while (0)
 
#define HAVE_FAST_MATH
 
#elif defined(__WATCOMC__) && !defined(NO_FAST_MATH)
 
/* This is the watcom specific inline assembly version of setcw and getcw */
 
void START_FAST_MATH2(unsigned short *x);
#pragma aux START_FAST_MATH2 = \
"fstcw word ptr [esi]" \
"or word ptr [esi], 0x3f" \
"fldcw word ptr [esi]" \
parm [esi] \
modify exact [];
 
void END_FAST_MATH2(unsigned short *x);
#pragma aux END_FAST_MATH2 = \
"fldcw word ptr [esi]" \
parm [esi] \
modify exact [];
 
#define START_FAST_MATH(x) START_FAST_MATH2(& x)
#define END_FAST_MATH(x) END_FAST_MATH2(& x)
 
/*
__inline START_FAST_MATH(unsigned short x)
{
_asm {
fstcw ax
mov x , ax
or ax, 0x3f
fldcw ax
}
}
 
__inline END_FAST_MATH(unsigned short x)
{
_asm {
fldcw x
}
}
*/
#define HAVE_FAST_MATH
 
#else
#define START_FAST_MATH(x) x = 0
#define END_FAST_MATH(x) (void)(x)
 
/* The mac float really is a float, with the same precision as a
* single precision 387 float.
*/
#if defined(macintosh) || defined(__powerpc__)
#define HAVE_FAST_MATH
#endif
 
#endif
 
 
 
/*
* Square root
*/
 
extern float gl_sqrt(float x);
 
#ifdef FAST_MATH
#if defined(__WATCOMC__) && defined(USE_X86_ASM)
# define GL_SQRT(X) asm_sqrt(X)
#else
# define GL_SQRT(X) gl_sqrt(X)
#endif
#else
# define GL_SQRT(X) sqrt(X)
#endif
 
 
/*
* Normalize a 3-element vector to unit length.
*/
#define NORMALIZE_3FV( V ) \
do { \
GLfloat len = (GLfloat) LEN_SQUARED_3FV(V); \
if (len) { \
len = (GLfloat) (1.0 / GL_SQRT(len)); \
(V)[0] = (GLfloat) ((V)[0] * len); \
(V)[1] = (GLfloat) ((V)[1] * len); \
(V)[2] = (GLfloat) ((V)[2] * len); \
} \
} while(0)
 
#define LEN_3FV( V ) (GL_SQRT((V)[0]*(V)[0]+(V)[1]*(V)[1]+(V)[2]*(V)[2]))
#define LEN_2FV( V ) (GL_SQRT((V)[0]*(V)[0]+(V)[1]*(V)[1]))
 
#define LEN_SQUARED_3FV( V ) ((V)[0]*(V)[0]+(V)[1]*(V)[1]+(V)[2]*(V)[2])
#define LEN_SQUARED_2FV( V ) ((V)[0]*(V)[0]+(V)[1]*(V)[1])
 
 
/*
* Single precision ceiling, floor, and absolute value functions
*/
#if defined(__sparc__) /* XXX this probably isn't the ideal test */
#define CEILF(x) ceil(x)
#define FLOORF(x) floor(x)
#define FABSF(x) fabs(x)
#elif defined(__WIN32__)
#define CEILF(x) ((GLfloat)ceil(x))
#define FLOORF(x) ((GLfloat)floor(x))
#define FABSF(x) ((GLfloat)fabs(x))
#else
#define CEILF(x) ceilf(x)
#define FLOORF(x) floorf(x)
#define FABSF(x) ((GLfloat)fabs(x))
#endif
 
 
#if defined(__i386__) || defined(__sparc__) || defined(__s390x__) || \
defined(__powerpc__) || \
( defined(__alpha__) && ( defined(__IEEE_FLOAT) || !defined(VMS) ) )
#define USE_IEEE
#endif
 
 
 
#define GET_FLOAT_BITS(x) ((fi_type *) &(x))->i
 
/*
* Float -> Int conversions (rounding, floor, ceiling)
*/
 
#if defined(USE_SPARC_ASM) && defined(__GNUC__) && defined(__sparc__)
 
static INLINE int iround(float f)
{
int r;
__asm__ ("fstoi %1, %0" : "=f" (r) : "f" (f));
return r;
}
 
#define IROUND(x) iround(x)
 
#elif defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
 
 
static INLINE int iround(float f)
{
int r;
__asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st");
return r;
}
 
#define IROUND(x) iround(x)
 
/*
* IEEE floor for computers that round to nearest or even.
* 'f' must be between -4194304 and 4194303.
* This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1",
* but uses some IEEE specific tricks for better speed.
* Contributed by Josh Vanderhoof
*/
static INLINE int ifloor(float f)
{
int ai, bi;
double af, bf;
af = (3 << 22) + 0.5 + (double)f;
bf = (3 << 22) + 0.5 - (double)f;
/* GCC generates an extra fstp/fld without this. */
__asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
__asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
return (ai - bi) >> 1;
}
 
#define IFLOOR(x) ifloor(x)
 
/*
* IEEE ceil for computers that round to nearest or even.
* 'f' must be between -4194304 and 4194303.
* This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1",
* but uses some IEEE specific tricks for better speed.
* Contributed by Josh Vanderhoof
*/
static INLINE int iceil(float f)
{
int ai, bi;
double af, bf;
af = (3 << 22) + 0.5 + (double)f;
bf = (3 << 22) + 0.5 - (double)f;
/* GCC generates an extra fstp/fld without this. */
__asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
__asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
return (ai - bi + 1) >> 1;
}
 
#define ICEIL(x) iceil(x)
 
 
#elif defined(USE_X86_ASM) && defined(__MSC__) && defined(__WIN32__)
 
 
static INLINE int iround(float f)
{
int r;
_asm {
fld f
fistp r
}
return r;
}
 
#define IROUND(x) iround(x)
 
 
#elif defined(USE_X86_ASM) && defined(__WATCOMC__)
 
 
long iround(float f);
#pragma aux iround = \
"push eax" \
"fistp dword ptr [esp]" \
"pop eax" \
parm [8087] \
value [eax] \
modify exact [eax];
 
#define IROUND(x) iround(x)
 
float asm_sqrt (float x);
#pragma aux asm_sqrt = \
"fsqrt" \
parm [8087] \
value [8087] \
modify exact [];
 
 
#endif /* assembly/optimized IROUND, IROUND_POS, IFLOOR, ICEIL macros */
 
 
/* default IROUND macro */
#ifndef IROUND
#define IROUND(f) ((int) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F)))
#endif
 
 
/* default IROUND_POS macro */
#ifndef IROUND_POS
#ifdef DEBUG
#define IROUND_POS(f) (ASSERT((f) >= 0.0F), IROUND(f))
#else
#define IROUND_POS(f) (IROUND(f))
#endif
#endif /* IROUND_POS */
 
 
/* default IFLOOR macro */
#ifndef IFLOOR
static INLINE int ifloor(float f)
{
#ifdef USE_IEEE
int ai, bi;
double af, bf;
union { int i; float f; } u;
 
af = (3 << 22) + 0.5 + (double)f;
bf = (3 << 22) + 0.5 - (double)f;
u.f = af; ai = u.i;
u.f = bf; bi = u.i;
return (ai - bi) >> 1;
#else
int i = IROUND(f);
return (i > f) ? i - 1 : i;
#endif
}
#define IFLOOR(x) ifloor(x)
#endif /* IFLOOR */
 
 
/* default ICEIL macro */
#ifndef ICEIL
static INLINE int iceil(float f)
{
#ifdef USE_IEEE
int ai, bi;
double af, bf;
union { int i; float f; } u;
af = (3 << 22) + 0.5 + (double)f;
bf = (3 << 22) + 0.5 - (double)f;
u.f = af; ai = u.i;
u.f = bf; bi = u.i;
return (ai - bi + 1) >> 1;
#else
int i = IROUND(f);
return (i < f) ? i + 1 : i;
#endif
}
#define ICEIL(x) iceil(x)
#endif /* ICEIL */
 
 
 
/*
* Convert unclamped or clamped ([0,1]) floats to ubytes for color
* conversion only. These functions round to the nearest int.
*/
#define IEEE_ONE 0x3f800000
#define IEEE_0996 0x3f7f0000 /* 0.996 or something??? used in macro
below only */
 
#if defined(USE_IEEE) && !defined(DEBUG)
 
/*
* This function/macro is sensitive to precision. Test carefully
* if you change it.
*/
#define UNCLAMPED_FLOAT_TO_UBYTE(ub, f) \
do { \
union { GLfloat r; GLuint i; } __tmp; \
__tmp.r = (f); \
ub = ((__tmp.i >= IEEE_0996) \
? ((GLint)__tmp.i < 0) ? (GLubyte)0 : (GLubyte)255 \
: (__tmp.r = __tmp.r*(255.0F/256.0F) + 32768.0F, \
(GLubyte)__tmp.i)); \
} while (0)
 
#define CLAMPED_FLOAT_TO_UBYTE(ub, f) \
UNCLAMPED_FLOAT_TO_UBYTE(ub, f)
 
#define COPY_FLOAT( dst, src ) \
((fi_type *) &(dst))->i = ((fi_type *) &(src))->i
 
#else /* USE_IEEE */
 
#define UNCLAMPED_FLOAT_TO_UBYTE(ub, f) \
ub = ((GLubyte) IROUND(CLAMP((f), 0.0F, 1.0F) * 255.0F))
 
#define CLAMPED_FLOAT_TO_UBYTE(ub, f) \
ub = ((GLubyte) IROUND((f) * 255.0F))
 
#define COPY_FLOAT( dst, src ) (dst) = (src)
 
#endif /* USE_IEEE */
 
 
 
/*
* Integer / float conversion for colors, normals, etc.
*/
 
/* Convert GLubyte in [0,255] to GLfloat in [0.0,1.0] */
extern float _mesa_ubyte_to_float_color_tab[256];
#define UBYTE_TO_FLOAT(u) _mesa_ubyte_to_float_color_tab[(unsigned int)(u)]
 
/* Convert GLfloat in [0.0,1.0] to GLubyte in [0,255] */
#define FLOAT_TO_UBYTE(X) ((GLubyte) (GLint) ((X) * 255.0F))
 
 
/* Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0] */
#define BYTE_TO_FLOAT(B) ((2.0F * (B) + 1.0F) * (1.0F/255.0F))
 
/* Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127] */
#define FLOAT_TO_BYTE(X) ( (((GLint) (255.0F * (X))) - 1) / 2 )
 
 
/* Convert GLushort in [0,65536] to GLfloat in [0.0,1.0] */
#define USHORT_TO_FLOAT(S) ((GLfloat) (S) * (1.0F / 65535.0F))
 
/* Convert GLfloat in [0.0,1.0] to GLushort in [0,65536] */
#define FLOAT_TO_USHORT(X) ((GLushort) (GLint) ((X) * 65535.0F))
 
 
/* Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0] */
#define SHORT_TO_FLOAT(S) ((2.0F * (S) + 1.0F) * (1.0F/65535.0F))
 
/* Convert GLfloat in [0.0,1.0] to GLshort in [-32768,32767] */
#define FLOAT_TO_SHORT(X) ( (((GLint) (65535.0F * (X))) - 1) / 2 )
 
 
/* Convert GLuint in [0,4294967295] to GLfloat in [0.0,1.0] */
#define UINT_TO_FLOAT(U) ((GLfloat) (U) * (1.0F / 4294967295.0F))
 
/* Convert GLfloat in [0.0,1.0] to GLuint in [0,4294967295] */
#define FLOAT_TO_UINT(X) ((GLuint) ((X) * 4294967295.0))
 
 
/* Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0] */
#define INT_TO_FLOAT(I) ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0F))
 
/* Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647] */
/* causes overflow:
#define FLOAT_TO_INT(X) ( (((GLint) (4294967294.0F * (X))) - 1) / 2 )
*/
/* a close approximation: */
#define FLOAT_TO_INT(X) ( (GLint) (2147483647.0 * (X)) )
 
 
#define BYTE_TO_UBYTE(b) ((GLubyte) ((b) < 0 ? 0 : (GLubyte) (b)))
#define SHORT_TO_UBYTE(s) ((GLubyte) ((s) < 0 ? 0 : (GLubyte) ((s) >> 7)))
#define USHORT_TO_UBYTE(s) ((GLubyte) ((s) >> 8))
#define INT_TO_UBYTE(i) ((GLubyte) ((i) < 0 ? 0 : (GLubyte) ((i) >> 23)))
#define UINT_TO_UBYTE(i) ((GLubyte) ((i) >> 24))
 
 
#define BYTE_TO_USHORT(b) ((b) < 0 ? 0 : ((GLushort) (((b) * 65535) / 255)))
#define UBYTE_TO_USHORT(b) (((GLushort) (b) << 8) | (GLushort) (b))
#define SHORT_TO_USHORT(s) ((s) < 0 ? 0 : ((GLushort) (((s) * 65535 / 32767))))
#define INT_TO_USHORT(i) ((i) < 0 ? 0 : ((GLushort) ((i) >> 15)))
#define UINT_TO_USHORT(i) ((i) < 0 ? 0 : ((GLushort) ((i) >> 16)))
#define UNCLAMPED_FLOAT_TO_USHORT(us, f) \
us = ( (GLushort) IROUND( CLAMP((f), 0.0, 1.0) * 65535.0F) )
#define CLAMPED_FLOAT_TO_USHORT(us, f) \
us = ( (GLushort) IROUND( (f) * 65535.0F) )
 
 
 
/*
* Linear interpolation
* NOTE: OUT argument is evaluated twice!
* NOTE: Be wary of using *coord++ as an argument to any of these macros!
*/
#define LINTERP(T, OUT, IN) ((OUT) + (T) * ((IN) - (OUT)))
 
/* Can do better with integer math:
*/
#define INTERP_UB( t, dstub, outub, inub ) \
do { \
GLfloat inf = UBYTE_TO_FLOAT( inub ); \
GLfloat outf = UBYTE_TO_FLOAT( outub ); \
GLfloat dstf = LINTERP( t, outf, inf ); \
UNCLAMPED_FLOAT_TO_UBYTE( dstub, dstf ); \
} while (0)
 
#define INTERP_CHAN( t, dstc, outc, inc ) \
do { \
GLfloat inf = CHAN_TO_FLOAT( inc ); \
GLfloat outf = CHAN_TO_FLOAT( outc ); \
GLfloat dstf = LINTERP( t, outf, inf ); \
UNCLAMPED_FLOAT_TO_CHAN( dstc, dstf ); \
} while (0)
 
#define INTERP_UI( t, dstui, outui, inui ) \
dstui = (GLuint) (GLint) LINTERP( (t), (GLfloat) (outui), (GLfloat) (inui) )
 
#define INTERP_F( t, dstf, outf, inf ) \
dstf = LINTERP( t, outf, inf )
 
#define INTERP_4F( t, dst, out, in ) \
do { \
dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \
dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \
dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \
dst[3] = LINTERP( (t), (out)[3], (in)[3] ); \
} while (0)
 
#define INTERP_3F( t, dst, out, in ) \
do { \
dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \
dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \
dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \
} while (0)
 
#define INTERP_4CHAN( t, dst, out, in ) \
do { \
INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \
INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \
INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \
INTERP_CHAN( (t), (dst)[3], (out)[3], (in)[3] ); \
} while (0)
 
#define INTERP_3CHAN( t, dst, out, in ) \
do { \
INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \
INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \
INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \
} while (0)
 
#define INTERP_SZ( t, vec, to, out, in, sz ) \
do { \
switch (sz) { \
case 4: vec[to][3] = LINTERP( (t), (vec)[out][3], (vec)[in][3] ); \
case 3: vec[to][2] = LINTERP( (t), (vec)[out][2], (vec)[in][2] ); \
case 2: vec[to][1] = LINTERP( (t), (vec)[out][1], (vec)[in][1] ); \
case 1: vec[to][0] = LINTERP( (t), (vec)[out][0], (vec)[in][0] ); \
} \
} while(0)
 
 
/*
* Fixed point arithmetic macros
*/
#ifdef FIXED_14
#define FIXED_ONE 0x00004000
#define FIXED_HALF 0x00002000
#define FIXED_FRAC_MASK 0x00003FFF
#define FIXED_SCALE 16384.0f
#define FIXED_SHIFT 14
#else
#define FIXED_ONE 0x00000800
#define FIXED_HALF 0x00000400
#define FIXED_FRAC_MASK 0x000007FF
#define FIXED_SCALE 2048.0f
#define FIXED_SHIFT 11
#endif
#define FIXED_INT_MASK (~FIXED_FRAC_MASK)
#define FIXED_EPSILON 1
#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE))
#define IntToFixed(I) ((I) << FIXED_SHIFT)
#define FixedToInt(X) ((X) >> FIXED_SHIFT)
#define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT)
#define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK)
#define FixedFloor(X) ((X) & FIXED_INT_MASK)
#define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE))
#define PosFloatToFixed(X) FloatToFixed(X)
#define SignedFloatToFixed(X) FloatToFixed(X)
 
/* Returns TRUE for x == Inf or x == NaN. */
#ifdef USE_IEEE
static INLINE int IS_INF_OR_NAN( float x )
{
union {float f; int i;} tmp;
tmp.f = x;
return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31);
}
#elif defined(isfinite)
#define IS_INF_OR_NAN(x) (!isfinite(x))
#elif defined(finite)
#define IS_INF_OR_NAN(x) (!finite(x))
#elif __VMS
#define IS_INF_OR_NAN(x) (!finite(x))
#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define IS_INF_OR_NAN(x) (!isfinite(x))
#else
#define IS_INF_OR_NAN(x) (!finite(x))
#endif
 
 
/*
* Return log_base_2(x).
*/
#ifdef USE_IEEE
 
#if 0
/* This is pretty fast, but not accurate enough (only 2 fractional bits).
* Based on code from http://www.stereopsis.com/log2.html
*/
static INLINE GLfloat LOG2(GLfloat x)
{
const GLfloat y = x * x * x * x;
const GLuint ix = *((GLuint *) &y);
const GLuint exp = (ix >> 23) & 0xFF;
const GLint log2 = ((GLint) exp) - 127;
return (GLfloat) log2 * (1.0 / 4.0); /* 4, because of x^4 above */
}
#endif
 
/* Pretty fast, and accurate.
* Based on code from http://www.flipcode.com/totd/
*/
static INLINE GLfloat LOG2(GLfloat val)
{
GLint *exp_ptr = (GLint *) &val;
GLint x = *exp_ptr;
const GLint log_2 = ((x >> 23) & 255) - 128;
x &= ~(255 << 23);
x += 127 << 23;
*exp_ptr = x;
val = ((-1.0f/3) * val + 2) * val - 2.0f/3;
return val + log_2;
}
 
#else /* USE_IEEE */
 
/* Slow, portable solution.
* NOTE: log_base_2(x) = log(x) / log(2)
* NOTE: 1.442695 = 1/log(2).
*/
#define LOG2(x) ((GLfloat) (log(x) * 1.442695F))
 
#endif /* USE_IEEE */
 
 
extern void
_mesa_init_math(void);
 
 
extern GLuint
_mesa_bitcount(GLuint n);
 
 
#endif
/shark/trunk/ports/mesa/src/texcompress.c
0,0 → 1,155
/* $Id: texcompress.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "context.h"
#include "image.h"
#include "texcompress.h"
#include "texformat.h"
 
 
/**
* Get the list of supported internal compression formats.
* \param formats - the results list (may be NULL)
* \return number of formats.
*/
GLuint
_mesa_get_compressed_formats( GLcontext *ctx, GLint *formats )
{
GLuint n = 0;
if (ctx->Extensions.ARB_texture_compression) {
if (ctx->Extensions.TDFX_texture_compression_FXT1) {
if (formats) {
formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX;
formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX;
}
else {
n += 4;
}
}
}
return n;
}
 
 
 
/**
* Return bytes of storage needed for the given texture size and compressed
* format.
* \param width, height, depth - texture size in texels
* \param texFormat - one of the compressed format enums
* \return size in bytes, or zero if bad texFormat
*/
GLuint
_mesa_compressed_texture_size( GLcontext *ctx,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format )
{
GLuint size;
 
switch (format) {
case GL_COMPRESSED_RGB_FXT1_3DFX:
case GL_COMPRESSED_RGBA_FXT1_3DFX:
/* round up to multiple of 4 */
size = ((width + 7) / 8) * ((height + 3) / 4) * 16;
return size;
default:
_mesa_problem(ctx, "bad texformat in compressed_texture_size");
return 0;
}
}
 
 
/*
* Compute the bytes per row in a compressed texture image.
*/
GLint
_mesa_compressed_row_stride(GLenum format, GLsizei width)
{
GLint bytesPerTile, stride;
 
switch (format) {
default:
return 0;
}
 
stride = ((width + 3) / 4) * bytesPerTile;
return stride;
}
 
 
/*
* Return the address of the pixel at (col, row, img) in a
* compressed texture image.
* \param col, row, img - image position (3D)
* \param format - compressed image format
* \param width - image width
* \param image - the image address
* \return address of pixel at (row, col)
*/
GLubyte *
_mesa_compressed_image_address(GLint col, GLint row, GLint img,
GLenum format,
GLsizei width, const GLubyte *image)
{
GLint bytesPerTile, stride;
GLubyte *addr;
 
ASSERT((row & 3) == 0);
ASSERT((col & 3) == 0);
(void) img;
 
switch (format) {
default:
return 0;
}
 
stride = ((width + 3) / 4) * bytesPerTile;
 
addr = (GLubyte *) image + (row / 4) * stride + (col / 4) * bytesPerTile;
return addr;
}
 
 
 
/*
* \param srcRowStride - source stride, in pixels
*/
void
_mesa_compress_teximage( GLcontext *ctx, GLsizei width, GLsizei height,
GLenum srcFormat, const GLchan *source,
GLint srcRowStride,
const struct gl_texture_format *dstFormat,
GLubyte *dest, GLint dstRowStride )
{
switch (dstFormat->MesaFormat) {
default:
_mesa_problem(ctx, "Bad dstFormat in _mesa_compress_teximage()");
return;
}
}
/shark/trunk/ports/mesa/src/api_arrayelt.c
0,0 → 1,365
/* $Id: api_arrayelt.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/* Author:
* Keith Whitwell <keith@tungstengraphics.com>
*/
 
#include "glheader.h"
#include "api_arrayelt.h"
#include "context.h"
#include "glapi.h"
#include "imports.h"
#include "macros.h"
#include "mtypes.h"
 
 
typedef void (*texarray_func)( GLenum, const void * );
 
typedef struct {
GLint unit;
struct gl_client_array *array;
texarray_func func;
} AEtexarray;
 
typedef void (*array_func)( const void * );
 
typedef struct {
struct gl_client_array *array;
array_func func;
} AEarray;
 
typedef struct {
AEtexarray texarrays[MAX_TEXTURE_UNITS+1];
AEarray arrays[32];
GLuint NewState;
} AEcontext;
 
#define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
#define TYPE_IDX(t) ((t) & 0xf)
 
static void (*colorfuncs[2][8])( const void * ) = {
{ (array_func)glColor3bv,
(array_func)glColor3ubv,
(array_func)glColor3sv,
(array_func)glColor3usv,
(array_func)glColor3iv,
(array_func)glColor3uiv,
(array_func)glColor3fv,
(array_func)glColor3dv },
 
{ (array_func)glColor4bv,
(array_func)glColor4ubv,
(array_func)glColor4sv,
(array_func)glColor4usv,
(array_func)glColor4iv,
(array_func)glColor4uiv,
(array_func)glColor4fv,
(array_func)glColor4dv }
};
 
static void (*vertexfuncs[3][8])( const void * ) = {
{ 0,
0,
(array_func)glVertex2sv,
0,
(array_func)glVertex2iv,
0,
(array_func)glVertex2fv,
(array_func)glVertex2dv },
 
{ 0,
0,
(array_func)glVertex3sv,
0,
(array_func)glVertex3iv,
0,
(array_func)glVertex3fv,
(array_func)glVertex3dv },
 
{ 0,
0,
(array_func)glVertex4sv,
0,
(array_func)glVertex4iv,
0,
(array_func)glVertex4fv,
(array_func)glVertex4dv }
};
 
 
static void (*multitexfuncs[4][8])( GLenum, const void * ) = {
{ 0,
0,
(texarray_func)glMultiTexCoord1svARB,
0,
(texarray_func)glMultiTexCoord1ivARB,
0,
(texarray_func)glMultiTexCoord1fvARB,
(texarray_func)glMultiTexCoord1dvARB },
 
{ 0,
0,
(texarray_func)glMultiTexCoord2svARB,
0,
(texarray_func)glMultiTexCoord2ivARB,
0,
(texarray_func)glMultiTexCoord2fvARB,
(texarray_func)glMultiTexCoord2dvARB },
 
{ 0,
0,
(texarray_func)glMultiTexCoord3svARB,
0,
(texarray_func)glMultiTexCoord3ivARB,
0,
(texarray_func)glMultiTexCoord3fvARB,
(texarray_func)glMultiTexCoord3dvARB },
 
{ 0,
0,
(texarray_func)glMultiTexCoord4svARB,
0,
(texarray_func)glMultiTexCoord4ivARB,
0,
(texarray_func)glMultiTexCoord4fvARB,
(texarray_func)glMultiTexCoord4dvARB }
};
 
static void (*indexfuncs[8])( const void * ) = {
0,
(array_func)glIndexubv,
(array_func)glIndexsv,
0,
(array_func)glIndexiv,
0,
(array_func)glIndexfv,
(array_func)glIndexdv
};
 
 
static void (*normalfuncs[8])( const void * ) = {
(array_func)glNormal3bv,
0,
(array_func)glNormal3sv,
0,
(array_func)glNormal3iv,
0,
(array_func)glNormal3fv,
(array_func)glNormal3dv,
};
 
 
/* Wrapper functions in case glSecondaryColor*EXT doesn't exist */
static void SecondaryColor3bvEXT(const GLbyte *c)
{
_glapi_Dispatch->SecondaryColor3bvEXT(c);
}
 
static void SecondaryColor3ubvEXT(const GLubyte *c)
{
_glapi_Dispatch->SecondaryColor3ubvEXT(c);
}
 
static void SecondaryColor3svEXT(const GLshort *c)
{
_glapi_Dispatch->SecondaryColor3svEXT(c);
}
 
static void SecondaryColor3usvEXT(const GLushort *c)
{
_glapi_Dispatch->SecondaryColor3usvEXT(c);
}
 
static void SecondaryColor3ivEXT(const GLint *c)
{
_glapi_Dispatch->SecondaryColor3ivEXT(c);
}
 
static void SecondaryColor3uivEXT(const GLuint *c)
{
_glapi_Dispatch->SecondaryColor3uivEXT(c);
}
 
static void SecondaryColor3fvEXT(const GLfloat *c)
{
_glapi_Dispatch->SecondaryColor3fvEXT(c);
}
 
static void SecondaryColor3dvEXT(const GLdouble *c)
{
_glapi_Dispatch->SecondaryColor3dvEXT(c);
}
 
static void (*secondarycolorfuncs[8])( const void * ) = {
(array_func) SecondaryColor3bvEXT,
(array_func) SecondaryColor3ubvEXT,
(array_func) SecondaryColor3svEXT,
(array_func) SecondaryColor3usvEXT,
(array_func) SecondaryColor3ivEXT,
(array_func) SecondaryColor3uivEXT,
(array_func) SecondaryColor3fvEXT,
(array_func) SecondaryColor3dvEXT,
};
 
 
/* Again, wrapper functions in case glSecondaryColor*EXT doesn't exist */
static void FogCoordfvEXT(const GLfloat *f)
{
_glapi_Dispatch->FogCoordfvEXT(f);
}
 
static void FogCoorddvEXT(const GLdouble *f)
{
_glapi_Dispatch->FogCoorddvEXT(f);
}
 
static void (*fogcoordfuncs[8])( const void * ) = {
0,
0,
0,
0,
0,
0,
(array_func) FogCoordfvEXT,
(array_func) FogCoorddvEXT
};
 
 
 
GLboolean _ae_create_context( GLcontext *ctx )
{
ctx->aelt_context = MALLOC( sizeof(AEcontext) );
if (!ctx->aelt_context)
return GL_FALSE;
 
AE_CONTEXT(ctx)->NewState = ~0;
return GL_TRUE;
}
 
 
void _ae_destroy_context( GLcontext *ctx )
{
if ( AE_CONTEXT( ctx ) ) {
FREE( ctx->aelt_context );
ctx->aelt_context = 0;
}
}
 
 
static void _ae_update_state( GLcontext *ctx )
{
AEcontext *actx = AE_CONTEXT(ctx);
AEtexarray *ta = actx->texarrays;
AEarray *aa = actx->arrays;
GLuint i;
 
for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
if (ctx->Array.TexCoord[i].Enabled) {
ta->unit = i;
ta->array = &ctx->Array.TexCoord[i];
ta->func = multitexfuncs[ta->array->Size-1][TYPE_IDX(ta->array->Type)];
ta++;
}
 
ta->func = 0;
 
if (ctx->Array.Color.Enabled) {
aa->array = &ctx->Array.Color;
aa->func = colorfuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
aa++;
}
 
if (ctx->Array.Normal.Enabled) {
aa->array = &ctx->Array.Normal;
aa->func = normalfuncs[TYPE_IDX(aa->array->Type)];
aa++;
}
 
if (ctx->Array.Index.Enabled) {
aa->array = &ctx->Array.Index;
aa->func = indexfuncs[TYPE_IDX(aa->array->Type)];
aa++;
}
 
if (ctx->Array.EdgeFlag.Enabled) {
aa->array = &ctx->Array.EdgeFlag;
aa->func = (array_func)glEdgeFlagv;
aa++;
}
 
if (ctx->Array.FogCoord.Enabled) {
aa->array = &ctx->Array.FogCoord;
aa->func = fogcoordfuncs[TYPE_IDX(aa->array->Type)];
aa++;
}
 
if (ctx->Array.SecondaryColor.Enabled) {
aa->array = &ctx->Array.SecondaryColor;
aa->func = secondarycolorfuncs[TYPE_IDX(aa->array->Type)];
aa++;
}
 
/* Must be last
*/
if (ctx->Array.Vertex.Enabled) {
aa->array = &ctx->Array.Vertex;
aa->func = vertexfuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
aa++;
}
 
aa->func = 0;
actx->NewState = 0;
}
 
 
void _ae_loopback_array_elt( GLint elt )
{
GET_CURRENT_CONTEXT(ctx);
AEcontext *actx = AE_CONTEXT(ctx);
AEtexarray *ta;
AEarray *aa;
 
if (actx->NewState)
_ae_update_state( ctx );
 
for (ta = actx->texarrays ; ta->func ; ta++) {
ta->func( ta->unit + GL_TEXTURE0_ARB, (char *)ta->array->Ptr + elt * ta->array->StrideB );
}
 
/* Must be last
*/
for (aa = actx->arrays ; aa->func ; aa++) {
aa->func( (char *)aa->array->Ptr + elt * aa->array->StrideB );
}
}
 
 
 
void _ae_invalidate_state( GLcontext *ctx, GLuint new_state )
{
AE_CONTEXT(ctx)->NewState |= new_state;
}
/shark/trunk/ports/mesa/src/vpparse.c
0,0 → 1,1631
/* $Id: vpparse.c,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* -------- Regarding NV_vertex_program --------
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistribution of the source code must contain a copyright notice
* and this list of conditions;
*
* o Redistribution in binary and source code form must contain the
* following Notice in the software and any documentation and/or other
* materials provided with the distribution; and
*
* o The name of Nvidia may not be used to promote or endorse software
* derived from the software.
*
* NOTICE: Nvidia hereby grants to each recipient a non-exclusive worldwide
* royalty free patent license under patent claims that are licensable by
* Nvidia and which are necessarily required and for which no commercially
* viable non infringing alternative exists to make, use, sell, offer to sell,
* import and otherwise transfer the vertex extension for the Mesa 3D Graphics
* Library as distributed in source code and object code form. No hardware or
* hardware implementation (including a semiconductor implementation and chips)
* are licensed hereunder. If a recipient makes a patent claim or institutes
* patent litigation against Nvidia or Nvidia's customers for use or sale of
* Nvidia products, then this license grant as to such recipient shall
* immediately terminate and recipient immediately agrees to cease use and
* distribution of the Mesa Program and derivatives thereof.
*
* THE MESA 3D GRAPHICS LIBRARY IS PROVIDED ON AN "AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
* WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-NFRINGEMENT
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
*
* NVIDIA SHALL NOT HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
* LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE MESA 3D GRAPHICS
* LIBRARY OR EVIDENCE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDR, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* If you do not comply with this agreement, then Nvidia may cancel the license
* and rights granted herein.
* ---------------------------------------------
*/
 
/**
* \file vpparse.c
* \brief Vertex program parser.
* \author Brian Paul
*/
 
 
#include "glheader.h"
#include "context.h"
#include "hash.h"
#include "imports.h"
#include "macros.h"
#include "mtypes.h"
#include "vpparse.h"
 
 
 
/************************ Symbol Table ******************************/
 
/* A simple symbol table implementation for ARB_vertex_program
* (not used yet)
*/
 
#if 000
struct symbol
{
GLubyte *name;
GLint value;
struct symbol *next;
};
 
static struct symbol *SymbolTable = NULL;
 
static GLboolean
IsSymbol(const GLubyte *symbol)
{
struct symbol *s;
for (s = SymbolTable; s; s = s->next) {
if (strcmp((char *) symbol, (char *)s->name) == 0)
return GL_TRUE;
}
return GL_FALSE;
}
 
static GLint
GetSymbolValue(const GLubyte *symbol)
{
struct symbol *s;
for (s = SymbolTable; s; s = s->next) {
if (strcmp((char *) symbol, (char *)s->name) == 0)
return s->value;
}
return 0;
}
 
static void
AddSymbol(const GLubyte *symbol, GLint value)
{
struct symbol *s = MALLOC_STRUCT(symbol);
if (s) {
s->name = (GLubyte *) strdup((char *) symbol);
s->value = value;
s->next = SymbolTable;
SymbolTable = s;
}
}
 
static void
ResetSymbolTable(void)
{
struct symbol *s, *next;
for (s = SymbolTable; s; s = next) {
next = s->next;
FREE(s->name);
FREE(s);
s = next;
}
SymbolTable = NULL;
}
#endif
 
/***************************** Parsing ******************************/
 
 
static GLboolean IsLetter(GLubyte b)
{
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z');
}
 
 
static GLboolean IsDigit(GLubyte b)
{
return b >= '0' && b <= '9';
}
 
 
static GLboolean IsWhitespace(GLubyte b)
{
return b == ' ' || b == '\t' || b == '\n' || b == '\r';
}
 
 
/**
* Starting at 'str' find the next token. A token can be an integer,
* an identifier or punctuation symbol.
* \return <= 0 we found an error, else, return number of characters parsed.
*/
static GLint
GetToken(const GLubyte *str, GLubyte *token)
{
GLint i = 0, j = 0;
 
token[0] = 0;
 
/* skip whitespace and comments */
while (str[i] && (IsWhitespace(str[i]) || str[i] == '#')) {
if (str[i] == '#') {
/* skip comment */
while (str[i] && (str[i] != '\n' && str[i] != '\r')) {
i++;
}
}
else {
/* skip whitespace */
i++;
}
}
 
if (str[i] == 0)
return -i;
 
/* try matching an integer */
while (str[i] && IsDigit(str[i])) {
token[j++] = str[i++];
}
if (j > 0 || !str[i]) {
token[j] = 0;
return i;
}
 
/* try matching an identifier */
if (IsLetter(str[i])) {
while (str[i] && (IsLetter(str[i]) || IsDigit(str[i]))) {
token[j++] = str[i++];
}
token[j] = 0;
return i;
}
 
/* punctuation */
if (str[i]) {
token[0] = str[i++];
token[1] = 0;
return i;
}
 
/* end of input */
token[0] = 0;
return i;
}
 
 
/**
* Get next token from input stream and increment stream pointer past token.
*/
static GLboolean
Parse_Token(const GLubyte **s, GLubyte *token)
{
GLint i;
i = GetToken(*s, token);
if (i <= 0) {
*s += (-i);
return GL_FALSE;
}
*s += i;
return GL_TRUE;
}
 
 
/**
* Get next token from input stream but don't increment stream pointer.
*/
static GLboolean
Peek_Token(const GLubyte **s, GLubyte *token)
{
GLint i, len;
i = GetToken(*s, token);
if (i <= 0) {
*s += (-i);
return GL_FALSE;
}
len = _mesa_strlen((char *) token);
*s += (i - len);
return GL_TRUE;
}
 
 
/**
* String equality test
*/
static GLboolean
StrEq(const GLubyte *a, const GLubyte *b)
{
GLint i;
for (i = 0; a[i] && b[i] && a[i] == b[i]; i++)
;
if (a[i] == 0 && b[i] == 0)
return GL_TRUE;
else
return GL_FALSE;
}
 
 
/**********************************************************************/
 
static const char *InputRegisters[] = {
"OPOS", "WGHT", "NRML", "COL0", "COL1", "FOGC", "6", "7",
"TEX0", "TEX1", "TEX2", "TEX3", "TEX4", "TEX5", "TEX6", "TEX7", NULL
};
 
static const char *OutputRegisters[] = {
"HPOS", "COL0", "COL1", "BFC0", "BFC1", "FOGC", "PSIZ",
"TEX0", "TEX1", "TEX2", "TEX3", "TEX4", "TEX5", "TEX6", "TEX7", NULL
};
 
static const char *Opcodes[] = {
"MOV", "LIT", "RCP", "RSQ", "EXP", "LOG", "MUL", "ADD", "DP3", "DP4",
"DST", "MIN", "MAX", "SLT", "SGE", "MAD", "ARL", "DPH", "RCC", "SUB",
"ABS", "END", NULL
};
 
 
#ifdef DEBUG
 
#define PARSE_ERROR \
do { \
_mesa_printf("vpparse.c error at %d: parse error\n", __LINE__); \
return GL_FALSE; \
} while(0)
 
#define PARSE_ERROR1(msg) \
do { \
_mesa_printf("vpparse.c error at %d: %s\n", __LINE__, msg); \
return GL_FALSE; \
} while(0)
 
#define PARSE_ERROR2(msg1, msg2) \
do { \
_mesa_printf("vpparse.c error at %d: %s %s\n", __LINE__, msg1, msg2); \
return GL_FALSE; \
} while(0)
 
#else
 
#define PARSE_ERROR return GL_FALSE
#define PARSE_ERROR1(msg1) return GL_FALSE
#define PARSE_ERROR2(msg1, msg2) return GL_FALSE
 
#endif
 
 
static GLuint
IsProgRegister(GLuint r)
{
return (GLuint) (r >= VP_PROG_REG_START && r <= VP_PROG_REG_END);
}
 
static GLuint
IsInputRegister(GLuint r)
{
return (GLuint) (r >= VP_INPUT_REG_START && r <= VP_INPUT_REG_END);
}
 
static GLuint
IsOutputRegister(GLuint r)
{
return (GLuint) (r >= VP_OUTPUT_REG_START && r <= VP_OUTPUT_REG_END);
}
 
 
 
/**********************************************************************/
 
/* XXX
* These shouldn't be globals as that makes the parser non-reentrant.
* We should really define a "ParserContext" class which contains these
* and the <s> pointer into the program text.
*/
static GLboolean IsStateProgram = GL_FALSE;
static GLboolean IsPositionInvariant = GL_FALSE;
static GLboolean IsVersion1_1 = GL_FALSE;
 
/**
* Try to match 'pattern' as the next token after any whitespace/comments.
*/
static GLboolean
Parse_String(const GLubyte **s, const char *pattern)
{
GLint i;
 
/* skip whitespace and comments */
while (IsWhitespace(**s) || **s == '#') {
if (**s == '#') {
while (**s && (**s != '\n' && **s != '\r')) {
*s += 1;
}
}
else {
/* skip whitespace */
*s += 1;
}
}
 
/* Try to match the pattern */
for (i = 0; pattern[i]; i++) {
if (**s != pattern[i])
PARSE_ERROR2("failed to match", pattern); /* failure */
*s += 1;
}
 
return GL_TRUE; /* success */
}
 
 
/**
* Parse a temporary register: Rnn
*/
static GLboolean
Parse_TempReg(const GLubyte **s, GLint *tempRegNum)
{
GLubyte token[100];
 
/* Should be 'R##' */
if (!Parse_Token(s, token))
PARSE_ERROR;
if (token[0] != 'R')
PARSE_ERROR1("Expected R##");
 
if (IsDigit(token[1])) {
GLint reg = _mesa_atoi((char *) (token + 1));
if (reg >= VP_NUM_TEMP_REGS)
PARSE_ERROR1("Bad temporary register name");
*tempRegNum = VP_TEMP_REG_START + reg;
}
else {
PARSE_ERROR1("Bad temporary register name");
}
 
return GL_TRUE;
}
 
 
/**
* Parse address register "A0.x"
*/
static GLboolean
Parse_AddrReg(const GLubyte **s)
{
/* match 'A0' */
if (!Parse_String(s, "A0"))
PARSE_ERROR;
 
/* match '.' */
if (!Parse_String(s, "."))
PARSE_ERROR;
 
/* match 'x' */
if (!Parse_String(s, "x"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
/**
* Parse absolute program parameter register "c[##]"
*/
static GLboolean
Parse_AbsParamReg(const GLubyte **s, GLint *regNum)
{
GLubyte token[100];
 
if (!Parse_String(s, "c"))
PARSE_ERROR;
 
if (!Parse_String(s, "["))
PARSE_ERROR;
 
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (IsDigit(token[0])) {
/* a numbered program parameter register */
GLint reg = _mesa_atoi((char *) token);
if (reg >= VP_NUM_PROG_REGS)
PARSE_ERROR1("Bad constant program number");
*regNum = VP_PROG_REG_START + reg;
}
else {
PARSE_ERROR;
}
 
if (!Parse_String(s, "]"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_ParamReg(const GLubyte **s, struct vp_src_register *srcReg)
{
GLubyte token[100];
 
if (!Parse_String(s, "c"))
PARSE_ERROR;
 
if (!Parse_String(s, "["))
PARSE_ERROR;
 
if (!Peek_Token(s, token))
PARSE_ERROR;
 
if (IsDigit(token[0])) {
/* a numbered program parameter register */
GLint reg;
(void) Parse_Token(s, token);
reg = _mesa_atoi((char *) token);
if (reg >= VP_NUM_PROG_REGS)
PARSE_ERROR1("Bad constant program number");
srcReg->Register = VP_PROG_REG_START + reg;
}
else if (StrEq(token, (GLubyte *) "A0")) {
/* address register "A0.x" */
if (!Parse_AddrReg(s))
PARSE_ERROR;
 
srcReg->RelAddr = GL_TRUE;
srcReg->Register = 0;
 
/* Look for +/-N offset */
if (!Peek_Token(s, token))
PARSE_ERROR;
 
if (token[0] == '-' || token[0] == '+') {
const GLubyte sign = token[0];
(void) Parse_Token(s, token); /* consume +/- */
 
/* an integer should be next */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (IsDigit(token[0])) {
const GLint k = _mesa_atoi((char *) token);
if (sign == '-') {
if (k > 64)
PARSE_ERROR1("Bad address offset");
srcReg->Register = -k;
}
else {
if (k > 63)
PARSE_ERROR1("Bad address offset");
srcReg->Register = k;
}
}
else {
PARSE_ERROR;
}
}
else {
/* probably got a ']', catch it below */
}
}
else {
PARSE_ERROR;
}
 
/* Match closing ']' */
if (!Parse_String(s, "]"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
/**
* Parse v[#] or v[<name>]
*/
static GLboolean
Parse_AttribReg(const GLubyte **s, GLint *tempRegNum)
{
GLubyte token[100];
GLint j;
 
/* Match 'v' */
if (!Parse_String(s, "v"))
PARSE_ERROR;
 
/* Match '[' */
if (!Parse_String(s, "["))
PARSE_ERROR;
 
/* match number or named register */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (IsStateProgram && token[0] != '0')
PARSE_ERROR1("Only v[0] accessible in vertex state programs");
 
if (IsDigit(token[0])) {
GLint reg = _mesa_atoi((char *) token);
if (reg >= VP_NUM_INPUT_REGS)
PARSE_ERROR1("Bad vertex attribute register name");
*tempRegNum = VP_INPUT_REG_START + reg;
}
else {
for (j = 0; InputRegisters[j]; j++) {
if (StrEq(token, (const GLubyte *) InputRegisters[j])) {
*tempRegNum = VP_INPUT_REG_START + j;
break;
}
}
if (!InputRegisters[j]) {
/* unknown input register label */
PARSE_ERROR2("Bad register name", token);
}
}
 
/* Match '[' */
if (!Parse_String(s, "]"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_OutputReg(const GLubyte **s, GLint *outputRegNum)
{
GLubyte token[100];
GLint start, j;
 
/* Match 'o' */
if (!Parse_String(s, "o"))
PARSE_ERROR;
 
/* Match '[' */
if (!Parse_String(s, "["))
PARSE_ERROR;
 
/* Get output reg name */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (IsPositionInvariant)
start = 1; /* skip HPOS register name */
else
start = 0;
 
/* try to match an output register name */
for (j = start; OutputRegisters[j]; j++) {
if (StrEq(token, (const GLubyte *) OutputRegisters[j])) {
*outputRegNum = VP_OUTPUT_REG_START + j;
break;
}
}
if (!OutputRegisters[j])
PARSE_ERROR1("Unrecognized output register name");
 
/* Match ']' */
if (!Parse_String(s, "]"))
PARSE_ERROR1("Expected ]");
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_MaskedDstReg(const GLubyte **s, struct vp_dst_register *dstReg)
{
GLubyte token[100];
 
/* Dst reg can be R<n> or o[n] */
if (!Peek_Token(s, token))
PARSE_ERROR;
 
if (token[0] == 'R') {
/* a temporary register */
if (!Parse_TempReg(s, &dstReg->Register))
PARSE_ERROR;
}
else if (!IsStateProgram && token[0] == 'o') {
/* an output register */
if (!Parse_OutputReg(s, &dstReg->Register))
PARSE_ERROR;
}
else if (IsStateProgram && token[0] == 'c') {
/* absolute program parameter register */
if (!Parse_AbsParamReg(s, &dstReg->Register))
PARSE_ERROR;
}
else {
PARSE_ERROR1("Bad destination register name");
}
 
/* Parse optional write mask */
if (!Peek_Token(s, token))
PARSE_ERROR;
 
if (token[0] == '.') {
/* got a mask */
GLint k = 0;
 
if (!Parse_String(s, "."))
PARSE_ERROR;
 
if (!Parse_Token(s, token))
PARSE_ERROR;
 
dstReg->WriteMask[0] = GL_FALSE;
dstReg->WriteMask[1] = GL_FALSE;
dstReg->WriteMask[2] = GL_FALSE;
dstReg->WriteMask[3] = GL_FALSE;
 
if (token[k] == 'x') {
dstReg->WriteMask[0] = GL_TRUE;
k++;
}
if (token[k] == 'y') {
dstReg->WriteMask[1] = GL_TRUE;
k++;
}
if (token[k] == 'z') {
dstReg->WriteMask[2] = GL_TRUE;
k++;
}
if (token[k] == 'w') {
dstReg->WriteMask[3] = GL_TRUE;
k++;
}
if (k == 0) {
PARSE_ERROR1("Bad writemask character");
}
return GL_TRUE;
}
else {
dstReg->WriteMask[0] = GL_TRUE;
dstReg->WriteMask[1] = GL_TRUE;
dstReg->WriteMask[2] = GL_TRUE;
dstReg->WriteMask[3] = GL_TRUE;
return GL_TRUE;
}
}
 
 
static GLboolean
Parse_SwizzleSrcReg(const GLubyte **s, struct vp_src_register *srcReg)
{
GLubyte token[100];
 
srcReg->RelAddr = GL_FALSE;
 
/* check for '-' */
if (!Peek_Token(s, token))
PARSE_ERROR;
if (token[0] == '-') {
(void) Parse_String(s, "-");
srcReg->Negate = GL_TRUE;
if (!Peek_Token(s, token))
PARSE_ERROR;
}
else {
srcReg->Negate = GL_FALSE;
}
 
/* Src reg can be R<n>, c[n], c[n +/- offset], or a named vertex attrib */
if (token[0] == 'R') {
if (!Parse_TempReg(s, &srcReg->Register))
PARSE_ERROR;
}
else if (token[0] == 'c') {
if (!Parse_ParamReg(s, srcReg))
PARSE_ERROR;
}
else if (token[0] == 'v') {
if (!Parse_AttribReg(s, &srcReg->Register))
PARSE_ERROR;
}
else {
PARSE_ERROR2("Bad source register name", token);
}
 
/* init swizzle fields */
srcReg->Swizzle[0] = 0;
srcReg->Swizzle[1] = 1;
srcReg->Swizzle[2] = 2;
srcReg->Swizzle[3] = 3;
 
/* Look for optional swizzle suffix */
if (!Peek_Token(s, token))
PARSE_ERROR;
if (token[0] == '.') {
(void) Parse_String(s, "."); /* consume . */
 
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (token[1] == 0) {
/* single letter swizzle */
if (token[0] == 'x')
ASSIGN_4V(srcReg->Swizzle, 0, 0, 0, 0);
else if (token[0] == 'y')
ASSIGN_4V(srcReg->Swizzle, 1, 1, 1, 1);
else if (token[0] == 'z')
ASSIGN_4V(srcReg->Swizzle, 2, 2, 2, 2);
else if (token[0] == 'w')
ASSIGN_4V(srcReg->Swizzle, 3, 3, 3, 3);
else
PARSE_ERROR1("Expected x, y, z, or w");
}
else {
/* 2, 3 or 4-component swizzle */
GLint k;
for (k = 0; token[k] && k < 5; k++) {
if (token[k] == 'x')
srcReg->Swizzle[k] = 0;
else if (token[k] == 'y')
srcReg->Swizzle[k] = 1;
else if (token[k] == 'z')
srcReg->Swizzle[k] = 2;
else if (token[k] == 'w')
srcReg->Swizzle[k] = 3;
else
PARSE_ERROR;
}
if (k >= 5)
PARSE_ERROR;
}
}
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_ScalarSrcReg(const GLubyte **s, struct vp_src_register *srcReg)
{
GLubyte token[100];
 
srcReg->RelAddr = GL_FALSE;
 
/* check for '-' */
if (!Peek_Token(s, token))
PARSE_ERROR;
if (token[0] == '-') {
srcReg->Negate = GL_TRUE;
(void) Parse_String(s, "-"); /* consume '-' */
if (!Peek_Token(s, token))
PARSE_ERROR;
}
else {
srcReg->Negate = GL_FALSE;
}
 
/* Src reg can be R<n>, c[n], c[n +/- offset], or a named vertex attrib */
if (token[0] == 'R') {
if (!Parse_TempReg(s, &srcReg->Register))
PARSE_ERROR;
}
else if (token[0] == 'c') {
if (!Parse_ParamReg(s, srcReg))
PARSE_ERROR;
}
else if (token[0] == 'v') {
if (!Parse_AttribReg(s, &srcReg->Register))
PARSE_ERROR;
}
else {
PARSE_ERROR2("Bad source register name", token);
}
 
/* Look for .[xyzw] suffix */
if (!Parse_String(s, "."))
PARSE_ERROR;
 
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (token[0] == 'x' && token[1] == 0) {
srcReg->Swizzle[0] = 0;
}
else if (token[0] == 'y' && token[1] == 0) {
srcReg->Swizzle[0] = 1;
}
else if (token[0] == 'z' && token[1] == 0) {
srcReg->Swizzle[0] = 2;
}
else if (token[0] == 'w' && token[1] == 0) {
srcReg->Swizzle[0] = 3;
}
else {
PARSE_ERROR1("Bad scalar source suffix");
}
srcReg->Swizzle[1] = srcReg->Swizzle[2] = srcReg->Swizzle[3] = 0;
 
return GL_TRUE;
}
 
 
static GLint
Parse_UnaryOpInstruction(const GLubyte **s, struct vp_instruction *inst)
{
GLubyte token[100];
 
/* opcode */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (StrEq(token, (GLubyte *) "MOV")) {
inst->Opcode = MOV;
}
else if (StrEq(token, (GLubyte *) "LIT")) {
inst->Opcode = LIT;
}
else if (StrEq(token, (GLubyte *) "ABS") && IsVersion1_1) {
inst->Opcode = ABS;
}
else {
PARSE_ERROR;
}
 
/* dest reg */
if (!Parse_MaskedDstReg(s, &inst->DstReg))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[0]))
PARSE_ERROR;
 
/* semicolon */
if (!Parse_String(s, ";"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_BiOpInstruction(const GLubyte **s, struct vp_instruction *inst)
{
GLubyte token[100];
 
/* opcode */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (StrEq(token, (GLubyte *) "MUL")) {
inst->Opcode = MUL;
}
else if (StrEq(token, (GLubyte *) "ADD")) {
inst->Opcode = ADD;
}
else if (StrEq(token, (GLubyte *) "DP3")) {
inst->Opcode = DP3;
}
else if (StrEq(token, (GLubyte *) "DP4")) {
inst->Opcode = DP4;
}
else if (StrEq(token, (GLubyte *) "DST")) {
inst->Opcode = DST;
}
else if (StrEq(token, (GLubyte *) "MIN")) {
inst->Opcode = ADD;
}
else if (StrEq(token, (GLubyte *) "MAX")) {
inst->Opcode = ADD;
}
else if (StrEq(token, (GLubyte *) "SLT")) {
inst->Opcode = SLT;
}
else if (StrEq(token, (GLubyte *) "SGE")) {
inst->Opcode = SGE;
}
else if (StrEq(token, (GLubyte *) "DPH") && IsVersion1_1) {
inst->Opcode = DPH;
}
else if (StrEq(token, (GLubyte *) "SUB") && IsVersion1_1) {
inst->Opcode = SUB;
}
else {
PARSE_ERROR;
}
 
/* dest reg */
if (!Parse_MaskedDstReg(s, &inst->DstReg))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* first src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[0]))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* second src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[1]))
PARSE_ERROR;
 
/* semicolon */
if (!Parse_String(s, ";"))
PARSE_ERROR;
 
/* make sure we don't reference more than one program parameter register */
if (IsProgRegister(inst->SrcReg[0].Register) &&
IsProgRegister(inst->SrcReg[1].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[1].Register)
PARSE_ERROR1("Can't reference two program parameter registers");
 
/* make sure we don't reference more than one vertex attribute register */
if (IsInputRegister(inst->SrcReg[0].Register) &&
IsInputRegister(inst->SrcReg[1].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[1].Register)
PARSE_ERROR1("Can't reference two vertex attribute registers");
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_TriOpInstruction(const GLubyte **s, struct vp_instruction *inst)
{
GLubyte token[100];
 
/* opcode */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (StrEq(token, (GLubyte *) "MAD")) {
inst->Opcode = MAD;
}
else {
PARSE_ERROR;
}
 
/* dest reg */
if (!Parse_MaskedDstReg(s, &inst->DstReg))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* first src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[0]))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* second src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[1]))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* third src arg */
if (!Parse_SwizzleSrcReg(s, &inst->SrcReg[2]))
PARSE_ERROR;
 
/* semicolon */
if (!Parse_String(s, ";"))
PARSE_ERROR;
 
/* make sure we don't reference more than one program parameter register */
if ((IsProgRegister(inst->SrcReg[0].Register) &&
IsProgRegister(inst->SrcReg[1].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[1].Register) ||
(IsProgRegister(inst->SrcReg[0].Register) &&
IsProgRegister(inst->SrcReg[2].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[2].Register) ||
(IsProgRegister(inst->SrcReg[1].Register) &&
IsProgRegister(inst->SrcReg[2].Register) &&
inst->SrcReg[1].Register != inst->SrcReg[2].Register))
PARSE_ERROR1("Can only reference one program register");
 
/* make sure we don't reference more than one vertex attribute register */
if ((IsInputRegister(inst->SrcReg[0].Register) &&
IsInputRegister(inst->SrcReg[1].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[1].Register) ||
(IsInputRegister(inst->SrcReg[0].Register) &&
IsInputRegister(inst->SrcReg[2].Register) &&
inst->SrcReg[0].Register != inst->SrcReg[2].Register) ||
(IsInputRegister(inst->SrcReg[1].Register) &&
IsInputRegister(inst->SrcReg[2].Register) &&
inst->SrcReg[1].Register != inst->SrcReg[2].Register))
PARSE_ERROR1("Can only reference one input register");
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_ScalarInstruction(const GLubyte **s, struct vp_instruction *inst)
{
GLubyte token[100];
 
/* opcode */
if (!Parse_Token(s, token))
PARSE_ERROR;
 
if (StrEq(token, (GLubyte *) "RCP")) {
inst->Opcode = RCP;
}
else if (StrEq(token, (GLubyte *) "RSQ")) {
inst->Opcode = RSQ;
}
else if (StrEq(token, (GLubyte *) "EXP")) {
inst->Opcode = EXP;
}
else if (StrEq(token, (GLubyte *) "LOG")) {
inst->Opcode = LOG;
}
else if (StrEq(token, (GLubyte *) "RCC") && IsVersion1_1) {
inst->Opcode = RCC;
}
else {
PARSE_ERROR;
}
 
/* dest reg */
if (!Parse_MaskedDstReg(s, &inst->DstReg))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* first src arg */
if (!Parse_ScalarSrcReg(s, &inst->SrcReg[0]))
PARSE_ERROR;
 
/* semicolon */
if (!Parse_String(s, ";"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_AddressInstruction(const GLubyte **s, struct vp_instruction *inst)
{
inst->Opcode = ARL;
 
/* opcode */
if (!Parse_String(s, "ARL"))
PARSE_ERROR;
 
/* dest A0 reg */
if (!Parse_AddrReg(s))
PARSE_ERROR;
 
/* comma */
if (!Parse_String(s, ","))
PARSE_ERROR;
 
/* parse src reg */
if (!Parse_ScalarSrcReg(s, &inst->SrcReg[0]))
PARSE_ERROR;
 
/* semicolon */
if (!Parse_String(s, ";"))
PARSE_ERROR;
 
return GL_TRUE;
}
 
 
static GLboolean
Parse_EndInstruction(const GLubyte **s, struct vp_instruction *inst)
{
GLubyte token[100];
 
/* opcode */
if (!Parse_String(s, "END"))
PARSE_ERROR;
 
inst->Opcode = END;
 
/* this should fail! */
if (Parse_Token(s, token))
PARSE_ERROR2("Unexpected token after END:", token);
else
return GL_TRUE;
}
 
 
static GLboolean
Parse_OptionSequence(const GLubyte **s, struct vp_instruction program[])
{
while (1) {
GLubyte token[100];
if (!Peek_Token(s, token)) {
PARSE_ERROR1("Unexpected end of input");
return GL_FALSE; /* end of input */
}
 
if (!StrEq(token, (GLubyte *) "OPTION"))
return GL_TRUE; /* probably an instruction */
 
Parse_Token(s, token);
 
if (!Parse_String(s, "NV_position_invariant"))
return GL_FALSE;
if (!Parse_String(s, ";"))
return GL_FALSE;
IsPositionInvariant = GL_TRUE;
}
}
 
 
static GLboolean
Parse_InstructionSequence(const GLubyte **s, struct vp_instruction program[])
{
GLubyte token[100];
GLint count = 0;
 
while (1) {
struct vp_instruction *inst = program + count;
 
/* Initialize the instruction */
inst->SrcReg[0].Register = -1;
inst->SrcReg[1].Register = -1;
inst->SrcReg[2].Register = -1;
inst->DstReg.Register = -1;
 
if (!Peek_Token(s, token))
PARSE_ERROR;
 
if (StrEq(token, (GLubyte *) "MOV") ||
StrEq(token, (GLubyte *) "LIT") ||
StrEq(token, (GLubyte *) "ABS")) {
if (!Parse_UnaryOpInstruction(s, inst))
PARSE_ERROR;
}
else if (StrEq(token, (GLubyte *) "MUL") ||
StrEq(token, (GLubyte *) "ADD") ||
StrEq(token, (GLubyte *) "DP3") ||
StrEq(token, (GLubyte *) "DP4") ||
StrEq(token, (GLubyte *) "DST") ||
StrEq(token, (GLubyte *) "MIN") ||
StrEq(token, (GLubyte *) "MAX") ||
StrEq(token, (GLubyte *) "SLT") ||
StrEq(token, (GLubyte *) "SGE") ||
StrEq(token, (GLubyte *) "DPH") ||
StrEq(token, (GLubyte *) "SUB")) {
if (!Parse_BiOpInstruction(s, inst))
PARSE_ERROR;
}
else if (StrEq(token, (GLubyte *) "MAD")) {
if (!Parse_TriOpInstruction(s, inst))
PARSE_ERROR;
}
else if (StrEq(token, (GLubyte *) "RCP") ||
StrEq(token, (GLubyte *) "RSQ") ||
StrEq(token, (GLubyte *) "EXP") ||
StrEq(token, (GLubyte *) "LOG") ||
StrEq(token, (GLubyte *) "RCC")) {
if (!Parse_ScalarInstruction(s, inst))
PARSE_ERROR;
}
else if (StrEq(token, (GLubyte *) "ARL")) {
if (!Parse_AddressInstruction(s, inst))
PARSE_ERROR;
}
else if (StrEq(token, (GLubyte *) "END")) {
if (!Parse_EndInstruction(s, inst))
PARSE_ERROR;
else
return GL_TRUE; /* all done */
}
else {
/* bad instruction name */
PARSE_ERROR2("Unexpected token: ", token);
}
 
count++;
if (count >= VP_MAX_INSTRUCTIONS)
PARSE_ERROR1("Program too long");
}
 
PARSE_ERROR;
}
 
 
static GLboolean
Parse_Program(const GLubyte **s, struct vp_instruction instBuffer[])
{
if (IsVersion1_1) {
if (!Parse_OptionSequence(s, instBuffer)) {
return GL_FALSE;
}
}
return Parse_InstructionSequence(s, instBuffer);
}
 
 
/**
* Parse/compile the 'str' returning the compiled 'program'.
* ctx->VertexProgram.ErrorPos will be -1 if successful. Otherwise, ErrorPos
* indicates the position of the error in 'str'.
*/
void
_mesa_parse_program(GLcontext *ctx, GLenum dstTarget,
const GLubyte *str, struct vp_program *program)
{
const GLubyte *s;
struct vp_instruction instBuffer[VP_MAX_INSTRUCTIONS];
GLubyte *newString;
struct vp_instruction *newInst;
GLenum target;
 
ctx->VertexProgram.ErrorPos = -1;
IsPositionInvariant = GL_FALSE;
IsVersion1_1 = GL_FALSE;
 
/* check the program header */
if (_mesa_strncmp((const char *) str, "!!VP1.0", 7) == 0) {
target = GL_VERTEX_PROGRAM_NV;
s = str + 7;
IsStateProgram = GL_FALSE;
}
else if (_mesa_strncmp((const char *) str, "!!VP1.1", 7) == 0) {
target = GL_VERTEX_PROGRAM_NV;
s = str + 7;
IsStateProgram = GL_FALSE;
IsVersion1_1 = GL_TRUE;
}
else if (_mesa_strncmp((const char *) str, "!!VSP1.0", 8) == 0) {
target = GL_VERTEX_STATE_PROGRAM_NV;
s = str + 8;
IsStateProgram = GL_TRUE;
}
else {
/* invalid header */
ctx->VertexProgram.ErrorPos = 0;
_mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(bad header)");
return;
}
 
/* make sure target and header match */
if (target != dstTarget) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glLoadProgramNV(target mismatch)");
return;
}
 
if (Parse_Program(&s, instBuffer)) {
GLuint numInst;
GLuint strLen;
GLuint inputsRead = 0;
GLuint outputsWritten = 0;
GLuint progRegsWritten = 0;
 
/* Find length of the program and compute bitmasks to indicate which
* vertex input registers are read, which vertex result registers are
* written to, and which program registers are written to.
* We could actually do this while we parse the program.
*/
for (numInst = 0; instBuffer[numInst].Opcode != END; numInst++) {
const GLint srcReg0 = instBuffer[numInst].SrcReg[0].Register;
const GLint srcReg1 = instBuffer[numInst].SrcReg[1].Register;
const GLint srcReg2 = instBuffer[numInst].SrcReg[2].Register;
const GLint dstReg = instBuffer[numInst].DstReg.Register;
 
if (IsOutputRegister(dstReg))
outputsWritten |= (1 << (dstReg - VP_OUTPUT_REG_START));
else if (IsProgRegister(dstReg))
progRegsWritten |= (1 << (dstReg - VP_PROG_REG_START));
if (IsInputRegister(srcReg0)
&& !instBuffer[numInst].SrcReg[0].RelAddr)
inputsRead |= (1 << (srcReg0 - VP_INPUT_REG_START));
if (IsInputRegister(srcReg1)
&& !instBuffer[numInst].SrcReg[1].RelAddr)
inputsRead |= (1 << (srcReg1 - VP_INPUT_REG_START));
if (IsInputRegister(srcReg2)
&& !instBuffer[numInst].SrcReg[2].RelAddr)
inputsRead |= (1 << (srcReg2 - VP_INPUT_REG_START));
}
numInst++;
 
if (IsStateProgram) {
if (progRegsWritten == 0) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glLoadProgramNV(c[#] not written)");
return;
}
}
else {
if (!IsPositionInvariant && !(outputsWritten & 1)) {
/* bit 1 = HPOS register */
_mesa_error(ctx, GL_INVALID_OPERATION,
"glLoadProgramNV(HPOS not written)");
return;
}
}
 
program->InputsRead = inputsRead;
program->OutputsWritten = outputsWritten;
program->IsPositionInvariant = IsPositionInvariant;
 
/* make copy of the input program string */
strLen = _mesa_strlen((const char *) str);
newString = (GLubyte *) MALLOC(strLen + 1);
if (!newString) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
return;
}
MEMCPY(newString, str, strLen);
newString[strLen] = 0; /* terminate */
 
/* copy the compiled instructions */
assert(numInst <= VP_MAX_INSTRUCTIONS);
newInst = (struct vp_instruction *) MALLOC(numInst * sizeof(struct vp_instruction));
if (!newInst) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
return; /* out of memory */
}
MEMCPY(newInst, instBuffer, numInst * sizeof(struct vp_instruction));
 
/* install the program */
program->Target = target;
if (program->String) {
FREE(program->String);
}
program->String = newString;
if (program->Instructions) {
FREE(program->Instructions);
}
program->Instructions = newInst;
 
#ifdef DEBUG_foo
_mesa_printf("--- glLoadProgramNV result ---\n");
_mesa_print_program(program);
_mesa_printf("------------------------------\n");
#endif
}
else {
/* Error! */
#ifdef DEBUG
/* print a message showing the program line containing the error */
ctx->VertexProgram.ErrorPos = s - str;
{
const GLubyte *p = str, *line = str;
int lineNum = 1, statementNum = 1, column = 0;
char errorLine[1000];
int i;
while (*p && p < s) { /* s is the error position */
if (*p == '\n') {
line = p + 1;
lineNum++;
column = 0;
}
else if (*p == ';') {
statementNum++;
}
else
column++;
p++;
}
if (p) {
/* Copy the line with the error into errorLine so we can null-
* terminate it.
*/
for (i = 0; line[i] != '\n' && line[i]; i++)
errorLine[i] = (char) line[i];
errorLine[i] = 0;
}
/*
_mesa_debug("Error pos = %d (%c) col %d\n",
ctx->VertexProgram.ErrorPos, *s, column);
*/
_mesa_debug(ctx, "Vertex program error on line %2d: %s\n", lineNum, errorLine);
_mesa_debug(ctx, " (statement %2d) near column %2d: ", statementNum, column+1);
for (i = 0; i < column; i++)
_mesa_debug(ctx, " ");
_mesa_debug(ctx, "^\n");
}
#endif
_mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV");
}
}
 
 
static void
PrintSrcReg(const struct vp_src_register *src)
{
static const char comps[5] = "xyzw";
if (src->Negate)
_mesa_printf("-");
if (src->RelAddr) {
if (src->Register > 0)
_mesa_printf("c[A0.x + %d]", src->Register);
else if (src->Register < 0)
_mesa_printf("c[A0.x - %d]", -src->Register);
else
_mesa_printf("c[A0.x]");
}
else if (src->Register >= VP_OUTPUT_REG_START
&& src->Register <= VP_OUTPUT_REG_END) {
_mesa_printf("o[%s]", OutputRegisters[src->Register - VP_OUTPUT_REG_START]);
}
else if (src->Register >= VP_INPUT_REG_START
&& src->Register <= VP_INPUT_REG_END) {
_mesa_printf("v[%s]", InputRegisters[src->Register - VP_INPUT_REG_START]);
}
else if (src->Register >= VP_PROG_REG_START
&& src->Register <= VP_PROG_REG_END) {
_mesa_printf("c[%d]", src->Register - VP_PROG_REG_START);
}
else {
_mesa_printf("R%d", src->Register - VP_TEMP_REG_START);
}
 
if (src->Swizzle[0] == src->Swizzle[1] &&
src->Swizzle[0] == src->Swizzle[2] &&
src->Swizzle[0] == src->Swizzle[3]) {
_mesa_printf(".%c", comps[src->Swizzle[0]]);
}
else if (src->Swizzle[0] != 0 ||
src->Swizzle[1] != 1 ||
src->Swizzle[2] != 2 ||
src->Swizzle[3] != 3) {
_mesa_printf(".%c%c%c%c",
comps[src->Swizzle[0]],
comps[src->Swizzle[1]],
comps[src->Swizzle[2]],
comps[src->Swizzle[3]]);
}
}
 
 
static void
PrintDstReg(const struct vp_dst_register *dst)
{
GLint w = dst->WriteMask[0] + dst->WriteMask[1]
+ dst->WriteMask[2] + dst->WriteMask[3];
 
if (dst->Register >= VP_OUTPUT_REG_START
&& dst->Register <= VP_OUTPUT_REG_END) {
_mesa_printf("o[%s]", OutputRegisters[dst->Register - VP_OUTPUT_REG_START]);
}
else if (dst->Register >= VP_INPUT_REG_START
&& dst->Register <= VP_INPUT_REG_END) {
_mesa_printf("v[%s]", InputRegisters[dst->Register - VP_INPUT_REG_START]);
}
else if (dst->Register >= VP_PROG_REG_START
&& dst->Register <= VP_PROG_REG_END) {
_mesa_printf("c[%d]", dst->Register - VP_PROG_REG_START);
}
else {
_mesa_printf("R%d", dst->Register - VP_TEMP_REG_START);
}
 
if (w != 0 && w != 4) {
_mesa_printf(".");
if (dst->WriteMask[0])
_mesa_printf("x");
if (dst->WriteMask[1])
_mesa_printf("y");
if (dst->WriteMask[2])
_mesa_printf("z");
if (dst->WriteMask[3])
_mesa_printf("w");
}
}
 
 
/**
* Print (unparse) the given vertex program. Just for debugging.
*/
void
_mesa_print_program(const struct vp_program *program)
{
const struct vp_instruction *inst;
 
for (inst = program->Instructions; ; inst++) {
switch (inst->Opcode) {
case MOV:
case LIT:
case RCP:
case RSQ:
case EXP:
case LOG:
case RCC:
case ABS:
_mesa_printf("%s ", Opcodes[(int) inst->Opcode]);
PrintDstReg(&inst->DstReg);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[0]);
_mesa_printf(";\n");
break;
case MUL:
case ADD:
case DP3:
case DP4:
case DST:
case MIN:
case MAX:
case SLT:
case SGE:
case DPH:
case SUB:
_mesa_printf("%s ", Opcodes[(int) inst->Opcode]);
PrintDstReg(&inst->DstReg);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[0]);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[1]);
_mesa_printf(";\n");
break;
case MAD:
_mesa_printf("MAD ");
PrintDstReg(&inst->DstReg);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[0]);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[1]);
_mesa_printf(", ");
PrintSrcReg(&inst->SrcReg[2]);
_mesa_printf(";\n");
break;
case ARL:
_mesa_printf("ARL A0.x, ");
PrintSrcReg(&inst->SrcReg[0]);
_mesa_printf(";\n");
break;
case END:
_mesa_printf("END\n");
return;
break;
default:
_mesa_printf("BAD INSTRUCTION\n");
}
}
}
 
/shark/trunk/ports/mesa/src/api_eval.c
0,0 → 1,324
/* $Id: api_eval.c,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Keith Whitwell <keith@tungstengraphics.com>
*/
 
#include "glheader.h"
#include "api_eval.h"
#include "context.h"
#include "macros.h"
#include "mmath.h"
#include "math/m_eval.h"
 
static void do_EvalCoord1f(GLcontext* ctx, GLfloat u)
{
 
/** Color Index **/
if (ctx->Eval.Map1Index)
{
GLfloat findex;
struct gl_1d_map *map = &ctx->EvalMap.Map1Index;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, &findex, uu, 1, map->Order);
glIndexi( (GLint) findex );
}
 
/** Color **/
if (ctx->Eval.Map1Color4) {
GLfloat fcolor[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Color4;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, fcolor, uu, 4, map->Order);
glColor4fv( fcolor );
}
 
/** Normal Vector **/
if (ctx->Eval.Map1Normal) {
GLfloat normal[3];
struct gl_1d_map *map = &ctx->EvalMap.Map1Normal;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, normal, uu, 3, map->Order);
glNormal3fv( normal );
}
 
/** Texture Coordinates **/
if (ctx->Eval.Map1TextureCoord4) {
GLfloat texcoord[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Texture4;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, texcoord, uu, 4, map->Order);
glTexCoord4fv( texcoord );
}
else if (ctx->Eval.Map1TextureCoord3) {
GLfloat texcoord[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Texture3;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, texcoord, uu, 3, map->Order);
glTexCoord3fv( texcoord );
}
else if (ctx->Eval.Map1TextureCoord2) {
GLfloat texcoord[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Texture2;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, texcoord, uu, 2, map->Order);
glTexCoord2fv( texcoord );
}
else if (ctx->Eval.Map1TextureCoord1) {
GLfloat texcoord[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Texture1;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, texcoord, uu, 1, map->Order);
glTexCoord1fv( texcoord );
}
/** Vertex **/
if (ctx->Eval.Map1Vertex4)
{
GLfloat vertex[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex4;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, vertex, uu, 4, map->Order);
glVertex4fv( vertex );
}
else if (ctx->Eval.Map1Vertex3)
{
GLfloat vertex[4];
struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex3;
GLfloat uu = (u - map->u1) * map->du;
_math_horner_bezier_curve(map->Points, vertex, uu, 3, map->Order);
glVertex3fv( vertex );
}
}
 
#define CROSS_PROD(n, u, v) \
(n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \
(n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \
(n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]
 
 
static void do_EvalCoord2f( GLcontext* ctx, GLfloat u, GLfloat v )
{
/** Color Index **/
if (ctx->Eval.Map2Index) {
GLfloat findex;
struct gl_2d_map *map = &ctx->EvalMap.Map2Index;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, &findex, uu, vv, 1,
map->Uorder, map->Vorder);
glIndexi( (GLuint) (GLint) findex );
}
 
/** Color **/
if (ctx->Eval.Map2Color4) {
GLfloat fcolor[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Color4;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, fcolor, uu, vv, 4,
map->Uorder, map->Vorder);
glColor4fv( fcolor );
}
 
/** Normal **/
if (ctx->Eval.Map2Normal &&
(!ctx->Eval.AutoNormal || (!ctx->Eval.Map2Vertex3 &&
!ctx->Eval.Map2Vertex4))) {
GLfloat normal[3];
struct gl_2d_map *map = &ctx->EvalMap.Map2Normal;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, normal, uu, vv, 3,
map->Uorder, map->Vorder);
glNormal3fv( normal );
}
 
/** Texture Coordinates **/
if (ctx->Eval.Map2TextureCoord4) {
GLfloat texcoord[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Texture4;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, texcoord, uu, vv, 4,
map->Uorder, map->Vorder);
glTexCoord4fv( texcoord );
}
else if (ctx->Eval.Map2TextureCoord3) {
GLfloat texcoord[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Texture3;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, texcoord, uu, vv, 3,
map->Uorder, map->Vorder);
glTexCoord3fv( texcoord );
}
else if (ctx->Eval.Map2TextureCoord2) {
GLfloat texcoord[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Texture2;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, texcoord, uu, vv, 2,
map->Uorder, map->Vorder);
glTexCoord2fv( texcoord );
}
else if (ctx->Eval.Map2TextureCoord1) {
GLfloat texcoord[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Texture1;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
_math_horner_bezier_surf(map->Points, texcoord, uu, vv, 1,
map->Uorder, map->Vorder);
glTexCoord1fv( texcoord );
}
 
/** Vertex **/
if(ctx->Eval.Map2Vertex4) {
GLfloat vertex[4];
GLfloat normal[3];
struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex4;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
 
if (ctx->Eval.AutoNormal) {
GLfloat du[4], dv[4];
 
_math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 4,
map->Uorder, map->Vorder);
 
CROSS_PROD(normal, du, dv);
NORMALIZE_3FV(normal);
}
else {
_math_horner_bezier_surf(map->Points, vertex, uu, vv, 4,
map->Uorder, map->Vorder);
}
}
else if (ctx->Eval.Map2Vertex3) {
GLfloat vertex[4];
struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex3;
GLfloat uu = (u - map->u1) * map->du;
GLfloat vv = (v - map->v1) * map->dv;
if (ctx->Eval.AutoNormal) {
GLfloat du[3], dv[3];
GLfloat normal[3];
_math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 3,
map->Uorder, map->Vorder);
CROSS_PROD(normal, du, dv);
NORMALIZE_3FV(normal);
glNormal3fv( normal );
glVertex3fv( vertex );
}
else {
_math_horner_bezier_surf(map->Points, vertex, uu, vv, 3,
map->Uorder, map->Vorder);
glVertex3fv( vertex );
}
}
}
 
 
void _mesa_EvalPoint1( GLint i )
{
GET_CURRENT_CONTEXT( ctx );
GLfloat du = ((ctx->Eval.MapGrid1u2 - ctx->Eval.MapGrid1u1) /
(GLfloat) ctx->Eval.MapGrid1un);
GLfloat u = i * du + ctx->Eval.MapGrid1u1;
 
glEvalCoord1f( u );
}
 
 
void _mesa_EvalPoint2( GLint i, GLint j )
{
GET_CURRENT_CONTEXT( ctx );
GLfloat du = ((ctx->Eval.MapGrid2u2 - ctx->Eval.MapGrid2u1) /
(GLfloat) ctx->Eval.MapGrid2un);
GLfloat dv = ((ctx->Eval.MapGrid2v2 - ctx->Eval.MapGrid2v1) /
(GLfloat) ctx->Eval.MapGrid2vn);
GLfloat u = i * du + ctx->Eval.MapGrid2u1;
GLfloat v = j * dv + ctx->Eval.MapGrid2v1;
 
glEvalCoord2f( u, v );
}
 
/* Wierd thing about eval is that it doesn't affect 'current' values.
* This technique of saving and resetting current values requires
* that:
*
* 1) Current values are updated immediately in the glColor,
* etc. functions.
*
* 2) Hardware color values are stored seperately from ctx->Current,
* for example in dma buffers, or direct emit to registers.
*/
void _mesa_EvalCoord1f( GLfloat u )
{
GET_CURRENT_CONTEXT( ctx );
GLfloat normal[3], texcoord[4], color[4];
GLuint index;
 
COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] );
COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] );
COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
index = ctx->Current.Index;
 
do_EvalCoord1f( ctx, u );
 
COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal );
COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord );
COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color );
ctx->Current.Index = index;
}
 
void _mesa_EvalCoord2f( GLfloat u, GLfloat v )
{
GET_CURRENT_CONTEXT( ctx );
GLfloat normal[3], texcoord[4], color[4];
GLuint index;
 
COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] );
COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] );
COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
index = ctx->Current.Index;
 
do_EvalCoord2f( ctx, u, v );
 
COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal );
COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord );
COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color );
ctx->Current.Index = index;
}
 
void _mesa_EvalCoord1fv( const GLfloat *u )
{
glEvalCoord1f( u[0] );
}
 
void _mesa_EvalCoord2fv( const GLfloat *u )
{
glEvalCoord2f( u[0], u[1] );
}
/shark/trunk/ports/mesa/src/api_arrayelt.h
0,0 → 1,38
/* $Id: api_arrayelt.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef API_ARRAYELT_H
#define API_ARRAYELT_H
 
#include "mtypes.h"
 
extern GLboolean _ae_create_context( GLcontext *ctx );
extern void _ae_destroy_context( GLcontext *ctx );
extern void _ae_invalidate_state( GLcontext *ctx, GLuint new_state );
extern void _ae_loopback_array_elt( GLint elt );
 
#endif
/shark/trunk/ports/mesa/src/texcompress.h
0,0 → 1,58
/* $Id: texcompress.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#ifndef TEXCOMPRESS_H
#define TEXCOMPRESS_H
 
#include "mtypes.h"
 
 
extern GLuint
_mesa_get_compressed_formats( GLcontext *ctx, GLint *formats );
 
extern GLuint
_mesa_compressed_texture_size( GLcontext *ctx,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format );
 
extern GLint
_mesa_compressed_row_stride(GLenum format, GLsizei width);
 
 
extern GLubyte *
_mesa_compressed_image_address(GLint col, GLint row, GLint img,
GLenum format,
GLsizei width, const GLubyte *image);
 
 
extern void
_mesa_compress_teximage( GLcontext *ctx, GLsizei width, GLsizei height,
GLenum srcFormat, const GLchan *source,
GLint srcRowStride,
const struct gl_texture_format *dstFormat,
GLubyte *dest, GLint dstRowStride );
 
#endif /* TEXCOMPRESS_H */
/shark/trunk/ports/mesa/src/api_eval.h
0,0 → 1,43
/* $Id: api_eval.h,v 1.1 2003-02-28 11:41:57 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef API_EVAL_H
#define API_EVAL_H
 
#include "mtypes.h"
 
extern void _mesa_EvalPoint1( GLint i );
extern void _mesa_EvalPoint2( GLint i, GLint j );
extern void _mesa_EvalCoord1f( GLfloat u );
extern void _mesa_EvalCoord2f( GLfloat u, GLfloat v );
extern void _mesa_EvalCoord1fv( const GLfloat *u );
extern void _mesa_EvalCoord2fv( const GLfloat *u );
 
#endif
 
 
 
/shark/trunk/ports/mesa/src/vpparse.h
0,0 → 1,44
/* $Id: vpparse.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Brian Paul
*/
 
 
#ifndef VPPARSE_H
#define VPPARSE_H
 
 
extern void
_mesa_parse_program(GLcontext *ctx, GLenum target,
const GLubyte *str, struct vp_program *program);
 
 
extern void
_mesa_print_program(const struct vp_program *program);
 
 
#endif
/shark/trunk/ports/mesa/src/vpstate.c
0,0 → 1,950
/* $Id: vpstate.c,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* -------- Regarding NV_vertex_program --------
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistribution of the source code must contain a copyright notice
* and this list of conditions;
*
* o Redistribution in binary and source code form must contain the
* following Notice in the software and any documentation and/or other
* materials provided with the distribution; and
*
* o The name of Nvidia may not be used to promote or endorse software
* derived from the software.
*
* NOTICE: Nvidia hereby grants to each recipient a non-exclusive worldwide
* royalty free patent license under patent claims that are licensable by
* Nvidia and which are necessarily required and for which no commercially
* viable non infringing alternative exists to make, use, sell, offer to sell,
* import and otherwise transfer the vertex extension for the Mesa 3D Graphics
* Library as distributed in source code and object code form. No hardware or
* hardware implementation (including a semiconductor implementation and chips)
* are licensed hereunder. If a recipient makes a patent claim or institutes
* patent litigation against Nvidia or Nvidia's customers for use or sale of
* Nvidia products, then this license grant as to such recipient shall
* immediately terminate and recipient immediately agrees to cease use and
* distribution of the Mesa Program and derivatives thereof.
*
* THE MESA 3D GRAPHICS LIBRARY IS PROVIDED ON AN "AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
* WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-NFRINGEMENT
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
*
* NVIDIA SHALL NOT HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
* LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE MESA 3D GRAPHICS
* LIBRARY OR EVIDENCE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDR, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* If you do not comply with this agreement, then Nvidia may cancel the license
* and rights granted herein.
* ---------------------------------------------
*/
 
/**
* \file vpstate.c
* \brief Vertex program state management functions (most map to API functions)
* \author Brian Paul
*/
 
 
#include "glheader.h"
#include "context.h"
#include "hash.h"
#include "imports.h"
#include "macros.h"
#include "mtypes.h"
#include "vpexec.h"
#include "vpparse.h"
#include "vpstate.h"
 
 
/**
* Delete a program and remove it from the hash table, ignoring the
* reference count.
* \note Called from the GL API dispatcher.
*/
void _mesa_delete_program(GLcontext *ctx, GLuint id)
{
struct vp_program *vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (vprog) {
if (vprog->String)
FREE(vprog->String);
if (vprog->Instructions)
FREE(vprog->Instructions);
_mesa_HashRemove(ctx->Shared->VertexPrograms, id);
FREE(vprog);
}
}
 
 
/**
* Bind a program (make it current)
* \note Called from the GL API dispatcher.
*/
void _mesa_BindProgramNV(GLenum target, GLuint id)
{
struct vp_program *vprog;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glBindProgramNV");
return;
}
 
if (id == ctx->VertexProgram.CurrentID)
return;
 
/* decrement refcount on previously bound vertex program */
if (ctx->VertexProgram.Current) {
ctx->VertexProgram.Current->RefCount--;
/* and delete if refcount goes below one */
if (ctx->VertexProgram.Current->RefCount <= 0)
_mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
}
 
/* NOTE: binding to a non-existant program is not an error.
* That's supposed to be caught in glBegin.
*/
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (!vprog && id > 0){
/* new program ID */
vprog = CALLOC_STRUCT(vp_program);
if (!vprog) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramNV");
return;
}
vprog->Target = target;
vprog->Resident = GL_TRUE;
vprog->RefCount = 1;
_mesa_HashInsert(ctx->Shared->VertexPrograms, id, vprog);
}
 
ctx->VertexProgram.CurrentID = id;
ctx->VertexProgram.Current = vprog;
if (vprog)
vprog->RefCount++;
}
 
 
/**
* Delete a list of programs.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_DeleteProgramsNV(GLsizei n, const GLuint *ids)
{
GLint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (n < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glDeleteProgramsNV" );
return;
}
 
for (i = 0; i < n; i++) {
if (ids[i] != 0) {
struct vp_program *vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, ids[i]);
if (ctx->VertexProgram.CurrentID == ids[i]) {
/* unbind this currently bound program */
_mesa_BindProgramNV(vprog->Target, 0);
}
if (vprog) {
vprog->RefCount--;
if (vprog->RefCount <= 0) {
_mesa_delete_program(ctx, ids[i]);
}
}
}
}
}
 
 
/**
* Execute a vertex state program.
* \note Called from the GL API dispatcher.
*/
void _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)
{
struct vp_program *vprog;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_STATE_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glExecuteProgramNV");
return;
}
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (!vprog || vprog->Target != GL_VERTEX_STATE_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glExecuteProgramNV");
return;
}
_mesa_init_vp_registers(ctx);
_mesa_init_tracked_matrices(ctx);
COPY_4V(ctx->VertexProgram.Machine.Registers[VP_INPUT_REG_START], params);
_mesa_exec_program(ctx, vprog);
}
 
 
/**
* Generate a list of new program identifiers.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GenProgramsNV(GLsizei n, GLuint *ids)
{
GLuint first;
GLuint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (n < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGenProgramsNV");
return;
}
 
if (!ids)
return;
 
first = _mesa_HashFindFreeKeyBlock(ctx->Shared->VertexPrograms, n);
 
for (i = 0; i < (GLuint) n; i++) {
struct vp_program *vprog = CALLOC_STRUCT(vp_program);
if (!vprog) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenProgramsNV");
return;
}
vprog->RefCount = 1;
_mesa_HashInsert(ctx->Shared->VertexPrograms, first + i, vprog);
}
 
/* Return the program names */
for (i = 0; i < (GLuint) n; i++) {
ids[i] = first + i;
}
}
 
 
/**
* Determine if a set of programs is resident in hardware.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
GLboolean _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids,
GLboolean *residences)
{
GLint i;
GLboolean retVal;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (n < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(n)");
return GL_FALSE;
}
 
retVal = GL_TRUE;
 
for (i = 0; i < n; i++) {
struct vp_program *vprog;
 
if (ids[i] == 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(id)");
return GL_FALSE;
}
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, ids[i]);
 
if (!vprog) {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(id)");
return GL_FALSE;
}
 
*residences = vprog->Resident;
if (!vprog->Resident)
retVal = GL_FALSE;
}
 
return retVal;
}
 
 
/**
* Request that a set of programs be resident in hardware.
* \note Called from the GL API dispatcher.
*/
void _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids)
{
GLint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (n < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(n)");
return;
}
 
/* just error checking for now */
for (i = 0; i < n; i++) {
struct vp_program *vprog;
 
if (ids[i] == 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
return;
}
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, ids[i]);
 
if (!vprog) {
_mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
return;
}
 
vprog->Resident = GL_TRUE;
}
}
 
 
/**
* Get a program parameter register.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetProgramParameterfvNV(GLenum target, GLuint index,
GLenum pname, GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramParameterfvNV");
return;
}
 
if (pname != GL_PROGRAM_PARAMETER_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV");
return;
}
 
index += VP_PROG_REG_START;
COPY_4V(params, ctx->VertexProgram.Machine.Registers[index]);
}
 
 
/**
* Get a program parameter register.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetProgramParameterdvNV(GLenum target, GLuint index,
GLenum pname, GLdouble *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramParameterfvNV");
return;
}
 
if (pname != GL_PROGRAM_PARAMETER_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV");
return;
}
 
index += VP_PROG_REG_START;
COPY_4V(params, ctx->VertexProgram.Machine.Registers[index]);
}
 
 
/**
* Get a program attribute.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params)
{
struct vp_program *vprog;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (!vprog) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV");
return;
}
 
switch (pname) {
case GL_PROGRAM_TARGET_NV:
*params = vprog->Target;
return;
case GL_PROGRAM_LENGTH_NV:
*params = vprog->String ? _mesa_strlen((char *) vprog->String) : 0;
return;
case GL_PROGRAM_RESIDENT_NV:
*params = vprog->Resident;
return;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)");
return;
}
}
 
 
/**
* Get the program source code.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
{
struct vp_program *vprog;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (pname != GL_PROGRAM_STRING_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)");
return;
}
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (!vprog) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV");
return;
}
 
if (vprog->String) {
MEMCPY(program, vprog->String, _mesa_strlen((char *) vprog->String));
}
else {
program[0] = 0;
}
}
 
 
/**
* Get matrix tracking information.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetTrackMatrixivNV(GLenum target, GLuint address,
GLenum pname, GLint *params)
{
GLuint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
return;
}
 
if ((address & 0x3) || address > VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)");
return;
}
 
i = address / 4;
 
switch (pname) {
case GL_TRACK_MATRIX_NV:
params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i];
return;
case GL_TRACK_MATRIX_TRANSFORM_NV:
params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i];
return;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
return;
}
}
 
 
/**
* Get a vertex (or vertex array) attribute.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (index == 0 || index >= VP_NUM_INPUT_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
return;
}
 
switch (pname) {
case GL_ATTRIB_ARRAY_SIZE_NV:
params[0] = ctx->Array.VertexAttrib[index].Size;
break;
case GL_ATTRIB_ARRAY_STRIDE_NV:
params[0] = ctx->Array.VertexAttrib[index].Stride;
break;
case GL_ATTRIB_ARRAY_TYPE_NV:
params[0] = ctx->Array.VertexAttrib[index].Type;
break;
case GL_CURRENT_ATTRIB_NV:
COPY_4V(params, ctx->Current.Attrib[index]);
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
return;
}
}
 
/**
* Get a vertex (or vertex array) attribute.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (index == 0 || index >= VP_NUM_INPUT_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
return;
}
 
switch (pname) {
case GL_ATTRIB_ARRAY_SIZE_NV:
params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Size;
break;
case GL_ATTRIB_ARRAY_STRIDE_NV:
params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Stride;
break;
case GL_ATTRIB_ARRAY_TYPE_NV:
params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Type;
break;
case GL_CURRENT_ATTRIB_NV:
COPY_4V(params, ctx->Current.Attrib[index]);
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
return;
}
}
 
/**
* Get a vertex (or vertex array) attribute.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (index == 0 || index >= VP_NUM_INPUT_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
return;
}
 
switch (pname) {
case GL_ATTRIB_ARRAY_SIZE_NV:
params[0] = ctx->Array.VertexAttrib[index].Size;
break;
case GL_ATTRIB_ARRAY_STRIDE_NV:
params[0] = ctx->Array.VertexAttrib[index].Stride;
break;
case GL_ATTRIB_ARRAY_TYPE_NV:
params[0] = ctx->Array.VertexAttrib[index].Type;
break;
case GL_CURRENT_ATTRIB_NV:
COPY_4V_CAST(params, ctx->Current.Attrib[index], GLint);
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
return;
}
}
 
 
/**
* Get a vertex array attribute pointer.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
*/
void _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)");
return;
}
 
if (pname != GL_ATTRIB_ARRAY_POINTER_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)");
return;
}
 
*pointer = ctx->Array.VertexAttrib[index].Ptr;;
}
 
 
/**
* Determine if id names a program.
* \note Not compiled into display lists.
* \note Called from the GL API dispatcher.
* \param id is the program identifier
* \return GL_TRUE if id is a program, else GL_FALSE.
*/
GLboolean _mesa_IsProgramNV(GLuint id)
{
struct vp_program *vprog;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (id == 0)
return GL_FALSE;
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (vprog && vprog->Target)
return GL_TRUE;
else
return GL_FALSE;
}
 
 
/**
* Load a vertex program.
* \note Called from the GL API dispatcher.
*/
void _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
const GLubyte *program)
{
struct vp_program *vprog;
GLboolean newProgram = GL_FALSE;
GLubyte *programCopy;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (id == 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)");
return;
}
 
vprog = (struct vp_program *)
_mesa_HashLookup(ctx->Shared->VertexPrograms, id);
 
if (vprog && vprog->Target != 0 && vprog->Target != target) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)");
return;
}
 
/* make a copy of the program string so that we can null-terminate it */
/* if we change the parser to stop after <len> characters, instead of */
/* looking for '\0' we can eliminate this. */
programCopy = (GLubyte *) MALLOC(len + 1);
if (!programCopy) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
return;
}
MEMCPY(programCopy, program, len);
programCopy[len] = 0;
 
if (!vprog) {
newProgram = GL_TRUE;
vprog = CALLOC_STRUCT(vp_program);
if (!vprog) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
return;
}
}
 
_mesa_parse_program(ctx, target, programCopy, vprog);
if (ctx->VertexProgram.ErrorPos == -1) {
/* loaded and parsed w/out errors */
if (newProgram) {
_mesa_HashInsert(ctx->Shared->VertexPrograms, id, vprog);
}
vprog->RefCount = 1;
vprog->Resident = GL_TRUE;
}
 
FREE(programCopy);
}
 
 
 
/**
* Set a program parameter register.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameter4dNV(GLenum target, GLuint index,
GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameter4dNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameter4dNV");
return;
}
 
index += VP_PROG_REG_START;
ASSIGN_4V(ctx->VertexProgram.Machine.Registers[index],
(GLfloat)x, (GLfloat)y, (GLfloat)z, (GLfloat)w);
}
 
 
/**
* Set a program parameter register.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameter4dvNV(GLenum target, GLuint index,
const GLdouble *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameter4dvNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameter4dvNV");
return;
}
 
index += VP_PROG_REG_START;
COPY_4V_CAST(ctx->VertexProgram.Machine.Registers[index], params, GLfloat);
}
 
 
/**
* Set a program parameter register.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameter4fNV(GLenum target, GLuint index,
GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameter4fNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameter4fNV");
return;
}
 
index += VP_PROG_REG_START;
ASSIGN_4V(ctx->VertexProgram.Machine.Registers[index], x, y, z, w);
}
 
 
/**
* Set a program parameter register.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameter4fvNV(GLenum target, GLuint index,
const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameter4fNV");
return;
}
 
if (index >= VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameter4fNV");
return;
}
 
index += VP_PROG_REG_START;
COPY_4V(ctx->VertexProgram.Machine.Registers[index], params);
}
 
 
/**
* Set a sequence of program parameter registers.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameters4dvNV(GLenum target, GLuint index,
GLuint num, const GLdouble *params)
{
GLuint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4dvNV");
return;
}
 
if (index + num > VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4dvNV");
return;
}
 
index += VP_PROG_REG_START;
for (i = 0; i < num; i++) {
COPY_4V_CAST(ctx->VertexProgram.Machine.Registers[index + i],
params, GLfloat);
params += 4;
};
}
 
 
/**
* Set a sequence of program parameter registers.
* \note Called from the GL API dispatcher.
*/
void _mesa_ProgramParameters4fvNV(GLenum target, GLuint index,
GLuint num, const GLfloat *params)
{
GLuint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4fvNV");
return;
}
 
if (index + num > VP_NUM_PROG_REGS) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV");
return;
}
 
index += VP_PROG_REG_START;
for (i = 0; i < num; i++) {
COPY_4V(ctx->VertexProgram.Machine.Registers[index + i], params);
params += 4;
};
}
 
 
/**
* Setup tracking of matrices into program parameter registers.
* \note Called from the GL API dispatcher.
*/
void _mesa_TrackMatrixNV(GLenum target, GLuint address,
GLenum matrix, GLenum transform)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (target != GL_VERTEX_PROGRAM_NV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(target)");
return;
}
 
if (address & 0x3) {
/* addr must be multiple of four */
_mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)");
return;
}
 
switch (matrix) {
case GL_NONE:
case GL_MODELVIEW:
case GL_PROJECTION:
case GL_TEXTURE:
case GL_COLOR:
case GL_MODELVIEW_PROJECTION_NV:
case GL_MATRIX0_NV:
case GL_MATRIX1_NV:
case GL_MATRIX2_NV:
case GL_MATRIX3_NV:
case GL_MATRIX4_NV:
case GL_MATRIX5_NV:
case GL_MATRIX6_NV:
case GL_MATRIX7_NV:
/* OK, fallthrough */
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(matrix)");
return;
}
 
switch (transform) {
case GL_IDENTITY_NV:
case GL_INVERSE_NV:
case GL_TRANSPOSE_NV:
case GL_INVERSE_TRANSPOSE_NV:
/* OK, fallthrough */
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(transform)");
return;
}
 
ctx->VertexProgram.TrackMatrix[address / 4] = matrix;
ctx->VertexProgram.TrackMatrixTransform[address / 4] = transform;
}
/shark/trunk/ports/mesa/src/simple_list.h
0,0 → 1,98
/* $Id: simple_list.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/* Simple macros for typesafe, intrusive lists.
* (C) 1997, Keith Whitwell
*
* Intended to work with a list sentinal which is created as an empty
* list. Insert & delete are O(1).
*/
 
 
#ifndef _SIMPLE_LIST_H
#define _SIMPLE_LIST_H
 
#define remove_from_list(elem) \
do { \
(elem)->next->prev = (elem)->prev; \
(elem)->prev->next = (elem)->next; \
} while (0)
 
#define insert_at_head(list, elem) \
do { \
(elem)->prev = list; \
(elem)->next = (list)->next; \
(list)->next->prev = elem; \
(list)->next = elem; \
} while(0)
 
#define insert_at_tail(list, elem) \
do { \
(elem)->next = list; \
(elem)->prev = (list)->prev; \
(list)->prev->next = elem; \
(list)->prev = elem; \
} while(0)
 
#define move_to_head(list, elem) \
do { \
remove_from_list(elem); \
insert_at_head(list, elem); \
} while (0)
 
#define move_to_tail(list, elem) \
do { \
remove_from_list(elem); \
insert_at_tail(list, elem); \
} while (0)
 
 
#define make_empty_list(sentinal) \
do { \
(sentinal)->next = sentinal; \
(sentinal)->prev = sentinal; \
} while (0)
 
 
#define first_elem(list) ((list)->next)
#define last_elem(list) ((list)->prev)
#define next_elem(elem) ((elem)->next)
#define prev_elem(elem) ((elem)->prev)
#define at_end(list, elem) ((elem) == (list))
#define is_empty_list(list) ((list)->next == (list))
 
#define foreach(ptr, list) \
for( ptr=(list)->next ; ptr!=list ; ptr=(ptr)->next )
 
/* Kludgey - Lets you unlink the current value during a list
* traversal. Useful for free()-ing a list, element
* by element.
*/
#define foreach_s(ptr, t, list) \
for(ptr=(list)->next,t=(ptr)->next; list != ptr; ptr=t, t=(t)->next)
 
 
#endif
/shark/trunk/ports/mesa/src/vpexec.c
0,0 → 1,744
/* $Id: vpexec.c,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
/*
* -------- Regarding NV_vertex_program --------
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistribution of the source code must contain a copyright notice
* and this list of conditions;
*
* o Redistribution in binary and source code form must contain the
* following Notice in the software and any documentation and/or other
* materials provided with the distribution; and
*
* o The name of Nvidia may not be used to promote or endorse software
* derived from the software.
*
* NOTICE: Nvidia hereby grants to each recipient a non-exclusive worldwide
* royalty free patent license under patent claims that are licensable by
* Nvidia and which are necessarily required and for which no commercially
* viable non infringing alternative exists to make, use, sell, offer to sell,
* import and otherwise transfer the vertex extension for the Mesa 3D Graphics
* Library as distributed in source code and object code form. No hardware or
* hardware implementation (including a semiconductor implementation and chips)
* are licensed hereunder. If a recipient makes a patent claim or institutes
* patent litigation against Nvidia or Nvidia's customers for use or sale of
* Nvidia products, then this license grant as to such recipient shall
* immediately terminate and recipient immediately agrees to cease use and
* distribution of the Mesa Program and derivatives thereof.
*
* THE MESA 3D GRAPHICS LIBRARY IS PROVIDED ON AN "AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
* WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-NFRINGEMENT
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
*
* NVIDIA SHALL NOT HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
* LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE MESA 3D GRAPHICS
* LIBRARY OR EVIDENCE OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDR, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* If you do not comply with this agreement, then Nvidia may cancel the license
* and rights granted herein.
* ---------------------------------------------
*/
 
/**
* \file vpexec.c
* \brief Code to execute vertex programs.
* \author Brian Paul
*/
 
#include "glheader.h"
#include "context.h"
#include "imports.h"
#include "macros.h"
#include "mtypes.h"
#include "vpexec.h"
#include "mmath.h"
#include "math/m_matrix.h"
 
 
/**
* Load/initialize the vertex program registers.
* This needs to be done per vertex.
*/
void
_mesa_init_vp_registers(GLcontext *ctx)
{
struct vp_machine *machine = &(ctx->VertexProgram.Machine);
GLuint i;
 
/* Input registers get initialized from the current vertex attribs */
MEMCPY(machine->Registers[VP_INPUT_REG_START],
ctx->Current.Attrib,
16 * 4 * sizeof(GLfloat));
 
/* Output and temp regs are initialized to [0,0,0,1] */
for (i = VP_OUTPUT_REG_START; i <= VP_OUTPUT_REG_END; i++) {
machine->Registers[i][0] = 0.0F;
machine->Registers[i][1] = 0.0F;
machine->Registers[i][2] = 0.0F;
machine->Registers[i][3] = 1.0F;
}
for (i = VP_TEMP_REG_START; i <= VP_TEMP_REG_END; i++) {
machine->Registers[i][0] = 0.0F;
machine->Registers[i][1] = 0.0F;
machine->Registers[i][2] = 0.0F;
machine->Registers[i][3] = 1.0F;
}
 
/* The program regs aren't touched */
}
 
 
 
/**
* Copy the 16 elements of a matrix into four consecutive program
* registers starting at 'pos'.
*/
static void
load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
{
GLuint i;
pos += VP_PROG_REG_START;
for (i = 0; i < 4; i++) {
registers[pos + i][0] = mat[0 + i];
registers[pos + i][1] = mat[4 + i];
registers[pos + i][2] = mat[8 + i];
registers[pos + i][3] = mat[12 + i];
}
}
 
 
/**
* As above, but transpose the matrix.
*/
static void
load_transpose_matrix(GLfloat registers[][4], GLuint pos,
const GLfloat mat[16])
{
pos += VP_PROG_REG_START;
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
}
 
 
/**
* Load all currently tracked matrices into the program registers.
* This needs to be done per glBegin/glEnd.
*/
void
_mesa_init_tracked_matrices(GLcontext *ctx)
{
GLuint i;
 
for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
/* point 'mat' at source matrix */
GLmatrix *mat;
if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
mat = ctx->ModelviewMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
mat = ctx->ProjectionMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
mat = ctx->ColorMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
/* XXX verify the combined matrix is up to date */
mat = &ctx->_ModelProjectMatrix;
}
else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
ASSERT(n < MAX_PROGRAM_MATRICES);
mat = ctx->ProgramMatrixStack[n].Top;
}
else {
/* no matrix is tracked, but we leave the register values as-is */
assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
continue;
}
 
/* load the matrix */
if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
load_matrix(ctx->VertexProgram.Machine.Registers, i*4, mat->m);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
_math_matrix_analyse(mat); /* update the inverse */
assert((mat->flags & MAT_DIRTY_INVERSE) == 0);
load_matrix(ctx->VertexProgram.Machine.Registers, i*4, mat->inv);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
load_transpose_matrix(ctx->VertexProgram.Machine.Registers, i*4, mat->m);
}
else {
assert(ctx->VertexProgram.TrackMatrixTransform[i]
== GL_INVERSE_TRANSPOSE_NV);
_math_matrix_analyse(mat); /* update the inverse */
assert((mat->flags & MAT_DIRTY_INVERSE) == 0);
load_transpose_matrix(ctx->VertexProgram.Machine.Registers,
i*4, mat->inv);
}
}
}
 
 
 
/**
* For debugging. Dump the current vertex program machine registers.
*/
void
_mesa_dump_vp_machine( const struct vp_machine *machine )
{
int i;
_mesa_printf("VertexIn:\n");
for (i = 0; i < VP_NUM_INPUT_REGS; i++) {
_mesa_printf("%d: %f %f %f %f ", i,
machine->Registers[i + VP_INPUT_REG_START][0],
machine->Registers[i + VP_INPUT_REG_START][1],
machine->Registers[i + VP_INPUT_REG_START][2],
machine->Registers[i + VP_INPUT_REG_START][3]);
}
_mesa_printf("\n");
 
_mesa_printf("VertexOut:\n");
for (i = 0; i < VP_NUM_OUTPUT_REGS; i++) {
_mesa_printf("%d: %f %f %f %f ", i,
machine->Registers[i + VP_OUTPUT_REG_START][0],
machine->Registers[i + VP_OUTPUT_REG_START][1],
machine->Registers[i + VP_OUTPUT_REG_START][2],
machine->Registers[i + VP_OUTPUT_REG_START][3]);
}
_mesa_printf("\n");
 
_mesa_printf("Registers:\n");
for (i = 0; i < VP_NUM_TEMP_REGS; i++) {
_mesa_printf("%d: %f %f %f %f ", i,
machine->Registers[i + VP_TEMP_REG_START][0],
machine->Registers[i + VP_TEMP_REG_START][1],
machine->Registers[i + VP_TEMP_REG_START][2],
machine->Registers[i + VP_TEMP_REG_START][3]);
}
_mesa_printf("\n");
 
_mesa_printf("Parameters:\n");
for (i = 0; i < VP_NUM_PROG_REGS; i++) {
_mesa_printf("%d: %f %f %f %f ", i,
machine->Registers[i + VP_PROG_REG_START][0],
machine->Registers[i + VP_PROG_REG_START][1],
machine->Registers[i + VP_PROG_REG_START][2],
machine->Registers[i + VP_PROG_REG_START][3]);
}
_mesa_printf("\n");
}
 
 
/**
* Fetch a 4-element float vector from the given source register.
* Apply swizzling and negating as needed.
*/
static void
fetch_vector4( const struct vp_src_register *source,
const struct vp_machine *machine,
GLfloat result[4] )
{
static const GLfloat zero[4] = { 0, 0, 0, 0 };
const GLfloat *src;
 
if (source->RelAddr) {
GLint reg = source->Register + machine->AddressReg;
if (reg < VP_PROG_REG_START || reg > VP_PROG_REG_END)
src = zero;
else
src = machine->Registers[reg];
}
else {
src = machine->Registers[source->Register];
}
 
if (source->Negate) {
result[0] = -src[source->Swizzle[0]];
result[1] = -src[source->Swizzle[1]];
result[2] = -src[source->Swizzle[2]];
result[3] = -src[source->Swizzle[3]];
}
else {
result[0] = src[source->Swizzle[0]];
result[1] = src[source->Swizzle[1]];
result[2] = src[source->Swizzle[2]];
result[3] = src[source->Swizzle[3]];
}
}
 
 
/**
* As above, but only return result[0] element.
*/
static void
fetch_vector1( const struct vp_src_register *source,
const struct vp_machine *machine,
GLfloat result[4] )
{
static const GLfloat zero[4] = { 0, 0, 0, 0 };
const GLfloat *src;
 
if (source->RelAddr) {
GLint reg = source->Register + machine->AddressReg;
if (reg < VP_PROG_REG_START || reg > VP_PROG_REG_END)
src = zero;
else
src = machine->Registers[reg];
}
else {
src = machine->Registers[source->Register];
}
 
if (source->Negate) {
result[0] = -src[source->Swizzle[0]];
}
else {
result[0] = src[source->Swizzle[0]];
}
}
 
 
/**
* Store 4 floats into a register.
*/
static void
store_vector4( const struct vp_dst_register *dest, struct vp_machine *machine,
const GLfloat value[4] )
{
GLfloat *dst = machine->Registers[dest->Register];
 
if (dest->WriteMask[0])
dst[0] = value[0];
if (dest->WriteMask[1])
dst[1] = value[1];
if (dest->WriteMask[2])
dst[2] = value[2];
if (dest->WriteMask[3])
dst[3] = value[3];
}
 
 
/**
* Set x to positive or negative infinity.
*/
#ifdef USE_IEEE
#define SET_POS_INFINITY(x) ( *((GLuint *) &x) = 0x7F800000 )
#define SET_NEG_INFINITY(x) ( *((GLuint *) &x) = 0xFF800000 )
#elif defined(VMS)
#define SET_POS_INFINITY(x) x = __MAXFLOAT
#define SET_NEG_INFINITY(x) x = -__MAXFLOAT
#else
#define SET_POS_INFINITY(x) x = (GLfloat) HUGE_VAL
#define SET_NEG_INFINITY(x) x = (GLfloat) -HUGE_VAL
#endif
 
#define SET_FLOAT_BITS(x, bits) ((fi_type *) &(x))->i = bits
 
 
/**
* Execute the given vertex program
*/
void
_mesa_exec_program(GLcontext *ctx, const struct vp_program *program)
{
struct vp_machine *machine = &ctx->VertexProgram.Machine;
const struct vp_instruction *inst;
 
/* XXX load vertex fields into input registers */
/* and do other initialization */
 
 
for (inst = program->Instructions; inst->Opcode !=END; inst++) {
switch (inst->Opcode) {
case MOV:
{
GLfloat t[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
store_vector4( &inst->DstReg, machine, t );
}
break;
case LIT:
{
const GLfloat epsilon = 1.0e-5F; /* XXX fix? */
GLfloat t[4], lit[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
if (t[3] < -(128.0F - epsilon))
t[3] = - (128.0F - epsilon);
else if (t[3] > 128.0F - epsilon)
t[3] = 128.0F - epsilon;
if (t[0] < 0.0)
t[0] = 0.0;
if (t[1] < 0.0)
t[1] = 0.0;
lit[0] = 1.0;
lit[1] = t[0];
lit[2] = (t[0] > 0.0) ? (GLfloat) exp(t[3] * log(t[1])) : 0.0F;
lit[3] = 1.0;
store_vector4( &inst->DstReg, machine, lit );
}
break;
case RCP:
{
GLfloat t[4];
fetch_vector1( &inst->SrcReg[0], machine, t );
if (t[0] != 1.0F)
t[0] = 1.0F / t[0]; /* div by zero is infinity! */
t[1] = t[2] = t[3] = t[0];
store_vector4( &inst->DstReg, machine, t );
}
break;
case RSQ:
{
GLfloat t[4];
fetch_vector1( &inst->SrcReg[0], machine, t );
t[0] = (float) (1.0 / sqrt(fabs(t[0])));
t[1] = t[2] = t[3] = t[0];
store_vector4( &inst->DstReg, machine, t );
}
break;
case EXP:
{
GLfloat t[4], q[4], floor_t0;
fetch_vector1( &inst->SrcReg[0], machine, t );
floor_t0 = (float) floor(t[0]);
if (floor_t0 > FLT_MAX_EXP) {
SET_POS_INFINITY(q[0]);
q[1] = 0.0F;
SET_POS_INFINITY(q[2]);
q[3] = 1.0F;
}
else if (floor_t0 < FLT_MIN_EXP) {
q[0] = 0.0F;
q[1] = 0.0F;
q[2] = 0.0F;
q[3] = 0.0F;
}
else {
#ifdef USE_IEEE
GLint ii = (GLint) floor_t0;
ii = (ii < 23) + 0x3f800000;
SET_FLOAT_BITS(q[0], ii);
q[0] = *((GLfloat *) &ii);
#else
q[0] = (GLfloat) pow(2.0, floor_t0);
#endif
q[1] = t[0] - floor_t0;
q[2] = (GLfloat) (q[0] * LOG2(q[1]));
q[3] = 1.0F;
}
store_vector4( &inst->DstReg, machine, t );
}
break;
case LOG:
{
GLfloat t[4], q[4], abs_t0;
fetch_vector1( &inst->SrcReg[0], machine, t );
abs_t0 = (GLfloat) fabs(t[0]);
if (abs_t0 != 0.0F) {
/* Since we really can't handle infinite values on VMS
* like other OSes we'll use __MAXFLOAT to represent
* infinity. This may need some tweaking.
*/
#ifdef VMS
if (abs_t0 == __MAXFLOAT) {
#else
if (IS_INF_OR_NAN(abs_t0)) {
#endif
SET_POS_INFINITY(q[0]);
q[1] = 1.0F;
SET_POS_INFINITY(q[2]);
}
else {
int exponent;
double mantissa = frexp(t[0], &exponent);
q[0] = (GLfloat) (exponent - 1);
q[1] = (GLfloat) (2.0 * mantissa); /* map [.5, 1) -> [1, 2) */
q[2] = (GLfloat) (q[0] + LOG2(q[1]));
}
}
else {
SET_NEG_INFINITY(q[0]);
q[1] = 1.0F;
SET_NEG_INFINITY(q[2]);
}
q[3] = 1.0;
store_vector4( &inst->DstReg, machine, q );
}
break;
case MUL:
{
GLfloat t[4], u[4], prod[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
prod[0] = t[0] * u[0];
prod[1] = t[1] * u[1];
prod[2] = t[2] * u[2];
prod[3] = t[3] * u[3];
store_vector4( &inst->DstReg, machine, prod );
}
break;
case ADD:
{
GLfloat t[4], u[4], sum[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
sum[0] = t[0] + u[0];
sum[1] = t[1] + u[1];
sum[2] = t[2] + u[2];
sum[3] = t[3] + u[3];
store_vector4( &inst->DstReg, machine, sum );
}
break;
case DP3:
{
GLfloat t[4], u[4], dot[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2];
dot[1] = dot[2] = dot[3] = dot[0];
store_vector4( &inst->DstReg, machine, dot );
}
break;
case DP4:
{
GLfloat t[4], u[4], dot[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2] + t[3] * u[3];
dot[1] = dot[2] = dot[3] = dot[0];
store_vector4( &inst->DstReg, machine, dot );
}
break;
case DST:
{
GLfloat t[4], u[4], dst[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
dst[0] = 1.0F;
dst[1] = t[1] * u[1];
dst[2] = t[2];
dst[3] = u[3];
store_vector4( &inst->DstReg, machine, dst );
}
break;
case MIN:
{
GLfloat t[4], u[4], min[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
min[0] = (t[0] < u[0]) ? t[0] : u[0];
min[1] = (t[1] < u[1]) ? t[1] : u[1];
min[2] = (t[2] < u[2]) ? t[2] : u[2];
min[3] = (t[3] < u[3]) ? t[3] : u[3];
store_vector4( &inst->DstReg, machine, min );
}
break;
case MAX:
{
GLfloat t[4], u[4], max[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
max[0] = (t[0] > u[0]) ? t[0] : u[0];
max[1] = (t[1] > u[1]) ? t[1] : u[1];
max[2] = (t[2] > u[2]) ? t[2] : u[2];
max[3] = (t[3] > u[3]) ? t[3] : u[3];
store_vector4( &inst->DstReg, machine, max );
}
break;
case SLT:
{
GLfloat t[4], u[4], slt[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
slt[0] = (t[0] < u[0]) ? 1.0F : 0.0F;
slt[1] = (t[1] < u[1]) ? 1.0F : 0.0F;
slt[2] = (t[2] < u[2]) ? 1.0F : 0.0F;
slt[3] = (t[3] < u[3]) ? 1.0F : 0.0F;
store_vector4( &inst->DstReg, machine, slt );
}
break;
case SGE:
{
GLfloat t[4], u[4], sge[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
sge[0] = (t[0] >= u[0]) ? 1.0F : 0.0F;
sge[1] = (t[1] >= u[1]) ? 1.0F : 0.0F;
sge[2] = (t[2] >= u[2]) ? 1.0F : 0.0F;
sge[3] = (t[3] >= u[3]) ? 1.0F : 0.0F;
store_vector4( &inst->DstReg, machine, sge );
}
break;
case MAD:
{
GLfloat t[4], u[4], v[4], sum[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
fetch_vector4( &inst->SrcReg[2], machine, v );
sum[0] = t[0] * u[0] + v[0];
sum[1] = t[1] * u[1] + v[1];
sum[2] = t[2] * u[2] + v[2];
sum[3] = t[3] * u[3] + v[3];
store_vector4( &inst->DstReg, machine, sum );
}
break;
case ARL:
{
GLfloat t[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
machine->AddressReg = (GLint) floor(t[0]);
}
break;
case DPH:
{
GLfloat t[4], u[4], dot[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2] + u[3];
dot[1] = dot[2] = dot[3] = dot[0];
store_vector4( &inst->DstReg, machine, dot );
}
break;
case RCC:
{
GLfloat t[4], u;
fetch_vector1( &inst->SrcReg[0], machine, t );
if (t[0] == 1.0F)
u = 1.0F;
else
u = 1.0F / t[0];
if (u > 0.0F) {
if (u > 1.884467e+019F) {
u = 1.884467e+019F; /* IEEE 32-bit binary value 0x5F800000 */
}
else if (u < 5.42101e-020F) {
u = 5.42101e-020F; /* IEEE 32-bit binary value 0x1F800000 */
}
}
else {
if (u < -1.884467e+019F) {
u = -1.884467e+019F; /* IEEE 32-bit binary value 0xDF800000 */
}
else if (u > -5.42101e-020F) {
u = -5.42101e-020F; /* IEEE 32-bit binary value 0x9F800000 */
}
}
t[0] = t[1] = t[2] = t[3] = u;
store_vector4( &inst->DstReg, machine, t );
}
break;
case SUB:
{
GLfloat t[4], u[4], sum[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
fetch_vector4( &inst->SrcReg[1], machine, u );
sum[0] = t[0] - u[0];
sum[1] = t[1] - u[1];
sum[2] = t[2] - u[2];
sum[3] = t[3] - u[3];
store_vector4( &inst->DstReg, machine, sum );
}
break;
case ABS:
{
GLfloat t[4];
fetch_vector4( &inst->SrcReg[0], machine, t );
if (t[0] < 0.0) t[0] = -t[0];
if (t[1] < 0.0) t[1] = -t[1];
if (t[2] < 0.0) t[2] = -t[2];
if (t[3] < 0.0) t[3] = -t[3];
store_vector4( &inst->DstReg, machine, t );
}
break;
 
case END:
return;
default:
/* bad instruction opcode */
_mesa_problem(ctx, "Bad VP Opcode in _mesa_exec_program");
return;
}
}
}
 
 
 
/**
Thoughts on vertex program optimization:
 
The obvious thing to do is to compile the vertex program into X86/SSE/3DNow!
assembly code. That will probably be a lot of work.
 
Another approach might be to replace the vp_instruction->Opcode field with
a pointer to a specialized C function which executes the instruction.
In particular we can write functions which skip swizzling, negating,
masking, relative addressing, etc. when they're not needed.
 
For example:
 
void simple_add( struct vp_instruction *inst )
{
GLfloat *sum = machine->Registers[inst->DstReg.Register];
GLfloat *a = machine->Registers[inst->SrcReg[0].Register];
GLfloat *b = machine->Registers[inst->SrcReg[1].Register];
sum[0] = a[0] + b[0];
sum[1] = a[1] + b[1];
sum[2] = a[2] + b[2];
sum[3] = a[3] + b[3];
}
 
*/
 
/*
 
KW:
 
A first step would be to 'vectorize' the programs in the same way as
the normal transformation code in the tnl module. Thus each opcode
takes zero or more input vectors (registers) and produces one or more
output vectors.
 
These operations would intially be coded in C, with machine-specific
assembly following, as is currently the case for matrix
transformations in the math/ directory. The preprocessing scheme for
selecting simpler operations Brian describes above would also work
here.
 
This should give reasonable performance without excessive effort.
 
*/
/shark/trunk/ports/mesa/src/vpstate.h
0,0 → 1,125
/* $Id: vpstate.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Brian Paul
*/
 
 
#ifndef VPSTATE_H
#define VPSTATE_H
 
 
extern void _mesa_delete_program(GLcontext *ctx, GLuint id);
 
 
extern void _mesa_BindProgramNV(GLenum target, GLuint id);
 
extern void _mesa_DeleteProgramsNV(GLsizei n, const GLuint *ids);
 
extern void _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params);
 
extern void _mesa_GenProgramsNV(GLsizei n, GLuint *ids);
 
extern GLboolean _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, GLboolean *residences);
 
extern void _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids);
 
 
extern void _mesa_GetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat *params);
 
extern void _mesa_GetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble *params);
 
extern void _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params);
 
extern void _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program);
 
extern void _mesa_GetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint *params);
 
extern void _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params);
 
extern void _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params);
 
extern void _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params);
 
extern void _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer);
 
extern GLboolean _mesa_IsProgramNV(GLuint id);
 
extern void _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
const GLubyte *program);
 
extern void _mesa_ProgramParameter4dNV(GLenum target, GLuint index,
GLdouble x, GLdouble y,
GLdouble z, GLdouble w);
 
extern void _mesa_ProgramParameter4dvNV(GLenum target, GLuint index,
const GLdouble *params);
 
extern void _mesa_ProgramParameter4fNV(GLenum target, GLuint index,
GLfloat x, GLfloat y,
GLfloat z, GLfloat w);
 
extern void _mesa_ProgramParameter4fvNV(GLenum target, GLuint index,
const GLfloat *params);
 
extern void _mesa_ProgramParameters4dvNV(GLenum target, GLuint index,
GLuint num, const GLdouble *params);
 
extern void _mesa_ProgramParameters4fvNV(GLenum target, GLuint index,
GLuint num, const GLfloat *params);
 
extern void _mesa_TrackMatrixNV(GLenum target, GLuint address,
GLenum matrix, GLenum transform);
 
 
extern void _mesa_VertexAttribs1svNV(GLuint index, GLsizei n, const GLshort *v);
 
extern void _mesa_VertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat *v);
 
extern void _mesa_VertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble *v);
 
extern void _mesa_VertexAttribs2svNV(GLuint index, GLsizei n, const GLshort *v);
 
extern void _mesa_VertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat *v);
 
extern void _mesa_VertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble *v);
 
extern void _mesa_VertexAttribs3svNV(GLuint index, GLsizei n, const GLshort *v);
 
extern void _mesa_VertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat *v);
 
extern void _mesa_VertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble *v);
 
extern void _mesa_VertexAttribs4svNV(GLuint index, GLsizei n, const GLshort *v);
 
extern void _mesa_VertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat *v);
 
extern void _mesa_VertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble *v);
 
extern void _mesa_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v);
 
 
#endif
/shark/trunk/ports/mesa/src/rastpos.c
0,0 → 1,788
/* $Id: rastpos.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "clip.h"
#include "colormac.h"
#include "context.h"
#include "feedback.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "rastpos.h"
#include "state.h"
#include "simple_list.h"
#include "mtypes.h"
 
#include "math/m_matrix.h"
#include "math/m_xform.h"
 
 
/*
* Clip a point against the view volume.
* Input: v - vertex-vector describing the point to clip
* Return: 0 = outside view volume
* 1 = inside view volume
*/
static GLuint
viewclip_point( const GLfloat v[] )
{
if ( v[0] > v[3] || v[0] < -v[3]
|| v[1] > v[3] || v[1] < -v[3]
|| v[2] > v[3] || v[2] < -v[3] ) {
return 0;
}
else {
return 1;
}
}
 
 
/* As above, but only clip test against far/near Z planes */
static GLuint
viewclip_point_z( const GLfloat v[] )
{
if (v[2] > v[3] || v[2] < -v[3] ) {
return 0;
}
else {
return 1;
}
}
 
 
 
/*
* Clip a point against the user clipping planes.
* Input: v - vertex-vector describing the point to clip.
* Return: 0 = point was clipped
* 1 = point not clipped
*/
static GLuint
userclip_point( GLcontext* ctx, const GLfloat v[] )
{
GLuint p;
 
for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
GLfloat dot = v[0] * ctx->Transform._ClipUserPlane[p][0]
+ v[1] * ctx->Transform._ClipUserPlane[p][1]
+ v[2] * ctx->Transform._ClipUserPlane[p][2]
+ v[3] * ctx->Transform._ClipUserPlane[p][3];
if (dot < 0.0F) {
return 0;
}
}
}
 
return 1;
}
 
 
/* This has been split off to allow the normal shade routines to
* get a little closer to the vertex buffer, and to use the
* GLvector objects directly.
* Input: ctx - the context
* vertex - vertex location
* normal - normal vector
* Output: Rcolor - returned color
* Rspec - returned specular color (if separate specular enabled)
* Rindex - returned color index
*/
static void
shade_rastpos(GLcontext *ctx,
const GLfloat vertex[4],
const GLfloat normal[3],
GLfloat Rcolor[4],
GLfloat Rspec[4],
GLuint *Rindex)
{
GLfloat (*base)[3] = ctx->Light._BaseColor;
struct gl_light *light;
GLfloat diffuseColor[4], specularColor[4];
GLfloat diffuse = 0, specular = 0;
 
if (!ctx->_ShineTable[0] || !ctx->_ShineTable[1])
_mesa_validate_all_lighting_tables( ctx );
 
COPY_3V(diffuseColor, base[0]);
diffuseColor[3] = CLAMP( ctx->Light.Material[0].Diffuse[3], 0.0F, 1.0F );
ASSIGN_4V(specularColor, 0.0, 0.0, 0.0, 0.0);
 
foreach (light, &ctx->Light.EnabledList) {
GLfloat n_dot_h;
GLfloat attenuation = 1.0;
GLfloat VP[3];
GLfloat n_dot_VP;
GLfloat *h;
GLfloat diffuseContrib[3], specularContrib[3];
GLboolean normalized;
 
if (!(light->_Flags & LIGHT_POSITIONAL)) {
COPY_3V(VP, light->_VP_inf_norm);
attenuation = light->_VP_inf_spot_attenuation;
}
else {
GLfloat d;
 
SUB_3V(VP, light->_Position, vertex);
d = (GLfloat) LEN_3FV( VP );
 
if ( d > 1e-6) {
GLfloat invd = 1.0F / d;
SELF_SCALE_SCALAR_3V(VP, invd);
}
attenuation = 1.0F / (light->ConstantAttenuation + d *
(light->LinearAttenuation + d *
light->QuadraticAttenuation));
 
if (light->_Flags & LIGHT_SPOT) {
GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection);
 
if (PV_dot_dir<light->_CosCutoff) {
continue;
}
else {
double x = PV_dot_dir * (EXP_TABLE_SIZE-1);
int k = (int) x;
GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0]
+ (x-k)*light->_SpotExpTable[k][1]);
attenuation *= spot;
}
}
}
 
if (attenuation < 1e-3)
continue;
 
n_dot_VP = DOT3( normal, VP );
 
if (n_dot_VP < 0.0F) {
ACC_SCALE_SCALAR_3V(diffuseColor, attenuation, light->_MatAmbient[0]);
continue;
}
 
COPY_3V(diffuseContrib, light->_MatAmbient[0]);
ACC_SCALE_SCALAR_3V(diffuseContrib, n_dot_VP, light->_MatDiffuse[0]);
diffuse += n_dot_VP * light->_dli * attenuation;
ASSIGN_3V(specularContrib, 0.0, 0.0, 0.0);
 
{
if (ctx->Light.Model.LocalViewer) {
GLfloat v[3];
COPY_3V(v, vertex);
NORMALIZE_3FV(v);
SUB_3V(VP, VP, v);
h = VP;
normalized = 0;
}
else if (light->_Flags & LIGHT_POSITIONAL) {
h = VP;
ACC_3V(h, ctx->_EyeZDir);
normalized = 0;
}
else {
h = light->_h_inf_norm;
normalized = 1;
}
 
n_dot_h = DOT3(normal, h);
 
if (n_dot_h > 0.0F) {
const struct gl_material *mat = &ctx->Light.Material[0];
GLfloat spec_coef;
GLfloat shininess = mat->Shininess;
 
if (!normalized) {
n_dot_h *= n_dot_h;
n_dot_h /= LEN_SQUARED_3FV( h );
shininess *= .5;
}
 
GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec_coef );
 
if (spec_coef > 1.0e-10) {
if (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) {
ACC_SCALE_SCALAR_3V( specularContrib, spec_coef,
light->_MatSpecular[0]);
}
else {
ACC_SCALE_SCALAR_3V( diffuseContrib, spec_coef,
light->_MatSpecular[0]);
}
specular += spec_coef * light->_sli * attenuation;
}
}
}
 
ACC_SCALE_SCALAR_3V( diffuseColor, attenuation, diffuseContrib );
ACC_SCALE_SCALAR_3V( specularColor, attenuation, specularContrib );
}
 
if (ctx->Visual.rgbMode) {
Rcolor[0] = CLAMP(diffuseColor[0], 0.0F, 1.0F);
Rcolor[1] = CLAMP(diffuseColor[1], 0.0F, 1.0F);
Rcolor[2] = CLAMP(diffuseColor[2], 0.0F, 1.0F);
Rcolor[3] = CLAMP(diffuseColor[3], 0.0F, 1.0F);
Rspec[0] = CLAMP(specularColor[0], 0.0F, 1.0F);
Rspec[1] = CLAMP(specularColor[1], 0.0F, 1.0F);
Rspec[2] = CLAMP(specularColor[2], 0.0F, 1.0F);
Rspec[3] = CLAMP(specularColor[3], 0.0F, 1.0F);
}
else {
struct gl_material *mat = &ctx->Light.Material[0];
GLfloat d_a = mat->DiffuseIndex - mat->AmbientIndex;
GLfloat s_a = mat->SpecularIndex - mat->AmbientIndex;
GLfloat ind = mat->AmbientIndex
+ diffuse * (1.0F-specular) * d_a
+ specular * s_a;
if (ind > mat->SpecularIndex) {
ind = mat->SpecularIndex;
}
*Rindex = (GLuint) (GLint) ind;
}
 
}
 
/*
* Caller: context->API.RasterPos4f
*/
static void
raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GLfloat v[4], eye[4], clip[4], ndc[3], d;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
 
if (ctx->NewState)
_mesa_update_state( ctx );
 
ASSIGN_4V( v, x, y, z, w );
TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, v );
 
/* raster color */
if (ctx->Light.Enabled) {
GLfloat *norm, eyenorm[3];
GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
 
if (ctx->_NeedEyeCoords) {
GLfloat *inv = ctx->ModelviewMatrixStack.Top->inv;
TRANSFORM_NORMAL( eyenorm, objnorm, inv );
norm = eyenorm;
}
else {
norm = objnorm;
}
 
shade_rastpos( ctx, v, norm,
ctx->Current.RasterColor,
ctx->Current.RasterSecondaryColor,
&ctx->Current.RasterIndex );
 
}
else {
/* use current color or index */
if (ctx->Visual.rgbMode) {
COPY_4FV(ctx->Current.RasterColor,
ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
COPY_4FV(ctx->Current.RasterSecondaryColor,
ctx->Current.Attrib[VERT_ATTRIB_COLOR1]);
}
else {
ctx->Current.RasterIndex = ctx->Current.Index;
}
}
 
/* compute raster distance */
if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
else
ctx->Current.RasterDistance = (GLfloat)
GL_SQRT( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
 
/* apply projection matrix: clip = Proj * eye */
TRANSFORM_POINT( clip, ctx->ProjectionMatrixStack.Top->m, eye );
 
/* clip to view volume */
if (ctx->Transform.RasterPositionUnclipped) {
/* GL_IBM_rasterpos_clip: only clip against Z */
if (viewclip_point_z(clip) == 0)
ctx->Current.RasterPosValid = GL_FALSE;
}
else if (viewclip_point(clip) == 0) {
/* Normal OpenGL behaviour */
ctx->Current.RasterPosValid = GL_FALSE;
return;
}
 
/* clip to user clipping planes */
if (ctx->Transform.ClipPlanesEnabled && !userclip_point(ctx, clip)) {
ctx->Current.RasterPosValid = GL_FALSE;
return;
}
 
/* ndc = clip / W */
ASSERT( clip[3]!=0.0 );
d = 1.0F / clip[3];
ndc[0] = clip[0] * d;
ndc[1] = clip[1] * d;
ndc[2] = clip[2] * d;
 
ctx->Current.RasterPos[0] = (ndc[0] * ctx->Viewport._WindowMap.m[MAT_SX] +
ctx->Viewport._WindowMap.m[MAT_TX]);
ctx->Current.RasterPos[1] = (ndc[1] * ctx->Viewport._WindowMap.m[MAT_SY] +
ctx->Viewport._WindowMap.m[MAT_TY]);
ctx->Current.RasterPos[2] = (ndc[2] * ctx->Viewport._WindowMap.m[MAT_SZ] +
ctx->Viewport._WindowMap.m[MAT_TZ]) / ctx->DepthMaxF;
ctx->Current.RasterPos[3] = clip[3];
ctx->Current.RasterPosValid = GL_TRUE;
 
{
GLuint texSet;
for (texSet = 0; texSet < ctx->Const.MaxTextureUnits; texSet++) {
COPY_4FV( ctx->Current.RasterTexCoords[texSet],
ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
}
}
 
if (ctx->RenderMode==GL_SELECT) {
_mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
}
 
}
 
 
void
_mesa_RasterPos2d(GLdouble x, GLdouble y)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2f(GLfloat x, GLfloat y)
{
_mesa_RasterPos4f(x, y, 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2i(GLint x, GLint y)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2s(GLshort x, GLshort y)
{
_mesa_RasterPos4f(x, y, 0.0F, 1.0F);
}
 
void
_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
void
_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
{
_mesa_RasterPos4f(x, y, z, 1.0F);
}
 
void
_mesa_RasterPos3i(GLint x, GLint y, GLint z)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
void
_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
{
_mesa_RasterPos4f(x, y, z, 1.0F);
}
 
void
_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
void
_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
raster_pos4f(ctx, x, y, z, w);
}
 
void
_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
{
_mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
void
_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
{
_mesa_RasterPos4f(x, y, z, w);
}
 
void
_mesa_RasterPos2dv(const GLdouble *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2fv(const GLfloat *v)
{
_mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2iv(const GLint *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
void
_mesa_RasterPos2sv(const GLshort *v)
{
_mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
}
 
void
_mesa_RasterPos3dv(const GLdouble *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
void
_mesa_RasterPos3fv(const GLfloat *v)
{
_mesa_RasterPos4f(v[0], v[1], v[2], 1.0F);
}
 
void
_mesa_RasterPos3iv(const GLint *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
void
_mesa_RasterPos3sv(const GLshort *v)
{
_mesa_RasterPos4f(v[0], v[1], v[2], 1.0F);
}
 
void
_mesa_RasterPos4dv(const GLdouble *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
void
_mesa_RasterPos4fv(const GLfloat *v)
{
_mesa_RasterPos4f(v[0], v[1], v[2], v[3]);
}
 
void
_mesa_RasterPos4iv(const GLint *v)
{
_mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
void
_mesa_RasterPos4sv(const GLshort *v)
{
_mesa_RasterPos4f(v[0], v[1], v[2], v[3]);
}
 
 
/**********************************************************************/
/*** GL_ARB_window_pos / GL_MESA_window_pos ***/
/**********************************************************************/
 
static void
window_pos3f(GLfloat x, GLfloat y, GLfloat z)
{
GET_CURRENT_CONTEXT(ctx);
GLfloat z2;
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
FLUSH_CURRENT(ctx, 0);
 
z2 = CLAMP(z, 0.0F, 1.0F) * (ctx->Viewport.Far - ctx->Viewport.Near)
+ ctx->Viewport.Near;
 
/* set raster position */
ctx->Current.RasterPos[0] = x;
ctx->Current.RasterPos[1] = y;
ctx->Current.RasterPos[2] = z2;
ctx->Current.RasterPos[3] = 1.0F;
 
ctx->Current.RasterPosValid = GL_TRUE;
 
if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
else
ctx->Current.RasterDistance = 0.0;
 
/* raster color = current color or index */
if (ctx->Visual.rgbMode) {
ctx->Current.RasterColor[0]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
ctx->Current.RasterColor[1]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
ctx->Current.RasterColor[2]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
ctx->Current.RasterColor[3]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
ctx->Current.RasterSecondaryColor[0]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
ctx->Current.RasterSecondaryColor[1]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
ctx->Current.RasterSecondaryColor[2]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
ctx->Current.RasterSecondaryColor[3]
= CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
}
else {
ctx->Current.RasterIndex = ctx->Current.Index;
}
 
/* raster texcoord = current texcoord */
{
GLuint texSet;
for (texSet = 0; texSet < ctx->Const.MaxTextureUnits; texSet++) {
COPY_4FV( ctx->Current.RasterTexCoords[texSet],
ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
}
}
 
if (ctx->RenderMode==GL_SELECT) {
_mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
}
}
 
 
/* This is just to support the GL_MESA_window_pos version */
static void
window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
window_pos3f(x, y, z);
ctx->Current.RasterPos[3] = w;
}
 
 
void
_mesa_WindowPos2dMESA(GLdouble x, GLdouble y)
{
window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2fMESA(GLfloat x, GLfloat y)
{
window_pos4f(x, y, 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2iMESA(GLint x, GLint y)
{
window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2sMESA(GLshort x, GLshort y)
{
window_pos4f(x, y, 0.0F, 1.0F);
}
 
void
_mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z)
{
window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
void
_mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)
{
window_pos4f(x, y, z, 1.0F);
}
 
void
_mesa_WindowPos3iMESA(GLint x, GLint y, GLint z)
{
window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
}
 
void
_mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z)
{
window_pos4f(x, y, z, 1.0F);
}
 
void
_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
void
_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
window_pos4f(x, y, z, w);
}
 
void
_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
{
window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
}
 
void
_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
{
window_pos4f(x, y, z, w);
}
 
void
_mesa_WindowPos2dvMESA(const GLdouble *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2fvMESA(const GLfloat *v)
{
window_pos4f(v[0], v[1], 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2ivMESA(const GLint *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
}
 
void
_mesa_WindowPos2svMESA(const GLshort *v)
{
window_pos4f(v[0], v[1], 0.0F, 1.0F);
}
 
void
_mesa_WindowPos3dvMESA(const GLdouble *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
void
_mesa_WindowPos3fvMESA(const GLfloat *v)
{
window_pos4f(v[0], v[1], v[2], 1.0);
}
 
void
_mesa_WindowPos3ivMESA(const GLint *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
}
 
void
_mesa_WindowPos3svMESA(const GLshort *v)
{
window_pos4f(v[0], v[1], v[2], 1.0F);
}
 
void
_mesa_WindowPos4dvMESA(const GLdouble *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
void
_mesa_WindowPos4fvMESA(const GLfloat *v)
{
window_pos4f(v[0], v[1], v[2], v[3]);
}
 
void
_mesa_WindowPos4ivMESA(const GLint *v)
{
window_pos4f((GLfloat) v[0], (GLfloat) v[1],
(GLfloat) v[2], (GLfloat) v[3]);
}
 
void
_mesa_WindowPos4svMESA(const GLshort *v)
{
window_pos4f(v[0], v[1], v[2], v[3]);
}
 
 
 
#if 0
 
/*
* OpenGL implementation of glWindowPos*MESA()
*/
void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
GLfloat fx, fy;
 
/* Push current matrix mode and viewport attributes */
glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
 
/* Setup projection parameters */
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
 
glDepthRange( z, z );
glViewport( (int) x - 1, (int) y - 1, 2, 2 );
 
/* set the raster (window) position */
fx = x - (int) x;
fy = y - (int) y;
glRasterPos4f( fx, fy, 0.0, w );
 
/* restore matrices, viewport and matrix mode */
glPopMatrix();
glMatrixMode( GL_PROJECTION );
glPopMatrix();
 
glPopAttrib();
}
 
#endif
/shark/trunk/ports/mesa/src/texobj.c
0,0 → 1,864
/* $Id: texobj.c,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "colortab.h"
#include "context.h"
#include "enums.h"
#include "hash.h"
#include "imports.h"
#include "macros.h"
#include "teximage.h"
#include "texstate.h"
#include "texobj.h"
#include "mtypes.h"
 
 
/*
* Allocate a new texture object and add it to the linked list of texture
* objects. If name>0 then also insert the new texture object into the hash
* table.
* Input: shared - the shared GL state structure to contain the texture object
* name - integer name for the texture object
* target - either GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D,
* GL_TEXTURE_CUBE_MAP_ARB or GL_TEXTURE_RECTANGLE_NV
* zero is ok for the sake of GenTextures()
* Return: pointer to new texture object
*/
struct gl_texture_object *
_mesa_alloc_texture_object( struct gl_shared_state *shared,
GLuint name, GLenum target )
{
struct gl_texture_object *obj;
 
ASSERT(target == 0 ||
target == GL_TEXTURE_1D ||
target == GL_TEXTURE_2D ||
target == GL_TEXTURE_3D ||
target == GL_TEXTURE_CUBE_MAP_ARB ||
target == GL_TEXTURE_RECTANGLE_NV);
 
obj = CALLOC_STRUCT(gl_texture_object);
 
if (obj) {
/* init the non-zero fields */
_glthread_INIT_MUTEX(obj->Mutex);
obj->RefCount = 1;
obj->Name = name;
obj->Target = target;
obj->Priority = 1.0F;
if (target == GL_TEXTURE_RECTANGLE_NV) {
obj->WrapS = GL_CLAMP_TO_EDGE;
obj->WrapT = GL_CLAMP_TO_EDGE;
obj->WrapR = GL_CLAMP_TO_EDGE;
obj->MinFilter = GL_LINEAR;
}
else {
obj->WrapS = GL_REPEAT;
obj->WrapT = GL_REPEAT;
obj->WrapR = GL_REPEAT;
obj->MinFilter = GL_NEAREST_MIPMAP_LINEAR;
}
obj->MagFilter = GL_LINEAR;
obj->MinLod = -1000.0;
obj->MaxLod = 1000.0;
obj->BaseLevel = 0;
obj->MaxLevel = 1000;
obj->MaxAnisotropy = 1.0;
obj->CompareFlag = GL_FALSE; /* SGIX_shadow */
obj->CompareOperator = GL_TEXTURE_LEQUAL_R_SGIX; /* SGIX_shadow */
obj->CompareMode = GL_LUMINANCE; /* ARB_shadow */
obj->CompareFunc = GL_LEQUAL; /* ARB_shadow */
obj->DepthMode = GL_LUMINANCE; /* ARB_depth_texture */
obj->ShadowAmbient = 0.0F; /* ARB/SGIX_shadow_ambient */
_mesa_init_colortable(&obj->Palette);
 
/* insert into linked list */
if (shared) {
_glthread_LOCK_MUTEX(shared->Mutex);
obj->Next = shared->TexObjectList;
shared->TexObjectList = obj;
_glthread_UNLOCK_MUTEX(shared->Mutex);
}
 
if (name > 0) {
/* insert into hash table */
_mesa_HashInsert(shared->TexObjects, name, obj);
}
}
return obj;
}
 
 
/*
* Deallocate a texture object struct and remove it from the given
* shared GL state.
* Input: shared - the shared GL state to which the object belongs
* t - the texture object to delete
*/
void _mesa_free_texture_object( struct gl_shared_state *shared,
struct gl_texture_object *t )
{
struct gl_texture_object *tprev, *tcurr;
 
assert(t);
 
/* unlink t from the linked list */
if (shared) {
_glthread_LOCK_MUTEX(shared->Mutex);
tprev = NULL;
tcurr = shared->TexObjectList;
while (tcurr) {
if (tcurr==t) {
if (tprev) {
tprev->Next = t->Next;
}
else {
shared->TexObjectList = t->Next;
}
break;
}
tprev = tcurr;
tcurr = tcurr->Next;
}
_glthread_UNLOCK_MUTEX(shared->Mutex);
}
 
if (t->Name) {
/* remove from hash table */
_mesa_HashRemove(shared->TexObjects, t->Name);
}
 
_mesa_free_colortable_data(&t->Palette);
 
/* free the texture images */
{
GLuint i;
for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
if (t->Image[i]) {
_mesa_free_texture_image( t->Image[i] );
}
}
}
 
/* free this object */
FREE( t );
}
 
 
/*
* Copy texture object state from one texture object to another.
*/
void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src )
{
dest->Name = src->Name;
dest->Priority = src->Priority;
dest->BorderColor[0] = src->BorderColor[0];
dest->BorderColor[1] = src->BorderColor[1];
dest->BorderColor[2] = src->BorderColor[2];
dest->BorderColor[3] = src->BorderColor[3];
dest->WrapS = src->WrapS;
dest->WrapT = src->WrapT;
dest->WrapR = src->WrapR;
dest->MinFilter = src->MinFilter;
dest->MagFilter = src->MagFilter;
dest->MinLod = src->MinLod;
dest->MaxLod = src->MaxLod;
dest->BaseLevel = src->BaseLevel;
dest->MaxLevel = src->MaxLevel;
dest->MaxAnisotropy = src->MaxAnisotropy;
dest->CompareFlag = src->CompareFlag;
dest->CompareOperator = src->CompareOperator;
dest->ShadowAmbient = src->ShadowAmbient;
dest->CompareMode = src->CompareMode;
dest->CompareFunc = src->CompareFunc;
dest->DepthMode = src->DepthMode;
dest->_MaxLevel = src->_MaxLevel;
dest->_MaxLambda = src->_MaxLambda;
dest->GenerateMipmap = src->GenerateMipmap;
dest->Palette = src->Palette;
dest->Complete = src->Complete;
}
 
 
/*
* Report why a texture object is incomplete. (for debug only)
*/
#if 0
static void
incomplete(const struct gl_texture_object *t, const char *why)
{
_mesa_printf("Texture Obj %d incomplete because: %s\n", t->Name, why);
}
#else
#define incomplete(a, b)
#endif
 
 
/*
* Examine a texture object to determine if it is complete.
* The t->Complete flag will be set to GL_TRUE or GL_FALSE accordingly.
*/
void
_mesa_test_texobj_completeness( const GLcontext *ctx,
struct gl_texture_object *t )
{
const GLint baseLevel = t->BaseLevel;
GLint maxLog2 = 0, maxLevels = 0;
 
t->Complete = GL_TRUE; /* be optimistic */
 
/* Always need the base level image */
if (!t->Image[baseLevel]) {
incomplete(t, "Image[baseLevel] == NULL");
t->Complete = GL_FALSE;
return;
}
 
/* Compute _MaxLevel */
if (t->Target == GL_TEXTURE_1D) {
maxLog2 = t->Image[baseLevel]->WidthLog2;
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (t->Target == GL_TEXTURE_2D) {
maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2,
t->Image[baseLevel]->HeightLog2);
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (t->Target == GL_TEXTURE_3D) {
GLint max = MAX2(t->Image[baseLevel]->WidthLog2,
t->Image[baseLevel]->HeightLog2);
maxLog2 = MAX2(max, (GLint)(t->Image[baseLevel]->DepthLog2));
maxLevels = ctx->Const.Max3DTextureLevels;
}
else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) {
maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2,
t->Image[baseLevel]->HeightLog2);
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else if (t->Target == GL_TEXTURE_RECTANGLE_NV) {
maxLog2 = 0; /* not applicable */
maxLevels = 1; /* no mipmapping */
}
else {
_mesa_problem(ctx, "Bad t->Target in _mesa_test_texobj_completeness");
return;
}
 
ASSERT(maxLevels > 0);
 
t->_MaxLevel = baseLevel + maxLog2;
t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel);
t->_MaxLevel = MIN2(t->_MaxLevel, maxLevels - 1);
 
/* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */
t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel);
 
if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) {
/* make sure that all six cube map level 0 images are the same size */
const GLuint w = t->Image[baseLevel]->Width2;
const GLuint h = t->Image[baseLevel]->Height2;
if (!t->NegX[baseLevel] ||
t->NegX[baseLevel]->Width2 != w ||
t->NegX[baseLevel]->Height2 != h ||
!t->PosY[baseLevel] ||
t->PosY[baseLevel]->Width2 != w ||
t->PosY[baseLevel]->Height2 != h ||
!t->NegY[baseLevel] ||
t->NegY[baseLevel]->Width2 != w ||
t->NegY[baseLevel]->Height2 != h ||
!t->PosZ[baseLevel] ||
t->PosZ[baseLevel]->Width2 != w ||
t->PosZ[baseLevel]->Height2 != h ||
!t->NegZ[baseLevel] ||
t->NegZ[baseLevel]->Width2 != w ||
t->NegZ[baseLevel]->Height2 != h) {
t->Complete = GL_FALSE;
incomplete(t, "Non-quare cubemap image");
return;
}
}
 
if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) {
/*
* Mipmapping: determine if we have a complete set of mipmaps
*/
GLint i;
GLint minLevel = baseLevel;
GLint maxLevel = t->_MaxLevel;
 
if (minLevel > maxLevel) {
t->Complete = GL_FALSE;
incomplete(t, "minLevel > maxLevel");
return;
}
 
/* Test dimension-independent attributes */
for (i = minLevel; i <= maxLevel; i++) {
if (t->Image[i]) {
if (t->Image[i]->TexFormat != t->Image[baseLevel]->TexFormat) {
t->Complete = GL_FALSE;
incomplete(t, "Format[i] != Format[baseLevel]");
return;
}
if (t->Image[i]->Border != t->Image[baseLevel]->Border) {
t->Complete = GL_FALSE;
incomplete(t, "Border[i] != Border[baseLevel]");
return;
}
}
}
 
/* Test things which depend on number of texture image dimensions */
if (t->Target == GL_TEXTURE_1D) {
/* Test 1-D mipmaps */
GLuint width = t->Image[baseLevel]->Width2;
for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) {
width /= 2;
}
if (i >= minLevel && i <= maxLevel) {
if (!t->Image[i]) {
t->Complete = GL_FALSE;
incomplete(t, "1D Image[i] == NULL");
return;
}
if (t->Image[i]->Width2 != width ) {
t->Complete = GL_FALSE;
incomplete(t, "1D Image[i] bad width");
return;
}
}
if (width == 1) {
return; /* found smallest needed mipmap, all done! */
}
}
}
else if (t->Target == GL_TEXTURE_2D) {
/* Test 2-D mipmaps */
GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2;
for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) {
width /= 2;
}
if (height > 1) {
height /= 2;
}
if (i >= minLevel && i <= maxLevel) {
if (!t->Image[i]) {
t->Complete = GL_FALSE;
incomplete(t, "2D Image[i] == NULL");
return;
}
if (t->Image[i]->Width2 != width) {
t->Complete = GL_FALSE;
incomplete(t, "2D Image[i] bad width");
return;
}
if (t->Image[i]->Height2 != height) {
t->Complete = GL_FALSE;
incomplete(t, "2D Image[i] bad height");
return;
}
if (width==1 && height==1) {
return; /* found smallest needed mipmap, all done! */
}
}
}
}
else if (t->Target == GL_TEXTURE_3D) {
/* Test 3-D mipmaps */
GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2;
GLuint depth = t->Image[baseLevel]->Depth2;
for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) {
width /= 2;
}
if (height > 1) {
height /= 2;
}
if (depth > 1) {
depth /= 2;
}
if (i >= minLevel && i <= maxLevel) {
if (!t->Image[i]) {
incomplete(t, "3D Image[i] == NULL");
t->Complete = GL_FALSE;
return;
}
if (t->Image[i]->Format == GL_DEPTH_COMPONENT) {
t->Complete = GL_FALSE;
incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex");
return;
}
if (t->Image[i]->Width2 != width) {
t->Complete = GL_FALSE;
incomplete(t, "3D Image[i] bad width");
return;
}
if (t->Image[i]->Height2 != height) {
t->Complete = GL_FALSE;
incomplete(t, "3D Image[i] bad height");
return;
}
if (t->Image[i]->Depth2 != depth) {
t->Complete = GL_FALSE;
incomplete(t, "3D Image[i] bad depth");
return;
}
}
if (width == 1 && height == 1 && depth == 1) {
return; /* found smallest needed mipmap, all done! */
}
}
}
else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) {
/* make sure 6 cube faces are consistant */
GLuint width = t->Image[baseLevel]->Width2;
GLuint height = t->Image[baseLevel]->Height2;
for (i = baseLevel + 1; i < maxLevels; i++) {
if (width > 1) {
width /= 2;
}
if (height > 1) {
height /= 2;
}
if (i >= minLevel && i <= maxLevel) {
/* Don't support GL_DEPTH_COMPONENT for cube maps */
if (t->Image[i]->Format == GL_DEPTH_COMPONENT) {
t->Complete = GL_FALSE;
incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex");
return;
}
/* check that we have images defined */
if (!t->Image[i] || !t->NegX[i] ||
!t->PosY[i] || !t->NegY[i] ||
!t->PosZ[i] || !t->NegZ[i]) {
t->Complete = GL_FALSE;
incomplete(t, "CubeMap Image[i] == NULL");
return;
}
/* check that all six images have same size */
if (t->NegX[i]->Width2!=width || t->NegX[i]->Height2!=height ||
t->PosY[i]->Width2!=width || t->PosY[i]->Height2!=height ||
t->NegY[i]->Width2!=width || t->NegY[i]->Height2!=height ||
t->PosZ[i]->Width2!=width || t->PosZ[i]->Height2!=height ||
t->NegZ[i]->Width2!=width || t->NegZ[i]->Height2!=height) {
t->Complete = GL_FALSE;
incomplete(t, "CubeMap Image[i] bad size");
return;
}
}
if (width == 1 && height == 1) {
return; /* found smallest needed mipmap, all done! */
}
}
}
else if (t->Target == GL_TEXTURE_RECTANGLE_NV) {
/* XXX special checking? */
 
}
else {
/* Target = ??? */
_mesa_problem(ctx, "Bug in gl_test_texture_object_completeness\n");
}
}
}
 
 
_glthread_DECLARE_STATIC_MUTEX(GenTexturesLock);
 
 
/*
* Execute glGenTextures
*/
void
_mesa_GenTextures( GLsizei n, GLuint *texName )
{
GET_CURRENT_CONTEXT(ctx);
GLuint first;
GLint i;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (n < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" );
return;
}
 
if (!texName)
return;
 
/*
* This must be atomic (generation and allocation of texture IDs)
*/
_glthread_LOCK_MUTEX(GenTexturesLock);
 
first = _mesa_HashFindFreeKeyBlock(ctx->Shared->TexObjects, n);
 
/* Return the texture names */
for (i=0;i<n;i++) {
texName[i] = first + i;
}
 
/* Allocate new, empty texture objects */
for (i=0;i<n;i++) {
GLuint name = first + i;
GLenum target = 0;
(void) _mesa_alloc_texture_object( ctx->Shared, name, target);
}
 
_glthread_UNLOCK_MUTEX(GenTexturesLock);
}
 
 
 
/*
* Execute glDeleteTextures
*/
void
_mesa_DeleteTextures( GLsizei n, const GLuint *texName)
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */
 
if (!texName)
return;
 
for (i=0;i<n;i++) {
if (texName[i] > 0) {
struct gl_texture_object *delObj = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texName[i]);
if (delObj) {
/* First check if this texture is currently bound.
* If so, unbind it and decrement the reference count.
*/
GLuint u;
for (u = 0; u < MAX_TEXTURE_UNITS; u++) {
struct gl_texture_unit *unit = &ctx->Texture.Unit[u];
if (delObj == unit->Current1D) {
unit->Current1D = ctx->Shared->Default1D;
ctx->Shared->Default1D->RefCount++;
delObj->RefCount--;
if (delObj == unit->_Current)
unit->_Current = unit->Current1D;
}
else if (delObj == unit->Current2D) {
unit->Current2D = ctx->Shared->Default2D;
ctx->Shared->Default2D->RefCount++;
delObj->RefCount--;
if (delObj == unit->_Current)
unit->_Current = unit->Current2D;
}
else if (delObj == unit->Current3D) {
unit->Current3D = ctx->Shared->Default3D;
ctx->Shared->Default3D->RefCount++;
delObj->RefCount--;
if (delObj == unit->_Current)
unit->_Current = unit->Current3D;
}
else if (delObj == unit->CurrentCubeMap) {
unit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
ctx->Shared->DefaultCubeMap->RefCount++;
delObj->RefCount--;
if (delObj == unit->_Current)
unit->_Current = unit->CurrentCubeMap;
}
else if (delObj == unit->CurrentRect) {
unit->CurrentRect = ctx->Shared->DefaultRect;
ctx->Shared->DefaultRect->RefCount++;
delObj->RefCount--;
if (delObj == unit->_Current)
unit->_Current = unit->CurrentRect;
}
}
ctx->NewState |= _NEW_TEXTURE;
 
/* Decrement reference count and delete if zero */
delObj->RefCount--;
ASSERT(delObj->RefCount >= 0);
 
if (delObj->RefCount == 0) {
ASSERT(delObj->Name != 0);
if (ctx->Driver.DeleteTexture)
(*ctx->Driver.DeleteTexture)( ctx, delObj );
_mesa_free_texture_object(ctx->Shared, delObj);
}
}
}
}
}
 
 
 
/*
* Execute glBindTexture
*/
void
_mesa_BindTexture( GLenum target, GLuint texName )
{
GET_CURRENT_CONTEXT(ctx);
GLuint unit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
struct gl_texture_object *oldTexObj;
struct gl_texture_object *newTexObj = 0;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
_mesa_debug(ctx, "glBindTexture %s %d\n",
_mesa_lookup_enum_by_nr(target), (GLint) texName);
 
switch (target) {
case GL_TEXTURE_1D:
oldTexObj = texUnit->Current1D;
break;
case GL_TEXTURE_2D:
oldTexObj = texUnit->Current2D;
break;
case GL_TEXTURE_3D:
oldTexObj = texUnit->Current3D;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" );
return;
}
oldTexObj = texUnit->CurrentCubeMap;
break;
case GL_TEXTURE_RECTANGLE_NV:
if (!ctx->Extensions.NV_texture_rectangle) {
_mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" );
return;
}
oldTexObj = texUnit->CurrentRect;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" );
return;
}
 
if (oldTexObj->Name == texName)
return; /* rebinding the same texture- no change */
 
/*
* Get pointer to new texture object (newTexObj)
*/
if (texName == 0) {
/* newTexObj = a default texture object */
switch (target) {
case GL_TEXTURE_1D:
newTexObj = ctx->Shared->Default1D;
break;
case GL_TEXTURE_2D:
newTexObj = ctx->Shared->Default2D;
break;
case GL_TEXTURE_3D:
newTexObj = ctx->Shared->Default3D;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
newTexObj = ctx->Shared->DefaultCubeMap;
break;
case GL_TEXTURE_RECTANGLE_NV:
newTexObj = ctx->Shared->DefaultRect;
break;
default:
; /* Bad targets are caught above */
}
}
else {
/* non-default texture object */
const struct _mesa_HashTable *hash = ctx->Shared->TexObjects;
newTexObj = (struct gl_texture_object *) _mesa_HashLookup(hash, texName);
if (newTexObj) {
/* error checking */
if (newTexObj->Target != 0 && newTexObj->Target != target) {
/* the named texture object's dimensions don't match the target */
_mesa_error( ctx, GL_INVALID_OPERATION,
"glBindTexture(wrong dimensionality)" );
return;
}
if (newTexObj->Target == 0 && target == GL_TEXTURE_RECTANGLE_NV) {
/* have to init wrap and filter state here - kind of klunky */
newTexObj->WrapS = GL_CLAMP_TO_EDGE;
newTexObj->WrapT = GL_CLAMP_TO_EDGE;
newTexObj->WrapR = GL_CLAMP_TO_EDGE;
newTexObj->MinFilter = GL_LINEAR;
}
}
else {
/* if this is a new texture id, allocate a texture object now */
newTexObj = _mesa_alloc_texture_object( ctx->Shared, texName,
target);
if (!newTexObj) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture");
return;
}
}
newTexObj->Target = target;
}
 
newTexObj->RefCount++;
 
/* do the actual binding, but first flush outstanding vertices:
*/
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
 
switch (target) {
case GL_TEXTURE_1D:
texUnit->Current1D = newTexObj;
break;
case GL_TEXTURE_2D:
texUnit->Current2D = newTexObj;
break;
case GL_TEXTURE_3D:
texUnit->Current3D = newTexObj;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
texUnit->CurrentCubeMap = newTexObj;
break;
case GL_TEXTURE_RECTANGLE_NV:
texUnit->CurrentRect = newTexObj;
break;
default:
_mesa_problem(ctx, "bad target in BindTexture");
return;
}
 
/* Pass BindTexture call to device driver */
if (ctx->Driver.BindTexture)
(*ctx->Driver.BindTexture)( ctx, target, newTexObj );
 
oldTexObj->RefCount--;
assert(oldTexObj->RefCount >= 0);
if (oldTexObj->RefCount == 0) {
assert(oldTexObj->Name != 0);
if (ctx->Driver.DeleteTexture) {
(*ctx->Driver.DeleteTexture)( ctx, oldTexObj );
}
_mesa_free_texture_object(ctx->Shared, oldTexObj);
}
}
 
 
 
/*
* Execute glPrioritizeTextures
*/
void
_mesa_PrioritizeTextures( GLsizei n, const GLuint *texName,
const GLclampf *priorities )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (n < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPrioritizeTextures" );
return;
}
 
if (!priorities)
return;
 
for (i = 0; i < n; i++) {
if (texName[i] > 0) {
struct gl_texture_object *t = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texName[i]);
if (t) {
t->Priority = CLAMP( priorities[i], 0.0F, 1.0F );
if (ctx->Driver.PrioritizeTexture)
ctx->Driver.PrioritizeTexture( ctx, t, t->Priority );
}
}
}
 
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
/*
* Execute glAreTexturesResident
*/
GLboolean
_mesa_AreTexturesResident(GLsizei n, const GLuint *texName,
GLboolean *residences)
{
GET_CURRENT_CONTEXT(ctx);
GLboolean allResident = GL_TRUE;
GLint i;
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
if (n < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)");
return GL_FALSE;
}
 
if (!texName || !residences)
return GL_FALSE;
 
for (i = 0; i < n; i++) {
struct gl_texture_object *t;
if (texName[i] == 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)");
return GL_FALSE;
}
t = (struct gl_texture_object *)
_mesa_HashLookup(ctx->Shared->TexObjects, texName[i]);
if (t) {
if (ctx->Driver.IsTextureResident) {
residences[i] = ctx->Driver.IsTextureResident(ctx, t);
if (!residences[i])
allResident = GL_FALSE;
}
else {
residences[i] = GL_TRUE;
}
}
else {
_mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)");
return GL_FALSE;
}
}
return allResident;
}
 
 
 
/*
* Execute glIsTexture
*/
GLboolean
_mesa_IsTexture( GLuint texture )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
return texture > 0 && _mesa_HashLookup(ctx->Shared->TexObjects, texture);
}
/shark/trunk/ports/mesa/src/glapi.c
0,0 → 1,920
/* $Id: glapi.c,v 1.1 2003-02-28 11:42:01 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* This file manages the OpenGL API dispatch layer.
* The dispatch table (struct _glapi_table) is basically just a list
* of function pointers.
* There are functions to set/get the current dispatch table for the
* current thread and to manage registration/dispatch of dynamically
* added extension functions.
*
* It's intended that this file and the other glapi*.[ch] files are
* flexible enough to be reused in several places: XFree86, DRI-
* based libGL.so, and perhaps the SGI SI.
*
* NOTE: There are no dependencies on Mesa in this code.
*
* Versions (API changes):
* 2000/02/23 - original version for Mesa 3.3 and XFree86 4.0
* 2001/01/16 - added dispatch override feature for Mesa 3.5
* 2002/06/28 - added _glapi_set_warning_func(), Mesa 4.1.
* 2002/10/01 - _glapi_get_proc_address() will now generate new entrypoints
* itself (using offset ~0). _glapi_add_entrypoint() can be
* called afterward and it'll fill in the correct dispatch
* offset. This allows DRI libGL to avoid probing for DRI
* drivers! No changes to the public glapi interface.
*/
 
 
 
#include "glheader.h"
#include "glapi.h"
#include "glapioffsets.h"
#include "glapitable.h"
#include "glthread.h"
 
/***** BEGIN NO-OP DISPATCH *****/
 
static GLboolean WarnFlag = GL_FALSE;
static _glapi_warning_func warning_func;
 
 
/*
* Enable/disable printing of warning messages.
*/
void
_glapi_noop_enable_warnings(GLboolean enable)
{
WarnFlag = enable;
}
 
/*
* Register a callback function for reporting errors.
*/
void
_glapi_set_warning_func( _glapi_warning_func func )
{
warning_func = func;
}
 
static GLboolean
warn(void)
{
if ((WarnFlag || getenv("MESA_DEBUG") || getenv("LIBGL_DEBUG"))
&& warning_func) {
return GL_TRUE;
}
else {
return GL_FALSE;
}
}
 
 
#define KEYWORD1 static
#define KEYWORD2
#define NAME(func) NoOp##func
 
#define F NULL
 
#define DISPATCH(func, args, msg) \
if (warn()) { \
warning_func(NULL, "GL User Error: called without context:"); \
warning_func msg; \
}
 
#define RETURN_DISPATCH(func, args, msg) \
if (warn()) { \
warning_func(NULL, "GL User Error: called without context:"); \
warning_func msg; \
} \
return 0
 
#define DISPATCH_TABLE_NAME __glapi_noop_table
#define UNUSED_TABLE_NAME __usused_noop_functions
 
#define TABLE_ENTRY(name) (void *) NoOp##name
 
static int NoOpUnused(void)
{
if (warn()) {
warning_func(NULL, "GL User Error: calling extension function without a current context\n");
}
return 0;
}
 
#include "glapitemp.h"
 
/***** END NO-OP DISPATCH *****/
 
 
 
/***** BEGIN THREAD-SAFE DISPATCH *****/
/* if we support thread-safety, build a special dispatch table for use
* in thread-safety mode (ThreadSafe == GL_TRUE). Each entry in the
* dispatch table will call _glthread_GetTSD() to get the actual dispatch
* table bound to the current thread, then jump through that table.
*/
 
#if defined(THREADS)
 
static GLboolean ThreadSafe = GL_FALSE; /* In thread-safe mode? */
static _glthread_TSD DispatchTSD; /* Per-thread dispatch pointer */
static _glthread_TSD RealDispatchTSD; /* only when using override */
static _glthread_TSD ContextTSD; /* Per-thread context pointer */
 
 
#define KEYWORD1 static
#define KEYWORD2 GLAPIENTRY
#define NAME(func) _ts_##func
 
#define DISPATCH(FUNC, ARGS, MESSAGE) \
struct _glapi_table *dispatch; \
dispatch = (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD); \
if (!dispatch) \
dispatch = (struct _glapi_table *) __glapi_noop_table; \
(dispatch->FUNC) ARGS
 
#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \
struct _glapi_table *dispatch; \
dispatch = (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD); \
if (!dispatch) \
dispatch = (struct _glapi_table *) __glapi_noop_table; \
return (dispatch->FUNC) ARGS
 
#define DISPATCH_TABLE_NAME __glapi_threadsafe_table
#define UNUSED_TABLE_NAME __usused_threadsafe_functions
 
#define TABLE_ENTRY(name) (void *) _ts_##name
 
static int _ts_Unused(void)
{
return 0;
}
 
#include "glapitemp.h"
 
#endif
 
/***** END THREAD-SAFE DISPATCH *****/
 
 
 
struct _glapi_table *_glapi_Dispatch = (struct _glapi_table *) __glapi_noop_table;
struct _glapi_table *_glapi_RealDispatch = (struct _glapi_table *) __glapi_noop_table;
 
/* Used when thread safety disabled */
void *_glapi_Context = NULL;
 
 
static GLboolean DispatchOverride = GL_FALSE;
 
 
 
/* strdup() is actually not a standard ANSI C or POSIX routine.
* Irix will not define it if ANSI mode is in effect.
*/
static char *
str_dup(const char *str)
{
char *copy;
copy = (char*) malloc(strlen(str) + 1);
if (!copy)
return NULL;
strcpy(copy, str);
return copy;
}
 
 
 
/*
* We should call this periodically from a function such as glXMakeCurrent
* in order to test if multiple threads are being used.
*/
void
_glapi_check_multithread(void)
{
#if defined(THREADS)
if (!ThreadSafe) {
static unsigned long knownID;
static GLboolean firstCall = GL_TRUE;
if (firstCall) {
knownID = _glthread_GetID();
firstCall = GL_FALSE;
}
else if (knownID != _glthread_GetID()) {
ThreadSafe = GL_TRUE;
}
}
if (ThreadSafe) {
/* make sure that this thread's dispatch pointer isn't null */
if (!_glapi_get_dispatch()) {
_glapi_set_dispatch(NULL);
}
}
#endif
}
 
 
 
/*
* Set the current context pointer for this thread.
* The context pointer is an opaque type which should be cast to
* void from the real context pointer type.
*/
void
_glapi_set_context(void *context)
{
#if defined(THREADS)
_glthread_SetTSD(&ContextTSD, context);
if (ThreadSafe)
_glapi_Context = NULL;
else
_glapi_Context = context;
#else
_glapi_Context = context;
#endif
}
 
 
 
/*
* Get the current context pointer for this thread.
* The context pointer is an opaque type which should be cast from
* void to the real context pointer type.
*/
void *
_glapi_get_context(void)
{
#if defined(THREADS)
if (ThreadSafe) {
return _glthread_GetTSD(&ContextTSD);
}
else {
return _glapi_Context;
}
#else
return _glapi_Context;
#endif
}
 
 
 
/*
* Set the global or per-thread dispatch table pointer.
*/
void
_glapi_set_dispatch(struct _glapi_table *dispatch)
{
if (!dispatch) {
/* use the no-op functions */
dispatch = (struct _glapi_table *) __glapi_noop_table;
}
#ifdef DEBUG
else {
_glapi_check_table(dispatch);
}
#endif
 
#if defined(THREADS)
if (DispatchOverride) {
_glthread_SetTSD(&RealDispatchTSD, (void *) dispatch);
if (ThreadSafe)
_glapi_RealDispatch = (struct _glapi_table*) __glapi_threadsafe_table;
else
_glapi_RealDispatch = dispatch;
}
else {
/* normal operation */
_glthread_SetTSD(&DispatchTSD, (void *) dispatch);
if (ThreadSafe)
_glapi_Dispatch = (struct _glapi_table *) __glapi_threadsafe_table;
else
_glapi_Dispatch = dispatch;
}
#else /*THREADS*/
if (DispatchOverride) {
_glapi_RealDispatch = dispatch;
}
else {
_glapi_Dispatch = dispatch;
}
#endif /*THREADS*/
}
 
 
 
/*
* Return pointer to current dispatch table for calling thread.
*/
struct _glapi_table *
_glapi_get_dispatch(void)
{
#if defined(THREADS)
if (ThreadSafe) {
if (DispatchOverride) {
return (struct _glapi_table *) _glthread_GetTSD(&RealDispatchTSD);
}
else {
return (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD);
}
}
else {
if (DispatchOverride) {
assert(_glapi_RealDispatch);
return _glapi_RealDispatch;
}
else {
assert(_glapi_Dispatch);
return _glapi_Dispatch;
}
}
#else
return _glapi_Dispatch;
#endif
}
 
 
/*
* Notes on dispatch overrride:
*
* Dispatch override allows an external agent to hook into the GL dispatch
* mechanism before execution goes into the core rendering library. For
* example, a trace mechanism would insert itself as an overrider, print
* logging info for each GL function, then dispatch to the real GL function.
*
* libGLS (GL Stream library) is another agent that might use override.
*
* We don't allow more than one layer of overriding at this time.
* In the future we may allow nested/layered override. In that case
* _glapi_begin_dispatch_override() will return an override layer,
* _glapi_end_dispatch_override(layer) will remove an override layer
* and _glapi_get_override_dispatch(layer) will return the dispatch
* table for a given override layer. layer = 0 will be the "real"
* dispatch table.
*/
 
/*
* Return: dispatch override layer number.
*/
int
_glapi_begin_dispatch_override(struct _glapi_table *override)
{
struct _glapi_table *real = _glapi_get_dispatch();
 
assert(!DispatchOverride); /* can't nest at this time */
DispatchOverride = GL_TRUE;
 
_glapi_set_dispatch(real);
 
#if defined(THREADS)
_glthread_SetTSD(&DispatchTSD, (void *) override);
if (ThreadSafe)
_glapi_Dispatch = (struct _glapi_table *) __glapi_threadsafe_table;
else
_glapi_Dispatch = override;
#else
_glapi_Dispatch = override;
#endif
return 1;
}
 
 
void
_glapi_end_dispatch_override(int layer)
{
struct _glapi_table *real = _glapi_get_dispatch();
(void) layer;
DispatchOverride = GL_FALSE;
_glapi_set_dispatch(real);
/* the rest of this isn't needed, just play it safe */
#if defined(THREADS)
_glthread_SetTSD(&RealDispatchTSD, NULL);
#endif
_glapi_RealDispatch = NULL;
}
 
 
struct _glapi_table *
_glapi_get_override_dispatch(int layer)
{
if (layer == 0) {
return _glapi_get_dispatch();
}
else {
if (DispatchOverride) {
#if defined(THREADS)
return (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD);
#else
return _glapi_Dispatch;
#endif
}
else {
return NULL;
}
}
}
 
 
struct name_address_offset {
const char *Name;
GLvoid *Address;
GLuint Offset;
};
 
 
/* The code in this file is auto-generated with Python */
#include "glprocs.h"
 
 
 
/*
* Return dispatch table offset of the named static (built-in) function.
* Return -1 if function not found.
*/
static GLint
get_static_proc_offset(const char *funcName)
{
GLuint i;
for (i = 0; static_functions[i].Name; i++) {
if (strcmp(static_functions[i].Name, funcName) == 0) {
return static_functions[i].Offset;
}
}
return -1;
}
 
 
/*
* Return dispatch function address the named static (built-in) function.
* Return NULL if function not found.
*/
static GLvoid *
get_static_proc_address(const char *funcName)
{
GLint i;
for (i = 0; static_functions[i].Name; i++) {
if (strcmp(static_functions[i].Name, funcName) == 0) {
return static_functions[i].Address;
}
}
return NULL;
}
 
 
 
/**********************************************************************
* Extension function management.
*/
 
/*
* Number of extension functions which we can dynamically add at runtime.
*/
#define MAX_EXTENSION_FUNCS 300
 
 
/*
* The disptach table size (number of entries) is the sizeof the
* _glapi_table struct plus the number of dynamic entries we can add.
* The extra slots can be filled in by DRI drivers that register new extension
* functions.
*/
#define DISPATCH_TABLE_SIZE (sizeof(struct _glapi_table) / sizeof(void *) + MAX_EXTENSION_FUNCS)
 
 
static struct name_address_offset ExtEntryTable[MAX_EXTENSION_FUNCS];
static GLuint NumExtEntryPoints = 0;
 
#ifdef USE_SPARC_ASM
extern void __glapi_sparc_icache_flush(unsigned int *);
#endif
 
/*
* Generate a dispatch function (entrypoint) which jumps through
* the given slot number (offset) in the current dispatch table.
* We need assembly language in order to accomplish this.
*/
static void *
generate_entrypoint(GLuint functionOffset)
{
#if defined(USE_X86_ASM)
/*
* This x86 code contributed by Josh Vanderhoof.
*
* 0: a1 10 32 54 76 movl __glapi_Dispatch,%eax
* 00 01 02 03 04
* 5: 85 c0 testl %eax,%eax
* 05 06
* 7: 74 06 je f <entrypoint+0xf>
* 07 08
* 9: ff a0 10 32 54 76 jmp *0x76543210(%eax)
* 09 0a 0b 0c 0d 0e
* f: e8 fc ff ff ff call __glapi_get_dispatch
* 0f 10 11 12 13
* 14: ff a0 10 32 54 76 jmp *0x76543210(%eax)
* 14 15 16 17 18 19
*/
static const unsigned char insn_template[] = {
0xa1, 0x00, 0x00, 0x00, 0x00,
0x85, 0xc0,
0x74, 0x06,
0xff, 0xa0, 0x00, 0x00, 0x00, 0x00,
0xe8, 0x00, 0x00, 0x00, 0x00,
0xff, 0xa0, 0x00, 0x00, 0x00, 0x00
};
unsigned char *code = (unsigned char *) malloc(sizeof(insn_template));
unsigned int next_insn;
if (code) {
memcpy(code, insn_template, sizeof(insn_template));
 
*(unsigned int *)(code + 0x01) = (unsigned int)&_glapi_Dispatch;
*(unsigned int *)(code + 0x0b) = (unsigned int)functionOffset * 4;
next_insn = (unsigned int)(code + 0x14);
*(unsigned int *)(code + 0x10) = (unsigned int)_glapi_get_dispatch - next_insn;
*(unsigned int *)(code + 0x16) = (unsigned int)functionOffset * 4;
}
return code;
#elif defined(USE_SPARC_ASM)
 
#ifdef __sparc_v9__
static const unsigned int insn_template[] = {
0x05000000, /* sethi %uhi(_glapi_Dispatch), %g2 */
0x03000000, /* sethi %hi(_glapi_Dispatch), %g1 */
0x8410a000, /* or %g2, %ulo(_glapi_Dispatch), %g2 */
0x82106000, /* or %g1, %lo(_glapi_Dispatch), %g1 */
0x8528b020, /* sllx %g2, 32, %g2 */
0xc2584002, /* ldx [%g1 + %g2], %g1 */
0x05000000, /* sethi %hi(8 * glapioffset), %g2 */
0x8410a000, /* or %g2, %lo(8 * glapioffset), %g2 */
0xc6584002, /* ldx [%g1 + %g2], %g3 */
0x81c0c000, /* jmpl %g3, %g0 */
0x01000000 /* nop */
};
#else
static const unsigned int insn_template[] = {
0x03000000, /* sethi %hi(_glapi_Dispatch), %g1 */
0xc2006000, /* ld [%g1 + %lo(_glapi_Dispatch)], %g1 */
0xc6006000, /* ld [%g1 + %lo(4*glapioffset)], %g3 */
0x81c0c000, /* jmpl %g3, %g0 */
0x01000000 /* nop */
};
#endif
unsigned int *code = (unsigned int *) malloc(sizeof(insn_template));
unsigned long glapi_addr = (unsigned long) &_glapi_Dispatch;
if (code) {
memcpy(code, insn_template, sizeof(insn_template));
 
#ifdef __sparc_v9__
code[0] |= (glapi_addr >> (32 + 10));
code[1] |= ((glapi_addr & 0xffffffff) >> 10);
__glapi_sparc_icache_flush(&code[0]);
code[2] |= ((glapi_addr >> 32) & ((1 << 10) - 1));
code[3] |= (glapi_addr & ((1 << 10) - 1));
__glapi_sparc_icache_flush(&code[2]);
code[6] |= ((functionOffset * 8) >> 10);
code[7] |= ((functionOffset * 8) & ((1 << 10) - 1));
__glapi_sparc_icache_flush(&code[6]);
#else
code[0] |= (glapi_addr >> 10);
code[1] |= (glapi_addr & ((1 << 10) - 1));
__glapi_sparc_icache_flush(&code[0]);
code[2] |= (functionOffset * 4);
__glapi_sparc_icache_flush(&code[2]);
#endif
}
return code;
#else
return NULL;
#endif /* USE_*_ASM */
}
 
 
/*
* This function inserts a new dispatch offset into the assembly language
* stub that was generated with the preceeding function.
*/
static void
fill_in_entrypoint_offset(void *entrypoint, GLuint offset)
{
#if defined(USE_X86_ASM)
 
unsigned char *code = (unsigned char *) entrypoint;
*(unsigned int *)(code + 0x0b) = offset * 4;
*(unsigned int *)(code + 0x16) = offset * 4;
 
#elif defined(USE_SPARC_ASM)
 
/* XXX this hasn't been tested! */
unsigned int *code = (unsigned int *) entrypoint;
#ifdef __sparc_v9__
code[6] = 0x05000000; /* sethi %hi(8 * glapioffset), %g2 */
code[7] = 0x8410a000; /* or %g2, %lo(8 * glapioffset), %g2 */
code[6] |= ((offset * 8) >> 10);
code[7] |= ((offset * 8) & ((1 << 10) - 1));
__glapi_sparc_icache_flush(&code[6]);
#else /* __sparc_v9__ */
code[2] = 0xc6006000; /* ld [%g1 + %lo(4*glapioffset)], %g3 */
code[2] |= (offset * 4);
__glapi_sparc_icache_flush(&code[2]);
#endif /* __sparc_v9__ */
 
#endif /* USE_*_ASM */
}
 
 
/*
* Add a new extension function entrypoint.
* Return: GL_TRUE = success or GL_FALSE = failure
*/
GLboolean
_glapi_add_entrypoint(const char *funcName, GLuint offset)
{
/* trivial rejection test */
if (!funcName || funcName[0] != 'g' || funcName[1] != 'l')
return GL_FALSE;
 
/* first check if the named function is already statically present */
{
GLint index = get_static_proc_offset(funcName);
if (index >= 0) {
return (GLboolean) ((GLuint) index == offset); /* bad offset! */
}
}
 
/* See if this function has already been dynamically added */
{
GLuint i;
for (i = 0; i < NumExtEntryPoints; i++) {
if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
/* function already registered */
if (ExtEntryTable[i].Offset == offset) {
return GL_TRUE; /* offsets match */
}
else if (ExtEntryTable[i].Offset == ~0
&& offset < DISPATCH_TABLE_SIZE) {
/* need to patch-up the dispatch code */
if (offset != ~0) {
fill_in_entrypoint_offset(ExtEntryTable[i].Address, offset);
ExtEntryTable[i].Offset = offset;
}
return GL_TRUE;
}
else {
return GL_FALSE; /* bad offset! */
}
}
}
}
 
/* This is a new function, try to add it. */
if (NumExtEntryPoints >= MAX_EXTENSION_FUNCS ||
offset >= DISPATCH_TABLE_SIZE) {
/* No space left */
return GL_FALSE;
}
else {
void *entrypoint = generate_entrypoint(offset);
if (!entrypoint)
return GL_FALSE; /* couldn't generate assembly */
 
/* OK! */
ExtEntryTable[NumExtEntryPoints].Name = str_dup(funcName);
ExtEntryTable[NumExtEntryPoints].Offset = offset;
ExtEntryTable[NumExtEntryPoints].Address = entrypoint;
NumExtEntryPoints++;
 
return GL_TRUE; /* success */
}
 
/* should never get here, silence compiler warnings */
return GL_FALSE;
}
 
 
/*
* Return offset of entrypoint for named function within dispatch table.
*/
GLint
_glapi_get_proc_offset(const char *funcName)
{
/* search extension functions first */
GLuint i;
for (i = 0; i < NumExtEntryPoints; i++) {
if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
return ExtEntryTable[i].Offset;
}
}
 
/* search static functions */
return get_static_proc_offset(funcName);
}
 
 
 
/*
* Return entrypoint for named function.
*/
const GLvoid *
_glapi_get_proc_address(const char *funcName)
{
/* search extension functions first */
GLuint i;
for (i = 0; i < NumExtEntryPoints; i++) {
if (strcmp(ExtEntryTable[i].Name, funcName) == 0) {
return ExtEntryTable[i].Address;
}
}
 
/* search static functions */
{
const GLvoid *func = get_static_proc_address(funcName);
if (func)
return func;
}
 
/* generate new entrypoint - use a temporary dispatch offset of
* ~0 (i.e. -1). Later, when the driver calls _glapi_add_entrypoint()
* we'll put in the proper offset. If that never happens, and the
* user calls this function, he'll segfault. That's what you get
* when you try calling a GL function that doesn't really exist.
*/
if (NumExtEntryPoints < MAX_EXTENSION_FUNCS) {
GLvoid *entrypoint = generate_entrypoint(~0);
if (!entrypoint)
return GL_FALSE;
 
ExtEntryTable[NumExtEntryPoints].Name = str_dup(funcName);
ExtEntryTable[NumExtEntryPoints].Offset = ~0;
ExtEntryTable[NumExtEntryPoints].Address = entrypoint;
NumExtEntryPoints++;
 
return entrypoint;
}
else {
/* no space for new functions! */
return NULL;
}
}
 
 
 
/*
* Return the name of the function at the given dispatch offset.
* This is only intended for debugging.
*/
const char *
_glapi_get_proc_name(GLuint offset)
{
const GLuint n = sizeof(static_functions) / sizeof(struct name_address_offset);
GLuint i;
 
/* search built-in functions */
for (i = 0; i < n; i++) {
if (static_functions[i].Offset == offset)
return static_functions[i].Name;
}
 
/* search added extension functions */
for (i = 0; i < NumExtEntryPoints; i++) {
if (ExtEntryTable[i].Offset == offset) {
return ExtEntryTable[i].Name;
}
}
return NULL;
}
 
 
 
/*
* Return size of dispatch table struct as number of functions (or
* slots).
*/
GLuint
_glapi_get_dispatch_table_size(void)
{
return DISPATCH_TABLE_SIZE;
}
 
 
 
/*
* Get API dispatcher version string.
*/
const char *
_glapi_get_version(void)
{
return "20021001"; /* YYYYMMDD */
}
 
 
 
/*
* Make sure there are no NULL pointers in the given dispatch table.
* Intended for debugging purposes.
*/
void
_glapi_check_table(const struct _glapi_table *table)
{
#ifdef DEBUG
const GLuint entries = _glapi_get_dispatch_table_size();
const void **tab = (const void **) table;
GLuint i;
for (i = 1; i < entries; i++) {
assert(tab[i]);
}
 
/* Do some spot checks to be sure that the dispatch table
* slots are assigned correctly.
*/
{
GLuint BeginOffset = _glapi_get_proc_offset("glBegin");
char *BeginFunc = (char*) &table->Begin;
GLuint offset = (BeginFunc - (char *) table) / sizeof(void *);
assert(BeginOffset == _gloffset_Begin);
assert(BeginOffset == offset);
}
{
GLuint viewportOffset = _glapi_get_proc_offset("glViewport");
char *viewportFunc = (char*) &table->Viewport;
GLuint offset = (viewportFunc - (char *) table) / sizeof(void *);
assert(viewportOffset == _gloffset_Viewport);
assert(viewportOffset == offset);
}
{
GLuint VertexPointerOffset = _glapi_get_proc_offset("glVertexPointer");
char *VertexPointerFunc = (char*) &table->VertexPointer;
GLuint offset = (VertexPointerFunc - (char *) table) / sizeof(void *);
assert(VertexPointerOffset == _gloffset_VertexPointer);
assert(VertexPointerOffset == offset);
}
{
GLuint ResetMinMaxOffset = _glapi_get_proc_offset("glResetMinmax");
char *ResetMinMaxFunc = (char*) &table->ResetMinmax;
GLuint offset = (ResetMinMaxFunc - (char *) table) / sizeof(void *);
assert(ResetMinMaxOffset == _gloffset_ResetMinmax);
assert(ResetMinMaxOffset == offset);
}
{
GLuint blendColorOffset = _glapi_get_proc_offset("glBlendColor");
char *blendColorFunc = (char*) &table->BlendColor;
GLuint offset = (blendColorFunc - (char *) table) / sizeof(void *);
assert(blendColorOffset == _gloffset_BlendColor);
assert(blendColorOffset == offset);
}
{
GLuint istextureOffset = _glapi_get_proc_offset("glIsTextureEXT");
char *istextureFunc = (char*) &table->IsTextureEXT;
GLuint offset = (istextureFunc - (char *) table) / sizeof(void *);
assert(istextureOffset == _gloffset_IsTextureEXT);
assert(istextureOffset == offset);
}
{
GLuint secondaryColor3fOffset = _glapi_get_proc_offset("glSecondaryColor3fEXT");
char *secondaryColor3fFunc = (char*) &table->SecondaryColor3fEXT;
GLuint offset = (secondaryColor3fFunc - (char *) table) / sizeof(void *);
assert(secondaryColor3fOffset == _gloffset_SecondaryColor3fEXT);
assert(secondaryColor3fOffset == offset);
assert(_glapi_get_proc_address("glSecondaryColor3fEXT") == (void *) &glSecondaryColor3fEXT);
}
{
GLuint pointParameterivOffset = _glapi_get_proc_offset("glPointParameterivNV");
char *pointParameterivFunc = (char*) &table->PointParameterivNV;
GLuint offset = (pointParameterivFunc - (char *) table) / sizeof(void *);
assert(pointParameterivOffset == _gloffset_PointParameterivNV);
assert(pointParameterivOffset == offset);
assert(_glapi_get_proc_address("glPointParameterivNV") == (void *) &glPointParameterivNV);
}
{
GLuint setFenceOffset = _glapi_get_proc_offset("glSetFenceNV");
char *setFenceFunc = (char*) &table->SetFenceNV;
GLuint offset = (setFenceFunc - (char *) table) / sizeof(void *);
assert(setFenceOffset == _gloffset_SetFenceNV);
assert(setFenceOffset == offset);
assert(_glapi_get_proc_address("glSetFenceNV") == (void *) &glSetFenceNV);
}
#endif
}
/shark/trunk/ports/mesa/src/buffers.c
0,0 → 1,476
/* $Id: buffers.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "accum.h"
#include "buffers.h"
#include "colormac.h"
#include "context.h"
#include "depth.h"
#include "enums.h"
#include "macros.h"
#include "stencil.h"
#include "state.h"
#include "mtypes.h"
 
 
 
void
_mesa_ClearIndex( GLfloat c )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Color.ClearIndex == (GLuint) c)
return;
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.ClearIndex = (GLuint) c;
 
if (!ctx->Visual.rgbMode && ctx->Driver.ClearIndex) {
/* it's OK to call glClearIndex in RGBA mode but it should be a NOP */
(*ctx->Driver.ClearIndex)( ctx, ctx->Color.ClearIndex );
}
}
 
 
 
void
_mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
{
GLfloat tmp[4];
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
tmp[0] = CLAMP(red, 0.0F, 1.0F);
tmp[1] = CLAMP(green, 0.0F, 1.0F);
tmp[2] = CLAMP(blue, 0.0F, 1.0F);
tmp[3] = CLAMP(alpha, 0.0F, 1.0F);
 
if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
return; /* no change */
 
FLUSH_VERTICES(ctx, _NEW_COLOR);
COPY_4V(ctx->Color.ClearColor, tmp);
 
if (ctx->Visual.rgbMode && ctx->Driver.ClearColor) {
/* it's OK to call glClearColor in CI mode but it should be a NOP */
(*ctx->Driver.ClearColor)(ctx, ctx->Color.ClearColor);
}
}
 
 
 
void
_mesa_Clear( GLbitfield mask )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glClear 0x%x\n", mask);
 
if (mask & ~(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT |
GL_ACCUM_BUFFER_BIT)) {
/* invalid bit set */
_mesa_error( ctx, GL_INVALID_VALUE, "glClear(mask)");
return;
}
 
if (ctx->NewState) {
_mesa_update_state( ctx ); /* update _Xmin, etc */
}
 
if (ctx->RenderMode==GL_RENDER) {
const GLint x = ctx->DrawBuffer->_Xmin;
const GLint y = ctx->DrawBuffer->_Ymin;
const GLint height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
const GLint width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
GLbitfield ddMask;
 
/* don't clear depth buffer if depth writing disabled */
if (!ctx->Depth.Mask)
mask &= ~GL_DEPTH_BUFFER_BIT;
 
/* Build bitmask to send to driver Clear function */
ddMask = mask & (GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT |
GL_ACCUM_BUFFER_BIT);
if (mask & GL_COLOR_BUFFER_BIT) {
ddMask |= ctx->Color._DrawDestMask;
}
 
ASSERT(ctx->Driver.Clear);
ctx->Driver.Clear( ctx, ddMask, (GLboolean) !ctx->Scissor.Enabled,
x, y, width, height );
}
}
 
 
void
_mesa_DrawBuffer( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex... */
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glDrawBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
 
/*
* Do error checking and compute the _DrawDestMask bitfield.
*/
switch (mode) {
case GL_RIGHT:
if (!ctx->Visual.stereoMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;}
if (ctx->Visual.doubleBufferMode)
ctx->Color._DrawDestMask = FRONT_RIGHT_BIT | BACK_RIGHT_BIT;
else
ctx->Color._DrawDestMask = FRONT_RIGHT_BIT;
break;
case GL_FRONT_RIGHT:
if (!ctx->Visual.stereoMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;
}
ctx->Color._DrawDestMask = FRONT_RIGHT_BIT;
break;
case GL_BACK_RIGHT:
if (!ctx->Visual.stereoMode || !ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;
}
ctx->Color._DrawDestMask = BACK_RIGHT_BIT;
break;
case GL_BACK_LEFT:
if (!ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;
}
ctx->Color._DrawDestMask = BACK_LEFT_BIT;
break;
case GL_FRONT_AND_BACK:
if (!ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;
}
if (ctx->Visual.stereoMode)
ctx->Color._DrawDestMask = FRONT_LEFT_BIT | BACK_LEFT_BIT
| FRONT_RIGHT_BIT | BACK_RIGHT_BIT;
else
ctx->Color._DrawDestMask = FRONT_LEFT_BIT | BACK_LEFT_BIT;
break;
case GL_BACK:
if (!ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer" );
return;
}
if (ctx->Visual.stereoMode)
ctx->Color._DrawDestMask = BACK_LEFT_BIT | BACK_RIGHT_BIT;
else
ctx->Color._DrawDestMask = BACK_LEFT_BIT;
break;
case GL_LEFT:
/* never an error */
if (ctx->Visual.doubleBufferMode)
ctx->Color._DrawDestMask = FRONT_LEFT_BIT | BACK_LEFT_BIT;
else
ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
break;
case GL_FRONT_LEFT:
/* never an error */
ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
break;
case GL_FRONT:
/* never an error */
if (ctx->Visual.stereoMode)
ctx->Color._DrawDestMask = FRONT_LEFT_BIT | FRONT_RIGHT_BIT;
else
ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
break;
case GL_NONE:
/* never an error */
ctx->Color._DrawDestMask = 0;
break;
case GL_AUX0:
if (ctx->Const.NumAuxBuffers >= 1) {
ctx->Color._DrawDestMask = AUX0_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer(GL_AUX0)" );
return;
}
break;
case GL_AUX1:
if (ctx->Const.NumAuxBuffers >= 2) {
ctx->Color._DrawDestMask = AUX1_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer(GL_AUX1)" );
return;
}
break;
case GL_AUX2:
if (ctx->Const.NumAuxBuffers >= 3) {
ctx->Color._DrawDestMask = AUX2_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer(GL_AUX2)" );
return;
}
break;
case GL_AUX3:
if (ctx->Const.NumAuxBuffers >= 4) {
ctx->Color._DrawDestMask = AUX3_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glDrawBuffer(GL_AUX3)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glDrawBuffer" );
return;
}
 
ctx->Color.DrawBuffer = mode;
ctx->NewState |= _NEW_COLOR;
 
/*
* Call device driver function.
*/
if (ctx->Driver.DrawBuffer)
(*ctx->Driver.DrawBuffer)(ctx, mode);
}
 
 
 
void
_mesa_ReadBuffer( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
 
/*
* Do error checking and compute ctx->Pixel._ReadSrcMask.
*/
switch (mode) {
case GL_LEFT:
case GL_FRONT:
case GL_FRONT_LEFT:
/* Front-Left buffer, always exists */
ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
break;
case GL_BACK:
case GL_BACK_LEFT:
/* Back-Left buffer, requires double buffering */
if (!ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer" );
return;
}
ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
break;
case GL_FRONT_RIGHT:
case GL_RIGHT:
if (!ctx->Visual.stereoMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer" );
return;
}
ctx->Pixel._ReadSrcMask = FRONT_RIGHT_BIT;
break;
case GL_BACK_RIGHT:
if (!ctx->Visual.stereoMode || !ctx->Visual.doubleBufferMode) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer" );
return;
}
ctx->Pixel._ReadSrcMask = BACK_RIGHT_BIT;
break;
case GL_AUX0:
if (ctx->Const.NumAuxBuffers >= 1) {
ctx->Pixel._ReadSrcMask = AUX0_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer(GL_AUX0)" );
return;
}
break;
case GL_AUX1:
if (ctx->Const.NumAuxBuffers >= 2) {
ctx->Pixel._ReadSrcMask = AUX1_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer(GL_AUX1)" );
return;
}
break;
case GL_AUX2:
if (ctx->Const.NumAuxBuffers >= 3) {
ctx->Pixel._ReadSrcMask = AUX2_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer(GL_AUX2)" );
return;
}
break;
case GL_AUX3:
if (ctx->Const.NumAuxBuffers >= 4) {
ctx->Pixel._ReadSrcMask = AUX3_BIT;
}
else {
_mesa_error( ctx, GL_INVALID_OPERATION, "glReadBuffer(GL_AUX3)" );
return;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glReadBuffer" );
return;
}
 
ctx->Pixel.ReadBuffer = mode;
ctx->NewState |= _NEW_PIXEL;
 
/*
* Call device driver function.
*/
if (ctx->Driver.ReadBuffer)
(*ctx->Driver.ReadBuffer)(ctx, mode);
}
 
 
/*
* GL_MESA_resize_buffers extension
* When this function is called, we'll ask the window system how large
* the current window is. If it's not what we expect, we'll have to
* resize/reallocate the software accum/stencil/depth/alpha buffers.
*/
void
_mesa_ResizeBuffersMESA( void )
{
GLcontext *ctx = _mesa_get_current_context();
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glResizeBuffersMESA\n");
 
if (ctx) {
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx );
 
if (ctx->DrawBuffer) {
GLuint buf_width, buf_height;
GLframebuffer *buffer = ctx->DrawBuffer;
 
/* ask device driver for size of output buffer */
(*ctx->Driver.GetBufferSize)( buffer, &buf_width, &buf_height );
 
/* see if size of device driver's color buffer (window) has changed */
if (buffer->Width == buf_width && buffer->Height == buf_height)
return; /* size is as expected */
 
buffer->Width = buf_width;
buffer->Height = buf_height;
 
ctx->Driver.ResizeBuffers( buffer );
}
 
if (ctx->ReadBuffer && ctx->ReadBuffer != ctx->DrawBuffer) {
GLuint buf_width, buf_height;
GLframebuffer *buffer = ctx->DrawBuffer;
 
/* ask device driver for size of output buffer */
(*ctx->Driver.GetBufferSize)( buffer, &buf_width, &buf_height );
 
/* see if size of device driver's color buffer (window) has changed */
if (buffer->Width == buf_width && buffer->Height == buf_height)
return; /* size is as expected */
 
buffer->Width = buf_width;
buffer->Height = buf_height;
 
ctx->Driver.ResizeBuffers( buffer );
}
 
ctx->NewState |= _NEW_BUFFERS; /* to update scissor / window bounds */
}
}
 
 
void
_mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glScissor" );
return;
}
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glScissor %d %d %d %d\n", x, y, width, height);
 
if (x == ctx->Scissor.X &&
y == ctx->Scissor.Y &&
width == ctx->Scissor.Width &&
height == ctx->Scissor.Height)
return;
 
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
ctx->Scissor.X = x;
ctx->Scissor.Y = y;
ctx->Scissor.Width = width;
ctx->Scissor.Height = height;
 
if (ctx->Driver.Scissor)
ctx->Driver.Scissor( ctx, x, y, width, height );
}
 
 
/*
* XXX move somewhere else someday?
*/
void
_mesa_SampleCoverageARB(GLclampf value, GLboolean invert)
{
GLcontext *ctx = _mesa_get_current_context();
 
if (!ctx->Extensions.ARB_multisample) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glSampleCoverageARB");
return;
}
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx );
ctx->Multisample.SampleCoverageValue = (GLfloat) CLAMP(value, 0.0, 1.0);
ctx->Multisample.SampleCoverageInvert = invert;
ctx->NewState |= _NEW_MULTISAMPLE;
}
/shark/trunk/ports/mesa/src/imports.c
0,0 → 1,665
/* $Id: imports.c,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Imports are services which the device driver or window system or
* operating system provides to the core renderer. The core renderer (Mesa)
* will call these functions in order to do memory allocation, simple I/O,
* etc.
*
* Some drivers will want to override/replace this file with something
* specialized, but that'll be rare.
*
* Eventually, I want to move roll the glheader.h file into this.
*
* The OpenGL SI's __GLimports structure allows per-context specification of
* replacements for the standard C lib functions. In practice that's probably
* never needed; compile-time replacements are far more likely.
*
* The _mesa_foo() functions defined here don't in general take a context
* parameter. I guess we can change that someday, if need be.
* So for now, the __GLimports stuff really isn't used.
*/
 
 
#include "glheader.h"
#include "mtypes.h"
#include "context.h"
#include "imports.h"
 
 
#define MAXSTRING 4000 /* for vsnprintf() */
 
#ifdef WIN32
#define vsnprintf _vsnprintf
#endif
 
 
/**********************************************************************/
/* Wrappers for standard C library functions */
/**********************************************************************/
 
/*
* Functions still needed:
* scanf
* qsort
* bsearch
* rand and RAND_MAX
*/
 
void *
_mesa_malloc(size_t bytes)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86malloc(bytes);
#else
return malloc(bytes);
#endif
}
 
 
void *
_mesa_calloc(size_t bytes)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86calloc(1, bytes);
#else
return calloc(1, bytes);
#endif
}
 
 
void
_mesa_free(void *ptr)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86free(ptr);
#else
free(ptr);
#endif
}
 
 
void *
_mesa_align_malloc(size_t bytes, unsigned long alignment)
{
unsigned long ptr, buf;
 
ASSERT( alignment > 0 );
 
/* Allocate extra memory to accomodate rounding up the address for
* alignment and to record the real malloc address.
*/
ptr = (unsigned long) _mesa_malloc(bytes + alignment + sizeof(void *));
if (!ptr)
return NULL;
 
buf = (ptr + alignment + sizeof(void *)) & ~(unsigned long)(alignment - 1);
*(unsigned long *)(buf - sizeof(void *)) = ptr;
 
#ifdef DEBUG
/* mark the non-aligned area */
while ( ptr < buf - sizeof(void *) ) {
*(unsigned long *)ptr = 0xcdcdcdcd;
ptr += sizeof(unsigned long);
}
#endif
 
return (void *) buf;
}
 
 
void *
_mesa_align_calloc(size_t bytes, unsigned long alignment)
{
unsigned long ptr, buf;
 
ASSERT( alignment > 0 );
 
ptr = (unsigned long) _mesa_calloc(bytes + alignment + sizeof(void *));
if (!ptr)
return NULL;
 
buf = (ptr + alignment + sizeof(void *)) & ~(unsigned long)(alignment - 1);
*(unsigned long *)(buf - sizeof(void *)) = ptr;
 
#ifdef DEBUG
/* mark the non-aligned area */
while ( ptr < buf - sizeof(void *) ) {
*(unsigned long *)ptr = 0xcdcdcdcd;
ptr += sizeof(unsigned long);
}
#endif
 
return (void *)buf;
}
 
 
void
_mesa_align_free(void *ptr)
{
#if 0
_mesa_free( (void *)(*(unsigned long *)((unsigned long)ptr - sizeof(void *))) );
#else
/* The actuall address to free is stuffed in the word immediately
* before the address the client sees.
*/
void **cubbyHole = (void **) ((char *) ptr - sizeof(void *));
void *realAddr = *cubbyHole;
_mesa_free(realAddr);
#endif
}
 
 
void *
_mesa_memcpy(void *dest, const void *src, size_t n)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86memcpy(dest, src, n);
#elif defined(SUNOS4)
return memcpy((char *) dest, (char *) src, (int) n);
#else
return memcpy(dest, src, n);
#endif
}
 
 
void
_mesa_memset( void *dst, int val, size_t n )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86memset( dst, val, n );
#elif defined(SUNOS4)
memset( (char *) dst, (int) val, (int) n );
#else
memset(dst, val, n);
#endif
}
 
 
void
_mesa_memset16( unsigned short *dst, unsigned short val, size_t n )
{
while (n-- > 0)
*dst++ = val;
}
 
 
void
_mesa_bzero( void *dst, size_t n )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86memset( dst, 0, n );
#elif defined(__FreeBSD__)
bzero( dst, n );
#else
memset( dst, 0, n );
#endif
}
 
 
double
_mesa_sin(double a)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86sin(a);
#else
return sin(a);
#endif
}
 
 
double
_mesa_cos(double a)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86cos(a);
#else
return cos(a);
#endif
}
 
 
double
_mesa_sqrt(double x)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86sqrt(x);
#else
return sqrt(x);
#endif
}
 
 
double
_mesa_pow(double x, double y)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86pow(x, y);
#else
return pow(x, y);
#endif
}
 
 
char *
_mesa_getenv( const char *var )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86getenv(var);
#else
return getenv(var);
#endif
}
 
 
char *
_mesa_strstr( const char *haystack, const char *needle )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strstr(haystack, needle);
#else
return strstr(haystack, needle);
#endif
}
 
 
char *
_mesa_strncat( char *dest, const char *src, size_t n )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strncat(dest, src, n);
#else
return strncat(dest, src, n);
#endif
}
 
 
char *
_mesa_strcpy( char *dest, const char *src )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strcpy(dest, src);
#else
return strcpy(dest, src);
#endif
}
 
 
char *
_mesa_strncpy( char *dest, const char *src, size_t n )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strncpy(dest, src, n);
#else
return strncpy(dest, src, n);
#endif
}
 
 
size_t
_mesa_strlen( const char *s )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strlen(s);
#else
return strlen(s);
#endif
}
 
 
int
_mesa_strcmp( const char *s1, const char *s2 )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strcmp(s1, s2);
#else
return strcmp(s1, s2);
#endif
}
 
 
int
_mesa_strncmp( const char *s1, const char *s2, size_t n )
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86strncmp(s1, s2, n);
#else
return strncmp(s1, s2, n);
#endif
}
 
 
int
_mesa_atoi(const char *s)
{
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86atoi(s);
#else
return atoi(s);
#endif
}
 
 
int
_mesa_sprintf( char *str, const char *fmt, ... )
{
int r;
va_list args;
va_start( args, fmt );
va_end( args );
#if defined(XFree86LOADER) && defined(IN_MODULE)
r = xf86vsprintf( str, fmt, args );
#else
r = vsprintf( str, fmt, args );
#endif
return r;
}
 
 
void
_mesa_printf( const char *fmtString, ... )
{
char s[MAXSTRING];
va_list args;
va_start( args, fmtString );
vsnprintf(s, MAXSTRING, fmtString, args);
va_end( args );
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86printf("%s", s);
#else
printf("%s", s);
#endif
}
 
 
void
_mesa_warning( GLcontext *ctx, const char *fmtString, ... )
{
GLboolean debug;
char str[MAXSTRING];
va_list args;
(void) ctx;
va_start( args, fmtString );
(void) vsnprintf( str, MAXSTRING, fmtString, args );
va_end( args );
#ifdef DEBUG
debug = GL_TRUE; /* always print warning */
#else
debug = _mesa_getenv("MESA_DEBUG") ? GL_TRUE : GL_FALSE;
#endif
if (debug) {
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86fprintf(stderr, "Mesa warning: %s\n", str);
#else
fprintf(stderr, "Mesa warning: %s\n", str);
#endif
}
}
 
 
/*
* This function is called when the Mesa user has stumbled into a code
* path which may not be implemented fully or correctly.
*/
void
_mesa_problem( const GLcontext *ctx, const char *s )
{
(void) ctx;
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86fprintf(stderr, "Mesa implementation error: %s\n", s);
xf86fprintf(stderr, "Please report to the DRI project at dri.sourceforge.net\n");
#else
fprintf(stderr, "Mesa implementation error: %s\n", s);
fprintf(stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
#endif
}
 
 
/*
* If in debug mode, print error message to stdout.
* Also, record the error code by calling _mesa_record_error().
* Input: ctx - the GL context
* error - the error value
* fmtString - printf-style format string, followed by optional args
*/
void
_mesa_error( GLcontext *ctx, GLenum error, const char *fmtString, ... )
{
const char *debugEnv;
GLboolean debug;
 
debugEnv = _mesa_getenv("MESA_DEBUG");
 
#ifdef DEBUG
if (debugEnv && _mesa_strstr(debugEnv, "silent"))
debug = GL_FALSE;
else
debug = GL_TRUE;
#else
if (debugEnv)
debug = GL_TRUE;
else
debug = GL_FALSE;
#endif
 
if (debug) {
va_list args;
char where[MAXSTRING];
const char *errstr;
 
va_start( args, fmtString );
vsnprintf( where, MAXSTRING, fmtString, args );
va_end( args );
 
switch (error) {
case GL_NO_ERROR:
errstr = "GL_NO_ERROR";
break;
case GL_INVALID_VALUE:
errstr = "GL_INVALID_VALUE";
break;
case GL_INVALID_ENUM:
errstr = "GL_INVALID_ENUM";
break;
case GL_INVALID_OPERATION:
errstr = "GL_INVALID_OPERATION";
break;
case GL_STACK_OVERFLOW:
errstr = "GL_STACK_OVERFLOW";
break;
case GL_STACK_UNDERFLOW:
errstr = "GL_STACK_UNDERFLOW";
break;
case GL_OUT_OF_MEMORY:
errstr = "GL_OUT_OF_MEMORY";
break;
case GL_TABLE_TOO_LARGE:
errstr = "GL_TABLE_TOO_LARGE";
break;
default:
errstr = "unknown";
break;
}
_mesa_debug(ctx, "Mesa user error: %s in %s\n", errstr, where);
}
 
_mesa_record_error(ctx, error);
}
 
 
/*
* Call this to report debug information. Uses stderr.
*/
void
_mesa_debug( const GLcontext *ctx, const char *fmtString, ... )
{
char s[MAXSTRING];
va_list args;
va_start(args, fmtString);
vsnprintf(s, MAXSTRING, fmtString, args);
va_end(args);
#if defined(XFree86LOADER) && defined(IN_MODULE)
xf86fprintf(stderr, "Mesa: %s", s);
#else
fprintf(stderr, "Mesa: %s", s);
#endif
}
 
 
 
/**********************************************************************/
/* Default Imports Wrapper */
/**********************************************************************/
 
static void *
default_malloc(__GLcontext *gc, size_t size)
{
(void) gc;
return _mesa_malloc(size);
}
 
static void *
default_calloc(__GLcontext *gc, size_t numElem, size_t elemSize)
{
(void) gc;
return _mesa_calloc(numElem * elemSize);
}
 
static void *
default_realloc(__GLcontext *gc, void *oldAddr, size_t newSize)
{
(void) gc;
#if defined(XFree86LOADER) && defined(IN_MODULE)
return xf86realloc(oldAddr, newSize);
#else
return realloc(oldAddr, newSize);
#endif
}
 
static void
default_free(__GLcontext *gc, void *addr)
{
(void) gc;
_mesa_free(addr);
}
 
static char * CAPI
default_getenv( __GLcontext *gc, const char *var )
{
(void) gc;
return _mesa_getenv(var);
}
 
static void
default_warning(__GLcontext *gc, char *str)
{
_mesa_warning(gc, str);
}
 
static void
default_fatal(__GLcontext *gc, char *str)
{
_mesa_problem(gc, str);
abort();
}
 
static int CAPI
default_atoi(__GLcontext *gc, const char *str)
{
(void) gc;
return atoi(str);
}
 
static int CAPI
default_sprintf(__GLcontext *gc, char *str, const char *fmt, ...)
{
int r;
va_list args;
va_start( args, fmt );
r = vsprintf( str, fmt, args );
va_end( args );
return r;
}
 
static void * CAPI
default_fopen(__GLcontext *gc, const char *path, const char *mode)
{
return fopen(path, mode);
}
 
static int CAPI
default_fclose(__GLcontext *gc, void *stream)
{
return fclose((FILE *) stream);
}
 
static int CAPI
default_fprintf(__GLcontext *gc, void *stream, const char *fmt, ...)
{
int r;
va_list args;
va_start( args, fmt );
r = vfprintf( (FILE *) stream, fmt, args );
va_end( args );
return r;
}
 
/* XXX this really is driver-specific and can't be here */
static __GLdrawablePrivate *
default_GetDrawablePrivate(__GLcontext *gc)
{
return NULL;
}
 
 
 
 
/*
* Initialize a __GLimports object to point to the functions in
* this file. This is to be called from device drivers.
* Input: imports - the object to init
* driverCtx - pointer to device driver-specific data
*/
void
_mesa_init_default_imports(__GLimports *imports, void *driverCtx)
{
imports->malloc = default_malloc;
imports->calloc = default_calloc;
imports->realloc = default_realloc;
imports->free = default_free;
imports->warning = default_warning;
imports->fatal = default_fatal;
imports->getenv = default_getenv; /* not used for now */
imports->atoi = default_atoi;
imports->sprintf = default_sprintf;
imports->fopen = default_fopen;
imports->fclose = default_fclose;
imports->fprintf = default_fprintf;
imports->getDrawablePrivate = default_GetDrawablePrivate;
imports->other = driverCtx;
}
/shark/trunk/ports/mesa/src/texformat_tmp.h
0,0 → 1,461
/* $Id: texformat_tmp.h,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes
* Brian Paul
*/
 
 
/*
* This template file generates texel fetch functions for 1-D, 2-D and 3-D
* texture images.
*/
 
 
#if DIM == 1
 
#define CHAN_SRC( t, i, j, k, sz ) \
((GLchan *)(t)->Data + (i) * (sz))
#define UBYTE_SRC( t, i, j, k, sz ) \
((GLubyte *)(t)->Data + (i) * (sz))
#define USHORT_SRC( t, i, j, k ) \
((GLushort *)(t)->Data + (i))
#define FLOAT_SRC( t, i, j, k ) \
((GLfloat *)(t)->Data + (i))
 
#define FETCH(x) fetch_1d_texel_##x
 
#elif DIM == 2
 
#define CHAN_SRC( t, i, j, k, sz ) \
((GLchan *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
#define UBYTE_SRC( t, i, j, k, sz ) \
((GLubyte *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
#define USHORT_SRC( t, i, j, k ) \
((GLushort *)(t)->Data + ((t)->RowStride * (j) + (i)))
#define FLOAT_SRC( t, i, j, k ) \
((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i)))
 
#define FETCH(x) fetch_2d_texel_##x
 
#elif DIM == 3
 
#define CHAN_SRC( t, i, j, k, sz ) \
(GLchan *)(t)->Data + (((t)->Height * (k) + (j)) * \
(t)->RowStride + (i)) * (sz)
#define UBYTE_SRC( t, i, j, k, sz ) \
((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) * \
(t)->RowStride + (i)) * (sz))
#define USHORT_SRC( t, i, j, k ) \
((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) * \
(t)->RowStride + (i)))
#define FLOAT_SRC( t, i, j, k ) \
((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) * \
(t)->RowStride + (i)))
 
#define FETCH(x) fetch_3d_texel_##x
 
#else
#error illegal number of texture dimensions
#endif
 
 
static void FETCH(rgba)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 4 );
GLchan *rgba = (GLchan *) texel;
COPY_CHAN4( rgba, src );
}
 
static void FETCH(rgb)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 3 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = src[0];
rgba[GCOMP] = src[1];
rgba[BCOMP] = src[2];
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(alpha)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = 0;
rgba[GCOMP] = 0;
rgba[BCOMP] = 0;
rgba[ACOMP] = src[0];
}
 
static void FETCH(luminance)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = src[0];
rgba[GCOMP] = src[0];
rgba[BCOMP] = src[0];
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(luminance_alpha)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 2 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = src[0];
rgba[GCOMP] = src[0];
rgba[BCOMP] = src[0];
rgba[ACOMP] = src[1];
}
 
static void FETCH(intensity)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = src[0];
rgba[GCOMP] = src[0];
rgba[BCOMP] = src[0];
rgba[ACOMP] = src[0];
}
 
static void FETCH(color_index)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
GLchan *index = (GLchan *) texel;
*index = *src;
}
 
static void FETCH(depth_component)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLfloat *src = FLOAT_SRC( texImage, i, j, k );
GLfloat *depth = (GLfloat *) texel;
*depth = *src;
}
 
static void FETCH(rgba8888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[3] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
}
 
static void FETCH(argb8888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[3] );
}
 
static void FETCH(rgb888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(rgb565)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(argb4444)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
}
 
static void FETCH(argb1555)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f );
rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
}
 
static void FETCH(al88)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[1] );
}
 
static void FETCH(rgb332)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
const GLubyte s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(a8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = 0;
rgba[GCOMP] = 0;
rgba[BCOMP] = 0;
rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
}
 
static void FETCH(l8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(i8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
}
 
static void FETCH(ci8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
GLchan *index = (GLchan *) texel;
*index = UBYTE_TO_CHAN( *src );
}
 
/* XXX this may break if GLchan != GLubyte */
static void FETCH(ycbcr)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
const GLubyte cb = *src0 & 0xff; /* chroma U */
const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
const GLubyte cr = *src1 & 0xff; /* chroma V */
GLchan *rgba = (GLchan *) texel;
GLint r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
}
rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX);
rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX);
rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX);
rgba[ACOMP] = CHAN_MAX;
}
 
/* XXX this may break if GLchan != GLubyte */
static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
const GLushort *src1 = src0 + 1; /* odd */
const GLubyte y0 = *src0 & 0xff; /* luminance */
const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma U */
const GLubyte y1 = *src1 & 0xff; /* luminance */
const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma V */
GLchan *rgba = (GLchan *) texel;
GLint r, g, b;
if (i & 1) {
/* odd pixel: use y1,cr,cb */
r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
}
else {
/* even pixel: use y0,cr,cb */
r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
}
rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX);
rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX);
rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX);
rgba[ACOMP] = CHAN_MAX;
}
 
 
/* big-endian */
 
#if 0
static void FETCH(abgr8888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[3] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
}
 
static void FETCH(bgra8888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[3] );
}
 
static void FETCH(bgr888)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(bgr565)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
rgba[ACOMP] = CHAN_MAX;
}
 
static void FETCH(bgra4444)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
}
 
static void FETCH(bgra5551)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLushort *src = USHORT_SRC( texImage, i, j, k );
const GLushort s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f );
rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
}
 
static void FETCH(la88)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
rgba[ACOMP] = UBYTE_TO_CHAN( src[1] );
}
 
static void FETCH(bgr233)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
const GLubyte s = *src;
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 );
rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
rgba[ACOMP] = CHAN_MAX;
}
#endif
 
 
#undef CHAN_SRC
#undef UBYTE_SRC
#undef USHORT_SRC
#undef FLOAT_SRC
#undef FETCH
#undef DIM
/shark/trunk/ports/mesa/src/vpexec.h
0,0 → 1,45
/* $Id: vpexec.h,v 1.1 2003-02-28 11:42:06 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Brian Paul
*/
 
#ifndef VPEXEC_H
#define VPEXEC_H
 
extern void
_mesa_init_vp_registers(GLcontext *ctx);
 
extern void
_mesa_init_tracked_matrices(GLcontext *ctx);
 
extern void
_mesa_exec_program(GLcontext *ctx, const struct vp_program *program);
 
extern void
_mesa_dump_vp_machine( const struct vp_machine *machine );
 
#endif
/shark/trunk/ports/mesa/src/rastpos.h
0,0 → 1,185
/* $Id: rastpos.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef RASTPOS_H
#define RASTPOS_H
 
 
#include "glheader.h"
 
 
extern void
_mesa_RasterPos2d(GLdouble x, GLdouble y);
 
extern void
_mesa_RasterPos2f(GLfloat x, GLfloat y);
 
extern void
_mesa_RasterPos2i(GLint x, GLint y);
 
extern void
_mesa_RasterPos2s(GLshort x, GLshort y);
 
extern void
_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z);
 
extern void
_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z);
 
extern void
_mesa_RasterPos3i(GLint x, GLint y, GLint z);
 
extern void
_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z);
 
extern void
_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
 
extern void
_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
 
extern void
_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w);
 
extern void
_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w);
 
extern void
_mesa_RasterPos2dv(const GLdouble *v);
 
extern void
_mesa_RasterPos2fv(const GLfloat *v);
 
extern void
_mesa_RasterPos2iv(const GLint *v);
 
extern void
_mesa_RasterPos2sv(const GLshort *v);
 
extern void
_mesa_RasterPos3dv(const GLdouble *v);
 
extern void
_mesa_RasterPos3fv(const GLfloat *v);
 
extern void
_mesa_RasterPos3iv(const GLint *v);
 
extern void
_mesa_RasterPos3sv(const GLshort *v);
 
extern void
_mesa_RasterPos4dv(const GLdouble *v);
 
extern void
_mesa_RasterPos4fv(const GLfloat *v);
 
extern void
_mesa_RasterPos4iv(const GLint *v);
 
extern void
_mesa_RasterPos4sv(const GLshort *v);
 
 
/**********************************************************************/
/*** GL_MESA_window_pos ***/
/**********************************************************************/
 
extern void
_mesa_WindowPos2dMESA(GLdouble x, GLdouble y);
 
extern void
_mesa_WindowPos2fMESA(GLfloat x, GLfloat y);
 
extern void
_mesa_WindowPos2iMESA(GLint x, GLint y);
 
extern void
_mesa_WindowPos2sMESA(GLshort x, GLshort y);
 
extern void
_mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z);
 
extern void
_mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z);
 
extern void
_mesa_WindowPos3iMESA(GLint x, GLint y, GLint z);
 
extern void
_mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z);
 
extern void
_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
 
extern void
_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
 
extern void
_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w);
 
extern void
_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w);
 
extern void
_mesa_WindowPos2dvMESA(const GLdouble *v);
 
extern void
_mesa_WindowPos2fvMESA(const GLfloat *v);
 
extern void
_mesa_WindowPos2ivMESA(const GLint *v);
 
extern void
_mesa_WindowPos2svMESA(const GLshort *v);
 
extern void
_mesa_WindowPos3dvMESA(const GLdouble *v);
 
extern void
_mesa_WindowPos3fvMESA(const GLfloat *v);
 
extern void
_mesa_WindowPos3ivMESA(const GLint *v);
 
extern void
_mesa_WindowPos3svMESA(const GLshort *v);
 
extern void
_mesa_WindowPos4dvMESA(const GLdouble *v);
 
extern void
_mesa_WindowPos4fvMESA(const GLfloat *v);
 
extern void
_mesa_WindowPos4ivMESA(const GLint *v);
 
extern void
_mesa_WindowPos4svMESA(const GLshort *v);
 
 
#endif
/shark/trunk/ports/mesa/src/texobj.h
0,0 → 1,90
/* $Id: texobj.h,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef TEXTOBJ_H
#define TEXTOBJ_H
 
 
#include "mtypes.h"
 
 
 
/*
* Internal functions
*/
 
extern struct gl_texture_object *
_mesa_alloc_texture_object( struct gl_shared_state *shared, GLuint name,
GLenum target );
 
 
extern void
_mesa_free_texture_object( struct gl_shared_state *shared,
struct gl_texture_object *t );
 
 
extern void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src );
 
 
extern void
_mesa_test_texobj_completeness( const GLcontext *ctx,
struct gl_texture_object *t );
 
 
/*
* API functions
*/
 
extern void
_mesa_GenTextures( GLsizei n, GLuint *textures );
 
 
extern void
_mesa_DeleteTextures( GLsizei n, const GLuint *textures );
 
 
extern void
_mesa_BindTexture( GLenum target, GLuint texture );
 
 
extern void
_mesa_PrioritizeTextures( GLsizei n, const GLuint *textures,
const GLclampf *priorities );
 
 
extern GLboolean
_mesa_AreTexturesResident( GLsizei n, const GLuint *textures,
GLboolean *residences );
 
 
extern GLboolean
_mesa_IsTexture( GLuint texture );
 
 
#endif
/shark/trunk/ports/mesa/src/buffers.h
0,0 → 1,61
/* $Id: buffers.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef BUFFERS_H
#define BUFFERS_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_ClearIndex( GLfloat c );
 
extern void
_mesa_ClearColor( GLclampf red, GLclampf green,
GLclampf blue, GLclampf alpha );
 
extern void
_mesa_Clear( GLbitfield mask );
 
extern void
_mesa_DrawBuffer( GLenum mode );
 
extern void
_mesa_ReadBuffer( GLenum mode );
 
extern void
_mesa_ResizeBuffersMESA( void );
 
extern void
_mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height );
 
extern void
_mesa_SampleCoverageARB(GLclampf value, GLboolean invert);
 
 
#endif
/shark/trunk/ports/mesa/src/glapi.h
0,0 → 1,110
/* $Id: glapi.h,v 1.1 2003-02-28 11:42:01 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef _GLAPI_H
#define _GLAPI_H
 
 
#include "GL/gl.h"
 
struct _glapi_table;
 
typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...);
 
 
extern void *_glapi_Context;
 
extern struct _glapi_table *_glapi_Dispatch;
 
 
extern void
_glapi_noop_enable_warnings(GLboolean enable);
 
extern void
_glapi_set_warning_func(_glapi_warning_func func);
 
extern void
_glapi_check_multithread(void);
 
 
extern void
_glapi_set_context(void *context);
 
 
extern void *
_glapi_get_context(void);
 
 
extern void
_glapi_set_dispatch(struct _glapi_table *dispatch);
 
 
extern struct _glapi_table *
_glapi_get_dispatch(void);
 
 
extern int
_glapi_begin_dispatch_override(struct _glapi_table *override);
 
 
extern void
_glapi_end_dispatch_override(int layer);
 
 
struct _glapi_table *
_glapi_get_override_dispatch(int layer);
 
 
extern GLuint
_glapi_get_dispatch_table_size(void);
 
 
extern const char *
_glapi_get_version(void);
 
 
extern void
_glapi_check_table(const struct _glapi_table *table);
 
 
extern GLboolean
_glapi_add_entrypoint(const char *funcName, GLuint offset);
 
 
extern GLint
_glapi_get_proc_offset(const char *funcName);
 
 
extern const GLvoid *
_glapi_get_proc_address(const char *funcName);
 
 
extern const char *
_glapi_get_proc_name(GLuint offset);
 
 
#endif
/shark/trunk/ports/mesa/src/imports.h
0,0 → 1,194
/* $Id: imports.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* This file provides wrappers for all the standard C library functions
* like malloc, free, printf, getenv, etc.
*/
 
 
#ifndef IMPORTS_H
#define IMPORTS_H
 
 
#define MALLOC(BYTES) _mesa_malloc(BYTES)
#define CALLOC(BYTES) _mesa_calloc(BYTES)
#define MALLOC_STRUCT(T) (struct T *) _mesa_malloc(sizeof(struct T))
#define CALLOC_STRUCT(T) (struct T *) _mesa_calloc(sizeof(struct T))
#define FREE(PTR) _mesa_free(PTR)
 
#define ALIGN_MALLOC(BYTES, N) _mesa_align_malloc(BYTES, N)
#define ALIGN_CALLOC(BYTES, N) _mesa_align_calloc(BYTES, N)
#define ALIGN_MALLOC_STRUCT(T, N) (struct T *) _mesa_align_malloc(sizeof(struct T), N)
#define ALIGN_CALLOC_STRUCT(T, N) (struct T *) _mesa_align_calloc(sizeof(struct T), N)
#define ALIGN_FREE(PTR) _mesa_align_free(PTR)
 
#define MEMCPY( DST, SRC, BYTES) _mesa_memcpy(DST, SRC, BYTES)
#define MEMSET( DST, VAL, N ) _mesa_memset(DST, VAL, N)
 
 
/* MACs and BeOS don't support static larger than 32kb, so... */
#if defined(macintosh) && !defined(__MRC__)
/*extern char *AGLAlloc(int size);*/
/*extern void AGLFree(char* ptr);*/
# define DEFARRAY(TYPE,NAME,SIZE) TYPE *NAME = (TYPE*)_mesa_alloc(sizeof(TYPE)*(SIZE))
# define DEFMARRAY(TYPE,NAME,SIZE1,SIZE2) TYPE (*NAME)[SIZE2] = (TYPE(*)[SIZE2])_mesa_alloc(sizeof(TYPE)*(SIZE1)*(SIZE2))
# define DEFMNARRAY(TYPE,NAME,SIZE1,SIZE2,SIZE3) TYPE (*NAME)[SIZE2][SIZE3] = (TYPE(*)[SIZE2][SIZE3])_mesa_alloc(sizeof(TYPE)*(SIZE1)*(SIZE2)*(SIZE3))
 
# define CHECKARRAY(NAME,CMD) do {if (!(NAME)) {CMD;}} while (0)
# define UNDEFARRAY(NAME) do {if ((NAME)) {_mesa_free((char*)NAME);} }while (0)
#elif defined(__BEOS__)
# define DEFARRAY(TYPE,NAME,SIZE) TYPE *NAME = (TYPE*)_mesa_malloc(sizeof(TYPE)*(SIZE))
# define DEFMARRAY(TYPE,NAME,SIZE1,SIZE2) TYPE (*NAME)[SIZE2] = (TYPE(*)[SIZE2])_mesa_malloc(sizeof(TYPE)*(SIZE1)*(SIZE2))
# define DEFMNARRAY(TYPE,NAME,SIZE1,SIZE2,SIZE3) TYPE (*NAME)[SIZE2][SIZE3] = (TYPE(*)[SIZE2][SIZE3])_mesa_malloc(sizeof(TYPE)*(SIZE1)*(SIZE2)*(SIZE3))
# define CHECKARRAY(NAME,CMD) do {if (!(NAME)) {CMD;}} while (0)
# define UNDEFARRAY(NAME) do {if ((NAME)) {_mesa_free((char*)NAME);} }while (0)
#else
# define DEFARRAY(TYPE,NAME,SIZE) TYPE NAME[SIZE]
# define DEFMARRAY(TYPE,NAME,SIZE1,SIZE2) TYPE NAME[SIZE1][SIZE2]
# define DEFMNARRAY(TYPE,NAME,SIZE1,SIZE2,SIZE3) TYPE NAME[SIZE1][SIZE2][SIZE3]
# define CHECKARRAY(NAME,CMD) do {} while(0)
# define UNDEFARRAY(NAME)
#endif
 
 
#ifdef MESA_EXTERNAL_BUFFERALLOC
/*
* If you want Mesa's depth/stencil/accum/etc buffers to be allocated
* with a specialized allocator you can define MESA_EXTERNAL_BUFFERALLOC
* and implement _ext_mesa_alloc/free_pixelbuffer() in your app.
* Contributed by Gerk Huisma (gerk@five-d.demon.nl).
*/
extern void *_ext_mesa_alloc_pixelbuffer( unsigned int size );
extern void _ext_mesa_free_pixelbuffer( void *pb );
 
#define MESA_PBUFFER_ALLOC(BYTES) (void *) _ext_mesa_alloc_pixelbuffer(BYTES)
#define MESA_PBUFFER_FREE(PTR) _ext_mesa_free_pixelbuffer(PTR)
#else
/* Default buffer allocation uses the aligned allocation routines: */
#define MESA_PBUFFER_ALLOC(BYTES) (void *) _mesa_align_malloc(BYTES, 512)
#define MESA_PBUFFER_FREE(PTR) _mesa_align_free(PTR)
#endif
 
 
extern void *
_mesa_malloc( size_t bytes );
 
extern void *
_mesa_calloc( size_t bytes );
 
extern void
_mesa_free( void *ptr );
 
extern void *
_mesa_align_malloc( size_t bytes, unsigned long alignment );
 
extern void *
_mesa_align_calloc( size_t bytes, unsigned long alignment );
 
extern void
_mesa_align_free( void *ptr );
 
extern void *
_mesa_memcpy( void *dest, const void *src, size_t n );
 
extern void
_mesa_memset( void *dst, int val, size_t n );
 
extern void
_mesa_memset16( unsigned short *dst, unsigned short val, size_t n );
 
extern void
_mesa_bzero( void *dst, size_t n );
 
 
extern double
_mesa_sin(double a);
 
extern double
_mesa_cos(double a);
 
extern double
_mesa_sqrt(double x);
 
extern double
_mesa_pow(double x, double y);
 
 
extern char *
_mesa_getenv( const char *var );
 
extern char *
_mesa_strstr( const char *haystack, const char *needle );
 
extern char *
_mesa_strncat( char *dest, const char *src, size_t n );
 
extern char *
_mesa_strcpy( char *dest, const char *src );
 
extern char *
_mesa_strncpy( char *dest, const char *src, size_t n );
 
extern size_t
_mesa_strlen( const char *s );
 
extern int
_mesa_strcmp( const char *s1, const char *s2 );
 
extern int
_mesa_strncmp( const char *s1, const char *s2, size_t n );
 
extern int
_mesa_atoi( const char *s );
 
extern int
_mesa_sprintf( char *str, const char *fmt, ... );
 
extern void
_mesa_printf( const char *fmtString, ... );
 
 
extern void
_mesa_warning( __GLcontext *gc, const char *fmtString, ... );
 
extern void
_mesa_problem( const __GLcontext *ctx, const char *s );
 
extern void
_mesa_error( __GLcontext *ctx, GLenum error, const char *fmtString, ... );
 
extern void
_mesa_debug( const __GLcontext *ctx, const char *fmtString, ... );
 
 
extern void
_mesa_init_default_imports( __GLimports *imports, void *driverCtx );
 
 
#endif /* IMPORTS_H */
 
/shark/trunk/ports/mesa/src/teximage.c
0,0 → 1,2938
/* $Id: teximage.c,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "context.h"
#include "convolve.h"
#include "image.h"
#include "imports.h"
#include "macros.h"
#include "mmath.h"
#include "state.h"
#include "texcompress.h"
#include "texformat.h"
#include "teximage.h"
#include "texstate.h"
#include "texstore.h"
#include "mtypes.h"
 
 
/*
* NOTES:
*
* Mesa's native texture datatype is GLchan. Native formats are
* GL_ALPHA, GL_LUMINANCE, GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, GL_RGBA,
* and GL_COLOR_INDEX.
* Device drivers are free to implement any internal format they want.
*/
 
 
#if 0
static void PrintTexture(GLcontext *ctx, const struct gl_texture_image *img)
{
#if CHAN_TYPE == GL_FLOAT
_mesa_problem(NULL, "PrintTexture doesn't support float channels");
#else
GLuint i, j, c;
const GLchan *data = (const GLchan *) img->Data;
 
if (!data) {
_mesa_printf("No texture data\n");
return;
}
 
switch (img->Format) {
case GL_ALPHA:
case GL_LUMINANCE:
case GL_INTENSITY:
case GL_COLOR_INDEX:
c = 1;
break;
case GL_LUMINANCE_ALPHA:
c = 2;
break;
case GL_RGB:
c = 3;
break;
case GL_RGBA:
c = 4;
break;
default:
_mesa_problem(NULL, "error in PrintTexture\n");
return;
}
 
for (i = 0; i < img->Height; i++) {
for (j = 0; j < img->Width; j++) {
if (c==1)
_mesa_printf("%02x ", data[0]);
else if (c==2)
_mesa_printf("%02x%02x ", data[0], data[1]);
else if (c==3)
_mesa_printf("%02x%02x%02x ", data[0], data[1], data[2]);
else if (c==4)
_mesa_printf("%02x%02x%02x%02x ", data[0], data[1], data[2], data[3]);
data += (img->RowStride - img->Width) * c;
}
_mesa_printf("\n");
}
#endif
}
#endif
 
 
 
/*
* Compute log base 2 of n.
* If n isn't an exact power of two return -1.
* If n < 0 return -1.
*/
static int
logbase2( int n )
{
GLint i = 1;
GLint log2 = 0;
 
if (n < 0) {
return -1;
}
 
while ( n > i ) {
i *= 2;
log2++;
}
if (i != n) {
return -1;
}
else {
return log2;
}
}
 
 
 
/*
* Given an internal texture format enum or 1, 2, 3, 4 return the
* corresponding _base_ internal format: GL_ALPHA, GL_LUMINANCE,
* GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA.
*
* This is the format which is used during texture application (i.e. the
* texture format and env mode determine the arithmetic used.
*
* Return -1 if invalid enum.
*/
GLint
_mesa_base_tex_format( GLcontext *ctx, GLint format )
{
/*
* Ask the driver for the base format, if it doesn't
* know, it will return -1;
*/
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return GL_ALPHA;
case 1:
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return GL_LUMINANCE;
case 2:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return GL_LUMINANCE_ALPHA;
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return GL_INTENSITY;
case 3:
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return GL_RGB;
case 4:
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
if (ctx->Extensions.EXT_paletted_texture)
return GL_COLOR_INDEX;
else
return -1;
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16_SGIX:
case GL_DEPTH_COMPONENT24_SGIX:
case GL_DEPTH_COMPONENT32_SGIX:
if (ctx->Extensions.SGIX_depth_texture)
return GL_DEPTH_COMPONENT;
else
return -1;
 
/* GL_ARB_texture_compression */
case GL_COMPRESSED_ALPHA:
if (ctx->Extensions.ARB_texture_compression)
return GL_ALPHA;
else
return -1;
case GL_COMPRESSED_LUMINANCE:
if (ctx->Extensions.ARB_texture_compression)
return GL_LUMINANCE;
else
return -1;
case GL_COMPRESSED_LUMINANCE_ALPHA:
if (ctx->Extensions.ARB_texture_compression)
return GL_LUMINANCE_ALPHA;
else
return -1;
case GL_COMPRESSED_INTENSITY:
if (ctx->Extensions.ARB_texture_compression)
return GL_INTENSITY;
else
return -1;
case GL_COMPRESSED_RGB:
if (ctx->Extensions.ARB_texture_compression)
return GL_RGB;
else
return -1;
case GL_COMPRESSED_RGBA:
if (ctx->Extensions.ARB_texture_compression)
return GL_RGBA;
else
return -1;
case GL_COMPRESSED_RGB_FXT1_3DFX:
if (ctx->Extensions.TDFX_texture_compression_FXT1)
return GL_RGB;
else
return -1;
case GL_COMPRESSED_RGBA_FXT1_3DFX:
if (ctx->Extensions.TDFX_texture_compression_FXT1)
return GL_RGBA;
else
return -1;
 
case GL_YCBCR_MESA:
if (ctx->Extensions.MESA_ycbcr_texture)
return GL_YCBCR_MESA;
else
return -1;
 
default:
return -1; /* error */
}
}
 
 
/*
* Test if the given image format is a color/rgba format. That is,
* not color index, depth, stencil, etc.
*/
static GLboolean
is_color_format(GLenum format)
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
case 1:
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
case 2:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
case 3:
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
case 4:
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_TRUE;
case GL_YCBCR_MESA: /* not considered to be RGB */
default:
return GL_FALSE;
}
}
 
 
static GLboolean
is_index_format(GLenum format)
{
switch (format) {
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
return GL_TRUE;
default:
return GL_FALSE;
}
}
 
 
/**
* Return GL_TRUE if internalFormat is a supported compressed format,
* return GL_FALSE otherwise.
* \param - internalFormat - the internal format token provided by the user
*/
static GLboolean
is_compressed_format(GLenum internalFormat)
{
switch (internalFormat) {
case GL_COMPRESSED_RGB_FXT1_3DFX:
case GL_COMPRESSED_RGBA_FXT1_3DFX:
return GL_TRUE;
default:
return GL_FALSE;
}
}
 
 
/*
* Store a gl_texture_image pointer in a gl_texture_object structure
* according to the target and level parameters.
* This was basically prompted by the introduction of cube maps.
*/
void
_mesa_set_tex_image(struct gl_texture_object *tObj,
GLenum target, GLint level,
struct gl_texture_image *texImage)
{
ASSERT(tObj);
ASSERT(texImage);
switch (target) {
case GL_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_TEXTURE_3D:
tObj->Image[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
tObj->Image[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
tObj->NegX[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
tObj->PosY[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
tObj->NegY[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
tObj->PosZ[level] = texImage;
return;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
tObj->NegZ[level] = texImage;
return;
case GL_TEXTURE_RECTANGLE_NV:
ASSERT(level == 0);
tObj->Image[level] = texImage;
return;
default:
_mesa_problem(NULL, "bad target in _mesa_set_tex_image()");
return;
}
}
 
 
 
/*
* Return new gl_texture_image struct with all fields initialized to zero.
*/
struct gl_texture_image *
_mesa_alloc_texture_image( void )
{
return CALLOC_STRUCT(gl_texture_image);
}
 
 
 
void
_mesa_free_texture_image( struct gl_texture_image *teximage )
{
if (teximage->Data && !teximage->IsClientData) {
MESA_PBUFFER_FREE( teximage->Data );
teximage->Data = NULL;
}
FREE( teximage );
}
 
 
/*
* Return GL_TRUE if the target is a proxy target.
*/
static GLboolean
is_proxy_target(GLenum target)
{
return (target == GL_PROXY_TEXTURE_1D ||
target == GL_PROXY_TEXTURE_2D ||
target == GL_PROXY_TEXTURE_3D ||
target == GL_PROXY_TEXTURE_CUBE_MAP_ARB);
}
 
 
/*
* Given a texture unit and a texture target, return the corresponding
* texture object.
*/
struct gl_texture_object *
_mesa_select_tex_object(GLcontext *ctx, const struct gl_texture_unit *texUnit,
GLenum target)
{
switch (target) {
case GL_TEXTURE_1D:
return texUnit->Current1D;
case GL_PROXY_TEXTURE_1D:
return ctx->Texture.Proxy1D;
case GL_TEXTURE_2D:
return texUnit->Current2D;
case GL_PROXY_TEXTURE_2D:
return ctx->Texture.Proxy2D;
case GL_TEXTURE_3D:
return texUnit->Current3D;
case GL_PROXY_TEXTURE_3D:
return ctx->Texture.Proxy3D;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_ARB:
return ctx->Extensions.ARB_texture_cube_map
? texUnit->CurrentCubeMap : NULL;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
return ctx->Extensions.ARB_texture_cube_map
? ctx->Texture.ProxyCubeMap : NULL;
case GL_TEXTURE_RECTANGLE_NV:
return ctx->Extensions.NV_texture_rectangle
? texUnit->CurrentRect : NULL;
case GL_PROXY_TEXTURE_RECTANGLE_NV:
return ctx->Extensions.NV_texture_rectangle
? ctx->Texture.ProxyRect : NULL;
default:
_mesa_problem(NULL, "bad target in _mesa_select_tex_object()");
return NULL;
}
}
 
 
/*
* Return the texture image struct which corresponds to target and level
* for the given texture unit.
*/
struct gl_texture_image *
_mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit,
GLenum target, GLint level)
{
ASSERT(texUnit);
ASSERT(level < MAX_TEXTURE_LEVELS);
switch (target) {
case GL_TEXTURE_1D:
return texUnit->Current1D->Image[level];
case GL_PROXY_TEXTURE_1D:
return ctx->Texture.Proxy1D->Image[level];
case GL_TEXTURE_2D:
return texUnit->Current2D->Image[level];
case GL_PROXY_TEXTURE_2D:
return ctx->Texture.Proxy2D->Image[level];
case GL_TEXTURE_3D:
return texUnit->Current3D->Image[level];
case GL_PROXY_TEXTURE_3D:
return ctx->Texture.Proxy3D->Image[level];
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->Image[level];
else
return NULL;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->NegX[level];
else
return NULL;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->PosY[level];
else
return NULL;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->NegY[level];
else
return NULL;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->PosZ[level];
else
return NULL;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return texUnit->CurrentCubeMap->NegZ[level];
else
return NULL;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
if (ctx->Extensions.ARB_texture_cube_map)
return ctx->Texture.ProxyCubeMap->Image[level];
else
return NULL;
case GL_TEXTURE_RECTANGLE_NV:
if (ctx->Extensions.NV_texture_rectangle) {
ASSERT(level == 0);
return texUnit->CurrentRect->Image[level];
}
else {
return NULL;
}
case GL_PROXY_TEXTURE_RECTANGLE_NV:
if (ctx->Extensions.NV_texture_rectangle) {
ASSERT(level == 0);
return ctx->Texture.ProxyRect->Image[level];
}
else {
return NULL;
}
default:
_mesa_problem(ctx, "bad target in _mesa_select_tex_image()");
return NULL;
}
}
 
 
/*
* Return the maximum number of allows mipmap levels for the given
* texture target.
*/
GLint
_mesa_max_texture_levels(GLcontext *ctx, GLenum target)
{
switch (target) {
case GL_TEXTURE_1D:
case GL_PROXY_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_PROXY_TEXTURE_2D:
return ctx->Const.MaxTextureLevels;
case GL_TEXTURE_3D:
case GL_PROXY_TEXTURE_3D:
return ctx->Const.Max3DTextureLevels;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
return ctx->Const.MaxCubeTextureLevels;
break;
case GL_TEXTURE_RECTANGLE_NV:
case GL_PROXY_TEXTURE_RECTANGLE_NV:
return 1;
break;
default:
return 0; /* bad target */
}
}
 
 
 
#if 000 /* not used anymore */
/*
* glTexImage[123]D can accept a NULL image pointer. In this case we
* create a texture image with unspecified image contents per the OpenGL
* spec.
*/
static GLubyte *
make_null_texture(GLint width, GLint height, GLint depth, GLenum format)
{
const GLint components = _mesa_components_in_format(format);
const GLint numPixels = width * height * depth;
GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte));
 
#ifdef DEBUG
/*
* Let's see if anyone finds this. If glTexImage2D() is called with
* a NULL image pointer then load the texture image with something
* interesting instead of leaving it indeterminate.
*/
if (data) {
static const char message[8][32] = {
" X X XXXXX XXX X ",
" XX XX X X X X X ",
" X X X X X X X ",
" X X XXXX XXX XXXXX ",
" X X X X X X ",
" X X X X X X X ",
" X X XXXXX XXX X X ",
" "
};
 
GLubyte *imgPtr = data;
GLint h, i, j, k;
for (h = 0; h < depth; h++) {
for (i = 0; i < height; i++) {
GLint srcRow = 7 - (i % 8);
for (j = 0; j < width; j++) {
GLint srcCol = j % 32;
GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70;
for (k = 0; k < components; k++) {
*imgPtr++ = texel;
}
}
}
}
}
#endif
 
return data;
}
#endif
 
 
 
/*
* Reset the fields of a gl_texture_image struct to zero.
* This is called when a proxy texture test fails, we set all the
* image members (except DriverData) to zero.
* It's also used in glTexImage[123]D as a safeguard to be sure all
* required fields get initialized properly by the Driver.TexImage[123]D
* functions.
*/
static void
clear_teximage_fields(struct gl_texture_image *img)
{
ASSERT(img);
img->Format = 0;
img->IntFormat = 0;
img->Border = 0;
img->Width = 0;
img->Height = 0;
img->Depth = 0;
img->RowStride = 0;
img->Width2 = 0;
img->Height2 = 0;
img->Depth2 = 0;
img->WidthLog2 = 0;
img->HeightLog2 = 0;
img->DepthLog2 = 0;
img->Data = NULL;
img->TexFormat = &_mesa_null_texformat;
img->FetchTexel = NULL;
img->IsCompressed = 0;
img->CompressedSize = 0;
}
 
 
/*
* Initialize basic fields of the gl_texture_image struct.
*/
void
_mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
struct gl_texture_image *img,
GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum internalFormat)
{
ASSERT(img);
img->Format = _mesa_base_tex_format( ctx, internalFormat );
ASSERT(img->Format > 0);
img->IntFormat = internalFormat;
img->Border = border;
img->Width = width;
img->Height = height;
img->Depth = depth;
img->RowStride = width;
img->WidthLog2 = logbase2(width - 2 * border);
if (height == 1) /* 1-D texture */
img->HeightLog2 = 0;
else
img->HeightLog2 = logbase2(height - 2 * border);
if (depth == 1) /* 2-D texture */
img->DepthLog2 = 0;
else
img->DepthLog2 = logbase2(depth - 2 * border);
img->Width2 = 1 << img->WidthLog2;
img->Height2 = 1 << img->HeightLog2;
img->Depth2 = 1 << img->DepthLog2;
img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2);
img->IsCompressed = is_compressed_format(internalFormat);
if (img->IsCompressed)
img->CompressedSize = _mesa_compressed_texture_size(ctx, width, height,
depth, internalFormat);
else
img->CompressedSize = 0;
 
/* Compute Width/Height/DepthScale for mipmap lod computation */
if (target == GL_TEXTURE_RECTANGLE_NV) {
/* scale = 1.0 since texture coords directly map to texels */
img->WidthScale = 1.0;
img->HeightScale = 1.0;
img->DepthScale = 1.0;
}
else {
img->WidthScale = (GLfloat) img->Width;
img->HeightScale = (GLfloat) img->Height;
img->DepthScale = (GLfloat) img->Depth;
}
}
 
 
 
/*
* Test glTexImage[123]D() parameters for errors.
* Input:
* dimensions - must be 1 or 2 or 3
* Return: GL_TRUE = an error was detected, GL_FALSE = no errors
*/
static GLboolean
texture_error_check( GLcontext *ctx, GLenum target,
GLint level, GLint internalFormat,
GLenum format, GLenum type,
GLuint dimensions,
GLint width, GLint height,
GLint depth, GLint border )
{
GLboolean isProxy;
GLint maxLevels = 0, maxTextureSize;
 
if (dimensions == 1) {
if (target == GL_PROXY_TEXTURE_1D) {
isProxy = GL_TRUE;
}
else if (target == GL_TEXTURE_1D) {
isProxy = GL_FALSE;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" );
return GL_TRUE;
}
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (dimensions == 2) {
if (target == GL_PROXY_TEXTURE_2D) {
isProxy = GL_TRUE;
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_TEXTURE_2D) {
isProxy = GL_FALSE;
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)");
return GL_TRUE;
}
isProxy = GL_TRUE;
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)");
return GL_TRUE;
}
isProxy = GL_FALSE;
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else if (target == GL_PROXY_TEXTURE_RECTANGLE_NV) {
if (!ctx->Extensions.NV_texture_rectangle) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)");
return GL_TRUE;
}
isProxy = GL_TRUE;
maxLevels = 1;
}
else if (target == GL_TEXTURE_RECTANGLE_NV) {
if (!ctx->Extensions.NV_texture_rectangle) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)");
return GL_TRUE;
}
isProxy = GL_FALSE;
maxLevels = 1;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)");
return GL_TRUE;
}
}
else if (dimensions == 3) {
if (target == GL_PROXY_TEXTURE_3D) {
isProxy = GL_TRUE;
}
else if (target == GL_TEXTURE_3D) {
isProxy = GL_FALSE;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" );
return GL_TRUE;
}
maxLevels = ctx->Const.Max3DTextureLevels;
}
else {
_mesa_problem( ctx, "bad dims in texture_error_check" );
return GL_TRUE;
}
 
ASSERT(maxLevels > 0);
maxTextureSize = 1 << (maxLevels - 1);
 
/* Border */
if (border != 0 && border != 1) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(border=%d)", dimensions, border);
}
return GL_TRUE;
}
if ((target == GL_TEXTURE_RECTANGLE_NV ||
target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0) {
return GL_TRUE;
}
 
/* Width */
if (target == GL_TEXTURE_RECTANGLE_NV ||
target == GL_PROXY_TEXTURE_RECTANGLE_NV) {
if (width < 1 || width > ctx->Const.MaxTextureRectSize) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(width=%d)", dimensions, width);
}
return GL_TRUE;
}
}
else if (width < 2 * border || width > 2 + maxTextureSize
|| logbase2( width - 2 * border ) < 0) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(width=%d)", dimensions, width);
}
return GL_TRUE;
}
 
/* Height */
if (target == GL_TEXTURE_RECTANGLE_NV ||
target == GL_PROXY_TEXTURE_RECTANGLE_NV) {
if (height < 1 || height > ctx->Const.MaxTextureRectSize) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(height=%d)", dimensions, height);
}
return GL_TRUE;
}
}
else if (dimensions >= 2) {
if (height < 2 * border || height > 2 + maxTextureSize
|| logbase2( height - 2 * border ) < 0) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(height=%d)", dimensions, height);
}
return GL_TRUE;
}
}
 
/* For cube map, width must equal height */
if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (width != height) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexImage2D(width != height)");
}
return GL_TRUE;
}
}
 
/* Depth */
if (dimensions >= 3) {
if (depth < 2 * border || depth > 2 + maxTextureSize
|| logbase2( depth - 2 * border ) < 0) {
if (!isProxy) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glTexImage3D(depth=%d)", depth );
}
return GL_TRUE;
}
}
 
/* Level */
if (target == GL_TEXTURE_RECTANGLE_NV ||
target == GL_PROXY_TEXTURE_RECTANGLE_NV) {
if (level != 0) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage2D(level=%d)", level);
}
return GL_TRUE;
}
}
else if (level < 0 || level >= maxLevels) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(level=%d)", dimensions, level);
}
return GL_TRUE;
}
 
/* For cube map, width must equal height */
if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (width != height) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexImage2D(width != height)");
return GL_TRUE;
}
}
 
if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(internalFormat=0x%x)",
dimensions, internalFormat);
}
return GL_TRUE;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
/* Yes, generate GL_INVALID_OPERATION, not GL_INVALID_ENUM, if there
* is a type/format mismatch. See 1.2 spec page 94, sec 3.6.4.
*/
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTexImage%dD(format or type)", dimensions);
}
return GL_TRUE;
}
 
if (format == GL_YCBCR_MESA || internalFormat == GL_YCBCR_MESA) {
ASSERT(ctx->Extensions.MESA_ycbcr_texture);
if (format != GL_YCBCR_MESA ||
internalFormat != GL_YCBCR_MESA ||
(type != GL_UNSIGNED_SHORT_8_8_MESA &&
type != GL_UNSIGNED_SHORT_8_8_REV_MESA)) {
char message[100];
_mesa_sprintf(message,
"glTexImage%d(format/type/internalFormat YCBCR mismatch",
dimensions);
_mesa_error(ctx, GL_INVALID_ENUM, message);
return GL_TRUE; /* error */
}
if (target != GL_TEXTURE_2D &&
target != GL_PROXY_TEXTURE_2D &&
target != GL_TEXTURE_RECTANGLE_NV &&
target != GL_PROXY_TEXTURE_RECTANGLE_NV) {
if (!isProxy)
_mesa_error(ctx, GL_INVALID_ENUM, "glTexImage(target)");
return GL_TRUE;
}
if (border != 0) {
if (!isProxy) {
char message[100];
_mesa_sprintf(message,
"glTexImage%d(format=GL_YCBCR_MESA and border=%d)",
dimensions, border);
_mesa_error(ctx, GL_INVALID_VALUE, message);
}
return GL_TRUE;
}
}
 
if (is_compressed_format(internalFormat)) {
if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) {
/* OK */
}
else if (ctx->Extensions.ARB_texture_cube_map &&
(target == GL_PROXY_TEXTURE_CUBE_MAP ||
(target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) {
/* OK */
}
else {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexImage%d(target)", dimensions);
return GL_TRUE;
}
}
if (border != 0) {
if (!isProxy) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTexImage%D(border!=0)", dimensions);
}
return GL_TRUE;
}
}
 
/* if we get here, the parameters are OK */
return GL_FALSE;
}
 
 
 
/*
* Test glTexSubImage[123]D() parameters for errors.
* Input:
* dimensions - must be 1 or 2 or 3
* Return: GL_TRUE = an error was detected, GL_FALSE = no errors
*/
static GLboolean
subtexture_error_check( GLcontext *ctx, GLuint dimensions,
GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLenum format, GLenum type )
{
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_image *destTex;
GLint maxLevels = 0;
 
if (dimensions == 1) {
if (target == GL_TEXTURE_1D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage1D(target)" );
return GL_TRUE;
}
}
else if (dimensions == 2) {
if (ctx->Extensions.ARB_texture_cube_map &&
target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <=GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else if (ctx->Extensions.NV_texture_rectangle &&
target == GL_TEXTURE_RECTANGLE_NV) {
maxLevels = 1;
}
else if (target == GL_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" );
return GL_TRUE;
}
}
else if (dimensions == 3) {
if (target == GL_TEXTURE_3D) {
maxLevels = ctx->Const.Max3DTextureLevels;
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage3D(target)" );
return GL_TRUE;
}
}
else {
_mesa_problem( ctx, "bad dims in texture_error_check" );
return GL_TRUE;
}
 
ASSERT(maxLevels > 0);
 
if (level < 0 || level >= maxLevels) {
_mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level);
return GL_TRUE;
}
 
if (width < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexSubImage%dD(width=%d)", dimensions, width);
return GL_TRUE;
}
if (height < 0 && dimensions > 1) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexSubImage%dD(height=%d)", dimensions, height);
return GL_TRUE;
}
if (depth < 0 && dimensions > 2) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(depth=%d)", dimensions, depth);
return GL_TRUE;
}
 
destTex = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!destTex) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage2D");
return GL_TRUE;
}
 
if (xoffset < -((GLint)destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage1/2/3D(xoffset)");
return GL_TRUE;
}
if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage1/2/3D(xoffset+width)");
return GL_TRUE;
}
if (dimensions > 1) {
if (yoffset < -((GLint)destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage2/3D(yoffset)");
return GL_TRUE;
}
if (yoffset + height > (GLint) (destTex->Height + destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage2/3D(yoffset+height)");
return GL_TRUE;
}
}
if (dimensions > 2) {
if (zoffset < -((GLint)destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)");
return GL_TRUE;
}
if (zoffset + depth > (GLint) (destTex->Depth + destTex->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)");
return GL_TRUE;
}
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexSubImage%dD(format or type)", dimensions);
return GL_TRUE;
}
 
if (destTex->IsCompressed) {
const struct gl_texture_unit *texUnit;
const struct gl_texture_object *texObj;
const struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) {
/* OK */
}
else if (ctx->Extensions.ARB_texture_cube_map &&
(target == GL_PROXY_TEXTURE_CUBE_MAP ||
(target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) {
/* OK */
}
else {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexSubImage%D(target)", dimensions);
return GL_TRUE;
}
/* offset must be multiple of 4 */
if ((xoffset & 3) || (yoffset & 3)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTexSubImage%D(xoffset or yoffset)", dimensions);
return GL_TRUE;
}
/* size must be multiple of 4 or equal to whole texture size */
if ((width & 3) && (GLuint) width != texImage->Width) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTexSubImage%D(width)", dimensions);
return GL_TRUE;
}
if ((height & 3) && (GLuint) height != texImage->Height) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glTexSubImage%D(width)", dimensions);
return GL_TRUE;
}
}
 
return GL_FALSE;
}
 
 
/*
* Test glCopyTexImage[12]D() parameters for errors.
* Input: dimensions - must be 1 or 2 or 3
* Return: GL_TRUE = an error was detected, GL_FALSE = no errors
*/
static GLboolean
copytexture_error_check( GLcontext *ctx, GLuint dimensions,
GLenum target, GLint level, GLint internalFormat,
GLint width, GLint height, GLint border )
{
GLint maxLevels = 0, maxTextureSize;
 
if (dimensions == 1) {
if (target != GL_TEXTURE_1D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" );
return GL_TRUE;
}
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (dimensions == 2) {
if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" );
return GL_TRUE;
}
}
else if (target == GL_TEXTURE_RECTANGLE_NV) {
if (!ctx->Extensions.NV_texture_rectangle) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" );
return GL_TRUE;
}
}
else if (target != GL_TEXTURE_2D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" );
return GL_TRUE;
}
if (target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else if (target == GL_TEXTURE_RECTANGLE_NV)
maxLevels = 1;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
 
ASSERT(maxLevels > 0);
maxTextureSize = 1 << (maxLevels - 1);
 
/* Border */
if (border != 0 && border != 1) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexImage%dD(border)", dimensions);
return GL_TRUE;
}
 
/* Width */
if (width < 2 * border || width > 2 + maxTextureSize
|| logbase2( width - 2 * border ) < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexImage%dD(width=%d)", dimensions, width);
return GL_TRUE;
}
 
/* Height */
if (dimensions >= 2) {
if (height < 2 * border || height > 2 + maxTextureSize
|| logbase2( height - 2 * border ) < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexImage%dD(height=%d)", dimensions, height);
return GL_TRUE;
}
}
 
/* For cube map, width must equal height */
if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (width != height) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCopyTexImage2D(width != height)");
return GL_TRUE;
}
}
 
/* Level */
if (level < 0 || level >= maxLevels) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexImage%dD(level=%d)", dimensions, level);
return GL_TRUE;
}
 
if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexImage%dD(internalFormat)", dimensions);
return GL_TRUE;
}
 
if (is_compressed_format(internalFormat)) {
if (target != GL_TEXTURE_2D) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glCopyTexImage%d(target)", dimensions);
return GL_TRUE;
}
if (border != 0) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glCopyTexImage%D(border!=0)", dimensions);
return GL_TRUE;
}
}
 
/* if we get here, the parameters are OK */
return GL_FALSE;
}
 
 
static GLboolean
copytexsubimage_error_check( GLcontext *ctx, GLuint dimensions,
GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height )
{
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_image *teximage;
GLint maxLevels = 0;
 
if (dimensions == 1) {
if (target != GL_TEXTURE_1D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" );
return GL_TRUE;
}
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (dimensions == 2) {
if (ctx->Extensions.ARB_texture_cube_map) {
if ((target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB ||
target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) &&
target != GL_TEXTURE_2D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" );
return GL_TRUE;
}
}
else if (target != GL_TEXTURE_2D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" );
return GL_TRUE;
}
if (target == GL_PROXY_TEXTURE_2D && target == GL_TEXTURE_2D)
maxLevels = ctx->Const.MaxTextureLevels;
else
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else if (dimensions == 3) {
if (target != GL_TEXTURE_3D) {
_mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" );
return GL_TRUE;
}
maxLevels = ctx->Const.Max3DTextureLevels;
}
 
ASSERT(maxLevels > 0);
 
if (level < 0 || level >= maxLevels) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(level=%d)", dimensions, level);
return GL_TRUE;
}
 
if (width < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(width=%d)", dimensions, width);
return GL_TRUE;
}
if (dimensions > 1 && height < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(height=%d)", dimensions, height);
return GL_TRUE;
}
 
teximage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!teximage) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glCopyTexSubImage%dD(undefined texture level: %d)",
dimensions, level);
return GL_TRUE;
}
 
if (xoffset < -((GLint)teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset);
return GL_TRUE;
}
if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(xoffset+width)", dimensions);
return GL_TRUE;
}
if (dimensions > 1) {
if (yoffset < -((GLint)teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset);
return GL_TRUE;
}
/* NOTE: we're adding the border here, not subtracting! */
if (yoffset + height > (GLint) (teximage->Height + teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(yoffset+height)", dimensions);
return GL_TRUE;
}
}
 
if (dimensions > 2) {
if (zoffset < -((GLint)teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(zoffset)", dimensions);
return GL_TRUE;
}
if (zoffset > (GLint) (teximage->Depth + teximage->Border)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%dD(zoffset+depth)", dimensions);
return GL_TRUE;
}
}
 
if (teximage->IsCompressed) {
if (target != GL_TEXTURE_2D) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glCopyTexSubImage%d(target)", dimensions);
return GL_TRUE;
}
/* offset must be multiple of 4 */
if ((xoffset & 3) || (yoffset & 3)) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%D(xoffset or yoffset)", dimensions);
return GL_TRUE;
}
/* size must be multiple of 4 */
if ((width & 3) != 0 && (GLuint) width != teximage->Width) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%D(width)", dimensions);
return GL_TRUE;
}
if ((height & 3) != 0 && (GLuint) height != teximage->Height) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glCopyTexSubImage%D(height)", dimensions);
return GL_TRUE;
}
}
 
if (teximage->IntFormat == GL_YCBCR_MESA) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D");
return GL_TRUE;
}
 
/* if we get here, the parameters are OK */
return GL_FALSE;
}
 
 
 
void
_mesa_GetTexImage( GLenum target, GLint level, GLenum format,
GLenum type, GLvoid *pixels )
{
const struct gl_texture_unit *texUnit;
const struct gl_texture_object *texObj;
const struct gl_texture_image *texImage;
GLint maxLevels = 0;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
texUnit = &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
texObj = _mesa_select_tex_object(ctx, texUnit, target);
if (!texObj || is_proxy_target(target)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)");
return;
}
 
maxLevels = _mesa_max_texture_levels(ctx, target);
ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */
 
if (level < 0 || level >= maxLevels) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" );
return;
}
 
if (_mesa_sizeof_packed_type(type) <= 0) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(type)" );
return;
}
 
if (_mesa_components_in_format(format) <= 0 ||
format == GL_STENCIL_INDEX) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" );
return;
}
 
if (!ctx->Extensions.EXT_paletted_texture && is_index_format(format)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
}
 
if (!ctx->Extensions.SGIX_depth_texture && format == GL_DEPTH_COMPONENT) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
}
 
if (!ctx->Extensions.MESA_ycbcr_texture && format == GL_YCBCR_MESA) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
}
 
/* XXX what if format/type doesn't match texture format/type? */
 
if (!pixels)
return;
 
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) {
/* invalid mipmap level, not an error */
return;
}
 
if (!texImage->Data) {
/* no image data, not an error */
return;
}
 
{
const GLint width = texImage->Width;
const GLint height = texImage->Height;
const GLint depth = texImage->Depth;
GLint img, row;
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
/* compute destination address in client memory */
GLvoid *dest = _mesa_image_address( &ctx->Pack, pixels,
width, height, format, type,
img, row, 0);
assert(dest);
 
if (format == GL_COLOR_INDEX) {
GLuint indexRow[MAX_WIDTH];
GLint col;
for (col = 0; col < width; col++) {
(*texImage->FetchTexel)(texImage, col, row, img,
(GLvoid *) &indexRow[col]);
}
_mesa_pack_index_span(ctx, width, type, dest,
indexRow, &ctx->Pack,
0 /* no image transfer */);
}
else if (format == GL_DEPTH_COMPONENT) {
GLfloat depthRow[MAX_WIDTH];
GLint col;
for (col = 0; col < width; col++) {
(*texImage->FetchTexel)(texImage, col, row, img,
(GLvoid *) &depthRow[col]);
}
_mesa_pack_depth_span(ctx, width, dest, type,
depthRow, &ctx->Pack);
}
else if (format == GL_YCBCR_MESA) {
/* No pixel transfer */
const GLint rowstride = texImage->RowStride;
MEMCPY(dest,
(const GLushort *) texImage->Data + row * rowstride,
width * sizeof(GLushort));
/* check for byte swapping */
if ((texImage->TexFormat->MesaFormat == MESA_FORMAT_YCBCR
&& type == GL_UNSIGNED_SHORT_8_8_REV_MESA) ||
(texImage->TexFormat->MesaFormat == MESA_FORMAT_YCBCR_REV
&& type == GL_UNSIGNED_SHORT_8_8_MESA)) {
if (!ctx->Pack.SwapBytes)
_mesa_swap2((GLushort *) dest, width);
}
else if (ctx->Pack.SwapBytes) {
_mesa_swap2((GLushort *) dest, width);
}
}
else {
/* general case: convert row to RGBA format */
GLchan rgba[MAX_WIDTH][4];
GLint col;
for (col = 0; col < width; col++) {
(*texImage->FetchTexel)(texImage, col, row, img,
(GLvoid *) rgba[col]);
}
_mesa_pack_rgba_span(ctx, width, (const GLchan (*)[4])rgba,
format, type, dest, &ctx->Pack,
0 /* no image transfer */);
} /* format */
} /* row */
} /* img */
}
}
 
 
 
/*
* Called from the API. Note that width includes the border.
*/
void
_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLint border, GLenum format,
GLenum type, const GLvoid *pixels )
{
GLsizei postConvWidth = width;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (is_color_format(internalFormat)) {
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
}
 
if (target == GL_TEXTURE_1D) {
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
 
if (texture_error_check(ctx, target, level, internalFormat,
format, type, 1, postConvWidth, 1, 1, border)) {
return; /* error was recorded */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
texObj->Image[level] = texImage;
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
/* free the old texture data */
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
clear_teximage_fields(texImage); /* not really needed, but helpful */
_mesa_init_teximage_fields(ctx, target, texImage,
postConvWidth, 1, 1,
border, internalFormat);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
ASSERT(ctx->Driver.TexImage1D);
 
/* Give the texture to the driver! <pixels> may be null! */
(*ctx->Driver.TexImage1D)(ctx, target, level, internalFormat,
width, border, format, type, pixels,
&ctx->Unpack, texObj, texImage);
 
ASSERT(texImage->TexFormat);
if (!texImage->FetchTexel) {
/* If driver didn't explicitly set this, use the default */
texImage->FetchTexel = texImage->TexFormat->FetchTexel1D;
}
ASSERT(texImage->FetchTexel);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_1D) {
/* Proxy texture: check for errors and update proxy state */
GLboolean error = texture_error_check(ctx, target, level, internalFormat,
format, type, 1, postConvWidth, 1, 1, border);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, format, type,
postConvWidth, 1, 1, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy1D->Image[level]);
}
}
else {
/* no error, set the tex image parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage,
postConvWidth, 1, 1,
border, internalFormat);
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" );
return;
}
}
 
 
void
_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GLsizei postConvWidth = width, postConvHeight = height;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (is_color_format(internalFormat)) {
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
&postConvHeight);
}
 
if (target == GL_TEXTURE_2D ||
(ctx->Extensions.ARB_texture_cube_map &&
target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) ||
(ctx->Extensions.NV_texture_rectangle &&
target == GL_TEXTURE_RECTANGLE_NV)) {
/* non-proxy target */
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
 
if (texture_error_check(ctx, target, level, internalFormat,
format, type, 2, postConvWidth, postConvHeight,
1, border)) {
return; /* error was recorded */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
_mesa_set_tex_image(texObj, target, level, texImage);
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
/* free the old texture data */
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
clear_teximage_fields(texImage); /* not really needed, but helpful */
_mesa_init_teximage_fields(ctx, target, texImage,
postConvWidth, postConvHeight, 1,
border, internalFormat);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
ASSERT(ctx->Driver.TexImage2D);
 
/* Give the texture to the driver! <pixels> may be null! */
(*ctx->Driver.TexImage2D)(ctx, target, level, internalFormat,
width, height, border, format, type, pixels,
&ctx->Unpack, texObj, texImage);
 
ASSERT(texImage->TexFormat);
if (!texImage->FetchTexel) {
/* If driver didn't explicitly set this, use the default */
texImage->FetchTexel = texImage->TexFormat->FetchTexel2D;
}
ASSERT(texImage->FetchTexel);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_2D ||
(target == GL_PROXY_TEXTURE_CUBE_MAP_ARB &&
ctx->Extensions.ARB_texture_cube_map) ||
(target == GL_PROXY_TEXTURE_RECTANGLE_NV &&
ctx->Extensions.NV_texture_rectangle)) {
/* Proxy texture: check for errors and update proxy state */
GLboolean error = texture_error_check(ctx, target, level, internalFormat,
format, type, 2, postConvWidth, postConvHeight, 1, border);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, format, type,
postConvWidth, postConvHeight, 1, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
const GLint maxLevels = (target == GL_PROXY_TEXTURE_2D) ?
ctx->Const.MaxTextureLevels : ctx->Const.MaxCubeTextureLevels;
if (level >= 0 && level < maxLevels) {
clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]);
}
}
else {
/* no error, set the tex image parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage,
postConvWidth, postConvHeight, 1,
border, internalFormat);
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" );
return;
}
}
 
 
/*
* Called by the API or display list executor.
* Note that width and height include the border.
*/
void
_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target == GL_TEXTURE_3D) {
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
 
if (texture_error_check(ctx, target, level, (GLint) internalFormat,
format, type, 3, width, height, depth, border)) {
return; /* error was recorded */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
texObj->Image[level] = texImage;
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
clear_teximage_fields(texImage); /* not really needed, but helpful */
_mesa_init_teximage_fields(ctx, target, texImage,
width, height, depth,
border, internalFormat);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
ASSERT(ctx->Driver.TexImage3D);
 
/* Give the texture to the driver! <pixels> may be null! */
(*ctx->Driver.TexImage3D)(ctx, target, level, internalFormat,
width, height, depth, border, format, type,
pixels, &ctx->Unpack, texObj, texImage);
 
ASSERT(texImage->TexFormat);
if (!texImage->FetchTexel) {
/* If driver didn't explicitly set this, use the default */
texImage->FetchTexel = texImage->TexFormat->FetchTexel3D;
}
ASSERT(texImage->FetchTexel);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_3D) {
/* Proxy texture: check for errors and update proxy state */
GLboolean error = texture_error_check(ctx, target, level, internalFormat,
format, type, 3, width, height, depth, border);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, format, type,
width, height, depth, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.Max3DTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]);
}
}
else {
/* no error, set the tex image parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage, width, height, 1,
border, internalFormat);
}
}
else {
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" );
return;
}
}
 
 
void
_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat,
GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels )
{
_mesa_TexImage3D(target, level, (GLint) internalFormat, width, height,
depth, border, format, type, pixels);
}
 
 
 
void
_mesa_TexSubImage1D( GLenum target, GLint level,
GLint xoffset, GLsizei width,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GLsizei postConvWidth = width;
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
/* XXX should test internal format */
if (is_color_format(format)) {
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
}
 
if (subtexture_error_check(ctx, 1, target, level, xoffset, 0, 0,
postConvWidth, 1, 1, format, type)) {
return; /* error was detected */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if (width == 0 || !pixels)
return; /* no-op, not an error */
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
 
ASSERT(ctx->Driver.TexSubImage1D);
(*ctx->Driver.TexSubImage1D)(ctx, target, level, xoffset, width,
format, type, pixels, &ctx->Unpack,
texObj, texImage);
ctx->NewState |= _NEW_TEXTURE;
}
 
 
void
_mesa_TexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels )
{
GLsizei postConvWidth = width, postConvHeight = height;
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
/* XXX should test internal format */
if (is_color_format(format)) {
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
&postConvHeight);
}
 
if (subtexture_error_check(ctx, 2, target, level, xoffset, yoffset, 0,
postConvWidth, postConvHeight, 1, format, type)) {
return; /* error was detected */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if (width == 0 || height == 0 || !pixels)
return; /* no-op, not an error */
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
yoffset += texImage->Border;
 
ASSERT(ctx->Driver.TexSubImage2D);
(*ctx->Driver.TexSubImage2D)(ctx, target, level, xoffset, yoffset,
width, height, format, type, pixels,
&ctx->Unpack, texObj, texImage);
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_TexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type,
const GLvoid *pixels )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
if (subtexture_error_check(ctx, 3, target, level, xoffset, yoffset, zoffset,
width, height, depth, format, type)) {
return; /* error was detected */
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if (width == 0 || height == 0 || height == 0 || !pixels)
return; /* no-op, not an error */
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
yoffset += texImage->Border;
zoffset += texImage->Border;
 
ASSERT(ctx->Driver.TexSubImage3D);
(*ctx->Driver.TexSubImage3D)(ctx, target, level,
xoffset, yoffset, zoffset,
width, height, depth,
format, type, pixels,
&ctx->Unpack, texObj, texImage );
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_CopyTexImage1D( GLenum target, GLint level,
GLenum internalFormat,
GLint x, GLint y,
GLsizei width, GLint border )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLsizei postConvWidth = width;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
if (is_color_format(internalFormat)) {
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
}
 
if (copytexture_error_check(ctx, 1, target, level, internalFormat,
postConvWidth, 1, border))
return;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) {
texImage = _mesa_alloc_texture_image();
_mesa_set_tex_image(texObj, target, level, texImage);
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
/* free the old texture data */
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
 
clear_teximage_fields(texImage); /* not really needed, but helpful */
_mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1,
border, internalFormat);
 
 
ASSERT(ctx->Driver.CopyTexImage1D);
(*ctx->Driver.CopyTexImage1D)(ctx, target, level, internalFormat,
x, y, width, border);
 
ASSERT(texImage->TexFormat);
if (!texImage->FetchTexel) {
/* If driver didn't explicitly set this, use the default */
texImage->FetchTexel = texImage->TexFormat->FetchTexel1D;
}
ASSERT(texImage->FetchTexel);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
GLint x, GLint y, GLsizei width, GLsizei height,
GLint border )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLsizei postConvWidth = width, postConvHeight = height;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
if (is_color_format(internalFormat)) {
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
&postConvHeight);
}
 
if (copytexture_error_check(ctx, 2, target, level, internalFormat,
postConvWidth, postConvHeight, border))
return;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) {
texImage = _mesa_alloc_texture_image();
_mesa_set_tex_image(texObj, target, level, texImage);
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
/* free the old texture data */
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
 
clear_teximage_fields(texImage); /* not really needed, but helpful */
_mesa_init_teximage_fields(ctx, target, texImage,
postConvWidth, postConvHeight, 1,
border, internalFormat);
 
ASSERT(ctx->Driver.CopyTexImage2D);
(*ctx->Driver.CopyTexImage2D)(ctx, target, level, internalFormat,
x, y, width, height, border);
 
ASSERT(texImage->TexFormat);
if (!texImage->FetchTexel) {
/* If driver didn't explicitly set this, use the default */
texImage->FetchTexel = texImage->TexFormat->FetchTexel2D;
}
ASSERT(texImage->FetchTexel);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_CopyTexSubImage1D( GLenum target, GLint level,
GLint xoffset, GLint x, GLint y, GLsizei width )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLsizei postConvWidth = width;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
/* XXX should test internal format */
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
 
if (copytexsubimage_error_check(ctx, 1, target, level,
xoffset, 0, 0, postConvWidth, 1))
return;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
 
ASSERT(ctx->Driver.CopyTexSubImage1D);
(*ctx->Driver.CopyTexSubImage1D)(ctx, target, level, xoffset, x, y, width);
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_CopyTexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint x, GLint y, GLsizei width, GLsizei height )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLsizei postConvWidth = width, postConvHeight = height;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
/* XXX should test internal format */
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight);
 
if (copytexsubimage_error_check(ctx, 2, target, level, xoffset, yoffset, 0,
postConvWidth, postConvHeight))
return;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
yoffset += texImage->Border;
 
ASSERT(ctx->Driver.CopyTexSubImage2D);
(*ctx->Driver.CopyTexSubImage2D)(ctx, target, level,
xoffset, yoffset, x, y, width, height);
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
void
_mesa_CopyTexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y, GLsizei width, GLsizei height )
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLsizei postConvWidth = width, postConvHeight = height;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE)
_mesa_update_state(ctx);
 
/* XXX should test internal format */
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight);
 
if (copytexsubimage_error_check(ctx, 3, target, level, xoffset, yoffset,
zoffset, postConvWidth, postConvHeight))
return;
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
/* If we have a border, xoffset=-1 is legal. Bias by border width */
xoffset += texImage->Border;
yoffset += texImage->Border;
zoffset += texImage->Border;
 
ASSERT(ctx->Driver.CopyTexSubImage3D);
(*ctx->Driver.CopyTexSubImage3D)(ctx, target, level,
xoffset, yoffset, zoffset,
x, y, width, height);
ctx->NewState |= _NEW_TEXTURE;
}
 
 
 
 
/**********************************************************************/
/****** Compressed Textures ******/
/**********************************************************************/
 
 
/**
* Error checking for glCompressedTexImage[123]D().
* \return error code or GL_NO_ERROR.
*/
static GLenum
compressed_texture_error_check(GLcontext *ctx, GLint dimensions,
GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize)
{
GLboolean isProxy = GL_FALSE;
GLint expectedSize, maxLevels = 0, maxTextureSize;
 
if (dimensions == 1) {
/* 1D compressed textures not allowed */
return GL_INVALID_ENUM;
}
else if (dimensions == 2) {
if (target == GL_PROXY_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
isProxy = GL_TRUE;
}
else if (target == GL_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map)
return GL_INVALID_ENUM; /*target*/
maxLevels = ctx->Const.MaxCubeTextureLevels;
isProxy = GL_TRUE;
}
else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map)
return GL_INVALID_ENUM; /*target*/
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else {
return GL_INVALID_ENUM; /*target*/
}
}
else if (dimensions == 3) {
/* 3D compressed textures not allowed */
return GL_INVALID_ENUM;
}
 
maxTextureSize = 1 << (maxLevels - 1);
 
if (!is_compressed_format(internalFormat))
return GL_INVALID_ENUM;
 
if (border != 0)
return GL_INVALID_VALUE;
 
if (width < 1 || width > maxTextureSize || logbase2(width) < 0)
return GL_INVALID_VALUE;
 
if ((height < 1 || height > maxTextureSize || logbase2(height) < 0)
&& dimensions > 1)
return GL_INVALID_VALUE;
 
if ((depth < 1 || depth > maxTextureSize || logbase2(depth) < 0)
&& dimensions > 2)
return GL_INVALID_VALUE;
 
/* For cube map, width must equal height */
if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB && width != height)
return GL_INVALID_VALUE;
 
if (level < 0 || level >= maxLevels)
return GL_INVALID_VALUE;
 
expectedSize = _mesa_compressed_texture_size(ctx, width, height, depth,
internalFormat);
if (expectedSize != imageSize)
return GL_INVALID_VALUE;
 
return GL_NO_ERROR;
}
 
 
/**
* Error checking for glCompressedTexSubImage[123]D().
* \return error code or GL_NO_ERROR.
*/
static GLenum
compressed_subtexture_error_check(GLcontext *ctx, GLint dimensions,
GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLsizei imageSize)
{
GLboolean isProxy = GL_FALSE;
GLint expectedSize, maxLevels = 0, maxTextureSize;
 
if (dimensions == 1) {
/* 1D compressed textures not allowed */
return GL_INVALID_ENUM;
}
else if (dimensions == 2) {
if (target == GL_PROXY_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
isProxy = GL_TRUE;
}
else if (target == GL_TEXTURE_2D) {
maxLevels = ctx->Const.MaxTextureLevels;
}
else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map)
return GL_INVALID_ENUM; /*target*/
maxLevels = ctx->Const.MaxCubeTextureLevels;
isProxy = GL_TRUE;
}
else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) {
if (!ctx->Extensions.ARB_texture_cube_map)
return GL_INVALID_ENUM; /*target*/
maxLevels = ctx->Const.MaxCubeTextureLevels;
}
else {
return GL_INVALID_ENUM; /*target*/
}
}
else if (dimensions == 3) {
/* 3D compressed textures not allowed */
return GL_INVALID_ENUM;
}
 
maxTextureSize = 1 << (maxLevels - 1);
 
if (!is_compressed_format(format))
return GL_INVALID_ENUM;
 
if (width < 1 || width > maxTextureSize || logbase2(width) < 0)
return GL_INVALID_VALUE;
 
if ((height < 1 || height > maxTextureSize || logbase2(height) < 0)
&& dimensions > 1)
return GL_INVALID_VALUE;
 
if (level < 0 || level >= maxLevels)
return GL_INVALID_VALUE;
 
if ((xoffset & 3) != 0 || (yoffset & 3) != 0)
return GL_INVALID_VALUE;
 
if ((width & 3) != 0 && width != 2 && width != 1)
return GL_INVALID_VALUE;
 
if ((height & 3) != 0 && height != 2 && height != 1)
return GL_INVALID_VALUE;
 
expectedSize = _mesa_compressed_texture_size(ctx, width, height, depth,
format);
if (expectedSize != imageSize)
return GL_INVALID_VALUE;
 
return GL_NO_ERROR;
}
 
 
 
void
_mesa_CompressedTexImage1DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLint border, GLsizei imageSize,
const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target == GL_TEXTURE_1D) {
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error = compressed_texture_error_check(ctx, 1, target, level,
internalFormat, width, 1, 1, border, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexImage1D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
texObj->Image[level] = texImage;
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
 
_mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1,
border, internalFormat);
 
ASSERT(ctx->Driver.CompressedTexImage1D);
(*ctx->Driver.CompressedTexImage1D)(ctx, target, level,
internalFormat, width, border,
imageSize, data,
texObj, texImage);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_1D) {
/* Proxy texture: check for errors and update proxy state */
GLenum error = compressed_texture_error_check(ctx, 1, target, level,
internalFormat, width, 1, 1, border, imageSize);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, GL_NONE, GL_NONE,
width, 1, 1, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.MaxTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy1D->Image[level]);
}
}
else {
/* store the teximage parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1,
border, internalFormat);
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage1D(target)");
return;
}
}
 
 
void
_mesa_CompressedTexImage2DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLint border, GLsizei imageSize,
const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target == GL_TEXTURE_2D ||
(ctx->Extensions.ARB_texture_cube_map &&
target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB &&
target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB)) {
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error = compressed_texture_error_check(ctx, 2, target, level,
internalFormat, width, height, 1, border, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexImage2D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
texObj->Image[level] = texImage;
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
 
_mesa_init_teximage_fields(ctx, target, texImage, width, height, 1,
border, internalFormat);
 
ASSERT(ctx->Driver.CompressedTexImage2D);
(*ctx->Driver.CompressedTexImage2D)(ctx, target, level,
internalFormat, width, height,
border, imageSize, data,
texObj, texImage);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_2D ||
(target == GL_PROXY_TEXTURE_CUBE_MAP_ARB &&
ctx->Extensions.ARB_texture_cube_map)) {
/* Proxy texture: check for errors and update proxy state */
GLenum error = compressed_texture_error_check(ctx, 2, target, level,
internalFormat, width, height, 1, border, imageSize);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, GL_NONE, GL_NONE,
width, height, 1, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
const GLint maxLevels = (target == GL_PROXY_TEXTURE_2D) ?
ctx->Const.MaxTextureLevels : ctx->Const.MaxCubeTextureLevels;
if (level >= 0 && level < maxLevels) {
clear_teximage_fields(ctx->Texture.Proxy2D->Image[level]);
}
}
else {
/* store the teximage parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage, width, height, 1,
border, internalFormat);
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage2D(target)");
return;
}
}
 
 
void
_mesa_CompressedTexImage3DARB(GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize, const GLvoid *data)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (target == GL_TEXTURE_3D) {
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error = compressed_texture_error_check(ctx, 3, target, level,
internalFormat, width, height, depth, border, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexImage3D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
 
if (!texImage) {
texImage = _mesa_alloc_texture_image();
texObj->Image[level] = texImage;
if (!texImage) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3D");
return;
}
}
else if (texImage->Data && !texImage->IsClientData) {
MESA_PBUFFER_FREE(texImage->Data);
}
texImage->Data = NULL;
 
_mesa_init_teximage_fields(ctx, target, texImage, width, height, depth,
border, internalFormat);
 
ASSERT(ctx->Driver.CompressedTexImage3D);
(*ctx->Driver.CompressedTexImage3D)(ctx, target, level,
internalFormat,
width, height, depth,
border, imageSize, data,
texObj, texImage);
 
/* state update */
texObj->Complete = GL_FALSE;
ctx->NewState |= _NEW_TEXTURE;
}
else if (target == GL_PROXY_TEXTURE_3D) {
/* Proxy texture: check for errors and update proxy state */
GLenum error = compressed_texture_error_check(ctx, 3, target, level,
internalFormat, width, height, depth, border, imageSize);
if (!error) {
ASSERT(ctx->Driver.TestProxyTexImage);
error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level,
internalFormat, GL_NONE, GL_NONE,
width, height, depth, border);
}
if (error) {
/* if error, clear all proxy texture image parameters */
if (level >= 0 && level < ctx->Const.Max3DTextureLevels) {
clear_teximage_fields(ctx->Texture.Proxy3D->Image[level]);
}
}
else {
/* store the teximage parameters */
struct gl_texture_unit *texUnit;
struct gl_texture_image *texImage;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
_mesa_init_teximage_fields(ctx, target, texImage, width, height,
depth, border, internalFormat);
}
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage3D(target)");
return;
}
}
 
 
void
_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format,
GLsizei imageSize, const GLvoid *data)
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
error = compressed_subtexture_error_check(ctx, 1, target, level,
xoffset, 0, 0, width, 1, 1, format, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexSubImage1D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if ((GLint) format != texImage->IntFormat) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glCompressedTexSubImage1D(format)");
return;
}
 
if ((width == 1 || width == 2) && (GLuint) width != texImage->Width) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage1D(width)");
return;
}
if (width == 0 || !data)
return; /* no-op, not an error */
 
if (ctx->Driver.CompressedTexSubImage1D) {
(*ctx->Driver.CompressedTexSubImage1D)(ctx, target, level,
xoffset, width,
format, imageSize, data,
texObj, texImage);
}
ctx->NewState |= _NEW_TEXTURE;
}
 
 
void
_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLsizei imageSize,
const GLvoid *data)
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
error = compressed_subtexture_error_check(ctx, 2, target, level,
xoffset, yoffset, 0, width, height, 1, format, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexSubImage2D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if ((GLint) format != texImage->IntFormat) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glCompressedTexSubImage2D(format)");
return;
}
 
if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) ||
((height == 1 || height == 2) && (GLuint) height != texImage->Height)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage2D(size)");
return;
}
if (width == 0 || height == 0 || !data)
return; /* no-op, not an error */
 
if (ctx->Driver.CompressedTexSubImage2D) {
(*ctx->Driver.CompressedTexSubImage2D)(ctx, target, level,
xoffset, yoffset, width, height,
format, imageSize, data,
texObj, texImage);
}
ctx->NewState |= _NEW_TEXTURE;
}
 
 
void
_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLint zoffset, GLsizei width,
GLsizei height, GLsizei depth, GLenum format,
GLsizei imageSize, const GLvoid *data)
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLenum error;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
error = compressed_subtexture_error_check(ctx, 3, target, level,
xoffset, yoffset, zoffset, width, height, depth, format, imageSize);
if (error) {
_mesa_error(ctx, error, "glCompressedTexSubImage2D");
return;
}
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
assert(texImage);
 
if ((GLint) format != texImage->IntFormat) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glCompressedTexSubImage3D(format)");
return;
}
 
if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) ||
((height == 1 || height == 2) && (GLuint) height != texImage->Height) ||
((depth == 1 || depth == 2) && (GLuint) depth != texImage->Depth)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage3D(size)");
return;
}
if (width == 0 || height == 0 || depth == 0 || !data)
return; /* no-op, not an error */
 
if (ctx->Driver.CompressedTexSubImage3D) {
(*ctx->Driver.CompressedTexSubImage3D)(ctx, target, level,
xoffset, yoffset, zoffset,
width, height, depth,
format, imageSize, data,
texObj, texImage);
}
ctx->NewState |= _NEW_TEXTURE;
}
 
 
void
_mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img)
{
const struct gl_texture_unit *texUnit;
const struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
GLint maxLevels;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
texObj = _mesa_select_tex_object(ctx, texUnit, target);
if (!texObj) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB");
return;
}
 
maxLevels = _mesa_max_texture_levels(ctx, target);
ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */
 
if (level < 0 || level >= maxLevels) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");
return;
}
 
if (is_proxy_target(target)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB(target)");
return;
}
 
texImage = _mesa_select_tex_image(ctx, texUnit, target, level);
if (!texImage) {
/* probably invalid mipmap level */
_mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");
return;
}
 
if (!texImage->IsCompressed) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetCompressedTexImageARB");
return;
}
 
if (!img)
return;
 
/* just memcpy, no pixelstore or pixel transfer */
MEMCPY(img, texImage->Data, texImage->CompressedSize);
}
/shark/trunk/ports/mesa/src/matrix.c
0,0 → 1,483
/* $Id: matrix.c,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* Matrix operations
*
* NOTES:
* 1. 4x4 transformation matrices are stored in memory in column major order.
* 2. Points/vertices are to be thought of as column vectors.
* 3. Transformation of a point p by a matrix M is: p' = M * p
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "buffers.h"
#include "context.h"
#include "enums.h"
#include "macros.h"
#include "matrix.h"
#include "mmath.h"
#include "mtypes.h"
#include "math/m_matrix.h"
 
 
 
void
_mesa_Frustum( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (nearval <= 0.0 ||
farval <= 0.0 ||
nearval == farval ||
left == right ||
top == bottom)
{
_mesa_error( ctx, GL_INVALID_VALUE, "glFrustum" );
return;
}
 
_math_matrix_frustum( ctx->CurrentStack->Top,
(GLfloat) left, (GLfloat) right,
(GLfloat) bottom, (GLfloat) top,
(GLfloat) nearval, (GLfloat) farval );
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_Ortho( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glFrustum(%f, %f, %f, %f, %f, %f)\n",
left, right, bottom, top, nearval, farval);
 
if (left == right ||
bottom == top ||
nearval == farval)
{
_mesa_error( ctx, GL_INVALID_VALUE, "glOrtho" );
return;
}
 
_math_matrix_ortho( ctx->CurrentStack->Top,
(GLfloat) left, (GLfloat) right,
(GLfloat) bottom, (GLfloat) top,
(GLfloat) nearval, (GLfloat) farval );
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_MatrixMode( GLenum mode )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (ctx->Transform.MatrixMode == mode && mode != GL_TEXTURE)
return;
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
 
switch (mode) {
case GL_MODELVIEW:
ctx->CurrentStack = &ctx->ModelviewMatrixStack;
break;
case GL_PROJECTION:
ctx->CurrentStack = &ctx->ProjectionMatrixStack;
break;
case GL_TEXTURE:
ctx->CurrentStack = &ctx->TextureMatrixStack[ctx->Texture.CurrentUnit];
break;
case GL_COLOR:
ctx->CurrentStack = &ctx->ColorMatrixStack;
break;
case GL_MATRIX0_NV:
case GL_MATRIX1_NV:
case GL_MATRIX2_NV:
case GL_MATRIX3_NV:
case GL_MATRIX4_NV:
case GL_MATRIX5_NV:
case GL_MATRIX6_NV:
case GL_MATRIX7_NV:
if (!ctx->Extensions.NV_vertex_program) {
_mesa_error( ctx, GL_INVALID_ENUM, "glMatrixMode" );
return;
}
ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glMatrixMode" );
return;
}
 
ctx->Transform.MatrixMode = mode;
}
 
 
 
void
_mesa_PushMatrix( void )
{
GET_CURRENT_CONTEXT(ctx);
struct matrix_stack *stack = ctx->CurrentStack;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glPushMatrix %s\n",
_mesa_lookup_enum_by_nr(ctx->Transform.MatrixMode));
 
if (stack->Depth + 1 >= stack->MaxDepth) {
_mesa_error( ctx, GL_STACK_OVERFLOW, "glPushMatrix" );
return;
}
_math_matrix_copy( &stack->Stack[stack->Depth + 1],
&stack->Stack[stack->Depth] );
stack->Depth++;
stack->Top = &(stack->Stack[stack->Depth]);
ctx->NewState |= stack->DirtyFlag;
}
 
 
 
void
_mesa_PopMatrix( void )
{
GET_CURRENT_CONTEXT(ctx);
struct matrix_stack *stack = ctx->CurrentStack;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glPopMatrix %s\n",
_mesa_lookup_enum_by_nr(ctx->Transform.MatrixMode));
 
if (stack->Depth == 0) {
_mesa_error( ctx, GL_STACK_UNDERFLOW, "glPopMatrix" );
return;
}
stack->Depth--;
stack->Top = &(stack->Stack[stack->Depth]);
ctx->NewState |= stack->DirtyFlag;
}
 
 
 
void
_mesa_LoadIdentity( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glLoadIdentity()");
 
_math_matrix_set_identity( ctx->CurrentStack->Top );
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_LoadMatrixf( const GLfloat *m )
{
GET_CURRENT_CONTEXT(ctx);
if (!m) return;
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx,
"glLoadMatrix(%f %f %f %f, %f %f %f %f, %f %f %f %f, %f %f %f %f\n",
m[0], m[4], m[8], m[12],
m[1], m[5], m[9], m[13],
m[2], m[6], m[10], m[14],
m[3], m[7], m[11], m[15]);
 
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
_math_matrix_loadf( ctx->CurrentStack->Top, m );
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_LoadMatrixd( const GLdouble *m )
{
GLint i;
GLfloat f[16];
if (!m) return;
for (i = 0; i < 16; i++)
f[i] = (GLfloat) m[i];
_mesa_LoadMatrixf(f);
}
 
 
 
/*
* Multiply the active matrix by an arbitary matrix.
*/
void
_mesa_MultMatrixf( const GLfloat *m )
{
GET_CURRENT_CONTEXT(ctx);
if (!m) return;
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx,
"glMultMatrix(%f %f %f %f, %f %f %f %f, %f %f %f %f, %f %f %f %f\n",
m[0], m[4], m[8], m[12],
m[1], m[5], m[9], m[13],
m[2], m[6], m[10], m[14],
m[3], m[7], m[11], m[15]);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
_math_matrix_mul_floats( ctx->CurrentStack->Top, m );
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
/*
* Multiply the active matrix by an arbitary matrix.
*/
void
_mesa_MultMatrixd( const GLdouble *m )
{
GLint i;
GLfloat f[16];
if (!m) return;
for (i = 0; i < 16; i++)
f[i] = (GLfloat) m[i];
_mesa_MultMatrixf( f );
}
 
 
 
 
/*
* Execute a glRotate call
*/
void
_mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
if (angle != 0.0F) {
_math_matrix_rotate( ctx->CurrentStack->Top, angle, x, y, z);
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
}
 
void
_mesa_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z )
{
_mesa_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
/*
* Execute a glScale call
*/
void
_mesa_Scalef( GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
_math_matrix_scale( ctx->CurrentStack->Top, x, y, z);
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_Scaled( GLdouble x, GLdouble y, GLdouble z )
{
_mesa_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
/*
* Execute a glTranslate call
*/
void
_mesa_Translatef( GLfloat x, GLfloat y, GLfloat z )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
_math_matrix_translate( ctx->CurrentStack->Top, x, y, z);
ctx->NewState |= ctx->CurrentStack->DirtyFlag;
}
 
 
void
_mesa_Translated( GLdouble x, GLdouble y, GLdouble z )
{
_mesa_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z);
}
 
 
void
_mesa_LoadTransposeMatrixfARB( const GLfloat *m )
{
GLfloat tm[16];
if (!m) return;
_math_transposef(tm, m);
_mesa_LoadMatrixf(tm);
}
 
 
void
_mesa_LoadTransposeMatrixdARB( const GLdouble *m )
{
GLfloat tm[16];
if (!m) return;
_math_transposefd(tm, m);
_mesa_LoadMatrixf(tm);
}
 
 
void
_mesa_MultTransposeMatrixfARB( const GLfloat *m )
{
GLfloat tm[16];
if (!m) return;
_math_transposef(tm, m);
_mesa_MultMatrixf(tm);
}
 
 
void
_mesa_MultTransposeMatrixdARB( const GLdouble *m )
{
GLfloat tm[16];
if (!m) return;
_math_transposefd(tm, m);
_mesa_MultMatrixf(tm);
}
 
 
/*
* Called via glViewport or display list execution.
*/
void
_mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
_mesa_set_viewport(ctx, x, y, width, height);
}
 
 
/*
* Define a new viewport and reallocate auxillary buffers if the size of
* the window (color buffer) has changed.
*/
void
_mesa_set_viewport( GLcontext *ctx, GLint x, GLint y,
GLsizei width, GLsizei height )
{
const GLfloat n = ctx->Viewport.Near;
const GLfloat f = ctx->Viewport.Far;
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glViewport %d %d %d %d\n", x, y, width, height);
 
if (width < 0 || height < 0) {
_mesa_error( ctx, GL_INVALID_VALUE,
"glViewport(%d, %d, %d, %d)", x, y, width, height );
return;
}
 
/* clamp width, and height to implementation dependent range */
width = CLAMP( width, 1, MAX_WIDTH );
height = CLAMP( height, 1, MAX_HEIGHT );
 
/* Save viewport */
ctx->Viewport.X = x;
ctx->Viewport.Width = width;
ctx->Viewport.Y = y;
ctx->Viewport.Height = height;
 
/* compute scale and bias values :: This is really driver-specific
* and should be maintained elsewhere if at all.
*/
ctx->Viewport._WindowMap.m[MAT_SX] = (GLfloat) width / 2.0F;
ctx->Viewport._WindowMap.m[MAT_TX] = ctx->Viewport._WindowMap.m[MAT_SX] + x;
ctx->Viewport._WindowMap.m[MAT_SY] = (GLfloat) height / 2.0F;
ctx->Viewport._WindowMap.m[MAT_TY] = ctx->Viewport._WindowMap.m[MAT_SY] + y;
ctx->Viewport._WindowMap.m[MAT_SZ] = ctx->DepthMaxF * ((f - n) / 2.0F);
ctx->Viewport._WindowMap.m[MAT_TZ] = ctx->DepthMaxF * ((f - n) / 2.0F + n);
ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
ctx->NewState |= _NEW_VIEWPORT;
 
/* Check if window/buffer has been resized and if so, reallocate the
* ancillary buffers.
*/
_mesa_ResizeBuffersMESA();
 
if (ctx->Driver.Viewport) {
(*ctx->Driver.Viewport)( ctx, x, y, width, height );
}
}
 
 
 
void
_mesa_DepthRange( GLclampd nearval, GLclampd farval )
{
/*
* nearval - specifies mapping of the near clipping plane to window
* coordinates, default is 0
* farval - specifies mapping of the far clipping plane to window
* coordinates, default is 1
*
* After clipping and div by w, z coords are in -1.0 to 1.0,
* corresponding to near and far clipping planes. glDepthRange
* specifies a linear mapping of the normalized z coords in
* this range to window z coords.
*/
GLfloat n, f;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (MESA_VERBOSE&VERBOSE_API)
_mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
 
n = (GLfloat) CLAMP( nearval, 0.0, 1.0 );
f = (GLfloat) CLAMP( farval, 0.0, 1.0 );
 
ctx->Viewport.Near = n;
ctx->Viewport.Far = f;
ctx->Viewport._WindowMap.m[MAT_SZ] = ctx->DepthMaxF * ((f - n) / 2.0F);
ctx->Viewport._WindowMap.m[MAT_TZ] = ctx->DepthMaxF * ((f - n) / 2.0F + n);
ctx->NewState |= _NEW_VIEWPORT;
 
if (ctx->Driver.DepthRange) {
(*ctx->Driver.DepthRange)( ctx, nearval, farval );
}
}
/shark/trunk/ports/mesa/src/colortab.c
0,0 → 1,1224
/* $Id: colortab.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "colortab.h"
#include "context.h"
#include "image.h"
#include "macros.h"
#include "mmath.h"
#include "state.h"
 
 
/*
* Given an internalFormat token passed to glColorTable,
* return the corresponding base format.
* Return -1 if invalid token.
*/
static GLint
base_colortab_format( GLenum format )
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return GL_ALPHA;
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return GL_LUMINANCE_ALPHA;
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return GL_INTENSITY;
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return GL_RGB;
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
default:
return -1; /* error */
}
}
 
 
void
_mesa_init_colortable( struct gl_color_table *p )
{
p->FloatTable = GL_FALSE;
p->Table = NULL;
p->Size = 0;
p->IntFormat = GL_RGBA;
}
 
 
 
void
_mesa_free_colortable_data( struct gl_color_table *p )
{
if (p->Table) {
FREE(p->Table);
p->Table = NULL;
}
}
 
 
/*
* Examine table's format and set the component sizes accordingly.
*/
static void
set_component_sizes( struct gl_color_table *table )
{
switch (table->Format) {
case GL_ALPHA:
table->RedSize = 0;
table->GreenSize = 0;
table->BlueSize = 0;
table->AlphaSize = CHAN_BITS;
table->IntensitySize = 0;
table->LuminanceSize = 0;
break;
case GL_LUMINANCE:
table->RedSize = 0;
table->GreenSize = 0;
table->BlueSize = 0;
table->AlphaSize = 0;
table->IntensitySize = 0;
table->LuminanceSize = CHAN_BITS;
break;
case GL_LUMINANCE_ALPHA:
table->RedSize = 0;
table->GreenSize = 0;
table->BlueSize = 0;
table->AlphaSize = CHAN_BITS;
table->IntensitySize = 0;
table->LuminanceSize = CHAN_BITS;
break;
case GL_INTENSITY:
table->RedSize = 0;
table->GreenSize = 0;
table->BlueSize = 0;
table->AlphaSize = 0;
table->IntensitySize = CHAN_BITS;
table->LuminanceSize = 0;
break;
case GL_RGB:
table->RedSize = CHAN_BITS;
table->GreenSize = CHAN_BITS;
table->BlueSize = CHAN_BITS;
table->AlphaSize = 0;
table->IntensitySize = 0;
table->LuminanceSize = 0;
break;
case GL_RGBA:
table->RedSize = CHAN_BITS;
table->GreenSize = CHAN_BITS;
table->BlueSize = CHAN_BITS;
table->AlphaSize = CHAN_BITS;
table->IntensitySize = 0;
table->LuminanceSize = 0;
break;
default:
_mesa_problem(NULL, "unexpected format in set_component_sizes");
}
}
 
 
 
void
_mesa_ColorTable( GLenum target, GLenum internalFormat,
GLsizei width, GLenum format, GLenum type,
const GLvoid *data )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_object *texObj = NULL;
struct gl_color_table *table = NULL;
GLboolean proxy = GL_FALSE;
GLint baseFormat;
GLfloat rScale = 1.0, gScale = 1.0, bScale = 1.0, aScale = 1.0;
GLfloat rBias = 0.0, gBias = 0.0, bBias = 0.0, aBias = 0.0;
GLboolean floatTable = GL_FALSE;
GLint comps;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */
 
switch (target) {
case GL_TEXTURE_1D:
texObj = texUnit->Current1D;
table = &texObj->Palette;
break;
case GL_TEXTURE_2D:
texObj = texUnit->Current2D;
table = &texObj->Palette;
break;
case GL_TEXTURE_3D:
texObj = texUnit->Current3D;
table = &texObj->Palette;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(target)");
return;
}
texObj = texUnit->CurrentCubeMap;
table = &texObj->Palette;
break;
case GL_PROXY_TEXTURE_1D:
texObj = ctx->Texture.Proxy1D;
table = &texObj->Palette;
proxy = GL_TRUE;
break;
case GL_PROXY_TEXTURE_2D:
texObj = ctx->Texture.Proxy2D;
table = &texObj->Palette;
proxy = GL_TRUE;
break;
case GL_PROXY_TEXTURE_3D:
texObj = ctx->Texture.Proxy3D;
table = &texObj->Palette;
proxy = GL_TRUE;
break;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(target)");
return;
}
texObj = ctx->Texture.ProxyCubeMap;
table = &texObj->Palette;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
table = &ctx->Texture.Palette;
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
floatTable = GL_TRUE;
rScale = ctx->Pixel.ColorTableScale[0];
gScale = ctx->Pixel.ColorTableScale[1];
bScale = ctx->Pixel.ColorTableScale[2];
aScale = ctx->Pixel.ColorTableScale[3];
rBias = ctx->Pixel.ColorTableBias[0];
gBias = ctx->Pixel.ColorTableBias[1];
bBias = ctx->Pixel.ColorTableBias[2];
aBias = ctx->Pixel.ColorTableBias[3];
break;
case GL_PROXY_COLOR_TABLE:
table = &ctx->ProxyColorTable;
proxy = GL_TRUE;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
floatTable = GL_TRUE;
rScale = ctx->Pixel.PCCTscale[0];
gScale = ctx->Pixel.PCCTscale[1];
bScale = ctx->Pixel.PCCTscale[2];
aScale = ctx->Pixel.PCCTscale[3];
rBias = ctx->Pixel.PCCTbias[0];
gBias = ctx->Pixel.PCCTbias[1];
bBias = ctx->Pixel.PCCTbias[2];
aBias = ctx->Pixel.PCCTbias[3];
break;
case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->ProxyPostConvolutionColorTable;
proxy = GL_TRUE;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
floatTable = GL_TRUE;
rScale = ctx->Pixel.PCMCTscale[0];
gScale = ctx->Pixel.PCMCTscale[1];
bScale = ctx->Pixel.PCMCTscale[2];
aScale = ctx->Pixel.PCMCTscale[3];
rBias = ctx->Pixel.PCMCTbias[0];
gBias = ctx->Pixel.PCMCTbias[1];
bBias = ctx->Pixel.PCMCTbias[2];
aBias = ctx->Pixel.PCMCTbias[3];
break;
case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->ProxyPostColorMatrixColorTable;
proxy = GL_TRUE;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(target)");
return;
}
 
assert(table);
 
if (!_mesa_is_legal_format_and_type(format, type) ||
format == GL_INTENSITY) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glColorTable(format or type)");
return;
}
 
baseFormat = base_colortab_format(internalFormat);
if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(internalFormat)");
return;
}
 
if (width < 0 || (width != 0 && _mesa_bitcount(width) != 1)) {
/* error */
if (proxy) {
table->Size = 0;
table->IntFormat = (GLenum) 0;
table->Format = (GLenum) 0;
}
else {
_mesa_error(ctx, GL_INVALID_VALUE, "glColorTable(width=%d)", width);
}
return;
}
 
if (width > (GLsizei) ctx->Const.MaxColorTableSize) {
if (proxy) {
table->Size = 0;
table->IntFormat = (GLenum) 0;
table->Format = (GLenum) 0;
}
else {
_mesa_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)");
}
return;
}
 
table->Size = width;
table->IntFormat = internalFormat;
table->Format = (GLenum) baseFormat;
set_component_sizes(table);
 
comps = _mesa_components_in_format(table->Format);
assert(comps > 0); /* error should have been caught sooner */
 
if (!proxy) {
/* free old table, if any */
if (table->Table) {
FREE(table->Table);
table->Table = NULL;
}
if (width > 0) {
if (floatTable) {
GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4];
GLfloat *tableF;
GLint i;
 
_mesa_unpack_float_color_span(ctx, width, table->Format,
tempTab, /* dest */
format, type, data, &ctx->Unpack,
0, GL_FALSE);
 
table->FloatTable = GL_TRUE;
table->Table = MALLOC(comps * width * sizeof(GLfloat));
if (!table->Table) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
return;
}
 
tableF = (GLfloat *) table->Table;
 
switch (table->Format) {
case GL_INTENSITY:
for (i = 0; i < width; i++) {
tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F);
}
break;
case GL_LUMINANCE:
for (i = 0; i < width; i++) {
tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F);
}
break;
case GL_ALPHA:
for (i = 0; i < width; i++) {
tableF[i] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F);
}
break;
case GL_LUMINANCE_ALPHA:
for (i = 0; i < width; i++) {
tableF[i*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F);
tableF[i*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F);
}
break;
case GL_RGB:
for (i = 0; i < width; i++) {
tableF[i*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F);
tableF[i*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F);
tableF[i*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F);
}
break;
case GL_RGBA:
for (i = 0; i < width; i++) {
tableF[i*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F);
tableF[i*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F);
tableF[i*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F);
tableF[i*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F);
}
break;
default:
_mesa_problem(ctx, "Bad format in _mesa_ColorTable");
return;
}
}
else {
/* store GLchan table */
table->FloatTable = GL_FALSE;
table->Table = MALLOC(comps * width * sizeof(GLchan));
if (!table->Table) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
return;
}
_mesa_unpack_chan_color_span(ctx, width, table->Format,
(GLchan *) table->Table, /* dest */
format, type, data,
&ctx->Unpack, 0);
} /* floatTable */
} /* width > 0 */
} /* proxy */
 
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
/* texture object palette, texObj==NULL means the shared palette */
if (ctx->Driver.UpdateTexturePalette) {
(*ctx->Driver.UpdateTexturePalette)( ctx, texObj );
}
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
 
void
_mesa_ColorSubTable( GLenum target, GLsizei start,
GLsizei count, GLenum format, GLenum type,
const GLvoid *data )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_texture_object *texObj = NULL;
struct gl_color_table *table = NULL;
GLfloat rScale = 1.0, gScale = 1.0, bScale = 1.0, aScale = 1.0;
GLfloat rBias = 0.0, gBias = 0.0, bBias = 0.0, aBias = 0.0;
GLint comps;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_TEXTURE_1D:
texObj = texUnit->Current1D;
table = &texObj->Palette;
break;
case GL_TEXTURE_2D:
texObj = texUnit->Current2D;
table = &texObj->Palette;
break;
case GL_TEXTURE_3D:
texObj = texUnit->Current3D;
table = &texObj->Palette;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorSubTable(target)");
return;
}
texObj = texUnit->CurrentCubeMap;
table = &texObj->Palette;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
table = &ctx->Texture.Palette;
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
rScale = ctx->Pixel.ColorTableScale[0];
gScale = ctx->Pixel.ColorTableScale[1];
bScale = ctx->Pixel.ColorTableScale[2];
aScale = ctx->Pixel.ColorTableScale[3];
rBias = ctx->Pixel.ColorTableBias[0];
gBias = ctx->Pixel.ColorTableBias[1];
bBias = ctx->Pixel.ColorTableBias[2];
aBias = ctx->Pixel.ColorTableBias[3];
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
rScale = ctx->Pixel.PCCTscale[0];
gScale = ctx->Pixel.PCCTscale[1];
bScale = ctx->Pixel.PCCTscale[2];
aScale = ctx->Pixel.PCCTscale[3];
rBias = ctx->Pixel.PCCTbias[0];
gBias = ctx->Pixel.PCCTbias[1];
bBias = ctx->Pixel.PCCTbias[2];
aBias = ctx->Pixel.PCCTbias[3];
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
rScale = ctx->Pixel.PCMCTscale[0];
gScale = ctx->Pixel.PCMCTscale[1];
bScale = ctx->Pixel.PCMCTscale[2];
aScale = ctx->Pixel.PCMCTscale[3];
rBias = ctx->Pixel.PCMCTbias[0];
gBias = ctx->Pixel.PCMCTbias[1];
bBias = ctx->Pixel.PCMCTbias[2];
aBias = ctx->Pixel.PCMCTbias[3];
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glColorSubTable(target)");
return;
}
 
assert(table);
 
if (!_mesa_is_legal_format_and_type(format, type) ||
format == GL_INTENSITY) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glColorSubTable(format or type)");
return;
}
 
if (count < 1) {
_mesa_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)");
return;
}
 
comps = _mesa_components_in_format(table->Format);
assert(comps > 0); /* error should have been caught sooner */
 
if (start + count > (GLint) table->Size) {
_mesa_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)");
return;
}
 
if (!table->Table) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorSubTable");
return;
}
 
if (!table->FloatTable) {
GLchan *dest = (GLchan *) table->Table + start * comps * sizeof(GLchan);
_mesa_unpack_chan_color_span(ctx, count, table->Format, dest,
format, type, data, &ctx->Unpack, 0);
}
else {
GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4];
GLfloat *tableF;
GLint i;
 
ASSERT(table->FloatTable);
 
_mesa_unpack_float_color_span(ctx, count, table->Format,
tempTab, /* dest */
format, type, data, &ctx->Unpack,
0, GL_FALSE);
 
tableF = (GLfloat *) table->Table;
 
switch (table->Format) {
case GL_INTENSITY:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F);
}
break;
case GL_LUMINANCE:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F);
}
break;
case GL_ALPHA:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F);
}
break;
case GL_LUMINANCE_ALPHA:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F);
tableF[j*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F);
}
break;
case GL_RGB:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F);
tableF[j*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F);
tableF[j*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F);
}
break;
case GL_RGBA:
for (i = 0; i < count; i++) {
GLuint j = start + i;
tableF[j*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F);
tableF[j*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F);
tableF[j*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F);
tableF[j*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F);
}
break;
default:
_mesa_problem(ctx, "Bad format in _mesa_ColorSubTable");
return;
}
}
 
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
/* per-texture object palette */
if (ctx->Driver.UpdateTexturePalette) {
(*ctx->Driver.UpdateTexturePalette)( ctx, texObj );
}
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
 
/* XXX not tested */
void
_mesa_CopyColorTable(GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
/* Select buffer to read from */
ctx->Driver.CopyColorTable( ctx, target, internalformat, x, y, width );
}
 
 
 
/* XXX not tested */
void
_mesa_CopyColorSubTable(GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
ctx->Driver.CopyColorSubTable( ctx, target, start, x, y, width );
}
 
 
 
void
_mesa_GetColorTable( GLenum target, GLenum format,
GLenum type, GLvoid *data )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_color_table *table = NULL;
GLchan rgba[MAX_COLOR_TABLE_SIZE][4];
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (ctx->NewState) {
_mesa_update_state(ctx);
}
 
switch (target) {
case GL_TEXTURE_1D:
table = &texUnit->Current1D->Palette;
break;
case GL_TEXTURE_2D:
table = &texUnit->Current2D->Palette;
break;
case GL_TEXTURE_3D:
table = &texUnit->Current3D->Palette;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");
return;
}
table = &texUnit->CurrentCubeMap->Palette;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
table = &ctx->Texture.Palette;
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");
return;
}
 
assert(table);
 
switch (table->Format) {
case GL_ALPHA:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = 0;
rgba[i][GCOMP] = 0;
rgba[i][BCOMP] = 0;
rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = 0;
rgba[i][GCOMP] = 0;
rgba[i][BCOMP] = 0;
rgba[i][ACOMP] = tableUB[i];
}
}
break;
case GL_LUMINANCE:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][ACOMP] = CHAN_MAX;
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = tableUB[i];
rgba[i][GCOMP] = tableUB[i];
rgba[i][BCOMP] = tableUB[i];
rgba[i][ACOMP] = CHAN_MAX;
}
}
break;
case GL_LUMINANCE_ALPHA:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
rgba[i][GCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
rgba[i][BCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
rgba[i][ACOMP] = IROUND_POS(tableF[i*2+1] * CHAN_MAXF);
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = tableUB[i*2+0];
rgba[i][GCOMP] = tableUB[i*2+0];
rgba[i][BCOMP] = tableUB[i*2+0];
rgba[i][ACOMP] = tableUB[i*2+1];
}
}
break;
case GL_INTENSITY:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = tableUB[i];
rgba[i][GCOMP] = tableUB[i];
rgba[i][BCOMP] = tableUB[i];
rgba[i][ACOMP] = tableUB[i];
}
}
break;
case GL_RGB:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = IROUND_POS(tableF[i*3+0] * CHAN_MAXF);
rgba[i][GCOMP] = IROUND_POS(tableF[i*3+1] * CHAN_MAXF);
rgba[i][BCOMP] = IROUND_POS(tableF[i*3+2] * CHAN_MAXF);
rgba[i][ACOMP] = CHAN_MAX;
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = tableUB[i*3+0];
rgba[i][GCOMP] = tableUB[i*3+1];
rgba[i][BCOMP] = tableUB[i*3+2];
rgba[i][ACOMP] = CHAN_MAX;
}
}
break;
case GL_RGBA:
if (table->FloatTable) {
const GLfloat *tableF = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = IROUND_POS(tableF[i*4+0] * CHAN_MAXF);
rgba[i][GCOMP] = IROUND_POS(tableF[i*4+1] * CHAN_MAXF);
rgba[i][BCOMP] = IROUND_POS(tableF[i*4+2] * CHAN_MAXF);
rgba[i][ACOMP] = IROUND_POS(tableF[i*4+3] * CHAN_MAXF);
}
}
else {
const GLchan *tableUB = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = tableUB[i*4+0];
rgba[i][GCOMP] = tableUB[i*4+1];
rgba[i][BCOMP] = tableUB[i*4+2];
rgba[i][ACOMP] = tableUB[i*4+3];
}
}
break;
default:
_mesa_problem(ctx, "bad table format in glGetColorTable");
return;
}
 
_mesa_pack_rgba_span(ctx, table->Size, (const GLchan (*)[4]) rgba,
format, type, data, &ctx->Pack, GL_FALSE);
}
 
 
 
void
_mesa_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
switch (target) {
case GL_COLOR_TABLE_SGI:
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
ctx->Pixel.ColorTableScale[0] = params[0];
ctx->Pixel.ColorTableScale[1] = params[1];
ctx->Pixel.ColorTableScale[2] = params[2];
ctx->Pixel.ColorTableScale[3] = params[3];
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
ctx->Pixel.ColorTableBias[0] = params[0];
ctx->Pixel.ColorTableBias[1] = params[1];
ctx->Pixel.ColorTableBias[2] = params[2];
ctx->Pixel.ColorTableBias[3] = params[3];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTableParameterfv(pname)");
return;
}
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
ctx->Pixel.PCCTscale[0] = params[0];
ctx->Pixel.PCCTscale[1] = params[1];
ctx->Pixel.PCCTscale[2] = params[2];
ctx->Pixel.PCCTscale[3] = params[3];
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
ctx->Pixel.PCCTbias[0] = params[0];
ctx->Pixel.PCCTbias[1] = params[1];
ctx->Pixel.PCCTbias[2] = params[2];
ctx->Pixel.PCCTbias[3] = params[3];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTableParameterfv(pname)");
return;
}
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
ctx->Pixel.PCMCTscale[0] = params[0];
ctx->Pixel.PCMCTscale[1] = params[1];
ctx->Pixel.PCMCTscale[2] = params[2];
ctx->Pixel.PCMCTscale[3] = params[3];
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
ctx->Pixel.PCMCTbias[0] = params[0];
ctx->Pixel.PCMCTbias[1] = params[1];
ctx->Pixel.PCMCTbias[2] = params[2];
ctx->Pixel.PCMCTbias[3] = params[3];
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTableParameterfv(pname)");
return;
}
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glColorTableParameter(target)");
return;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
 
void
_mesa_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params)
{
GLfloat fparams[4];
if (pname == GL_COLOR_TABLE_SGI ||
pname == GL_POST_CONVOLUTION_COLOR_TABLE_SGI ||
pname == GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI) {
/* four values */
fparams[0] = (GLfloat) params[0];
fparams[1] = (GLfloat) params[1];
fparams[2] = (GLfloat) params[2];
fparams[3] = (GLfloat) params[3];
}
else {
/* one values */
fparams[0] = (GLfloat) params[0];
}
_mesa_ColorTableParameterfv(target, pname, fparams);
}
 
 
 
void
_mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_color_table *table = NULL;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (target) {
case GL_TEXTURE_1D:
table = &texUnit->Current1D->Palette;
break;
case GL_TEXTURE_2D:
table = &texUnit->Current2D->Palette;
break;
case GL_TEXTURE_3D:
table = &texUnit->Current3D->Palette;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetColorTableParameterfv(target)");
return;
}
table = &texUnit->CurrentCubeMap->Palette;
break;
case GL_PROXY_TEXTURE_1D:
table = &ctx->Texture.Proxy1D->Palette;
break;
case GL_PROXY_TEXTURE_2D:
table = &ctx->Texture.Proxy2D->Palette;
break;
case GL_PROXY_TEXTURE_3D:
table = &ctx->Texture.Proxy3D->Palette;
break;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetColorTableParameterfv(target)");
return;
}
table = &ctx->Texture.ProxyCubeMap->Palette;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
table = &ctx->Texture.Palette;
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = ctx->Pixel.ColorTableScale[0];
params[1] = ctx->Pixel.ColorTableScale[1];
params[2] = ctx->Pixel.ColorTableScale[2];
params[3] = ctx->Pixel.ColorTableScale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = ctx->Pixel.ColorTableBias[0];
params[1] = ctx->Pixel.ColorTableBias[1];
params[2] = ctx->Pixel.ColorTableBias[2];
params[3] = ctx->Pixel.ColorTableBias[3];
return;
}
break;
case GL_PROXY_COLOR_TABLE:
table = &ctx->ProxyColorTable;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = ctx->Pixel.PCCTscale[0];
params[1] = ctx->Pixel.PCCTscale[1];
params[2] = ctx->Pixel.PCCTscale[2];
params[3] = ctx->Pixel.PCCTscale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = ctx->Pixel.PCCTbias[0];
params[1] = ctx->Pixel.PCCTbias[1];
params[2] = ctx->Pixel.PCCTbias[2];
params[3] = ctx->Pixel.PCCTbias[3];
return;
}
break;
case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->ProxyPostConvolutionColorTable;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = ctx->Pixel.PCMCTscale[0];
params[1] = ctx->Pixel.PCMCTscale[1];
params[2] = ctx->Pixel.PCMCTscale[2];
params[3] = ctx->Pixel.PCMCTscale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = ctx->Pixel.PCMCTbias[0];
params[1] = ctx->Pixel.PCMCTbias[1];
params[2] = ctx->Pixel.PCMCTbias[2];
params[3] = ctx->Pixel.PCMCTbias[3];
return;
}
break;
case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->ProxyPostColorMatrixColorTable;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameterfv(target)");
return;
}
 
assert(table);
 
switch (pname) {
case GL_COLOR_TABLE_FORMAT:
*params = (GLfloat) table->IntFormat;
break;
case GL_COLOR_TABLE_WIDTH:
*params = (GLfloat) table->Size;
break;
case GL_COLOR_TABLE_RED_SIZE:
*params = table->RedSize;
break;
case GL_COLOR_TABLE_GREEN_SIZE:
*params = table->GreenSize;
break;
case GL_COLOR_TABLE_BLUE_SIZE:
*params = table->BlueSize;
break;
case GL_COLOR_TABLE_ALPHA_SIZE:
*params = table->AlphaSize;
break;
case GL_COLOR_TABLE_LUMINANCE_SIZE:
*params = table->LuminanceSize;
break;
case GL_COLOR_TABLE_INTENSITY_SIZE:
*params = table->IntensitySize;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameterfv(pname)" );
return;
}
}
 
 
 
void
_mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_color_table *table = NULL;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (target) {
case GL_TEXTURE_1D:
table = &texUnit->Current1D->Palette;
break;
case GL_TEXTURE_2D:
table = &texUnit->Current2D->Palette;
break;
case GL_TEXTURE_3D:
table = &texUnit->Current3D->Palette;
break;
case GL_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetColorTableParameteriv(target)");
return;
}
table = &texUnit->CurrentCubeMap->Palette;
break;
case GL_PROXY_TEXTURE_1D:
table = &ctx->Texture.Proxy1D->Palette;
break;
case GL_PROXY_TEXTURE_2D:
table = &ctx->Texture.Proxy2D->Palette;
break;
case GL_PROXY_TEXTURE_3D:
table = &ctx->Texture.Proxy3D->Palette;
break;
case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
if (!ctx->Extensions.ARB_texture_cube_map) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glGetColorTableParameteriv(target)");
return;
}
table = &ctx->Texture.ProxyCubeMap->Palette;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
table = &ctx->Texture.Palette;
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = (GLint) ctx->Pixel.ColorTableScale[0];
params[1] = (GLint) ctx->Pixel.ColorTableScale[1];
params[2] = (GLint) ctx->Pixel.ColorTableScale[2];
params[3] = (GLint) ctx->Pixel.ColorTableScale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = (GLint) ctx->Pixel.ColorTableBias[0];
params[1] = (GLint) ctx->Pixel.ColorTableBias[1];
params[2] = (GLint) ctx->Pixel.ColorTableBias[2];
params[3] = (GLint) ctx->Pixel.ColorTableBias[3];
return;
}
break;
case GL_PROXY_COLOR_TABLE:
table = &ctx->ProxyColorTable;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = (GLint) ctx->Pixel.PCCTscale[0];
params[1] = (GLint) ctx->Pixel.PCCTscale[1];
params[2] = (GLint) ctx->Pixel.PCCTscale[2];
params[3] = (GLint) ctx->Pixel.PCCTscale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = (GLint) ctx->Pixel.PCCTbias[0];
params[1] = (GLint) ctx->Pixel.PCCTbias[1];
params[2] = (GLint) ctx->Pixel.PCCTbias[2];
params[3] = (GLint) ctx->Pixel.PCCTbias[3];
return;
}
break;
case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->ProxyPostConvolutionColorTable;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
if (pname == GL_COLOR_TABLE_SCALE_SGI) {
params[0] = (GLint) ctx->Pixel.PCMCTscale[0];
params[1] = (GLint) ctx->Pixel.PCMCTscale[1];
params[2] = (GLint) ctx->Pixel.PCMCTscale[2];
params[3] = (GLint) ctx->Pixel.PCMCTscale[3];
return;
}
else if (pname == GL_COLOR_TABLE_BIAS_SGI) {
params[0] = (GLint) ctx->Pixel.PCMCTbias[0];
params[1] = (GLint) ctx->Pixel.PCMCTbias[1];
params[2] = (GLint) ctx->Pixel.PCMCTbias[2];
params[3] = (GLint) ctx->Pixel.PCMCTbias[3];
return;
}
break;
case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->ProxyPostColorMatrixColorTable;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameteriv(target)");
return;
}
 
assert(table);
 
switch (pname) {
case GL_COLOR_TABLE_FORMAT:
*params = table->IntFormat;
break;
case GL_COLOR_TABLE_WIDTH:
*params = table->Size;
break;
case GL_COLOR_TABLE_RED_SIZE:
*params = table->RedSize;
break;
case GL_COLOR_TABLE_GREEN_SIZE:
*params = table->GreenSize;
break;
case GL_COLOR_TABLE_BLUE_SIZE:
*params = table->BlueSize;
break;
case GL_COLOR_TABLE_ALPHA_SIZE:
*params = table->AlphaSize;
break;
case GL_COLOR_TABLE_LUMINANCE_SIZE:
*params = table->LuminanceSize;
break;
case GL_COLOR_TABLE_INTENSITY_SIZE:
*params = table->IntensitySize;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameteriv(pname)" );
return;
}
}
/shark/trunk/ports/mesa/src/teximage.h
0,0 → 1,206
/* $Id: teximage.h,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef TEXIMAGE_H
#define TEXIMAGE_H
 
 
#include "mtypes.h"
 
 
/*** Internal functions ***/
 
 
extern GLint
_mesa_base_tex_format( GLcontext *ctx, GLint format );
 
 
extern struct gl_texture_image *
_mesa_alloc_texture_image( void );
 
 
extern void
_mesa_free_texture_image( struct gl_texture_image *teximage );
 
 
extern void
_mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
struct gl_texture_image *img,
GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum internalFormat);
 
 
extern void
_mesa_set_tex_image(struct gl_texture_object *tObj,
GLenum target, GLint level,
struct gl_texture_image *texImage);
 
 
extern struct gl_texture_object *
_mesa_select_tex_object(GLcontext *ctx, const struct gl_texture_unit *texUnit,
GLenum target);
 
 
extern struct gl_texture_image *
_mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit,
GLenum target, GLint level);
 
 
extern GLint
_mesa_max_texture_levels(GLcontext *ctx, GLenum target);
 
 
/*** API entry point functions ***/
 
 
extern void
_mesa_TexImage1D( GLenum target, GLint level, GLint internalformat,
GLsizei width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels );
 
 
extern void
_mesa_TexImage2D( GLenum target, GLint level, GLint internalformat,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels );
 
 
extern void
_mesa_TexImage3D( GLenum target, GLint level, GLint internalformat,
GLsizei width, GLsizei height, GLsizei depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels );
 
 
extern void
_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalformat,
GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels );
 
 
extern void
_mesa_GetTexImage( GLenum target, GLint level,
GLenum format, GLenum type, GLvoid *pixels );
 
 
extern void
_mesa_TexSubImage1D( GLenum target, GLint level, GLint xoffset,
GLsizei width,
GLenum format, GLenum type,
const GLvoid *pixels );
 
 
extern void
_mesa_TexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels );
 
 
extern void
_mesa_TexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type,
const GLvoid *pixels );
 
 
extern void
_mesa_CopyTexImage1D( GLenum target, GLint level, GLenum internalformat,
GLint x, GLint y, GLsizei width, GLint border );
 
 
extern void
_mesa_CopyTexImage2D( GLenum target, GLint level,
GLenum internalformat, GLint x, GLint y,
GLsizei width, GLsizei height, GLint border );
 
 
extern void
_mesa_CopyTexSubImage1D( GLenum target, GLint level, GLint xoffset,
GLint x, GLint y, GLsizei width );
 
 
extern void
_mesa_CopyTexSubImage2D( GLenum target, GLint level,
GLint xoffset, GLint yoffset,
GLint x, GLint y, GLsizei width, GLsizei height );
 
 
extern void
_mesa_CopyTexSubImage3D( GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y, GLsizei width, GLsizei height );
 
 
 
extern void
_mesa_CompressedTexImage1DARB(GLenum target, GLint level,
GLenum internalformat, GLsizei width,
GLint border, GLsizei imageSize,
const GLvoid *data);
 
extern void
_mesa_CompressedTexImage2DARB(GLenum target, GLint level,
GLenum internalformat, GLsizei width,
GLsizei height, GLint border, GLsizei imageSize,
const GLvoid *data);
 
extern void
_mesa_CompressedTexImage3DARB(GLenum target, GLint level,
GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize, const GLvoid *data);
 
#ifdef VMS
#define _mesa_CompressedTexSubImage1DARB _mesa_CompressedTexSubImage1DAR
#define _mesa_CompressedTexSubImage2DARB _mesa_CompressedTexSubImage2DAR
#define _mesa_CompressedTexSubImage3DARB _mesa_CompressedTexSubImage3DAR
#endif
extern void
_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format,
GLsizei imageSize, const GLvoid *data);
 
extern void
_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLsizei imageSize,
const GLvoid *data);
 
extern void
_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLint zoffset, GLsizei width,
GLsizei height, GLsizei depth, GLenum format,
GLsizei imageSize, const GLvoid *data);
 
extern void
_mesa_GetCompressedTexImageARB(GLenum target, GLint lod, GLvoid *img);
 
 
#endif
/shark/trunk/ports/mesa/src/matrix.h
0,0 → 1,109
/* $Id: matrix.h,v 1.1 2003-02-28 11:42:03 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef MATRIX_H
#define MATRIX_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_Frustum( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval );
 
extern void
_mesa_Ortho( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval );
 
extern void
_mesa_PushMatrix( void );
 
extern void
_mesa_PopMatrix( void );
 
extern void
_mesa_LoadIdentity( void );
 
extern void
_mesa_LoadMatrixf( const GLfloat *m );
 
extern void
_mesa_LoadMatrixd( const GLdouble *m );
 
extern void
_mesa_MatrixMode( GLenum mode );
 
extern void
_mesa_MultMatrixf( const GLfloat *m );
 
extern void
_mesa_MultMatrixd( const GLdouble *m );
 
extern void
_mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z );
 
extern void
_mesa_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z );
 
extern void
_mesa_Scalef( GLfloat x, GLfloat y, GLfloat z );
 
extern void
_mesa_Scaled( GLdouble x, GLdouble y, GLdouble z );
 
extern void
_mesa_Translatef( GLfloat x, GLfloat y, GLfloat z );
 
extern void
_mesa_Translated( GLdouble x, GLdouble y, GLdouble z );
 
extern void
_mesa_LoadTransposeMatrixfARB( const GLfloat *m );
 
extern void
_mesa_LoadTransposeMatrixdARB( const GLdouble *m );
 
extern void
_mesa_MultTransposeMatrixfARB( const GLfloat *m );
 
extern void
_mesa_MultTransposeMatrixdARB( const GLdouble *m );
 
extern void
_mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height );
 
extern void
_mesa_set_viewport( GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height );
 
extern void
_mesa_DepthRange( GLclampd nearval, GLclampd farval );
 
 
#endif
/shark/trunk/ports/mesa/src/glapitable.h
0,0 → 1,665
/* DO NOT EDIT - This file generated automatically with gltable.py script */
#ifndef _GLAPI_TABLE_H_
#define _GLAPI_TABLE_H_
 
#include <GL/gl.h>
 
struct _glapi_table
{
void (*NewList)(GLuint list, GLenum mode); /* 0 */
void (*EndList)(void); /* 1 */
void (*CallList)(GLuint list); /* 2 */
void (*CallLists)(GLsizei n, GLenum type, const GLvoid * lists); /* 3 */
void (*DeleteLists)(GLuint list, GLsizei range); /* 4 */
GLuint (*GenLists)(GLsizei range); /* 5 */
void (*ListBase)(GLuint base); /* 6 */
void (*Begin)(GLenum mode); /* 7 */
void (*Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); /* 8 */
void (*Color3b)(GLbyte red, GLbyte green, GLbyte blue); /* 9 */
void (*Color3bv)(const GLbyte * v); /* 10 */
void (*Color3d)(GLdouble red, GLdouble green, GLdouble blue); /* 11 */
void (*Color3dv)(const GLdouble * v); /* 12 */
void (*Color3f)(GLfloat red, GLfloat green, GLfloat blue); /* 13 */
void (*Color3fv)(const GLfloat * v); /* 14 */
void (*Color3i)(GLint red, GLint green, GLint blue); /* 15 */
void (*Color3iv)(const GLint * v); /* 16 */
void (*Color3s)(GLshort red, GLshort green, GLshort blue); /* 17 */
void (*Color3sv)(const GLshort * v); /* 18 */
void (*Color3ub)(GLubyte red, GLubyte green, GLubyte blue); /* 19 */
void (*Color3ubv)(const GLubyte * v); /* 20 */
void (*Color3ui)(GLuint red, GLuint green, GLuint blue); /* 21 */
void (*Color3uiv)(const GLuint * v); /* 22 */
void (*Color3us)(GLushort red, GLushort green, GLushort blue); /* 23 */
void (*Color3usv)(const GLushort * v); /* 24 */
void (*Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); /* 25 */
void (*Color4bv)(const GLbyte * v); /* 26 */
void (*Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); /* 27 */
void (*Color4dv)(const GLdouble * v); /* 28 */
void (*Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 29 */
void (*Color4fv)(const GLfloat * v); /* 30 */
void (*Color4i)(GLint red, GLint green, GLint blue, GLint alpha); /* 31 */
void (*Color4iv)(const GLint * v); /* 32 */
void (*Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha); /* 33 */
void (*Color4sv)(const GLshort * v); /* 34 */
void (*Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); /* 35 */
void (*Color4ubv)(const GLubyte * v); /* 36 */
void (*Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha); /* 37 */
void (*Color4uiv)(const GLuint * v); /* 38 */
void (*Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha); /* 39 */
void (*Color4usv)(const GLushort * v); /* 40 */
void (*EdgeFlag)(GLboolean flag); /* 41 */
void (*EdgeFlagv)(const GLboolean * flag); /* 42 */
void (*End)(void); /* 43 */
void (*Indexd)(GLdouble c); /* 44 */
void (*Indexdv)(const GLdouble * c); /* 45 */
void (*Indexf)(GLfloat c); /* 46 */
void (*Indexfv)(const GLfloat * c); /* 47 */
void (*Indexi)(GLint c); /* 48 */
void (*Indexiv)(const GLint * c); /* 49 */
void (*Indexs)(GLshort c); /* 50 */
void (*Indexsv)(const GLshort * c); /* 51 */
void (*Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz); /* 52 */
void (*Normal3bv)(const GLbyte * v); /* 53 */
void (*Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz); /* 54 */
void (*Normal3dv)(const GLdouble * v); /* 55 */
void (*Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz); /* 56 */
void (*Normal3fv)(const GLfloat * v); /* 57 */
void (*Normal3i)(GLint nx, GLint ny, GLint nz); /* 58 */
void (*Normal3iv)(const GLint * v); /* 59 */
void (*Normal3s)(GLshort nx, GLshort ny, GLshort nz); /* 60 */
void (*Normal3sv)(const GLshort * v); /* 61 */
void (*RasterPos2d)(GLdouble x, GLdouble y); /* 62 */
void (*RasterPos2dv)(const GLdouble * v); /* 63 */
void (*RasterPos2f)(GLfloat x, GLfloat y); /* 64 */
void (*RasterPos2fv)(const GLfloat * v); /* 65 */
void (*RasterPos2i)(GLint x, GLint y); /* 66 */
void (*RasterPos2iv)(const GLint * v); /* 67 */
void (*RasterPos2s)(GLshort x, GLshort y); /* 68 */
void (*RasterPos2sv)(const GLshort * v); /* 69 */
void (*RasterPos3d)(GLdouble x, GLdouble y, GLdouble z); /* 70 */
void (*RasterPos3dv)(const GLdouble * v); /* 71 */
void (*RasterPos3f)(GLfloat x, GLfloat y, GLfloat z); /* 72 */
void (*RasterPos3fv)(const GLfloat * v); /* 73 */
void (*RasterPos3i)(GLint x, GLint y, GLint z); /* 74 */
void (*RasterPos3iv)(const GLint * v); /* 75 */
void (*RasterPos3s)(GLshort x, GLshort y, GLshort z); /* 76 */
void (*RasterPos3sv)(const GLshort * v); /* 77 */
void (*RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 78 */
void (*RasterPos4dv)(const GLdouble * v); /* 79 */
void (*RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 80 */
void (*RasterPos4fv)(const GLfloat * v); /* 81 */
void (*RasterPos4i)(GLint x, GLint y, GLint z, GLint w); /* 82 */
void (*RasterPos4iv)(const GLint * v); /* 83 */
void (*RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 84 */
void (*RasterPos4sv)(const GLshort * v); /* 85 */
void (*Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); /* 86 */
void (*Rectdv)(const GLdouble * v1, const GLdouble * v2); /* 87 */
void (*Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); /* 88 */
void (*Rectfv)(const GLfloat * v1, const GLfloat * v2); /* 89 */
void (*Recti)(GLint x1, GLint y1, GLint x2, GLint y2); /* 90 */
void (*Rectiv)(const GLint * v1, const GLint * v2); /* 91 */
void (*Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); /* 92 */
void (*Rectsv)(const GLshort * v1, const GLshort * v2); /* 93 */
void (*TexCoord1d)(GLdouble s); /* 94 */
void (*TexCoord1dv)(const GLdouble * v); /* 95 */
void (*TexCoord1f)(GLfloat s); /* 96 */
void (*TexCoord1fv)(const GLfloat * v); /* 97 */
void (*TexCoord1i)(GLint s); /* 98 */
void (*TexCoord1iv)(const GLint * v); /* 99 */
void (*TexCoord1s)(GLshort s); /* 100 */
void (*TexCoord1sv)(const GLshort * v); /* 101 */
void (*TexCoord2d)(GLdouble s, GLdouble t); /* 102 */
void (*TexCoord2dv)(const GLdouble * v); /* 103 */
void (*TexCoord2f)(GLfloat s, GLfloat t); /* 104 */
void (*TexCoord2fv)(const GLfloat * v); /* 105 */
void (*TexCoord2i)(GLint s, GLint t); /* 106 */
void (*TexCoord2iv)(const GLint * v); /* 107 */
void (*TexCoord2s)(GLshort s, GLshort t); /* 108 */
void (*TexCoord2sv)(const GLshort * v); /* 109 */
void (*TexCoord3d)(GLdouble s, GLdouble t, GLdouble r); /* 110 */
void (*TexCoord3dv)(const GLdouble * v); /* 111 */
void (*TexCoord3f)(GLfloat s, GLfloat t, GLfloat r); /* 112 */
void (*TexCoord3fv)(const GLfloat * v); /* 113 */
void (*TexCoord3i)(GLint s, GLint t, GLint r); /* 114 */
void (*TexCoord3iv)(const GLint * v); /* 115 */
void (*TexCoord3s)(GLshort s, GLshort t, GLshort r); /* 116 */
void (*TexCoord3sv)(const GLshort * v); /* 117 */
void (*TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 118 */
void (*TexCoord4dv)(const GLdouble * v); /* 119 */
void (*TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 120 */
void (*TexCoord4fv)(const GLfloat * v); /* 121 */
void (*TexCoord4i)(GLint s, GLint t, GLint r, GLint q); /* 122 */
void (*TexCoord4iv)(const GLint * v); /* 123 */
void (*TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q); /* 124 */
void (*TexCoord4sv)(const GLshort * v); /* 125 */
void (*Vertex2d)(GLdouble x, GLdouble y); /* 126 */
void (*Vertex2dv)(const GLdouble * v); /* 127 */
void (*Vertex2f)(GLfloat x, GLfloat y); /* 128 */
void (*Vertex2fv)(const GLfloat * v); /* 129 */
void (*Vertex2i)(GLint x, GLint y); /* 130 */
void (*Vertex2iv)(const GLint * v); /* 131 */
void (*Vertex2s)(GLshort x, GLshort y); /* 132 */
void (*Vertex2sv)(const GLshort * v); /* 133 */
void (*Vertex3d)(GLdouble x, GLdouble y, GLdouble z); /* 134 */
void (*Vertex3dv)(const GLdouble * v); /* 135 */
void (*Vertex3f)(GLfloat x, GLfloat y, GLfloat z); /* 136 */
void (*Vertex3fv)(const GLfloat * v); /* 137 */
void (*Vertex3i)(GLint x, GLint y, GLint z); /* 138 */
void (*Vertex3iv)(const GLint * v); /* 139 */
void (*Vertex3s)(GLshort x, GLshort y, GLshort z); /* 140 */
void (*Vertex3sv)(const GLshort * v); /* 141 */
void (*Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 142 */
void (*Vertex4dv)(const GLdouble * v); /* 143 */
void (*Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 144 */
void (*Vertex4fv)(const GLfloat * v); /* 145 */
void (*Vertex4i)(GLint x, GLint y, GLint z, GLint w); /* 146 */
void (*Vertex4iv)(const GLint * v); /* 147 */
void (*Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 148 */
void (*Vertex4sv)(const GLshort * v); /* 149 */
void (*ClipPlane)(GLenum plane, const GLdouble * equation); /* 150 */
void (*ColorMaterial)(GLenum face, GLenum mode); /* 151 */
void (*CullFace)(GLenum mode); /* 152 */
void (*Fogf)(GLenum pname, GLfloat param); /* 153 */
void (*Fogfv)(GLenum pname, const GLfloat * params); /* 154 */
void (*Fogi)(GLenum pname, GLint param); /* 155 */
void (*Fogiv)(GLenum pname, const GLint * params); /* 156 */
void (*FrontFace)(GLenum mode); /* 157 */
void (*Hint)(GLenum target, GLenum mode); /* 158 */
void (*Lightf)(GLenum light, GLenum pname, GLfloat param); /* 159 */
void (*Lightfv)(GLenum light, GLenum pname, const GLfloat * params); /* 160 */
void (*Lighti)(GLenum light, GLenum pname, GLint param); /* 161 */
void (*Lightiv)(GLenum light, GLenum pname, const GLint * params); /* 162 */
void (*LightModelf)(GLenum pname, GLfloat param); /* 163 */
void (*LightModelfv)(GLenum pname, const GLfloat * params); /* 164 */
void (*LightModeli)(GLenum pname, GLint param); /* 165 */
void (*LightModeliv)(GLenum pname, const GLint * params); /* 166 */
void (*LineStipple)(GLint factor, GLushort pattern); /* 167 */
void (*LineWidth)(GLfloat width); /* 168 */
void (*Materialf)(GLenum face, GLenum pname, GLfloat param); /* 169 */
void (*Materialfv)(GLenum face, GLenum pname, const GLfloat * params); /* 170 */
void (*Materiali)(GLenum face, GLenum pname, GLint param); /* 171 */
void (*Materialiv)(GLenum face, GLenum pname, const GLint * params); /* 172 */
void (*PointSize)(GLfloat size); /* 173 */
void (*PolygonMode)(GLenum face, GLenum mode); /* 174 */
void (*PolygonStipple)(const GLubyte * mask); /* 175 */
void (*Scissor)(GLint x, GLint y, GLsizei width, GLsizei height); /* 176 */
void (*ShadeModel)(GLenum mode); /* 177 */
void (*TexParameterf)(GLenum target, GLenum pname, GLfloat param); /* 178 */
void (*TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 179 */
void (*TexParameteri)(GLenum target, GLenum pname, GLint param); /* 180 */
void (*TexParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 181 */
void (*TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 182 */
void (*TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 183 */
void (*TexEnvf)(GLenum target, GLenum pname, GLfloat param); /* 184 */
void (*TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params); /* 185 */
void (*TexEnvi)(GLenum target, GLenum pname, GLint param); /* 186 */
void (*TexEnviv)(GLenum target, GLenum pname, const GLint * params); /* 187 */
void (*TexGend)(GLenum coord, GLenum pname, GLdouble param); /* 188 */
void (*TexGendv)(GLenum coord, GLenum pname, const GLdouble * params); /* 189 */
void (*TexGenf)(GLenum coord, GLenum pname, GLfloat param); /* 190 */
void (*TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params); /* 191 */
void (*TexGeni)(GLenum coord, GLenum pname, GLint param); /* 192 */
void (*TexGeniv)(GLenum coord, GLenum pname, const GLint * params); /* 193 */
void (*FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer); /* 194 */
void (*SelectBuffer)(GLsizei size, GLuint * buffer); /* 195 */
GLint (*RenderMode)(GLenum mode); /* 196 */
void (*InitNames)(void); /* 197 */
void (*LoadName)(GLuint name); /* 198 */
void (*PassThrough)(GLfloat token); /* 199 */
void (*PopName)(void); /* 200 */
void (*PushName)(GLuint name); /* 201 */
void (*DrawBuffer)(GLenum mode); /* 202 */
void (*Clear)(GLbitfield mask); /* 203 */
void (*ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 204 */
void (*ClearIndex)(GLfloat c); /* 205 */
void (*ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 206 */
void (*ClearStencil)(GLint s); /* 207 */
void (*ClearDepth)(GLclampd depth); /* 208 */
void (*StencilMask)(GLuint mask); /* 209 */
void (*ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); /* 210 */
void (*DepthMask)(GLboolean flag); /* 211 */
void (*IndexMask)(GLuint mask); /* 212 */
void (*Accum)(GLenum op, GLfloat value); /* 213 */
void (*Disable)(GLenum cap); /* 214 */
void (*Enable)(GLenum cap); /* 215 */
void (*Finish)(void); /* 216 */
void (*Flush)(void); /* 217 */
void (*PopAttrib)(void); /* 218 */
void (*PushAttrib)(GLbitfield mask); /* 219 */
void (*Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); /* 220 */
void (*Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); /* 221 */
void (*Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); /* 222 */
void (*Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); /* 223 */
void (*MapGrid1d)(GLint un, GLdouble u1, GLdouble u2); /* 224 */
void (*MapGrid1f)(GLint un, GLfloat u1, GLfloat u2); /* 225 */
void (*MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); /* 226 */
void (*MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); /* 227 */
void (*EvalCoord1d)(GLdouble u); /* 228 */
void (*EvalCoord1dv)(const GLdouble * u); /* 229 */
void (*EvalCoord1f)(GLfloat u); /* 230 */
void (*EvalCoord1fv)(const GLfloat * u); /* 231 */
void (*EvalCoord2d)(GLdouble u, GLdouble v); /* 232 */
void (*EvalCoord2dv)(const GLdouble * u); /* 233 */
void (*EvalCoord2f)(GLfloat u, GLfloat v); /* 234 */
void (*EvalCoord2fv)(const GLfloat * u); /* 235 */
void (*EvalMesh1)(GLenum mode, GLint i1, GLint i2); /* 236 */
void (*EvalPoint1)(GLint i); /* 237 */
void (*EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); /* 238 */
void (*EvalPoint2)(GLint i, GLint j); /* 239 */
void (*AlphaFunc)(GLenum func, GLclampf ref); /* 240 */
void (*BlendFunc)(GLenum sfactor, GLenum dfactor); /* 241 */
void (*LogicOp)(GLenum opcode); /* 242 */
void (*StencilFunc)(GLenum func, GLint ref, GLuint mask); /* 243 */
void (*StencilOp)(GLenum fail, GLenum zfail, GLenum zpass); /* 244 */
void (*DepthFunc)(GLenum func); /* 245 */
void (*PixelZoom)(GLfloat xfactor, GLfloat yfactor); /* 246 */
void (*PixelTransferf)(GLenum pname, GLfloat param); /* 247 */
void (*PixelTransferi)(GLenum pname, GLint param); /* 248 */
void (*PixelStoref)(GLenum pname, GLfloat param); /* 249 */
void (*PixelStorei)(GLenum pname, GLint param); /* 250 */
void (*PixelMapfv)(GLenum map, GLint mapsize, const GLfloat * values); /* 251 */
void (*PixelMapuiv)(GLenum map, GLint mapsize, const GLuint * values); /* 252 */
void (*PixelMapusv)(GLenum map, GLint mapsize, const GLushort * values); /* 253 */
void (*ReadBuffer)(GLenum mode); /* 254 */
void (*CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); /* 255 */
void (*ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); /* 256 */
void (*DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 257 */
void (*GetBooleanv)(GLenum pname, GLboolean * params); /* 258 */
void (*GetClipPlane)(GLenum plane, GLdouble * equation); /* 259 */
void (*GetDoublev)(GLenum pname, GLdouble * params); /* 260 */
GLenum (*GetError)(void); /* 261 */
void (*GetFloatv)(GLenum pname, GLfloat * params); /* 262 */
void (*GetIntegerv)(GLenum pname, GLint * params); /* 263 */
void (*GetLightfv)(GLenum light, GLenum pname, GLfloat * params); /* 264 */
void (*GetLightiv)(GLenum light, GLenum pname, GLint * params); /* 265 */
void (*GetMapdv)(GLenum target, GLenum query, GLdouble * v); /* 266 */
void (*GetMapfv)(GLenum target, GLenum query, GLfloat * v); /* 267 */
void (*GetMapiv)(GLenum target, GLenum query, GLint * v); /* 268 */
void (*GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params); /* 269 */
void (*GetMaterialiv)(GLenum face, GLenum pname, GLint * params); /* 270 */
void (*GetPixelMapfv)(GLenum map, GLfloat * values); /* 271 */
void (*GetPixelMapuiv)(GLenum map, GLuint * values); /* 272 */
void (*GetPixelMapusv)(GLenum map, GLushort * values); /* 273 */
void (*GetPolygonStipple)(GLubyte * mask); /* 274 */
const GLubyte * (*GetString)(GLenum name); /* 275 */
void (*GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params); /* 276 */
void (*GetTexEnviv)(GLenum target, GLenum pname, GLint * params); /* 277 */
void (*GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params); /* 278 */
void (*GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params); /* 279 */
void (*GetTexGeniv)(GLenum coord, GLenum pname, GLint * params); /* 280 */
void (*GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); /* 281 */
void (*GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 282 */
void (*GetTexParameteriv)(GLenum target, GLenum pname, GLint * params); /* 283 */
void (*GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params); /* 284 */
void (*GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params); /* 285 */
GLboolean (*IsEnabled)(GLenum cap); /* 286 */
GLboolean (*IsList)(GLuint list); /* 287 */
void (*DepthRange)(GLclampd zNear, GLclampd zFar); /* 288 */
void (*Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 289 */
void (*LoadIdentity)(void); /* 290 */
void (*LoadMatrixf)(const GLfloat * m); /* 291 */
void (*LoadMatrixd)(const GLdouble * m); /* 292 */
void (*MatrixMode)(GLenum mode); /* 293 */
void (*MultMatrixf)(const GLfloat * m); /* 294 */
void (*MultMatrixd)(const GLdouble * m); /* 295 */
void (*Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 296 */
void (*PopMatrix)(void); /* 297 */
void (*PushMatrix)(void); /* 298 */
void (*Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); /* 299 */
void (*Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); /* 300 */
void (*Scaled)(GLdouble x, GLdouble y, GLdouble z); /* 301 */
void (*Scalef)(GLfloat x, GLfloat y, GLfloat z); /* 302 */
void (*Translated)(GLdouble x, GLdouble y, GLdouble z); /* 303 */
void (*Translatef)(GLfloat x, GLfloat y, GLfloat z); /* 304 */
void (*Viewport)(GLint x, GLint y, GLsizei width, GLsizei height); /* 305 */
void (*ArrayElement)(GLint i); /* 306 */
void (*BindTexture)(GLenum target, GLuint texture); /* 307 */
void (*ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 308 */
void (*DisableClientState)(GLenum array); /* 309 */
void (*DrawArrays)(GLenum mode, GLint first, GLsizei count); /* 310 */
void (*DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); /* 311 */
void (*EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer); /* 312 */
void (*EnableClientState)(GLenum array); /* 313 */
void (*IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 314 */
void (*Indexub)(GLubyte c); /* 315 */
void (*Indexubv)(const GLubyte * c); /* 316 */
void (*InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer); /* 317 */
void (*NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 318 */
void (*PolygonOffset)(GLfloat factor, GLfloat units); /* 319 */
void (*TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 320 */
void (*VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 321 */
GLboolean (*AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 322 */
void (*CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); /* 323 */
void (*CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); /* 324 */
void (*CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); /* 325 */
void (*CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 326 */
void (*DeleteTextures)(GLsizei n, const GLuint * textures); /* 327 */
void (*GenTextures)(GLsizei n, GLuint * textures); /* 328 */
void (*GetPointerv)(GLenum pname, GLvoid ** params); /* 329 */
GLboolean (*IsTexture)(GLuint texture); /* 330 */
void (*PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities); /* 331 */
void (*TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); /* 332 */
void (*TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 333 */
void (*PopClientAttrib)(void); /* 334 */
void (*PushClientAttrib)(GLbitfield mask); /* 335 */
void (*BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 336 */
void (*BlendEquation)(GLenum mode); /* 337 */
void (*DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); /* 338 */
void (*ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); /* 339 */
void (*ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 340 */
void (*ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 341 */
void (*CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 342 */
void (*GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 343 */
void (*GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 344 */
void (*GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params); /* 345 */
void (*ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); /* 346 */
void (*CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); /* 347 */
void (*ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); /* 348 */
void (*ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); /* 349 */
void (*ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params); /* 350 */
void (*ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 351 */
void (*ConvolutionParameteri)(GLenum target, GLenum pname, GLint params); /* 352 */
void (*ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 353 */
void (*CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 354 */
void (*CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); /* 355 */
void (*GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 356 */
void (*GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 357 */
void (*GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params); /* 358 */
void (*GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 359 */
void (*SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); /* 360 */
void (*GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 361 */
void (*GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 362 */
void (*GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params); /* 363 */
void (*GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 364 */
void (*GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 365 */
void (*GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params); /* 366 */
void (*Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); /* 367 */
void (*Minmax)(GLenum target, GLenum internalformat, GLboolean sink); /* 368 */
void (*ResetHistogram)(GLenum target); /* 369 */
void (*ResetMinmax)(GLenum target); /* 370 */
void (*TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 371 */
void (*TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); /* 372 */
void (*CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 373 */
void (*ActiveTextureARB)(GLenum texture); /* 374 */
void (*ClientActiveTextureARB)(GLenum texture); /* 375 */
void (*MultiTexCoord1dARB)(GLenum target, GLdouble s); /* 376 */
void (*MultiTexCoord1dvARB)(GLenum target, const GLdouble * v); /* 377 */
void (*MultiTexCoord1fARB)(GLenum target, GLfloat s); /* 378 */
void (*MultiTexCoord1fvARB)(GLenum target, const GLfloat * v); /* 379 */
void (*MultiTexCoord1iARB)(GLenum target, GLint s); /* 380 */
void (*MultiTexCoord1ivARB)(GLenum target, const GLint * v); /* 381 */
void (*MultiTexCoord1sARB)(GLenum target, GLshort s); /* 382 */
void (*MultiTexCoord1svARB)(GLenum target, const GLshort * v); /* 383 */
void (*MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t); /* 384 */
void (*MultiTexCoord2dvARB)(GLenum target, const GLdouble * v); /* 385 */
void (*MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t); /* 386 */
void (*MultiTexCoord2fvARB)(GLenum target, const GLfloat * v); /* 387 */
void (*MultiTexCoord2iARB)(GLenum target, GLint s, GLint t); /* 388 */
void (*MultiTexCoord2ivARB)(GLenum target, const GLint * v); /* 389 */
void (*MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t); /* 390 */
void (*MultiTexCoord2svARB)(GLenum target, const GLshort * v); /* 391 */
void (*MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r); /* 392 */
void (*MultiTexCoord3dvARB)(GLenum target, const GLdouble * v); /* 393 */
void (*MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r); /* 394 */
void (*MultiTexCoord3fvARB)(GLenum target, const GLfloat * v); /* 395 */
void (*MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r); /* 396 */
void (*MultiTexCoord3ivARB)(GLenum target, const GLint * v); /* 397 */
void (*MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r); /* 398 */
void (*MultiTexCoord3svARB)(GLenum target, const GLshort * v); /* 399 */
void (*MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 400 */
void (*MultiTexCoord4dvARB)(GLenum target, const GLdouble * v); /* 401 */
void (*MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 402 */
void (*MultiTexCoord4fvARB)(GLenum target, const GLfloat * v); /* 403 */
void (*MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q); /* 404 */
void (*MultiTexCoord4ivARB)(GLenum target, const GLint * v); /* 405 */
void (*MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); /* 406 */
void (*MultiTexCoord4svARB)(GLenum target, const GLshort * v); /* 407 */
void (*LoadTransposeMatrixfARB)(const GLfloat * m); /* 408 */
void (*LoadTransposeMatrixdARB)(const GLdouble * m); /* 409 */
void (*MultTransposeMatrixfARB)(const GLfloat * m); /* 410 */
void (*MultTransposeMatrixdARB)(const GLdouble * m); /* 411 */
void (*SampleCoverageARB)(GLclampf value, GLboolean invert); /* 412 */
void (*__unused413)(void); /* 413 */
void (*PolygonOffsetEXT)(GLfloat factor, GLfloat bias); /* 414 */
void (*GetTexFilterFuncSGIS)(GLenum target, GLenum filter, GLfloat * weights); /* 415 */
void (*TexFilterFuncSGIS)(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); /* 416 */
void (*GetHistogramEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 417 */
void (*GetHistogramParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 418 */
void (*GetHistogramParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 419 */
void (*GetMinmaxEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 420 */
void (*GetMinmaxParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 421 */
void (*GetMinmaxParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 422 */
void (*GetConvolutionFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 423 */
void (*GetConvolutionParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 424 */
void (*GetConvolutionParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 425 */
void (*GetSeparableFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 426 */
void (*GetColorTableSGI)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 427 */
void (*GetColorTableParameterfvSGI)(GLenum target, GLenum pname, GLfloat * params); /* 428 */
void (*GetColorTableParameterivSGI)(GLenum target, GLenum pname, GLint * params); /* 429 */
void (*PixelTexGenSGIX)(GLenum mode); /* 430 */
void (*PixelTexGenParameteriSGIS)(GLenum pname, GLint param); /* 431 */
void (*PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params); /* 432 */
void (*PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param); /* 433 */
void (*PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params); /* 434 */
void (*GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params); /* 435 */
void (*GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params); /* 436 */
void (*TexImage4DSGIS)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 437 */
void (*TexSubImage4DSGIS)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels); /* 438 */
GLboolean (*AreTexturesResidentEXT)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 439 */
void (*GenTexturesEXT)(GLsizei n, GLuint * textures); /* 440 */
GLboolean (*IsTextureEXT)(GLuint texture); /* 441 */
void (*DetailTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 442 */
void (*GetDetailTexFuncSGIS)(GLenum target, GLfloat * points); /* 443 */
void (*SharpenTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 444 */
void (*GetSharpenTexFuncSGIS)(GLenum target, GLfloat * points); /* 445 */
void (*SampleMaskSGIS)(GLclampf value, GLboolean invert); /* 446 */
void (*SamplePatternSGIS)(GLenum pattern); /* 447 */
void (*ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 448 */
void (*EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer); /* 449 */
void (*IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 450 */
void (*NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 451 */
void (*TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 452 */
void (*VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 453 */
void (*SpriteParameterfSGIX)(GLenum pname, GLfloat param); /* 454 */
void (*SpriteParameterfvSGIX)(GLenum pname, const GLfloat * params); /* 455 */
void (*SpriteParameteriSGIX)(GLenum pname, GLint param); /* 456 */
void (*SpriteParameterivSGIX)(GLenum pname, const GLint * params); /* 457 */
void (*PointParameterfEXT)(GLenum pname, GLfloat param); /* 458 */
void (*PointParameterfvEXT)(GLenum pname, const GLfloat * params); /* 459 */
GLint (*GetInstrumentsSGIX)(void); /* 460 */
void (*InstrumentsBufferSGIX)(GLsizei size, GLint * buffer); /* 461 */
GLint (*PollInstrumentsSGIX)(GLint * marker_p); /* 462 */
void (*ReadInstrumentsSGIX)(GLint marker); /* 463 */
void (*StartInstrumentsSGIX)(void); /* 464 */
void (*StopInstrumentsSGIX)(GLint marker); /* 465 */
void (*FrameZoomSGIX)(GLint factor); /* 466 */
void (*TagSampleBufferSGIX)(void); /* 467 */
void (*ReferencePlaneSGIX)(const GLdouble * equation); /* 468 */
void (*FlushRasterSGIX)(void); /* 469 */
void (*GetListParameterfvSGIX)(GLuint list, GLenum pname, GLfloat * params); /* 470 */
void (*GetListParameterivSGIX)(GLuint list, GLenum pname, GLint * params); /* 471 */
void (*ListParameterfSGIX)(GLuint list, GLenum pname, GLfloat param); /* 472 */
void (*ListParameterfvSGIX)(GLuint list, GLenum pname, const GLfloat * params); /* 473 */
void (*ListParameteriSGIX)(GLuint list, GLenum pname, GLint param); /* 474 */
void (*ListParameterivSGIX)(GLuint list, GLenum pname, const GLint * params); /* 475 */
void (*FragmentColorMaterialSGIX)(GLenum face, GLenum mode); /* 476 */
void (*FragmentLightfSGIX)(GLenum light, GLenum pname, GLfloat param); /* 477 */
void (*FragmentLightfvSGIX)(GLenum light, GLenum pname, const GLfloat * params); /* 478 */
void (*FragmentLightiSGIX)(GLenum light, GLenum pname, GLint param); /* 479 */
void (*FragmentLightivSGIX)(GLenum light, GLenum pname, const GLint * params); /* 480 */
void (*FragmentLightModelfSGIX)(GLenum pname, GLfloat param); /* 481 */
void (*FragmentLightModelfvSGIX)(GLenum pname, const GLfloat * params); /* 482 */
void (*FragmentLightModeliSGIX)(GLenum pname, GLint param); /* 483 */
void (*FragmentLightModelivSGIX)(GLenum pname, const GLint * params); /* 484 */
void (*FragmentMaterialfSGIX)(GLenum face, GLenum pname, GLfloat param); /* 485 */
void (*FragmentMaterialfvSGIX)(GLenum face, GLenum pname, const GLfloat * params); /* 486 */
void (*FragmentMaterialiSGIX)(GLenum face, GLenum pname, GLint param); /* 487 */
void (*FragmentMaterialivSGIX)(GLenum face, GLenum pname, const GLint * params); /* 488 */
void (*GetFragmentLightfvSGIX)(GLenum light, GLenum pname, GLfloat * params); /* 489 */
void (*GetFragmentLightivSGIX)(GLenum light, GLenum pname, GLint * params); /* 490 */
void (*GetFragmentMaterialfvSGIX)(GLenum face, GLenum pname, GLfloat * params); /* 491 */
void (*GetFragmentMaterialivSGIX)(GLenum face, GLenum pname, GLint * params); /* 492 */
void (*LightEnviSGIX)(GLenum pname, GLint param); /* 493 */
void (*VertexWeightfEXT)(GLfloat weight); /* 494 */
void (*VertexWeightfvEXT)(const GLfloat * weight); /* 495 */
void (*VertexWeightPointerEXT)(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 496 */
void (*FlushVertexArrayRangeNV)(void); /* 497 */
void (*VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer); /* 498 */
void (*CombinerParameterfvNV)(GLenum pname, const GLfloat * params); /* 499 */
void (*CombinerParameterfNV)(GLenum pname, GLfloat param); /* 500 */
void (*CombinerParameterivNV)(GLenum pname, const GLint * params); /* 501 */
void (*CombinerParameteriNV)(GLenum pname, GLint param); /* 502 */
void (*CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 503 */
void (*CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); /* 504 */
void (*FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 505 */
void (*GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); /* 506 */
void (*GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); /* 507 */
void (*GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); /* 508 */
void (*GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params); /* 509 */
void (*GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params); /* 510 */
void (*GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params); /* 511 */
void (*ResizeBuffersMESA)(void); /* 512 */
void (*WindowPos2dMESA)(GLdouble x, GLdouble y); /* 513 */
void (*WindowPos2dvMESA)(const GLdouble * v); /* 514 */
void (*WindowPos2fMESA)(GLfloat x, GLfloat y); /* 515 */
void (*WindowPos2fvMESA)(const GLfloat * v); /* 516 */
void (*WindowPos2iMESA)(GLint x, GLint y); /* 517 */
void (*WindowPos2ivMESA)(const GLint * v); /* 518 */
void (*WindowPos2sMESA)(GLshort x, GLshort y); /* 519 */
void (*WindowPos2svMESA)(const GLshort * v); /* 520 */
void (*WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z); /* 521 */
void (*WindowPos3dvMESA)(const GLdouble * v); /* 522 */
void (*WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z); /* 523 */
void (*WindowPos3fvMESA)(const GLfloat * v); /* 524 */
void (*WindowPos3iMESA)(GLint x, GLint y, GLint z); /* 525 */
void (*WindowPos3ivMESA)(const GLint * v); /* 526 */
void (*WindowPos3sMESA)(GLshort x, GLshort y, GLshort z); /* 527 */
void (*WindowPos3svMESA)(const GLshort * v); /* 528 */
void (*WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 529 */
void (*WindowPos4dvMESA)(const GLdouble * v); /* 530 */
void (*WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 531 */
void (*WindowPos4fvMESA)(const GLfloat * v); /* 532 */
void (*WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w); /* 533 */
void (*WindowPos4ivMESA)(const GLint * v); /* 534 */
void (*WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w); /* 535 */
void (*WindowPos4svMESA)(const GLshort * v); /* 536 */
void (*BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); /* 537 */
void (*IndexMaterialEXT)(GLenum face, GLenum mode); /* 538 */
void (*IndexFuncEXT)(GLenum func, GLclampf ref); /* 539 */
void (*LockArraysEXT)(GLint first, GLsizei count); /* 540 */
void (*UnlockArraysEXT)(void); /* 541 */
void (*CullParameterdvEXT)(GLenum pname, GLdouble * params); /* 542 */
void (*CullParameterfvEXT)(GLenum pname, GLfloat * params); /* 543 */
void (*HintPGI)(GLenum target, GLint mode); /* 544 */
void (*FogCoordfEXT)(GLfloat coord); /* 545 */
void (*FogCoordfvEXT)(const GLfloat * coord); /* 546 */
void (*FogCoorddEXT)(GLdouble coord); /* 547 */
void (*FogCoorddvEXT)(const GLdouble * coord); /* 548 */
void (*FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 549 */
void (*GetColorTableEXT)(GLenum target, GLenum format, GLenum type, GLvoid * data); /* 550 */
void (*GetColorTableParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 551 */
void (*GetColorTableParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 552 */
void (*TbufferMask3DFX)(GLuint mask); /* 553 */
void (*CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); /* 554 */
void (*CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); /* 555 */
void (*CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); /* 556 */
void (*CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); /* 557 */
void (*CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); /* 558 */
void (*CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); /* 559 */
void (*GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img); /* 560 */
void (*SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue); /* 561 */
void (*SecondaryColor3bvEXT)(const GLbyte * v); /* 562 */
void (*SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue); /* 563 */
void (*SecondaryColor3dvEXT)(const GLdouble * v); /* 564 */
void (*SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue); /* 565 */
void (*SecondaryColor3fvEXT)(const GLfloat * v); /* 566 */
void (*SecondaryColor3iEXT)(GLint red, GLint green, GLint blue); /* 567 */
void (*SecondaryColor3ivEXT)(const GLint * v); /* 568 */
void (*SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue); /* 569 */
void (*SecondaryColor3svEXT)(const GLshort * v); /* 570 */
void (*SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue); /* 571 */
void (*SecondaryColor3ubvEXT)(const GLubyte * v); /* 572 */
void (*SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue); /* 573 */
void (*SecondaryColor3uivEXT)(const GLuint * v); /* 574 */
void (*SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue); /* 575 */
void (*SecondaryColor3usvEXT)(const GLushort * v); /* 576 */
void (*SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 577 */
GLboolean (*AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences); /* 578 */
void (*BindProgramNV)(GLenum target, GLuint id); /* 579 */
void (*DeleteProgramsNV)(GLsizei n, const GLuint * ids); /* 580 */
void (*ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params); /* 581 */
void (*GenProgramsNV)(GLsizei n, GLuint * ids); /* 582 */
void (*GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params); /* 583 */
void (*GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params); /* 584 */
void (*GetProgramivNV)(GLuint id, GLenum pname, GLint * params); /* 585 */
void (*GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program); /* 586 */
void (*GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params); /* 587 */
void (*GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params); /* 588 */
void (*GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params); /* 589 */
void (*GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 590 */
void (*GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer); /* 591 */
GLboolean (*IsProgramNV)(GLuint id); /* 592 */
void (*LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 593 */
void (*ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 594 */
void (*ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params); /* 595 */
void (*ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 596 */
void (*ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params); /* 597 */
void (*ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 598 */
void (*ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 599 */
void (*RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 600 */
void (*TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 601 */
void (*VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 602 */
void (*VertexAttrib1dNV)(GLuint index, GLdouble x); /* 603 */
void (*VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 604 */
void (*VertexAttrib1fNV)(GLuint index, GLfloat x); /* 605 */
void (*VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 606 */
void (*VertexAttrib1sNV)(GLuint index, GLshort x); /* 607 */
void (*VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 608 */
void (*VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 609 */
void (*VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 610 */
void (*VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 611 */
void (*VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 612 */
void (*VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 613 */
void (*VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 614 */
void (*VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 615 */
void (*VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 616 */
void (*VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 617 */
void (*VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 618 */
void (*VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 619 */
void (*VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 620 */
void (*VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 621 */
void (*VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 622 */
void (*VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 623 */
void (*VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 624 */
void (*VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 625 */
void (*VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 626 */
void (*VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 627 */
void (*VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 628 */
void (*VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 629 */
void (*VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 630 */
void (*VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 631 */
void (*VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 632 */
void (*VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 633 */
void (*VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 634 */
void (*VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 635 */
void (*VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 636 */
void (*VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 637 */
void (*VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 638 */
void (*VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 639 */
void (*VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 640 */
void (*VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 641 */
void (*PointParameteriNV)(GLenum pname, GLint params); /* 642 */
void (*PointParameterivNV)(GLenum pname, const GLint * params); /* 643 */
void (*MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); /* 644 */
void (*MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 645 */
void (*ActiveStencilFaceEXT)(GLenum face); /* 646 */
void (*DeleteFencesNV)(GLsizei n, const GLuint * fences); /* 647 */
void (*GenFencesNV)(GLsizei n, GLuint * fences); /* 648 */
GLboolean (*IsFenceNV)(GLuint fence); /* 649 */
GLboolean (*TestFenceNV)(GLuint fence); /* 650 */
void (*GetFenceivNV)(GLuint fence, GLenum pname, GLint * params); /* 651 */
void (*FinishFenceNV)(GLuint fence); /* 652 */
void (*SetFenceNV)(GLuint fence, GLenum condition); /* 653 */
};
 
#endif
/shark/trunk/ports/mesa/src/texformat.c
0,0 → 1,790
/* $Id: texformat.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Gareth Hughes
*/
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "image.h"
#include "imports.h"
#include "mmath.h"
#include "mtypes.h"
#include "texformat.h"
#include "teximage.h"
#include "texstate.h"
 
 
/* Texel fetch routines for all supported formats:
*/
#define DIM 1
#include "texformat_tmp.h"
 
#define DIM 2
#include "texformat_tmp.h"
 
#define DIM 3
#include "texformat_tmp.h"
 
/* Have to have this so the FetchTexel function pointer is never NULL.
*/
static void fetch_null_texel( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLvoid *texel )
{
GLchan *rgba = (GLchan *) texel;
rgba[RCOMP] = 0;
rgba[GCOMP] = 0;
rgba[BCOMP] = 0;
rgba[ACOMP] = 0;
}
 
 
/* =============================================================
* Default GLchan-based formats:
*/
 
const struct gl_texture_format _mesa_texformat_rgba = {
MESA_FORMAT_RGBA, /* MesaFormat */
GL_RGBA, /* BaseFormat */
CHAN_BITS, /* RedBits */
CHAN_BITS, /* GreenBits */
CHAN_BITS, /* BlueBits */
CHAN_BITS, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
4 * CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_rgba, /* FetchTexel1D */
fetch_2d_texel_rgba, /* FetchTexel2D */
fetch_3d_texel_rgba, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_rgb = {
MESA_FORMAT_RGB, /* MesaFormat */
GL_RGB, /* BaseFormat */
CHAN_BITS, /* RedBits */
CHAN_BITS, /* GreenBits */
CHAN_BITS, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
3 * CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_rgb, /* FetchTexel1D */
fetch_2d_texel_rgb, /* FetchTexel2D */
fetch_3d_texel_rgb, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_alpha = {
MESA_FORMAT_ALPHA, /* MesaFormat */
GL_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
CHAN_BITS, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_alpha, /* FetchTexel1D */
fetch_2d_texel_alpha, /* FetchTexel2D */
fetch_3d_texel_alpha, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_luminance = {
MESA_FORMAT_LUMINANCE, /* MesaFormat */
GL_LUMINANCE, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
CHAN_BITS, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_luminance, /* FetchTexel1D */
fetch_2d_texel_luminance, /* FetchTexel2D */
fetch_3d_texel_luminance, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_luminance_alpha = {
MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */
GL_LUMINANCE_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
CHAN_BITS, /* AlphaBits */
CHAN_BITS, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2 * CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_luminance_alpha, /* FetchTexel1D */
fetch_2d_texel_luminance_alpha, /* FetchTexel2D */
fetch_3d_texel_luminance_alpha, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_intensity = {
MESA_FORMAT_INTENSITY, /* MesaFormat */
GL_INTENSITY, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
CHAN_BITS, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_intensity, /* FetchTexel1D */
fetch_2d_texel_intensity, /* FetchTexel2D */
fetch_3d_texel_intensity, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_color_index = {
MESA_FORMAT_COLOR_INDEX, /* MesaFormat */
GL_COLOR_INDEX, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
CHAN_BITS, /* IndexBits */
0, /* DepthBits */
CHAN_BITS / 8, /* TexelBytes */
fetch_1d_texel_color_index, /* FetchTexel1D */
fetch_2d_texel_color_index, /* FetchTexel2D */
fetch_3d_texel_color_index, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_depth_component = {
MESA_FORMAT_DEPTH_COMPONENT, /* MesaFormat */
GL_DEPTH_COMPONENT, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
sizeof(GLfloat) * 8, /* DepthBits */
sizeof(GLfloat), /* TexelBytes */
fetch_1d_texel_depth_component, /* FetchTexel1D */
fetch_2d_texel_depth_component, /* FetchTexel2D */
fetch_3d_texel_depth_component, /* FetchTexel3D */
};
 
 
/* =============================================================
* Hardware formats:
*/
 
const struct gl_texture_format _mesa_texformat_rgba8888 = {
MESA_FORMAT_RGBA8888, /* MesaFormat */
GL_RGBA, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
8, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
4, /* TexelBytes */
fetch_1d_texel_rgba8888, /* FetchTexel1D */
fetch_2d_texel_rgba8888, /* FetchTexel2D */
fetch_3d_texel_rgba8888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_argb8888 = {
MESA_FORMAT_ARGB8888, /* MesaFormat */
GL_RGBA, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
8, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
4, /* TexelBytes */
fetch_1d_texel_argb8888, /* FetchTexel1D */
fetch_2d_texel_argb8888, /* FetchTexel2D */
fetch_3d_texel_argb8888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_rgb888 = {
MESA_FORMAT_RGB888, /* MesaFormat */
GL_RGB, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
3, /* TexelBytes */
fetch_1d_texel_rgb888, /* FetchTexel1D */
fetch_2d_texel_rgb888, /* FetchTexel2D */
fetch_3d_texel_rgb888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_rgb565 = {
MESA_FORMAT_RGB565, /* MesaFormat */
GL_RGB, /* BaseFormat */
5, /* RedBits */
6, /* GreenBits */
5, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_rgb565, /* FetchTexel1D */
fetch_2d_texel_rgb565, /* FetchTexel2D */
fetch_3d_texel_rgb565, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_argb4444 = {
MESA_FORMAT_ARGB4444, /* MesaFormat */
GL_RGBA, /* BaseFormat */
4, /* RedBits */
4, /* GreenBits */
4, /* BlueBits */
4, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_argb4444, /* FetchTexel1D */
fetch_2d_texel_argb4444, /* FetchTexel2D */
fetch_3d_texel_argb4444, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_argb1555 = {
MESA_FORMAT_ARGB1555, /* MesaFormat */
GL_RGBA, /* BaseFormat */
5, /* RedBits */
5, /* GreenBits */
5, /* BlueBits */
1, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_argb1555, /* FetchTexel1D */
fetch_2d_texel_argb1555, /* FetchTexel2D */
fetch_3d_texel_argb1555, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_al88 = {
MESA_FORMAT_AL88, /* MesaFormat */
GL_LUMINANCE_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
8, /* AlphaBits */
8, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_al88, /* FetchTexel1D */
fetch_2d_texel_al88, /* FetchTexel2D */
fetch_3d_texel_al88, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_rgb332 = {
MESA_FORMAT_RGB332, /* MesaFormat */
GL_RGB, /* BaseFormat */
3, /* RedBits */
3, /* GreenBits */
2, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_rgb332, /* FetchTexel1D */
fetch_2d_texel_rgb332, /* FetchTexel2D */
fetch_3d_texel_rgb332, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_a8 = {
MESA_FORMAT_A8, /* MesaFormat */
GL_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
8, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_a8, /* FetchTexel1D */
fetch_2d_texel_a8, /* FetchTexel2D */
fetch_3d_texel_a8, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_l8 = {
MESA_FORMAT_L8, /* MesaFormat */
GL_LUMINANCE, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
8, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_l8, /* FetchTexel1D */
fetch_2d_texel_l8, /* FetchTexel2D */
fetch_3d_texel_l8, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_i8 = {
MESA_FORMAT_I8, /* MesaFormat */
GL_INTENSITY, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
8, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_i8, /* FetchTexel1D */
fetch_2d_texel_i8, /* FetchTexel2D */
fetch_3d_texel_i8, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_ci8 = {
MESA_FORMAT_CI8, /* MesaFormat */
GL_COLOR_INDEX, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
8, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_ci8, /* FetchTexel1D */
fetch_2d_texel_ci8, /* FetchTexel2D */
fetch_3d_texel_ci8, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_ycbcr = {
MESA_FORMAT_YCBCR, /* MesaFormat */
GL_YCBCR_MESA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_ycbcr, /* FetchTexel1D */
fetch_2d_texel_ycbcr, /* FetchTexel2D */
fetch_3d_texel_ycbcr, /* FetchTexel3D */
};
 
 
const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
MESA_FORMAT_YCBCR_REV, /* MesaFormat */
GL_YCBCR_MESA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_ycbcr_rev, /* FetchTexel1D */
fetch_2d_texel_ycbcr_rev, /* FetchTexel2D */
fetch_3d_texel_ycbcr_rev, /* FetchTexel3D */
};
 
 
/* Big-endian */
#if 0
const struct gl_texture_format _mesa_texformat_abgr8888 = {
MESA_FORMAT_ABGR8888, /* MesaFormat */
GL_RGBA, /* BaseFormat */
GL_UNSIGNED_INT_8_8_8_8, /* Type */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
8, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
4, /* TexelBytes */
fetch_1d_texel_abgr8888, /* FetchTexel1D */
fetch_2d_texel_abgr8888, /* FetchTexel2D */
fetch_3d_texel_abgr8888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgra8888 = {
MESA_FORMAT_BGRA8888, /* MesaFormat */
GL_RGBA, /* BaseFormat */
GL_UNSIGNED_INT_8_8_8_8, /* Type */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
8, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
4, /* TexelBytes */
fetch_1d_texel_bgra8888, /* FetchTexel1D */
fetch_2d_texel_bgra8888, /* FetchTexel2D */
fetch_3d_texel_bgra8888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgr888 = {
MESA_FORMAT_BGR888, /* MesaFormat */
GL_RGB, /* BaseFormat */
GL_UNSIGNED_BYTE, /* Type */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
3, /* TexelBytes */
fetch_1d_texel_bgr888, /* FetchTexel1D */
fetch_2d_texel_bgr888, /* FetchTexel2D */
fetch_3d_texel_bgr888, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgr565 = {
MESA_FORMAT_BGR565, /* MesaFormat */
GL_RGB, /* BaseFormat */
GL_UNSIGNED_SHORT_5_6_5, /* Type */
5, /* RedBits */
6, /* GreenBits */
5, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_bgr565, /* FetchTexel1D */
fetch_2d_texel_bgr565, /* FetchTexel2D */
fetch_3d_texel_bgr565, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgra4444 = {
MESA_FORMAT_BGRA4444, /* MesaFormat */
GL_RGBA, /* BaseFormat */
GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
4, /* RedBits */
4, /* GreenBits */
4, /* BlueBits */
4, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_bgra4444, /* FetchTexel1D */
fetch_2d_texel_bgra4444, /* FetchTexel2D */
fetch_3d_texel_bgra4444, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgra5551 = {
MESA_FORMAT_BGRA5551, /* MesaFormat */
GL_RGBA, /* BaseFormat */
GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
5, /* RedBits */
5, /* GreenBits */
5, /* BlueBits */
1, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_bgra1555, /* FetchTexel1D */
fetch_2d_texel_bgra1555, /* FetchTexel2D */
fetch_3d_texel_bgra1555, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_la88 = {
MESA_FORMAT_LA88, /* MesaFormat */
GL_LUMINANCE_ALPHA, /* BaseFormat */
GL_UNSIGNED_BYTE, /* Type */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
8, /* AlphaBits */
8, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
2, /* TexelBytes */
fetch_1d_texel_la88, /* FetchTexel1D */
fetch_2d_texel_la88, /* FetchTexel2D */
fetch_3d_texel_la88, /* FetchTexel3D */
};
 
const struct gl_texture_format _mesa_texformat_bgr233 = {
MESA_FORMAT_BGR233, /* MesaFormat */
GL_RGB, /* BaseFormat */
GL_UNSIGNED_BYTE_3_3_2, /* Type */
3, /* RedBits */
3, /* GreenBits */
2, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
1, /* TexelBytes */
fetch_1d_texel_bgr233, /* FetchTexel1D */
fetch_2d_texel_bgr233, /* FetchTexel2D */
fetch_3d_texel_bgr233, /* FetchTexel3D */
};
#endif
 
/* =============================================================
* Null format (useful for proxy textures):
*/
 
const struct gl_texture_format _mesa_null_texformat = {
-1, /* MesaFormat */
0, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
0, /* AlphaBits */
0, /* LuminanceBits */
0, /* IntensityBits */
0, /* IndexBits */
0, /* DepthBits */
0, /* TexelBytes */
fetch_null_texel, /* FetchTexel1D */
fetch_null_texel, /* FetchTexel2D */
fetch_null_texel, /* FetchTexel3D */
};
 
 
GLboolean
_mesa_is_hardware_tex_format( const struct gl_texture_format *format )
{
return (format->MesaFormat < MESA_FORMAT_RGBA);
}
 
 
/* Given an internal texture format (or 1, 2, 3, 4) return a pointer
* to a gl_texture_format which which to store the texture.
* This is called via ctx->Driver.ChooseTextureFormat().
* Hardware drivers typically override this function with a specialized
* version.
*/
const struct gl_texture_format *
_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
GLenum format, GLenum type )
{
(void) format;
(void) type;
 
switch ( internalFormat ) {
/* GH: Bias towards GL_RGB, GL_RGBA texture formats. This has
* got to be better than sticking them way down the end of this
* huge list.
*/
case 4: /* Quake3 uses this... */
case GL_RGBA:
return &_mesa_texformat_rgba;
 
case 3: /* ... and this. */
case GL_RGB:
return &_mesa_texformat_rgb;
 
/* GH: Okay, keep checking as normal. Still test for GL_RGB,
* GL_RGBA formats first.
*/
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return &_mesa_texformat_rgba;
 
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return &_mesa_texformat_rgb;
 
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return &_mesa_texformat_alpha;
 
case 1:
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return &_mesa_texformat_luminance;
 
case 2:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return &_mesa_texformat_luminance_alpha;
 
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return &_mesa_texformat_intensity;
 
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
return &_mesa_texformat_color_index;
 
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16_SGIX:
case GL_DEPTH_COMPONENT24_SGIX:
case GL_DEPTH_COMPONENT32_SGIX:
if (!ctx->Extensions.SGIX_depth_texture)
_mesa_problem(ctx, "depth format without GL_SGIX_depth_texture");
return &_mesa_texformat_depth_component;
 
case GL_COMPRESSED_ALPHA_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_alpha;
case GL_COMPRESSED_LUMINANCE_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_luminance;
case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_luminance_alpha;
case GL_COMPRESSED_INTENSITY_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_intensity;
case GL_COMPRESSED_RGB_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_rgb;
case GL_COMPRESSED_RGBA_ARB:
if (!ctx->Extensions.ARB_texture_compression)
_mesa_problem(ctx, "texture compression extension not enabled");
return &_mesa_texformat_rgba;
 
/* GL_MESA_ycrcr_texture */
case GL_YCBCR_MESA:
if (type == GL_UNSIGNED_SHORT_8_8_MESA)
return &_mesa_texformat_ycbcr;
else
return &_mesa_texformat_ycbcr_rev;
 
default:
_mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
return NULL;
}
}
 
 
 
 
/*
* Return the base texture format for the given compressed format
* Called via ctx->Driver.BaseCompressedTexFormat().
* This function is used by software rasterizers. Hardware drivers
* which support texture compression should not use this function but
* a specialized function instead.
*/
GLint
_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat)
{
switch (intFormat) {
case GL_COMPRESSED_ALPHA_ARB:
return GL_ALPHA;
case GL_COMPRESSED_LUMINANCE_ARB:
return GL_LUMINANCE;
case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
return GL_LUMINANCE_ALPHA;
case GL_COMPRESSED_INTENSITY_ARB:
return GL_INTENSITY;
case GL_COMPRESSED_RGB_ARB:
return GL_RGB;
case GL_COMPRESSED_RGBA_ARB:
return GL_RGBA;
default:
return -1; /* not a recognized compressed format */
}
}
/shark/trunk/ports/mesa/src/colortab.h
0,0 → 1,87
/* $Id: colortab.h,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef COLORTAB_H
#define COLORTAB_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_init_colortable( struct gl_color_table *p );
 
extern void
_mesa_free_colortable_data( struct gl_color_table *p );
 
 
extern void
_mesa_ColorTable( GLenum target, GLenum internalformat,
GLsizei width, GLenum format, GLenum type,
const GLvoid *table );
 
 
extern void
_mesa_ColorSubTable( GLenum target, GLsizei start,
GLsizei count, GLenum format, GLenum type,
const GLvoid *table );
 
 
extern void
_mesa_CopyColorSubTable(GLenum target, GLsizei start,
GLint x, GLint y, GLsizei width);
 
 
extern void
_mesa_CopyColorTable(GLenum target, GLenum internalformat,
GLint x, GLint y, GLsizei width);
 
 
extern void
_mesa_GetColorTable( GLenum target, GLenum format,
GLenum type, GLvoid *table );
 
 
extern void
_mesa_ColorTableParameterfv(GLenum target, GLenum pname,
const GLfloat *params);
 
 
extern void
_mesa_ColorTableParameteriv(GLenum target, GLenum pname,
const GLint *params);
 
 
extern void
_mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params );
 
 
extern void
_mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params );
 
 
#endif
/shark/trunk/ports/mesa/src/fog.c
0,0 → 1,160
/* $Id: fog.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "fog.h"
#include "mtypes.h"
 
 
 
void
_mesa_Fogf(GLenum pname, GLfloat param)
{
_mesa_Fogfv(pname, &param);
}
 
 
void
_mesa_Fogi(GLenum pname, GLint param )
{
GLfloat fparam = (GLfloat) param;
_mesa_Fogfv(pname, &fparam);
}
 
 
void
_mesa_Fogiv(GLenum pname, const GLint *params )
{
GLfloat p[4];
switch (pname) {
case GL_FOG_MODE:
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
case GL_FOG_INDEX:
case GL_FOG_COORDINATE_SOURCE_EXT:
p[0] = (GLfloat) *params;
break;
case GL_FOG_COLOR:
p[0] = INT_TO_FLOAT( params[0] );
p[1] = INT_TO_FLOAT( params[1] );
p[2] = INT_TO_FLOAT( params[2] );
p[3] = INT_TO_FLOAT( params[3] );
break;
default:
/* Error will be caught later in _mesa_Fogfv */
;
}
_mesa_Fogfv(pname, p);
}
 
 
void
_mesa_Fogfv( GLenum pname, const GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLenum m;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (pname) {
case GL_FOG_MODE:
m = (GLenum) (GLint) *params;
switch (m) {
case GL_LINEAR:
case GL_EXP:
case GL_EXP2:
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
return;
}
if (ctx->Fog.Mode == m)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Mode = m;
break;
case GL_FOG_DENSITY:
if (*params<0.0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glFog" );
return;
}
if (ctx->Fog.Density == *params)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Density = *params;
break;
case GL_FOG_START:
if (ctx->Fog.Start == *params)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Start = *params;
break;
case GL_FOG_END:
if (ctx->Fog.End == *params)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.End = *params;
break;
case GL_FOG_INDEX:
if (ctx->Fog.Index == *params)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Index = *params;
break;
case GL_FOG_COLOR:
if (TEST_EQ_4V(ctx->Fog.Color, params))
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Color[0] = params[0];
ctx->Fog.Color[1] = params[1];
ctx->Fog.Color[2] = params[2];
ctx->Fog.Color[3] = params[3];
break;
case GL_FOG_COORDINATE_SOURCE_EXT: {
GLenum p = (GLenum) (GLint) *params;
if (!ctx->Extensions.EXT_fog_coord ||
(p != GL_FOG_COORDINATE_EXT && p != GL_FRAGMENT_DEPTH_EXT)) {
_mesa_error(ctx, GL_INVALID_ENUM, "glFog");
return;
}
if (ctx->Fog.FogCoordinateSource == p)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.FogCoordinateSource = p;
break;
}
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
return;
}
 
if (ctx->Driver.Fogfv) {
(*ctx->Driver.Fogfv)( ctx, pname, params );
}
}
/shark/trunk/ports/mesa/src/glprocs.h
0,0 → 1,814
/* DO NOT EDIT - This file generated automatically by glprocs.py script */
 
/* This file is only included by glapi.c and is used for
* the GetProcAddress() function
*/
 
static struct name_address_offset static_functions[] = {
{ "glNewList", (GLvoid *) glNewList, _gloffset_NewList },
{ "glEndList", (GLvoid *) glEndList, _gloffset_EndList },
{ "glCallList", (GLvoid *) glCallList, _gloffset_CallList },
{ "glCallLists", (GLvoid *) glCallLists, _gloffset_CallLists },
{ "glDeleteLists", (GLvoid *) glDeleteLists, _gloffset_DeleteLists },
{ "glGenLists", (GLvoid *) glGenLists, _gloffset_GenLists },
{ "glListBase", (GLvoid *) glListBase, _gloffset_ListBase },
{ "glBegin", (GLvoid *) glBegin, _gloffset_Begin },
{ "glBitmap", (GLvoid *) glBitmap, _gloffset_Bitmap },
{ "glColor3b", (GLvoid *) glColor3b, _gloffset_Color3b },
{ "glColor3bv", (GLvoid *) glColor3bv, _gloffset_Color3bv },
{ "glColor3d", (GLvoid *) glColor3d, _gloffset_Color3d },
{ "glColor3dv", (GLvoid *) glColor3dv, _gloffset_Color3dv },
{ "glColor3f", (GLvoid *) glColor3f, _gloffset_Color3f },
{ "glColor3fv", (GLvoid *) glColor3fv, _gloffset_Color3fv },
{ "glColor3i", (GLvoid *) glColor3i, _gloffset_Color3i },
{ "glColor3iv", (GLvoid *) glColor3iv, _gloffset_Color3iv },
{ "glColor3s", (GLvoid *) glColor3s, _gloffset_Color3s },
{ "glColor3sv", (GLvoid *) glColor3sv, _gloffset_Color3sv },
{ "glColor3ub", (GLvoid *) glColor3ub, _gloffset_Color3ub },
{ "glColor3ubv", (GLvoid *) glColor3ubv, _gloffset_Color3ubv },
{ "glColor3ui", (GLvoid *) glColor3ui, _gloffset_Color3ui },
{ "glColor3uiv", (GLvoid *) glColor3uiv, _gloffset_Color3uiv },
{ "glColor3us", (GLvoid *) glColor3us, _gloffset_Color3us },
{ "glColor3usv", (GLvoid *) glColor3usv, _gloffset_Color3usv },
{ "glColor4b", (GLvoid *) glColor4b, _gloffset_Color4b },
{ "glColor4bv", (GLvoid *) glColor4bv, _gloffset_Color4bv },
{ "glColor4d", (GLvoid *) glColor4d, _gloffset_Color4d },
{ "glColor4dv", (GLvoid *) glColor4dv, _gloffset_Color4dv },
{ "glColor4f", (GLvoid *) glColor4f, _gloffset_Color4f },
{ "glColor4fv", (GLvoid *) glColor4fv, _gloffset_Color4fv },
{ "glColor4i", (GLvoid *) glColor4i, _gloffset_Color4i },
{ "glColor4iv", (GLvoid *) glColor4iv, _gloffset_Color4iv },
{ "glColor4s", (GLvoid *) glColor4s, _gloffset_Color4s },
{ "glColor4sv", (GLvoid *) glColor4sv, _gloffset_Color4sv },
{ "glColor4ub", (GLvoid *) glColor4ub, _gloffset_Color4ub },
{ "glColor4ubv", (GLvoid *) glColor4ubv, _gloffset_Color4ubv },
{ "glColor4ui", (GLvoid *) glColor4ui, _gloffset_Color4ui },
{ "glColor4uiv", (GLvoid *) glColor4uiv, _gloffset_Color4uiv },
{ "glColor4us", (GLvoid *) glColor4us, _gloffset_Color4us },
{ "glColor4usv", (GLvoid *) glColor4usv, _gloffset_Color4usv },
{ "glEdgeFlag", (GLvoid *) glEdgeFlag, _gloffset_EdgeFlag },
{ "glEdgeFlagv", (GLvoid *) glEdgeFlagv, _gloffset_EdgeFlagv },
{ "glEnd", (GLvoid *) glEnd, _gloffset_End },
{ "glIndexd", (GLvoid *) glIndexd, _gloffset_Indexd },
{ "glIndexdv", (GLvoid *) glIndexdv, _gloffset_Indexdv },
{ "glIndexf", (GLvoid *) glIndexf, _gloffset_Indexf },
{ "glIndexfv", (GLvoid *) glIndexfv, _gloffset_Indexfv },
{ "glIndexi", (GLvoid *) glIndexi, _gloffset_Indexi },
{ "glIndexiv", (GLvoid *) glIndexiv, _gloffset_Indexiv },
{ "glIndexs", (GLvoid *) glIndexs, _gloffset_Indexs },
{ "glIndexsv", (GLvoid *) glIndexsv, _gloffset_Indexsv },
{ "glNormal3b", (GLvoid *) glNormal3b, _gloffset_Normal3b },
{ "glNormal3bv", (GLvoid *) glNormal3bv, _gloffset_Normal3bv },
{ "glNormal3d", (GLvoid *) glNormal3d, _gloffset_Normal3d },
{ "glNormal3dv", (GLvoid *) glNormal3dv, _gloffset_Normal3dv },
{ "glNormal3f", (GLvoid *) glNormal3f, _gloffset_Normal3f },
{ "glNormal3fv", (GLvoid *) glNormal3fv, _gloffset_Normal3fv },
{ "glNormal3i", (GLvoid *) glNormal3i, _gloffset_Normal3i },
{ "glNormal3iv", (GLvoid *) glNormal3iv, _gloffset_Normal3iv },
{ "glNormal3s", (GLvoid *) glNormal3s, _gloffset_Normal3s },
{ "glNormal3sv", (GLvoid *) glNormal3sv, _gloffset_Normal3sv },
{ "glRasterPos2d", (GLvoid *) glRasterPos2d, _gloffset_RasterPos2d },
{ "glRasterPos2dv", (GLvoid *) glRasterPos2dv, _gloffset_RasterPos2dv },
{ "glRasterPos2f", (GLvoid *) glRasterPos2f, _gloffset_RasterPos2f },
{ "glRasterPos2fv", (GLvoid *) glRasterPos2fv, _gloffset_RasterPos2fv },
{ "glRasterPos2i", (GLvoid *) glRasterPos2i, _gloffset_RasterPos2i },
{ "glRasterPos2iv", (GLvoid *) glRasterPos2iv, _gloffset_RasterPos2iv },
{ "glRasterPos2s", (GLvoid *) glRasterPos2s, _gloffset_RasterPos2s },
{ "glRasterPos2sv", (GLvoid *) glRasterPos2sv, _gloffset_RasterPos2sv },
{ "glRasterPos3d", (GLvoid *) glRasterPos3d, _gloffset_RasterPos3d },
{ "glRasterPos3dv", (GLvoid *) glRasterPos3dv, _gloffset_RasterPos3dv },
{ "glRasterPos3f", (GLvoid *) glRasterPos3f, _gloffset_RasterPos3f },
{ "glRasterPos3fv", (GLvoid *) glRasterPos3fv, _gloffset_RasterPos3fv },
{ "glRasterPos3i", (GLvoid *) glRasterPos3i, _gloffset_RasterPos3i },
{ "glRasterPos3iv", (GLvoid *) glRasterPos3iv, _gloffset_RasterPos3iv },
{ "glRasterPos3s", (GLvoid *) glRasterPos3s, _gloffset_RasterPos3s },
{ "glRasterPos3sv", (GLvoid *) glRasterPos3sv, _gloffset_RasterPos3sv },
{ "glRasterPos4d", (GLvoid *) glRasterPos4d, _gloffset_RasterPos4d },
{ "glRasterPos4dv", (GLvoid *) glRasterPos4dv, _gloffset_RasterPos4dv },
{ "glRasterPos4f", (GLvoid *) glRasterPos4f, _gloffset_RasterPos4f },
{ "glRasterPos4fv", (GLvoid *) glRasterPos4fv, _gloffset_RasterPos4fv },
{ "glRasterPos4i", (GLvoid *) glRasterPos4i, _gloffset_RasterPos4i },
{ "glRasterPos4iv", (GLvoid *) glRasterPos4iv, _gloffset_RasterPos4iv },
{ "glRasterPos4s", (GLvoid *) glRasterPos4s, _gloffset_RasterPos4s },
{ "glRasterPos4sv", (GLvoid *) glRasterPos4sv, _gloffset_RasterPos4sv },
{ "glRectd", (GLvoid *) glRectd, _gloffset_Rectd },
{ "glRectdv", (GLvoid *) glRectdv, _gloffset_Rectdv },
{ "glRectf", (GLvoid *) glRectf, _gloffset_Rectf },
{ "glRectfv", (GLvoid *) glRectfv, _gloffset_Rectfv },
{ "glRecti", (GLvoid *) glRecti, _gloffset_Recti },
{ "glRectiv", (GLvoid *) glRectiv, _gloffset_Rectiv },
{ "glRects", (GLvoid *) glRects, _gloffset_Rects },
{ "glRectsv", (GLvoid *) glRectsv, _gloffset_Rectsv },
{ "glTexCoord1d", (GLvoid *) glTexCoord1d, _gloffset_TexCoord1d },
{ "glTexCoord1dv", (GLvoid *) glTexCoord1dv, _gloffset_TexCoord1dv },
{ "glTexCoord1f", (GLvoid *) glTexCoord1f, _gloffset_TexCoord1f },
{ "glTexCoord1fv", (GLvoid *) glTexCoord1fv, _gloffset_TexCoord1fv },
{ "glTexCoord1i", (GLvoid *) glTexCoord1i, _gloffset_TexCoord1i },
{ "glTexCoord1iv", (GLvoid *) glTexCoord1iv, _gloffset_TexCoord1iv },
{ "glTexCoord1s", (GLvoid *) glTexCoord1s, _gloffset_TexCoord1s },
{ "glTexCoord1sv", (GLvoid *) glTexCoord1sv, _gloffset_TexCoord1sv },
{ "glTexCoord2d", (GLvoid *) glTexCoord2d, _gloffset_TexCoord2d },
{ "glTexCoord2dv", (GLvoid *) glTexCoord2dv, _gloffset_TexCoord2dv },
{ "glTexCoord2f", (GLvoid *) glTexCoord2f, _gloffset_TexCoord2f },
{ "glTexCoord2fv", (GLvoid *) glTexCoord2fv, _gloffset_TexCoord2fv },
{ "glTexCoord2i", (GLvoid *) glTexCoord2i, _gloffset_TexCoord2i },
{ "glTexCoord2iv", (GLvoid *) glTexCoord2iv, _gloffset_TexCoord2iv },
{ "glTexCoord2s", (GLvoid *) glTexCoord2s, _gloffset_TexCoord2s },
{ "glTexCoord2sv", (GLvoid *) glTexCoord2sv, _gloffset_TexCoord2sv },
{ "glTexCoord3d", (GLvoid *) glTexCoord3d, _gloffset_TexCoord3d },
{ "glTexCoord3dv", (GLvoid *) glTexCoord3dv, _gloffset_TexCoord3dv },
{ "glTexCoord3f", (GLvoid *) glTexCoord3f, _gloffset_TexCoord3f },
{ "glTexCoord3fv", (GLvoid *) glTexCoord3fv, _gloffset_TexCoord3fv },
{ "glTexCoord3i", (GLvoid *) glTexCoord3i, _gloffset_TexCoord3i },
{ "glTexCoord3iv", (GLvoid *) glTexCoord3iv, _gloffset_TexCoord3iv },
{ "glTexCoord3s", (GLvoid *) glTexCoord3s, _gloffset_TexCoord3s },
{ "glTexCoord3sv", (GLvoid *) glTexCoord3sv, _gloffset_TexCoord3sv },
{ "glTexCoord4d", (GLvoid *) glTexCoord4d, _gloffset_TexCoord4d },
{ "glTexCoord4dv", (GLvoid *) glTexCoord4dv, _gloffset_TexCoord4dv },
{ "glTexCoord4f", (GLvoid *) glTexCoord4f, _gloffset_TexCoord4f },
{ "glTexCoord4fv", (GLvoid *) glTexCoord4fv, _gloffset_TexCoord4fv },
{ "glTexCoord4i", (GLvoid *) glTexCoord4i, _gloffset_TexCoord4i },
{ "glTexCoord4iv", (GLvoid *) glTexCoord4iv, _gloffset_TexCoord4iv },
{ "glTexCoord4s", (GLvoid *) glTexCoord4s, _gloffset_TexCoord4s },
{ "glTexCoord4sv", (GLvoid *) glTexCoord4sv, _gloffset_TexCoord4sv },
{ "glVertex2d", (GLvoid *) glVertex2d, _gloffset_Vertex2d },
{ "glVertex2dv", (GLvoid *) glVertex2dv, _gloffset_Vertex2dv },
{ "glVertex2f", (GLvoid *) glVertex2f, _gloffset_Vertex2f },
{ "glVertex2fv", (GLvoid *) glVertex2fv, _gloffset_Vertex2fv },
{ "glVertex2i", (GLvoid *) glVertex2i, _gloffset_Vertex2i },
{ "glVertex2iv", (GLvoid *) glVertex2iv, _gloffset_Vertex2iv },
{ "glVertex2s", (GLvoid *) glVertex2s, _gloffset_Vertex2s },
{ "glVertex2sv", (GLvoid *) glVertex2sv, _gloffset_Vertex2sv },
{ "glVertex3d", (GLvoid *) glVertex3d, _gloffset_Vertex3d },
{ "glVertex3dv", (GLvoid *) glVertex3dv, _gloffset_Vertex3dv },
{ "glVertex3f", (GLvoid *) glVertex3f, _gloffset_Vertex3f },
{ "glVertex3fv", (GLvoid *) glVertex3fv, _gloffset_Vertex3fv },
{ "glVertex3i", (GLvoid *) glVertex3i, _gloffset_Vertex3i },
{ "glVertex3iv", (GLvoid *) glVertex3iv, _gloffset_Vertex3iv },
{ "glVertex3s", (GLvoid *) glVertex3s, _gloffset_Vertex3s },
{ "glVertex3sv", (GLvoid *) glVertex3sv, _gloffset_Vertex3sv },
{ "glVertex4d", (GLvoid *) glVertex4d, _gloffset_Vertex4d },
{ "glVertex4dv", (GLvoid *) glVertex4dv, _gloffset_Vertex4dv },
{ "glVertex4f", (GLvoid *) glVertex4f, _gloffset_Vertex4f },
{ "glVertex4fv", (GLvoid *) glVertex4fv, _gloffset_Vertex4fv },
{ "glVertex4i", (GLvoid *) glVertex4i, _gloffset_Vertex4i },
{ "glVertex4iv", (GLvoid *) glVertex4iv, _gloffset_Vertex4iv },
{ "glVertex4s", (GLvoid *) glVertex4s, _gloffset_Vertex4s },
{ "glVertex4sv", (GLvoid *) glVertex4sv, _gloffset_Vertex4sv },
{ "glClipPlane", (GLvoid *) glClipPlane, _gloffset_ClipPlane },
{ "glColorMaterial", (GLvoid *) glColorMaterial, _gloffset_ColorMaterial },
{ "glCullFace", (GLvoid *) glCullFace, _gloffset_CullFace },
{ "glFogf", (GLvoid *) glFogf, _gloffset_Fogf },
{ "glFogfv", (GLvoid *) glFogfv, _gloffset_Fogfv },
{ "glFogi", (GLvoid *) glFogi, _gloffset_Fogi },
{ "glFogiv", (GLvoid *) glFogiv, _gloffset_Fogiv },
{ "glFrontFace", (GLvoid *) glFrontFace, _gloffset_FrontFace },
{ "glHint", (GLvoid *) glHint, _gloffset_Hint },
{ "glLightf", (GLvoid *) glLightf, _gloffset_Lightf },
{ "glLightfv", (GLvoid *) glLightfv, _gloffset_Lightfv },
{ "glLighti", (GLvoid *) glLighti, _gloffset_Lighti },
{ "glLightiv", (GLvoid *) glLightiv, _gloffset_Lightiv },
{ "glLightModelf", (GLvoid *) glLightModelf, _gloffset_LightModelf },
{ "glLightModelfv", (GLvoid *) glLightModelfv, _gloffset_LightModelfv },
{ "glLightModeli", (GLvoid *) glLightModeli, _gloffset_LightModeli },
{ "glLightModeliv", (GLvoid *) glLightModeliv, _gloffset_LightModeliv },
{ "glLineStipple", (GLvoid *) glLineStipple, _gloffset_LineStipple },
{ "glLineWidth", (GLvoid *) glLineWidth, _gloffset_LineWidth },
{ "glMaterialf", (GLvoid *) glMaterialf, _gloffset_Materialf },
{ "glMaterialfv", (GLvoid *) glMaterialfv, _gloffset_Materialfv },
{ "glMateriali", (GLvoid *) glMateriali, _gloffset_Materiali },
{ "glMaterialiv", (GLvoid *) glMaterialiv, _gloffset_Materialiv },
{ "glPointSize", (GLvoid *) glPointSize, _gloffset_PointSize },
{ "glPolygonMode", (GLvoid *) glPolygonMode, _gloffset_PolygonMode },
{ "glPolygonStipple", (GLvoid *) glPolygonStipple, _gloffset_PolygonStipple },
{ "glScissor", (GLvoid *) glScissor, _gloffset_Scissor },
{ "glShadeModel", (GLvoid *) glShadeModel, _gloffset_ShadeModel },
{ "glTexParameterf", (GLvoid *) glTexParameterf, _gloffset_TexParameterf },
{ "glTexParameterfv", (GLvoid *) glTexParameterfv, _gloffset_TexParameterfv },
{ "glTexParameteri", (GLvoid *) glTexParameteri, _gloffset_TexParameteri },
{ "glTexParameteriv", (GLvoid *) glTexParameteriv, _gloffset_TexParameteriv },
{ "glTexImage1D", (GLvoid *) glTexImage1D, _gloffset_TexImage1D },
{ "glTexImage2D", (GLvoid *) glTexImage2D, _gloffset_TexImage2D },
{ "glTexEnvf", (GLvoid *) glTexEnvf, _gloffset_TexEnvf },
{ "glTexEnvfv", (GLvoid *) glTexEnvfv, _gloffset_TexEnvfv },
{ "glTexEnvi", (GLvoid *) glTexEnvi, _gloffset_TexEnvi },
{ "glTexEnviv", (GLvoid *) glTexEnviv, _gloffset_TexEnviv },
{ "glTexGend", (GLvoid *) glTexGend, _gloffset_TexGend },
{ "glTexGendv", (GLvoid *) glTexGendv, _gloffset_TexGendv },
{ "glTexGenf", (GLvoid *) glTexGenf, _gloffset_TexGenf },
{ "glTexGenfv", (GLvoid *) glTexGenfv, _gloffset_TexGenfv },
{ "glTexGeni", (GLvoid *) glTexGeni, _gloffset_TexGeni },
{ "glTexGeniv", (GLvoid *) glTexGeniv, _gloffset_TexGeniv },
{ "glFeedbackBuffer", (GLvoid *) glFeedbackBuffer, _gloffset_FeedbackBuffer },
{ "glSelectBuffer", (GLvoid *) glSelectBuffer, _gloffset_SelectBuffer },
{ "glRenderMode", (GLvoid *) glRenderMode, _gloffset_RenderMode },
{ "glInitNames", (GLvoid *) glInitNames, _gloffset_InitNames },
{ "glLoadName", (GLvoid *) glLoadName, _gloffset_LoadName },
{ "glPassThrough", (GLvoid *) glPassThrough, _gloffset_PassThrough },
{ "glPopName", (GLvoid *) glPopName, _gloffset_PopName },
{ "glPushName", (GLvoid *) glPushName, _gloffset_PushName },
{ "glDrawBuffer", (GLvoid *) glDrawBuffer, _gloffset_DrawBuffer },
{ "glClear", (GLvoid *) glClear, _gloffset_Clear },
{ "glClearAccum", (GLvoid *) glClearAccum, _gloffset_ClearAccum },
{ "glClearIndex", (GLvoid *) glClearIndex, _gloffset_ClearIndex },
{ "glClearColor", (GLvoid *) glClearColor, _gloffset_ClearColor },
{ "glClearStencil", (GLvoid *) glClearStencil, _gloffset_ClearStencil },
{ "glClearDepth", (GLvoid *) glClearDepth, _gloffset_ClearDepth },
{ "glStencilMask", (GLvoid *) glStencilMask, _gloffset_StencilMask },
{ "glColorMask", (GLvoid *) glColorMask, _gloffset_ColorMask },
{ "glDepthMask", (GLvoid *) glDepthMask, _gloffset_DepthMask },
{ "glIndexMask", (GLvoid *) glIndexMask, _gloffset_IndexMask },
{ "glAccum", (GLvoid *) glAccum, _gloffset_Accum },
{ "glDisable", (GLvoid *) glDisable, _gloffset_Disable },
{ "glEnable", (GLvoid *) glEnable, _gloffset_Enable },
{ "glFinish", (GLvoid *) glFinish, _gloffset_Finish },
{ "glFlush", (GLvoid *) glFlush, _gloffset_Flush },
{ "glPopAttrib", (GLvoid *) glPopAttrib, _gloffset_PopAttrib },
{ "glPushAttrib", (GLvoid *) glPushAttrib, _gloffset_PushAttrib },
{ "glMap1d", (GLvoid *) glMap1d, _gloffset_Map1d },
{ "glMap1f", (GLvoid *) glMap1f, _gloffset_Map1f },
{ "glMap2d", (GLvoid *) glMap2d, _gloffset_Map2d },
{ "glMap2f", (GLvoid *) glMap2f, _gloffset_Map2f },
{ "glMapGrid1d", (GLvoid *) glMapGrid1d, _gloffset_MapGrid1d },
{ "glMapGrid1f", (GLvoid *) glMapGrid1f, _gloffset_MapGrid1f },
{ "glMapGrid2d", (GLvoid *) glMapGrid2d, _gloffset_MapGrid2d },
{ "glMapGrid2f", (GLvoid *) glMapGrid2f, _gloffset_MapGrid2f },
{ "glEvalCoord1d", (GLvoid *) glEvalCoord1d, _gloffset_EvalCoord1d },
{ "glEvalCoord1dv", (GLvoid *) glEvalCoord1dv, _gloffset_EvalCoord1dv },
{ "glEvalCoord1f", (GLvoid *) glEvalCoord1f, _gloffset_EvalCoord1f },
{ "glEvalCoord1fv", (GLvoid *) glEvalCoord1fv, _gloffset_EvalCoord1fv },
{ "glEvalCoord2d", (GLvoid *) glEvalCoord2d, _gloffset_EvalCoord2d },
{ "glEvalCoord2dv", (GLvoid *) glEvalCoord2dv, _gloffset_EvalCoord2dv },
{ "glEvalCoord2f", (GLvoid *) glEvalCoord2f, _gloffset_EvalCoord2f },
{ "glEvalCoord2fv", (GLvoid *) glEvalCoord2fv, _gloffset_EvalCoord2fv },
{ "glEvalMesh1", (GLvoid *) glEvalMesh1, _gloffset_EvalMesh1 },
{ "glEvalPoint1", (GLvoid *) glEvalPoint1, _gloffset_EvalPoint1 },
{ "glEvalMesh2", (GLvoid *) glEvalMesh2, _gloffset_EvalMesh2 },
{ "glEvalPoint2", (GLvoid *) glEvalPoint2, _gloffset_EvalPoint2 },
{ "glAlphaFunc", (GLvoid *) glAlphaFunc, _gloffset_AlphaFunc },
{ "glBlendFunc", (GLvoid *) glBlendFunc, _gloffset_BlendFunc },
{ "glLogicOp", (GLvoid *) glLogicOp, _gloffset_LogicOp },
{ "glStencilFunc", (GLvoid *) glStencilFunc, _gloffset_StencilFunc },
{ "glStencilOp", (GLvoid *) glStencilOp, _gloffset_StencilOp },
{ "glDepthFunc", (GLvoid *) glDepthFunc, _gloffset_DepthFunc },
{ "glPixelZoom", (GLvoid *) glPixelZoom, _gloffset_PixelZoom },
{ "glPixelTransferf", (GLvoid *) glPixelTransferf, _gloffset_PixelTransferf },
{ "glPixelTransferi", (GLvoid *) glPixelTransferi, _gloffset_PixelTransferi },
{ "glPixelStoref", (GLvoid *) glPixelStoref, _gloffset_PixelStoref },
{ "glPixelStorei", (GLvoid *) glPixelStorei, _gloffset_PixelStorei },
{ "glPixelMapfv", (GLvoid *) glPixelMapfv, _gloffset_PixelMapfv },
{ "glPixelMapuiv", (GLvoid *) glPixelMapuiv, _gloffset_PixelMapuiv },
{ "glPixelMapusv", (GLvoid *) glPixelMapusv, _gloffset_PixelMapusv },
{ "glReadBuffer", (GLvoid *) glReadBuffer, _gloffset_ReadBuffer },
{ "glCopyPixels", (GLvoid *) glCopyPixels, _gloffset_CopyPixels },
{ "glReadPixels", (GLvoid *) glReadPixels, _gloffset_ReadPixels },
{ "glDrawPixels", (GLvoid *) glDrawPixels, _gloffset_DrawPixels },
{ "glGetBooleanv", (GLvoid *) glGetBooleanv, _gloffset_GetBooleanv },
{ "glGetClipPlane", (GLvoid *) glGetClipPlane, _gloffset_GetClipPlane },
{ "glGetDoublev", (GLvoid *) glGetDoublev, _gloffset_GetDoublev },
{ "glGetError", (GLvoid *) glGetError, _gloffset_GetError },
{ "glGetFloatv", (GLvoid *) glGetFloatv, _gloffset_GetFloatv },
{ "glGetIntegerv", (GLvoid *) glGetIntegerv, _gloffset_GetIntegerv },
{ "glGetLightfv", (GLvoid *) glGetLightfv, _gloffset_GetLightfv },
{ "glGetLightiv", (GLvoid *) glGetLightiv, _gloffset_GetLightiv },
{ "glGetMapdv", (GLvoid *) glGetMapdv, _gloffset_GetMapdv },
{ "glGetMapfv", (GLvoid *) glGetMapfv, _gloffset_GetMapfv },
{ "glGetMapiv", (GLvoid *) glGetMapiv, _gloffset_GetMapiv },
{ "glGetMaterialfv", (GLvoid *) glGetMaterialfv, _gloffset_GetMaterialfv },
{ "glGetMaterialiv", (GLvoid *) glGetMaterialiv, _gloffset_GetMaterialiv },
{ "glGetPixelMapfv", (GLvoid *) glGetPixelMapfv, _gloffset_GetPixelMapfv },
{ "glGetPixelMapuiv", (GLvoid *) glGetPixelMapuiv, _gloffset_GetPixelMapuiv },
{ "glGetPixelMapusv", (GLvoid *) glGetPixelMapusv, _gloffset_GetPixelMapusv },
{ "glGetPolygonStipple", (GLvoid *) glGetPolygonStipple, _gloffset_GetPolygonStipple },
{ "glGetString", (GLvoid *) glGetString, _gloffset_GetString },
{ "glGetTexEnvfv", (GLvoid *) glGetTexEnvfv, _gloffset_GetTexEnvfv },
{ "glGetTexEnviv", (GLvoid *) glGetTexEnviv, _gloffset_GetTexEnviv },
{ "glGetTexGendv", (GLvoid *) glGetTexGendv, _gloffset_GetTexGendv },
{ "glGetTexGenfv", (GLvoid *) glGetTexGenfv, _gloffset_GetTexGenfv },
{ "glGetTexGeniv", (GLvoid *) glGetTexGeniv, _gloffset_GetTexGeniv },
{ "glGetTexImage", (GLvoid *) glGetTexImage, _gloffset_GetTexImage },
{ "glGetTexParameterfv", (GLvoid *) glGetTexParameterfv, _gloffset_GetTexParameterfv },
{ "glGetTexParameteriv", (GLvoid *) glGetTexParameteriv, _gloffset_GetTexParameteriv },
{ "glGetTexLevelParameterfv", (GLvoid *) glGetTexLevelParameterfv, _gloffset_GetTexLevelParameterfv },
{ "glGetTexLevelParameteriv", (GLvoid *) glGetTexLevelParameteriv, _gloffset_GetTexLevelParameteriv },
{ "glIsEnabled", (GLvoid *) glIsEnabled, _gloffset_IsEnabled },
{ "glIsList", (GLvoid *) glIsList, _gloffset_IsList },
{ "glDepthRange", (GLvoid *) glDepthRange, _gloffset_DepthRange },
{ "glFrustum", (GLvoid *) glFrustum, _gloffset_Frustum },
{ "glLoadIdentity", (GLvoid *) glLoadIdentity, _gloffset_LoadIdentity },
{ "glLoadMatrixf", (GLvoid *) glLoadMatrixf, _gloffset_LoadMatrixf },
{ "glLoadMatrixd", (GLvoid *) glLoadMatrixd, _gloffset_LoadMatrixd },
{ "glMatrixMode", (GLvoid *) glMatrixMode, _gloffset_MatrixMode },
{ "glMultMatrixf", (GLvoid *) glMultMatrixf, _gloffset_MultMatrixf },
{ "glMultMatrixd", (GLvoid *) glMultMatrixd, _gloffset_MultMatrixd },
{ "glOrtho", (GLvoid *) glOrtho, _gloffset_Ortho },
{ "glPopMatrix", (GLvoid *) glPopMatrix, _gloffset_PopMatrix },
{ "glPushMatrix", (GLvoid *) glPushMatrix, _gloffset_PushMatrix },
{ "glRotated", (GLvoid *) glRotated, _gloffset_Rotated },
{ "glRotatef", (GLvoid *) glRotatef, _gloffset_Rotatef },
{ "glScaled", (GLvoid *) glScaled, _gloffset_Scaled },
{ "glScalef", (GLvoid *) glScalef, _gloffset_Scalef },
{ "glTranslated", (GLvoid *) glTranslated, _gloffset_Translated },
{ "glTranslatef", (GLvoid *) glTranslatef, _gloffset_Translatef },
{ "glViewport", (GLvoid *) glViewport, _gloffset_Viewport },
{ "glArrayElement", (GLvoid *) glArrayElement, _gloffset_ArrayElement },
{ "glColorPointer", (GLvoid *) glColorPointer, _gloffset_ColorPointer },
{ "glDisableClientState", (GLvoid *) glDisableClientState, _gloffset_DisableClientState },
{ "glDrawArrays", (GLvoid *) glDrawArrays, _gloffset_DrawArrays },
{ "glDrawElements", (GLvoid *) glDrawElements, _gloffset_DrawElements },
{ "glEdgeFlagPointer", (GLvoid *) glEdgeFlagPointer, _gloffset_EdgeFlagPointer },
{ "glEnableClientState", (GLvoid *) glEnableClientState, _gloffset_EnableClientState },
{ "glGetPointerv", (GLvoid *) glGetPointerv, _gloffset_GetPointerv },
{ "glIndexPointer", (GLvoid *) glIndexPointer, _gloffset_IndexPointer },
{ "glInterleavedArrays", (GLvoid *) glInterleavedArrays, _gloffset_InterleavedArrays },
{ "glNormalPointer", (GLvoid *) glNormalPointer, _gloffset_NormalPointer },
{ "glTexCoordPointer", (GLvoid *) glTexCoordPointer, _gloffset_TexCoordPointer },
{ "glVertexPointer", (GLvoid *) glVertexPointer, _gloffset_VertexPointer },
{ "glPolygonOffset", (GLvoid *) glPolygonOffset, _gloffset_PolygonOffset },
{ "glCopyTexImage1D", (GLvoid *) glCopyTexImage1D, _gloffset_CopyTexImage1D },
{ "glCopyTexImage2D", (GLvoid *) glCopyTexImage2D, _gloffset_CopyTexImage2D },
{ "glCopyTexSubImage1D", (GLvoid *) glCopyTexSubImage1D, _gloffset_CopyTexSubImage1D },
{ "glCopyTexSubImage2D", (GLvoid *) glCopyTexSubImage2D, _gloffset_CopyTexSubImage2D },
{ "glTexSubImage1D", (GLvoid *) glTexSubImage1D, _gloffset_TexSubImage1D },
{ "glTexSubImage2D", (GLvoid *) glTexSubImage2D, _gloffset_TexSubImage2D },
{ "glAreTexturesResident", (GLvoid *) glAreTexturesResident, _gloffset_AreTexturesResident },
{ "glBindTexture", (GLvoid *) glBindTexture, _gloffset_BindTexture },
{ "glDeleteTextures", (GLvoid *) glDeleteTextures, _gloffset_DeleteTextures },
{ "glGenTextures", (GLvoid *) glGenTextures, _gloffset_GenTextures },
{ "glIsTexture", (GLvoid *) glIsTexture, _gloffset_IsTexture },
{ "glPrioritizeTextures", (GLvoid *) glPrioritizeTextures, _gloffset_PrioritizeTextures },
{ "glIndexub", (GLvoid *) glIndexub, _gloffset_Indexub },
{ "glIndexubv", (GLvoid *) glIndexubv, _gloffset_Indexubv },
{ "glPopClientAttrib", (GLvoid *) glPopClientAttrib, _gloffset_PopClientAttrib },
{ "glPushClientAttrib", (GLvoid *) glPushClientAttrib, _gloffset_PushClientAttrib },
{ "glBlendColor", (GLvoid *) glBlendColor, _gloffset_BlendColor },
{ "glBlendEquation", (GLvoid *) glBlendEquation, _gloffset_BlendEquation },
{ "glDrawRangeElements", (GLvoid *) glDrawRangeElements, _gloffset_DrawRangeElements },
{ "glColorTable", (GLvoid *) glColorTable, _gloffset_ColorTable },
{ "glColorTableParameterfv", (GLvoid *) glColorTableParameterfv, _gloffset_ColorTableParameterfv },
{ "glColorTableParameteriv", (GLvoid *) glColorTableParameteriv, _gloffset_ColorTableParameteriv },
{ "glCopyColorTable", (GLvoid *) glCopyColorTable, _gloffset_CopyColorTable },
{ "glGetColorTable", (GLvoid *) glGetColorTable, _gloffset_GetColorTable },
{ "glGetColorTableParameterfv", (GLvoid *) glGetColorTableParameterfv, _gloffset_GetColorTableParameterfv },
{ "glGetColorTableParameteriv", (GLvoid *) glGetColorTableParameteriv, _gloffset_GetColorTableParameteriv },
{ "glColorSubTable", (GLvoid *) glColorSubTable, _gloffset_ColorSubTable },
{ "glCopyColorSubTable", (GLvoid *) glCopyColorSubTable, _gloffset_CopyColorSubTable },
{ "glConvolutionFilter1D", (GLvoid *) glConvolutionFilter1D, _gloffset_ConvolutionFilter1D },
{ "glConvolutionFilter2D", (GLvoid *) glConvolutionFilter2D, _gloffset_ConvolutionFilter2D },
{ "glConvolutionParameterf", (GLvoid *) glConvolutionParameterf, _gloffset_ConvolutionParameterf },
{ "glConvolutionParameterfv", (GLvoid *) glConvolutionParameterfv, _gloffset_ConvolutionParameterfv },
{ "glConvolutionParameteri", (GLvoid *) glConvolutionParameteri, _gloffset_ConvolutionParameteri },
{ "glConvolutionParameteriv", (GLvoid *) glConvolutionParameteriv, _gloffset_ConvolutionParameteriv },
{ "glCopyConvolutionFilter1D", (GLvoid *) glCopyConvolutionFilter1D, _gloffset_CopyConvolutionFilter1D },
{ "glCopyConvolutionFilter2D", (GLvoid *) glCopyConvolutionFilter2D, _gloffset_CopyConvolutionFilter2D },
{ "glGetConvolutionFilter", (GLvoid *) glGetConvolutionFilter, _gloffset_GetConvolutionFilter },
{ "glGetConvolutionParameterfv", (GLvoid *) glGetConvolutionParameterfv, _gloffset_GetConvolutionParameterfv },
{ "glGetConvolutionParameteriv", (GLvoid *) glGetConvolutionParameteriv, _gloffset_GetConvolutionParameteriv },
{ "glGetSeparableFilter", (GLvoid *) glGetSeparableFilter, _gloffset_GetSeparableFilter },
{ "glSeparableFilter2D", (GLvoid *) glSeparableFilter2D, _gloffset_SeparableFilter2D },
{ "glGetHistogram", (GLvoid *) glGetHistogram, _gloffset_GetHistogram },
{ "glGetHistogramParameterfv", (GLvoid *) glGetHistogramParameterfv, _gloffset_GetHistogramParameterfv },
{ "glGetHistogramParameteriv", (GLvoid *) glGetHistogramParameteriv, _gloffset_GetHistogramParameteriv },
{ "glGetMinmax", (GLvoid *) glGetMinmax, _gloffset_GetMinmax },
{ "glGetMinmaxParameterfv", (GLvoid *) glGetMinmaxParameterfv, _gloffset_GetMinmaxParameterfv },
{ "glGetMinmaxParameteriv", (GLvoid *) glGetMinmaxParameteriv, _gloffset_GetMinmaxParameteriv },
{ "glHistogram", (GLvoid *) glHistogram, _gloffset_Histogram },
{ "glMinmax", (GLvoid *) glMinmax, _gloffset_Minmax },
{ "glResetHistogram", (GLvoid *) glResetHistogram, _gloffset_ResetHistogram },
{ "glResetMinmax", (GLvoid *) glResetMinmax, _gloffset_ResetMinmax },
{ "glTexImage3D", (GLvoid *) glTexImage3D, _gloffset_TexImage3D },
{ "glTexSubImage3D", (GLvoid *) glTexSubImage3D, _gloffset_TexSubImage3D },
{ "glCopyTexSubImage3D", (GLvoid *) glCopyTexSubImage3D, _gloffset_CopyTexSubImage3D },
{ "glActiveTextureARB", (GLvoid *) glActiveTextureARB, _gloffset_ActiveTextureARB },
{ "glClientActiveTextureARB", (GLvoid *) glClientActiveTextureARB, _gloffset_ClientActiveTextureARB },
{ "glMultiTexCoord1dARB", (GLvoid *) glMultiTexCoord1dARB, _gloffset_MultiTexCoord1dARB },
{ "glMultiTexCoord1dvARB", (GLvoid *) glMultiTexCoord1dvARB, _gloffset_MultiTexCoord1dvARB },
{ "glMultiTexCoord1fARB", (GLvoid *) glMultiTexCoord1fARB, _gloffset_MultiTexCoord1fARB },
{ "glMultiTexCoord1fvARB", (GLvoid *) glMultiTexCoord1fvARB, _gloffset_MultiTexCoord1fvARB },
{ "glMultiTexCoord1iARB", (GLvoid *) glMultiTexCoord1iARB, _gloffset_MultiTexCoord1iARB },
{ "glMultiTexCoord1ivARB", (GLvoid *) glMultiTexCoord1ivARB, _gloffset_MultiTexCoord1ivARB },
{ "glMultiTexCoord1sARB", (GLvoid *) glMultiTexCoord1sARB, _gloffset_MultiTexCoord1sARB },
{ "glMultiTexCoord1svARB", (GLvoid *) glMultiTexCoord1svARB, _gloffset_MultiTexCoord1svARB },
{ "glMultiTexCoord2dARB", (GLvoid *) glMultiTexCoord2dARB, _gloffset_MultiTexCoord2dARB },
{ "glMultiTexCoord2dvARB", (GLvoid *) glMultiTexCoord2dvARB, _gloffset_MultiTexCoord2dvARB },
{ "glMultiTexCoord2fARB", (GLvoid *) glMultiTexCoord2fARB, _gloffset_MultiTexCoord2fARB },
{ "glMultiTexCoord2fvARB", (GLvoid *) glMultiTexCoord2fvARB, _gloffset_MultiTexCoord2fvARB },
{ "glMultiTexCoord2iARB", (GLvoid *) glMultiTexCoord2iARB, _gloffset_MultiTexCoord2iARB },
{ "glMultiTexCoord2ivARB", (GLvoid *) glMultiTexCoord2ivARB, _gloffset_MultiTexCoord2ivARB },
{ "glMultiTexCoord2sARB", (GLvoid *) glMultiTexCoord2sARB, _gloffset_MultiTexCoord2sARB },
{ "glMultiTexCoord2svARB", (GLvoid *) glMultiTexCoord2svARB, _gloffset_MultiTexCoord2svARB },
{ "glMultiTexCoord3dARB", (GLvoid *) glMultiTexCoord3dARB, _gloffset_MultiTexCoord3dARB },
{ "glMultiTexCoord3dvARB", (GLvoid *) glMultiTexCoord3dvARB, _gloffset_MultiTexCoord3dvARB },
{ "glMultiTexCoord3fARB", (GLvoid *) glMultiTexCoord3fARB, _gloffset_MultiTexCoord3fARB },
{ "glMultiTexCoord3fvARB", (GLvoid *) glMultiTexCoord3fvARB, _gloffset_MultiTexCoord3fvARB },
{ "glMultiTexCoord3iARB", (GLvoid *) glMultiTexCoord3iARB, _gloffset_MultiTexCoord3iARB },
{ "glMultiTexCoord3ivARB", (GLvoid *) glMultiTexCoord3ivARB, _gloffset_MultiTexCoord3ivARB },
{ "glMultiTexCoord3sARB", (GLvoid *) glMultiTexCoord3sARB, _gloffset_MultiTexCoord3sARB },
{ "glMultiTexCoord3svARB", (GLvoid *) glMultiTexCoord3svARB, _gloffset_MultiTexCoord3svARB },
{ "glMultiTexCoord4dARB", (GLvoid *) glMultiTexCoord4dARB, _gloffset_MultiTexCoord4dARB },
{ "glMultiTexCoord4dvARB", (GLvoid *) glMultiTexCoord4dvARB, _gloffset_MultiTexCoord4dvARB },
{ "glMultiTexCoord4fARB", (GLvoid *) glMultiTexCoord4fARB, _gloffset_MultiTexCoord4fARB },
{ "glMultiTexCoord4fvARB", (GLvoid *) glMultiTexCoord4fvARB, _gloffset_MultiTexCoord4fvARB },
{ "glMultiTexCoord4iARB", (GLvoid *) glMultiTexCoord4iARB, _gloffset_MultiTexCoord4iARB },
{ "glMultiTexCoord4ivARB", (GLvoid *) glMultiTexCoord4ivARB, _gloffset_MultiTexCoord4ivARB },
{ "glMultiTexCoord4sARB", (GLvoid *) glMultiTexCoord4sARB, _gloffset_MultiTexCoord4sARB },
{ "glMultiTexCoord4svARB", (GLvoid *) glMultiTexCoord4svARB, _gloffset_MultiTexCoord4svARB },
{ "glLoadTransposeMatrixfARB", (GLvoid *) glLoadTransposeMatrixfARB, _gloffset_LoadTransposeMatrixfARB },
{ "glLoadTransposeMatrixdARB", (GLvoid *) glLoadTransposeMatrixdARB, _gloffset_LoadTransposeMatrixdARB },
{ "glMultTransposeMatrixfARB", (GLvoid *) glMultTransposeMatrixfARB, _gloffset_MultTransposeMatrixfARB },
{ "glMultTransposeMatrixdARB", (GLvoid *) glMultTransposeMatrixdARB, _gloffset_MultTransposeMatrixdARB },
{ "glSampleCoverageARB", (GLvoid *) glSampleCoverageARB, _gloffset_SampleCoverageARB },
{ "glCompressedTexImage3DARB", (GLvoid *) glCompressedTexImage3DARB, _gloffset_CompressedTexImage3DARB },
{ "glCompressedTexImage2DARB", (GLvoid *) glCompressedTexImage2DARB, _gloffset_CompressedTexImage2DARB },
{ "glCompressedTexImage1DARB", (GLvoid *) glCompressedTexImage1DARB, _gloffset_CompressedTexImage1DARB },
{ "glCompressedTexSubImage3DARB", (GLvoid *) glCompressedTexSubImage3DARB, _gloffset_CompressedTexSubImage3DARB },
{ "glCompressedTexSubImage2DARB", (GLvoid *) glCompressedTexSubImage2DARB, _gloffset_CompressedTexSubImage2DARB },
{ "glCompressedTexSubImage1DARB", (GLvoid *) glCompressedTexSubImage1DARB, _gloffset_CompressedTexSubImage1DARB },
{ "glGetCompressedTexImageARB", (GLvoid *) glGetCompressedTexImageARB, _gloffset_GetCompressedTexImageARB },
{ "glActiveTexture", (GLvoid *) glActiveTexture, _gloffset_ActiveTextureARB },
{ "glClientActiveTexture", (GLvoid *) glClientActiveTexture, _gloffset_ClientActiveTextureARB },
{ "glMultiTexCoord1d", (GLvoid *) glMultiTexCoord1d, _gloffset_MultiTexCoord1dARB },
{ "glMultiTexCoord1dv", (GLvoid *) glMultiTexCoord1dv, _gloffset_MultiTexCoord1dvARB },
{ "glMultiTexCoord1f", (GLvoid *) glMultiTexCoord1f, _gloffset_MultiTexCoord1fARB },
{ "glMultiTexCoord1fv", (GLvoid *) glMultiTexCoord1fv, _gloffset_MultiTexCoord1fvARB },
{ "glMultiTexCoord1i", (GLvoid *) glMultiTexCoord1i, _gloffset_MultiTexCoord1iARB },
{ "glMultiTexCoord1iv", (GLvoid *) glMultiTexCoord1iv, _gloffset_MultiTexCoord1ivARB },
{ "glMultiTexCoord1s", (GLvoid *) glMultiTexCoord1s, _gloffset_MultiTexCoord1sARB },
{ "glMultiTexCoord1sv", (GLvoid *) glMultiTexCoord1sv, _gloffset_MultiTexCoord1svARB },
{ "glMultiTexCoord2d", (GLvoid *) glMultiTexCoord2d, _gloffset_MultiTexCoord2dARB },
{ "glMultiTexCoord2dv", (GLvoid *) glMultiTexCoord2dv, _gloffset_MultiTexCoord2dvARB },
{ "glMultiTexCoord2f", (GLvoid *) glMultiTexCoord2f, _gloffset_MultiTexCoord2fARB },
{ "glMultiTexCoord2fv", (GLvoid *) glMultiTexCoord2fv, _gloffset_MultiTexCoord2fvARB },
{ "glMultiTexCoord2i", (GLvoid *) glMultiTexCoord2i, _gloffset_MultiTexCoord2iARB },
{ "glMultiTexCoord2iv", (GLvoid *) glMultiTexCoord2iv, _gloffset_MultiTexCoord2ivARB },
{ "glMultiTexCoord2s", (GLvoid *) glMultiTexCoord2s, _gloffset_MultiTexCoord2sARB },
{ "glMultiTexCoord2sv", (GLvoid *) glMultiTexCoord2sv, _gloffset_MultiTexCoord2svARB },
{ "glMultiTexCoord3d", (GLvoid *) glMultiTexCoord3d, _gloffset_MultiTexCoord3dARB },
{ "glMultiTexCoord3dv", (GLvoid *) glMultiTexCoord3dv, _gloffset_MultiTexCoord3dvARB },
{ "glMultiTexCoord3f", (GLvoid *) glMultiTexCoord3f, _gloffset_MultiTexCoord3fARB },
{ "glMultiTexCoord3fv", (GLvoid *) glMultiTexCoord3fv, _gloffset_MultiTexCoord3fvARB },
{ "glMultiTexCoord3i", (GLvoid *) glMultiTexCoord3i, _gloffset_MultiTexCoord3iARB },
{ "glMultiTexCoord3iv", (GLvoid *) glMultiTexCoord3iv, _gloffset_MultiTexCoord3ivARB },
{ "glMultiTexCoord3s", (GLvoid *) glMultiTexCoord3s, _gloffset_MultiTexCoord3sARB },
{ "glMultiTexCoord3sv", (GLvoid *) glMultiTexCoord3sv, _gloffset_MultiTexCoord3svARB },
{ "glMultiTexCoord4d", (GLvoid *) glMultiTexCoord4d, _gloffset_MultiTexCoord4dARB },
{ "glMultiTexCoord4dv", (GLvoid *) glMultiTexCoord4dv, _gloffset_MultiTexCoord4dvARB },
{ "glMultiTexCoord4f", (GLvoid *) glMultiTexCoord4f, _gloffset_MultiTexCoord4fARB },
{ "glMultiTexCoord4fv", (GLvoid *) glMultiTexCoord4fv, _gloffset_MultiTexCoord4fvARB },
{ "glMultiTexCoord4i", (GLvoid *) glMultiTexCoord4i, _gloffset_MultiTexCoord4iARB },
{ "glMultiTexCoord4iv", (GLvoid *) glMultiTexCoord4iv, _gloffset_MultiTexCoord4ivARB },
{ "glMultiTexCoord4s", (GLvoid *) glMultiTexCoord4s, _gloffset_MultiTexCoord4sARB },
{ "glMultiTexCoord4sv", (GLvoid *) glMultiTexCoord4sv, _gloffset_MultiTexCoord4svARB },
{ "glLoadTransposeMatrixf", (GLvoid *) glLoadTransposeMatrixf, _gloffset_LoadTransposeMatrixfARB },
{ "glLoadTransposeMatrixd", (GLvoid *) glLoadTransposeMatrixd, _gloffset_LoadTransposeMatrixdARB },
{ "glMultTransposeMatrixf", (GLvoid *) glMultTransposeMatrixf, _gloffset_MultTransposeMatrixfARB },
{ "glMultTransposeMatrixd", (GLvoid *) glMultTransposeMatrixd, _gloffset_MultTransposeMatrixdARB },
{ "glSampleCoverage", (GLvoid *) glSampleCoverage, _gloffset_SampleCoverageARB },
{ "glCompressedTexImage3D", (GLvoid *) glCompressedTexImage3D, _gloffset_CompressedTexImage3DARB },
{ "glCompressedTexImage2D", (GLvoid *) glCompressedTexImage2D, _gloffset_CompressedTexImage2DARB },
{ "glCompressedTexImage1D", (GLvoid *) glCompressedTexImage1D, _gloffset_CompressedTexImage1DARB },
{ "glCompressedTexSubImage3D", (GLvoid *) glCompressedTexSubImage3D, _gloffset_CompressedTexSubImage3DARB },
{ "glCompressedTexSubImage2D", (GLvoid *) glCompressedTexSubImage2D, _gloffset_CompressedTexSubImage2DARB },
{ "glCompressedTexSubImage1D", (GLvoid *) glCompressedTexSubImage1D, _gloffset_CompressedTexSubImage1DARB },
{ "glGetCompressedTexImage", (GLvoid *) glGetCompressedTexImage, _gloffset_GetCompressedTexImageARB },
{ "glBlendColorEXT", (GLvoid *) glBlendColorEXT, _gloffset_BlendColor },
{ "glPolygonOffsetEXT", (GLvoid *) glPolygonOffsetEXT, _gloffset_PolygonOffsetEXT },
{ "glTexImage3DEXT", (GLvoid *) glTexImage3DEXT, _gloffset_TexImage3D },
{ "glTexSubImage3DEXT", (GLvoid *) glTexSubImage3DEXT, _gloffset_TexSubImage3D },
{ "glGetTexFilterFuncSGIS", (GLvoid *) glGetTexFilterFuncSGIS, _gloffset_GetTexFilterFuncSGIS },
{ "glTexFilterFuncSGIS", (GLvoid *) glTexFilterFuncSGIS, _gloffset_TexFilterFuncSGIS },
{ "glTexSubImage1DEXT", (GLvoid *) glTexSubImage1DEXT, _gloffset_TexSubImage1D },
{ "glTexSubImage2DEXT", (GLvoid *) glTexSubImage2DEXT, _gloffset_TexSubImage2D },
{ "glCopyTexImage1DEXT", (GLvoid *) glCopyTexImage1DEXT, _gloffset_CopyTexImage1D },
{ "glCopyTexImage2DEXT", (GLvoid *) glCopyTexImage2DEXT, _gloffset_CopyTexImage2D },
{ "glCopyTexSubImage1DEXT", (GLvoid *) glCopyTexSubImage1DEXT, _gloffset_CopyTexSubImage1D },
{ "glCopyTexSubImage2DEXT", (GLvoid *) glCopyTexSubImage2DEXT, _gloffset_CopyTexSubImage2D },
{ "glCopyTexSubImage3DEXT", (GLvoid *) glCopyTexSubImage3DEXT, _gloffset_CopyTexSubImage3D },
{ "glGetHistogramEXT", (GLvoid *) glGetHistogramEXT, _gloffset_GetHistogramEXT },
{ "glGetHistogramParameterfvEXT", (GLvoid *) glGetHistogramParameterfvEXT, _gloffset_GetHistogramParameterfvEXT },
{ "glGetHistogramParameterivEXT", (GLvoid *) glGetHistogramParameterivEXT, _gloffset_GetHistogramParameterivEXT },
{ "glGetMinmaxEXT", (GLvoid *) glGetMinmaxEXT, _gloffset_GetMinmaxEXT },
{ "glGetMinmaxParameterfvEXT", (GLvoid *) glGetMinmaxParameterfvEXT, _gloffset_GetMinmaxParameterfvEXT },
{ "glGetMinmaxParameterivEXT", (GLvoid *) glGetMinmaxParameterivEXT, _gloffset_GetMinmaxParameterivEXT },
{ "glHistogramEXT", (GLvoid *) glHistogramEXT, _gloffset_Histogram },
{ "glMinmaxEXT", (GLvoid *) glMinmaxEXT, _gloffset_Minmax },
{ "glResetHistogramEXT", (GLvoid *) glResetHistogramEXT, _gloffset_ResetHistogram },
{ "glResetMinmaxEXT", (GLvoid *) glResetMinmaxEXT, _gloffset_ResetMinmax },
{ "glConvolutionFilter1DEXT", (GLvoid *) glConvolutionFilter1DEXT, _gloffset_ConvolutionFilter1D },
{ "glConvolutionFilter2DEXT", (GLvoid *) glConvolutionFilter2DEXT, _gloffset_ConvolutionFilter2D },
{ "glConvolutionParameterfEXT", (GLvoid *) glConvolutionParameterfEXT, _gloffset_ConvolutionParameterf },
{ "glConvolutionParameterfvEXT", (GLvoid *) glConvolutionParameterfvEXT, _gloffset_ConvolutionParameterfv },
{ "glConvolutionParameteriEXT", (GLvoid *) glConvolutionParameteriEXT, _gloffset_ConvolutionParameteri },
{ "glConvolutionParameterivEXT", (GLvoid *) glConvolutionParameterivEXT, _gloffset_ConvolutionParameteriv },
{ "glCopyConvolutionFilter1DEXT", (GLvoid *) glCopyConvolutionFilter1DEXT, _gloffset_CopyConvolutionFilter1D },
{ "glCopyConvolutionFilter2DEXT", (GLvoid *) glCopyConvolutionFilter2DEXT, _gloffset_CopyConvolutionFilter2D },
{ "glGetConvolutionFilterEXT", (GLvoid *) glGetConvolutionFilterEXT, _gloffset_GetConvolutionFilterEXT },
{ "glGetConvolutionParameterfvEXT", (GLvoid *) glGetConvolutionParameterfvEXT, _gloffset_GetConvolutionParameterfvEXT },
{ "glGetConvolutionParameterivEXT", (GLvoid *) glGetConvolutionParameterivEXT, _gloffset_GetConvolutionParameterivEXT },
{ "glGetSeparableFilterEXT", (GLvoid *) glGetSeparableFilterEXT, _gloffset_GetSeparableFilterEXT },
{ "glSeparableFilter2DEXT", (GLvoid *) glSeparableFilter2DEXT, _gloffset_SeparableFilter2D },
{ "glColorTableSGI", (GLvoid *) glColorTableSGI, _gloffset_ColorTable },
{ "glColorTableParameterfvSGI", (GLvoid *) glColorTableParameterfvSGI, _gloffset_ColorTableParameterfv },
{ "glColorTableParameterivSGI", (GLvoid *) glColorTableParameterivSGI, _gloffset_ColorTableParameteriv },
{ "glCopyColorTableSGI", (GLvoid *) glCopyColorTableSGI, _gloffset_CopyColorTable },
{ "glGetColorTableSGI", (GLvoid *) glGetColorTableSGI, _gloffset_GetColorTableSGI },
{ "glGetColorTableParameterfvSGI", (GLvoid *) glGetColorTableParameterfvSGI, _gloffset_GetColorTableParameterfvSGI },
{ "glGetColorTableParameterivSGI", (GLvoid *) glGetColorTableParameterivSGI, _gloffset_GetColorTableParameterivSGI },
{ "glPixelTexGenSGIX", (GLvoid *) glPixelTexGenSGIX, _gloffset_PixelTexGenSGIX },
{ "glPixelTexGenParameteriSGIS", (GLvoid *) glPixelTexGenParameteriSGIS, _gloffset_PixelTexGenParameteriSGIS },
{ "glPixelTexGenParameterivSGIS", (GLvoid *) glPixelTexGenParameterivSGIS, _gloffset_PixelTexGenParameterivSGIS },
{ "glPixelTexGenParameterfSGIS", (GLvoid *) glPixelTexGenParameterfSGIS, _gloffset_PixelTexGenParameterfSGIS },
{ "glPixelTexGenParameterfvSGIS", (GLvoid *) glPixelTexGenParameterfvSGIS, _gloffset_PixelTexGenParameterfvSGIS },
{ "glGetPixelTexGenParameterivSGIS", (GLvoid *) glGetPixelTexGenParameterivSGIS, _gloffset_GetPixelTexGenParameterivSGIS },
{ "glGetPixelTexGenParameterfvSGIS", (GLvoid *) glGetPixelTexGenParameterfvSGIS, _gloffset_GetPixelTexGenParameterfvSGIS },
{ "glTexImage4DSGIS", (GLvoid *) glTexImage4DSGIS, _gloffset_TexImage4DSGIS },
{ "glTexSubImage4DSGIS", (GLvoid *) glTexSubImage4DSGIS, _gloffset_TexSubImage4DSGIS },
{ "glAreTexturesResidentEXT", (GLvoid *) glAreTexturesResidentEXT, _gloffset_AreTexturesResidentEXT },
{ "glBindTextureEXT", (GLvoid *) glBindTextureEXT, _gloffset_BindTexture },
{ "glDeleteTexturesEXT", (GLvoid *) glDeleteTexturesEXT, _gloffset_DeleteTextures },
{ "glGenTexturesEXT", (GLvoid *) glGenTexturesEXT, _gloffset_GenTexturesEXT },
{ "glIsTextureEXT", (GLvoid *) glIsTextureEXT, _gloffset_IsTextureEXT },
{ "glPrioritizeTexturesEXT", (GLvoid *) glPrioritizeTexturesEXT, _gloffset_PrioritizeTextures },
{ "glDetailTexFuncSGIS", (GLvoid *) glDetailTexFuncSGIS, _gloffset_DetailTexFuncSGIS },
{ "glGetDetailTexFuncSGIS", (GLvoid *) glGetDetailTexFuncSGIS, _gloffset_GetDetailTexFuncSGIS },
{ "glSharpenTexFuncSGIS", (GLvoid *) glSharpenTexFuncSGIS, _gloffset_SharpenTexFuncSGIS },
{ "glGetSharpenTexFuncSGIS", (GLvoid *) glGetSharpenTexFuncSGIS, _gloffset_GetSharpenTexFuncSGIS },
{ "glSampleMaskSGIS", (GLvoid *) glSampleMaskSGIS, _gloffset_SampleMaskSGIS },
{ "glSamplePatternSGIS", (GLvoid *) glSamplePatternSGIS, _gloffset_SamplePatternSGIS },
{ "glArrayElementEXT", (GLvoid *) glArrayElementEXT, _gloffset_ArrayElement },
{ "glColorPointerEXT", (GLvoid *) glColorPointerEXT, _gloffset_ColorPointerEXT },
{ "glDrawArraysEXT", (GLvoid *) glDrawArraysEXT, _gloffset_DrawArrays },
{ "glEdgeFlagPointerEXT", (GLvoid *) glEdgeFlagPointerEXT, _gloffset_EdgeFlagPointerEXT },
{ "glGetPointervEXT", (GLvoid *) glGetPointervEXT, _gloffset_GetPointerv },
{ "glIndexPointerEXT", (GLvoid *) glIndexPointerEXT, _gloffset_IndexPointerEXT },
{ "glNormalPointerEXT", (GLvoid *) glNormalPointerEXT, _gloffset_NormalPointerEXT },
{ "glTexCoordPointerEXT", (GLvoid *) glTexCoordPointerEXT, _gloffset_TexCoordPointerEXT },
{ "glVertexPointerEXT", (GLvoid *) glVertexPointerEXT, _gloffset_VertexPointerEXT },
{ "glBlendEquationEXT", (GLvoid *) glBlendEquationEXT, _gloffset_BlendEquation },
{ "glSpriteParameterfSGIX", (GLvoid *) glSpriteParameterfSGIX, _gloffset_SpriteParameterfSGIX },
{ "glSpriteParameterfvSGIX", (GLvoid *) glSpriteParameterfvSGIX, _gloffset_SpriteParameterfvSGIX },
{ "glSpriteParameteriSGIX", (GLvoid *) glSpriteParameteriSGIX, _gloffset_SpriteParameteriSGIX },
{ "glSpriteParameterivSGIX", (GLvoid *) glSpriteParameterivSGIX, _gloffset_SpriteParameterivSGIX },
{ "glPointParameterfEXT", (GLvoid *) glPointParameterfEXT, _gloffset_PointParameterfEXT },
{ "glPointParameterfvEXT", (GLvoid *) glPointParameterfvEXT, _gloffset_PointParameterfvEXT },
{ "glPointParameterfARB", (GLvoid *) glPointParameterfARB, _gloffset_PointParameterfEXT },
{ "glPointParameterfvARB", (GLvoid *) glPointParameterfvARB, _gloffset_PointParameterfvEXT },
{ "glPointParameterfSGIS", (GLvoid *) glPointParameterfSGIS, _gloffset_PointParameterfEXT },
{ "glPointParameterfvSGIS", (GLvoid *) glPointParameterfvSGIS, _gloffset_PointParameterfvEXT },
{ "glGetInstrumentsSGIX", (GLvoid *) glGetInstrumentsSGIX, _gloffset_GetInstrumentsSGIX },
{ "glInstrumentsBufferSGIX", (GLvoid *) glInstrumentsBufferSGIX, _gloffset_InstrumentsBufferSGIX },
{ "glPollInstrumentsSGIX", (GLvoid *) glPollInstrumentsSGIX, _gloffset_PollInstrumentsSGIX },
{ "glReadInstrumentsSGIX", (GLvoid *) glReadInstrumentsSGIX, _gloffset_ReadInstrumentsSGIX },
{ "glStartInstrumentsSGIX", (GLvoid *) glStartInstrumentsSGIX, _gloffset_StartInstrumentsSGIX },
{ "glStopInstrumentsSGIX", (GLvoid *) glStopInstrumentsSGIX, _gloffset_StopInstrumentsSGIX },
{ "glFrameZoomSGIX", (GLvoid *) glFrameZoomSGIX, _gloffset_FrameZoomSGIX },
{ "glTagSampleBufferSGIX", (GLvoid *) glTagSampleBufferSGIX, _gloffset_TagSampleBufferSGIX },
{ "glReferencePlaneSGIX", (GLvoid *) glReferencePlaneSGIX, _gloffset_ReferencePlaneSGIX },
{ "glFlushRasterSGIX", (GLvoid *) glFlushRasterSGIX, _gloffset_FlushRasterSGIX },
{ "glColorSubTableEXT", (GLvoid *) glColorSubTableEXT, _gloffset_ColorSubTable },
{ "glCopyColorSubTableEXT", (GLvoid *) glCopyColorSubTableEXT, _gloffset_CopyColorSubTable },
{ "glHintPGI", (GLvoid *) glHintPGI, _gloffset_HintPGI },
{ "glColorTableEXT", (GLvoid *) glColorTableEXT, _gloffset_ColorTable },
{ "glGetColorTableEXT", (GLvoid *) glGetColorTableEXT, _gloffset_GetColorTableEXT },
{ "glGetColorTableParameterivEXT", (GLvoid *) glGetColorTableParameterivEXT, _gloffset_GetColorTableParameterivEXT },
{ "glGetColorTableParameterfvEXT", (GLvoid *) glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfvEXT },
{ "glGetListParameterfvSGIX", (GLvoid *) glGetListParameterfvSGIX, _gloffset_GetListParameterfvSGIX },
{ "glGetListParameterivSGIX", (GLvoid *) glGetListParameterivSGIX, _gloffset_GetListParameterivSGIX },
{ "glListParameterfSGIX", (GLvoid *) glListParameterfSGIX, _gloffset_ListParameterfSGIX },
{ "glListParameterfvSGIX", (GLvoid *) glListParameterfvSGIX, _gloffset_ListParameterfvSGIX },
{ "glListParameteriSGIX", (GLvoid *) glListParameteriSGIX, _gloffset_ListParameteriSGIX },
{ "glListParameterivSGIX", (GLvoid *) glListParameterivSGIX, _gloffset_ListParameterivSGIX },
{ "glIndexMaterialEXT", (GLvoid *) glIndexMaterialEXT, _gloffset_IndexMaterialEXT },
{ "glIndexFuncEXT", (GLvoid *) glIndexFuncEXT, _gloffset_IndexFuncEXT },
{ "glLockArraysEXT", (GLvoid *) glLockArraysEXT, _gloffset_LockArraysEXT },
{ "glUnlockArraysEXT", (GLvoid *) glUnlockArraysEXT, _gloffset_UnlockArraysEXT },
{ "glCullParameterdvEXT", (GLvoid *) glCullParameterdvEXT, _gloffset_CullParameterdvEXT },
{ "glCullParameterfvEXT", (GLvoid *) glCullParameterfvEXT, _gloffset_CullParameterfvEXT },
{ "glFragmentColorMaterialSGIX", (GLvoid *) glFragmentColorMaterialSGIX, _gloffset_FragmentColorMaterialSGIX },
{ "glFragmentLightfSGIX", (GLvoid *) glFragmentLightfSGIX, _gloffset_FragmentLightfSGIX },
{ "glFragmentLightfvSGIX", (GLvoid *) glFragmentLightfvSGIX, _gloffset_FragmentLightfvSGIX },
{ "glFragmentLightiSGIX", (GLvoid *) glFragmentLightiSGIX, _gloffset_FragmentLightiSGIX },
{ "glFragmentLightivSGIX", (GLvoid *) glFragmentLightivSGIX, _gloffset_FragmentLightivSGIX },
{ "glFragmentLightModelfSGIX", (GLvoid *) glFragmentLightModelfSGIX, _gloffset_FragmentLightModelfSGIX },
{ "glFragmentLightModelfvSGIX", (GLvoid *) glFragmentLightModelfvSGIX, _gloffset_FragmentLightModelfvSGIX },
{ "glFragmentLightModeliSGIX", (GLvoid *) glFragmentLightModeliSGIX, _gloffset_FragmentLightModeliSGIX },
{ "glFragmentLightModelivSGIX", (GLvoid *) glFragmentLightModelivSGIX, _gloffset_FragmentLightModelivSGIX },
{ "glFragmentMaterialfSGIX", (GLvoid *) glFragmentMaterialfSGIX, _gloffset_FragmentMaterialfSGIX },
{ "glFragmentMaterialfvSGIX", (GLvoid *) glFragmentMaterialfvSGIX, _gloffset_FragmentMaterialfvSGIX },
{ "glFragmentMaterialiSGIX", (GLvoid *) glFragmentMaterialiSGIX, _gloffset_FragmentMaterialiSGIX },
{ "glFragmentMaterialivSGIX", (GLvoid *) glFragmentMaterialivSGIX, _gloffset_FragmentMaterialivSGIX },
{ "glGetFragmentLightfvSGIX", (GLvoid *) glGetFragmentLightfvSGIX, _gloffset_GetFragmentLightfvSGIX },
{ "glGetFragmentLightivSGIX", (GLvoid *) glGetFragmentLightivSGIX, _gloffset_GetFragmentLightivSGIX },
{ "glGetFragmentMaterialfvSGIX", (GLvoid *) glGetFragmentMaterialfvSGIX, _gloffset_GetFragmentMaterialfvSGIX },
{ "glGetFragmentMaterialivSGIX", (GLvoid *) glGetFragmentMaterialivSGIX, _gloffset_GetFragmentMaterialivSGIX },
{ "glLightEnviSGIX", (GLvoid *) glLightEnviSGIX, _gloffset_LightEnviSGIX },
{ "glDrawRangeElementsEXT", (GLvoid *) glDrawRangeElementsEXT, _gloffset_DrawRangeElements },
{ "glSecondaryColor3bEXT", (GLvoid *) glSecondaryColor3bEXT, _gloffset_SecondaryColor3bEXT },
{ "glSecondaryColor3bvEXT", (GLvoid *) glSecondaryColor3bvEXT, _gloffset_SecondaryColor3bvEXT },
{ "glSecondaryColor3dEXT", (GLvoid *) glSecondaryColor3dEXT, _gloffset_SecondaryColor3dEXT },
{ "glSecondaryColor3dvEXT", (GLvoid *) glSecondaryColor3dvEXT, _gloffset_SecondaryColor3dvEXT },
{ "glSecondaryColor3fEXT", (GLvoid *) glSecondaryColor3fEXT, _gloffset_SecondaryColor3fEXT },
{ "glSecondaryColor3fvEXT", (GLvoid *) glSecondaryColor3fvEXT, _gloffset_SecondaryColor3fvEXT },
{ "glSecondaryColor3iEXT", (GLvoid *) glSecondaryColor3iEXT, _gloffset_SecondaryColor3iEXT },
{ "glSecondaryColor3ivEXT", (GLvoid *) glSecondaryColor3ivEXT, _gloffset_SecondaryColor3ivEXT },
{ "glSecondaryColor3sEXT", (GLvoid *) glSecondaryColor3sEXT, _gloffset_SecondaryColor3sEXT },
{ "glSecondaryColor3svEXT", (GLvoid *) glSecondaryColor3svEXT, _gloffset_SecondaryColor3svEXT },
{ "glSecondaryColor3ubEXT", (GLvoid *) glSecondaryColor3ubEXT, _gloffset_SecondaryColor3ubEXT },
{ "glSecondaryColor3ubvEXT", (GLvoid *) glSecondaryColor3ubvEXT, _gloffset_SecondaryColor3ubvEXT },
{ "glSecondaryColor3uiEXT", (GLvoid *) glSecondaryColor3uiEXT, _gloffset_SecondaryColor3uiEXT },
{ "glSecondaryColor3uivEXT", (GLvoid *) glSecondaryColor3uivEXT, _gloffset_SecondaryColor3uivEXT },
{ "glSecondaryColor3usEXT", (GLvoid *) glSecondaryColor3usEXT, _gloffset_SecondaryColor3usEXT },
{ "glSecondaryColor3usvEXT", (GLvoid *) glSecondaryColor3usvEXT, _gloffset_SecondaryColor3usvEXT },
{ "glSecondaryColorPointerEXT", (GLvoid *) glSecondaryColorPointerEXT, _gloffset_SecondaryColorPointerEXT },
{ "glMultiDrawArraysEXT", (GLvoid *) glMultiDrawArraysEXT, _gloffset_MultiDrawArraysEXT },
{ "glMultiDrawElementsEXT", (GLvoid *) glMultiDrawElementsEXT, _gloffset_MultiDrawElementsEXT },
{ "glFogCoordfEXT", (GLvoid *) glFogCoordfEXT, _gloffset_FogCoordfEXT },
{ "glFogCoordfvEXT", (GLvoid *) glFogCoordfvEXT, _gloffset_FogCoordfvEXT },
{ "glFogCoorddEXT", (GLvoid *) glFogCoorddEXT, _gloffset_FogCoorddEXT },
{ "glFogCoorddvEXT", (GLvoid *) glFogCoorddvEXT, _gloffset_FogCoorddvEXT },
{ "glFogCoordPointerEXT", (GLvoid *) glFogCoordPointerEXT, _gloffset_FogCoordPointerEXT },
{ "glBlendFuncSeparateEXT", (GLvoid *) glBlendFuncSeparateEXT, _gloffset_BlendFuncSeparateEXT },
{ "glBlendFuncSeparateINGR", (GLvoid *) glBlendFuncSeparateINGR, _gloffset_BlendFuncSeparateEXT },
{ "glVertexWeightfEXT", (GLvoid *) glVertexWeightfEXT, _gloffset_VertexWeightfEXT },
{ "glVertexWeightfvEXT", (GLvoid *) glVertexWeightfvEXT, _gloffset_VertexWeightfvEXT },
{ "glVertexWeightPointerEXT", (GLvoid *) glVertexWeightPointerEXT, _gloffset_VertexWeightPointerEXT },
{ "glFlushVertexArrayRangeNV", (GLvoid *) glFlushVertexArrayRangeNV, _gloffset_FlushVertexArrayRangeNV },
{ "glVertexArrayRangeNV", (GLvoid *) glVertexArrayRangeNV, _gloffset_VertexArrayRangeNV },
{ "glCombinerParameterfvNV", (GLvoid *) glCombinerParameterfvNV, _gloffset_CombinerParameterfvNV },
{ "glCombinerParameterfNV", (GLvoid *) glCombinerParameterfNV, _gloffset_CombinerParameterfNV },
{ "glCombinerParameterivNV", (GLvoid *) glCombinerParameterivNV, _gloffset_CombinerParameterivNV },
{ "glCombinerParameteriNV", (GLvoid *) glCombinerParameteriNV, _gloffset_CombinerParameteriNV },
{ "glCombinerInputNV", (GLvoid *) glCombinerInputNV, _gloffset_CombinerInputNV },
{ "glCombinerOutputNV", (GLvoid *) glCombinerOutputNV, _gloffset_CombinerOutputNV },
{ "glFinalCombinerInputNV", (GLvoid *) glFinalCombinerInputNV, _gloffset_FinalCombinerInputNV },
{ "glGetCombinerInputParameterfvNV", (GLvoid *) glGetCombinerInputParameterfvNV, _gloffset_GetCombinerInputParameterfvNV },
{ "glGetCombinerInputParameterivNV", (GLvoid *) glGetCombinerInputParameterivNV, _gloffset_GetCombinerInputParameterivNV },
{ "glGetCombinerOutputParameterfvNV", (GLvoid *) glGetCombinerOutputParameterfvNV, _gloffset_GetCombinerOutputParameterfvNV },
{ "glGetCombinerOutputParameterivNV", (GLvoid *) glGetCombinerOutputParameterivNV, _gloffset_GetCombinerOutputParameterivNV },
{ "glGetFinalCombinerInputParameterfvNV", (GLvoid *) glGetFinalCombinerInputParameterfvNV, _gloffset_GetFinalCombinerInputParameterfvNV },
{ "glGetFinalCombinerInputParameterivNV", (GLvoid *) glGetFinalCombinerInputParameterivNV, _gloffset_GetFinalCombinerInputParameterivNV },
{ "glResizeBuffersMESA", (GLvoid *) glResizeBuffersMESA, _gloffset_ResizeBuffersMESA },
{ "glWindowPos2dMESA", (GLvoid *) glWindowPos2dMESA, _gloffset_WindowPos2dMESA },
{ "glWindowPos2dvMESA", (GLvoid *) glWindowPos2dvMESA, _gloffset_WindowPos2dvMESA },
{ "glWindowPos2fMESA", (GLvoid *) glWindowPos2fMESA, _gloffset_WindowPos2fMESA },
{ "glWindowPos2fvMESA", (GLvoid *) glWindowPos2fvMESA, _gloffset_WindowPos2fvMESA },
{ "glWindowPos2iMESA", (GLvoid *) glWindowPos2iMESA, _gloffset_WindowPos2iMESA },
{ "glWindowPos2ivMESA", (GLvoid *) glWindowPos2ivMESA, _gloffset_WindowPos2ivMESA },
{ "glWindowPos2sMESA", (GLvoid *) glWindowPos2sMESA, _gloffset_WindowPos2sMESA },
{ "glWindowPos2svMESA", (GLvoid *) glWindowPos2svMESA, _gloffset_WindowPos2svMESA },
{ "glWindowPos3dMESA", (GLvoid *) glWindowPos3dMESA, _gloffset_WindowPos3dMESA },
{ "glWindowPos3dvMESA", (GLvoid *) glWindowPos3dvMESA, _gloffset_WindowPos3dvMESA },
{ "glWindowPos3fMESA", (GLvoid *) glWindowPos3fMESA, _gloffset_WindowPos3fMESA },
{ "glWindowPos3fvMESA", (GLvoid *) glWindowPos3fvMESA, _gloffset_WindowPos3fvMESA },
{ "glWindowPos3iMESA", (GLvoid *) glWindowPos3iMESA, _gloffset_WindowPos3iMESA },
{ "glWindowPos3ivMESA", (GLvoid *) glWindowPos3ivMESA, _gloffset_WindowPos3ivMESA },
{ "glWindowPos3sMESA", (GLvoid *) glWindowPos3sMESA, _gloffset_WindowPos3sMESA },
{ "glWindowPos3svMESA", (GLvoid *) glWindowPos3svMESA, _gloffset_WindowPos3svMESA },
{ "glWindowPos4dMESA", (GLvoid *) glWindowPos4dMESA, _gloffset_WindowPos4dMESA },
{ "glWindowPos4dvMESA", (GLvoid *) glWindowPos4dvMESA, _gloffset_WindowPos4dvMESA },
{ "glWindowPos4fMESA", (GLvoid *) glWindowPos4fMESA, _gloffset_WindowPos4fMESA },
{ "glWindowPos4fvMESA", (GLvoid *) glWindowPos4fvMESA, _gloffset_WindowPos4fvMESA },
{ "glWindowPos4iMESA", (GLvoid *) glWindowPos4iMESA, _gloffset_WindowPos4iMESA },
{ "glWindowPos4ivMESA", (GLvoid *) glWindowPos4ivMESA, _gloffset_WindowPos4ivMESA },
{ "glWindowPos4sMESA", (GLvoid *) glWindowPos4sMESA, _gloffset_WindowPos4sMESA },
{ "glWindowPos4svMESA", (GLvoid *) glWindowPos4svMESA, _gloffset_WindowPos4svMESA },
{ "glTbufferMask3DFX", (GLvoid *) glTbufferMask3DFX, _gloffset_TbufferMask3DFX },
{ "glSampleMaskEXT", (GLvoid *) glSampleMaskEXT, _gloffset_SampleMaskSGIS },
{ "glSamplePatternEXT", (GLvoid *) glSamplePatternEXT, _gloffset_SamplePatternSGIS },
{ "glDeleteFencesNV", (GLvoid *) glDeleteFencesNV, _gloffset_DeleteFencesNV },
{ "glGenFencesNV", (GLvoid *) glGenFencesNV, _gloffset_GenFencesNV },
{ "glIsFenceNV", (GLvoid *) glIsFenceNV, _gloffset_IsFenceNV },
{ "glTestFenceNV", (GLvoid *) glTestFenceNV, _gloffset_TestFenceNV },
{ "glGetFenceivNV", (GLvoid *) glGetFenceivNV, _gloffset_GetFenceivNV },
{ "glFinishFenceNV", (GLvoid *) glFinishFenceNV, _gloffset_FinishFenceNV },
{ "glSetFenceNV", (GLvoid *) glSetFenceNV, _gloffset_SetFenceNV },
{ "glWindowPos2dARB", (GLvoid *) glWindowPos2dARB, _gloffset_WindowPos2dMESA },
{ "glWindowPos2fARB", (GLvoid *) glWindowPos2fARB, _gloffset_WindowPos2fMESA },
{ "glWindowPos2iARB", (GLvoid *) glWindowPos2iARB, _gloffset_WindowPos2iMESA },
{ "glWindowPos2sARB", (GLvoid *) glWindowPos2sARB, _gloffset_WindowPos2sMESA },
{ "glWindowPos2dvARB", (GLvoid *) glWindowPos2dvARB, _gloffset_WindowPos2dvMESA },
{ "glWindowPos2fvARB", (GLvoid *) glWindowPos2fvARB, _gloffset_WindowPos2fvMESA },
{ "glWindowPos2ivARB", (GLvoid *) glWindowPos2ivARB, _gloffset_WindowPos2ivMESA },
{ "glWindowPos2svARB", (GLvoid *) glWindowPos2svARB, _gloffset_WindowPos2svMESA },
{ "glWindowPos3dARB", (GLvoid *) glWindowPos3dARB, _gloffset_WindowPos3dMESA },
{ "glWindowPos3fARB", (GLvoid *) glWindowPos3fARB, _gloffset_WindowPos3fMESA },
{ "glWindowPos3iARB", (GLvoid *) glWindowPos3iARB, _gloffset_WindowPos3iMESA },
{ "glWindowPos3sARB", (GLvoid *) glWindowPos3sARB, _gloffset_WindowPos3sMESA },
{ "glWindowPos3dvARB", (GLvoid *) glWindowPos3dvARB, _gloffset_WindowPos3dvMESA },
{ "glWindowPos3fvARB", (GLvoid *) glWindowPos3fvARB, _gloffset_WindowPos3fvMESA },
{ "glWindowPos3ivARB", (GLvoid *) glWindowPos3ivARB, _gloffset_WindowPos3ivMESA },
{ "glWindowPos3svARB", (GLvoid *) glWindowPos3svARB, _gloffset_WindowPos3svMESA },
{ "glAreProgramsResidentNV", (GLvoid *) glAreProgramsResidentNV, _gloffset_AreProgramsResidentNV },
{ "glBindProgramNV", (GLvoid *) glBindProgramNV, _gloffset_BindProgramNV },
{ "glDeleteProgramsNV", (GLvoid *) glDeleteProgramsNV, _gloffset_DeleteProgramsNV },
{ "glExecuteProgramNV", (GLvoid *) glExecuteProgramNV, _gloffset_ExecuteProgramNV },
{ "glGenProgramsNV", (GLvoid *) glGenProgramsNV, _gloffset_GenProgramsNV },
{ "glGetProgramParameterdvNV", (GLvoid *) glGetProgramParameterdvNV, _gloffset_GetProgramParameterdvNV },
{ "glGetProgramParameterfvNV", (GLvoid *) glGetProgramParameterfvNV, _gloffset_GetProgramParameterfvNV },
{ "glGetProgramivNV", (GLvoid *) glGetProgramivNV, _gloffset_GetProgramivNV },
{ "glGetProgramStringNV", (GLvoid *) glGetProgramStringNV, _gloffset_GetProgramStringNV },
{ "glGetTrackMatrixivNV", (GLvoid *) glGetTrackMatrixivNV, _gloffset_GetTrackMatrixivNV },
{ "glGetVertexAttribdvNV", (GLvoid *) glGetVertexAttribdvNV, _gloffset_GetVertexAttribdvNV },
{ "glGetVertexAttribfvNV", (GLvoid *) glGetVertexAttribfvNV, _gloffset_GetVertexAttribfvNV },
{ "glGetVertexAttribivNV", (GLvoid *) glGetVertexAttribivNV, _gloffset_GetVertexAttribivNV },
{ "glGetVertexAttribPointervNV", (GLvoid *) glGetVertexAttribPointervNV, _gloffset_GetVertexAttribPointervNV },
{ "glIsProgramNV", (GLvoid *) glIsProgramNV, _gloffset_IsProgramNV },
{ "glLoadProgramNV", (GLvoid *) glLoadProgramNV, _gloffset_LoadProgramNV },
{ "glProgramParameter4dNV", (GLvoid *) glProgramParameter4dNV, _gloffset_ProgramParameter4dNV },
{ "glProgramParameter4dvNV", (GLvoid *) glProgramParameter4dvNV, _gloffset_ProgramParameter4dvNV },
{ "glProgramParameter4fNV", (GLvoid *) glProgramParameter4fNV, _gloffset_ProgramParameter4fNV },
{ "glProgramParameter4fvNV", (GLvoid *) glProgramParameter4fvNV, _gloffset_ProgramParameter4fvNV },
{ "glProgramParameters4dvNV", (GLvoid *) glProgramParameters4dvNV, _gloffset_ProgramParameters4dvNV },
{ "glProgramParameters4fvNV", (GLvoid *) glProgramParameters4fvNV, _gloffset_ProgramParameters4fvNV },
{ "glRequestResidentProgramsNV", (GLvoid *) glRequestResidentProgramsNV, _gloffset_RequestResidentProgramsNV },
{ "glTrackMatrixNV", (GLvoid *) glTrackMatrixNV, _gloffset_TrackMatrixNV },
{ "glVertexAttribPointerNV", (GLvoid *) glVertexAttribPointerNV, _gloffset_VertexAttribPointerNV },
{ "glVertexAttrib1dNV", (GLvoid *) glVertexAttrib1dNV, _gloffset_VertexAttrib1dNV },
{ "glVertexAttrib1dvNV", (GLvoid *) glVertexAttrib1dvNV, _gloffset_VertexAttrib1dvNV },
{ "glVertexAttrib1fNV", (GLvoid *) glVertexAttrib1fNV, _gloffset_VertexAttrib1fNV },
{ "glVertexAttrib1fvNV", (GLvoid *) glVertexAttrib1fvNV, _gloffset_VertexAttrib1fvNV },
{ "glVertexAttrib1sNV", (GLvoid *) glVertexAttrib1sNV, _gloffset_VertexAttrib1sNV },
{ "glVertexAttrib1svNV", (GLvoid *) glVertexAttrib1svNV, _gloffset_VertexAttrib1svNV },
{ "glVertexAttrib2dNV", (GLvoid *) glVertexAttrib2dNV, _gloffset_VertexAttrib2dNV },
{ "glVertexAttrib2dvNV", (GLvoid *) glVertexAttrib2dvNV, _gloffset_VertexAttrib2dvNV },
{ "glVertexAttrib2fNV", (GLvoid *) glVertexAttrib2fNV, _gloffset_VertexAttrib2fNV },
{ "glVertexAttrib2fvNV", (GLvoid *) glVertexAttrib2fvNV, _gloffset_VertexAttrib2fvNV },
{ "glVertexAttrib2sNV", (GLvoid *) glVertexAttrib2sNV, _gloffset_VertexAttrib2sNV },
{ "glVertexAttrib2svNV", (GLvoid *) glVertexAttrib2svNV, _gloffset_VertexAttrib2svNV },
{ "glVertexAttrib3dNV", (GLvoid *) glVertexAttrib3dNV, _gloffset_VertexAttrib3dNV },
{ "glVertexAttrib3dvNV", (GLvoid *) glVertexAttrib3dvNV, _gloffset_VertexAttrib3dvNV },
{ "glVertexAttrib3fNV", (GLvoid *) glVertexAttrib3fNV, _gloffset_VertexAttrib3fNV },
{ "glVertexAttrib3fvNV", (GLvoid *) glVertexAttrib3fvNV, _gloffset_VertexAttrib3fvNV },
{ "glVertexAttrib3sNV", (GLvoid *) glVertexAttrib3sNV, _gloffset_VertexAttrib3sNV },
{ "glVertexAttrib3svNV", (GLvoid *) glVertexAttrib3svNV, _gloffset_VertexAttrib3svNV },
{ "glVertexAttrib4dNV", (GLvoid *) glVertexAttrib4dNV, _gloffset_VertexAttrib4dNV },
{ "glVertexAttrib4dvNV", (GLvoid *) glVertexAttrib4dvNV, _gloffset_VertexAttrib4dvNV },
{ "glVertexAttrib4fNV", (GLvoid *) glVertexAttrib4fNV, _gloffset_VertexAttrib4fNV },
{ "glVertexAttrib4fvNV", (GLvoid *) glVertexAttrib4fvNV, _gloffset_VertexAttrib4fvNV },
{ "glVertexAttrib4sNV", (GLvoid *) glVertexAttrib4sNV, _gloffset_VertexAttrib4sNV },
{ "glVertexAttrib4svNV", (GLvoid *) glVertexAttrib4svNV, _gloffset_VertexAttrib4svNV },
{ "glVertexAttrib4ubNV", (GLvoid *) glVertexAttrib4ubNV, _gloffset_VertexAttrib4ubNV },
{ "glVertexAttrib4ubvNV", (GLvoid *) glVertexAttrib4ubvNV, _gloffset_VertexAttrib4ubvNV },
{ "glVertexAttribs1dvNV", (GLvoid *) glVertexAttribs1dvNV, _gloffset_VertexAttribs1dvNV },
{ "glVertexAttribs1fvNV", (GLvoid *) glVertexAttribs1fvNV, _gloffset_VertexAttribs1fvNV },
{ "glVertexAttribs1svNV", (GLvoid *) glVertexAttribs1svNV, _gloffset_VertexAttribs1svNV },
{ "glVertexAttribs2dvNV", (GLvoid *) glVertexAttribs2dvNV, _gloffset_VertexAttribs2dvNV },
{ "glVertexAttribs2fvNV", (GLvoid *) glVertexAttribs2fvNV, _gloffset_VertexAttribs2fvNV },
{ "glVertexAttribs2svNV", (GLvoid *) glVertexAttribs2svNV, _gloffset_VertexAttribs2svNV },
{ "glVertexAttribs3dvNV", (GLvoid *) glVertexAttribs3dvNV, _gloffset_VertexAttribs3dvNV },
{ "glVertexAttribs3fvNV", (GLvoid *) glVertexAttribs3fvNV, _gloffset_VertexAttribs3fvNV },
{ "glVertexAttribs3svNV", (GLvoid *) glVertexAttribs3svNV, _gloffset_VertexAttribs3svNV },
{ "glVertexAttribs4dvNV", (GLvoid *) glVertexAttribs4dvNV, _gloffset_VertexAttribs4dvNV },
{ "glVertexAttribs4fvNV", (GLvoid *) glVertexAttribs4fvNV, _gloffset_VertexAttribs4fvNV },
{ "glVertexAttribs4svNV", (GLvoid *) glVertexAttribs4svNV, _gloffset_VertexAttribs4svNV },
{ "glVertexAttribs4ubvNV", (GLvoid *) glVertexAttribs4ubvNV, _gloffset_VertexAttribs4ubvNV },
{ "glPointParameteriNV", (GLvoid *) glPointParameteriNV, _gloffset_PointParameteriNV },
{ "glPointParameterivNV", (GLvoid *) glPointParameterivNV, _gloffset_PointParameterivNV },
{ "glBlendFuncSeparate", (GLvoid *) glBlendFuncSeparate, _gloffset_BlendFuncSeparateEXT },
{ "glFogCoordf", (GLvoid *) glFogCoordf, _gloffset_FogCoordfEXT },
{ "glFogCoordfv", (GLvoid *) glFogCoordfv, _gloffset_FogCoordfvEXT },
{ "glFogCoordd", (GLvoid *) glFogCoordd, _gloffset_FogCoorddEXT },
{ "glFogCoorddv", (GLvoid *) glFogCoorddv, _gloffset_FogCoorddvEXT },
{ "glFogCoordPointer", (GLvoid *) glFogCoordPointer, _gloffset_FogCoordPointerEXT },
{ "glMultiDrawArrays", (GLvoid *) glMultiDrawArrays, _gloffset_MultiDrawArraysEXT },
{ "glMultiDrawElements", (GLvoid *) glMultiDrawElements, _gloffset_MultiDrawElementsEXT },
{ "glPointParameterf", (GLvoid *) glPointParameterf, _gloffset_PointParameterfEXT },
{ "glPointParameterfv", (GLvoid *) glPointParameterfv, _gloffset_PointParameterfvEXT },
{ "glPointParameteri", (GLvoid *) glPointParameteri, _gloffset_PointParameteriNV },
{ "glPointParameteriv", (GLvoid *) glPointParameteriv, _gloffset_PointParameterivNV },
{ "glSecondaryColor3b", (GLvoid *) glSecondaryColor3b, _gloffset_SecondaryColor3bEXT },
{ "glSecondaryColor3bv", (GLvoid *) glSecondaryColor3bv, _gloffset_SecondaryColor3bvEXT },
{ "glSecondaryColor3d", (GLvoid *) glSecondaryColor3d, _gloffset_SecondaryColor3dEXT },
{ "glSecondaryColor3dv", (GLvoid *) glSecondaryColor3dv, _gloffset_SecondaryColor3dvEXT },
{ "glSecondaryColor3f", (GLvoid *) glSecondaryColor3f, _gloffset_SecondaryColor3fEXT },
{ "glSecondaryColor3fv", (GLvoid *) glSecondaryColor3fv, _gloffset_SecondaryColor3fvEXT },
{ "glSecondaryColor3i", (GLvoid *) glSecondaryColor3i, _gloffset_SecondaryColor3iEXT },
{ "glSecondaryColor3iv", (GLvoid *) glSecondaryColor3iv, _gloffset_SecondaryColor3ivEXT },
{ "glSecondaryColor3s", (GLvoid *) glSecondaryColor3s, _gloffset_SecondaryColor3sEXT },
{ "glSecondaryColor3sv", (GLvoid *) glSecondaryColor3sv, _gloffset_SecondaryColor3svEXT },
{ "glSecondaryColor3ub", (GLvoid *) glSecondaryColor3ub, _gloffset_SecondaryColor3ubEXT },
{ "glSecondaryColor3ubv", (GLvoid *) glSecondaryColor3ubv, _gloffset_SecondaryColor3ubvEXT },
{ "glSecondaryColor3ui", (GLvoid *) glSecondaryColor3ui, _gloffset_SecondaryColor3uiEXT },
{ "glSecondaryColor3uiv", (GLvoid *) glSecondaryColor3uiv, _gloffset_SecondaryColor3uivEXT },
{ "glSecondaryColor3us", (GLvoid *) glSecondaryColor3us, _gloffset_SecondaryColor3usEXT },
{ "glSecondaryColor3usv", (GLvoid *) glSecondaryColor3usv, _gloffset_SecondaryColor3usvEXT },
{ "glSecondaryColorPointer", (GLvoid *) glSecondaryColorPointer, _gloffset_SecondaryColorPointerEXT },
{ "glWindowPos2d", (GLvoid *) glWindowPos2d, _gloffset_WindowPos2dMESA },
{ "glWindowPos2dv", (GLvoid *) glWindowPos2dv, _gloffset_WindowPos2dvMESA },
{ "glWindowPos2f", (GLvoid *) glWindowPos2f, _gloffset_WindowPos2fMESA },
{ "glWindowPos2fv", (GLvoid *) glWindowPos2fv, _gloffset_WindowPos2fvMESA },
{ "glWindowPos2i", (GLvoid *) glWindowPos2i, _gloffset_WindowPos2iMESA },
{ "glWindowPos2iv", (GLvoid *) glWindowPos2iv, _gloffset_WindowPos2ivMESA },
{ "glWindowPos2s", (GLvoid *) glWindowPos2s, _gloffset_WindowPos2sMESA },
{ "glWindowPos2sv", (GLvoid *) glWindowPos2sv, _gloffset_WindowPos2svMESA },
{ "glWindowPos3d", (GLvoid *) glWindowPos3d, _gloffset_WindowPos3dMESA },
{ "glWindowPos3dv", (GLvoid *) glWindowPos3dv, _gloffset_WindowPos3dvMESA },
{ "glWindowPos3f", (GLvoid *) glWindowPos3f, _gloffset_WindowPos3fMESA },
{ "glWindowPos3fv", (GLvoid *) glWindowPos3fv, _gloffset_WindowPos3fvMESA },
{ "glWindowPos3i", (GLvoid *) glWindowPos3i, _gloffset_WindowPos3iMESA },
{ "glWindowPos3iv", (GLvoid *) glWindowPos3iv, _gloffset_WindowPos3ivMESA },
{ "glWindowPos3s", (GLvoid *) glWindowPos3s, _gloffset_WindowPos3sMESA },
{ "glWindowPos3sv", (GLvoid *) glWindowPos3sv, _gloffset_WindowPos3svMESA },
{ "glActiveStencilFaceEXT", (GLvoid *) glActiveStencilFaceEXT, _gloffset_ActiveStencilFaceEXT },
{ NULL, NULL } /* end of list marker */
};
/shark/trunk/ports/mesa/src/texformat.h
0,0 → 1,149
/* $Id: texformat.h,v 1.1 2003-02-28 11:42:05 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Author:
* Gareth Hughes
*/
 
#ifndef TEXFORMAT_H
#define TEXFORMAT_H
 
#include "mtypes.h"
 
 
/*
* The Mesa internal texture image types.
* All texture images must be stored in one of these formats.
*/
enum _format {
/* Hardware-friendly formats. Drivers can override the default
* formats and convert texture images to one of these as required.
* The driver's ChooseTextureFormat() function will choose one of
* these formats.
* These formats are all little endian, as shown below. They will be
* most useful for x86-based PC graphics card drivers.
*
* NOTE: In the default case, some of these formats will be
* duplicates of the generic formats listed below. However, these
* formats guarantee their internal component sizes, while GLchan may
* vary betwen GLubyte, GLushort and GLfloat.
*/
/* msb <------ TEXEL BITS -----------> lsb */
/* ---- ---- ---- ---- ---- ---- ---- ---- */
MESA_FORMAT_RGBA8888, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
MESA_FORMAT_ARGB8888, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
MESA_FORMAT_RGB888, /* RRRR RRRR GGGG GGGG BBBB BBBB */
MESA_FORMAT_RGB565, /* RRRR RGGG GGGB BBBB */
MESA_FORMAT_ARGB4444, /* AAAA RRRR GGGG BBBB */
MESA_FORMAT_ARGB1555, /* ARRR RRGG GGGB BBBB */
MESA_FORMAT_AL88, /* AAAA AAAA LLLL LLLL */
MESA_FORMAT_RGB332, /* RRRG GGBB */
MESA_FORMAT_A8, /* AAAA AAAA */
MESA_FORMAT_L8, /* LLLL LLLL */
MESA_FORMAT_I8, /* IIII IIII */
MESA_FORMAT_CI8, /* CCCC CCCC */
MESA_FORMAT_YCBCR, /* YYYY YYYY UorV UorV */
MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */
 
#if 0
/* upcoming little-endian formats: */
 
/* msb <------ TEXEL BITS -----------> lsb */
/* ---- ---- ---- ---- ---- ---- ---- ---- */
MESA_FORMAT_ABGR8888, /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
MESA_FORMAT_BGRA8888, /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
MESA_FORMAT_BGR888, /* BBBB BBBB GGGG GGGG RRRR RRRR */
MESA_FORMAT_BGR565, /* BBBB BGGG GGGR RRRR */
MESA_FORMAT_BGRA4444, /* BBBB GGGG RRRR AAAA */
MESA_FORMAT_BGRA5551, /* BBBB BGGG GGRR RRRA */
MESA_FORMAT_LA88, /* LLLL LLLL AAAA AAAA */
MESA_FORMAT_BGR233, /* BBGG GRRR */
#endif
 
/* Generic GLchan-based formats. These are the default formats used
* by the software rasterizer and, unless the driver overrides the
* texture image functions, incoming images will be converted to one
* of these formats. Components are arrays of GLchan values, so
* there will be no big/little endian issues.
*
* NOTE: Because these are based on the GLchan datatype, one cannot
* assume 8 bits per channel with these formats. If you require
* GLubyte channels, use one of the hardware formats above.
*/
MESA_FORMAT_RGBA,
MESA_FORMAT_RGB,
MESA_FORMAT_ALPHA,
MESA_FORMAT_LUMINANCE,
MESA_FORMAT_LUMINANCE_ALPHA,
MESA_FORMAT_INTENSITY,
MESA_FORMAT_COLOR_INDEX,
MESA_FORMAT_DEPTH_COMPONENT
};
 
 
extern GLboolean
_mesa_is_hardware_tex_format( const struct gl_texture_format *format );
 
extern const struct gl_texture_format *
_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
GLenum format, GLenum type );
 
extern GLint
_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat);
 
 
/* The default formats, GLchan per component:
*/
extern const struct gl_texture_format _mesa_texformat_rgba;
extern const struct gl_texture_format _mesa_texformat_rgb;
extern const struct gl_texture_format _mesa_texformat_alpha;
extern const struct gl_texture_format _mesa_texformat_luminance;
extern const struct gl_texture_format _mesa_texformat_luminance_alpha;
extern const struct gl_texture_format _mesa_texformat_intensity;
extern const struct gl_texture_format _mesa_texformat_color_index;
extern const struct gl_texture_format _mesa_texformat_depth_component;
 
/* The hardware-friendly formats:
*/
extern const struct gl_texture_format _mesa_texformat_rgba8888;
extern const struct gl_texture_format _mesa_texformat_argb8888;
extern const struct gl_texture_format _mesa_texformat_rgb888;
extern const struct gl_texture_format _mesa_texformat_rgb565;
extern const struct gl_texture_format _mesa_texformat_argb4444;
extern const struct gl_texture_format _mesa_texformat_argb1555;
extern const struct gl_texture_format _mesa_texformat_al88;
extern const struct gl_texture_format _mesa_texformat_rgb332;
extern const struct gl_texture_format _mesa_texformat_a8;
extern const struct gl_texture_format _mesa_texformat_l8;
extern const struct gl_texture_format _mesa_texformat_i8;
extern const struct gl_texture_format _mesa_texformat_ci8;
extern const struct gl_texture_format _mesa_texformat_ycbcr;
extern const struct gl_texture_format _mesa_texformat_ycbcr_rev;
 
/* The null format:
*/
extern const struct gl_texture_format _mesa_null_texformat;
 
#endif
/shark/trunk/ports/mesa/src/get.c
0,0 → 1,5708
/* $Id: get.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "enable.h"
#include "enums.h"
#include "extensions.h"
#include "get.h"
#include "macros.h"
#include "mmath.h"
#include "mtypes.h"
#include "texcompress.h"
#include "math/m_matrix.h"
 
 
 
#define FLOAT_TO_BOOL(X) ( (X)==0.0F ? GL_FALSE : GL_TRUE )
#define INT_TO_BOOL(I) ( (I)==0 ? GL_FALSE : GL_TRUE )
#define ENUM_TO_BOOL(E) ( (E)==0 ? GL_FALSE : GL_TRUE )
 
#ifdef SPECIALCAST
/* Needed for an Amiga compiler */
#define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))
#define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))
#else
/* all other compilers */
#define ENUM_TO_FLOAT(X) ((GLfloat)(X))
#define ENUM_TO_DOUBLE(X) ((GLdouble)(X))
#endif
 
 
/* Check if named extension is enabled, if not generate error and return */
 
#define CHECK_EXTENSION_B(EXTNAME, PNAME) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_VALUE, \
"glGetBooleanv(0x%x)", (int) PNAME); \
return; \
}
 
#define CHECK_EXTENSION_I(EXTNAME, PNAME) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_VALUE, \
"glGetIntegerv(0x%x)", (int) PNAME); \
return; \
}
 
#define CHECK_EXTENSION_F(EXTNAME, PNAME) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_VALUE, \
"glGetFloatv(0x%x)", (int) PNAME); \
return; \
}
 
#define CHECK_EXTENSION_D(EXTNAME, PNAME) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_VALUE, \
"glGetDoublev(0x%x)", (int) PNAME); \
return; \
}
 
 
 
 
static GLenum
pixel_texgen_mode(const GLcontext *ctx)
{
if (ctx->Pixel.FragmentRgbSource == GL_CURRENT_RASTER_POSITION) {
if (ctx->Pixel.FragmentAlphaSource == GL_CURRENT_RASTER_POSITION) {
return GL_RGBA;
}
else {
return GL_RGB;
}
}
else {
if (ctx->Pixel.FragmentAlphaSource == GL_CURRENT_RASTER_POSITION) {
return GL_ALPHA;
}
else {
return GL_NONE;
}
}
}
 
 
void
_mesa_GetBooleanv( GLenum pname, GLboolean *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint i;
GLuint texUnit = ctx->Texture.CurrentUnit;
const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!params)
return;
 
/* We need this in order to get correct results for
* GL_OCCLUSION_TEST_RESULT_HP. There might be other important cases.
*/
FLUSH_VERTICES(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetBooleanv %s\n", _mesa_lookup_enum_by_nr(pname));
 
if (ctx->Driver.GetBooleanv
&& (*ctx->Driver.GetBooleanv)(ctx, pname, params))
return;
 
switch (pname) {
case GL_ACCUM_RED_BITS:
*params = INT_TO_BOOL(ctx->Visual.accumRedBits);
break;
case GL_ACCUM_GREEN_BITS:
*params = INT_TO_BOOL(ctx->Visual.accumGreenBits);
break;
case GL_ACCUM_BLUE_BITS:
*params = INT_TO_BOOL(ctx->Visual.accumBlueBits);
break;
case GL_ACCUM_ALPHA_BITS:
*params = INT_TO_BOOL(ctx->Visual.accumAlphaBits);
break;
case GL_ACCUM_CLEAR_VALUE:
params[0] = FLOAT_TO_BOOL(ctx->Accum.ClearColor[0]);
params[1] = FLOAT_TO_BOOL(ctx->Accum.ClearColor[1]);
params[2] = FLOAT_TO_BOOL(ctx->Accum.ClearColor[2]);
params[3] = FLOAT_TO_BOOL(ctx->Accum.ClearColor[3]);
break;
case GL_ALPHA_BIAS:
*params = FLOAT_TO_BOOL(ctx->Pixel.AlphaBias);
break;
case GL_ALPHA_BITS:
*params = INT_TO_BOOL(ctx->Visual.alphaBits);
break;
case GL_ALPHA_SCALE:
*params = FLOAT_TO_BOOL(ctx->Pixel.AlphaScale);
break;
case GL_ALPHA_TEST:
*params = ctx->Color.AlphaEnabled;
break;
case GL_ALPHA_TEST_FUNC:
*params = ENUM_TO_BOOL(ctx->Color.AlphaFunc);
break;
case GL_ALPHA_TEST_REF:
*params = ctx->Color.AlphaRef ? GL_TRUE : GL_FALSE;
break;
case GL_ATTRIB_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->AttribStackDepth);
break;
case GL_AUTO_NORMAL:
*params = ctx->Eval.AutoNormal;
break;
case GL_AUX_BUFFERS:
*params = (ctx->Const.NumAuxBuffers) ? GL_TRUE : GL_FALSE;
break;
case GL_BLEND:
*params = ctx->Color.BlendEnabled;
break;
case GL_BLEND_DST:
*params = ENUM_TO_BOOL(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC:
*params = ENUM_TO_BOOL(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_SRC_RGB_EXT:
*params = ENUM_TO_BOOL(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_DST_RGB_EXT:
*params = ENUM_TO_BOOL(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC_ALPHA_EXT:
*params = ENUM_TO_BOOL(ctx->Color.BlendSrcA);
break;
case GL_BLEND_DST_ALPHA_EXT:
*params = ENUM_TO_BOOL(ctx->Color.BlendDstA);
break;
case GL_BLEND_EQUATION_EXT:
*params = ENUM_TO_BOOL( ctx->Color.BlendEquation );
break;
case GL_BLEND_COLOR_EXT:
params[0] = FLOAT_TO_BOOL( ctx->Color.BlendColor[0] );
params[1] = FLOAT_TO_BOOL( ctx->Color.BlendColor[1] );
params[2] = FLOAT_TO_BOOL( ctx->Color.BlendColor[2] );
params[3] = FLOAT_TO_BOOL( ctx->Color.BlendColor[3] );
break;
case GL_BLUE_BIAS:
*params = FLOAT_TO_BOOL(ctx->Pixel.BlueBias);
break;
case GL_BLUE_BITS:
*params = INT_TO_BOOL( ctx->Visual.blueBits );
break;
case GL_BLUE_SCALE:
*params = FLOAT_TO_BOOL(ctx->Pixel.BlueScale);
break;
case GL_CLIENT_ATTRIB_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->ClientAttribStackDepth);
break;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
if (ctx->Transform.ClipPlanesEnabled & (1 << (pname - GL_CLIP_PLANE0)))
*params = GL_TRUE;
else
*params = GL_FALSE;
break;
case GL_COLOR_CLEAR_VALUE:
params[0] = ctx->Color.ClearColor[0] ? GL_TRUE : GL_FALSE;
params[1] = ctx->Color.ClearColor[1] ? GL_TRUE : GL_FALSE;
params[2] = ctx->Color.ClearColor[2] ? GL_TRUE : GL_FALSE;
params[3] = ctx->Color.ClearColor[3] ? GL_TRUE : GL_FALSE;
break;
case GL_COLOR_MATERIAL:
*params = ctx->Light.ColorMaterialEnabled;
break;
case GL_COLOR_MATERIAL_FACE:
*params = ENUM_TO_BOOL(ctx->Light.ColorMaterialFace);
break;
case GL_COLOR_MATERIAL_PARAMETER:
*params = ENUM_TO_BOOL(ctx->Light.ColorMaterialMode);
break;
case GL_COLOR_WRITEMASK:
params[0] = ctx->Color.ColorMask[RCOMP] ? GL_TRUE : GL_FALSE;
params[1] = ctx->Color.ColorMask[GCOMP] ? GL_TRUE : GL_FALSE;
params[2] = ctx->Color.ColorMask[BCOMP] ? GL_TRUE : GL_FALSE;
params[3] = ctx->Color.ColorMask[ACOMP] ? GL_TRUE : GL_FALSE;
break;
case GL_CULL_FACE:
*params = ctx->Polygon.CullFlag;
break;
case GL_CULL_FACE_MODE:
*params = ENUM_TO_BOOL(ctx->Polygon.CullFaceMode);
break;
case GL_CURRENT_COLOR:
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2]);
params[3] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3]);
break;
case GL_CURRENT_INDEX:
FLUSH_CURRENT(ctx, 0);
*params = INT_TO_BOOL(ctx->Current.Index);
break;
case GL_CURRENT_NORMAL:
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][2]);
break;
case GL_CURRENT_RASTER_COLOR:
params[0] = FLOAT_TO_BOOL(ctx->Current.RasterColor[0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.RasterColor[1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.RasterColor[2]);
params[3] = FLOAT_TO_BOOL(ctx->Current.RasterColor[3]);
break;
case GL_CURRENT_RASTER_DISTANCE:
*params = FLOAT_TO_BOOL(ctx->Current.RasterDistance);
break;
case GL_CURRENT_RASTER_INDEX:
*params = FLOAT_TO_BOOL(ctx->Current.RasterIndex);
break;
case GL_CURRENT_RASTER_POSITION:
params[0] = FLOAT_TO_BOOL(ctx->Current.RasterPos[0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.RasterPos[1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.RasterPos[2]);
params[3] = FLOAT_TO_BOOL(ctx->Current.RasterPos[3]);
break;
case GL_CURRENT_RASTER_TEXTURE_COORDS:
params[0] = FLOAT_TO_BOOL(ctx->Current.RasterTexCoords[texUnit][0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.RasterTexCoords[texUnit][1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.RasterTexCoords[texUnit][2]);
params[3] = FLOAT_TO_BOOL(ctx->Current.RasterTexCoords[texUnit][3]);
break;
case GL_CURRENT_RASTER_POSITION_VALID:
*params = ctx->Current.RasterPosValid;
break;
case GL_CURRENT_TEXTURE_COORDS:
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][0]);
params[1] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][1]);
params[2] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][2]);
params[3] = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][3]);
break;
case GL_DEPTH_BIAS:
*params = FLOAT_TO_BOOL(ctx->Pixel.DepthBias);
break;
case GL_DEPTH_BITS:
*params = INT_TO_BOOL(ctx->Visual.depthBits);
break;
case GL_DEPTH_CLEAR_VALUE:
*params = FLOAT_TO_BOOL(ctx->Depth.Clear);
break;
case GL_DEPTH_FUNC:
*params = ENUM_TO_BOOL(ctx->Depth.Func);
break;
case GL_DEPTH_RANGE:
params[0] = FLOAT_TO_BOOL(ctx->Viewport.Near);
params[1] = FLOAT_TO_BOOL(ctx->Viewport.Far);
break;
case GL_DEPTH_SCALE:
*params = FLOAT_TO_BOOL(ctx->Pixel.DepthScale);
break;
case GL_DEPTH_TEST:
*params = ctx->Depth.Test;
break;
case GL_DEPTH_WRITEMASK:
*params = ctx->Depth.Mask;
break;
case GL_DITHER:
*params = ctx->Color.DitherFlag;
break;
case GL_DOUBLEBUFFER:
*params = ctx->Visual.doubleBufferMode;
break;
case GL_DRAW_BUFFER:
*params = ENUM_TO_BOOL(ctx->Color.DrawBuffer);
break;
case GL_EDGE_FLAG:
FLUSH_CURRENT(ctx, 0);
*params = ctx->Current.EdgeFlag;
break;
case GL_FEEDBACK_BUFFER_SIZE:
*params = INT_TO_BOOL(ctx->Feedback.BufferSize);
break;
case GL_FEEDBACK_BUFFER_TYPE:
*params = INT_TO_BOOL(ctx->Feedback.Type);
break;
case GL_FOG:
*params = ctx->Fog.Enabled;
break;
case GL_FOG_COLOR:
params[0] = FLOAT_TO_BOOL(ctx->Fog.Color[0]);
params[1] = FLOAT_TO_BOOL(ctx->Fog.Color[1]);
params[2] = FLOAT_TO_BOOL(ctx->Fog.Color[2]);
params[3] = FLOAT_TO_BOOL(ctx->Fog.Color[3]);
break;
case GL_FOG_DENSITY:
*params = FLOAT_TO_BOOL(ctx->Fog.Density);
break;
case GL_FOG_END:
*params = FLOAT_TO_BOOL(ctx->Fog.End);
break;
case GL_FOG_HINT:
*params = ENUM_TO_BOOL(ctx->Hint.Fog);
break;
case GL_FOG_INDEX:
*params = FLOAT_TO_BOOL(ctx->Fog.Index);
break;
case GL_FOG_MODE:
*params = ENUM_TO_BOOL(ctx->Fog.Mode);
break;
case GL_FOG_START:
*params = FLOAT_TO_BOOL(ctx->Fog.End);
break;
case GL_FRONT_FACE:
*params = ENUM_TO_BOOL(ctx->Polygon.FrontFace);
break;
case GL_GREEN_BIAS:
*params = FLOAT_TO_BOOL(ctx->Pixel.GreenBias);
break;
case GL_GREEN_BITS:
*params = INT_TO_BOOL( ctx->Visual.greenBits );
break;
case GL_GREEN_SCALE:
*params = FLOAT_TO_BOOL(ctx->Pixel.GreenScale);
break;
case GL_INDEX_BITS:
*params = INT_TO_BOOL( ctx->Visual.indexBits );
break;
case GL_INDEX_CLEAR_VALUE:
*params = INT_TO_BOOL(ctx->Color.ClearIndex);
break;
case GL_INDEX_MODE:
*params = ctx->Visual.rgbMode ? GL_FALSE : GL_TRUE;
break;
case GL_INDEX_OFFSET:
*params = INT_TO_BOOL(ctx->Pixel.IndexOffset);
break;
case GL_INDEX_SHIFT:
*params = INT_TO_BOOL(ctx->Pixel.IndexShift);
break;
case GL_INDEX_WRITEMASK:
*params = INT_TO_BOOL(ctx->Color.IndexMask);
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
*params = ctx->Light.Light[pname-GL_LIGHT0].Enabled;
break;
case GL_LIGHTING:
*params = ctx->Light.Enabled;
break;
case GL_LIGHT_MODEL_AMBIENT:
params[0] = FLOAT_TO_BOOL(ctx->Light.Model.Ambient[0]);
params[1] = FLOAT_TO_BOOL(ctx->Light.Model.Ambient[1]);
params[2] = FLOAT_TO_BOOL(ctx->Light.Model.Ambient[2]);
params[3] = FLOAT_TO_BOOL(ctx->Light.Model.Ambient[3]);
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
params[0] = ENUM_TO_BOOL(ctx->Light.Model.ColorControl);
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
*params = ctx->Light.Model.LocalViewer;
break;
case GL_LIGHT_MODEL_TWO_SIDE:
*params = ctx->Light.Model.TwoSide;
break;
case GL_LINE_SMOOTH:
*params = ctx->Line.SmoothFlag;
break;
case GL_LINE_SMOOTH_HINT:
*params = ENUM_TO_BOOL(ctx->Hint.LineSmooth);
break;
case GL_LINE_STIPPLE:
*params = ctx->Line.StippleFlag;
break;
case GL_LINE_STIPPLE_PATTERN:
*params = INT_TO_BOOL(ctx->Line.StipplePattern);
break;
case GL_LINE_STIPPLE_REPEAT:
*params = INT_TO_BOOL(ctx->Line.StippleFactor);
break;
case GL_LINE_WIDTH:
*params = FLOAT_TO_BOOL(ctx->Line.Width);
break;
case GL_LINE_WIDTH_GRANULARITY:
*params = FLOAT_TO_BOOL(ctx->Const.LineWidthGranularity);
break;
case GL_LINE_WIDTH_RANGE:
params[0] = FLOAT_TO_BOOL(ctx->Const.MinLineWidthAA);
params[1] = FLOAT_TO_BOOL(ctx->Const.MaxLineWidthAA);
break;
case GL_ALIASED_LINE_WIDTH_RANGE:
params[0] = FLOAT_TO_BOOL(ctx->Const.MinLineWidth);
params[1] = FLOAT_TO_BOOL(ctx->Const.MaxLineWidth);
break;
case GL_LIST_BASE:
*params = INT_TO_BOOL(ctx->List.ListBase);
break;
case GL_LIST_INDEX:
*params = INT_TO_BOOL( ctx->CurrentListNum );
break;
case GL_LIST_MODE:
*params = ENUM_TO_BOOL( ctx->ExecuteFlag
? GL_COMPILE_AND_EXECUTE : GL_COMPILE );
break;
case GL_INDEX_LOGIC_OP:
*params = ctx->Color.IndexLogicOpEnabled;
break;
case GL_COLOR_LOGIC_OP:
*params = ctx->Color.ColorLogicOpEnabled;
break;
case GL_LOGIC_OP_MODE:
*params = ENUM_TO_BOOL(ctx->Color.LogicOp);
break;
case GL_MAP1_COLOR_4:
*params = ctx->Eval.Map1Color4;
break;
case GL_MAP1_GRID_DOMAIN:
params[0] = FLOAT_TO_BOOL(ctx->Eval.MapGrid1u1);
params[1] = FLOAT_TO_BOOL(ctx->Eval.MapGrid1u2);
break;
case GL_MAP1_GRID_SEGMENTS:
*params = INT_TO_BOOL(ctx->Eval.MapGrid1un);
break;
case GL_MAP1_INDEX:
*params = ctx->Eval.Map1Index;
break;
case GL_MAP1_NORMAL:
*params = ctx->Eval.Map1Normal;
break;
case GL_MAP1_TEXTURE_COORD_1:
*params = ctx->Eval.Map1TextureCoord1;
break;
case GL_MAP1_TEXTURE_COORD_2:
*params = ctx->Eval.Map1TextureCoord2;
break;
case GL_MAP1_TEXTURE_COORD_3:
*params = ctx->Eval.Map1TextureCoord3;
break;
case GL_MAP1_TEXTURE_COORD_4:
*params = ctx->Eval.Map1TextureCoord4;
break;
case GL_MAP1_VERTEX_3:
*params = ctx->Eval.Map1Vertex3;
break;
case GL_MAP1_VERTEX_4:
*params = ctx->Eval.Map1Vertex4;
break;
case GL_MAP2_COLOR_4:
*params = ctx->Eval.Map2Color4;
break;
case GL_MAP2_GRID_DOMAIN:
params[0] = FLOAT_TO_BOOL(ctx->Eval.MapGrid2u1);
params[1] = FLOAT_TO_BOOL(ctx->Eval.MapGrid2u2);
params[2] = FLOAT_TO_BOOL(ctx->Eval.MapGrid2v1);
params[3] = FLOAT_TO_BOOL(ctx->Eval.MapGrid2v2);
break;
case GL_MAP2_GRID_SEGMENTS:
params[0] = INT_TO_BOOL(ctx->Eval.MapGrid2un);
params[1] = INT_TO_BOOL(ctx->Eval.MapGrid2vn);
break;
case GL_MAP2_INDEX:
*params = ctx->Eval.Map2Index;
break;
case GL_MAP2_NORMAL:
*params = ctx->Eval.Map2Normal;
break;
case GL_MAP2_TEXTURE_COORD_1:
*params = ctx->Eval.Map2TextureCoord1;
break;
case GL_MAP2_TEXTURE_COORD_2:
*params = ctx->Eval.Map2TextureCoord2;
break;
case GL_MAP2_TEXTURE_COORD_3:
*params = ctx->Eval.Map2TextureCoord3;
break;
case GL_MAP2_TEXTURE_COORD_4:
*params = ctx->Eval.Map2TextureCoord4;
break;
case GL_MAP2_VERTEX_3:
*params = ctx->Eval.Map2Vertex3;
break;
case GL_MAP2_VERTEX_4:
*params = ctx->Eval.Map2Vertex4;
break;
case GL_MAP_COLOR:
*params = ctx->Pixel.MapColorFlag;
break;
case GL_MAP_STENCIL:
*params = ctx->Pixel.MapStencilFlag;
break;
case GL_MATRIX_MODE:
*params = ENUM_TO_BOOL( ctx->Transform.MatrixMode );
break;
case GL_MAX_ATTRIB_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_ATTRIB_STACK_DEPTH);
break;
case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
*params = INT_TO_BOOL( MAX_CLIENT_ATTRIB_STACK_DEPTH);
break;
case GL_MAX_CLIP_PLANES:
*params = INT_TO_BOOL(ctx->Const.MaxClipPlanes);
break;
case GL_MAX_ELEMENTS_VERTICES: /* GL_VERSION_1_2 */
*params = INT_TO_BOOL(ctx->Const.MaxArrayLockSize);
break;
case GL_MAX_ELEMENTS_INDICES: /* GL_VERSION_1_2 */
*params = INT_TO_BOOL(ctx->Const.MaxArrayLockSize);
break;
case GL_MAX_EVAL_ORDER:
*params = INT_TO_BOOL(MAX_EVAL_ORDER);
break;
case GL_MAX_LIGHTS:
*params = INT_TO_BOOL(ctx->Const.MaxLights);
break;
case GL_MAX_LIST_NESTING:
*params = INT_TO_BOOL(MAX_LIST_NESTING);
break;
case GL_MAX_MODELVIEW_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_MODELVIEW_STACK_DEPTH);
break;
case GL_MAX_NAME_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_NAME_STACK_DEPTH);
break;
case GL_MAX_PIXEL_MAP_TABLE:
*params = INT_TO_BOOL(MAX_PIXEL_MAP_TABLE);
break;
case GL_MAX_PROJECTION_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_PROJECTION_STACK_DEPTH);
break;
case GL_MAX_TEXTURE_SIZE:
*params = INT_TO_BOOL(1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE:
*params = INT_TO_BOOL(1 << (ctx->Const.Max3DTextureLevels - 1));
break;
case GL_MAX_TEXTURE_STACK_DEPTH:
*params = INT_TO_BOOL(MAX_TEXTURE_STACK_DEPTH);
break;
case GL_MAX_VIEWPORT_DIMS:
params[0] = INT_TO_BOOL(MAX_WIDTH);
params[1] = INT_TO_BOOL(MAX_HEIGHT);
break;
case GL_MODELVIEW_MATRIX:
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(ctx->ModelviewMatrixStack.Top->m[i]);
}
break;
case GL_MODELVIEW_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->ModelviewMatrixStack.Depth + 1);
break;
case GL_NAME_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->Select.NameStackDepth);
break;
case GL_NORMALIZE:
*params = ctx->Transform.Normalize;
break;
case GL_PACK_ALIGNMENT:
*params = INT_TO_BOOL(ctx->Pack.Alignment);
break;
case GL_PACK_LSB_FIRST:
*params = ctx->Pack.LsbFirst;
break;
case GL_PACK_ROW_LENGTH:
*params = INT_TO_BOOL(ctx->Pack.RowLength);
break;
case GL_PACK_SKIP_PIXELS:
*params = INT_TO_BOOL(ctx->Pack.SkipPixels);
break;
case GL_PACK_SKIP_ROWS:
*params = INT_TO_BOOL(ctx->Pack.SkipRows);
break;
case GL_PACK_SWAP_BYTES:
*params = ctx->Pack.SwapBytes;
break;
case GL_PACK_SKIP_IMAGES_EXT:
*params = ctx->Pack.SkipImages;
break;
case GL_PACK_IMAGE_HEIGHT_EXT:
*params = ctx->Pack.ImageHeight;
break;
case GL_PACK_INVERT_MESA:
*params = ctx->Pack.Invert;
break;
case GL_PERSPECTIVE_CORRECTION_HINT:
*params = ENUM_TO_BOOL(ctx->Hint.PerspectiveCorrection);
break;
case GL_PIXEL_MAP_A_TO_A_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapAtoAsize);
break;
case GL_PIXEL_MAP_B_TO_B_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapBtoBsize);
break;
case GL_PIXEL_MAP_G_TO_G_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapGtoGsize);
break;
case GL_PIXEL_MAP_I_TO_A_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapItoAsize);
break;
case GL_PIXEL_MAP_I_TO_B_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapItoBsize);
break;
case GL_PIXEL_MAP_I_TO_G_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapItoGsize);
break;
case GL_PIXEL_MAP_I_TO_I_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapItoIsize);
break;
case GL_PIXEL_MAP_I_TO_R_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapItoRsize);
break;
case GL_PIXEL_MAP_R_TO_R_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapRtoRsize);
break;
case GL_PIXEL_MAP_S_TO_S_SIZE:
*params = INT_TO_BOOL(ctx->Pixel.MapStoSsize);
break;
case GL_POINT_SIZE:
*params = FLOAT_TO_BOOL(ctx->Point.Size);
break;
case GL_POINT_SIZE_GRANULARITY:
*params = FLOAT_TO_BOOL(ctx->Const.PointSizeGranularity );
break;
case GL_POINT_SIZE_RANGE:
params[0] = FLOAT_TO_BOOL(ctx->Const.MinPointSizeAA);
params[1] = FLOAT_TO_BOOL(ctx->Const.MaxPointSizeAA);
break;
case GL_ALIASED_POINT_SIZE_RANGE:
params[0] = FLOAT_TO_BOOL(ctx->Const.MinPointSize);
params[1] = FLOAT_TO_BOOL(ctx->Const.MaxPointSize);
break;
case GL_POINT_SMOOTH:
*params = ctx->Point.SmoothFlag;
break;
case GL_POINT_SMOOTH_HINT:
*params = ENUM_TO_BOOL(ctx->Hint.PointSmooth);
break;
case GL_POINT_SIZE_MIN_EXT:
*params = FLOAT_TO_BOOL(ctx->Point.MinSize);
break;
case GL_POINT_SIZE_MAX_EXT:
*params = FLOAT_TO_BOOL(ctx->Point.MaxSize);
break;
case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
*params = FLOAT_TO_BOOL(ctx->Point.Threshold);
break;
case GL_DISTANCE_ATTENUATION_EXT:
params[0] = FLOAT_TO_BOOL(ctx->Point.Params[0]);
params[1] = FLOAT_TO_BOOL(ctx->Point.Params[1]);
params[2] = FLOAT_TO_BOOL(ctx->Point.Params[2]);
break;
case GL_POLYGON_MODE:
params[0] = ENUM_TO_BOOL(ctx->Polygon.FrontMode);
params[1] = ENUM_TO_BOOL(ctx->Polygon.BackMode);
break;
case GL_POLYGON_OFFSET_BIAS_EXT: /* GL_EXT_polygon_offset */
*params = FLOAT_TO_BOOL( ctx->Polygon.OffsetUnits );
break;
case GL_POLYGON_OFFSET_FACTOR:
*params = FLOAT_TO_BOOL( ctx->Polygon.OffsetFactor );
break;
case GL_POLYGON_OFFSET_UNITS:
*params = FLOAT_TO_BOOL( ctx->Polygon.OffsetUnits );
break;
case GL_POLYGON_SMOOTH:
*params = ctx->Polygon.SmoothFlag;
break;
case GL_POLYGON_SMOOTH_HINT:
*params = ENUM_TO_BOOL(ctx->Hint.PolygonSmooth);
break;
case GL_POLYGON_STIPPLE:
*params = ctx->Polygon.StippleFlag;
break;
case GL_PROJECTION_MATRIX:
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(ctx->ProjectionMatrixStack.Top->m[i]);
}
break;
case GL_PROJECTION_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->ProjectionMatrixStack.Depth + 1);
break;
case GL_READ_BUFFER:
*params = ENUM_TO_BOOL(ctx->Pixel.ReadBuffer);
break;
case GL_RED_BIAS:
*params = FLOAT_TO_BOOL(ctx->Pixel.RedBias);
break;
case GL_RED_BITS:
*params = INT_TO_BOOL( ctx->Visual.redBits );
break;
case GL_RED_SCALE:
*params = FLOAT_TO_BOOL(ctx->Pixel.RedScale);
break;
case GL_RENDER_MODE:
*params = ENUM_TO_BOOL(ctx->RenderMode);
break;
case GL_RESCALE_NORMAL:
*params = ctx->Transform.RescaleNormals;
break;
case GL_RGBA_MODE:
*params = ctx->Visual.rgbMode;
break;
case GL_SCISSOR_BOX:
params[0] = INT_TO_BOOL(ctx->Scissor.X);
params[1] = INT_TO_BOOL(ctx->Scissor.Y);
params[2] = INT_TO_BOOL(ctx->Scissor.Width);
params[3] = INT_TO_BOOL(ctx->Scissor.Height);
break;
case GL_SCISSOR_TEST:
*params = ctx->Scissor.Enabled;
break;
case GL_SELECTION_BUFFER_SIZE:
*params = INT_TO_BOOL(ctx->Select.BufferSize);
break;
case GL_SHADE_MODEL:
*params = ENUM_TO_BOOL(ctx->Light.ShadeModel);
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
*params = ctx->Texture.SharedPalette;
break;
case GL_STENCIL_BITS:
*params = INT_TO_BOOL(ctx->Visual.stencilBits);
break;
case GL_STENCIL_CLEAR_VALUE:
*params = INT_TO_BOOL(ctx->Stencil.Clear);
break;
case GL_STENCIL_FAIL:
*params = ENUM_TO_BOOL(ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_FUNC:
*params = ENUM_TO_BOOL(ctx->Stencil.Function[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_FAIL:
*params = ENUM_TO_BOOL(ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_PASS:
*params = ENUM_TO_BOOL(ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_REF:
*params = INT_TO_BOOL(ctx->Stencil.Ref[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_TEST:
*params = ctx->Stencil.Enabled;
break;
case GL_STENCIL_VALUE_MASK:
*params = INT_TO_BOOL(ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_WRITEMASK:
*params = INT_TO_BOOL(ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace]);
break;
case GL_STEREO:
*params = ctx->Visual.stereoMode;
break;
case GL_SUBPIXEL_BITS:
*params = INT_TO_BOOL(ctx->Const.SubPixelBits);
break;
case GL_TEXTURE_1D:
*params = _mesa_IsEnabled(GL_TEXTURE_1D);
break;
case GL_TEXTURE_2D:
*params = _mesa_IsEnabled(GL_TEXTURE_2D);
break;
case GL_TEXTURE_3D:
*params = _mesa_IsEnabled(GL_TEXTURE_3D);
break;
case GL_TEXTURE_BINDING_1D:
*params = INT_TO_BOOL(textureUnit->Current1D->Name);
break;
case GL_TEXTURE_BINDING_2D:
*params = INT_TO_BOOL(textureUnit->Current2D->Name);
break;
case GL_TEXTURE_BINDING_3D:
*params = INT_TO_BOOL(textureUnit->Current3D->Name);
break;
case GL_TEXTURE_ENV_COLOR:
{
params[0] = FLOAT_TO_BOOL(textureUnit->EnvColor[0]);
params[1] = FLOAT_TO_BOOL(textureUnit->EnvColor[1]);
params[2] = FLOAT_TO_BOOL(textureUnit->EnvColor[2]);
params[3] = FLOAT_TO_BOOL(textureUnit->EnvColor[3]);
}
break;
case GL_TEXTURE_ENV_MODE:
*params = ENUM_TO_BOOL(textureUnit->EnvMode);
break;
case GL_TEXTURE_GEN_S:
*params = (textureUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
break;
case GL_TEXTURE_GEN_T:
*params = (textureUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
break;
case GL_TEXTURE_GEN_R:
*params = (textureUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
break;
case GL_TEXTURE_GEN_Q:
*params = (textureUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
break;
case GL_TEXTURE_MATRIX:
for (i=0;i<16;i++) {
params[i] =
FLOAT_TO_BOOL(ctx->TextureMatrixStack[texUnit].Top->m[i]);
}
break;
case GL_TEXTURE_STACK_DEPTH:
*params = INT_TO_BOOL(ctx->TextureMatrixStack[texUnit].Depth + 1);
break;
case GL_UNPACK_ALIGNMENT:
*params = INT_TO_BOOL(ctx->Unpack.Alignment);
break;
case GL_UNPACK_LSB_FIRST:
*params = ctx->Unpack.LsbFirst;
break;
case GL_UNPACK_ROW_LENGTH:
*params = INT_TO_BOOL(ctx->Unpack.RowLength);
break;
case GL_UNPACK_SKIP_PIXELS:
*params = INT_TO_BOOL(ctx->Unpack.SkipPixels);
break;
case GL_UNPACK_SKIP_ROWS:
*params = INT_TO_BOOL(ctx->Unpack.SkipRows);
break;
case GL_UNPACK_SWAP_BYTES:
*params = ctx->Unpack.SwapBytes;
break;
case GL_UNPACK_SKIP_IMAGES_EXT:
*params = ctx->Unpack.SkipImages;
break;
case GL_UNPACK_IMAGE_HEIGHT_EXT:
*params = ctx->Unpack.ImageHeight;
break;
case GL_UNPACK_CLIENT_STORAGE_APPLE:
*params = ctx->Unpack.ClientStorage;
break;
case GL_VIEWPORT:
params[0] = INT_TO_BOOL(ctx->Viewport.X);
params[1] = INT_TO_BOOL(ctx->Viewport.Y);
params[2] = INT_TO_BOOL(ctx->Viewport.Width);
params[3] = INT_TO_BOOL(ctx->Viewport.Height);
break;
case GL_ZOOM_X:
*params = FLOAT_TO_BOOL(ctx->Pixel.ZoomX);
break;
case GL_ZOOM_Y:
*params = FLOAT_TO_BOOL(ctx->Pixel.ZoomY);
break;
case GL_VERTEX_ARRAY:
*params = ctx->Array.Vertex.Enabled;
break;
case GL_VERTEX_ARRAY_SIZE:
*params = INT_TO_BOOL(ctx->Array.Vertex.Size);
break;
case GL_VERTEX_ARRAY_TYPE:
*params = ENUM_TO_BOOL(ctx->Array.Vertex.Type);
break;
case GL_VERTEX_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.Vertex.Stride);
break;
case GL_VERTEX_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
case GL_NORMAL_ARRAY:
*params = ctx->Array.Normal.Enabled;
break;
case GL_NORMAL_ARRAY_TYPE:
*params = ENUM_TO_BOOL(ctx->Array.Normal.Type);
break;
case GL_NORMAL_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.Normal.Stride);
break;
case GL_NORMAL_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
case GL_COLOR_ARRAY:
*params = ctx->Array.Color.Enabled;
break;
case GL_COLOR_ARRAY_SIZE:
*params = INT_TO_BOOL(ctx->Array.Color.Size);
break;
case GL_COLOR_ARRAY_TYPE:
*params = ENUM_TO_BOOL(ctx->Array.Color.Type);
break;
case GL_COLOR_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.Color.Stride);
break;
case GL_COLOR_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
case GL_INDEX_ARRAY:
*params = ctx->Array.Index.Enabled;
break;
case GL_INDEX_ARRAY_TYPE:
*params = ENUM_TO_BOOL(ctx->Array.Index.Type);
break;
case GL_INDEX_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.Index.Stride);
break;
case GL_INDEX_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
case GL_TEXTURE_COORD_ARRAY:
*params = ctx->Array.TexCoord[texUnit].Enabled;
break;
case GL_TEXTURE_COORD_ARRAY_SIZE:
*params = INT_TO_BOOL(ctx->Array.TexCoord[texUnit].Size);
break;
case GL_TEXTURE_COORD_ARRAY_TYPE:
*params = ENUM_TO_BOOL(ctx->Array.TexCoord[texUnit].Type);
break;
case GL_TEXTURE_COORD_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.TexCoord[texUnit].Stride);
break;
case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
case GL_EDGE_FLAG_ARRAY:
*params = ctx->Array.EdgeFlag.Enabled;
break;
case GL_EDGE_FLAG_ARRAY_STRIDE:
*params = INT_TO_BOOL(ctx->Array.EdgeFlag.Stride);
break;
case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
*params = INT_TO_BOOL(0);
break;
 
/* GL_ARB_multitexture */
case GL_MAX_TEXTURE_UNITS_ARB:
CHECK_EXTENSION_B(ARB_multitexture, pname);
*params = INT_TO_BOOL(ctx->Const.MaxTextureUnits);
break;
case GL_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_B(ARB_multitexture, pname);
*params = INT_TO_BOOL(GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit);
break;
case GL_CLIENT_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_B(ARB_multitexture, pname);
*params = INT_TO_BOOL(GL_TEXTURE0_ARB + ctx->Array.ActiveTexture);
break;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
CHECK_EXTENSION_B(ARB_texture_cube_map, pname);
*params = _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);
break;
case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
CHECK_EXTENSION_B(ARB_texture_cube_map, pname);
*params = INT_TO_BOOL(textureUnit->CurrentCubeMap->Name);
break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
CHECK_EXTENSION_B(ARB_texture_cube_map, pname);
*params = INT_TO_BOOL(1 << (ctx->Const.MaxCubeTextureLevels - 1));
break;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSION_HINT_ARB:
CHECK_EXTENSION_B(ARB_texture_compression, pname);
*params = INT_TO_BOOL(ctx->Hint.TextureCompression);
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_B(ARB_texture_compression, pname);
*params = INT_TO_BOOL(_mesa_get_compressed_formats(ctx, NULL));
break;
case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_B(ARB_texture_compression, pname);
{
GLint formats[100];
GLuint i, n;
n = _mesa_get_compressed_formats(ctx, formats);
for (i = 0; i < n; i++)
params[i] = INT_TO_BOOL(formats[i]);
}
break;
 
/* GL_EXT_compiled_vertex_array */
case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
*params = ctx->Array.LockFirst ? GL_TRUE : GL_FALSE;
break;
case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT:
*params = ctx->Array.LockCount ? GL_TRUE : GL_FALSE;
break;
 
/* GL_ARB_transpose_matrix */
case GL_TRANSPOSE_COLOR_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ColorMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(tm[i]);
}
}
break;
case GL_TRANSPOSE_MODELVIEW_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(tm[i]);
}
}
break;
case GL_TRANSPOSE_PROJECTION_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(tm[i]);
}
}
break;
case GL_TRANSPOSE_TEXTURE_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(tm[i]);
}
}
break;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION_B(HP_occlusion_test, pname);
*params = ctx->Depth.OcclusionTest;
return;
case GL_OCCLUSION_TEST_RESULT_HP:
CHECK_EXTENSION_B(HP_occlusion_test, pname);
if (ctx->Depth.OcclusionTest)
*params = ctx->OcclusionResult;
else
*params = ctx->OcclusionResultSaved;
/* reset flag now */
ctx->OcclusionResult = GL_FALSE;
ctx->OcclusionResultSaved = GL_FALSE;
return;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
*params = ctx->Pixel.PixelTextureEnabled;
break;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
*params = ctx->Pixel.PixelTextureEnabled;
break;
case GL_PIXEL_TEX_GEN_MODE_SGIX:
*params = (GLboolean) pixel_texgen_mode(ctx);
break;
 
/* GL_SGI_color_matrix (also in 1.2 imaging) */
case GL_COLOR_MATRIX_SGI:
for (i=0;i<16;i++) {
params[i] = FLOAT_TO_BOOL(ctx->ColorMatrixStack.Top->m[i]);
}
break;
case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = INT_TO_BOOL(ctx->ColorMatrixStack.Depth + 1);
break;
case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = FLOAT_TO_BOOL(MAX_COLOR_STACK_DEPTH);
break;
case GL_POST_COLOR_MATRIX_RED_SCALE_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixScale[0]);
break;
case GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixScale[1]);
break;
case GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixScale[2]);
break;
case GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixScale[3]);
break;
case GL_POST_COLOR_MATRIX_RED_BIAS_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixBias[0]);
break;
case GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixBias[1]);
break;
case GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixBias[2]);
break;
case GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI:
*params = FLOAT_TO_BOOL(ctx->Pixel.PostColorMatrixBias[3]);
break;
 
/* GL_EXT_convolution (also in 1.2 imaging) */
case GL_CONVOLUTION_1D_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = ctx->Pixel.Convolution1DEnabled;
break;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = ctx->Pixel.Convolution2DEnabled;
break;
case GL_SEPARABLE_2D:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = ctx->Pixel.Separable2DEnabled;
break;
case GL_POST_CONVOLUTION_RED_SCALE_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionScale[0]);
break;
case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionScale[1]);
break;
case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionScale[2]);
break;
case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionScale[3]);
break;
case GL_POST_CONVOLUTION_RED_BIAS_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionBias[0]);
break;
case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionBias[1]);
break;
case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionBias[2]);
break;
case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:
CHECK_EXTENSION_B(EXT_convolution, pname);
*params = FLOAT_TO_BOOL(ctx->Pixel.PostConvolutionBias[2]);
break;
 
/* GL_EXT_histogram (also in 1.2 imaging) */
case GL_HISTOGRAM:
CHECK_EXTENSION_B(EXT_histogram, pname);
*params = ctx->Pixel.HistogramEnabled;
break;
case GL_MINMAX:
CHECK_EXTENSION_B(EXT_histogram, pname);
*params = ctx->Pixel.MinMaxEnabled;
break;
 
/* GL_SGI_color_table (also in 1.2 imaging */
case GL_COLOR_TABLE_SGI:
*params = ctx->Pixel.ColorTableEnabled;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
*params = ctx->Pixel.PostConvolutionColorTableEnabled;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
*params = ctx->Pixel.PostColorMatrixColorTableEnabled;
break;
 
/* GL_EXT_secondary_color */
case GL_COLOR_SUM_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
*params = ctx->Fog.ColorSumEnabled;
break;
case GL_CURRENT_SECONDARY_COLOR_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
FLUSH_CURRENT(ctx, 0);
params[0] = INT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0]);
params[1] = INT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1]);
params[2] = INT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2]);
break;
case GL_SECONDARY_COLOR_ARRAY_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
*params = ctx->Array.SecondaryColor.Enabled;
break;
case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
*params = ENUM_TO_BOOL(ctx->Array.SecondaryColor.Type);
break;
case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
*params = INT_TO_BOOL(ctx->Array.SecondaryColor.Stride);
break;
case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
CHECK_EXTENSION_B(EXT_secondary_color, pname);
*params = INT_TO_BOOL(ctx->Array.SecondaryColor.Stride);
break;
 
/* GL_EXT_fog_coord */
case GL_CURRENT_FOG_COORDINATE_EXT:
CHECK_EXTENSION_B(EXT_fog_coord, pname);
FLUSH_CURRENT(ctx, 0);
*params = FLOAT_TO_BOOL(ctx->Current.Attrib[VERT_ATTRIB_FOG][0]);
break;
case GL_FOG_COORDINATE_ARRAY_EXT:
CHECK_EXTENSION_B(EXT_fog_coord, pname);
*params = ctx->Array.FogCoord.Enabled;
break;
case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
CHECK_EXTENSION_B(EXT_fog_coord, pname);
*params = ENUM_TO_BOOL(ctx->Array.FogCoord.Type);
break;
case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_B(EXT_fog_coord, pname);
*params = INT_TO_BOOL(ctx->Array.FogCoord.Stride);
break;
 
/* GL_EXT_texture_lod_bias */
case GL_MAX_TEXTURE_LOD_BIAS_EXT:
*params = FLOAT_TO_BOOL(ctx->Const.MaxTextureLodBias);
break;
 
/* GL_EXT_texture_filter_anisotropic */
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
CHECK_EXTENSION_B(EXT_texture_filter_anisotropic, pname);
*params = FLOAT_TO_BOOL(ctx->Const.MaxTextureMaxAnisotropy);
break;
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = ctx->Multisample.Enabled;
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = ctx->Multisample.SampleAlphaToCoverage;
break;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = ctx->Multisample.SampleAlphaToOne;
break;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = ctx->Multisample.SampleCoverage;
break;
case GL_SAMPLE_COVERAGE_VALUE_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = FLOAT_TO_BOOL(ctx->Multisample.SampleCoverageValue);
break;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = ctx->Multisample.SampleCoverageInvert;
break;
case GL_SAMPLE_BUFFERS_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = 0; /* XXX fix someday */
break;
case GL_SAMPLES_ARB:
CHECK_EXTENSION_B(ARB_multisample, pname);
*params = 0; /* XXX fix someday */
break;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION_B(IBM_rasterpos_clip, pname);
*params = ctx->Transform.RasterPositionUnclipped;
break;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = ctx->Point.PointSprite;
break;
case GL_POINT_SPRITE_R_MODE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = ENUM_TO_BOOL(ctx->Point.SpriteRMode);
break;
 
/* GL_SGIS_generate_mipmap */
case GL_GENERATE_MIPMAP_HINT_SGIS:
CHECK_EXTENSION_B(SGIS_generate_mipmap, pname);
*params = ENUM_TO_BOOL(ctx->Hint.GenerateMipmap);
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = ctx->VertexProgram.Enabled;
break;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = ctx->VertexProgram.PointSizeEnabled;
break;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = ctx->VertexProgram.TwoSideEnabled;
break;
case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (MAX_PROGRAM_STACK_DEPTH > 0) ? GL_TRUE : GL_FALSE;
break;
case GL_MAX_TRACK_MATRICES_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (MAX_PROGRAM_MATRICES > 0) ? GL_TRUE : GL_FALSE;
break;
case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (ctx->CurrentStack->Depth > 0) ? GL_TRUE : GL_FALSE;
break;
case GL_CURRENT_MATRIX_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (ctx->Transform.MatrixMode != 0) ? GL_TRUE : GL_FALSE;
break;
case GL_VERTEX_PROGRAM_BINDING_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (ctx->VertexProgram.CurrentID != 0) ? GL_TRUE : GL_FALSE;
break;
case GL_PROGRAM_ERROR_POSITION_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
*params = (ctx->VertexProgram.ErrorPos != 0) ? GL_TRUE : GL_FALSE;
break;
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_VERTEX_ATTRIB_ARRAY0_NV;
*params = ctx->Array.VertexAttrib[n].Enabled;
}
break;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP1_VERTEX_ATTRIB0_4_NV;
*params = ctx->Eval.Map1Attrib[n];
}
break;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP2_VERTEX_ATTRIB0_4_NV;
*params = ctx->Eval.Map2Attrib[n];
}
break;
#endif /* FEATURE_NV_vertex_program */
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION_B(NV_texture_rectangle, pname);
*params = _mesa_IsEnabled(GL_TEXTURE_RECTANGLE_NV);
break;
case GL_TEXTURE_BINDING_RECTANGLE_NV:
CHECK_EXTENSION_B(NV_texture_rectangle, pname);
*params = INT_TO_BOOL(textureUnit->CurrentRect->Name);
break;
case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:
CHECK_EXTENSION_B(NV_texture_rectangle, pname);
*params = INT_TO_BOOL(ctx->Const.MaxTextureRectSize);
break;
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION_B(EXT_stencil_two_side, pname);
*params = ctx->Stencil.TestTwoSide;
break;
case GL_ACTIVE_STENCIL_FACE_EXT:
CHECK_EXTENSION_B(EXT_stencil_two_side, pname);
*params = ENUM_TO_BOOL(ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT);
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv(pname=0x%x)", pname);
}
}
 
 
void
_mesa_GetDoublev( GLenum pname, GLdouble *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint i;
GLuint texUnit = ctx->Texture.CurrentUnit;
const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!params)
return;
 
/* We need this in order to get correct results for
* GL_OCCLUSION_TEST_RESULT_HP. There might be other important cases.
*/
FLUSH_VERTICES(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetDoublev %s\n", _mesa_lookup_enum_by_nr(pname));
 
if (ctx->Driver.GetDoublev && (*ctx->Driver.GetDoublev)(ctx, pname, params))
return;
 
switch (pname) {
case GL_ACCUM_RED_BITS:
*params = (GLdouble) ctx->Visual.accumRedBits;
break;
case GL_ACCUM_GREEN_BITS:
*params = (GLdouble) ctx->Visual.accumGreenBits;
break;
case GL_ACCUM_BLUE_BITS:
*params = (GLdouble) ctx->Visual.accumBlueBits;
break;
case GL_ACCUM_ALPHA_BITS:
*params = (GLdouble) ctx->Visual.accumAlphaBits;
break;
case GL_ACCUM_CLEAR_VALUE:
params[0] = (GLdouble) ctx->Accum.ClearColor[0];
params[1] = (GLdouble) ctx->Accum.ClearColor[1];
params[2] = (GLdouble) ctx->Accum.ClearColor[2];
params[3] = (GLdouble) ctx->Accum.ClearColor[3];
break;
case GL_ALPHA_BIAS:
*params = (GLdouble) ctx->Pixel.AlphaBias;
break;
case GL_ALPHA_BITS:
*params = (GLdouble) ctx->Visual.alphaBits;
break;
case GL_ALPHA_SCALE:
*params = (GLdouble) ctx->Pixel.AlphaScale;
break;
case GL_ALPHA_TEST:
*params = (GLdouble) ctx->Color.AlphaEnabled;
break;
case GL_ALPHA_TEST_FUNC:
*params = ENUM_TO_DOUBLE(ctx->Color.AlphaFunc);
break;
case GL_ALPHA_TEST_REF:
*params = (GLdouble) ctx->Color.AlphaRef;
break;
case GL_ATTRIB_STACK_DEPTH:
*params = (GLdouble ) (ctx->AttribStackDepth);
break;
case GL_AUTO_NORMAL:
*params = (GLdouble) ctx->Eval.AutoNormal;
break;
case GL_AUX_BUFFERS:
*params = (GLdouble) ctx->Const.NumAuxBuffers;
break;
case GL_BLEND:
*params = (GLdouble) ctx->Color.BlendEnabled;
break;
case GL_BLEND_DST:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_SRC_RGB_EXT:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_DST_RGB_EXT:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC_ALPHA_EXT:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendSrcA);
break;
case GL_BLEND_DST_ALPHA_EXT:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendDstA);
break;
case GL_BLEND_EQUATION_EXT:
*params = ENUM_TO_DOUBLE(ctx->Color.BlendEquation);
break;
case GL_BLEND_COLOR_EXT:
params[0] = (GLdouble) ctx->Color.BlendColor[0];
params[1] = (GLdouble) ctx->Color.BlendColor[1];
params[2] = (GLdouble) ctx->Color.BlendColor[2];
params[3] = (GLdouble) ctx->Color.BlendColor[3];
break;
case GL_BLUE_BIAS:
*params = (GLdouble) ctx->Pixel.BlueBias;
break;
case GL_BLUE_BITS:
*params = (GLdouble) ctx->Visual.blueBits;
break;
case GL_BLUE_SCALE:
*params = (GLdouble) ctx->Pixel.BlueScale;
break;
case GL_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLdouble) (ctx->ClientAttribStackDepth);
break;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
if (ctx->Transform.ClipPlanesEnabled & (1 << (pname - GL_CLIP_PLANE0)))
*params = 1.0;
else
*params = 0.0;
break;
case GL_COLOR_CLEAR_VALUE:
params[0] = (GLdouble) ctx->Color.ClearColor[0];
params[1] = (GLdouble) ctx->Color.ClearColor[1];
params[2] = (GLdouble) ctx->Color.ClearColor[2];
params[3] = (GLdouble) ctx->Color.ClearColor[3];
break;
case GL_COLOR_MATERIAL:
*params = (GLdouble) ctx->Light.ColorMaterialEnabled;
break;
case GL_COLOR_MATERIAL_FACE:
*params = ENUM_TO_DOUBLE(ctx->Light.ColorMaterialFace);
break;
case GL_COLOR_MATERIAL_PARAMETER:
*params = ENUM_TO_DOUBLE(ctx->Light.ColorMaterialMode);
break;
case GL_COLOR_WRITEMASK:
params[0] = ctx->Color.ColorMask[RCOMP] ? 1.0 : 0.0;
params[1] = ctx->Color.ColorMask[GCOMP] ? 1.0 : 0.0;
params[2] = ctx->Color.ColorMask[BCOMP] ? 1.0 : 0.0;
params[3] = ctx->Color.ColorMask[ACOMP] ? 1.0 : 0.0;
break;
case GL_CULL_FACE:
*params = (GLdouble) ctx->Polygon.CullFlag;
break;
case GL_CULL_FACE_MODE:
*params = ENUM_TO_DOUBLE(ctx->Polygon.CullFaceMode);
break;
case GL_CURRENT_COLOR:
FLUSH_CURRENT(ctx, 0);
params[0] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0];
params[1] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1];
params[2] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2];
params[3] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3];
break;
case GL_CURRENT_INDEX:
FLUSH_CURRENT(ctx, 0);
*params = (GLdouble) ctx->Current.Index;
break;
case GL_CURRENT_NORMAL:
FLUSH_CURRENT(ctx, 0);
params[0] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_NORMAL][0];
params[1] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_NORMAL][1];
params[2] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_NORMAL][2];
break;
case GL_CURRENT_RASTER_COLOR:
params[0] = (GLdouble) ctx->Current.RasterColor[0];
params[1] = (GLdouble) ctx->Current.RasterColor[1];
params[2] = (GLdouble) ctx->Current.RasterColor[2];
params[3] = (GLdouble) ctx->Current.RasterColor[3];
break;
case GL_CURRENT_RASTER_DISTANCE:
params[0] = (GLdouble) ctx->Current.RasterDistance;
break;
case GL_CURRENT_RASTER_INDEX:
*params = (GLdouble) ctx->Current.RasterIndex;
break;
case GL_CURRENT_RASTER_POSITION:
params[0] = (GLdouble) ctx->Current.RasterPos[0];
params[1] = (GLdouble) ctx->Current.RasterPos[1];
params[2] = (GLdouble) ctx->Current.RasterPos[2];
params[3] = (GLdouble) ctx->Current.RasterPos[3];
break;
case GL_CURRENT_RASTER_TEXTURE_COORDS:
params[0] = (GLdouble) ctx->Current.RasterTexCoords[texUnit][0];
params[1] = (GLdouble) ctx->Current.RasterTexCoords[texUnit][1];
params[2] = (GLdouble) ctx->Current.RasterTexCoords[texUnit][2];
params[3] = (GLdouble) ctx->Current.RasterTexCoords[texUnit][3];
break;
case GL_CURRENT_RASTER_POSITION_VALID:
*params = (GLdouble) ctx->Current.RasterPosValid;
break;
case GL_CURRENT_TEXTURE_COORDS:
FLUSH_CURRENT(ctx, 0);
params[0] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][0];
params[1] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][1];
params[2] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][2];
params[3] = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][3];
break;
case GL_DEPTH_BIAS:
*params = (GLdouble) ctx->Pixel.DepthBias;
break;
case GL_DEPTH_BITS:
*params = (GLdouble) ctx->Visual.depthBits;
break;
case GL_DEPTH_CLEAR_VALUE:
*params = (GLdouble) ctx->Depth.Clear;
break;
case GL_DEPTH_FUNC:
*params = ENUM_TO_DOUBLE(ctx->Depth.Func);
break;
case GL_DEPTH_RANGE:
params[0] = (GLdouble) ctx->Viewport.Near;
params[1] = (GLdouble) ctx->Viewport.Far;
break;
case GL_DEPTH_SCALE:
*params = (GLdouble) ctx->Pixel.DepthScale;
break;
case GL_DEPTH_TEST:
*params = (GLdouble) ctx->Depth.Test;
break;
case GL_DEPTH_WRITEMASK:
*params = (GLdouble) ctx->Depth.Mask;
break;
case GL_DITHER:
*params = (GLdouble) ctx->Color.DitherFlag;
break;
case GL_DOUBLEBUFFER:
*params = (GLdouble) ctx->Visual.doubleBufferMode;
break;
case GL_DRAW_BUFFER:
*params = ENUM_TO_DOUBLE(ctx->Color.DrawBuffer);
break;
case GL_EDGE_FLAG:
FLUSH_CURRENT(ctx, 0);
*params = (GLdouble) ctx->Current.EdgeFlag;
break;
case GL_FEEDBACK_BUFFER_SIZE:
*params = (GLdouble) ctx->Feedback.BufferSize;
break;
case GL_FEEDBACK_BUFFER_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Feedback.Type);
break;
case GL_FOG:
*params = (GLdouble) ctx->Fog.Enabled;
break;
case GL_FOG_COLOR:
params[0] = (GLdouble) ctx->Fog.Color[0];
params[1] = (GLdouble) ctx->Fog.Color[1];
params[2] = (GLdouble) ctx->Fog.Color[2];
params[3] = (GLdouble) ctx->Fog.Color[3];
break;
case GL_FOG_DENSITY:
*params = (GLdouble) ctx->Fog.Density;
break;
case GL_FOG_END:
*params = (GLdouble) ctx->Fog.End;
break;
case GL_FOG_HINT:
*params = ENUM_TO_DOUBLE(ctx->Hint.Fog);
break;
case GL_FOG_INDEX:
*params = (GLdouble) ctx->Fog.Index;
break;
case GL_FOG_MODE:
*params = ENUM_TO_DOUBLE(ctx->Fog.Mode);
break;
case GL_FOG_START:
*params = (GLdouble) ctx->Fog.Start;
break;
case GL_FRONT_FACE:
*params = ENUM_TO_DOUBLE(ctx->Polygon.FrontFace);
break;
case GL_GREEN_BIAS:
*params = (GLdouble) ctx->Pixel.GreenBias;
break;
case GL_GREEN_BITS:
*params = (GLdouble) ctx->Visual.greenBits;
break;
case GL_GREEN_SCALE:
*params = (GLdouble) ctx->Pixel.GreenScale;
break;
case GL_INDEX_BITS:
*params = (GLdouble) ctx->Visual.indexBits;
break;
case GL_INDEX_CLEAR_VALUE:
*params = (GLdouble) ctx->Color.ClearIndex;
break;
case GL_INDEX_MODE:
*params = ctx->Visual.rgbMode ? 0.0 : 1.0;
break;
case GL_INDEX_OFFSET:
*params = (GLdouble) ctx->Pixel.IndexOffset;
break;
case GL_INDEX_SHIFT:
*params = (GLdouble) ctx->Pixel.IndexShift;
break;
case GL_INDEX_WRITEMASK:
*params = (GLdouble) ctx->Color.IndexMask;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
*params = (GLdouble) ctx->Light.Light[pname-GL_LIGHT0].Enabled;
break;
case GL_LIGHTING:
*params = (GLdouble) ctx->Light.Enabled;
break;
case GL_LIGHT_MODEL_AMBIENT:
params[0] = (GLdouble) ctx->Light.Model.Ambient[0];
params[1] = (GLdouble) ctx->Light.Model.Ambient[1];
params[2] = (GLdouble) ctx->Light.Model.Ambient[2];
params[3] = (GLdouble) ctx->Light.Model.Ambient[3];
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
params[0] = (GLdouble) ctx->Light.Model.ColorControl;
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
*params = (GLdouble) ctx->Light.Model.LocalViewer;
break;
case GL_LIGHT_MODEL_TWO_SIDE:
*params = (GLdouble) ctx->Light.Model.TwoSide;
break;
case GL_LINE_SMOOTH:
*params = (GLdouble) ctx->Line.SmoothFlag;
break;
case GL_LINE_SMOOTH_HINT:
*params = ENUM_TO_DOUBLE(ctx->Hint.LineSmooth);
break;
case GL_LINE_STIPPLE:
*params = (GLdouble) ctx->Line.StippleFlag;
break;
case GL_LINE_STIPPLE_PATTERN:
*params = (GLdouble) ctx->Line.StipplePattern;
break;
case GL_LINE_STIPPLE_REPEAT:
*params = (GLdouble) ctx->Line.StippleFactor;
break;
case GL_LINE_WIDTH:
*params = (GLdouble) ctx->Line.Width;
break;
case GL_LINE_WIDTH_GRANULARITY:
*params = (GLdouble) ctx->Const.LineWidthGranularity;
break;
case GL_LINE_WIDTH_RANGE:
params[0] = (GLdouble) ctx->Const.MinLineWidthAA;
params[1] = (GLdouble) ctx->Const.MaxLineWidthAA;
break;
case GL_ALIASED_LINE_WIDTH_RANGE:
params[0] = (GLdouble) ctx->Const.MinLineWidth;
params[1] = (GLdouble) ctx->Const.MaxLineWidth;
break;
case GL_LIST_BASE:
*params = (GLdouble) ctx->List.ListBase;
break;
case GL_LIST_INDEX:
*params = (GLdouble) ctx->CurrentListNum;
break;
case GL_LIST_MODE:
*params = ctx->ExecuteFlag ? ENUM_TO_DOUBLE(GL_COMPILE_AND_EXECUTE)
: ENUM_TO_DOUBLE(GL_COMPILE);
break;
case GL_INDEX_LOGIC_OP:
*params = (GLdouble) ctx->Color.IndexLogicOpEnabled;
break;
case GL_COLOR_LOGIC_OP:
*params = (GLdouble) ctx->Color.ColorLogicOpEnabled;
break;
case GL_LOGIC_OP_MODE:
*params = ENUM_TO_DOUBLE(ctx->Color.LogicOp);
break;
case GL_MAP1_COLOR_4:
*params = (GLdouble) ctx->Eval.Map1Color4;
break;
case GL_MAP1_GRID_DOMAIN:
params[0] = (GLdouble) ctx->Eval.MapGrid1u1;
params[1] = (GLdouble) ctx->Eval.MapGrid1u2;
break;
case GL_MAP1_GRID_SEGMENTS:
*params = (GLdouble) ctx->Eval.MapGrid1un;
break;
case GL_MAP1_INDEX:
*params = (GLdouble) ctx->Eval.Map1Index;
break;
case GL_MAP1_NORMAL:
*params = (GLdouble) ctx->Eval.Map1Normal;
break;
case GL_MAP1_TEXTURE_COORD_1:
*params = (GLdouble) ctx->Eval.Map1TextureCoord1;
break;
case GL_MAP1_TEXTURE_COORD_2:
*params = (GLdouble) ctx->Eval.Map1TextureCoord2;
break;
case GL_MAP1_TEXTURE_COORD_3:
*params = (GLdouble) ctx->Eval.Map1TextureCoord3;
break;
case GL_MAP1_TEXTURE_COORD_4:
*params = (GLdouble) ctx->Eval.Map1TextureCoord4;
break;
case GL_MAP1_VERTEX_3:
*params = (GLdouble) ctx->Eval.Map1Vertex3;
break;
case GL_MAP1_VERTEX_4:
*params = (GLdouble) ctx->Eval.Map1Vertex4;
break;
case GL_MAP2_COLOR_4:
*params = (GLdouble) ctx->Eval.Map2Color4;
break;
case GL_MAP2_GRID_DOMAIN:
params[0] = (GLdouble) ctx->Eval.MapGrid2u1;
params[1] = (GLdouble) ctx->Eval.MapGrid2u2;
params[2] = (GLdouble) ctx->Eval.MapGrid2v1;
params[3] = (GLdouble) ctx->Eval.MapGrid2v2;
break;
case GL_MAP2_GRID_SEGMENTS:
params[0] = (GLdouble) ctx->Eval.MapGrid2un;
params[1] = (GLdouble) ctx->Eval.MapGrid2vn;
break;
case GL_MAP2_INDEX:
*params = (GLdouble) ctx->Eval.Map2Index;
break;
case GL_MAP2_NORMAL:
*params = (GLdouble) ctx->Eval.Map2Normal;
break;
case GL_MAP2_TEXTURE_COORD_1:
*params = (GLdouble) ctx->Eval.Map2TextureCoord1;
break;
case GL_MAP2_TEXTURE_COORD_2:
*params = (GLdouble) ctx->Eval.Map2TextureCoord2;
break;
case GL_MAP2_TEXTURE_COORD_3:
*params = (GLdouble) ctx->Eval.Map2TextureCoord3;
break;
case GL_MAP2_TEXTURE_COORD_4:
*params = (GLdouble) ctx->Eval.Map2TextureCoord4;
break;
case GL_MAP2_VERTEX_3:
*params = (GLdouble) ctx->Eval.Map2Vertex3;
break;
case GL_MAP2_VERTEX_4:
*params = (GLdouble) ctx->Eval.Map2Vertex4;
break;
case GL_MAP_COLOR:
*params = (GLdouble) ctx->Pixel.MapColorFlag;
break;
case GL_MAP_STENCIL:
*params = (GLdouble) ctx->Pixel.MapStencilFlag;
break;
case GL_MATRIX_MODE:
*params = ENUM_TO_DOUBLE(ctx->Transform.MatrixMode);
break;
case GL_MAX_ATTRIB_STACK_DEPTH:
*params = (GLdouble) MAX_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLdouble) MAX_CLIENT_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIP_PLANES:
*params = (GLdouble) ctx->Const.MaxClipPlanes;
break;
case GL_MAX_ELEMENTS_VERTICES: /* GL_VERSION_1_2 */
*params = (GLdouble) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_ELEMENTS_INDICES: /* GL_VERSION_1_2 */
*params = (GLdouble) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_EVAL_ORDER:
*params = (GLdouble) MAX_EVAL_ORDER;
break;
case GL_MAX_LIGHTS:
*params = (GLdouble) ctx->Const.MaxLights;
break;
case GL_MAX_LIST_NESTING:
*params = (GLdouble) MAX_LIST_NESTING;
break;
case GL_MAX_MODELVIEW_STACK_DEPTH:
*params = (GLdouble) MAX_MODELVIEW_STACK_DEPTH;
break;
case GL_MAX_NAME_STACK_DEPTH:
*params = (GLdouble) MAX_NAME_STACK_DEPTH;
break;
case GL_MAX_PIXEL_MAP_TABLE:
*params = (GLdouble) MAX_PIXEL_MAP_TABLE;
break;
case GL_MAX_PROJECTION_STACK_DEPTH:
*params = (GLdouble) MAX_PROJECTION_STACK_DEPTH;
break;
case GL_MAX_TEXTURE_SIZE:
*params = (GLdouble) (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE:
*params = (GLdouble) (1 << (ctx->Const.Max3DTextureLevels - 1));
break;
case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLdouble) MAX_TEXTURE_STACK_DEPTH;
break;
case GL_MAX_VIEWPORT_DIMS:
params[0] = (GLdouble) MAX_WIDTH;
params[1] = (GLdouble) MAX_HEIGHT;
break;
case GL_MODELVIEW_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLdouble) ctx->ModelviewMatrixStack.Top->m[i];
}
break;
case GL_MODELVIEW_STACK_DEPTH:
*params = (GLdouble) (ctx->ModelviewMatrixStack.Depth + 1);
break;
case GL_NAME_STACK_DEPTH:
*params = (GLdouble) ctx->Select.NameStackDepth;
break;
case GL_NORMALIZE:
*params = (GLdouble) ctx->Transform.Normalize;
break;
case GL_PACK_ALIGNMENT:
*params = (GLdouble) ctx->Pack.Alignment;
break;
case GL_PACK_LSB_FIRST:
*params = (GLdouble) ctx->Pack.LsbFirst;
break;
case GL_PACK_ROW_LENGTH:
*params = (GLdouble) ctx->Pack.RowLength;
break;
case GL_PACK_SKIP_PIXELS:
*params = (GLdouble) ctx->Pack.SkipPixels;
break;
case GL_PACK_SKIP_ROWS:
*params = (GLdouble) ctx->Pack.SkipRows;
break;
case GL_PACK_SWAP_BYTES:
*params = (GLdouble) ctx->Pack.SwapBytes;
break;
case GL_PACK_SKIP_IMAGES_EXT:
*params = (GLdouble) ctx->Pack.SkipImages;
break;
case GL_PACK_IMAGE_HEIGHT_EXT:
*params = (GLdouble) ctx->Pack.ImageHeight;
break;
case GL_PACK_INVERT_MESA:
*params = (GLdouble) ctx->Pack.Invert;
break;
case GL_PERSPECTIVE_CORRECTION_HINT:
*params = ENUM_TO_DOUBLE(ctx->Hint.PerspectiveCorrection);
break;
case GL_PIXEL_MAP_A_TO_A_SIZE:
*params = (GLdouble) ctx->Pixel.MapAtoAsize;
break;
case GL_PIXEL_MAP_B_TO_B_SIZE:
*params = (GLdouble) ctx->Pixel.MapBtoBsize;
break;
case GL_PIXEL_MAP_G_TO_G_SIZE:
*params = (GLdouble) ctx->Pixel.MapGtoGsize;
break;
case GL_PIXEL_MAP_I_TO_A_SIZE:
*params = (GLdouble) ctx->Pixel.MapItoAsize;
break;
case GL_PIXEL_MAP_I_TO_B_SIZE:
*params = (GLdouble) ctx->Pixel.MapItoBsize;
break;
case GL_PIXEL_MAP_I_TO_G_SIZE:
*params = (GLdouble) ctx->Pixel.MapItoGsize;
break;
case GL_PIXEL_MAP_I_TO_I_SIZE:
*params = (GLdouble) ctx->Pixel.MapItoIsize;
break;
case GL_PIXEL_MAP_I_TO_R_SIZE:
*params = (GLdouble) ctx->Pixel.MapItoRsize;
break;
case GL_PIXEL_MAP_R_TO_R_SIZE:
*params = (GLdouble) ctx->Pixel.MapRtoRsize;
break;
case GL_PIXEL_MAP_S_TO_S_SIZE:
*params = (GLdouble) ctx->Pixel.MapStoSsize;
break;
case GL_POINT_SIZE:
*params = (GLdouble) ctx->Point.Size;
break;
case GL_POINT_SIZE_GRANULARITY:
*params = (GLdouble) ctx->Const.PointSizeGranularity;
break;
case GL_POINT_SIZE_RANGE:
params[0] = (GLdouble) ctx->Const.MinPointSizeAA;
params[1] = (GLdouble) ctx->Const.MaxPointSizeAA;
break;
case GL_ALIASED_POINT_SIZE_RANGE:
params[0] = (GLdouble) ctx->Const.MinPointSize;
params[1] = (GLdouble) ctx->Const.MaxPointSize;
break;
case GL_POINT_SMOOTH:
*params = (GLdouble) ctx->Point.SmoothFlag;
break;
case GL_POINT_SMOOTH_HINT:
*params = ENUM_TO_DOUBLE(ctx->Hint.PointSmooth);
break;
case GL_POINT_SIZE_MIN_EXT:
*params = (GLdouble) (ctx->Point.MinSize);
break;
case GL_POINT_SIZE_MAX_EXT:
*params = (GLdouble) (ctx->Point.MaxSize);
break;
case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
*params = (GLdouble) (ctx->Point.Threshold);
break;
case GL_DISTANCE_ATTENUATION_EXT:
params[0] = (GLdouble) (ctx->Point.Params[0]);
params[1] = (GLdouble) (ctx->Point.Params[1]);
params[2] = (GLdouble) (ctx->Point.Params[2]);
break;
case GL_POLYGON_MODE:
params[0] = ENUM_TO_DOUBLE(ctx->Polygon.FrontMode);
params[1] = ENUM_TO_DOUBLE(ctx->Polygon.BackMode);
break;
case GL_POLYGON_OFFSET_BIAS_EXT: /* GL_EXT_polygon_offset */
*params = (GLdouble) ctx->Polygon.OffsetUnits;
break;
case GL_POLYGON_OFFSET_FACTOR:
*params = (GLdouble) ctx->Polygon.OffsetFactor;
break;
case GL_POLYGON_OFFSET_UNITS:
*params = (GLdouble) ctx->Polygon.OffsetUnits;
break;
case GL_POLYGON_SMOOTH:
*params = (GLdouble) ctx->Polygon.SmoothFlag;
break;
case GL_POLYGON_SMOOTH_HINT:
*params = ENUM_TO_DOUBLE(ctx->Hint.PolygonSmooth);
break;
case GL_POLYGON_STIPPLE:
*params = (GLdouble) ctx->Polygon.StippleFlag;
break;
case GL_PROJECTION_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLdouble) ctx->ProjectionMatrixStack.Top->m[i];
}
break;
case GL_PROJECTION_STACK_DEPTH:
*params = (GLdouble) (ctx->ProjectionMatrixStack.Depth + 1);
break;
case GL_READ_BUFFER:
*params = ENUM_TO_DOUBLE(ctx->Pixel.ReadBuffer);
break;
case GL_RED_BIAS:
*params = (GLdouble) ctx->Pixel.RedBias;
break;
case GL_RED_BITS:
*params = (GLdouble) ctx->Visual.redBits;
break;
case GL_RED_SCALE:
*params = (GLdouble) ctx->Pixel.RedScale;
break;
case GL_RENDER_MODE:
*params = ENUM_TO_DOUBLE(ctx->RenderMode);
break;
case GL_RESCALE_NORMAL:
*params = (GLdouble) ctx->Transform.RescaleNormals;
break;
case GL_RGBA_MODE:
*params = (GLdouble) ctx->Visual.rgbMode;
break;
case GL_SCISSOR_BOX:
params[0] = (GLdouble) ctx->Scissor.X;
params[1] = (GLdouble) ctx->Scissor.Y;
params[2] = (GLdouble) ctx->Scissor.Width;
params[3] = (GLdouble) ctx->Scissor.Height;
break;
case GL_SCISSOR_TEST:
*params = (GLdouble) ctx->Scissor.Enabled;
break;
case GL_SELECTION_BUFFER_SIZE:
*params = (GLdouble) ctx->Select.BufferSize;
break;
case GL_SHADE_MODEL:
*params = ENUM_TO_DOUBLE(ctx->Light.ShadeModel);
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
*params = (GLdouble) ctx->Texture.SharedPalette;
break;
case GL_STENCIL_BITS:
*params = (GLdouble) ctx->Visual.stencilBits;
break;
case GL_STENCIL_CLEAR_VALUE:
*params = (GLdouble) ctx->Stencil.Clear;
break;
case GL_STENCIL_FAIL:
*params = ENUM_TO_DOUBLE(ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_FUNC:
*params = ENUM_TO_DOUBLE(ctx->Stencil.Function[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_FAIL:
*params = ENUM_TO_DOUBLE(ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_PASS:
*params = ENUM_TO_DOUBLE(ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_REF:
*params = (GLdouble) ctx->Stencil.Ref[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_TEST:
*params = (GLdouble) ctx->Stencil.Enabled;
break;
case GL_STENCIL_VALUE_MASK:
*params = (GLdouble) ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_WRITEMASK:
*params = (GLdouble) ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
break;
case GL_STEREO:
*params = (GLdouble) ctx->Visual.stereoMode;
break;
case GL_SUBPIXEL_BITS:
*params = (GLdouble) ctx->Const.SubPixelBits;
break;
case GL_TEXTURE_1D:
*params = _mesa_IsEnabled(GL_TEXTURE_1D) ? 1.0 : 0.0;
break;
case GL_TEXTURE_2D:
*params = _mesa_IsEnabled(GL_TEXTURE_2D) ? 1.0 : 0.0;
break;
case GL_TEXTURE_3D:
*params = _mesa_IsEnabled(GL_TEXTURE_3D) ? 1.0 : 0.0;
break;
case GL_TEXTURE_BINDING_1D:
*params = (GLdouble) textureUnit->Current1D->Name;
break;
case GL_TEXTURE_BINDING_2D:
*params = (GLdouble) textureUnit->Current2D->Name;
break;
case GL_TEXTURE_BINDING_3D:
*params = (GLdouble) textureUnit->Current3D->Name;
break;
case GL_TEXTURE_ENV_COLOR:
params[0] = (GLdouble) textureUnit->EnvColor[0];
params[1] = (GLdouble) textureUnit->EnvColor[1];
params[2] = (GLdouble) textureUnit->EnvColor[2];
params[3] = (GLdouble) textureUnit->EnvColor[3];
break;
case GL_TEXTURE_ENV_MODE:
*params = ENUM_TO_DOUBLE(textureUnit->EnvMode);
break;
case GL_TEXTURE_GEN_S:
*params = (textureUnit->TexGenEnabled & S_BIT) ? 1.0 : 0.0;
break;
case GL_TEXTURE_GEN_T:
*params = (textureUnit->TexGenEnabled & T_BIT) ? 1.0 : 0.0;
break;
case GL_TEXTURE_GEN_R:
*params = (textureUnit->TexGenEnabled & R_BIT) ? 1.0 : 0.0;
break;
case GL_TEXTURE_GEN_Q:
*params = (textureUnit->TexGenEnabled & Q_BIT) ? 1.0 : 0.0;
break;
case GL_TEXTURE_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLdouble) ctx->TextureMatrixStack[texUnit].Top->m[i];
}
break;
case GL_TEXTURE_STACK_DEPTH:
*params = (GLdouble) (ctx->TextureMatrixStack[texUnit].Depth + 1);
break;
case GL_UNPACK_ALIGNMENT:
*params = (GLdouble) ctx->Unpack.Alignment;
break;
case GL_UNPACK_LSB_FIRST:
*params = (GLdouble) ctx->Unpack.LsbFirst;
break;
case GL_UNPACK_ROW_LENGTH:
*params = (GLdouble) ctx->Unpack.RowLength;
break;
case GL_UNPACK_SKIP_PIXELS:
*params = (GLdouble) ctx->Unpack.SkipPixels;
break;
case GL_UNPACK_SKIP_ROWS:
*params = (GLdouble) ctx->Unpack.SkipRows;
break;
case GL_UNPACK_SWAP_BYTES:
*params = (GLdouble) ctx->Unpack.SwapBytes;
break;
case GL_UNPACK_SKIP_IMAGES_EXT:
*params = (GLdouble) ctx->Unpack.SkipImages;
break;
case GL_UNPACK_IMAGE_HEIGHT_EXT:
*params = (GLdouble) ctx->Unpack.ImageHeight;
break;
case GL_UNPACK_CLIENT_STORAGE_APPLE:
*params = (GLdouble) ctx->Unpack.ClientStorage;
break;
case GL_VIEWPORT:
params[0] = (GLdouble) ctx->Viewport.X;
params[1] = (GLdouble) ctx->Viewport.Y;
params[2] = (GLdouble) ctx->Viewport.Width;
params[3] = (GLdouble) ctx->Viewport.Height;
break;
case GL_ZOOM_X:
*params = (GLdouble) ctx->Pixel.ZoomX;
break;
case GL_ZOOM_Y:
*params = (GLdouble) ctx->Pixel.ZoomY;
break;
case GL_VERTEX_ARRAY:
*params = (GLdouble) ctx->Array.Vertex.Enabled;
break;
case GL_VERTEX_ARRAY_SIZE:
*params = (GLdouble) ctx->Array.Vertex.Size;
break;
case GL_VERTEX_ARRAY_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Array.Vertex.Type);
break;
case GL_VERTEX_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.Vertex.Stride;
break;
case GL_VERTEX_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_NORMAL_ARRAY:
*params = (GLdouble) ctx->Array.Normal.Enabled;
break;
case GL_NORMAL_ARRAY_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Array.Normal.Type);
break;
case GL_NORMAL_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.Normal.Stride;
break;
case GL_NORMAL_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_COLOR_ARRAY:
*params = (GLdouble) ctx->Array.Color.Enabled;
break;
case GL_COLOR_ARRAY_SIZE:
*params = (GLdouble) ctx->Array.Color.Size;
break;
case GL_COLOR_ARRAY_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Array.Color.Type);
break;
case GL_COLOR_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.Color.Stride;
break;
case GL_COLOR_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_INDEX_ARRAY:
*params = (GLdouble) ctx->Array.Index.Enabled;
break;
case GL_INDEX_ARRAY_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Array.Index.Type);
break;
case GL_INDEX_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.Index.Stride;
break;
case GL_INDEX_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_TEXTURE_COORD_ARRAY:
*params = (GLdouble) ctx->Array.TexCoord[texUnit].Enabled;
break;
case GL_TEXTURE_COORD_ARRAY_SIZE:
*params = (GLdouble) ctx->Array.TexCoord[texUnit].Size;
break;
case GL_TEXTURE_COORD_ARRAY_TYPE:
*params = ENUM_TO_DOUBLE(ctx->Array.TexCoord[texUnit].Type);
break;
case GL_TEXTURE_COORD_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.TexCoord[texUnit].Stride;
break;
case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_EDGE_FLAG_ARRAY:
*params = (GLdouble) ctx->Array.EdgeFlag.Enabled;
break;
case GL_EDGE_FLAG_ARRAY_STRIDE:
*params = (GLdouble) ctx->Array.EdgeFlag.Stride;
break;
case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
*params = 0.0;
break;
 
/* GL_ARB_multitexture */
case GL_MAX_TEXTURE_UNITS_ARB:
CHECK_EXTENSION_D(ARB_multitexture, pname);
*params = (GLdouble) ctx->Const.MaxTextureUnits;
break;
case GL_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_D(ARB_multitexture, pname);
*params = (GLdouble) (GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit);
break;
case GL_CLIENT_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_D(ARB_multitexture, pname);
*params = (GLdouble) (GL_TEXTURE0_ARB + ctx->Array.ActiveTexture);
break;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
CHECK_EXTENSION_D(ARB_texture_cube_map, pname);
*params = (GLdouble) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);
break;
case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
CHECK_EXTENSION_D(ARB_texture_cube_map, pname);
*params = (GLdouble) textureUnit->CurrentCubeMap->Name;
break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
CHECK_EXTENSION_D(ARB_texture_cube_map, pname);
*params = (GLdouble) (1 << (ctx->Const.MaxCubeTextureLevels - 1));
break;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSION_HINT_ARB:
CHECK_EXTENSION_D(ARB_texture_compression, pname);
*params = (GLdouble) ctx->Hint.TextureCompression;
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_D(ARB_texture_compression, pname);
*params = (GLdouble) _mesa_get_compressed_formats(ctx, NULL);
break;
case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_D(ARB_texture_compression, pname);
{
GLint formats[100];
GLuint i, n;
n = _mesa_get_compressed_formats(ctx, formats);
for (i = 0; i < n; i++)
params[i] = (GLdouble) formats[i];
}
break;
 
/* GL_EXT_compiled_vertex_array */
case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
*params = (GLdouble) ctx->Array.LockFirst;
break;
case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT:
*params = (GLdouble) ctx->Array.LockCount;
break;
 
/* GL_ARB_transpose_matrix */
case GL_TRANSPOSE_COLOR_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ColorMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLdouble) tm[i];
}
}
break;
case GL_TRANSPOSE_MODELVIEW_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLdouble) tm[i];
}
}
break;
case GL_TRANSPOSE_PROJECTION_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLdouble) tm[i];
}
}
break;
case GL_TRANSPOSE_TEXTURE_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
for (i=0;i<16;i++) {
params[i] = (GLdouble) tm[i];
}
}
break;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION_D(HP_occlusion_test, pname);
*params = (GLdouble) ctx->Depth.OcclusionTest;
break;
case GL_OCCLUSION_TEST_RESULT_HP:
CHECK_EXTENSION_D(HP_occlusion_test, pname);
if (ctx->Depth.OcclusionTest)
*params = (GLdouble) ctx->OcclusionResult;
else
*params = (GLdouble) ctx->OcclusionResultSaved;
/* reset flag now */
ctx->OcclusionResult = GL_FALSE;
ctx->OcclusionResultSaved = GL_FALSE;
break;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
*params = (GLdouble) ctx->Pixel.PixelTextureEnabled;
break;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
*params = (GLdouble) ctx->Pixel.PixelTextureEnabled;
break;
case GL_PIXEL_TEX_GEN_MODE_SGIX:
*params = (GLdouble) pixel_texgen_mode(ctx);
break;
 
/* GL_SGI_color_matrix (also in 1.2 imaging) */
case GL_COLOR_MATRIX_SGI:
for (i=0;i<16;i++) {
params[i] = (GLdouble) ctx->ColorMatrixStack.Top->m[i];
}
break;
case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = (GLdouble) (ctx->ColorMatrixStack.Depth + 1);
break;
case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = (GLdouble) MAX_COLOR_STACK_DEPTH;
break;
case GL_POST_COLOR_MATRIX_RED_SCALE_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixScale[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixScale[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixScale[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixScale[3];
break;
case GL_POST_COLOR_MATRIX_RED_BIAS_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixBias[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixBias[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixBias[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixBias[3];
break;
 
/* GL_EXT_convolution (also in 1.2 imaging) */
case GL_CONVOLUTION_1D_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.Convolution1DEnabled;
break;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.Convolution2DEnabled;
break;
case GL_SEPARABLE_2D:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.Separable2DEnabled;
break;
case GL_POST_CONVOLUTION_RED_SCALE_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionScale[0];
break;
case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionScale[1];
break;
case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionScale[2];
break;
case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionScale[3];
break;
case GL_POST_CONVOLUTION_RED_BIAS_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionBias[0];
break;
case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionBias[1];
break;
case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionBias[2];
break;
case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:
CHECK_EXTENSION_D(EXT_convolution, pname);
*params = (GLdouble) ctx->Pixel.PostConvolutionBias[2];
break;
 
/* GL_EXT_histogram (also in 1.2 imaging) */
case GL_HISTOGRAM:
CHECK_EXTENSION_D(EXT_histogram, pname);
*params = (GLdouble) ctx->Pixel.HistogramEnabled;
break;
case GL_MINMAX:
CHECK_EXTENSION_D(EXT_histogram, pname);
*params = (GLdouble) ctx->Pixel.MinMaxEnabled;
break;
 
/* GL_SGI_color_table (also in 1.2 imaging */
case GL_COLOR_TABLE_SGI:
*params = (GLdouble) ctx->Pixel.ColorTableEnabled;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
*params = (GLdouble) ctx->Pixel.PostConvolutionColorTableEnabled;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
*params = (GLdouble) ctx->Pixel.PostColorMatrixColorTableEnabled;
break;
 
/* GL_EXT_secondary_color */
case GL_COLOR_SUM_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
*params = (GLdouble) ctx->Fog.ColorSumEnabled;
break;
case GL_CURRENT_SECONDARY_COLOR_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
FLUSH_CURRENT(ctx, 0);
params[0] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0];
params[1] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1];
params[2] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2];
break;
case GL_SECONDARY_COLOR_ARRAY_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
*params = (GLdouble) ctx->Array.SecondaryColor.Enabled;
break;
case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
*params = (GLdouble) ctx->Array.SecondaryColor.Type;
break;
case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
*params = (GLdouble) ctx->Array.SecondaryColor.Stride;
break;
case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
CHECK_EXTENSION_D(EXT_secondary_color, pname);
*params = (GLdouble) ctx->Array.SecondaryColor.Stride;
break;
 
/* GL_EXT_fog_coord */
case GL_CURRENT_FOG_COORDINATE_EXT:
CHECK_EXTENSION_D(EXT_fog_coord, pname);
FLUSH_CURRENT(ctx, 0);
*params = (GLdouble) ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
break;
case GL_FOG_COORDINATE_ARRAY_EXT:
CHECK_EXTENSION_D(EXT_fog_coord, pname);
*params = (GLdouble) ctx->Array.FogCoord.Enabled;
break;
case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
CHECK_EXTENSION_D(EXT_fog_coord, pname);
*params = (GLdouble) ctx->Array.FogCoord.Type;
break;
case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_D(EXT_fog_coord, pname);
*params = (GLdouble) ctx->Array.FogCoord.Stride;
break;
 
/* GL_EXT_texture_lod_bias */
case GL_MAX_TEXTURE_LOD_BIAS_EXT:
*params = (GLdouble) ctx->Const.MaxTextureLodBias;
break;
 
/* GL_EXT_texture_filter_anisotropic */
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
CHECK_EXTENSION_D(EXT_texture_filter_anisotropic, pname);
*params = (GLdouble) ctx->Const.MaxTextureMaxAnisotropy;
break;
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = (GLdouble) ctx->Multisample.Enabled;
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = (GLdouble) ctx->Multisample.SampleAlphaToCoverage;
break;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = (GLdouble) ctx->Multisample.SampleAlphaToOne;
break;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = (GLdouble) ctx->Multisample.SampleCoverage;
break;
case GL_SAMPLE_COVERAGE_VALUE_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = ctx->Multisample.SampleCoverageValue;
break;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = (GLdouble) ctx->Multisample.SampleCoverageInvert;
break;
case GL_SAMPLE_BUFFERS_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = 0.0; /* XXX fix someday */
break;
case GL_SAMPLES_ARB:
CHECK_EXTENSION_D(ARB_multisample, pname);
*params = 0.0; /* XXX fix someday */
break;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION_D(IBM_rasterpos_clip, pname);
*params = (GLdouble) ctx->Transform.RasterPositionUnclipped;
break;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLdouble) ctx->Point.PointSprite;
break;
case GL_POINT_SPRITE_R_MODE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLdouble) ctx->Point.SpriteRMode;
break;
 
/* GL_SGIS_generate_mipmap */
case GL_GENERATE_MIPMAP_HINT_SGIS:
CHECK_EXTENSION_D(SGIS_generate_mipmap, pname);
*params = (GLdouble) ctx->Hint.GenerateMipmap;
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->VertexProgram.Enabled;
break;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->VertexProgram.PointSizeEnabled;
break;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->VertexProgram.TwoSideEnabled;
break;
case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) MAX_PROGRAM_STACK_DEPTH;
break;
case GL_MAX_TRACK_MATRICES_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) MAX_PROGRAM_MATRICES;
break;
case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->CurrentStack->Depth;
break;
case GL_CURRENT_MATRIX_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->Transform.MatrixMode;
break;
case GL_VERTEX_PROGRAM_BINDING_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->VertexProgram.CurrentID;
break;
case GL_PROGRAM_ERROR_POSITION_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
*params = (GLdouble) ctx->VertexProgram.ErrorPos;
break;
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION_D(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_VERTEX_ATTRIB_ARRAY0_NV;
*params = (GLdouble) ctx->Array.VertexAttrib[n].Enabled;
}
break;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP1_VERTEX_ATTRIB0_4_NV;
*params = (GLdouble) ctx->Eval.Map1Attrib[n];
}
break;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP2_VERTEX_ATTRIB0_4_NV;
*params = (GLdouble) ctx->Eval.Map2Attrib[n];
}
break;
#endif /* FEATURE_NV_vertex_program */
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION_D(NV_texture_rectangle, pname);
*params = (GLdouble) _mesa_IsEnabled(GL_TEXTURE_RECTANGLE_NV);
break;
case GL_TEXTURE_BINDING_RECTANGLE_NV:
CHECK_EXTENSION_D(NV_texture_rectangle, pname);
*params = (GLdouble) textureUnit->CurrentRect->Name;
break;
case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:
CHECK_EXTENSION_D(NV_texture_rectangle, pname);
*params = (GLdouble) ctx->Const.MaxTextureRectSize;
break;
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION_D(EXT_stencil_two_side, pname);
*params = (GLdouble) ctx->Stencil.TestTwoSide;
break;
case GL_ACTIVE_STENCIL_FACE_EXT:
CHECK_EXTENSION_D(EXT_stencil_two_side, pname);
*params = (GLdouble) (ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT);
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetDoublev(pname=0x%x)", pname);
}
}
 
 
void
_mesa_GetFloatv( GLenum pname, GLfloat *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint i;
GLuint texUnit = ctx->Texture.CurrentUnit;
const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!params)
return;
 
/* We need this in order to get correct results for
* GL_OCCLUSION_TEST_RESULT_HP. There might be other important cases.
*/
FLUSH_VERTICES(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetFloatv %s\n", _mesa_lookup_enum_by_nr(pname));
 
if (ctx->Driver.GetFloatv && (*ctx->Driver.GetFloatv)(ctx, pname, params))
return;
 
switch (pname) {
case GL_ACCUM_RED_BITS:
*params = (GLfloat) ctx->Visual.accumRedBits;
break;
case GL_ACCUM_GREEN_BITS:
*params = (GLfloat) ctx->Visual.accumGreenBits;
break;
case GL_ACCUM_BLUE_BITS:
*params = (GLfloat) ctx->Visual.accumBlueBits;
break;
case GL_ACCUM_ALPHA_BITS:
*params = (GLfloat) ctx->Visual.accumAlphaBits;
break;
case GL_ACCUM_CLEAR_VALUE:
params[0] = ctx->Accum.ClearColor[0];
params[1] = ctx->Accum.ClearColor[1];
params[2] = ctx->Accum.ClearColor[2];
params[3] = ctx->Accum.ClearColor[3];
break;
case GL_ALPHA_BIAS:
*params = ctx->Pixel.AlphaBias;
break;
case GL_ALPHA_BITS:
*params = (GLfloat) ctx->Visual.alphaBits;
break;
case GL_ALPHA_SCALE:
*params = ctx->Pixel.AlphaScale;
break;
case GL_ALPHA_TEST:
*params = (GLfloat) ctx->Color.AlphaEnabled;
break;
case GL_ALPHA_TEST_FUNC:
*params = ENUM_TO_FLOAT(ctx->Color.AlphaFunc);
break;
case GL_ALPHA_TEST_REF:
*params = (GLfloat) ctx->Color.AlphaRef;
break;
case GL_ATTRIB_STACK_DEPTH:
*params = (GLfloat) (ctx->AttribStackDepth);
break;
case GL_AUTO_NORMAL:
*params = (GLfloat) ctx->Eval.AutoNormal;
break;
case GL_AUX_BUFFERS:
*params = (GLfloat) ctx->Const.NumAuxBuffers;
break;
case GL_BLEND:
*params = (GLfloat) ctx->Color.BlendEnabled;
break;
case GL_BLEND_DST:
*params = ENUM_TO_FLOAT(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC:
*params = ENUM_TO_FLOAT(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_SRC_RGB_EXT:
*params = ENUM_TO_FLOAT(ctx->Color.BlendSrcRGB);
break;
case GL_BLEND_DST_RGB_EXT:
*params = ENUM_TO_FLOAT(ctx->Color.BlendDstRGB);
break;
case GL_BLEND_SRC_ALPHA_EXT:
*params = ENUM_TO_FLOAT(ctx->Color.BlendSrcA);
break;
case GL_BLEND_DST_ALPHA_EXT:
*params = ENUM_TO_FLOAT(ctx->Color.BlendDstA);
break;
case GL_BLEND_EQUATION_EXT:
*params = ENUM_TO_FLOAT(ctx->Color.BlendEquation);
break;
case GL_BLEND_COLOR_EXT:
params[0] = ctx->Color.BlendColor[0];
params[1] = ctx->Color.BlendColor[1];
params[2] = ctx->Color.BlendColor[2];
params[3] = ctx->Color.BlendColor[3];
break;
case GL_BLUE_BIAS:
*params = ctx->Pixel.BlueBias;
break;
case GL_BLUE_BITS:
*params = (GLfloat) ctx->Visual.blueBits;
break;
case GL_BLUE_SCALE:
*params = ctx->Pixel.BlueScale;
break;
case GL_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLfloat) (ctx->ClientAttribStackDepth);
break;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
if (ctx->Transform.ClipPlanesEnabled & (1 << (pname - GL_CLIP_PLANE0)))
*params = 1.0;
else
*params = 0.0;
break;
case GL_COLOR_CLEAR_VALUE:
params[0] = ctx->Color.ClearColor[0];
params[1] = ctx->Color.ClearColor[1];
params[2] = ctx->Color.ClearColor[2];
params[3] = ctx->Color.ClearColor[3];
break;
case GL_COLOR_MATERIAL:
*params = (GLfloat) ctx->Light.ColorMaterialEnabled;
break;
case GL_COLOR_MATERIAL_FACE:
*params = ENUM_TO_FLOAT(ctx->Light.ColorMaterialFace);
break;
case GL_COLOR_MATERIAL_PARAMETER:
*params = ENUM_TO_FLOAT(ctx->Light.ColorMaterialMode);
break;
case GL_COLOR_WRITEMASK:
params[0] = ctx->Color.ColorMask[RCOMP] ? 1.0F : 0.0F;
params[1] = ctx->Color.ColorMask[GCOMP] ? 1.0F : 0.0F;
params[2] = ctx->Color.ColorMask[BCOMP] ? 1.0F : 0.0F;
params[3] = ctx->Color.ColorMask[ACOMP] ? 1.0F : 0.0F;
break;
case GL_CULL_FACE:
*params = (GLfloat) ctx->Polygon.CullFlag;
break;
case GL_CULL_FACE_MODE:
*params = ENUM_TO_FLOAT(ctx->Polygon.CullFaceMode);
break;
case GL_CURRENT_COLOR:
FLUSH_CURRENT(ctx, 0);
params[0] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0];
params[1] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1];
params[2] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2];
params[3] = ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3];
break;
case GL_CURRENT_INDEX:
FLUSH_CURRENT(ctx, 0);
*params = (GLfloat) ctx->Current.Index;
break;
case GL_CURRENT_NORMAL:
FLUSH_CURRENT(ctx, 0);
params[0] = ctx->Current.Attrib[VERT_ATTRIB_NORMAL][0];
params[1] = ctx->Current.Attrib[VERT_ATTRIB_NORMAL][1];
params[2] = ctx->Current.Attrib[VERT_ATTRIB_NORMAL][2];
break;
case GL_CURRENT_RASTER_COLOR:
params[0] = ctx->Current.RasterColor[0];
params[1] = ctx->Current.RasterColor[1];
params[2] = ctx->Current.RasterColor[2];
params[3] = ctx->Current.RasterColor[3];
break;
case GL_CURRENT_RASTER_DISTANCE:
params[0] = ctx->Current.RasterDistance;
break;
case GL_CURRENT_RASTER_INDEX:
*params = (GLfloat) ctx->Current.RasterIndex;
break;
case GL_CURRENT_RASTER_POSITION:
params[0] = ctx->Current.RasterPos[0];
params[1] = ctx->Current.RasterPos[1];
params[2] = ctx->Current.RasterPos[2];
params[3] = ctx->Current.RasterPos[3];
break;
case GL_CURRENT_RASTER_TEXTURE_COORDS:
params[0] = ctx->Current.RasterTexCoords[texUnit][0];
params[1] = ctx->Current.RasterTexCoords[texUnit][1];
params[2] = ctx->Current.RasterTexCoords[texUnit][2];
params[3] = ctx->Current.RasterTexCoords[texUnit][3];
break;
case GL_CURRENT_RASTER_POSITION_VALID:
*params = (GLfloat) ctx->Current.RasterPosValid;
break;
case GL_CURRENT_TEXTURE_COORDS:
FLUSH_CURRENT(ctx, 0);
params[0] = (GLfloat) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][0];
params[1] = (GLfloat) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][1];
params[2] = (GLfloat) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][2];
params[3] = (GLfloat) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][3];
break;
case GL_DEPTH_BIAS:
*params = (GLfloat) ctx->Pixel.DepthBias;
break;
case GL_DEPTH_BITS:
*params = (GLfloat) ctx->Visual.depthBits;
break;
case GL_DEPTH_CLEAR_VALUE:
*params = (GLfloat) ctx->Depth.Clear;
break;
case GL_DEPTH_FUNC:
*params = ENUM_TO_FLOAT(ctx->Depth.Func);
break;
case GL_DEPTH_RANGE:
params[0] = (GLfloat) ctx->Viewport.Near;
params[1] = (GLfloat) ctx->Viewport.Far;
break;
case GL_DEPTH_SCALE:
*params = (GLfloat) ctx->Pixel.DepthScale;
break;
case GL_DEPTH_TEST:
*params = (GLfloat) ctx->Depth.Test;
break;
case GL_DEPTH_WRITEMASK:
*params = (GLfloat) ctx->Depth.Mask;
break;
case GL_DITHER:
*params = (GLfloat) ctx->Color.DitherFlag;
break;
case GL_DOUBLEBUFFER:
*params = (GLfloat) ctx->Visual.doubleBufferMode;
break;
case GL_DRAW_BUFFER:
*params = ENUM_TO_FLOAT(ctx->Color.DrawBuffer);
break;
case GL_EDGE_FLAG:
FLUSH_CURRENT(ctx, 0);
*params = (GLfloat) ctx->Current.EdgeFlag;
break;
case GL_FEEDBACK_BUFFER_SIZE:
*params = (GLfloat) ctx->Feedback.BufferSize;
break;
case GL_FEEDBACK_BUFFER_TYPE:
*params = ENUM_TO_FLOAT(ctx->Feedback.Type);
break;
case GL_FOG:
*params = (GLfloat) ctx->Fog.Enabled;
break;
case GL_FOG_COLOR:
params[0] = ctx->Fog.Color[0];
params[1] = ctx->Fog.Color[1];
params[2] = ctx->Fog.Color[2];
params[3] = ctx->Fog.Color[3];
break;
case GL_FOG_DENSITY:
*params = ctx->Fog.Density;
break;
case GL_FOG_END:
*params = ctx->Fog.End;
break;
case GL_FOG_HINT:
*params = ENUM_TO_FLOAT(ctx->Hint.Fog);
break;
case GL_FOG_INDEX:
*params = ctx->Fog.Index;
break;
case GL_FOG_MODE:
*params = ENUM_TO_FLOAT(ctx->Fog.Mode);
break;
case GL_FOG_START:
*params = ctx->Fog.Start;
break;
case GL_FRONT_FACE:
*params = ENUM_TO_FLOAT(ctx->Polygon.FrontFace);
break;
case GL_GREEN_BIAS:
*params = (GLfloat) ctx->Pixel.GreenBias;
break;
case GL_GREEN_BITS:
*params = (GLfloat) ctx->Visual.greenBits;
break;
case GL_GREEN_SCALE:
*params = (GLfloat) ctx->Pixel.GreenScale;
break;
case GL_INDEX_BITS:
*params = (GLfloat) ctx->Visual.indexBits;
break;
case GL_INDEX_CLEAR_VALUE:
*params = (GLfloat) ctx->Color.ClearIndex;
break;
case GL_INDEX_MODE:
*params = ctx->Visual.rgbMode ? 0.0F : 1.0F;
break;
case GL_INDEX_OFFSET:
*params = (GLfloat) ctx->Pixel.IndexOffset;
break;
case GL_INDEX_SHIFT:
*params = (GLfloat) ctx->Pixel.IndexShift;
break;
case GL_INDEX_WRITEMASK:
*params = (GLfloat) ctx->Color.IndexMask;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
*params = (GLfloat) ctx->Light.Light[pname-GL_LIGHT0].Enabled;
break;
case GL_LIGHTING:
*params = (GLfloat) ctx->Light.Enabled;
break;
case GL_LIGHT_MODEL_AMBIENT:
params[0] = ctx->Light.Model.Ambient[0];
params[1] = ctx->Light.Model.Ambient[1];
params[2] = ctx->Light.Model.Ambient[2];
params[3] = ctx->Light.Model.Ambient[3];
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
params[0] = ENUM_TO_FLOAT(ctx->Light.Model.ColorControl);
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
*params = (GLfloat) ctx->Light.Model.LocalViewer;
break;
case GL_LIGHT_MODEL_TWO_SIDE:
*params = (GLfloat) ctx->Light.Model.TwoSide;
break;
case GL_LINE_SMOOTH:
*params = (GLfloat) ctx->Line.SmoothFlag;
break;
case GL_LINE_SMOOTH_HINT:
*params = ENUM_TO_FLOAT(ctx->Hint.LineSmooth);
break;
case GL_LINE_STIPPLE:
*params = (GLfloat) ctx->Line.StippleFlag;
break;
case GL_LINE_STIPPLE_PATTERN:
*params = (GLfloat) ctx->Line.StipplePattern;
break;
case GL_LINE_STIPPLE_REPEAT:
*params = (GLfloat) ctx->Line.StippleFactor;
break;
case GL_LINE_WIDTH:
*params = (GLfloat) ctx->Line.Width;
break;
case GL_LINE_WIDTH_GRANULARITY:
*params = (GLfloat) ctx->Const.LineWidthGranularity;
break;
case GL_LINE_WIDTH_RANGE:
params[0] = (GLfloat) ctx->Const.MinLineWidthAA;
params[1] = (GLfloat) ctx->Const.MaxLineWidthAA;
break;
case GL_ALIASED_LINE_WIDTH_RANGE:
params[0] = (GLfloat) ctx->Const.MinLineWidth;
params[1] = (GLfloat) ctx->Const.MaxLineWidth;
break;
case GL_LIST_BASE:
*params = (GLfloat) ctx->List.ListBase;
break;
case GL_LIST_INDEX:
*params = (GLfloat) ctx->CurrentListNum;
break;
case GL_LIST_MODE:
*params = ctx->ExecuteFlag ? ENUM_TO_FLOAT(GL_COMPILE_AND_EXECUTE)
: ENUM_TO_FLOAT(GL_COMPILE);
break;
case GL_INDEX_LOGIC_OP:
*params = (GLfloat) ctx->Color.IndexLogicOpEnabled;
break;
case GL_COLOR_LOGIC_OP:
*params = (GLfloat) ctx->Color.ColorLogicOpEnabled;
break;
case GL_LOGIC_OP_MODE:
*params = ENUM_TO_FLOAT(ctx->Color.LogicOp);
break;
case GL_MAP1_COLOR_4:
*params = (GLfloat) ctx->Eval.Map1Color4;
break;
case GL_MAP1_GRID_DOMAIN:
params[0] = ctx->Eval.MapGrid1u1;
params[1] = ctx->Eval.MapGrid1u2;
break;
case GL_MAP1_GRID_SEGMENTS:
*params = (GLfloat) ctx->Eval.MapGrid1un;
break;
case GL_MAP1_INDEX:
*params = (GLfloat) ctx->Eval.Map1Index;
break;
case GL_MAP1_NORMAL:
*params = (GLfloat) ctx->Eval.Map1Normal;
break;
case GL_MAP1_TEXTURE_COORD_1:
*params = (GLfloat) ctx->Eval.Map1TextureCoord1;
break;
case GL_MAP1_TEXTURE_COORD_2:
*params = (GLfloat) ctx->Eval.Map1TextureCoord2;
break;
case GL_MAP1_TEXTURE_COORD_3:
*params = (GLfloat) ctx->Eval.Map1TextureCoord3;
break;
case GL_MAP1_TEXTURE_COORD_4:
*params = (GLfloat) ctx->Eval.Map1TextureCoord4;
break;
case GL_MAP1_VERTEX_3:
*params = (GLfloat) ctx->Eval.Map1Vertex3;
break;
case GL_MAP1_VERTEX_4:
*params = (GLfloat) ctx->Eval.Map1Vertex4;
break;
case GL_MAP2_COLOR_4:
*params = (GLfloat) ctx->Eval.Map2Color4;
break;
case GL_MAP2_GRID_DOMAIN:
params[0] = ctx->Eval.MapGrid2u1;
params[1] = ctx->Eval.MapGrid2u2;
params[2] = ctx->Eval.MapGrid2v1;
params[3] = ctx->Eval.MapGrid2v2;
break;
case GL_MAP2_GRID_SEGMENTS:
params[0] = (GLfloat) ctx->Eval.MapGrid2un;
params[1] = (GLfloat) ctx->Eval.MapGrid2vn;
break;
case GL_MAP2_INDEX:
*params = (GLfloat) ctx->Eval.Map2Index;
break;
case GL_MAP2_NORMAL:
*params = (GLfloat) ctx->Eval.Map2Normal;
break;
case GL_MAP2_TEXTURE_COORD_1:
*params = ctx->Eval.Map2TextureCoord1;
break;
case GL_MAP2_TEXTURE_COORD_2:
*params = ctx->Eval.Map2TextureCoord2;
break;
case GL_MAP2_TEXTURE_COORD_3:
*params = ctx->Eval.Map2TextureCoord3;
break;
case GL_MAP2_TEXTURE_COORD_4:
*params = ctx->Eval.Map2TextureCoord4;
break;
case GL_MAP2_VERTEX_3:
*params = (GLfloat) ctx->Eval.Map2Vertex3;
break;
case GL_MAP2_VERTEX_4:
*params = (GLfloat) ctx->Eval.Map2Vertex4;
break;
case GL_MAP_COLOR:
*params = (GLfloat) ctx->Pixel.MapColorFlag;
break;
case GL_MAP_STENCIL:
*params = (GLfloat) ctx->Pixel.MapStencilFlag;
break;
case GL_MATRIX_MODE:
*params = ENUM_TO_FLOAT(ctx->Transform.MatrixMode);
break;
case GL_MAX_ATTRIB_STACK_DEPTH:
*params = (GLfloat) MAX_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLfloat) MAX_CLIENT_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIP_PLANES:
*params = (GLfloat) ctx->Const.MaxClipPlanes;
break;
case GL_MAX_ELEMENTS_VERTICES: /* GL_VERSION_1_2 */
*params = (GLfloat) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_ELEMENTS_INDICES: /* GL_VERSION_1_2 */
*params = (GLfloat) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_EVAL_ORDER:
*params = (GLfloat) MAX_EVAL_ORDER;
break;
case GL_MAX_LIGHTS:
*params = (GLfloat) ctx->Const.MaxLights;
break;
case GL_MAX_LIST_NESTING:
*params = (GLfloat) MAX_LIST_NESTING;
break;
case GL_MAX_MODELVIEW_STACK_DEPTH:
*params = (GLfloat) MAX_MODELVIEW_STACK_DEPTH;
break;
case GL_MAX_NAME_STACK_DEPTH:
*params = (GLfloat) MAX_NAME_STACK_DEPTH;
break;
case GL_MAX_PIXEL_MAP_TABLE:
*params = (GLfloat) MAX_PIXEL_MAP_TABLE;
break;
case GL_MAX_PROJECTION_STACK_DEPTH:
*params = (GLfloat) MAX_PROJECTION_STACK_DEPTH;
break;
case GL_MAX_TEXTURE_SIZE:
*params = (GLfloat) (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE:
*params = (GLfloat) (1 << (ctx->Const.Max3DTextureLevels - 1));
break;
case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLfloat) MAX_TEXTURE_STACK_DEPTH;
break;
case GL_MAX_VIEWPORT_DIMS:
params[0] = (GLfloat) MAX_WIDTH;
params[1] = (GLfloat) MAX_HEIGHT;
break;
case GL_MODELVIEW_MATRIX:
for (i=0;i<16;i++) {
params[i] = ctx->ModelviewMatrixStack.Top->m[i];
}
break;
case GL_MODELVIEW_STACK_DEPTH:
*params = (GLfloat) (ctx->ModelviewMatrixStack.Depth + 1);
break;
case GL_NAME_STACK_DEPTH:
*params = (GLfloat) ctx->Select.NameStackDepth;
break;
case GL_NORMALIZE:
*params = (GLfloat) ctx->Transform.Normalize;
break;
case GL_PACK_ALIGNMENT:
*params = (GLfloat) ctx->Pack.Alignment;
break;
case GL_PACK_LSB_FIRST:
*params = (GLfloat) ctx->Pack.LsbFirst;
break;
case GL_PACK_ROW_LENGTH:
*params = (GLfloat) ctx->Pack.RowLength;
break;
case GL_PACK_SKIP_PIXELS:
*params = (GLfloat) ctx->Pack.SkipPixels;
break;
case GL_PACK_SKIP_ROWS:
*params = (GLfloat) ctx->Pack.SkipRows;
break;
case GL_PACK_SWAP_BYTES:
*params = (GLfloat) ctx->Pack.SwapBytes;
break;
case GL_PACK_SKIP_IMAGES_EXT:
*params = (GLfloat) ctx->Pack.SkipImages;
break;
case GL_PACK_IMAGE_HEIGHT_EXT:
*params = (GLfloat) ctx->Pack.ImageHeight;
break;
case GL_PACK_INVERT_MESA:
*params = (GLfloat) ctx->Pack.Invert;
break;
case GL_PERSPECTIVE_CORRECTION_HINT:
*params = ENUM_TO_FLOAT(ctx->Hint.PerspectiveCorrection);
break;
case GL_PIXEL_MAP_A_TO_A_SIZE:
*params = (GLfloat) ctx->Pixel.MapAtoAsize;
break;
case GL_PIXEL_MAP_B_TO_B_SIZE:
*params = (GLfloat) ctx->Pixel.MapBtoBsize;
break;
case GL_PIXEL_MAP_G_TO_G_SIZE:
*params = (GLfloat) ctx->Pixel.MapGtoGsize;
break;
case GL_PIXEL_MAP_I_TO_A_SIZE:
*params = (GLfloat) ctx->Pixel.MapItoAsize;
break;
case GL_PIXEL_MAP_I_TO_B_SIZE:
*params = (GLfloat) ctx->Pixel.MapItoBsize;
break;
case GL_PIXEL_MAP_I_TO_G_SIZE:
*params = (GLfloat) ctx->Pixel.MapItoGsize;
break;
case GL_PIXEL_MAP_I_TO_I_SIZE:
*params = (GLfloat) ctx->Pixel.MapItoIsize;
break;
case GL_PIXEL_MAP_I_TO_R_SIZE:
*params = (GLfloat) ctx->Pixel.MapItoRsize;
break;
case GL_PIXEL_MAP_R_TO_R_SIZE:
*params = (GLfloat) ctx->Pixel.MapRtoRsize;
break;
case GL_PIXEL_MAP_S_TO_S_SIZE:
*params = (GLfloat) ctx->Pixel.MapStoSsize;
break;
case GL_POINT_SIZE:
*params = (GLfloat) ctx->Point.Size;
break;
case GL_POINT_SIZE_GRANULARITY:
*params = (GLfloat) ctx->Const.PointSizeGranularity;
break;
case GL_POINT_SIZE_RANGE:
params[0] = (GLfloat) ctx->Const.MinPointSizeAA;
params[1] = (GLfloat) ctx->Const.MaxPointSizeAA;
break;
case GL_ALIASED_POINT_SIZE_RANGE:
params[0] = (GLfloat) ctx->Const.MinPointSize;
params[1] = (GLfloat) ctx->Const.MaxPointSize;
break;
case GL_POINT_SMOOTH:
*params = (GLfloat) ctx->Point.SmoothFlag;
break;
case GL_POINT_SMOOTH_HINT:
*params = ENUM_TO_FLOAT(ctx->Hint.PointSmooth);
break;
case GL_POINT_SIZE_MIN_EXT:
*params = (GLfloat) (ctx->Point.MinSize);
break;
case GL_POINT_SIZE_MAX_EXT:
*params = (GLfloat) (ctx->Point.MaxSize);
break;
case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
*params = (GLfloat) (ctx->Point.Threshold);
break;
case GL_DISTANCE_ATTENUATION_EXT:
params[0] = (GLfloat) (ctx->Point.Params[0]);
params[1] = (GLfloat) (ctx->Point.Params[1]);
params[2] = (GLfloat) (ctx->Point.Params[2]);
break;
case GL_POLYGON_MODE:
params[0] = ENUM_TO_FLOAT(ctx->Polygon.FrontMode);
params[1] = ENUM_TO_FLOAT(ctx->Polygon.BackMode);
break;
#ifdef GL_EXT_polygon_offset
case GL_POLYGON_OFFSET_BIAS_EXT:
*params = ctx->Polygon.OffsetUnits;
break;
#endif
case GL_POLYGON_OFFSET_FACTOR:
*params = ctx->Polygon.OffsetFactor;
break;
case GL_POLYGON_OFFSET_UNITS:
*params = ctx->Polygon.OffsetUnits;
break;
case GL_POLYGON_SMOOTH:
*params = (GLfloat) ctx->Polygon.SmoothFlag;
break;
case GL_POLYGON_SMOOTH_HINT:
*params = ENUM_TO_FLOAT(ctx->Hint.PolygonSmooth);
break;
case GL_POLYGON_STIPPLE:
*params = (GLfloat) ctx->Polygon.StippleFlag;
break;
case GL_PROJECTION_MATRIX:
for (i=0;i<16;i++) {
params[i] = ctx->ProjectionMatrixStack.Top->m[i];
}
break;
case GL_PROJECTION_STACK_DEPTH:
*params = (GLfloat) (ctx->ProjectionMatrixStack.Depth + 1);
break;
case GL_READ_BUFFER:
*params = ENUM_TO_FLOAT(ctx->Pixel.ReadBuffer);
break;
case GL_RED_BIAS:
*params = ctx->Pixel.RedBias;
break;
case GL_RED_BITS:
*params = (GLfloat) ctx->Visual.redBits;
break;
case GL_RED_SCALE:
*params = ctx->Pixel.RedScale;
break;
case GL_RENDER_MODE:
*params = ENUM_TO_FLOAT(ctx->RenderMode);
break;
case GL_RESCALE_NORMAL:
*params = (GLfloat) ctx->Transform.RescaleNormals;
break;
case GL_RGBA_MODE:
*params = (GLfloat) ctx->Visual.rgbMode;
break;
case GL_SCISSOR_BOX:
params[0] = (GLfloat) ctx->Scissor.X;
params[1] = (GLfloat) ctx->Scissor.Y;
params[2] = (GLfloat) ctx->Scissor.Width;
params[3] = (GLfloat) ctx->Scissor.Height;
break;
case GL_SCISSOR_TEST:
*params = (GLfloat) ctx->Scissor.Enabled;
break;
case GL_SELECTION_BUFFER_SIZE:
*params = (GLfloat) ctx->Select.BufferSize;
break;
case GL_SHADE_MODEL:
*params = ENUM_TO_FLOAT(ctx->Light.ShadeModel);
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
*params = (GLfloat) ctx->Texture.SharedPalette;
break;
case GL_STENCIL_BITS:
*params = (GLfloat) ctx->Visual.stencilBits;
break;
case GL_STENCIL_CLEAR_VALUE:
*params = (GLfloat) ctx->Stencil.Clear;
break;
case GL_STENCIL_FAIL:
*params = ENUM_TO_FLOAT(ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_FUNC:
*params = ENUM_TO_FLOAT(ctx->Stencil.Function[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_FAIL:
*params = ENUM_TO_FLOAT(ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_PASS_DEPTH_PASS:
*params = ENUM_TO_FLOAT(ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace]);
break;
case GL_STENCIL_REF:
*params = (GLfloat) ctx->Stencil.Ref[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_TEST:
*params = (GLfloat) ctx->Stencil.Enabled;
break;
case GL_STENCIL_VALUE_MASK:
*params = (GLfloat) ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_WRITEMASK:
*params = (GLfloat) ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
break;
case GL_STEREO:
*params = (GLfloat) ctx->Visual.stereoMode;
break;
case GL_SUBPIXEL_BITS:
*params = (GLfloat) ctx->Const.SubPixelBits;
break;
case GL_TEXTURE_1D:
*params = _mesa_IsEnabled(GL_TEXTURE_1D) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_2D:
*params = _mesa_IsEnabled(GL_TEXTURE_2D) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_3D:
*params = _mesa_IsEnabled(GL_TEXTURE_3D) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_BINDING_1D:
*params = (GLfloat) textureUnit->Current1D->Name;
break;
case GL_TEXTURE_BINDING_2D:
*params = (GLfloat) textureUnit->Current2D->Name;
break;
case GL_TEXTURE_BINDING_3D:
*params = (GLfloat) textureUnit->Current2D->Name;
break;
case GL_TEXTURE_ENV_COLOR:
params[0] = textureUnit->EnvColor[0];
params[1] = textureUnit->EnvColor[1];
params[2] = textureUnit->EnvColor[2];
params[3] = textureUnit->EnvColor[3];
break;
case GL_TEXTURE_ENV_MODE:
*params = ENUM_TO_FLOAT(textureUnit->EnvMode);
break;
case GL_TEXTURE_GEN_S:
*params = (textureUnit->TexGenEnabled & S_BIT) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_GEN_T:
*params = (textureUnit->TexGenEnabled & T_BIT) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_GEN_R:
*params = (textureUnit->TexGenEnabled & R_BIT) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_GEN_Q:
*params = (textureUnit->TexGenEnabled & Q_BIT) ? 1.0F : 0.0F;
break;
case GL_TEXTURE_MATRIX:
for (i=0;i<16;i++) {
params[i] = ctx->TextureMatrixStack[texUnit].Top->m[i];
}
break;
case GL_TEXTURE_STACK_DEPTH:
*params = (GLfloat) (ctx->TextureMatrixStack[texUnit].Depth + 1);
break;
case GL_UNPACK_ALIGNMENT:
*params = (GLfloat) ctx->Unpack.Alignment;
break;
case GL_UNPACK_LSB_FIRST:
*params = (GLfloat) ctx->Unpack.LsbFirst;
break;
case GL_UNPACK_ROW_LENGTH:
*params = (GLfloat) ctx->Unpack.RowLength;
break;
case GL_UNPACK_SKIP_PIXELS:
*params = (GLfloat) ctx->Unpack.SkipPixels;
break;
case GL_UNPACK_SKIP_ROWS:
*params = (GLfloat) ctx->Unpack.SkipRows;
break;
case GL_UNPACK_SWAP_BYTES:
*params = (GLfloat) ctx->Unpack.SwapBytes;
break;
case GL_UNPACK_SKIP_IMAGES_EXT:
*params = (GLfloat) ctx->Unpack.SkipImages;
break;
case GL_UNPACK_IMAGE_HEIGHT_EXT:
*params = (GLfloat) ctx->Unpack.ImageHeight;
break;
case GL_UNPACK_CLIENT_STORAGE_APPLE:
*params = (GLfloat) ctx->Unpack.ClientStorage;
break;
case GL_VIEWPORT:
params[0] = (GLfloat) ctx->Viewport.X;
params[1] = (GLfloat) ctx->Viewport.Y;
params[2] = (GLfloat) ctx->Viewport.Width;
params[3] = (GLfloat) ctx->Viewport.Height;
break;
case GL_ZOOM_X:
*params = (GLfloat) ctx->Pixel.ZoomX;
break;
case GL_ZOOM_Y:
*params = (GLfloat) ctx->Pixel.ZoomY;
break;
case GL_VERTEX_ARRAY:
*params = (GLfloat) ctx->Array.Vertex.Enabled;
break;
case GL_VERTEX_ARRAY_SIZE:
*params = (GLfloat) ctx->Array.Vertex.Size;
break;
case GL_VERTEX_ARRAY_TYPE:
*params = ENUM_TO_FLOAT(ctx->Array.Vertex.Type);
break;
case GL_VERTEX_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.Vertex.Stride;
break;
case GL_VERTEX_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_NORMAL_ARRAY:
*params = (GLfloat) ctx->Array.Normal.Enabled;
break;
case GL_NORMAL_ARRAY_TYPE:
*params = ENUM_TO_FLOAT(ctx->Array.Normal.Type);
break;
case GL_NORMAL_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.Normal.Stride;
break;
case GL_NORMAL_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_COLOR_ARRAY:
*params = (GLfloat) ctx->Array.Color.Enabled;
break;
case GL_COLOR_ARRAY_SIZE:
*params = (GLfloat) ctx->Array.Color.Size;
break;
case GL_COLOR_ARRAY_TYPE:
*params = ENUM_TO_FLOAT(ctx->Array.Color.Type);
break;
case GL_COLOR_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.Color.Stride;
break;
case GL_COLOR_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_INDEX_ARRAY:
*params = (GLfloat) ctx->Array.Index.Enabled;
break;
case GL_INDEX_ARRAY_TYPE:
*params = ENUM_TO_FLOAT(ctx->Array.Index.Type);
break;
case GL_INDEX_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.Index.Stride;
break;
case GL_INDEX_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_TEXTURE_COORD_ARRAY:
*params = (GLfloat) ctx->Array.TexCoord[texUnit].Enabled;
break;
case GL_TEXTURE_COORD_ARRAY_SIZE:
*params = (GLfloat) ctx->Array.TexCoord[texUnit].Size;
break;
case GL_TEXTURE_COORD_ARRAY_TYPE:
*params = ENUM_TO_FLOAT(ctx->Array.TexCoord[texUnit].Type);
break;
case GL_TEXTURE_COORD_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.TexCoord[texUnit].Stride;
break;
case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
*params = 0.0;
break;
case GL_EDGE_FLAG_ARRAY:
*params = (GLfloat) ctx->Array.EdgeFlag.Enabled;
break;
case GL_EDGE_FLAG_ARRAY_STRIDE:
*params = (GLfloat) ctx->Array.EdgeFlag.Stride;
break;
case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
*params = 0.0;
break;
 
/* GL_ARB_multitexture */
case GL_MAX_TEXTURE_UNITS_ARB:
CHECK_EXTENSION_F(ARB_multitexture, pname);
*params = (GLfloat) ctx->Const.MaxTextureUnits;
break;
case GL_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_F(ARB_multitexture, pname);
*params = (GLfloat) (GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit);
break;
case GL_CLIENT_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_F(ARB_multitexture, pname);
*params = (GLfloat) (GL_TEXTURE0_ARB + ctx->Array.ActiveTexture);
break;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
CHECK_EXTENSION_F(ARB_texture_cube_map, pname);
*params = (GLfloat) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);
break;
case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
CHECK_EXTENSION_F(ARB_texture_cube_map, pname);
*params = (GLfloat) textureUnit->CurrentCubeMap->Name;
break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
CHECK_EXTENSION_F(ARB_texture_cube_map, pname);
*params = (GLfloat) (1 << (ctx->Const.MaxCubeTextureLevels - 1));
break;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSION_HINT_ARB:
CHECK_EXTENSION_F(ARB_texture_compression, pname);
*params = (GLfloat) ctx->Hint.TextureCompression;
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_F(ARB_texture_compression, pname);
*params = (GLfloat) _mesa_get_compressed_formats(ctx, NULL);
break;
case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_F(ARB_texture_compression, pname);
{
GLint formats[100];
GLuint i, n;
n = _mesa_get_compressed_formats(ctx, formats);
for (i = 0; i < n; i++)
params[i] = (GLfloat) formats[i];
}
break;
 
/* GL_EXT_compiled_vertex_array */
case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
CHECK_EXTENSION_F(EXT_compiled_vertex_array, pname);
*params = (GLfloat) ctx->Array.LockFirst;
break;
case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT:
CHECK_EXTENSION_F(EXT_compiled_vertex_array, pname);
*params = (GLfloat) ctx->Array.LockCount;
break;
 
/* GL_ARB_transpose_matrix */
case GL_TRANSPOSE_COLOR_MATRIX_ARB:
_math_transposef(params, ctx->ColorMatrixStack.Top->m);
break;
case GL_TRANSPOSE_MODELVIEW_MATRIX_ARB:
_math_transposef(params, ctx->ModelviewMatrixStack.Top->m);
break;
case GL_TRANSPOSE_PROJECTION_MATRIX_ARB:
_math_transposef(params, ctx->ProjectionMatrixStack.Top->m);
break;
case GL_TRANSPOSE_TEXTURE_MATRIX_ARB:
_math_transposef(params, ctx->TextureMatrixStack[texUnit].Top->m);
break;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION_F(HP_occlusion_test, pname);
*params = (GLfloat) ctx->Depth.OcclusionTest;
break;
case GL_OCCLUSION_TEST_RESULT_HP:
CHECK_EXTENSION_F(HP_occlusion_test, pname);
if (ctx->Depth.OcclusionTest)
*params = (GLfloat) ctx->OcclusionResult;
else
*params = (GLfloat) ctx->OcclusionResultSaved;
/* reset flag now */
ctx->OcclusionResult = GL_FALSE;
ctx->OcclusionResultSaved = GL_FALSE;
break;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
*params = (GLfloat) ctx->Pixel.PixelTextureEnabled;
break;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
*params = (GLfloat) ctx->Pixel.PixelTextureEnabled;
break;
case GL_PIXEL_TEX_GEN_MODE_SGIX:
*params = (GLfloat) pixel_texgen_mode(ctx);
break;
 
/* GL_SGI_color_matrix (also in 1.2 imaging) */
case GL_COLOR_MATRIX_SGI:
for (i=0;i<16;i++) {
params[i] = ctx->ColorMatrixStack.Top->m[i];
}
break;
case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = (GLfloat) (ctx->ColorMatrixStack.Depth + 1);
break;
case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
*params = (GLfloat) MAX_COLOR_STACK_DEPTH;
break;
case GL_POST_COLOR_MATRIX_RED_SCALE_SGI:
*params = ctx->Pixel.PostColorMatrixScale[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI:
*params = ctx->Pixel.PostColorMatrixScale[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI:
*params = ctx->Pixel.PostColorMatrixScale[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI:
*params = ctx->Pixel.PostColorMatrixScale[3];
break;
case GL_POST_COLOR_MATRIX_RED_BIAS_SGI:
*params = ctx->Pixel.PostColorMatrixBias[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI:
*params = ctx->Pixel.PostColorMatrixBias[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI:
*params = ctx->Pixel.PostColorMatrixBias[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI:
*params = ctx->Pixel.PostColorMatrixBias[3];
break;
 
/* GL_EXT_convolution (also in 1.2 imaging) */
case GL_CONVOLUTION_1D_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = (GLfloat) ctx->Pixel.Convolution1DEnabled;
break;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = (GLfloat) ctx->Pixel.Convolution2DEnabled;
break;
case GL_SEPARABLE_2D:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = (GLfloat) ctx->Pixel.Separable2DEnabled;
break;
case GL_POST_CONVOLUTION_RED_SCALE_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionScale[0];
break;
case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionScale[1];
break;
case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionScale[2];
break;
case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionScale[3];
break;
case GL_POST_CONVOLUTION_RED_BIAS_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionBias[0];
break;
case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionBias[1];
break;
case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionBias[2];
break;
case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:
CHECK_EXTENSION_F(EXT_convolution, pname);
*params = ctx->Pixel.PostConvolutionBias[2];
break;
 
/* GL_EXT_histogram (also in 1.2 imaging) */
case GL_HISTOGRAM:
CHECK_EXTENSION_F(EXT_histogram, pname);
*params = (GLfloat) ctx->Pixel.HistogramEnabled;
break;
case GL_MINMAX:
CHECK_EXTENSION_F(EXT_histogram, pname);
*params = (GLfloat) ctx->Pixel.MinMaxEnabled;
break;
 
/* GL_SGI_color_table (also in 1.2 imaging */
case GL_COLOR_TABLE_SGI:
*params = (GLfloat) ctx->Pixel.ColorTableEnabled;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
*params = (GLfloat) ctx->Pixel.PostConvolutionColorTableEnabled;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
*params = (GLfloat) ctx->Pixel.PostColorMatrixColorTableEnabled;
break;
 
/* GL_EXT_secondary_color */
case GL_COLOR_SUM_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
*params = (GLfloat) ctx->Fog.ColorSumEnabled;
break;
case GL_CURRENT_SECONDARY_COLOR_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
FLUSH_CURRENT(ctx, 0);
params[0] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0];
params[1] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1];
params[2] = ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2];
break;
case GL_SECONDARY_COLOR_ARRAY_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
*params = (GLfloat) ctx->Array.SecondaryColor.Enabled;
break;
case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
*params = (GLfloat) ctx->Array.SecondaryColor.Type;
break;
case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
*params = (GLfloat) ctx->Array.SecondaryColor.Stride;
break;
case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
CHECK_EXTENSION_F(EXT_secondary_color, pname);
*params = (GLfloat) ctx->Array.SecondaryColor.Stride;
break;
 
/* GL_EXT_fog_coord */
case GL_CURRENT_FOG_COORDINATE_EXT:
CHECK_EXTENSION_F(EXT_fog_coord, pname);
FLUSH_CURRENT(ctx, 0);
*params = (GLfloat) ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
break;
case GL_FOG_COORDINATE_ARRAY_EXT:
CHECK_EXTENSION_F(EXT_fog_coord, pname);
*params = (GLfloat) ctx->Array.FogCoord.Enabled;
break;
case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
CHECK_EXTENSION_F(EXT_fog_coord, pname);
*params = (GLfloat) ctx->Array.FogCoord.Type;
break;
case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_F(EXT_fog_coord, pname);
*params = (GLfloat) ctx->Array.FogCoord.Stride;
break;
 
/* GL_EXT_texture_lod_bias */
case GL_MAX_TEXTURE_LOD_BIAS_EXT:
*params = ctx->Const.MaxTextureLodBias;
break;
 
/* GL_EXT_texture_filter_anisotropic */
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
CHECK_EXTENSION_F(EXT_texture_filter_anisotropic, pname);
*params = ctx->Const.MaxTextureMaxAnisotropy;
break;
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = (GLfloat) ctx->Multisample.Enabled;
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = (GLfloat) ctx->Multisample.SampleAlphaToCoverage;
break;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = (GLfloat) ctx->Multisample.SampleAlphaToOne;
break;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = (GLfloat) ctx->Multisample.SampleCoverage;
break;
case GL_SAMPLE_COVERAGE_VALUE_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = ctx->Multisample.SampleCoverageValue;
break;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = (GLfloat) ctx->Multisample.SampleCoverageInvert;
break;
case GL_SAMPLE_BUFFERS_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = 0.0; /* XXX fix someday */
break;
case GL_SAMPLES_ARB:
CHECK_EXTENSION_F(ARB_multisample, pname);
*params = 0.0; /* XXX fix someday */
break;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION_F(IBM_rasterpos_clip, pname);
*params = (GLfloat) ctx->Transform.RasterPositionUnclipped;
break;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLfloat) ctx->Point.PointSprite;
break;
case GL_POINT_SPRITE_R_MODE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLfloat) ctx->Point.SpriteRMode;
break;
 
/* GL_SGIS_generate_mipmap */
case GL_GENERATE_MIPMAP_HINT_SGIS:
CHECK_EXTENSION_F(SGIS_generate_mipmap, pname);
*params = (GLfloat) ctx->Hint.GenerateMipmap;
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->VertexProgram.Enabled;
break;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->VertexProgram.PointSizeEnabled;
break;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->VertexProgram.TwoSideEnabled;
break;
case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) MAX_PROGRAM_STACK_DEPTH;
break;
case GL_MAX_TRACK_MATRICES_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) MAX_PROGRAM_MATRICES;
break;
case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->CurrentStack->Depth;
break;
case GL_CURRENT_MATRIX_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->Transform.MatrixMode;
break;
case GL_VERTEX_PROGRAM_BINDING_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->VertexProgram.CurrentID;
break;
case GL_PROGRAM_ERROR_POSITION_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
*params = (GLfloat) ctx->VertexProgram.ErrorPos;
break;
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION_F(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_VERTEX_ATTRIB_ARRAY0_NV;
*params = (GLfloat) ctx->Array.VertexAttrib[n].Enabled;
}
break;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP1_VERTEX_ATTRIB0_4_NV;
*params = (GLfloat) ctx->Eval.Map1Attrib[n];
}
break;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP2_VERTEX_ATTRIB0_4_NV;
*params = (GLfloat) ctx->Eval.Map2Attrib[n];
}
break;
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION_F(NV_texture_rectangle, pname);
*params = (GLfloat) _mesa_IsEnabled(GL_TEXTURE_RECTANGLE_NV);
break;
case GL_TEXTURE_BINDING_RECTANGLE_NV:
CHECK_EXTENSION_F(NV_texture_rectangle, pname);
*params = (GLfloat) textureUnit->CurrentRect->Name;
break;
case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:
CHECK_EXTENSION_F(NV_texture_rectangle, pname);
*params = (GLfloat) ctx->Const.MaxTextureRectSize;
break;
#endif /* FEATURE_NV_vertex_program */
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION_F(EXT_stencil_two_side, pname);
*params = (GLfloat) ctx->Stencil.TestTwoSide;
break;
case GL_ACTIVE_STENCIL_FACE_EXT:
CHECK_EXTENSION_F(EXT_stencil_two_side, pname);
*params = (GLfloat) (ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT);
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv(0x%x)", pname);
}
}
 
 
void
_mesa_GetIntegerv( GLenum pname, GLint *params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint i;
GLuint texUnit = ctx->Texture.CurrentUnit;
const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!params)
return;
 
/* We need this in order to get correct results for
* GL_OCCLUSION_TEST_RESULT_HP. There might be other important cases.
*/
FLUSH_VERTICES(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetIntegerv %s\n", _mesa_lookup_enum_by_nr(pname));
 
if (ctx->Driver.GetIntegerv
&& (*ctx->Driver.GetIntegerv)(ctx, pname, params))
return;
 
switch (pname) {
case GL_ACCUM_RED_BITS:
*params = (GLint) ctx->Visual.accumRedBits;
break;
case GL_ACCUM_GREEN_BITS:
*params = (GLint) ctx->Visual.accumGreenBits;
break;
case GL_ACCUM_BLUE_BITS:
*params = (GLint) ctx->Visual.accumBlueBits;
break;
case GL_ACCUM_ALPHA_BITS:
*params = (GLint) ctx->Visual.accumAlphaBits;
break;
case GL_ACCUM_CLEAR_VALUE:
params[0] = FLOAT_TO_INT( ctx->Accum.ClearColor[0] );
params[1] = FLOAT_TO_INT( ctx->Accum.ClearColor[1] );
params[2] = FLOAT_TO_INT( ctx->Accum.ClearColor[2] );
params[3] = FLOAT_TO_INT( ctx->Accum.ClearColor[3] );
break;
case GL_ALPHA_BIAS:
*params = (GLint) ctx->Pixel.AlphaBias;
break;
case GL_ALPHA_BITS:
*params = ctx->Visual.alphaBits;
break;
case GL_ALPHA_SCALE:
*params = (GLint) ctx->Pixel.AlphaScale;
break;
case GL_ALPHA_TEST:
*params = (GLint) ctx->Color.AlphaEnabled;
break;
case GL_ALPHA_TEST_REF:
*params = FLOAT_TO_INT(ctx->Color.AlphaRef);
break;
case GL_ALPHA_TEST_FUNC:
*params = (GLint) ctx->Color.AlphaFunc;
break;
case GL_ATTRIB_STACK_DEPTH:
*params = (GLint) (ctx->AttribStackDepth);
break;
case GL_AUTO_NORMAL:
*params = (GLint) ctx->Eval.AutoNormal;
break;
case GL_AUX_BUFFERS:
*params = (GLint) ctx->Const.NumAuxBuffers;
break;
case GL_BLEND:
*params = (GLint) ctx->Color.BlendEnabled;
break;
case GL_BLEND_DST:
*params = (GLint) ctx->Color.BlendDstRGB;
break;
case GL_BLEND_SRC:
*params = (GLint) ctx->Color.BlendSrcRGB;
break;
case GL_BLEND_SRC_RGB_EXT:
*params = (GLint) ctx->Color.BlendSrcRGB;
break;
case GL_BLEND_DST_RGB_EXT:
*params = (GLint) ctx->Color.BlendDstRGB;
break;
case GL_BLEND_SRC_ALPHA_EXT:
*params = (GLint) ctx->Color.BlendSrcA;
break;
case GL_BLEND_DST_ALPHA_EXT:
*params = (GLint) ctx->Color.BlendDstA;
break;
case GL_BLEND_EQUATION_EXT:
*params = (GLint) ctx->Color.BlendEquation;
break;
case GL_BLEND_COLOR_EXT:
params[0] = FLOAT_TO_INT( ctx->Color.BlendColor[0] );
params[1] = FLOAT_TO_INT( ctx->Color.BlendColor[1] );
params[2] = FLOAT_TO_INT( ctx->Color.BlendColor[2] );
params[3] = FLOAT_TO_INT( ctx->Color.BlendColor[3] );
break;
case GL_BLUE_BIAS:
*params = (GLint) ctx->Pixel.BlueBias;
break;
case GL_BLUE_BITS:
*params = (GLint) ctx->Visual.blueBits;
break;
case GL_BLUE_SCALE:
*params = (GLint) ctx->Pixel.BlueScale;
break;
case GL_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLint) (ctx->ClientAttribStackDepth);
break;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
if (ctx->Transform.ClipPlanesEnabled & (1 << (pname - GL_CLIP_PLANE0)))
*params = 1;
else
*params = 0;
break;
case GL_COLOR_CLEAR_VALUE:
params[0] = FLOAT_TO_INT( (ctx->Color.ClearColor[0]) );
params[1] = FLOAT_TO_INT( (ctx->Color.ClearColor[1]) );
params[2] = FLOAT_TO_INT( (ctx->Color.ClearColor[2]) );
params[3] = FLOAT_TO_INT( (ctx->Color.ClearColor[3]) );
break;
case GL_COLOR_MATERIAL:
*params = (GLint) ctx->Light.ColorMaterialEnabled;
break;
case GL_COLOR_MATERIAL_FACE:
*params = (GLint) ctx->Light.ColorMaterialFace;
break;
case GL_COLOR_MATERIAL_PARAMETER:
*params = (GLint) ctx->Light.ColorMaterialMode;
break;
case GL_COLOR_WRITEMASK:
params[0] = ctx->Color.ColorMask[RCOMP] ? 1 : 0;
params[1] = ctx->Color.ColorMask[GCOMP] ? 1 : 0;
params[2] = ctx->Color.ColorMask[BCOMP] ? 1 : 0;
params[3] = ctx->Color.ColorMask[ACOMP] ? 1 : 0;
break;
case GL_CULL_FACE:
*params = (GLint) ctx->Polygon.CullFlag;
break;
case GL_CULL_FACE_MODE:
*params = (GLint) ctx->Polygon.CullFaceMode;
break;
case GL_CURRENT_COLOR:
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0]);
params[1] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1]);
params[2] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2]);
params[3] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3]);
break;
case GL_CURRENT_INDEX:
FLUSH_CURRENT(ctx, 0);
*params = (GLint) ctx->Current.Index;
break;
case GL_CURRENT_NORMAL:
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][0]);
params[1] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][1]);
params[2] = FLOAT_TO_INT(ctx->Current.Attrib[VERT_ATTRIB_NORMAL][2]);
break;
case GL_CURRENT_RASTER_COLOR:
params[0] = FLOAT_TO_INT( ctx->Current.RasterColor[0] );
params[1] = FLOAT_TO_INT( ctx->Current.RasterColor[1] );
params[2] = FLOAT_TO_INT( ctx->Current.RasterColor[2] );
params[3] = FLOAT_TO_INT( ctx->Current.RasterColor[3] );
break;
case GL_CURRENT_RASTER_DISTANCE:
params[0] = (GLint) ctx->Current.RasterDistance;
break;
case GL_CURRENT_RASTER_INDEX:
*params = (GLint) ctx->Current.RasterIndex;
break;
case GL_CURRENT_RASTER_POSITION:
params[0] = (GLint) ctx->Current.RasterPos[0];
params[1] = (GLint) ctx->Current.RasterPos[1];
params[2] = (GLint) ctx->Current.RasterPos[2];
params[3] = (GLint) ctx->Current.RasterPos[3];
break;
case GL_CURRENT_RASTER_TEXTURE_COORDS:
params[0] = (GLint) ctx->Current.RasterTexCoords[texUnit][0];
params[1] = (GLint) ctx->Current.RasterTexCoords[texUnit][1];
params[2] = (GLint) ctx->Current.RasterTexCoords[texUnit][2];
params[3] = (GLint) ctx->Current.RasterTexCoords[texUnit][3];
break;
case GL_CURRENT_RASTER_POSITION_VALID:
*params = (GLint) ctx->Current.RasterPosValid;
break;
case GL_CURRENT_TEXTURE_COORDS:
FLUSH_CURRENT(ctx, 0);
params[0] = (GLint) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][0];
params[1] = (GLint) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][1];
params[2] = (GLint) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][2];
params[3] = (GLint) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][3];
break;
case GL_DEPTH_BIAS:
*params = (GLint) ctx->Pixel.DepthBias;
break;
case GL_DEPTH_BITS:
*params = ctx->Visual.depthBits;
break;
case GL_DEPTH_CLEAR_VALUE:
*params = (GLint) ctx->Depth.Clear;
break;
case GL_DEPTH_FUNC:
*params = (GLint) ctx->Depth.Func;
break;
case GL_DEPTH_RANGE:
params[0] = (GLint) ctx->Viewport.Near;
params[1] = (GLint) ctx->Viewport.Far;
break;
case GL_DEPTH_SCALE:
*params = (GLint) ctx->Pixel.DepthScale;
break;
case GL_DEPTH_TEST:
*params = (GLint) ctx->Depth.Test;
break;
case GL_DEPTH_WRITEMASK:
*params = (GLint) ctx->Depth.Mask;
break;
case GL_DITHER:
*params = (GLint) ctx->Color.DitherFlag;
break;
case GL_DOUBLEBUFFER:
*params = (GLint) ctx->Visual.doubleBufferMode;
break;
case GL_DRAW_BUFFER:
*params = (GLint) ctx->Color.DrawBuffer;
break;
case GL_EDGE_FLAG:
FLUSH_CURRENT(ctx, 0);
*params = (GLint) ctx->Current.EdgeFlag;
break;
case GL_FEEDBACK_BUFFER_SIZE:
*params = ctx->Feedback.BufferSize;
break;
case GL_FEEDBACK_BUFFER_TYPE:
*params = ctx->Feedback.Type;
break;
case GL_FOG:
*params = (GLint) ctx->Fog.Enabled;
break;
case GL_FOG_COLOR:
params[0] = FLOAT_TO_INT( ctx->Fog.Color[0] );
params[1] = FLOAT_TO_INT( ctx->Fog.Color[1] );
params[2] = FLOAT_TO_INT( ctx->Fog.Color[2] );
params[3] = FLOAT_TO_INT( ctx->Fog.Color[3] );
break;
case GL_FOG_DENSITY:
*params = (GLint) ctx->Fog.Density;
break;
case GL_FOG_END:
*params = (GLint) ctx->Fog.End;
break;
case GL_FOG_HINT:
*params = (GLint) ctx->Hint.Fog;
break;
case GL_FOG_INDEX:
*params = (GLint) ctx->Fog.Index;
break;
case GL_FOG_MODE:
*params = (GLint) ctx->Fog.Mode;
break;
case GL_FOG_START:
*params = (GLint) ctx->Fog.Start;
break;
case GL_FRONT_FACE:
*params = (GLint) ctx->Polygon.FrontFace;
break;
case GL_GREEN_BIAS:
*params = (GLint) ctx->Pixel.GreenBias;
break;
case GL_GREEN_BITS:
*params = (GLint) ctx->Visual.greenBits;
break;
case GL_GREEN_SCALE:
*params = (GLint) ctx->Pixel.GreenScale;
break;
case GL_INDEX_BITS:
*params = (GLint) ctx->Visual.indexBits;
break;
case GL_INDEX_CLEAR_VALUE:
*params = (GLint) ctx->Color.ClearIndex;
break;
case GL_INDEX_MODE:
*params = ctx->Visual.rgbMode ? 0 : 1;
break;
case GL_INDEX_OFFSET:
*params = ctx->Pixel.IndexOffset;
break;
case GL_INDEX_SHIFT:
*params = ctx->Pixel.IndexShift;
break;
case GL_INDEX_WRITEMASK:
*params = (GLint) ctx->Color.IndexMask;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
*params = (GLint) ctx->Light.Light[pname-GL_LIGHT0].Enabled;
break;
case GL_LIGHTING:
*params = (GLint) ctx->Light.Enabled;
break;
case GL_LIGHT_MODEL_AMBIENT:
params[0] = FLOAT_TO_INT( ctx->Light.Model.Ambient[0] );
params[1] = FLOAT_TO_INT( ctx->Light.Model.Ambient[1] );
params[2] = FLOAT_TO_INT( ctx->Light.Model.Ambient[2] );
params[3] = FLOAT_TO_INT( ctx->Light.Model.Ambient[3] );
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
params[0] = (GLint) ctx->Light.Model.ColorControl;
break;
case GL_LIGHT_MODEL_LOCAL_VIEWER:
*params = (GLint) ctx->Light.Model.LocalViewer;
break;
case GL_LIGHT_MODEL_TWO_SIDE:
*params = (GLint) ctx->Light.Model.TwoSide;
break;
case GL_LINE_SMOOTH:
*params = (GLint) ctx->Line.SmoothFlag;
break;
case GL_LINE_SMOOTH_HINT:
*params = (GLint) ctx->Hint.LineSmooth;
break;
case GL_LINE_STIPPLE:
*params = (GLint) ctx->Line.StippleFlag;
break;
case GL_LINE_STIPPLE_PATTERN:
*params = (GLint) ctx->Line.StipplePattern;
break;
case GL_LINE_STIPPLE_REPEAT:
*params = (GLint) ctx->Line.StippleFactor;
break;
case GL_LINE_WIDTH:
*params = (GLint) ctx->Line.Width;
break;
case GL_LINE_WIDTH_GRANULARITY:
*params = (GLint) ctx->Const.LineWidthGranularity;
break;
case GL_LINE_WIDTH_RANGE:
params[0] = (GLint) ctx->Const.MinLineWidthAA;
params[1] = (GLint) ctx->Const.MaxLineWidthAA;
break;
case GL_ALIASED_LINE_WIDTH_RANGE:
params[0] = (GLint) ctx->Const.MinLineWidth;
params[1] = (GLint) ctx->Const.MaxLineWidth;
break;
case GL_LIST_BASE:
*params = (GLint) ctx->List.ListBase;
break;
case GL_LIST_INDEX:
*params = (GLint) ctx->CurrentListNum;
break;
case GL_LIST_MODE:
*params = ctx->ExecuteFlag ? (GLint) GL_COMPILE_AND_EXECUTE
: (GLint) GL_COMPILE;
break;
case GL_INDEX_LOGIC_OP:
*params = (GLint) ctx->Color.IndexLogicOpEnabled;
break;
case GL_COLOR_LOGIC_OP:
*params = (GLint) ctx->Color.ColorLogicOpEnabled;
break;
case GL_LOGIC_OP_MODE:
*params = (GLint) ctx->Color.LogicOp;
break;
case GL_MAP1_COLOR_4:
*params = (GLint) ctx->Eval.Map1Color4;
break;
case GL_MAP1_GRID_DOMAIN:
params[0] = (GLint) ctx->Eval.MapGrid1u1;
params[1] = (GLint) ctx->Eval.MapGrid1u2;
break;
case GL_MAP1_GRID_SEGMENTS:
*params = (GLint) ctx->Eval.MapGrid1un;
break;
case GL_MAP1_INDEX:
*params = (GLint) ctx->Eval.Map1Index;
break;
case GL_MAP1_NORMAL:
*params = (GLint) ctx->Eval.Map1Normal;
break;
case GL_MAP1_TEXTURE_COORD_1:
*params = (GLint) ctx->Eval.Map1TextureCoord1;
break;
case GL_MAP1_TEXTURE_COORD_2:
*params = (GLint) ctx->Eval.Map1TextureCoord2;
break;
case GL_MAP1_TEXTURE_COORD_3:
*params = (GLint) ctx->Eval.Map1TextureCoord3;
break;
case GL_MAP1_TEXTURE_COORD_4:
*params = (GLint) ctx->Eval.Map1TextureCoord4;
break;
case GL_MAP1_VERTEX_3:
*params = (GLint) ctx->Eval.Map1Vertex3;
break;
case GL_MAP1_VERTEX_4:
*params = (GLint) ctx->Eval.Map1Vertex4;
break;
case GL_MAP2_COLOR_4:
*params = (GLint) ctx->Eval.Map2Color4;
break;
case GL_MAP2_GRID_DOMAIN:
params[0] = (GLint) ctx->Eval.MapGrid2u1;
params[1] = (GLint) ctx->Eval.MapGrid2u2;
params[2] = (GLint) ctx->Eval.MapGrid2v1;
params[3] = (GLint) ctx->Eval.MapGrid2v2;
break;
case GL_MAP2_GRID_SEGMENTS:
params[0] = (GLint) ctx->Eval.MapGrid2un;
params[1] = (GLint) ctx->Eval.MapGrid2vn;
break;
case GL_MAP2_INDEX:
*params = (GLint) ctx->Eval.Map2Index;
break;
case GL_MAP2_NORMAL:
*params = (GLint) ctx->Eval.Map2Normal;
break;
case GL_MAP2_TEXTURE_COORD_1:
*params = (GLint) ctx->Eval.Map2TextureCoord1;
break;
case GL_MAP2_TEXTURE_COORD_2:
*params = (GLint) ctx->Eval.Map2TextureCoord2;
break;
case GL_MAP2_TEXTURE_COORD_3:
*params = (GLint) ctx->Eval.Map2TextureCoord3;
break;
case GL_MAP2_TEXTURE_COORD_4:
*params = (GLint) ctx->Eval.Map2TextureCoord4;
break;
case GL_MAP2_VERTEX_3:
*params = (GLint) ctx->Eval.Map2Vertex3;
break;
case GL_MAP2_VERTEX_4:
*params = (GLint) ctx->Eval.Map2Vertex4;
break;
case GL_MAP_COLOR:
*params = (GLint) ctx->Pixel.MapColorFlag;
break;
case GL_MAP_STENCIL:
*params = (GLint) ctx->Pixel.MapStencilFlag;
break;
case GL_MATRIX_MODE:
*params = (GLint) ctx->Transform.MatrixMode;
break;
case GL_MAX_ATTRIB_STACK_DEPTH:
*params = (GLint) MAX_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
*params = (GLint) MAX_CLIENT_ATTRIB_STACK_DEPTH;
break;
case GL_MAX_CLIP_PLANES:
*params = (GLint) ctx->Const.MaxClipPlanes;
break;
case GL_MAX_ELEMENTS_VERTICES: /* GL_VERSION_1_2 */
*params = (GLint) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_ELEMENTS_INDICES: /* GL_VERSION_1_2 */
*params = (GLint) ctx->Const.MaxArrayLockSize;
break;
case GL_MAX_EVAL_ORDER:
*params = (GLint) MAX_EVAL_ORDER;
break;
case GL_MAX_LIGHTS:
*params = (GLint) ctx->Const.MaxLights;
break;
case GL_MAX_LIST_NESTING:
*params = (GLint) MAX_LIST_NESTING;
break;
case GL_MAX_MODELVIEW_STACK_DEPTH:
*params = (GLint) MAX_MODELVIEW_STACK_DEPTH;
break;
case GL_MAX_NAME_STACK_DEPTH:
*params = (GLint) MAX_NAME_STACK_DEPTH;
break;
case GL_MAX_PIXEL_MAP_TABLE:
*params = (GLint) MAX_PIXEL_MAP_TABLE;
break;
case GL_MAX_PROJECTION_STACK_DEPTH:
*params = (GLint) MAX_PROJECTION_STACK_DEPTH;
break;
case GL_MAX_TEXTURE_SIZE:
*params = (1 << (ctx->Const.MaxTextureLevels - 1));
break;
case GL_MAX_3D_TEXTURE_SIZE:
*params = (1 << (ctx->Const.Max3DTextureLevels - 1));
break;
case GL_MAX_TEXTURE_STACK_DEPTH:
*params = (GLint) MAX_TEXTURE_STACK_DEPTH;
break;
case GL_MAX_VIEWPORT_DIMS:
params[0] = (GLint) MAX_WIDTH;
params[1] = (GLint) MAX_HEIGHT;
break;
case GL_MODELVIEW_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLint) ctx->ModelviewMatrixStack.Top->m[i];
}
break;
case GL_MODELVIEW_STACK_DEPTH:
*params = (GLint) (ctx->ModelviewMatrixStack.Depth + 1);
break;
case GL_NAME_STACK_DEPTH:
*params = (GLint) ctx->Select.NameStackDepth;
break;
case GL_NORMALIZE:
*params = (GLint) ctx->Transform.Normalize;
break;
case GL_PACK_ALIGNMENT:
*params = ctx->Pack.Alignment;
break;
case GL_PACK_LSB_FIRST:
*params = (GLint) ctx->Pack.LsbFirst;
break;
case GL_PACK_ROW_LENGTH:
*params = ctx->Pack.RowLength;
break;
case GL_PACK_SKIP_PIXELS:
*params = ctx->Pack.SkipPixels;
break;
case GL_PACK_SKIP_ROWS:
*params = ctx->Pack.SkipRows;
break;
case GL_PACK_SWAP_BYTES:
*params = (GLint) ctx->Pack.SwapBytes;
break;
case GL_PACK_SKIP_IMAGES_EXT:
*params = ctx->Pack.SkipImages;
break;
case GL_PACK_IMAGE_HEIGHT_EXT:
*params = ctx->Pack.ImageHeight;
break;
case GL_PACK_INVERT_MESA:
*params = ctx->Pack.Invert;
break;
case GL_PERSPECTIVE_CORRECTION_HINT:
*params = (GLint) ctx->Hint.PerspectiveCorrection;
break;
case GL_PIXEL_MAP_A_TO_A_SIZE:
*params = ctx->Pixel.MapAtoAsize;
break;
case GL_PIXEL_MAP_B_TO_B_SIZE:
*params = ctx->Pixel.MapBtoBsize;
break;
case GL_PIXEL_MAP_G_TO_G_SIZE:
*params = ctx->Pixel.MapGtoGsize;
break;
case GL_PIXEL_MAP_I_TO_A_SIZE:
*params = ctx->Pixel.MapItoAsize;
break;
case GL_PIXEL_MAP_I_TO_B_SIZE:
*params = ctx->Pixel.MapItoBsize;
break;
case GL_PIXEL_MAP_I_TO_G_SIZE:
*params = ctx->Pixel.MapItoGsize;
break;
case GL_PIXEL_MAP_I_TO_I_SIZE:
*params = ctx->Pixel.MapItoIsize;
break;
case GL_PIXEL_MAP_I_TO_R_SIZE:
*params = ctx->Pixel.MapItoRsize;
break;
case GL_PIXEL_MAP_R_TO_R_SIZE:
*params = ctx->Pixel.MapRtoRsize;
break;
case GL_PIXEL_MAP_S_TO_S_SIZE:
*params = ctx->Pixel.MapStoSsize;
break;
case GL_POINT_SIZE:
*params = (GLint) ctx->Point.Size;
break;
case GL_POINT_SIZE_GRANULARITY:
*params = (GLint) ctx->Const.PointSizeGranularity;
break;
case GL_POINT_SIZE_RANGE:
params[0] = (GLint) ctx->Const.MinPointSizeAA;
params[1] = (GLint) ctx->Const.MaxPointSizeAA;
break;
case GL_ALIASED_POINT_SIZE_RANGE:
params[0] = (GLint) ctx->Const.MinPointSize;
params[1] = (GLint) ctx->Const.MaxPointSize;
break;
case GL_POINT_SMOOTH:
*params = (GLint) ctx->Point.SmoothFlag;
break;
case GL_POINT_SMOOTH_HINT:
*params = (GLint) ctx->Hint.PointSmooth;
break;
case GL_POINT_SIZE_MIN_EXT:
*params = (GLint) (ctx->Point.MinSize);
break;
case GL_POINT_SIZE_MAX_EXT:
*params = (GLint) (ctx->Point.MaxSize);
break;
case GL_POINT_FADE_THRESHOLD_SIZE_EXT:
*params = (GLint) (ctx->Point.Threshold);
break;
case GL_DISTANCE_ATTENUATION_EXT:
params[0] = (GLint) (ctx->Point.Params[0]);
params[1] = (GLint) (ctx->Point.Params[1]);
params[2] = (GLint) (ctx->Point.Params[2]);
break;
case GL_POLYGON_MODE:
params[0] = (GLint) ctx->Polygon.FrontMode;
params[1] = (GLint) ctx->Polygon.BackMode;
break;
case GL_POLYGON_OFFSET_BIAS_EXT: /* GL_EXT_polygon_offset */
*params = (GLint) ctx->Polygon.OffsetUnits;
break;
case GL_POLYGON_OFFSET_FACTOR:
*params = (GLint) ctx->Polygon.OffsetFactor;
break;
case GL_POLYGON_OFFSET_UNITS:
*params = (GLint) ctx->Polygon.OffsetUnits;
break;
case GL_POLYGON_SMOOTH:
*params = (GLint) ctx->Polygon.SmoothFlag;
break;
case GL_POLYGON_SMOOTH_HINT:
*params = (GLint) ctx->Hint.PolygonSmooth;
break;
case GL_POLYGON_STIPPLE:
*params = (GLint) ctx->Polygon.StippleFlag;
break;
case GL_PROJECTION_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLint) ctx->ProjectionMatrixStack.Top->m[i];
}
break;
case GL_PROJECTION_STACK_DEPTH:
*params = (GLint) (ctx->ProjectionMatrixStack.Depth + 1);
break;
case GL_READ_BUFFER:
*params = (GLint) ctx->Pixel.ReadBuffer;
break;
case GL_RED_BIAS:
*params = (GLint) ctx->Pixel.RedBias;
break;
case GL_RED_BITS:
*params = (GLint) ctx->Visual.redBits;
break;
case GL_RED_SCALE:
*params = (GLint) ctx->Pixel.RedScale;
break;
case GL_RENDER_MODE:
*params = (GLint) ctx->RenderMode;
break;
case GL_RESCALE_NORMAL:
*params = (GLint) ctx->Transform.RescaleNormals;
break;
case GL_RGBA_MODE:
*params = (GLint) ctx->Visual.rgbMode;
break;
case GL_SCISSOR_BOX:
params[0] = (GLint) ctx->Scissor.X;
params[1] = (GLint) ctx->Scissor.Y;
params[2] = (GLint) ctx->Scissor.Width;
params[3] = (GLint) ctx->Scissor.Height;
break;
case GL_SCISSOR_TEST:
*params = (GLint) ctx->Scissor.Enabled;
break;
case GL_SELECTION_BUFFER_SIZE:
*params = (GLint) ctx->Select.BufferSize;
break;
case GL_SHADE_MODEL:
*params = (GLint) ctx->Light.ShadeModel;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
*params = (GLint) ctx->Texture.SharedPalette;
break;
case GL_STENCIL_BITS:
*params = ctx->Visual.stencilBits;
break;
case GL_STENCIL_CLEAR_VALUE:
*params = (GLint) ctx->Stencil.Clear;
break;
case GL_STENCIL_FAIL:
*params = (GLint) ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_FUNC:
*params = (GLint) ctx->Stencil.Function[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_PASS_DEPTH_FAIL:
*params = (GLint) ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_PASS_DEPTH_PASS:
*params = (GLint) ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_REF:
*params = (GLint) ctx->Stencil.Ref[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_TEST:
*params = (GLint) ctx->Stencil.Enabled;
break;
case GL_STENCIL_VALUE_MASK:
*params = (GLint) ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
break;
case GL_STENCIL_WRITEMASK:
*params = (GLint) ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
break;
case GL_STEREO:
*params = (GLint) ctx->Visual.stereoMode;
break;
case GL_SUBPIXEL_BITS:
*params = ctx->Const.SubPixelBits;
break;
case GL_TEXTURE_1D:
*params = _mesa_IsEnabled(GL_TEXTURE_1D) ? 1 : 0;
break;
case GL_TEXTURE_2D:
*params = _mesa_IsEnabled(GL_TEXTURE_2D) ? 1 : 0;
break;
case GL_TEXTURE_3D:
*params = _mesa_IsEnabled(GL_TEXTURE_3D) ? 1 : 0;
break;
case GL_TEXTURE_BINDING_1D:
*params = textureUnit->Current1D->Name;
break;
case GL_TEXTURE_BINDING_2D:
*params = textureUnit->Current2D->Name;
break;
case GL_TEXTURE_BINDING_3D:
*params = textureUnit->Current3D->Name;
break;
case GL_TEXTURE_ENV_COLOR:
params[0] = FLOAT_TO_INT( textureUnit->EnvColor[0] );
params[1] = FLOAT_TO_INT( textureUnit->EnvColor[1] );
params[2] = FLOAT_TO_INT( textureUnit->EnvColor[2] );
params[3] = FLOAT_TO_INT( textureUnit->EnvColor[3] );
break;
case GL_TEXTURE_ENV_MODE:
*params = (GLint) textureUnit->EnvMode;
break;
case GL_TEXTURE_GEN_S:
*params = (textureUnit->TexGenEnabled & S_BIT) ? 1 : 0;
break;
case GL_TEXTURE_GEN_T:
*params = (textureUnit->TexGenEnabled & T_BIT) ? 1 : 0;
break;
case GL_TEXTURE_GEN_R:
*params = (textureUnit->TexGenEnabled & R_BIT) ? 1 : 0;
break;
case GL_TEXTURE_GEN_Q:
*params = (textureUnit->TexGenEnabled & Q_BIT) ? 1 : 0;
break;
case GL_TEXTURE_MATRIX:
for (i=0;i<16;i++) {
params[i] = (GLint) ctx->TextureMatrixStack[texUnit].Top->m[i];
}
break;
case GL_TEXTURE_STACK_DEPTH:
*params = (GLint) (ctx->TextureMatrixStack[texUnit].Depth + 1);
break;
case GL_UNPACK_ALIGNMENT:
*params = ctx->Unpack.Alignment;
break;
case GL_UNPACK_LSB_FIRST:
*params = (GLint) ctx->Unpack.LsbFirst;
break;
case GL_UNPACK_ROW_LENGTH:
*params = ctx->Unpack.RowLength;
break;
case GL_UNPACK_SKIP_PIXELS:
*params = ctx->Unpack.SkipPixels;
break;
case GL_UNPACK_SKIP_ROWS:
*params = ctx->Unpack.SkipRows;
break;
case GL_UNPACK_SWAP_BYTES:
*params = (GLint) ctx->Unpack.SwapBytes;
break;
case GL_UNPACK_SKIP_IMAGES_EXT:
*params = ctx->Unpack.SkipImages;
break;
case GL_UNPACK_IMAGE_HEIGHT_EXT:
*params = ctx->Unpack.ImageHeight;
break;
case GL_UNPACK_CLIENT_STORAGE_APPLE:
*params = ctx->Unpack.ClientStorage;
break;
case GL_VIEWPORT:
params[0] = (GLint) ctx->Viewport.X;
params[1] = (GLint) ctx->Viewport.Y;
params[2] = (GLint) ctx->Viewport.Width;
params[3] = (GLint) ctx->Viewport.Height;
break;
case GL_ZOOM_X:
*params = (GLint) ctx->Pixel.ZoomX;
break;
case GL_ZOOM_Y:
*params = (GLint) ctx->Pixel.ZoomY;
break;
case GL_VERTEX_ARRAY:
*params = (GLint) ctx->Array.Vertex.Enabled;
break;
case GL_VERTEX_ARRAY_SIZE:
*params = ctx->Array.Vertex.Size;
break;
case GL_VERTEX_ARRAY_TYPE:
*params = ctx->Array.Vertex.Type;
break;
case GL_VERTEX_ARRAY_STRIDE:
*params = ctx->Array.Vertex.Stride;
break;
case GL_VERTEX_ARRAY_COUNT_EXT:
*params = 0;
break;
case GL_NORMAL_ARRAY:
*params = (GLint) ctx->Array.Normal.Enabled;
break;
case GL_NORMAL_ARRAY_TYPE:
*params = ctx->Array.Normal.Type;
break;
case GL_NORMAL_ARRAY_STRIDE:
*params = ctx->Array.Normal.Stride;
break;
case GL_NORMAL_ARRAY_COUNT_EXT:
*params = 0;
break;
case GL_COLOR_ARRAY:
*params = (GLint) ctx->Array.Color.Enabled;
break;
case GL_COLOR_ARRAY_SIZE:
*params = ctx->Array.Color.Size;
break;
case GL_COLOR_ARRAY_TYPE:
*params = ctx->Array.Color.Type;
break;
case GL_COLOR_ARRAY_STRIDE:
*params = ctx->Array.Color.Stride;
break;
case GL_COLOR_ARRAY_COUNT_EXT:
*params = 0;
break;
case GL_INDEX_ARRAY:
*params = (GLint) ctx->Array.Index.Enabled;
break;
case GL_INDEX_ARRAY_TYPE:
*params = ctx->Array.Index.Type;
break;
case GL_INDEX_ARRAY_STRIDE:
*params = ctx->Array.Index.Stride;
break;
case GL_INDEX_ARRAY_COUNT_EXT:
*params = 0;
break;
case GL_TEXTURE_COORD_ARRAY:
*params = (GLint) ctx->Array.TexCoord[texUnit].Enabled;
break;
case GL_TEXTURE_COORD_ARRAY_SIZE:
*params = ctx->Array.TexCoord[texUnit].Size;
break;
case GL_TEXTURE_COORD_ARRAY_TYPE:
*params = ctx->Array.TexCoord[texUnit].Type;
break;
case GL_TEXTURE_COORD_ARRAY_STRIDE:
*params = ctx->Array.TexCoord[texUnit].Stride;
break;
case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
*params = 0;
break;
case GL_EDGE_FLAG_ARRAY:
*params = (GLint) ctx->Array.EdgeFlag.Enabled;
break;
case GL_EDGE_FLAG_ARRAY_STRIDE:
*params = ctx->Array.EdgeFlag.Stride;
break;
case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
*params = 0;
break;
 
/* GL_ARB_multitexture */
case GL_MAX_TEXTURE_UNITS_ARB:
CHECK_EXTENSION_I(ARB_multitexture, pname);
*params = ctx->Const.MaxTextureUnits;
break;
case GL_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_I(ARB_multitexture, pname);
*params = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit;
break;
case GL_CLIENT_ACTIVE_TEXTURE_ARB:
CHECK_EXTENSION_I(ARB_multitexture, pname);
*params = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
break;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
CHECK_EXTENSION_I(ARB_texture_cube_map, pname);
*params = (GLint) _mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);
break;
case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
CHECK_EXTENSION_I(ARB_texture_cube_map, pname);
*params = textureUnit->CurrentCubeMap->Name;
break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
CHECK_EXTENSION_I(ARB_texture_cube_map, pname);
*params = (1 << (ctx->Const.MaxCubeTextureLevels - 1));
break;
 
/* GL_ARB_texture_compression */
case GL_TEXTURE_COMPRESSION_HINT_ARB:
CHECK_EXTENSION_I(ARB_texture_compression, pname);
*params = (GLint) ctx->Hint.TextureCompression;
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_I(ARB_texture_compression, pname);
*params = (GLint) _mesa_get_compressed_formats(ctx, NULL);
break;
case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
CHECK_EXTENSION_I(ARB_texture_compression, pname);
(void) _mesa_get_compressed_formats(ctx, params);
break;
 
/* GL_EXT_compiled_vertex_array */
case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
CHECK_EXTENSION_I(EXT_compiled_vertex_array, pname);
*params = ctx->Array.LockFirst;
break;
case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT:
CHECK_EXTENSION_I(EXT_compiled_vertex_array, pname);
*params = ctx->Array.LockCount;
break;
 
/* GL_ARB_transpose_matrix */
case GL_TRANSPOSE_COLOR_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ColorMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLint) tm[i];
}
}
break;
case GL_TRANSPOSE_MODELVIEW_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLint) tm[i];
}
}
break;
case GL_TRANSPOSE_PROJECTION_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
for (i=0;i<16;i++) {
params[i] = (GLint) tm[i];
}
}
break;
case GL_TRANSPOSE_TEXTURE_MATRIX_ARB:
{
GLfloat tm[16];
GLuint i;
_math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
for (i=0;i<16;i++) {
params[i] = (GLint) tm[i];
}
}
break;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION_I(HP_occlusion_test, pname);
*params = (GLint) ctx->Depth.OcclusionTest;
break;
case GL_OCCLUSION_TEST_RESULT_HP:
CHECK_EXTENSION_I(HP_occlusion_test, pname);
if (ctx->Depth.OcclusionTest)
*params = (GLint) ctx->OcclusionResult;
else
*params = (GLint) ctx->OcclusionResultSaved;
/* reset flag now */
ctx->OcclusionResult = GL_FALSE;
ctx->OcclusionResultSaved = GL_FALSE;
break;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
CHECK_EXTENSION_I(SGIS_pixel_texture, pname);
*params = (GLint) ctx->Pixel.PixelTextureEnabled;
break;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
CHECK_EXTENSION_I(SGIX_pixel_texture, pname);
*params = (GLint) ctx->Pixel.PixelTextureEnabled;
break;
case GL_PIXEL_TEX_GEN_MODE_SGIX:
CHECK_EXTENSION_I(SGIX_pixel_texture, pname);
*params = (GLint) pixel_texgen_mode(ctx);
break;
 
/* GL_SGI_color_matrix (also in 1.2 imaging) */
case GL_COLOR_MATRIX_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
for (i=0;i<16;i++) {
params[i] = (GLint) ctx->ColorMatrixStack.Top->m[i];
}
break;
case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = ctx->ColorMatrixStack.Depth + 1;
break;
case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = MAX_COLOR_STACK_DEPTH;
break;
case GL_POST_COLOR_MATRIX_RED_SCALE_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixScale[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixScale[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixScale[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixScale[3];
break;
case GL_POST_COLOR_MATRIX_RED_BIAS_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixBias[0];
break;
case GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixBias[1];
break;
case GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixBias[2];
break;
case GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI:
CHECK_EXTENSION_I(SGI_color_matrix, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixBias[3];
break;
 
/* GL_EXT_convolution (also in 1.2 imaging) */
case GL_CONVOLUTION_1D_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.Convolution1DEnabled;
break;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.Convolution2DEnabled;
break;
case GL_SEPARABLE_2D:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.Separable2DEnabled;
break;
case GL_POST_CONVOLUTION_RED_SCALE_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionScale[0];
break;
case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionScale[1];
break;
case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionScale[2];
break;
case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionScale[3];
break;
case GL_POST_CONVOLUTION_RED_BIAS_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionBias[0];
break;
case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionBias[1];
break;
case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionBias[2];
break;
case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:
CHECK_EXTENSION_I(EXT_convolution, pname);
*params = (GLint) ctx->Pixel.PostConvolutionBias[2];
break;
 
/* GL_EXT_histogram (also in 1.2 imaging) */
case GL_HISTOGRAM:
CHECK_EXTENSION_I(EXT_histogram, pname);
*params = (GLint) ctx->Pixel.HistogramEnabled;
break;
case GL_MINMAX:
CHECK_EXTENSION_I(EXT_histogram, pname);
*params = (GLint) ctx->Pixel.MinMaxEnabled;
break;
 
/* GL_SGI_color_table (also in 1.2 imaging */
case GL_COLOR_TABLE_SGI:
CHECK_EXTENSION_I(SGI_color_table, pname);
*params = (GLint) ctx->Pixel.ColorTableEnabled;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
CHECK_EXTENSION_I(SGI_color_table, pname);
*params = (GLint) ctx->Pixel.PostConvolutionColorTableEnabled;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
CHECK_EXTENSION_I(SGI_color_table, pname);
*params = (GLint) ctx->Pixel.PostColorMatrixColorTableEnabled;
break;
 
 
/* GL_EXT_secondary_color */
case GL_COLOR_SUM_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
*params = (GLint) ctx->Fog.ColorSumEnabled;
break;
case GL_CURRENT_SECONDARY_COLOR_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
FLUSH_CURRENT(ctx, 0);
params[0] = FLOAT_TO_INT( (ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0]) );
params[1] = FLOAT_TO_INT( (ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1]) );
params[2] = FLOAT_TO_INT( (ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2]) );
break;
case GL_SECONDARY_COLOR_ARRAY_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
*params = (GLint) ctx->Array.SecondaryColor.Enabled;
break;
case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
*params = (GLint) ctx->Array.SecondaryColor.Type;
break;
case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
*params = (GLint) ctx->Array.SecondaryColor.Stride;
break;
case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
CHECK_EXTENSION_I(EXT_secondary_color, pname);
*params = (GLint) ctx->Array.SecondaryColor.Stride;
break;
 
/* GL_EXT_fog_coord */
case GL_CURRENT_FOG_COORDINATE_EXT:
CHECK_EXTENSION_I(EXT_fog_coord, pname);
FLUSH_CURRENT(ctx, 0);
*params = (GLint) ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
break;
case GL_FOG_COORDINATE_ARRAY_EXT:
CHECK_EXTENSION_I(EXT_fog_coord, pname);
*params = (GLint) ctx->Array.FogCoord.Enabled;
break;
case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
CHECK_EXTENSION_I(EXT_fog_coord, pname);
*params = (GLint) ctx->Array.FogCoord.Type;
break;
case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
CHECK_EXTENSION_I(EXT_fog_coord, pname);
*params = (GLint) ctx->Array.FogCoord.Stride;
break;
 
/* GL_EXT_texture_lod_bias */
case GL_MAX_TEXTURE_LOD_BIAS_EXT:
*params = (GLint) ctx->Const.MaxTextureLodBias;
break;
 
/* GL_EXT_texture_filter_anisotropic */
case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
CHECK_EXTENSION_I(EXT_texture_filter_anisotropic, pname);
*params = (GLint) ctx->Const.MaxTextureMaxAnisotropy;
break;
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.Enabled;
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.SampleAlphaToCoverage;
break;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.SampleAlphaToOne;
break;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.SampleCoverage;
break;
case GL_SAMPLE_COVERAGE_VALUE_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.SampleCoverageValue;
break;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = (GLint) ctx->Multisample.SampleCoverageInvert;
break;
case GL_SAMPLE_BUFFERS_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = 0; /* XXX fix someday */
break;
case GL_SAMPLES_ARB:
CHECK_EXTENSION_I(ARB_multisample, pname);
*params = 0; /* XXX fix someday */
break;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION_I(IBM_rasterpos_clip, pname);
*params = (GLint) ctx->Transform.RasterPositionUnclipped;
break;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLint) ctx->Point.PointSprite;
break;
case GL_POINT_SPRITE_R_MODE_NV:
CHECK_EXTENSION_B(NV_point_sprite, pname);
*params = (GLint) ctx->Point.SpriteRMode;
break;
 
/* GL_SGIS_generate_mipmap */
case GL_GENERATE_MIPMAP_HINT_SGIS:
CHECK_EXTENSION_I(SGIS_generate_mipmap, pname);
*params = (GLint) ctx->Hint.GenerateMipmap;
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->VertexProgram.Enabled;
break;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->VertexProgram.PointSizeEnabled;
break;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->VertexProgram.TwoSideEnabled;
break;
case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = MAX_PROGRAM_STACK_DEPTH;
break;
case GL_MAX_TRACK_MATRICES_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = MAX_PROGRAM_MATRICES;
break;
case GL_CURRENT_MATRIX_STACK_DEPTH_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = ctx->CurrentStack->Depth;
break;
case GL_CURRENT_MATRIX_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->Transform.MatrixMode;
break;
case GL_VERTEX_PROGRAM_BINDING_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->VertexProgram.CurrentID;
break;
case GL_PROGRAM_ERROR_POSITION_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
*params = (GLint) ctx->VertexProgram.ErrorPos;
break;
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION_I(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_VERTEX_ATTRIB_ARRAY0_NV;
*params = (GLint) ctx->Array.VertexAttrib[n].Enabled;
}
break;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP1_VERTEX_ATTRIB0_4_NV;
*params = (GLint) ctx->Eval.Map1Attrib[n];
}
break;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION_B(NV_vertex_program, pname);
{
GLuint n = (GLuint) pname - GL_MAP2_VERTEX_ATTRIB0_4_NV;
*params = (GLint) ctx->Eval.Map2Attrib[n];
}
break;
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION_I(NV_texture_rectangle, pname);
*params = (GLint) _mesa_IsEnabled(GL_TEXTURE_RECTANGLE_NV);
break;
case GL_TEXTURE_BINDING_RECTANGLE_NV:
CHECK_EXTENSION_I(NV_texture_rectangle, pname);
*params = (GLint) textureUnit->CurrentRect->Name;
break;
case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:
CHECK_EXTENSION_I(NV_texture_rectangle, pname);
*params = (GLint) ctx->Const.MaxTextureRectSize;
break;
#endif /* FEATURE_NV_vertex_program */
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION_I(EXT_stencil_two_side, pname);
*params = (GLint) ctx->Stencil.TestTwoSide;
break;
case GL_ACTIVE_STENCIL_FACE_EXT:
CHECK_EXTENSION_I(EXT_stencil_two_side, pname);
*params = (GLint) (ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT);
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv(pname=0x%x)", pname);
}
}
 
 
 
void
_mesa_GetPointerv( GLenum pname, GLvoid **params )
{
GET_CURRENT_CONTEXT(ctx);
GLuint texUnit = ctx->Texture.CurrentUnit;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!params)
return;
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetPointerv %s\n", _mesa_lookup_enum_by_nr(pname));
 
if (ctx->Driver.GetPointerv
&& (*ctx->Driver.GetPointerv)(ctx, pname, params))
return;
 
switch (pname) {
case GL_VERTEX_ARRAY_POINTER:
*params = ctx->Array.Vertex.Ptr;
break;
case GL_NORMAL_ARRAY_POINTER:
*params = ctx->Array.Normal.Ptr;
break;
case GL_COLOR_ARRAY_POINTER:
*params = ctx->Array.Color.Ptr;
break;
case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT:
*params = ctx->Array.SecondaryColor.Ptr;
break;
case GL_FOG_COORDINATE_ARRAY_POINTER_EXT:
*params = ctx->Array.FogCoord.Ptr;
break;
case GL_INDEX_ARRAY_POINTER:
*params = ctx->Array.Index.Ptr;
break;
case GL_TEXTURE_COORD_ARRAY_POINTER:
*params = ctx->Array.TexCoord[texUnit].Ptr;
break;
case GL_EDGE_FLAG_ARRAY_POINTER:
*params = ctx->Array.EdgeFlag.Ptr;
break;
case GL_FEEDBACK_BUFFER_POINTER:
*params = ctx->Feedback.Buffer;
break;
case GL_SELECTION_BUFFER_POINTER:
*params = ctx->Select.Buffer;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerv" );
return;
}
}
 
 
 
const GLubyte *
_mesa_GetString( GLenum name )
{
GET_CURRENT_CONTEXT(ctx);
static const char *vendor = "Brian Paul";
static const char *renderer = "Mesa";
static const char *version_1_2 = "1.2 Mesa 5.0";
static const char *version_1_3 = "1.3 Mesa 5.0";
static const char *version_1_4 = "1.4 Mesa 5.0";
 
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
/* this is a required driver function */
assert(ctx->Driver.GetString);
{
const GLubyte *str = (*ctx->Driver.GetString)(ctx, name);
if (str)
return str;
 
switch (name) {
case GL_VENDOR:
return (const GLubyte *) vendor;
case GL_RENDERER:
return (const GLubyte *) renderer;
case GL_VERSION:
if (ctx->Extensions.ARB_multisample &&
ctx->Extensions.ARB_multitexture &&
ctx->Extensions.ARB_texture_border_clamp &&
ctx->Extensions.ARB_texture_compression &&
ctx->Extensions.ARB_texture_cube_map &&
ctx->Extensions.EXT_texture_env_add &&
ctx->Extensions.ARB_texture_env_combine &&
ctx->Extensions.ARB_texture_env_dot3) {
if (ctx->Extensions.ARB_depth_texture &&
ctx->Extensions.ARB_shadow &&
ctx->Extensions.ARB_texture_env_crossbar &&
ctx->Extensions.ARB_texture_mirrored_repeat &&
ctx->Extensions.ARB_window_pos &&
ctx->Extensions.EXT_blend_color &&
ctx->Extensions.EXT_blend_func_separate &&
ctx->Extensions.EXT_blend_logic_op &&
ctx->Extensions.EXT_blend_minmax &&
ctx->Extensions.EXT_blend_subtract &&
ctx->Extensions.EXT_fog_coord &&
ctx->Extensions.EXT_multi_draw_arrays &&
ctx->Extensions.EXT_point_parameters && /*aka ARB*/
ctx->Extensions.EXT_secondary_color &&
ctx->Extensions.EXT_stencil_wrap &&
ctx->Extensions.SGIS_generate_mipmap) {
return (const GLubyte *) version_1_4;
}
else {
return (const GLubyte *) version_1_3;
}
}
else {
return (const GLubyte *) version_1_2;
}
case GL_EXTENSIONS:
return (const GLubyte *) _mesa_extensions_get_string(ctx);
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
return (const GLubyte *) 0;
}
}
}
 
 
/*
* Execute a glGetError command
*/
GLenum
_mesa_GetError( void )
{
GET_CURRENT_CONTEXT(ctx);
GLenum e = ctx->ErrorValue;
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glGetError <-- %s\n", _mesa_lookup_enum_by_nr(e));
 
ctx->ErrorValue = (GLenum) GL_NO_ERROR;
return e;
}
/shark/trunk/ports/mesa/src/fog.h
0,0 → 1,52
/* $Id: fog.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef FOG_H
#define FOG_H
 
 
#include "mtypes.h"
 
 
 
extern void
_mesa_Fogf(GLenum pname, GLfloat param);
 
 
extern void
_mesa_Fogi(GLenum pname, GLint param );
 
 
extern void
_mesa_Fogfv(GLenum pname, const GLfloat *params );
 
 
extern void
_mesa_Fogiv(GLenum pname, const GLint *params );
 
 
#endif
/shark/trunk/ports/mesa/src/state.c
0,0 → 1,1073
/* $Id: state.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 5.0
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* This file manages recalculation of derived values in the
* __GLcontext.
*/
 
 
#include "glheader.h"
#include "accum.h"
#include "api_loopback.h"
#include "attrib.h"
#include "blend.h"
#include "buffers.h"
#include "clip.h"
#include "colortab.h"
#include "context.h"
#include "convolve.h"
#include "depth.h"
#include "dlist.h"
#include "drawpix.h"
#include "enable.h"
#include "eval.h"
#include "get.h"
#include "feedback.h"
#include "fog.h"
#include "hint.h"
#include "histogram.h"
#include "light.h"
#include "lines.h"
#include "matrix.h"
#include "mmath.h"
#include "pixel.h"
#include "points.h"
#include "polygon.h"
#include "rastpos.h"
#include "state.h"
#include "stencil.h"
#include "teximage.h"
#include "texobj.h"
#include "texstate.h"
#include "mtypes.h"
#include "varray.h"
#if FEATURE_NV_vertex_program
#include "vpstate.h"
#endif
 
#include "math/m_matrix.h"
#include "math/m_xform.h"
 
 
static int
generic_noop(void)
{
#ifdef DEBUG
_mesa_problem(NULL, "User called no-op dispatch function");
#endif
return 0;
}
 
 
/*
* Set all pointers in the given dispatch table to point to a
* generic no-op function.
*/
void
_mesa_init_no_op_table(struct _glapi_table *table, GLuint tableSize)
{
GLuint i;
void **dispatch = (void **) table;
for (i = 0; i < tableSize; i++) {
dispatch[i] = (void *) generic_noop;
}
}
 
 
 
/*
* Initialize the given dispatch table with pointers to Mesa's
* immediate-mode commands.
*
* Pointers to begin/end object commands and a few others
* are provided via the vtxfmt interface elsewhere.
*/
void
_mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize)
{
/* first initialize all dispatch slots to no-op */
_mesa_init_no_op_table(exec, tableSize);
 
_mesa_loopback_init_api_table( exec, GL_TRUE );
 
/* load the dispatch slots we understand */
exec->Accum = _mesa_Accum;
exec->AlphaFunc = _mesa_AlphaFunc;
exec->Bitmap = _mesa_Bitmap;
exec->BlendFunc = _mesa_BlendFunc;
exec->CallList = _mesa_CallList;
exec->CallLists = _mesa_CallLists;
exec->Clear = _mesa_Clear;
exec->ClearAccum = _mesa_ClearAccum;
exec->ClearColor = _mesa_ClearColor;
exec->ClearDepth = _mesa_ClearDepth;
exec->ClearIndex = _mesa_ClearIndex;
exec->ClearStencil = _mesa_ClearStencil;
exec->ClipPlane = _mesa_ClipPlane;
exec->ColorMask = _mesa_ColorMask;
exec->ColorMaterial = _mesa_ColorMaterial;
exec->CopyPixels = _mesa_CopyPixels;
exec->CullFace = _mesa_CullFace;
exec->DeleteLists = _mesa_DeleteLists;
exec->DepthFunc = _mesa_DepthFunc;
exec->DepthMask = _mesa_DepthMask;
exec->DepthRange = _mesa_DepthRange;
exec->Disable = _mesa_Disable;
exec->DrawBuffer = _mesa_DrawBuffer;
exec->DrawPixels = _mesa_DrawPixels;
exec->Enable = _mesa_Enable;
exec->EndList = _mesa_EndList;
exec->FeedbackBuffer = _mesa_FeedbackBuffer;
exec->Finish = _mesa_Finish;
exec->Flush = _mesa_Flush;
exec->FogCoordPointerEXT = _mesa_FogCoordPointerEXT;
exec->Fogf = _mesa_Fogf;
exec->Fogfv = _mesa_Fogfv;
exec->Fogi = _mesa_Fogi;
exec->Fogiv = _mesa_Fogiv;
exec->FrontFace = _mesa_FrontFace;
exec->Frustum = _mesa_Frustum;
exec->GenLists = _mesa_GenLists;
exec->GetBooleanv = _mesa_GetBooleanv;
exec->GetClipPlane = _mesa_GetClipPlane;
exec->GetDoublev = _mesa_GetDoublev;
exec->GetError = _mesa_GetError;
exec->GetFloatv = _mesa_GetFloatv;
exec->GetIntegerv = _mesa_GetIntegerv;
exec->GetLightfv = _mesa_GetLightfv;
exec->GetLightiv = _mesa_GetLightiv;
exec->GetMapdv = _mesa_GetMapdv;
exec->GetMapfv = _mesa_GetMapfv;
exec->GetMapiv = _mesa_GetMapiv;
exec->GetMaterialfv = _mesa_GetMaterialfv;
exec->GetMaterialiv = _mesa_GetMaterialiv;
exec->GetPixelMapfv = _mesa_GetPixelMapfv;
exec->GetPixelMapuiv = _mesa_GetPixelMapuiv;
exec->GetPixelMapusv = _mesa_GetPixelMapusv;
exec->GetPolygonStipple = _mesa_GetPolygonStipple;
exec->GetString = _mesa_GetString;
exec->GetTexEnvfv = _mesa_GetTexEnvfv;
exec->GetTexEnviv = _mesa_GetTexEnviv;
exec->GetTexGendv = _mesa_GetTexGendv;
exec->GetTexGenfv = _mesa_GetTexGenfv;
exec->GetTexGeniv = _mesa_GetTexGeniv;
exec->GetTexImage = _mesa_GetTexImage;
exec->GetTexLevelParameterfv = _mesa_GetTexLevelParameterfv;
exec->GetTexLevelParameteriv = _mesa_GetTexLevelParameteriv;
exec->GetTexParameterfv = _mesa_GetTexParameterfv;
exec->GetTexParameteriv = _mesa_GetTexParameteriv;
exec->Hint = _mesa_Hint;
exec->IndexMask = _mesa_IndexMask;
exec->InitNames = _mesa_InitNames;
exec->IsEnabled = _mesa_IsEnabled;
exec->IsList = _mesa_IsList;
exec->LightModelf = _mesa_LightModelf;
exec->LightModelfv = _mesa_LightModelfv;
exec->LightModeli = _mesa_LightModeli;
exec->LightModeliv = _mesa_LightModeliv;
exec->Lightf = _mesa_Lightf;
exec->Lightfv = _mesa_Lightfv;
exec->Lighti = _mesa_Lighti;
exec->Lightiv = _mesa_Lightiv;
exec->LineStipple = _mesa_LineStipple;
exec->LineWidth = _mesa_LineWidth;
exec->ListBase = _mesa_ListBase;
exec->LoadIdentity = _mesa_LoadIdentity;
exec->LoadMatrixd = _mesa_LoadMatrixd;
exec->LoadMatrixf = _mesa_LoadMatrixf;
exec->LoadName = _mesa_LoadName;
exec->LogicOp = _mesa_LogicOp;
exec->Map1d = _mesa_Map1d;
exec->Map1f = _mesa_Map1f;
exec->Map2d = _mesa_Map2d;
exec->Map2f = _mesa_Map2f;
exec->MapGrid1d = _mesa_MapGrid1d;
exec->MapGrid1f = _mesa_MapGrid1f;
exec->MapGrid2d = _mesa_MapGrid2d;
exec->MapGrid2f = _mesa_MapGrid2f;
exec->MatrixMode = _mesa_MatrixMode;
exec->MultMatrixd = _mesa_MultMatrixd;
exec->MultMatrixf = _mesa_MultMatrixf;
exec->NewList = _mesa_NewList;
exec->Ortho = _mesa_Ortho;
exec->PassThrough = _mesa_PassThrough;
exec->PixelMapfv = _mesa_PixelMapfv;
exec->PixelMapuiv = _mesa_PixelMapuiv;
exec->PixelMapusv = _mesa_PixelMapusv;
exec->PixelStoref = _mesa_PixelStoref;
exec->PixelStorei = _mesa_PixelStorei;
exec->PixelTransferf = _mesa_PixelTransferf;
exec->PixelTransferi = _mesa_PixelTransferi;
exec->PixelZoom = _mesa_PixelZoom;
exec->PointSize = _mesa_PointSize;
exec->PolygonMode = _mesa_PolygonMode;
exec->PolygonOffset = _mesa_PolygonOffset;
exec->PolygonStipple = _mesa_PolygonStipple;
exec->PopAttrib = _mesa_PopAttrib;
exec->PopMatrix = _mesa_PopMatrix;
exec->PopName = _mesa_PopName;
exec->PushAttrib = _mesa_PushAttrib;
exec->PushMatrix = _mesa_PushMatrix;
exec->PushName = _mesa_PushName;
exec->RasterPos2d = _mesa_RasterPos2d;
exec->RasterPos2dv = _mesa_RasterPos2dv;
exec->RasterPos2f = _mesa_RasterPos2f;
exec->RasterPos2fv = _mesa_RasterPos2fv;
exec->RasterPos2i = _mesa_RasterPos2i;
exec->RasterPos2iv = _mesa_RasterPos2iv;
exec->RasterPos2s = _mesa_RasterPos2s;
exec->RasterPos2sv = _mesa_RasterPos2sv;
exec->RasterPos3d = _mesa_RasterPos3d;
exec->RasterPos3dv = _mesa_RasterPos3dv;
exec->RasterPos3f = _mesa_RasterPos3f;
exec->RasterPos3fv = _mesa_RasterPos3fv;
exec->RasterPos3i = _mesa_RasterPos3i;
exec->RasterPos3iv = _mesa_RasterPos3iv;
exec->RasterPos3s = _mesa_RasterPos3s;
exec->RasterPos3sv = _mesa_RasterPos3sv;
exec->RasterPos4d = _mesa_RasterPos4d;
exec->RasterPos4dv = _mesa_RasterPos4dv;
exec->RasterPos4f = _mesa_RasterPos4f;
exec->RasterPos4fv = _mesa_RasterPos4fv;
exec->RasterPos4i = _mesa_RasterPos4i;
exec->RasterPos4iv = _mesa_RasterPos4iv;
exec->RasterPos4s = _mesa_RasterPos4s;
exec->RasterPos4sv = _mesa_RasterPos4sv;
exec->ReadBuffer = _mesa_ReadBuffer;
exec->ReadPixels = _mesa_ReadPixels;
exec->RenderMode = _mesa_RenderMode;
exec->Rotated = _mesa_Rotated;
exec->Rotatef = _mesa_Rotatef;
exec->Scaled = _mesa_Scaled;
exec->Scalef = _mesa_Scalef;
exec->Scissor = _mesa_Scissor;
exec->SecondaryColorPointerEXT = _mesa_SecondaryColorPointerEXT;
exec->SelectBuffer = _mesa_SelectBuffer;
exec->ShadeModel = _mesa_ShadeModel;
exec->StencilFunc = _mesa_StencilFunc;
exec->StencilMask = _mesa_StencilMask;
exec->StencilOp = _mesa_StencilOp;
exec->TexEnvf = _mesa_TexEnvf;
exec->TexEnvfv = _mesa_TexEnvfv;
exec->TexEnvi = _mesa_TexEnvi;
exec->TexEnviv = _mesa_TexEnviv;
exec->TexGend = _mesa_TexGend;
exec->TexGendv = _mesa_TexGendv;
exec->TexGenf = _mesa_TexGenf;
exec->TexGenfv = _mesa_TexGenfv;
exec->TexGeni = _mesa_TexGeni;
exec->TexGeniv = _mesa_TexGeniv;
exec->TexImage1D = _mesa_TexImage1D;
exec->TexImage2D = _mesa_TexImage2D;
exec->TexParameterf = _mesa_TexParameterf;
exec->TexParameterfv = _mesa_TexParameterfv;
exec->TexParameteri = _mesa_TexParameteri;
exec->TexParameteriv = _mesa_TexParameteriv;
exec->Translated = _mesa_Translated;
exec->Translatef = _mesa_Translatef;
exec->Viewport = _mesa_Viewport;
 
/* 1.1 */
exec->AreTexturesResident = _mesa_AreTexturesResident;
exec->AreTexturesResidentEXT = _mesa_AreTexturesResident;
exec->BindTexture = _mesa_BindTexture;
exec->ColorPointer = _mesa_ColorPointer;
exec->CopyTexImage1D = _mesa_CopyTexImage1D;
exec->CopyTexImage2D = _mesa_CopyTexImage2D;
exec->CopyTexSubImage1D = _mesa_CopyTexSubImage1D;
exec->CopyTexSubImage2D = _mesa_CopyTexSubImage2D;
exec->DeleteTextures = _mesa_DeleteTextures;
exec->DisableClientState = _mesa_DisableClientState;
exec->EdgeFlagPointer = _mesa_EdgeFlagPointer;
exec->EnableClientState = _mesa_EnableClientState;
exec->GenTextures = _mesa_GenTextures;
exec->GenTexturesEXT = _mesa_GenTextures;
exec->GetPointerv = _mesa_GetPointerv;
exec->IndexPointer = _mesa_IndexPointer;
exec->InterleavedArrays = _mesa_InterleavedArrays;
exec->IsTexture = _mesa_IsTexture;
exec->IsTextureEXT = _mesa_IsTexture;
exec->NormalPointer = _mesa_NormalPointer;
exec->PopClientAttrib = _mesa_PopClientAttrib;
exec->PrioritizeTextures = _mesa_PrioritizeTextures;
exec->PushClientAttrib = _mesa_PushClientAttrib;
exec->TexCoordPointer = _mesa_TexCoordPointer;
exec->TexSubImage1D = _mesa_TexSubImage1D;
exec->TexSubImage2D = _mesa_TexSubImage2D;
exec->VertexPointer = _mesa_VertexPointer;
 
/* 1.2 */
exec->CopyTexSubImage3D = _mesa_CopyTexSubImage3D;
exec->TexImage3D = _mesa_TexImage3D;
exec->TexSubImage3D = _mesa_TexSubImage3D;
 
/* OpenGL 1.2 GL_ARB_imaging */
exec->BlendColor = _mesa_BlendColor;
exec->BlendEquation = _mesa_BlendEquation;
exec->ColorSubTable = _mesa_ColorSubTable;
exec->ColorTable = _mesa_ColorTable;
exec->ColorTableParameterfv = _mesa_ColorTableParameterfv;
exec->ColorTableParameteriv = _mesa_ColorTableParameteriv;
exec->ConvolutionFilter1D = _mesa_ConvolutionFilter1D;
exec->ConvolutionFilter2D = _mesa_ConvolutionFilter2D;
exec->ConvolutionParameterf = _mesa_ConvolutionParameterf;
exec->ConvolutionParameterfv = _mesa_ConvolutionParameterfv;
exec->ConvolutionParameteri = _mesa_ConvolutionParameteri;
exec->ConvolutionParameteriv = _mesa_ConvolutionParameteriv;
exec->CopyColorSubTable = _mesa_CopyColorSubTable;
exec->CopyColorTable = _mesa_CopyColorTable;
exec->CopyConvolutionFilter1D = _mesa_CopyConvolutionFilter1D;
exec->CopyConvolutionFilter2D = _mesa_CopyConvolutionFilter2D;
exec->GetColorTable = _mesa_GetColorTable;
exec->GetColorTableEXT = _mesa_GetColorTable;
exec->GetColorTableParameterfv = _mesa_GetColorTableParameterfv;
exec->GetColorTableParameterfvEXT = _mesa_GetColorTableParameterfv;
exec->GetColorTableParameteriv = _mesa_GetColorTableParameteriv;
exec->GetColorTableParameterivEXT = _mesa_GetColorTableParameteriv;
exec->GetConvolutionFilter = _mesa_GetConvolutionFilter;
exec->GetConvolutionFilterEXT = _mesa_GetConvolutionFilter;
exec->GetConvolutionParameterfv = _mesa_GetConvolutionParameterfv;
exec->GetConvolutionParameterfvEXT = _mesa_GetConvolutionParameterfv;
exec->GetConvolutionParameteriv = _mesa_GetConvolutionParameteriv;
exec->GetConvolutionParameterivEXT = _mesa_GetConvolutionParameteriv;
exec->GetHistogram = _mesa_GetHistogram;
exec->GetHistogramEXT = _mesa_GetHistogram;
exec->GetHistogramParameterfv = _mesa_GetHistogramParameterfv;
exec->GetHistogramParameterfvEXT = _mesa_GetHistogramParameterfv;
exec->GetHistogramParameteriv = _mesa_GetHistogramParameteriv;
exec->GetHistogramParameterivEXT = _mesa_GetHistogramParameteriv;
exec->GetMinmax = _mesa_GetMinmax;
exec->GetMinmaxEXT = _mesa_GetMinmax;
exec->GetMinmaxParameterfv = _mesa_GetMinmaxParameterfv;
exec->GetMinmaxParameterfvEXT = _mesa_GetMinmaxParameterfv;
exec->GetMinmaxParameteriv = _mesa_GetMinmaxParameteriv;
exec->GetMinmaxParameterivEXT = _mesa_GetMinmaxParameteriv;
exec->GetSeparableFilter = _mesa_GetSeparableFilter;
exec->GetSeparableFilterEXT = _mesa_GetSeparableFilter;
exec->Histogram = _mesa_Histogram;
exec->Minmax = _mesa_Minmax;
exec->ResetHistogram = _mesa_ResetHistogram;
exec->ResetMinmax = _mesa_ResetMinmax;
exec->SeparableFilter2D = _mesa_SeparableFilter2D;
 
/* 2. GL_EXT_blend_color */
#if 0
exec->BlendColorEXT = _mesa_BlendColorEXT;
#endif
 
/* 3. GL_EXT_polygon_offset */
exec->PolygonOffsetEXT = _mesa_PolygonOffsetEXT;
 
/* 6. GL_EXT_texture3d */
#if 0
exec->CopyTexSubImage3DEXT = _mesa_CopyTexSubImage3D;
exec->TexImage3DEXT = _mesa_TexImage3DEXT;
exec->TexSubImage3DEXT = _mesa_TexSubImage3D;
#endif
 
/* 11. GL_EXT_histogram */
exec->GetHistogramEXT = _mesa_GetHistogram;
exec->GetHistogramParameterfvEXT = _mesa_GetHistogramParameterfv;
exec->GetHistogramParameterivEXT = _mesa_GetHistogramParameteriv;
exec->GetMinmaxEXT = _mesa_GetMinmax;
exec->GetMinmaxParameterfvEXT = _mesa_GetMinmaxParameterfv;
exec->GetMinmaxParameterivEXT = _mesa_GetMinmaxParameteriv;
 
/* ?. GL_SGIX_pixel_texture */
exec->PixelTexGenSGIX = _mesa_PixelTexGenSGIX;
 
/* 15. GL_SGIS_pixel_texture */
exec->PixelTexGenParameteriSGIS = _mesa_PixelTexGenParameteriSGIS;
exec->PixelTexGenParameterivSGIS = _mesa_PixelTexGenParameterivSGIS;
exec->PixelTexGenParameterfSGIS = _mesa_PixelTexGenParameterfSGIS;
exec->PixelTexGenParameterfvSGIS = _mesa_PixelTexGenParameterfvSGIS;
exec->GetPixelTexGenParameterivSGIS = _mesa_GetPixelTexGenParameterivSGIS;
exec->GetPixelTexGenParameterfvSGIS = _mesa_GetPixelTexGenParameterfvSGIS;
 
/* 30. GL_EXT_vertex_array */
exec->ColorPointerEXT = _mesa_ColorPointerEXT;
exec->EdgeFlagPointerEXT = _mesa_EdgeFlagPointerEXT;
exec->IndexPointerEXT = _mesa_IndexPointerEXT;
exec->NormalPointerEXT = _mesa_NormalPointerEXT;
exec->TexCoordPointerEXT = _mesa_TexCoordPointerEXT;
exec->VertexPointerEXT = _mesa_VertexPointerEXT;
 
/* 37. GL_EXT_blend_minmax */
#if 0
exec->BlendEquationEXT = _mesa_BlendEquationEXT;
#endif
 
/* 54. GL_EXT_point_parameters */
exec->PointParameterfEXT = _mesa_PointParameterfEXT;
exec->PointParameterfvEXT = _mesa_PointParameterfvEXT;
 
/* 78. GL_EXT_paletted_texture */
#if 0
exec->ColorTableEXT = _mesa_ColorTableEXT;
exec->ColorSubTableEXT = _mesa_ColorSubTableEXT;
#endif
exec->GetColorTableEXT = _mesa_GetColorTable;
exec->GetColorTableParameterfvEXT = _mesa_GetColorTableParameterfv;
exec->GetColorTableParameterivEXT = _mesa_GetColorTableParameteriv;
 
/* 97. GL_EXT_compiled_vertex_array */
exec->LockArraysEXT = _mesa_LockArraysEXT;
exec->UnlockArraysEXT = _mesa_UnlockArraysEXT;
 
/* 148. GL_EXT_multi_draw_arrays */
exec->MultiDrawArraysEXT = _mesa_MultiDrawArraysEXT;
exec->MultiDrawElementsEXT = _mesa_MultiDrawElementsEXT;
 
/* 173. GL_INGR_blend_func_separate */
exec->BlendFuncSeparateEXT = _mesa_BlendFuncSeparateEXT;
 
/* 196. GL_MESA_resize_buffers */
exec->ResizeBuffersMESA = _mesa_ResizeBuffersMESA;
 
/* 197. GL_MESA_window_pos */
exec->WindowPos2dMESA = _mesa_WindowPos2dMESA;
exec->WindowPos2dvMESA = _mesa_WindowPos2dvMESA;
exec->WindowPos2fMESA = _mesa_WindowPos2fMESA;
exec->WindowPos2fvMESA = _mesa_WindowPos2fvMESA;
exec->WindowPos2iMESA = _mesa_WindowPos2iMESA;
exec->WindowPos2ivMESA = _mesa_WindowPos2ivMESA;
exec->WindowPos2sMESA = _mesa_WindowPos2sMESA;
exec->WindowPos2svMESA = _mesa_WindowPos2svMESA;
exec->WindowPos3dMESA = _mesa_WindowPos3dMESA;
exec->WindowPos3dvMESA = _mesa_WindowPos3dvMESA;
exec->WindowPos3fMESA = _mesa_WindowPos3fMESA;
exec->WindowPos3fvMESA = _mesa_WindowPos3fvMESA;
exec->WindowPos3iMESA = _mesa_WindowPos3iMESA;
exec->WindowPos3ivMESA = _mesa_WindowPos3ivMESA;
exec->WindowPos3sMESA = _mesa_WindowPos3sMESA;
exec->WindowPos3svMESA = _mesa_WindowPos3svMESA;
exec->WindowPos4dMESA = _mesa_WindowPos4dMESA;
exec->WindowPos4dvMESA = _mesa_WindowPos4dvMESA;
exec->WindowPos4fMESA = _mesa_WindowPos4fMESA;
exec->WindowPos4fvMESA = _mesa_WindowPos4fvMESA;
exec->WindowPos4iMESA = _mesa_WindowPos4iMESA;
exec->WindowPos4ivMESA = _mesa_WindowPos4ivMESA;
exec->WindowPos4sMESA = _mesa_WindowPos4sMESA;
exec->WindowPos4svMESA = _mesa_WindowPos4svMESA;
 
/* 233. GL_NV_vertex_program */
#if FEATURE_NV_vertex_program
exec->BindProgramNV = _mesa_BindProgramNV;
exec->DeleteProgramsNV = _mesa_DeleteProgramsNV;
exec->ExecuteProgramNV = _mesa_ExecuteProgramNV;
exec->GenProgramsNV = _mesa_GenProgramsNV;
exec->AreProgramsResidentNV = _mesa_AreProgramsResidentNV;
exec->RequestResidentProgramsNV = _mesa_RequestResidentProgramsNV;
exec->GetProgramParameterfvNV = _mesa_GetProgramParameterfvNV;
exec->GetProgramParameterdvNV = _mesa_GetProgramParameterdvNV;
exec->GetProgramivNV = _mesa_GetProgramivNV;
exec->GetProgramStringNV = _mesa_GetProgramStringNV;
exec->GetTrackMatrixivNV = _mesa_GetTrackMatrixivNV;
exec->GetVertexAttribdvNV = _mesa_GetVertexAttribdvNV;
exec->GetVertexAttribfvNV = _mesa_GetVertexAttribfvNV;
exec->GetVertexAttribivNV = _mesa_GetVertexAttribivNV;
exec->GetVertexAttribPointervNV = _mesa_GetVertexAttribPointervNV;
exec->IsProgramNV = _mesa_IsProgramNV;
exec->LoadProgramNV = _mesa_LoadProgramNV;
exec->ProgramParameter4dNV = _mesa_ProgramParameter4dNV;
exec->ProgramParameter4dvNV = _mesa_ProgramParameter4dvNV;
exec->ProgramParameter4fNV = _mesa_ProgramParameter4fNV;
exec->ProgramParameter4fvNV = _mesa_ProgramParameter4fvNV;
exec->ProgramParameters4dvNV = _mesa_ProgramParameters4dvNV;
exec->ProgramParameters4fvNV = _mesa_ProgramParameters4fvNV;
exec->TrackMatrixNV = _mesa_TrackMatrixNV;
exec->VertexAttribPointerNV = _mesa_VertexAttribPointerNV;
#endif
 
/* 262. GL_NV_point_sprite */
exec->PointParameteriNV = _mesa_PointParameteriNV;
exec->PointParameterivNV = _mesa_PointParameterivNV;
 
/* 268. GL_EXT_stencil_two_side */
exec->ActiveStencilFaceEXT = _mesa_ActiveStencilFaceEXT;
 
/* ARB 1. GL_ARB_multitexture */
exec->ActiveTextureARB = _mesa_ActiveTextureARB;
exec->ClientActiveTextureARB = _mesa_ClientActiveTextureARB;
 
/* ARB 3. GL_ARB_transpose_matrix */
exec->LoadTransposeMatrixdARB = _mesa_LoadTransposeMatrixdARB;
exec->LoadTransposeMatrixfARB = _mesa_LoadTransposeMatrixfARB;
exec->MultTransposeMatrixdARB = _mesa_MultTransposeMatrixdARB;
exec->MultTransposeMatrixfARB = _mesa_MultTransposeMatrixfARB;
 
/* ARB 5. GL_ARB_multisample */
exec->SampleCoverageARB = _mesa_SampleCoverageARB;
 
/* ARB 12. GL_ARB_texture_compression */
exec->CompressedTexImage3DARB = _mesa_CompressedTexImage3DARB;
exec->CompressedTexImage2DARB = _mesa_CompressedTexImage2DARB;
exec->CompressedTexImage1DARB = _mesa_CompressedTexImage1DARB;
exec->CompressedTexSubImage3DARB = _mesa_CompressedTexSubImage3DARB;
exec->CompressedTexSubImage2DARB = _mesa_CompressedTexSubImage2DARB;
exec->CompressedTexSubImage1DARB = _mesa_CompressedTexSubImage1DARB;
exec->GetCompressedTexImageARB = _mesa_GetCompressedTexImageARB;
 
/* ARB 14. GL_ARB_point_parameters */
/* reuse EXT_point_parameters functions */
}
 
 
 
/**********************************************************************/
/***** State update logic *****/
/**********************************************************************/
 
 
/*
* Check polygon state and set DD_TRI_CULL_FRONT_BACK and/or DD_TRI_OFFSET
* in ctx->_TriangleCaps if needed.
*/
static void
update_polygon( GLcontext *ctx )
{
ctx->_TriangleCaps &= ~(DD_TRI_CULL_FRONT_BACK | DD_TRI_OFFSET);
 
if (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
ctx->_TriangleCaps |= DD_TRI_CULL_FRONT_BACK;
 
/* Any Polygon offsets enabled? */
if (ctx->Polygon.OffsetPoint ||
ctx->Polygon.OffsetLine ||
ctx->Polygon.OffsetFill) {
ctx->_TriangleCaps |= DD_TRI_OFFSET;
}
}
 
static void
calculate_model_project_matrix( GLcontext *ctx )
{
_math_matrix_mul_matrix( &ctx->_ModelProjectMatrix,
ctx->ProjectionMatrixStack.Top,
ctx->ModelviewMatrixStack.Top );
 
_math_matrix_analyse( &ctx->_ModelProjectMatrix );
}
 
static void
update_modelview_scale( GLcontext *ctx )
{
ctx->_ModelViewInvScale = 1.0F;
if (ctx->ModelviewMatrixStack.Top->flags & (MAT_FLAG_UNIFORM_SCALE |
MAT_FLAG_GENERAL_SCALE |
MAT_FLAG_GENERAL_3D |
MAT_FLAG_GENERAL) ) {
const GLfloat *m = ctx->ModelviewMatrixStack.Top->inv;
GLfloat f = m[2] * m[2] + m[6] * m[6] + m[10] * m[10];
if (f < 1e-12) f = 1.0;
if (ctx->_NeedEyeCoords)
ctx->_ModelViewInvScale = (GLfloat) (1.0/GL_SQRT(f));
else
ctx->_ModelViewInvScale = (GLfloat) GL_SQRT(f);
}
}
 
 
/* Bring uptodate any state that relies on _NeedEyeCoords.
*/
static void
update_tnl_spaces( GLcontext *ctx, GLuint oldneedeyecoords )
{
/* Check if the truth-value interpretations of the bitfields have
* changed:
*/
if ((oldneedeyecoords == 0) != (ctx->_NeedEyeCoords == 0)) {
/* Recalculate all state that depends on _NeedEyeCoords.
*/
update_modelview_scale(ctx);
_mesa_compute_light_positions( ctx );
 
if (ctx->Driver.LightingSpaceChange)
ctx->Driver.LightingSpaceChange( ctx );
}
else {
GLuint new_state = ctx->NewState;
 
/* Recalculate that same state only if it has been invalidated
* by other statechanges.
*/
if (new_state & _NEW_MODELVIEW)
update_modelview_scale(ctx);
 
if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW))
_mesa_compute_light_positions( ctx );
}
}
 
 
static void
update_drawbuffer( GLcontext *ctx )
{
ctx->DrawBuffer->_Xmin = 0;
ctx->DrawBuffer->_Ymin = 0;
ctx->DrawBuffer->_Xmax = ctx->DrawBuffer->Width;
ctx->DrawBuffer->_Ymax = ctx->DrawBuffer->Height;
if (ctx->Scissor.Enabled) {
if (ctx->Scissor.X > ctx->DrawBuffer->_Xmin) {
ctx->DrawBuffer->_Xmin = ctx->Scissor.X;
}
if (ctx->Scissor.Y > ctx->DrawBuffer->_Ymin) {
ctx->DrawBuffer->_Ymin = ctx->Scissor.Y;
}
if (ctx->Scissor.X + ctx->Scissor.Width < ctx->DrawBuffer->_Xmax) {
ctx->DrawBuffer->_Xmax = ctx->Scissor.X + ctx->Scissor.Width;
}
if (ctx->Scissor.Y + ctx->Scissor.Height < ctx->DrawBuffer->_Ymax) {
ctx->DrawBuffer->_Ymax = ctx->Scissor.Y + ctx->Scissor.Height;
}
}
}
 
 
/* NOTE: This routine references Tranform attribute values to compute
* userclip positions in clip space, but is only called on
* _NEW_PROJECTION. The _mesa_ClipPlane() function keeps these values
* up to date across changes to the Transform attributes.
*/
static void
update_projection( GLcontext *ctx )
{
_math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
/* Recompute clip plane positions in clipspace. This is also done
* in _mesa_ClipPlane().
*/
if (ctx->Transform.ClipPlanesEnabled) {
GLuint p;
for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
_mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
ctx->Transform.EyeUserPlane[p],
ctx->ProjectionMatrixStack.Top->inv );
}
}
}
}
 
 
/*
* Return a bitmask of IMAGE_*_BIT flags which to indicate which
* pixel transfer operations are enabled.
*/
static void
update_image_transfer_state(GLcontext *ctx)
{
GLuint mask = 0;
 
if (ctx->Pixel.RedScale != 1.0F || ctx->Pixel.RedBias != 0.0F ||
ctx->Pixel.GreenScale != 1.0F || ctx->Pixel.GreenBias != 0.0F ||
ctx->Pixel.BlueScale != 1.0F || ctx->Pixel.BlueBias != 0.0F ||
ctx->Pixel.AlphaScale != 1.0F || ctx->Pixel.AlphaBias != 0.0F)
mask |= IMAGE_SCALE_BIAS_BIT;
 
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset)
mask |= IMAGE_SHIFT_OFFSET_BIT;
 
if (ctx->Pixel.MapColorFlag)
mask |= IMAGE_MAP_COLOR_BIT;
 
if (ctx->Pixel.ColorTableEnabled)
mask |= IMAGE_COLOR_TABLE_BIT;
 
if (ctx->Pixel.Convolution1DEnabled ||
ctx->Pixel.Convolution2DEnabled ||
ctx->Pixel.Separable2DEnabled) {
mask |= IMAGE_CONVOLUTION_BIT;
if (ctx->Pixel.PostConvolutionScale[0] != 1.0F ||
ctx->Pixel.PostConvolutionScale[1] != 1.0F ||
ctx->Pixel.PostConvolutionScale[2] != 1.0F ||
ctx->Pixel.PostConvolutionScale[3] != 1.0F ||
ctx->Pixel.PostConvolutionBias[0] != 0.0F ||
ctx->Pixel.PostConvolutionBias[1] != 0.0F ||
ctx->Pixel.PostConvolutionBias[2] != 0.0F ||
ctx->Pixel.PostConvolutionBias[3] != 0.0F) {
mask |= IMAGE_POST_CONVOLUTION_SCALE_BIAS;
}
}
 
if (ctx->Pixel.PostConvolutionColorTableEnabled)
mask |= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT;
 
if (ctx->ColorMatrixStack.Top->type != MATRIX_IDENTITY ||
ctx->Pixel.PostColorMatrixScale[0] != 1.0F ||
ctx->Pixel.PostColorMatrixBias[0] != 0.0F ||
ctx->Pixel.PostColorMatrixScale[1] != 1.0F ||
ctx->Pixel.PostColorMatrixBias[1] != 0.0F ||
ctx->Pixel.PostColorMatrixScale[2] != 1.0F ||
ctx->Pixel.PostColorMatrixBias[2] != 0.0F ||
ctx->Pixel.PostColorMatrixScale[3] != 1.0F ||
ctx->Pixel.PostColorMatrixBias[3] != 0.0F)
mask |= IMAGE_COLOR_MATRIX_BIT;
 
if (ctx->Pixel.PostColorMatrixColorTableEnabled)
mask |= IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT;
 
if (ctx->Pixel.HistogramEnabled)
mask |= IMAGE_HISTOGRAM_BIT;
 
if (ctx->Pixel.MinMaxEnabled)
mask |= IMAGE_MIN_MAX_BIT;
 
ctx->_ImageTransferState = mask;
}
 
 
 
 
/* Note: This routine refers to derived texture attribute values to
* compute the ENABLE_TEXMAT flags, but is only called on
* _NEW_TEXTURE_MATRIX. On changes to _NEW_TEXTURE, the ENABLE_TEXMAT
* flags are updated by _mesa_update_textures(), below.
*
* If both TEXTURE and TEXTURE_MATRIX change at once, these values
* will be computed twice.
*/
static void
update_texture_matrices( GLcontext *ctx )
{
GLuint i;
 
ctx->Texture._TexMatEnabled = 0;
 
for (i=0; i < ctx->Const.MaxTextureUnits; i++) {
if (ctx->TextureMatrixStack[i].Top->flags & MAT_DIRTY) {
_math_matrix_analyse( ctx->TextureMatrixStack[i].Top );
 
if (ctx->Texture.Unit[i]._ReallyEnabled &&
ctx->TextureMatrixStack[i].Top->type != MATRIX_IDENTITY)
ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(i);
 
if (ctx->Driver.TextureMatrix)
ctx->Driver.TextureMatrix( ctx, i, ctx->TextureMatrixStack[i].Top);
}
}
}
 
 
/* Note: This routine refers to derived texture matrix values to
* compute the ENABLE_TEXMAT flags, but is only called on
* _NEW_TEXTURE. On changes to _NEW_TEXTURE_MATRIX, the ENABLE_TEXMAT
* flags are updated by _mesa_update_texture_matrices, above.
*
* If both TEXTURE and TEXTURE_MATRIX change at once, these values
* will be computed twice.
*/
static void
update_texture_state( GLcontext *ctx )
{
GLuint unit;
 
ctx->Texture._EnabledUnits = 0;
ctx->Texture._GenFlags = 0;
ctx->_NeedNormals &= ~NEED_NORMALS_TEXGEN;
ctx->_NeedEyeCoords &= ~NEED_EYE_TEXGEN;
ctx->Texture._TexMatEnabled = 0;
ctx->Texture._TexGenEnabled = 0;
 
/* Update texture unit state.
*/
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
 
texUnit->_ReallyEnabled = 0;
texUnit->_GenFlags = 0;
 
if (!texUnit->Enabled)
continue;
 
/* Look for the highest-priority texture target that's enabled and
* complete. That's the one we'll use for texturing.
*/
if (texUnit->Enabled & TEXTURE_CUBE_BIT) {
struct gl_texture_object *texObj = texUnit->CurrentCubeMap;
if (!texObj->Complete) {
_mesa_test_texobj_completeness(ctx, texObj);
}
if (texObj->Complete) {
texUnit->_ReallyEnabled = TEXTURE_CUBE_BIT;
texUnit->_Current = texObj;
}
}
 
if (!texUnit->_ReallyEnabled && (texUnit->Enabled & TEXTURE_3D_BIT)) {
struct gl_texture_object *texObj = texUnit->Current3D;
if (!texObj->Complete) {
_mesa_test_texobj_completeness(ctx, texObj);
}
if (texObj->Complete) {
texUnit->_ReallyEnabled = TEXTURE_3D_BIT;
texUnit->_Current = texObj;
}
}
 
if (!texUnit->_ReallyEnabled && (texUnit->Enabled & TEXTURE_RECT_BIT)) {
struct gl_texture_object *texObj = texUnit->CurrentRect;
if (!texObj->Complete) {
_mesa_test_texobj_completeness(ctx, texObj);
}
if (texObj->Complete) {
texUnit->_ReallyEnabled = TEXTURE_RECT_BIT;
texUnit->_Current = texObj;
}
}
 
if (!texUnit->_ReallyEnabled && (texUnit->Enabled & TEXTURE_2D_BIT)) {
struct gl_texture_object *texObj = texUnit->Current2D;
if (!texObj->Complete) {
_mesa_test_texobj_completeness(ctx, texObj);
}
if (texObj->Complete) {
texUnit->_ReallyEnabled = TEXTURE_2D_BIT;
texUnit->_Current = texObj;
}
}
 
if (!texUnit->_ReallyEnabled && (texUnit->Enabled & TEXTURE_1D_BIT)) {
struct gl_texture_object *texObj = texUnit->Current1D;
if (!texObj->Complete) {
_mesa_test_texobj_completeness(ctx, texObj);
}
if (texObj->Complete) {
texUnit->_ReallyEnabled = TEXTURE_1D_BIT;
texUnit->_Current = texObj;
}
}
 
if (!texUnit->_ReallyEnabled) {
texUnit->_Current = NULL;
continue;
}
 
if (texUnit->_ReallyEnabled)
ctx->Texture._EnabledUnits |= (1 << unit);
 
if (texUnit->TexGenEnabled) {
if (texUnit->TexGenEnabled & S_BIT) {
texUnit->_GenFlags |= texUnit->_GenBitS;
}
if (texUnit->TexGenEnabled & T_BIT) {
texUnit->_GenFlags |= texUnit->_GenBitT;
}
if (texUnit->TexGenEnabled & Q_BIT) {
texUnit->_GenFlags |= texUnit->_GenBitQ;
}
if (texUnit->TexGenEnabled & R_BIT) {
texUnit->_GenFlags |= texUnit->_GenBitR;
}
 
ctx->Texture._TexGenEnabled |= ENABLE_TEXGEN(unit);
ctx->Texture._GenFlags |= texUnit->_GenFlags;
}
 
if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY)
ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(unit);
}
 
if (ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS) {
ctx->_NeedNormals |= NEED_NORMALS_TEXGEN;
ctx->_NeedEyeCoords |= NEED_EYE_TEXGEN;
}
 
if (ctx->Texture._GenFlags & TEXGEN_NEED_EYE_COORD) {
ctx->_NeedEyeCoords |= NEED_EYE_TEXGEN;
}
}
 
 
 
/*
* If ctx->NewState is non-zero then this function MUST be called before
* rendering any primitive. Basically, function pointers and miscellaneous
* flags are updated to reflect the current state of the state machine.
*
* The above constraint is now maintained largely by the two Exec
* dispatch tables, which trigger the appropriate flush on transition
* between State and Geometry modes.
*
* Special care is taken with the derived value _NeedEyeCoords. This
* is a bitflag which is updated with information from a number of
* attribute groups (MODELVIEW, LIGHT, TEXTURE). A lot of derived
* state references this value, and must be treated with care to
* ensure that updates are done correctly. All state dependent on
* _NeedEyeCoords is calculated from within _mesa_update_tnl_spaces(),
* and from nowhere else.
*/
void _mesa_update_state( GLcontext *ctx )
{
const GLuint new_state = ctx->NewState;
const GLuint oldneedeyecoords = ctx->_NeedEyeCoords;
 
if (MESA_VERBOSE & VERBOSE_STATE)
_mesa_print_state("_mesa_update_state", new_state);
 
if (new_state & _NEW_MODELVIEW)
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
 
if (new_state & _NEW_PROJECTION)
update_projection( ctx );
 
if (new_state & _NEW_TEXTURE_MATRIX)
update_texture_matrices( ctx );
 
if (new_state & _NEW_COLOR_MATRIX)
_math_matrix_analyse( ctx->ColorMatrixStack.Top );
 
/* References ColorMatrix.type (derived above).
*/
if (new_state & _IMAGE_NEW_TRANSFER_STATE)
update_image_transfer_state(ctx);
 
/* Contributes to NeedEyeCoords, NeedNormals.
*/
if (new_state & _NEW_TEXTURE)
update_texture_state( ctx );
 
if (new_state & (_NEW_BUFFERS|_NEW_SCISSOR))
update_drawbuffer( ctx );
 
if (new_state & _NEW_POLYGON)
update_polygon( ctx );
 
/* Contributes to NeedEyeCoords, NeedNormals.
*/
if (new_state & _NEW_LIGHT)
_mesa_update_lighting( ctx );
 
/* We can light in object space if the modelview matrix preserves
* lengths and relative angles.
*/
if (new_state & (_NEW_MODELVIEW|_NEW_LIGHT)) {
ctx->_NeedEyeCoords &= ~NEED_EYE_LIGHT_MODELVIEW;
if (ctx->Light.Enabled &&
!TEST_MAT_FLAGS( ctx->ModelviewMatrixStack.Top, MAT_FLAGS_LENGTH_PRESERVING))
ctx->_NeedEyeCoords |= NEED_EYE_LIGHT_MODELVIEW;
}
 
 
#if 0
/* XXX this is a bit of a hack. We should be checking elsewhere if
* vertex program mode is enabled. We set _NeedEyeCoords to zero to
* ensure that the combined modelview/projection matrix is computed
* in calculate_model_project_matrix().
*/
if (ctx->VertexProgram.Enabled)
ctx->_NeedEyeCoords = 0;
/* KW: it's now always computed.
*/
#endif
 
/* Keep ModelviewProject uptodate always to allow tnl
* implementations that go model->clip even when eye is required.
*/
if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
calculate_model_project_matrix(ctx);
 
/* ctx->_NeedEyeCoords is now uptodate.
*
* If the truth value of this variable has changed, update for the
* new lighting space and recompute the positions of lights and the
* normal transform.
*
* If the lighting space hasn't changed, may still need to recompute
* light positions & normal transforms for other reasons.
*/
if (new_state & (_NEW_MODELVIEW |
_NEW_LIGHT |
_MESA_NEW_NEED_EYE_COORDS))
update_tnl_spaces( ctx, oldneedeyecoords );
 
/*
* Here the driver sets up all the ctx->Driver function pointers
* to it's specific, private functions, and performs any
* internal state management necessary, including invalidating
* state of active modules.
*
* Set ctx->NewState to zero to avoid recursion if
* Driver.UpdateState() has to call FLUSH_VERTICES(). (fixed?)
*/
ctx->NewState = 0;
ctx->Driver.UpdateState(ctx, new_state);
ctx->Array.NewState = 0;
 
/* At this point we can do some assertions to be sure the required
* device driver function pointers are all initialized.
*/
ASSERT(ctx->Driver.GetString);
ASSERT(ctx->Driver.UpdateState);
ASSERT(ctx->Driver.Clear);
ASSERT(ctx->Driver.GetBufferSize);
if (ctx->Visual.accumRedBits > 0) {
ASSERT(ctx->Driver.Accum);
}
ASSERT(ctx->Driver.DrawPixels);
ASSERT(ctx->Driver.ReadPixels);
ASSERT(ctx->Driver.CopyPixels);
ASSERT(ctx->Driver.Bitmap);
ASSERT(ctx->Driver.ResizeBuffers);
ASSERT(ctx->Driver.TexImage1D);
ASSERT(ctx->Driver.TexImage2D);
ASSERT(ctx->Driver.TexImage3D);
ASSERT(ctx->Driver.TexSubImage1D);
ASSERT(ctx->Driver.TexSubImage2D);
ASSERT(ctx->Driver.TexSubImage3D);
ASSERT(ctx->Driver.CopyTexImage1D);
ASSERT(ctx->Driver.CopyTexImage2D);
ASSERT(ctx->Driver.CopyTexSubImage1D);
ASSERT(ctx->Driver.CopyTexSubImage2D);
ASSERT(ctx->Driver.CopyTexSubImage3D);
if (ctx->Extensions.ARB_texture_compression) {
#if 0 /* HW drivers need these, but not SW rasterizers */
ASSERT(ctx->Driver.CompressedTexImage1D);
ASSERT(ctx->Driver.CompressedTexImage2D);
ASSERT(ctx->Driver.CompressedTexImage3D);
ASSERT(ctx->Driver.CompressedTexSubImage1D);
ASSERT(ctx->Driver.CompressedTexSubImage2D);
ASSERT(ctx->Driver.CompressedTexSubImage3D);
#endif
}
}
 
/* Is this helpful?
*/
void
_mesa_allow_light_in_model( GLcontext *ctx, GLboolean flag )
{
if (flag)
ctx->_NeedEyeCoords &= ~NEED_EYE_DRIVER;
else
ctx->_NeedEyeCoords |= NEED_EYE_DRIVER;
 
ctx->NewState |= _NEW_POINT; /* one of the bits from
* _MESA_NEW_NEED_EYE_COORDS.
*/
}
/shark/trunk/ports/mesa/src/pixel.c
0,0 → 1,1331
/* $Id: pixel.c,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include "glheader.h"
#include "imports.h"
#include "colormac.h"
#include "context.h"
#include "macros.h"
#include "pixel.h"
#include "mtypes.h"
 
 
/**********************************************************************/
/***** glPixelZoom *****/
/**********************************************************************/
 
 
 
void
_mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
{
GET_CURRENT_CONTEXT(ctx);
 
if (ctx->Pixel.ZoomX == xfactor &&
ctx->Pixel.ZoomY == yfactor)
return;
 
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.ZoomX = xfactor;
ctx->Pixel.ZoomY = yfactor;
}
 
 
 
/**********************************************************************/
/***** glPixelStore *****/
/**********************************************************************/
 
 
void
_mesa_PixelStorei( GLenum pname, GLint param )
{
/* NOTE: this call can't be compiled into the display list */
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (pname) {
case GL_PACK_SWAP_BYTES:
if (param == (GLint)ctx->Pack.SwapBytes)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
break;
case GL_PACK_LSB_FIRST:
if (param == (GLint)ctx->Pack.LsbFirst)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
break;
case GL_PACK_ROW_LENGTH:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.RowLength == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.RowLength = param;
break;
case GL_PACK_IMAGE_HEIGHT:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.ImageHeight == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.ImageHeight = param;
break;
case GL_PACK_SKIP_PIXELS:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.SkipPixels == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.SkipPixels = param;
break;
case GL_PACK_SKIP_ROWS:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.SkipRows == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.SkipRows = param;
break;
case GL_PACK_SKIP_IMAGES:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.SkipImages == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.SkipImages = param;
break;
case GL_PACK_ALIGNMENT:
if (param!=1 && param!=2 && param!=4 && param!=8) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Pack.Alignment == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.Alignment = param;
break;
case GL_PACK_INVERT_MESA:
if (!ctx->Extensions.MESA_pack_invert) {
_mesa_error( ctx, GL_INVALID_ENUM, "glPixelstore(pname)" );
return;
}
if (ctx->Pack.Invert == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Pack.Invert = param;
break;
 
case GL_UNPACK_SWAP_BYTES:
if (param == (GLint)ctx->Unpack.SwapBytes)
return;
if ((GLint)ctx->Unpack.SwapBytes == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
break;
case GL_UNPACK_LSB_FIRST:
if (param == (GLint)ctx->Unpack.LsbFirst)
return;
if ((GLint)ctx->Unpack.LsbFirst == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
break;
case GL_UNPACK_ROW_LENGTH:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Unpack.RowLength == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.RowLength = param;
break;
case GL_UNPACK_IMAGE_HEIGHT:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Unpack.ImageHeight == param)
return;
 
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.ImageHeight = param;
break;
case GL_UNPACK_SKIP_PIXELS:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Unpack.SkipPixels == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.SkipPixels = param;
break;
case GL_UNPACK_SKIP_ROWS:
if (param<0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Unpack.SkipRows == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.SkipRows = param;
break;
case GL_UNPACK_SKIP_IMAGES:
if (param < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
return;
}
if (ctx->Unpack.SkipImages == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.SkipImages = param;
break;
case GL_UNPACK_ALIGNMENT:
if (param!=1 && param!=2 && param!=4 && param!=8) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
return;
}
if (ctx->Unpack.Alignment == param)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.Alignment = param;
break;
case GL_UNPACK_CLIENT_STORAGE_APPLE:
if (param == (GLint)ctx->Unpack.ClientStorage)
return;
FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
ctx->Unpack.ClientStorage = param ? GL_TRUE : GL_FALSE;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
return;
}
}
 
 
void
_mesa_PixelStoref( GLenum pname, GLfloat param )
{
_mesa_PixelStorei( pname, (GLint) param );
}
 
 
 
/**********************************************************************/
/***** glPixelMap *****/
/**********************************************************************/
 
 
 
void
_mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
{
GLint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
return;
}
 
if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
/* test that mapsize is a power of two */
if (_mesa_bitcount((GLuint) mapsize) != 1) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
return;
}
}
 
FLUSH_VERTICES(ctx, _NEW_PIXEL);
 
switch (map) {
case GL_PIXEL_MAP_S_TO_S:
ctx->Pixel.MapStoSsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapStoS[i] = (GLint) values[i];
}
break;
case GL_PIXEL_MAP_I_TO_I:
ctx->Pixel.MapItoIsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapItoI[i] = (GLint) values[i];
}
break;
case GL_PIXEL_MAP_I_TO_R:
ctx->Pixel.MapItoRsize = mapsize;
for (i=0;i<mapsize;i++) {
GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
ctx->Pixel.MapItoR[i] = val;
ctx->Pixel.MapItoR8[i] = (GLint) (val * 255.0F);
}
break;
case GL_PIXEL_MAP_I_TO_G:
ctx->Pixel.MapItoGsize = mapsize;
for (i=0;i<mapsize;i++) {
GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
ctx->Pixel.MapItoG[i] = val;
ctx->Pixel.MapItoG8[i] = (GLint) (val * 255.0F);
}
break;
case GL_PIXEL_MAP_I_TO_B:
ctx->Pixel.MapItoBsize = mapsize;
for (i=0;i<mapsize;i++) {
GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
ctx->Pixel.MapItoB[i] = val;
ctx->Pixel.MapItoB8[i] = (GLint) (val * 255.0F);
}
break;
case GL_PIXEL_MAP_I_TO_A:
ctx->Pixel.MapItoAsize = mapsize;
for (i=0;i<mapsize;i++) {
GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
ctx->Pixel.MapItoA[i] = val;
ctx->Pixel.MapItoA8[i] = (GLint) (val * 255.0F);
}
break;
case GL_PIXEL_MAP_R_TO_R:
ctx->Pixel.MapRtoRsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapRtoR[i] = CLAMP( values[i], 0.0F, 1.0F );
}
break;
case GL_PIXEL_MAP_G_TO_G:
ctx->Pixel.MapGtoGsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapGtoG[i] = CLAMP( values[i], 0.0F, 1.0F );
}
break;
case GL_PIXEL_MAP_B_TO_B:
ctx->Pixel.MapBtoBsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapBtoB[i] = CLAMP( values[i], 0.0F, 1.0F );
}
break;
case GL_PIXEL_MAP_A_TO_A:
ctx->Pixel.MapAtoAsize = mapsize;
for (i=0;i<mapsize;i++) {
ctx->Pixel.MapAtoA[i] = CLAMP( values[i], 0.0F, 1.0F );
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glPixelMapfv(map)" );
}
}
 
 
 
void
_mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
{
const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
GLint i;
if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
for (i=0;i<n;i++) {
fvalues[i] = (GLfloat) values[i];
}
}
else {
for (i=0;i<n;i++) {
fvalues[i] = UINT_TO_FLOAT( values[i] );
}
}
_mesa_PixelMapfv(map, mapsize, fvalues);
}
 
 
 
void
_mesa_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values )
{
const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
GLint i;
if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
for (i=0;i<n;i++) {
fvalues[i] = (GLfloat) values[i];
}
}
else {
for (i=0;i<n;i++) {
fvalues[i] = USHORT_TO_FLOAT( values[i] );
}
}
_mesa_PixelMapfv(map, mapsize, fvalues);
}
 
 
 
void
_mesa_GetPixelMapfv( GLenum map, GLfloat *values )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (map) {
case GL_PIXEL_MAP_I_TO_I:
for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
values[i] = (GLfloat) ctx->Pixel.MapItoI[i];
}
break;
case GL_PIXEL_MAP_S_TO_S:
for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
values[i] = (GLfloat) ctx->Pixel.MapStoS[i];
}
break;
case GL_PIXEL_MAP_I_TO_R:
MEMCPY(values,ctx->Pixel.MapItoR,ctx->Pixel.MapItoRsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_I_TO_G:
MEMCPY(values,ctx->Pixel.MapItoG,ctx->Pixel.MapItoGsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_I_TO_B:
MEMCPY(values,ctx->Pixel.MapItoB,ctx->Pixel.MapItoBsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_I_TO_A:
MEMCPY(values,ctx->Pixel.MapItoA,ctx->Pixel.MapItoAsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_R_TO_R:
MEMCPY(values,ctx->Pixel.MapRtoR,ctx->Pixel.MapRtoRsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_G_TO_G:
MEMCPY(values,ctx->Pixel.MapGtoG,ctx->Pixel.MapGtoGsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_B_TO_B:
MEMCPY(values,ctx->Pixel.MapBtoB,ctx->Pixel.MapBtoBsize*sizeof(GLfloat));
break;
case GL_PIXEL_MAP_A_TO_A:
MEMCPY(values,ctx->Pixel.MapAtoA,ctx->Pixel.MapAtoAsize*sizeof(GLfloat));
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
}
}
 
 
void
_mesa_GetPixelMapuiv( GLenum map, GLuint *values )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (map) {
case GL_PIXEL_MAP_I_TO_I:
MEMCPY(values, ctx->Pixel.MapItoI, ctx->Pixel.MapItoIsize*sizeof(GLint));
break;
case GL_PIXEL_MAP_S_TO_S:
MEMCPY(values, ctx->Pixel.MapStoS, ctx->Pixel.MapStoSsize*sizeof(GLint));
break;
case GL_PIXEL_MAP_I_TO_R:
for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoR[i] );
}
break;
case GL_PIXEL_MAP_I_TO_G:
for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoG[i] );
}
break;
case GL_PIXEL_MAP_I_TO_B:
for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoB[i] );
}
break;
case GL_PIXEL_MAP_I_TO_A:
for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoA[i] );
}
break;
case GL_PIXEL_MAP_R_TO_R:
for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapRtoR[i] );
}
break;
case GL_PIXEL_MAP_G_TO_G:
for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapGtoG[i] );
}
break;
case GL_PIXEL_MAP_B_TO_B:
for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapBtoB[i] );
}
break;
case GL_PIXEL_MAP_A_TO_A:
for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
values[i] = FLOAT_TO_UINT( ctx->Pixel.MapAtoA[i] );
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
}
}
 
 
void
_mesa_GetPixelMapusv( GLenum map, GLushort *values )
{
GET_CURRENT_CONTEXT(ctx);
GLint i;
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (map) {
case GL_PIXEL_MAP_I_TO_I:
for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
values[i] = (GLushort) ctx->Pixel.MapItoI[i];
}
break;
case GL_PIXEL_MAP_S_TO_S:
for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
values[i] = (GLushort) ctx->Pixel.MapStoS[i];
}
break;
case GL_PIXEL_MAP_I_TO_R:
for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoR[i] );
}
break;
case GL_PIXEL_MAP_I_TO_G:
for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoG[i] );
}
break;
case GL_PIXEL_MAP_I_TO_B:
for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoB[i] );
}
break;
case GL_PIXEL_MAP_I_TO_A:
for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoA[i] );
}
break;
case GL_PIXEL_MAP_R_TO_R:
for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapRtoR[i] );
}
break;
case GL_PIXEL_MAP_G_TO_G:
for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapGtoG[i] );
}
break;
case GL_PIXEL_MAP_B_TO_B:
for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapBtoB[i] );
}
break;
case GL_PIXEL_MAP_A_TO_A:
for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapAtoA[i] );
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
}
}
 
 
 
/**********************************************************************/
/***** glPixelTransfer *****/
/**********************************************************************/
 
 
/*
* Implements glPixelTransfer[fi] whether called immediately or from a
* display list.
*/
void
_mesa_PixelTransferf( GLenum pname, GLfloat param )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
switch (pname) {
case GL_MAP_COLOR:
if (ctx->Pixel.MapColorFlag == (param ? GL_TRUE : GL_FALSE))
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
break;
case GL_MAP_STENCIL:
if (ctx->Pixel.MapStencilFlag == (param ? GL_TRUE : GL_FALSE))
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
break;
case GL_INDEX_SHIFT:
if (ctx->Pixel.IndexShift == (GLint) param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.IndexShift = (GLint) param;
break;
case GL_INDEX_OFFSET:
if (ctx->Pixel.IndexOffset == (GLint) param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.IndexOffset = (GLint) param;
break;
case GL_RED_SCALE:
if (ctx->Pixel.RedScale == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.RedScale = param;
break;
case GL_RED_BIAS:
if (ctx->Pixel.RedBias == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.RedBias = param;
break;
case GL_GREEN_SCALE:
if (ctx->Pixel.GreenScale == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.GreenScale = param;
break;
case GL_GREEN_BIAS:
if (ctx->Pixel.GreenBias == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.GreenBias = param;
break;
case GL_BLUE_SCALE:
if (ctx->Pixel.BlueScale == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.BlueScale = param;
break;
case GL_BLUE_BIAS:
if (ctx->Pixel.BlueBias == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.BlueBias = param;
break;
case GL_ALPHA_SCALE:
if (ctx->Pixel.AlphaScale == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.AlphaScale = param;
break;
case GL_ALPHA_BIAS:
if (ctx->Pixel.AlphaBias == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.AlphaBias = param;
break;
case GL_DEPTH_SCALE:
if (ctx->Pixel.DepthScale == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.DepthScale = param;
break;
case GL_DEPTH_BIAS:
if (ctx->Pixel.DepthBias == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.DepthBias = param;
break;
case GL_POST_COLOR_MATRIX_RED_SCALE:
if (ctx->Pixel.PostColorMatrixScale[0] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixScale[0] = param;
break;
case GL_POST_COLOR_MATRIX_RED_BIAS:
if (ctx->Pixel.PostColorMatrixBias[0] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixBias[0] = param;
break;
case GL_POST_COLOR_MATRIX_GREEN_SCALE:
if (ctx->Pixel.PostColorMatrixScale[1] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixScale[1] = param;
break;
case GL_POST_COLOR_MATRIX_GREEN_BIAS:
if (ctx->Pixel.PostColorMatrixBias[1] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixBias[1] = param;
break;
case GL_POST_COLOR_MATRIX_BLUE_SCALE:
if (ctx->Pixel.PostColorMatrixScale[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixScale[2] = param;
break;
case GL_POST_COLOR_MATRIX_BLUE_BIAS:
if (ctx->Pixel.PostColorMatrixBias[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixBias[2] = param;
break;
case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
if (ctx->Pixel.PostColorMatrixScale[3] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixScale[3] = param;
break;
case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
if (ctx->Pixel.PostColorMatrixBias[3] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixBias[3] = param;
break;
case GL_POST_CONVOLUTION_RED_SCALE:
if (ctx->Pixel.PostConvolutionScale[0] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionScale[0] = param;
break;
case GL_POST_CONVOLUTION_RED_BIAS:
if (ctx->Pixel.PostConvolutionBias[0] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionBias[0] = param;
break;
case GL_POST_CONVOLUTION_GREEN_SCALE:
if (ctx->Pixel.PostConvolutionScale[1] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionScale[1] = param;
break;
case GL_POST_CONVOLUTION_GREEN_BIAS:
if (ctx->Pixel.PostConvolutionBias[1] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionBias[1] = param;
break;
case GL_POST_CONVOLUTION_BLUE_SCALE:
if (ctx->Pixel.PostConvolutionScale[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionScale[2] = param;
break;
case GL_POST_CONVOLUTION_BLUE_BIAS:
if (ctx->Pixel.PostConvolutionBias[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionBias[2] = param;
break;
case GL_POST_CONVOLUTION_ALPHA_SCALE:
if (ctx->Pixel.PostConvolutionScale[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionScale[2] = param;
break;
case GL_POST_CONVOLUTION_ALPHA_BIAS:
if (ctx->Pixel.PostConvolutionBias[2] == param)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionBias[2] = param;
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
return;
}
}
 
 
void
_mesa_PixelTransferi( GLenum pname, GLint param )
{
_mesa_PixelTransferf( pname, (GLfloat) param );
}
 
 
 
/**********************************************************************/
/***** Pixel processing functions ******/
/**********************************************************************/
 
 
/*
* Apply scale and bias factors to an array of RGBA pixels.
*/
void
_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4],
GLfloat rScale, GLfloat gScale,
GLfloat bScale, GLfloat aScale,
GLfloat rBias, GLfloat gBias,
GLfloat bBias, GLfloat aBias)
{
if (rScale != 1.0 || rBias != 0.0) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
}
}
if (gScale != 1.0 || gBias != 0.0) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
}
}
if (bScale != 1.0 || bBias != 0.0) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
}
}
if (aScale != 1.0 || aBias != 0.0) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
}
}
}
 
 
/*
* Apply pixel mapping to an array of floating point RGBA pixels.
*/
void
_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
{
const GLfloat rscale = (GLfloat) (ctx->Pixel.MapRtoRsize - 1);
const GLfloat gscale = (GLfloat) (ctx->Pixel.MapGtoGsize - 1);
const GLfloat bscale = (GLfloat) (ctx->Pixel.MapBtoBsize - 1);
const GLfloat ascale = (GLfloat) (ctx->Pixel.MapAtoAsize - 1);
const GLfloat *rMap = ctx->Pixel.MapRtoR;
const GLfloat *gMap = ctx->Pixel.MapGtoG;
const GLfloat *bMap = ctx->Pixel.MapBtoB;
const GLfloat *aMap = ctx->Pixel.MapAtoA;
GLuint i;
for (i=0;i<n;i++) {
GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
rgba[i][RCOMP] = rMap[IROUND(r * rscale)];
rgba[i][GCOMP] = gMap[IROUND(g * gscale)];
rgba[i][BCOMP] = bMap[IROUND(b * bscale)];
rgba[i][ACOMP] = aMap[IROUND(a * ascale)];
}
}
 
 
/*
* Apply the color matrix and post color matrix scaling and biasing.
*/
void
_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
{
const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
const GLfloat *m = ctx->ColorMatrixStack.Top->m;
GLuint i;
for (i = 0; i < n; i++) {
const GLfloat r = rgba[i][RCOMP];
const GLfloat g = rgba[i][GCOMP];
const GLfloat b = rgba[i][BCOMP];
const GLfloat a = rgba[i][ACOMP];
rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
}
}
 
 
/*
* Apply a color table lookup to an array of colors.
*/
void
_mesa_lookup_rgba(const struct gl_color_table *table,
GLuint n, GLfloat rgba[][4])
{
ASSERT(table->FloatTable);
if (!table->Table || table->Size == 0)
return;
 
switch (table->Format) {
case GL_INTENSITY:
/* replace RGBA with I */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][RCOMP] * scale);
GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, 1)]);
rgba[i][RCOMP] = rgba[i][GCOMP] =
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
}
 
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][RCOMP] * scale);
GLfloat c = lut[CLAMP(j, 0, max)];
rgba[i][RCOMP] = rgba[i][GCOMP] =
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
}
}
break;
case GL_LUMINANCE:
/* replace RGB with L */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][RCOMP] * scale);
GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
}
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][RCOMP] * scale);
GLfloat c = lut[CLAMP(j, 0, max)];
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
}
}
break;
case GL_ALPHA:
/* replace A with A */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][ACOMP] * scale);
rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
}
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint j = IROUND(rgba[i][ACOMP] * scale);
rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
}
}
break;
case GL_LUMINANCE_ALPHA:
/* replace RGBA with LLLA */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jL = IROUND(rgba[i][RCOMP] * scale);
GLint jA = IROUND(rgba[i][ACOMP] * scale);
GLfloat luminance, alpha;
jL = CLAMP(jL, 0, max);
jA = CLAMP(jA, 0, max);
luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
alpha = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
rgba[i][ACOMP] = alpha;;
}
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jL = IROUND(rgba[i][RCOMP] * scale);
GLint jA = IROUND(rgba[i][ACOMP] * scale);
GLfloat luminance, alpha;
jL = CLAMP(jL, 0, max);
jA = CLAMP(jA, 0, max);
luminance = lut[jL * 2 + 0];
alpha = lut[jA * 2 + 1];
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
rgba[i][ACOMP] = alpha;;
}
}
break;
case GL_RGB:
/* replace RGB with RGB */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jR = IROUND(rgba[i][RCOMP] * scale);
GLint jG = IROUND(rgba[i][GCOMP] * scale);
GLint jB = IROUND(rgba[i][BCOMP] * scale);
jR = CLAMP(jR, 0, max);
jG = CLAMP(jG, 0, max);
jB = CLAMP(jB, 0, max);
rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
}
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jR = IROUND(rgba[i][RCOMP] * scale);
GLint jG = IROUND(rgba[i][GCOMP] * scale);
GLint jB = IROUND(rgba[i][BCOMP] * scale);
jR = CLAMP(jR, 0, max);
jG = CLAMP(jG, 0, max);
jB = CLAMP(jB, 0, max);
rgba[i][RCOMP] = lut[jR * 3 + 0];
rgba[i][GCOMP] = lut[jG * 3 + 1];
rgba[i][BCOMP] = lut[jB * 3 + 2];
}
}
break;
case GL_RGBA:
/* replace RGBA with RGBA */
if (!table->FloatTable) {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLchan *lut = (const GLchan *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jR = IROUND(rgba[i][RCOMP] * scale);
GLint jG = IROUND(rgba[i][GCOMP] * scale);
GLint jB = IROUND(rgba[i][BCOMP] * scale);
GLint jA = IROUND(rgba[i][ACOMP] * scale);
jR = CLAMP(jR, 0, max);
jG = CLAMP(jG, 0, max);
jB = CLAMP(jB, 0, max);
jA = CLAMP(jA, 0, max);
rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
}
}
else {
const GLint max = table->Size - 1;
const GLfloat scale = (GLfloat) max;
const GLfloat *lut = (const GLfloat *) table->Table;
GLuint i;
for (i = 0; i < n; i++) {
GLint jR = IROUND(rgba[i][RCOMP] * scale);
GLint jG = IROUND(rgba[i][GCOMP] * scale);
GLint jB = IROUND(rgba[i][BCOMP] * scale);
GLint jA = IROUND(rgba[i][ACOMP] * scale);
jR = CLAMP(jR, 0, max);
jG = CLAMP(jG, 0, max);
jB = CLAMP(jB, 0, max);
jA = CLAMP(jA, 0, max);
rgba[i][RCOMP] = lut[jR * 4 + 0];
rgba[i][GCOMP] = lut[jG * 4 + 1];
rgba[i][BCOMP] = lut[jB * 4 + 2];
rgba[i][ACOMP] = lut[jA * 4 + 3];
}
}
break;
default:
_mesa_problem(NULL, "Bad format in _mesa_lookup_rgba");
return;
}
}
 
 
 
/*
* Apply color index shift and offset to an array of pixels.
*/
void
_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
{
GLint shift = ctx->Pixel.IndexShift;
GLint offset = ctx->Pixel.IndexOffset;
GLuint i;
if (shift > 0) {
for (i=0;i<n;i++) {
indexes[i] = (indexes[i] << shift) + offset;
}
}
else if (shift < 0) {
shift = -shift;
for (i=0;i<n;i++) {
indexes[i] = (indexes[i] >> shift) + offset;
}
}
else {
for (i=0;i<n;i++) {
indexes[i] = indexes[i] + offset;
}
}
}
 
 
/*
* Apply color index mapping to color indexes.
*/
void
_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
{
GLuint mask = ctx->Pixel.MapItoIsize - 1;
GLuint i;
for (i=0;i<n;i++) {
index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
}
}
 
 
/*
* Map color indexes to rgba values.
*/
void
_mesa_map_ci_to_rgba_chan( const GLcontext *ctx, GLuint n,
const GLuint index[], GLchan rgba[][4] )
{
#if CHAN_BITS == 8
GLuint rmask = ctx->Pixel.MapItoRsize - 1;
GLuint gmask = ctx->Pixel.MapItoGsize - 1;
GLuint bmask = ctx->Pixel.MapItoBsize - 1;
GLuint amask = ctx->Pixel.MapItoAsize - 1;
const GLubyte *rMap = ctx->Pixel.MapItoR8;
const GLubyte *gMap = ctx->Pixel.MapItoG8;
const GLubyte *bMap = ctx->Pixel.MapItoB8;
const GLubyte *aMap = ctx->Pixel.MapItoA8;
GLuint i;
for (i=0;i<n;i++) {
rgba[i][RCOMP] = rMap[index[i] & rmask];
rgba[i][GCOMP] = gMap[index[i] & gmask];
rgba[i][BCOMP] = bMap[index[i] & bmask];
rgba[i][ACOMP] = aMap[index[i] & amask];
}
#else
GLuint rmask = ctx->Pixel.MapItoRsize - 1;
GLuint gmask = ctx->Pixel.MapItoGsize - 1;
GLuint bmask = ctx->Pixel.MapItoBsize - 1;
GLuint amask = ctx->Pixel.MapItoAsize - 1;
const GLfloat *rMap = ctx->Pixel.MapItoR;
const GLfloat *gMap = ctx->Pixel.MapItoG;
const GLfloat *bMap = ctx->Pixel.MapItoB;
const GLfloat *aMap = ctx->Pixel.MapItoA;
GLuint i;
for (i=0;i<n;i++) {
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
}
#endif
}
 
 
/*
* Map color indexes to float rgba values.
*/
void
_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
const GLuint index[], GLfloat rgba[][4] )
{
GLuint rmask = ctx->Pixel.MapItoRsize - 1;
GLuint gmask = ctx->Pixel.MapItoGsize - 1;
GLuint bmask = ctx->Pixel.MapItoBsize - 1;
GLuint amask = ctx->Pixel.MapItoAsize - 1;
const GLfloat *rMap = ctx->Pixel.MapItoR;
const GLfloat *gMap = ctx->Pixel.MapItoG;
const GLfloat *bMap = ctx->Pixel.MapItoB;
const GLfloat *aMap = ctx->Pixel.MapItoA;
GLuint i;
for (i=0;i<n;i++) {
rgba[i][RCOMP] = rMap[index[i] & rmask];
rgba[i][GCOMP] = gMap[index[i] & gmask];
rgba[i][BCOMP] = bMap[index[i] & bmask];
rgba[i][ACOMP] = aMap[index[i] & amask];
}
}
 
 
/*
* Map 8-bit color indexes to rgb values.
*/
void
_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
GLchan rgba[][4] )
{
#if CHAN_BITS == 8
GLuint rmask = ctx->Pixel.MapItoRsize - 1;
GLuint gmask = ctx->Pixel.MapItoGsize - 1;
GLuint bmask = ctx->Pixel.MapItoBsize - 1;
GLuint amask = ctx->Pixel.MapItoAsize - 1;
const GLubyte *rMap = ctx->Pixel.MapItoR8;
const GLubyte *gMap = ctx->Pixel.MapItoG8;
const GLubyte *bMap = ctx->Pixel.MapItoB8;
const GLubyte *aMap = ctx->Pixel.MapItoA8;
GLuint i;
for (i=0;i<n;i++) {
rgba[i][RCOMP] = rMap[index[i] & rmask];
rgba[i][GCOMP] = gMap[index[i] & gmask];
rgba[i][BCOMP] = bMap[index[i] & bmask];
rgba[i][ACOMP] = aMap[index[i] & amask];
}
#else
GLuint rmask = ctx->Pixel.MapItoRsize - 1;
GLuint gmask = ctx->Pixel.MapItoGsize - 1;
GLuint bmask = ctx->Pixel.MapItoBsize - 1;
GLuint amask = ctx->Pixel.MapItoAsize - 1;
const GLfloat *rMap = ctx->Pixel.MapItoR;
const GLfloat *gMap = ctx->Pixel.MapItoG;
const GLfloat *bMap = ctx->Pixel.MapItoB;
const GLfloat *aMap = ctx->Pixel.MapItoA;
GLuint i;
for (i=0;i<n;i++) {
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
}
#endif
}
 
 
void
_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
GLstencil stencil[] )
{
GLuint i;
GLint shift = ctx->Pixel.IndexShift;
GLint offset = ctx->Pixel.IndexOffset;
if (shift > 0) {
for (i=0;i<n;i++) {
stencil[i] = (stencil[i] << shift) + offset;
}
}
else if (shift < 0) {
shift = -shift;
for (i=0;i<n;i++) {
stencil[i] = (stencil[i] >> shift) + offset;
}
}
else {
for (i=0;i<n;i++) {
stencil[i] = stencil[i] + offset;
}
}
 
}
 
 
void
_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
{
GLuint mask = ctx->Pixel.MapStoSsize - 1;
GLuint i;
for (i=0;i<n;i++) {
stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
}
}
 
 
 
/*
* This function converts an array of GLchan colors to GLfloat colors.
* Most importantly, it undoes the non-uniform quantization of pixel
* values introduced when we convert shallow (< 8 bit) pixel values
* to GLubytes in the ctx->Driver.ReadRGBASpan() functions.
* This fixes a number of OpenGL conformance failures when running on
* 16bpp displays, for example.
*/
void
_mesa_chan_to_float_span(const GLcontext *ctx, GLuint n,
CONST GLchan rgba[][4], GLfloat rgbaf[][4])
{
#if CHAN_TYPE == GL_FLOAT
MEMCPY(rgbaf, rgba, n * 4 * sizeof(GLfloat));
#else
const GLuint rShift = CHAN_BITS - ctx->Visual.redBits;
const GLuint gShift = CHAN_BITS - ctx->Visual.greenBits;
const GLuint bShift = CHAN_BITS - ctx->Visual.blueBits;
GLuint aShift;
const GLfloat rScale = 1.0F / (GLfloat) ((1 << ctx->Visual.redBits ) - 1);
const GLfloat gScale = 1.0F / (GLfloat) ((1 << ctx->Visual.greenBits) - 1);
const GLfloat bScale = 1.0F / (GLfloat) ((1 << ctx->Visual.blueBits ) - 1);
GLfloat aScale;
GLuint i;
 
if (ctx->Visual.alphaBits > 0) {
aShift = CHAN_BITS - ctx->Visual.alphaBits;
aScale = 1.0F / (GLfloat) ((1 << ctx->Visual.alphaBits) - 1);
}
else {
aShift = 0;
aScale = 1.0F / CHAN_MAXF;
}
 
for (i = 0; i < n; i++) {
const GLint r = rgba[i][RCOMP] >> rShift;
const GLint g = rgba[i][GCOMP] >> gShift;
const GLint b = rgba[i][BCOMP] >> bShift;
const GLint a = rgba[i][ACOMP] >> aShift;
rgbaf[i][RCOMP] = (GLfloat) r * rScale;
rgbaf[i][GCOMP] = (GLfloat) g * gScale;
rgbaf[i][BCOMP] = (GLfloat) b * bScale;
rgbaf[i][ACOMP] = (GLfloat) a * aScale;
}
#endif
}
/shark/trunk/ports/mesa/src/context.c
0,0 → 1,2382
/* $Id: context.c,v 1.1 2003-02-28 11:41:58 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "buffers.h"
#include "clip.h"
#include "colortab.h"
#include "context.h"
#include "dlist.h"
#include "eval.h"
#include "enums.h"
#include "extensions.h"
#include "fog.h"
#include "get.h"
#include "glthread.h"
#include "hash.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "simple_list.h"
#include "state.h"
#include "teximage.h"
#include "texobj.h"
#include "texstate.h"
#include "mtypes.h"
#include "varray.h"
#include "vpstate.h"
#include "vtxfmt.h"
#include "math/m_translate.h"
#include "math/m_matrix.h"
#include "math/m_xform.h"
#include "math/mathmod.h"
 
 
#if defined(MESA_TRACE)
#include "Trace/tr_context.h"
#include "Trace/tr_wrapper.h"
#endif
 
#ifdef USE_SPARC_ASM
#include "SPARC/sparc.h"
#endif
 
#ifndef MESA_VERBOSE
int MESA_VERBOSE = 0;
#endif
 
#ifndef MESA_DEBUG_FLAGS
int MESA_DEBUG_FLAGS = 0;
#endif
 
 
static void
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );
 
 
/**********************************************************************/
/***** OpenGL SI-style interface (new in Mesa 3.5) *****/
/**********************************************************************/
 
/* Called by window system/device driver (via gc->exports.destroyCurrent())
* when the rendering context is to be destroyed.
*/
GLboolean
_mesa_destroyContext(__GLcontext *gc)
{
if (gc) {
_mesa_free_context_data(gc);
_mesa_free(gc);
}
return GL_TRUE;
}
 
/* Called by window system/device driver (via gc->exports.loseCurrent())
* when the rendering context is made non-current.
*/
GLboolean
_mesa_loseCurrent(__GLcontext *gc)
{
/* XXX unbind context from thread */
return GL_TRUE;
}
 
/* Called by window system/device driver (via gc->exports.makeCurrent())
* when the rendering context is made current.
*/
GLboolean
_mesa_makeCurrent(__GLcontext *gc)
{
/* XXX bind context to thread */
return GL_TRUE;
}
 
/* Called by window system/device driver - yadda, yadda, yadda.
* See above comments.
*/
GLboolean
_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare)
{
if (gc && gcShare && gc->Shared && gcShare->Shared) {
gc->Shared->RefCount--;
if (gc->Shared->RefCount == 0) {
free_shared_state(gc, gc->Shared);
}
gc->Shared = gcShare->Shared;
gc->Shared->RefCount++;
return GL_TRUE;
}
else {
return GL_FALSE;
}
}
 
GLboolean
_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask)
{
if (dst && src) {
_mesa_copy_context( src, dst, mask );
return GL_TRUE;
}
else {
return GL_FALSE;
}
}
 
GLboolean
_mesa_forceCurrent(__GLcontext *gc)
{
return GL_TRUE;
}
 
GLboolean
_mesa_notifyResize(__GLcontext *gc)
{
GLint x, y;
GLuint width, height;
__GLdrawablePrivate *d = gc->imports.getDrawablePrivate(gc);
if (!d || !d->getDrawableSize)
return GL_FALSE;
d->getDrawableSize( d, &x, &y, &width, &height );
/* update viewport, resize software buffers, etc. */
return GL_TRUE;
}
 
void
_mesa_notifyDestroy(__GLcontext *gc)
{
/* Called when the context's window/buffer is going to be destroyed. */
/* Unbind from it. */
}
 
/* Called by window system just before swapping buffers.
* We have to finish any pending rendering.
*/
void
_mesa_notifySwapBuffers(__GLcontext *gc)
{
FLUSH_VERTICES( gc, 0 );
}
 
struct __GLdispatchStateRec *
_mesa_dispatchExec(__GLcontext *gc)
{
return NULL;
}
 
void
_mesa_beginDispatchOverride(__GLcontext *gc)
{
}
 
void
_mesa_endDispatchOverride(__GLcontext *gc)
{
}
 
/* Setup the exports. The window system will call these functions
* when it needs Mesa to do something.
* NOTE: Device drivers should override these functions! For example,
* the Xlib driver should plug in the XMesa*-style functions into this
* structure. The XMesa-style functions should then call the _mesa_*
* version of these functions. This is an approximation to OO design
* (inheritance and virtual functions).
*/
static void
_mesa_init_default_exports(__GLexports *exports)
{
exports->destroyContext = _mesa_destroyContext;
exports->loseCurrent = _mesa_loseCurrent;
exports->makeCurrent = _mesa_makeCurrent;
exports->shareContext = _mesa_shareContext;
exports->copyContext = _mesa_copyContext;
exports->forceCurrent = _mesa_forceCurrent;
exports->notifyResize = _mesa_notifyResize;
exports->notifyDestroy = _mesa_notifyDestroy;
exports->notifySwapBuffers = _mesa_notifySwapBuffers;
exports->dispatchExec = _mesa_dispatchExec;
exports->beginDispatchOverride = _mesa_beginDispatchOverride;
exports->endDispatchOverride = _mesa_endDispatchOverride;
}
 
 
 
/* exported OpenGL SI interface */
__GLcontext *
__glCoreCreateContext(__GLimports *imports, __GLcontextModes *modes)
{
GLcontext *ctx;
 
ctx = (GLcontext *) (*imports->calloc)(NULL, 1, sizeof(GLcontext));
if (ctx == NULL) {
return NULL;
}
 
_mesa_initialize_context(ctx, modes, NULL, imports, GL_FALSE);
ctx->imports = *imports;
 
return ctx;
}
 
 
/* exported OpenGL SI interface */
void
__glCoreNopDispatch(void)
{
#if 0
/* SI */
__gl_dispatch = __glNopDispatchState;
#else
/* Mesa */
_glapi_set_dispatch(NULL);
#endif
}
 
 
/**********************************************************************/
/***** GL Visual allocation/destruction *****/
/**********************************************************************/
 
 
/*
* Allocate a new GLvisual object.
* Input: rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
* dbFlag - double buffering?
* stereoFlag - stereo buffer?
* depthBits - requested bits per depth buffer value
* Any value in [0, 32] is acceptable but the actual
* depth type will be GLushort or GLuint as needed.
* stencilBits - requested minimum bits per stencil buffer value
* accumBits - requested minimum bits per accum buffer component
* indexBits - number of bits per pixel if rgbFlag==GL_FALSE
* red/green/blue/alphaBits - number of bits per color component
* in frame buffer for RGB(A) mode.
* We always use 8 in core Mesa though.
* Return: pointer to new GLvisual or NULL if requested parameters can't
* be met.
*/
GLvisual *
_mesa_create_visual( GLboolean rgbFlag,
GLboolean dbFlag,
GLboolean stereoFlag,
GLint redBits,
GLint greenBits,
GLint blueBits,
GLint alphaBits,
GLint indexBits,
GLint depthBits,
GLint stencilBits,
GLint accumRedBits,
GLint accumGreenBits,
GLint accumBlueBits,
GLint accumAlphaBits,
GLint numSamples )
{
GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
if (vis) {
if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
redBits, greenBits, blueBits, alphaBits,
indexBits, depthBits, stencilBits,
accumRedBits, accumGreenBits,
accumBlueBits, accumAlphaBits,
numSamples)) {
FREE(vis);
return NULL;
}
}
return vis;
}
 
 
/*
* Initialize the fields of the given GLvisual.
* Input: see _mesa_create_visual() above.
* Return: GL_TRUE = success
* GL_FALSE = failure.
*/
GLboolean
_mesa_initialize_visual( GLvisual *vis,
GLboolean rgbFlag,
GLboolean dbFlag,
GLboolean stereoFlag,
GLint redBits,
GLint greenBits,
GLint blueBits,
GLint alphaBits,
GLint indexBits,
GLint depthBits,
GLint stencilBits,
GLint accumRedBits,
GLint accumGreenBits,
GLint accumBlueBits,
GLint accumAlphaBits,
GLint numSamples )
{
(void) numSamples;
 
assert(vis);
 
/* This is to catch bad values from device drivers not updated for
* Mesa 3.3. Some device drivers just passed 1. That's a REALLY
* bad value now (a 1-bit depth buffer!?!).
*/
assert(depthBits == 0 || depthBits > 1);
 
if (depthBits < 0 || depthBits > 32) {
return GL_FALSE;
}
if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
return GL_FALSE;
}
if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
return GL_FALSE;
}
if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
return GL_FALSE;
}
if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
return GL_FALSE;
}
if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
return GL_FALSE;
}
 
vis->rgbMode = rgbFlag;
vis->doubleBufferMode = dbFlag;
vis->stereoMode = stereoFlag;
 
vis->redBits = redBits;
vis->greenBits = greenBits;
vis->blueBits = blueBits;
vis->alphaBits = alphaBits;
 
vis->indexBits = indexBits;
vis->depthBits = depthBits;
vis->accumRedBits = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
vis->accumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
vis->accumBlueBits = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
vis->accumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
vis->stencilBits = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
 
vis->haveAccumBuffer = accumRedBits > 0;
vis->haveDepthBuffer = depthBits > 0;
vis->haveStencilBuffer = stencilBits > 0;
 
vis->numAuxBuffers = 0;
vis->level = 0;
vis->pixmapMode = 0;
 
return GL_TRUE;
}
 
 
void
_mesa_destroy_visual( GLvisual *vis )
{
FREE(vis);
}
 
 
/**********************************************************************/
/***** GL Framebuffer allocation/destruction *****/
/**********************************************************************/
 
 
/*
* Create a new framebuffer. A GLframebuffer is a struct which
* encapsulates the depth, stencil and accum buffers and related
* parameters.
* Input: visual - a GLvisual pointer (we copy the struct contents)
* softwareDepth - create/use a software depth buffer?
* softwareStencil - create/use a software stencil buffer?
* softwareAccum - create/use a software accum buffer?
* softwareAlpha - create/use a software alpha buffer?
* Return: pointer to new GLframebuffer struct or NULL if error.
*/
GLframebuffer *
_mesa_create_framebuffer( const GLvisual *visual,
GLboolean softwareDepth,
GLboolean softwareStencil,
GLboolean softwareAccum,
GLboolean softwareAlpha )
{
GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
assert(visual);
if (buffer) {
_mesa_initialize_framebuffer(buffer, visual,
softwareDepth, softwareStencil,
softwareAccum, softwareAlpha );
}
return buffer;
}
 
 
/*
* Initialize a GLframebuffer object.
* Input: See _mesa_create_framebuffer() above.
*/
void
_mesa_initialize_framebuffer( GLframebuffer *buffer,
const GLvisual *visual,
GLboolean softwareDepth,
GLboolean softwareStencil,
GLboolean softwareAccum,
GLboolean softwareAlpha )
{
assert(buffer);
assert(visual);
 
_mesa_bzero(buffer, sizeof(GLframebuffer));
 
/* sanity checks */
if (softwareDepth ) {
assert(visual->depthBits > 0);
}
if (softwareStencil) {
assert(visual->stencilBits > 0);
}
if (softwareAccum) {
assert(visual->rgbMode);
assert(visual->accumRedBits > 0);
assert(visual->accumGreenBits > 0);
assert(visual->accumBlueBits > 0);
}
if (softwareAlpha) {
assert(visual->rgbMode);
assert(visual->alphaBits > 0);
}
 
buffer->Visual = *visual;
buffer->UseSoftwareDepthBuffer = softwareDepth;
buffer->UseSoftwareStencilBuffer = softwareStencil;
buffer->UseSoftwareAccumBuffer = softwareAccum;
buffer->UseSoftwareAlphaBuffers = softwareAlpha;
}
 
 
/*
* Free a framebuffer struct and its buffers.
*/
void
_mesa_destroy_framebuffer( GLframebuffer *buffer )
{
if (buffer) {
_mesa_free_framebuffer_data(buffer);
FREE(buffer);
}
}
 
 
/*
* Free the data hanging off of <buffer>, but not <buffer> itself.
*/
void
_mesa_free_framebuffer_data( GLframebuffer *buffer )
{
if (!buffer)
return;
 
if (buffer->DepthBuffer) {
MESA_PBUFFER_FREE( buffer->DepthBuffer );
buffer->DepthBuffer = NULL;
}
if (buffer->Accum) {
MESA_PBUFFER_FREE( buffer->Accum );
buffer->Accum = NULL;
}
if (buffer->Stencil) {
MESA_PBUFFER_FREE( buffer->Stencil );
buffer->Stencil = NULL;
}
if (buffer->FrontLeftAlpha) {
MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
buffer->FrontLeftAlpha = NULL;
}
if (buffer->BackLeftAlpha) {
MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
buffer->BackLeftAlpha = NULL;
}
if (buffer->FrontRightAlpha) {
MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
buffer->FrontRightAlpha = NULL;
}
if (buffer->BackRightAlpha) {
MESA_PBUFFER_FREE( buffer->BackRightAlpha );
buffer->BackRightAlpha = NULL;
}
}
 
 
 
/**********************************************************************/
/***** Context allocation, initialization, destroying *****/
/**********************************************************************/
 
 
_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
 
 
/*
* This function just calls all the various one-time-init functions in Mesa.
*/
static void
one_time_init( GLcontext *ctx )
{
static GLboolean alreadyCalled = GL_FALSE;
_glthread_LOCK_MUTEX(OneTimeLock);
if (!alreadyCalled) {
/* do some implementation tests */
assert( sizeof(GLbyte) == 1 );
assert( sizeof(GLshort) >= 2 );
assert( sizeof(GLint) >= 4 );
assert( sizeof(GLubyte) == 1 );
assert( sizeof(GLushort) >= 2 );
assert( sizeof(GLuint) >= 4 );
 
_mesa_init_lists();
 
_math_init();
_mesa_init_math();
 
#ifdef USE_SPARC_ASM
_mesa_init_sparc_glapi_relocs();
#endif
if (_mesa_getenv("MESA_DEBUG")) {
_glapi_noop_enable_warnings(GL_TRUE);
#ifndef GLX_DIRECT_RENDERING
/* libGL from before 2002/06/28 don't have this function. Someday,
* when newer libGL libs are common, remove the #ifdef test. This
* only serves to print warnings when calling undefined GL functions.
*/
_glapi_set_warning_func( (_glapi_warning_func) _mesa_warning );
#endif
}
else {
_glapi_noop_enable_warnings(GL_FALSE);
}
 
#if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
_mesa_debug(ctx, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
#endif
 
alreadyCalled = GL_TRUE;
}
_glthread_UNLOCK_MUTEX(OneTimeLock);
}
 
 
static void
init_matrix_stack( struct matrix_stack *stack,
GLuint maxDepth, GLuint dirtyFlag )
{
GLuint i;
 
stack->Depth = 0;
stack->MaxDepth = maxDepth;
stack->DirtyFlag = dirtyFlag;
/* The stack */
stack->Stack = (GLmatrix *) CALLOC(maxDepth * sizeof(GLmatrix));
for (i = 0; i < maxDepth; i++) {
_math_matrix_ctr(&stack->Stack[i]);
_math_matrix_alloc_inv(&stack->Stack[i]);
}
stack->Top = stack->Stack;
}
 
 
static void
free_matrix_stack( struct matrix_stack *stack )
{
GLuint i;
for (i = 0; i < stack->MaxDepth; i++) {
_math_matrix_dtr(&stack->Stack[i]);
}
FREE(stack->Stack);
stack->Stack = stack->Top = NULL;
}
 
 
/*
* Allocate and initialize a shared context state structure.
*/
static struct gl_shared_state *
alloc_shared_state( void )
{
struct gl_shared_state *ss;
GLboolean outOfMemory;
 
ss = CALLOC_STRUCT(gl_shared_state);
if (!ss)
return NULL;
 
_glthread_INIT_MUTEX(ss->Mutex);
 
ss->DisplayList = _mesa_NewHashTable();
ss->TexObjects = _mesa_NewHashTable();
#if FEATURE_NV_vertex_program
ss->VertexPrograms = _mesa_NewHashTable();
#endif
 
/* Default Texture objects */
outOfMemory = GL_FALSE;
 
ss->Default1D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_1D);
if (!ss->Default1D) {
outOfMemory = GL_TRUE;
}
 
ss->Default2D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_2D);
if (!ss->Default2D) {
outOfMemory = GL_TRUE;
}
 
ss->Default3D = _mesa_alloc_texture_object(ss, 0, GL_TEXTURE_3D);
if (!ss->Default3D) {
outOfMemory = GL_TRUE;
}
 
ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0,
GL_TEXTURE_CUBE_MAP_ARB);
if (!ss->DefaultCubeMap) {
outOfMemory = GL_TRUE;
}
 
ss->DefaultRect = _mesa_alloc_texture_object(ss, 0,
GL_TEXTURE_RECTANGLE_NV);
if (!ss->DefaultRect) {
outOfMemory = GL_TRUE;
}
 
if (!ss->DisplayList || !ss->TexObjects
#if FEATURE_NV_vertex_program
|| !ss->VertexPrograms
#endif
|| outOfMemory) {
/* Ran out of memory at some point. Free everything and return NULL */
if (ss->DisplayList)
_mesa_DeleteHashTable(ss->DisplayList);
if (ss->TexObjects)
_mesa_DeleteHashTable(ss->TexObjects);
if (ss->VertexPrograms)
_mesa_DeleteHashTable(ss->VertexPrograms);
if (ss->Default1D)
_mesa_free_texture_object(ss, ss->Default1D);
if (ss->Default2D)
_mesa_free_texture_object(ss, ss->Default2D);
if (ss->Default3D)
_mesa_free_texture_object(ss, ss->Default3D);
if (ss->DefaultCubeMap)
_mesa_free_texture_object(ss, ss->DefaultCubeMap);
if (ss->DefaultRect)
_mesa_free_texture_object(ss, ss->DefaultRect);
FREE(ss);
return NULL;
}
else {
return ss;
}
}
 
 
/*
* Deallocate a shared state context and all children structures.
*/
static void
free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
{
/* Free display lists */
while (1) {
GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
if (list) {
_mesa_destroy_list(ctx, list);
}
else {
break;
}
}
_mesa_DeleteHashTable(ss->DisplayList);
 
/* Free texture objects */
while (ss->TexObjectList) {
if (ctx->Driver.DeleteTexture)
(*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
/* this function removes from linked list too! */
_mesa_free_texture_object(ss, ss->TexObjectList);
}
_mesa_DeleteHashTable(ss->TexObjects);
 
#if FEATURE_NV_vertex_program
/* Free vertex programs */
while (1) {
GLuint prog = _mesa_HashFirstEntry(ss->VertexPrograms);
if (prog) {
_mesa_delete_program(ctx, prog);
}
else {
break;
}
}
_mesa_DeleteHashTable(ss->VertexPrograms);
#endif
 
FREE(ss);
}
 
 
 
/*
* Initialize the nth light. Note that the defaults for light 0 are
* different than the other lights.
*/
static void
init_light( struct gl_light *l, GLuint n )
{
make_empty_list( l );
 
ASSIGN_4V( l->Ambient, 0.0, 0.0, 0.0, 1.0 );
if (n==0) {
ASSIGN_4V( l->Diffuse, 1.0, 1.0, 1.0, 1.0 );
ASSIGN_4V( l->Specular, 1.0, 1.0, 1.0, 1.0 );
}
else {
ASSIGN_4V( l->Diffuse, 0.0, 0.0, 0.0, 1.0 );
ASSIGN_4V( l->Specular, 0.0, 0.0, 0.0, 1.0 );
}
ASSIGN_4V( l->EyePosition, 0.0, 0.0, 1.0, 0.0 );
ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 );
l->SpotExponent = 0.0;
_mesa_invalidate_spot_exp_table( l );
l->SpotCutoff = 180.0;
l->_CosCutoff = 0.0; /* KW: -ve values not admitted */
l->ConstantAttenuation = 1.0;
l->LinearAttenuation = 0.0;
l->QuadraticAttenuation = 0.0;
l->Enabled = GL_FALSE;
}
 
 
 
static void
init_lightmodel( struct gl_lightmodel *lm )
{
ASSIGN_4V( lm->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
lm->LocalViewer = GL_FALSE;
lm->TwoSide = GL_FALSE;
lm->ColorControl = GL_SINGLE_COLOR;
}
 
 
static void
init_material( struct gl_material *m )
{
ASSIGN_4V( m->Ambient, 0.2F, 0.2F, 0.2F, 1.0F );
ASSIGN_4V( m->Diffuse, 0.8F, 0.8F, 0.8F, 1.0F );
ASSIGN_4V( m->Specular, 0.0F, 0.0F, 0.0F, 1.0F );
ASSIGN_4V( m->Emission, 0.0F, 0.0F, 0.0F, 1.0F );
m->Shininess = 0.0;
m->AmbientIndex = 0;
m->DiffuseIndex = 1;
m->SpecularIndex = 1;
}
 
 
 
static void
init_texture_unit( GLcontext *ctx, GLuint unit )
{
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
 
texUnit->EnvMode = GL_MODULATE;
texUnit->CombineModeRGB = GL_MODULATE;
texUnit->CombineModeA = GL_MODULATE;
texUnit->CombineSourceRGB[0] = GL_TEXTURE;
texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT;
texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT;
texUnit->CombineSourceA[0] = GL_TEXTURE;
texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT;
texUnit->CombineSourceA[2] = GL_CONSTANT_EXT;
texUnit->CombineOperandRGB[0] = GL_SRC_COLOR;
texUnit->CombineOperandRGB[1] = GL_SRC_COLOR;
texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA;
texUnit->CombineOperandA[0] = GL_SRC_ALPHA;
texUnit->CombineOperandA[1] = GL_SRC_ALPHA;
texUnit->CombineOperandA[2] = GL_SRC_ALPHA;
texUnit->CombineScaleShiftRGB = 0;
texUnit->CombineScaleShiftA = 0;
 
ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
texUnit->TexGenEnabled = 0;
texUnit->GenModeS = GL_EYE_LINEAR;
texUnit->GenModeT = GL_EYE_LINEAR;
texUnit->GenModeR = GL_EYE_LINEAR;
texUnit->GenModeQ = GL_EYE_LINEAR;
texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
 
/* Yes, these plane coefficients are correct! */
ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
 
texUnit->Current1D = ctx->Shared->Default1D;
texUnit->Current2D = ctx->Shared->Default2D;
texUnit->Current3D = ctx->Shared->Default3D;
texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
texUnit->CurrentRect = ctx->Shared->DefaultRect;
}
 
 
 
 
/* Initialize a 1-D evaluator map */
static void
init_1d_map( struct gl_1d_map *map, int n, const float *initial )
{
map->Order = 1;
map->u1 = 0.0;
map->u2 = 1.0;
map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
if (map->Points) {
GLint i;
for (i=0;i<n;i++)
map->Points[i] = initial[i];
}
}
 
 
/* Initialize a 2-D evaluator map */
static void
init_2d_map( struct gl_2d_map *map, int n, const float *initial )
{
map->Uorder = 1;
map->Vorder = 1;
map->u1 = 0.0;
map->u2 = 1.0;
map->v1 = 0.0;
map->v2 = 1.0;
map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat));
if (map->Points) {
GLint i;
for (i=0;i<n;i++)
map->Points[i] = initial[i];
}
}
 
 
/*
* Initialize the attribute groups in a GLcontext.
*/
static void
init_attrib_groups( GLcontext *ctx )
{
GLuint i;
 
assert(ctx);
 
assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
 
/* Constants, may be overriden by device drivers */
ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
ctx->Const.Max3DTextureLevels = MAX_3D_TEXTURE_LEVELS;
ctx->Const.MaxCubeTextureLevels = MAX_CUBE_TEXTURE_LEVELS;
ctx->Const.MaxTextureRectSize = MAX_TEXTURE_RECT_SIZE;
ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
ctx->Const.MaxTextureMaxAnisotropy = MAX_TEXTURE_MAX_ANISOTROPY;
ctx->Const.MaxTextureLodBias = MAX_TEXTURE_LOD_BIAS;
ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
ctx->Const.MinPointSize = MIN_POINT_SIZE;
ctx->Const.MaxPointSize = MAX_POINT_SIZE;
ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
ctx->Const.PointSizeGranularity = (GLfloat) POINT_SIZE_GRANULARITY;
ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
ctx->Const.LineWidthGranularity = (GLfloat) LINE_WIDTH_GRANULARITY;
ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
ctx->Const.MaxLights = MAX_LIGHTS;
 
/* Initialize matrix stacks */
init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
_NEW_MODELVIEW);
init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
_NEW_PROJECTION);
init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
_NEW_COLOR_MATRIX);
for (i = 0; i < MAX_TEXTURE_UNITS; i++)
init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
_NEW_TEXTURE_MATRIX);
for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
_NEW_TRACK_MATRIX);
ctx->CurrentStack = &ctx->ModelviewMatrixStack;
 
/* Init combined Modelview*Projection matrix */
_math_matrix_ctr( &ctx->_ModelProjectMatrix );
 
/* Accumulate buffer group */
ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
 
/* Color buffer group */
ctx->Color.IndexMask = 0xffffffff;
ctx->Color.ColorMask[0] = 0xff;
ctx->Color.ColorMask[1] = 0xff;
ctx->Color.ColorMask[2] = 0xff;
ctx->Color.ColorMask[3] = 0xff;
ctx->Color.ClearIndex = 0;
ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
ctx->Color.DrawBuffer = GL_FRONT;
ctx->Color.AlphaEnabled = GL_FALSE;
ctx->Color.AlphaFunc = GL_ALWAYS;
ctx->Color.AlphaRef = 0;
ctx->Color.BlendEnabled = GL_FALSE;
ctx->Color.BlendSrcRGB = GL_ONE;
ctx->Color.BlendDstRGB = GL_ZERO;
ctx->Color.BlendSrcA = GL_ONE;
ctx->Color.BlendDstA = GL_ZERO;
ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
ctx->Color.IndexLogicOpEnabled = GL_FALSE;
ctx->Color.ColorLogicOpEnabled = GL_FALSE;
ctx->Color.LogicOp = GL_COPY;
ctx->Color.DitherFlag = GL_TRUE;
 
/* Current group */
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 0.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 0.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_FOG], 0.0, 0.0, 0.0, 0.0 );
for (i = 0; i < MAX_TEXTURE_UNITS; i++)
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], 0.0, 0.0, 0.0, 1.0 );
ctx->Current.Index = 1;
ctx->Current.EdgeFlag = GL_TRUE;
ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
ctx->Current.RasterDistance = 0.0;
ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
ctx->Current.RasterIndex = 1;
for (i=0; i<MAX_TEXTURE_UNITS; i++)
ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
ctx->Current.RasterPosValid = GL_TRUE;
 
 
/* Depth buffer group */
ctx->Depth.Test = GL_FALSE;
ctx->Depth.Clear = 1.0;
ctx->Depth.Func = GL_LESS;
ctx->Depth.Mask = GL_TRUE;
ctx->Depth.OcclusionTest = GL_FALSE;
 
/* Evaluators group */
ctx->Eval.Map1Color4 = GL_FALSE;
ctx->Eval.Map1Index = GL_FALSE;
ctx->Eval.Map1Normal = GL_FALSE;
ctx->Eval.Map1TextureCoord1 = GL_FALSE;
ctx->Eval.Map1TextureCoord2 = GL_FALSE;
ctx->Eval.Map1TextureCoord3 = GL_FALSE;
ctx->Eval.Map1TextureCoord4 = GL_FALSE;
ctx->Eval.Map1Vertex3 = GL_FALSE;
ctx->Eval.Map1Vertex4 = GL_FALSE;
MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib));
ctx->Eval.Map2Color4 = GL_FALSE;
ctx->Eval.Map2Index = GL_FALSE;
ctx->Eval.Map2Normal = GL_FALSE;
ctx->Eval.Map2TextureCoord1 = GL_FALSE;
ctx->Eval.Map2TextureCoord2 = GL_FALSE;
ctx->Eval.Map2TextureCoord3 = GL_FALSE;
ctx->Eval.Map2TextureCoord4 = GL_FALSE;
ctx->Eval.Map2Vertex3 = GL_FALSE;
ctx->Eval.Map2Vertex4 = GL_FALSE;
MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib));
ctx->Eval.AutoNormal = GL_FALSE;
ctx->Eval.MapGrid1un = 1;
ctx->Eval.MapGrid1u1 = 0.0;
ctx->Eval.MapGrid1u2 = 1.0;
ctx->Eval.MapGrid2un = 1;
ctx->Eval.MapGrid2vn = 1;
ctx->Eval.MapGrid2u1 = 0.0;
ctx->Eval.MapGrid2u2 = 1.0;
ctx->Eval.MapGrid2v1 = 0.0;
ctx->Eval.MapGrid2v2 = 1.0;
 
/* Evaluator data */
{
static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
static GLfloat index[1] = { 1.0 };
static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 };
 
init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
for (i = 0; i < 16; i++)
init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib );
 
init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
for (i = 0; i < 16; i++)
init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib );
}
 
/* Fog group */
ctx->Fog.Enabled = GL_FALSE;
ctx->Fog.Mode = GL_EXP;
ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
ctx->Fog.Index = 0.0;
ctx->Fog.Density = 1.0;
ctx->Fog.Start = 0.0;
ctx->Fog.End = 1.0;
ctx->Fog.ColorSumEnabled = GL_FALSE;
ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
 
/* Hint group */
ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
ctx->Hint.PointSmooth = GL_DONT_CARE;
ctx->Hint.LineSmooth = GL_DONT_CARE;
ctx->Hint.PolygonSmooth = GL_DONT_CARE;
ctx->Hint.Fog = GL_DONT_CARE;
ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
ctx->Hint.TextureCompression = GL_DONT_CARE;
ctx->Hint.GenerateMipmap = GL_DONT_CARE;
 
/* Histogram group */
ctx->Histogram.Width = 0;
ctx->Histogram.Format = GL_RGBA;
ctx->Histogram.Sink = GL_FALSE;
ctx->Histogram.RedSize = 0;
ctx->Histogram.GreenSize = 0;
ctx->Histogram.BlueSize = 0;
ctx->Histogram.AlphaSize = 0;
ctx->Histogram.LuminanceSize = 0;
for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
ctx->Histogram.Count[i][0] = 0;
ctx->Histogram.Count[i][1] = 0;
ctx->Histogram.Count[i][2] = 0;
ctx->Histogram.Count[i][3] = 0;
}
 
/* Min/Max group */
ctx->MinMax.Format = GL_RGBA;
ctx->MinMax.Sink = GL_FALSE;
ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
 
/* Extensions */
_mesa_extensions_ctr( ctx );
 
/* Lighting group */
for (i=0;i<MAX_LIGHTS;i++) {
init_light( &ctx->Light.Light[i], i );
}
make_empty_list( &ctx->Light.EnabledList );
 
init_lightmodel( &ctx->Light.Model );
init_material( &ctx->Light.Material[0] );
init_material( &ctx->Light.Material[1] );
ctx->Light.ShadeModel = GL_SMOOTH;
ctx->Light.Enabled = GL_FALSE;
ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
ctx->Light.ColorMaterialBitmask = _mesa_material_bitmask( ctx,
GL_FRONT_AND_BACK,
GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
 
ctx->Light.ColorMaterialEnabled = GL_FALSE;
 
/* Lighting miscellaneous */
ctx->_ShineTabList = MALLOC_STRUCT( gl_shine_tab );
make_empty_list( ctx->_ShineTabList );
for (i = 0 ; i < 10 ; i++) {
struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
s->shininess = -1;
s->refcount = 0;
insert_at_tail( ctx->_ShineTabList, s );
}
 
 
/* Line group */
ctx->Line.SmoothFlag = GL_FALSE;
ctx->Line.StippleFlag = GL_FALSE;
ctx->Line.Width = 1.0;
ctx->Line._Width = 1.0;
ctx->Line.StipplePattern = 0xffff;
ctx->Line.StippleFactor = 1;
 
/* Display List group */
ctx->List.ListBase = 0;
 
/* Multisample */
ctx->Multisample.Enabled = GL_FALSE;
ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
ctx->Multisample.SampleAlphaToOne = GL_FALSE;
ctx->Multisample.SampleCoverage = GL_FALSE;
ctx->Multisample.SampleCoverageValue = 1.0;
ctx->Multisample.SampleCoverageInvert = GL_FALSE;
 
/* Pixel group */
ctx->Pixel.RedBias = 0.0;
ctx->Pixel.RedScale = 1.0;
ctx->Pixel.GreenBias = 0.0;
ctx->Pixel.GreenScale = 1.0;
ctx->Pixel.BlueBias = 0.0;
ctx->Pixel.BlueScale = 1.0;
ctx->Pixel.AlphaBias = 0.0;
ctx->Pixel.AlphaScale = 1.0;
ctx->Pixel.DepthBias = 0.0;
ctx->Pixel.DepthScale = 1.0;
ctx->Pixel.IndexOffset = 0;
ctx->Pixel.IndexShift = 0;
ctx->Pixel.ZoomX = 1.0;
ctx->Pixel.ZoomY = 1.0;
ctx->Pixel.MapColorFlag = GL_FALSE;
ctx->Pixel.MapStencilFlag = GL_FALSE;
ctx->Pixel.MapStoSsize = 1;
ctx->Pixel.MapItoIsize = 1;
ctx->Pixel.MapItoRsize = 1;
ctx->Pixel.MapItoGsize = 1;
ctx->Pixel.MapItoBsize = 1;
ctx->Pixel.MapItoAsize = 1;
ctx->Pixel.MapRtoRsize = 1;
ctx->Pixel.MapGtoGsize = 1;
ctx->Pixel.MapBtoBsize = 1;
ctx->Pixel.MapAtoAsize = 1;
ctx->Pixel.MapStoS[0] = 0;
ctx->Pixel.MapItoI[0] = 0;
ctx->Pixel.MapItoR[0] = 0.0;
ctx->Pixel.MapItoG[0] = 0.0;
ctx->Pixel.MapItoB[0] = 0.0;
ctx->Pixel.MapItoA[0] = 0.0;
ctx->Pixel.MapItoR8[0] = 0;
ctx->Pixel.MapItoG8[0] = 0;
ctx->Pixel.MapItoB8[0] = 0;
ctx->Pixel.MapItoA8[0] = 0;
ctx->Pixel.MapRtoR[0] = 0.0;
ctx->Pixel.MapGtoG[0] = 0.0;
ctx->Pixel.MapBtoB[0] = 0.0;
ctx->Pixel.MapAtoA[0] = 0.0;
ctx->Pixel.HistogramEnabled = GL_FALSE;
ctx->Pixel.MinMaxEnabled = GL_FALSE;
ctx->Pixel.PixelTextureEnabled = GL_FALSE;
ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0);
ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0);
ctx->Pixel.ColorTableEnabled = GL_FALSE;
ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
ctx->Pixel.Convolution1DEnabled = GL_FALSE;
ctx->Pixel.Convolution2DEnabled = GL_FALSE;
ctx->Pixel.Separable2DEnabled = GL_FALSE;
for (i = 0; i < 3; i++) {
ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
}
for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {
ctx->Convolution1D.Filter[i] = 0.0;
ctx->Convolution2D.Filter[i] = 0.0;
ctx->Separable2D.Filter[i] = 0.0;
}
ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
 
/* Point group */
ctx->Point.SmoothFlag = GL_FALSE;
ctx->Point.Size = 1.0;
ctx->Point._Size = 1.0;
ctx->Point.Params[0] = 1.0;
ctx->Point.Params[1] = 0.0;
ctx->Point.Params[2] = 0.0;
ctx->Point._Attenuated = GL_FALSE;
ctx->Point.MinSize = 0.0;
ctx->Point.MaxSize = ctx->Const.MaxPointSize;
ctx->Point.Threshold = 1.0;
ctx->Point.PointSprite = GL_FALSE; /* GL_NV_point_sprite */
ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite */
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_NV_point_sprite */
}
 
/* Polygon group */
ctx->Polygon.CullFlag = GL_FALSE;
ctx->Polygon.CullFaceMode = GL_BACK;
ctx->Polygon.FrontFace = GL_CCW;
ctx->Polygon._FrontBit = 0;
ctx->Polygon.FrontMode = GL_FILL;
ctx->Polygon.BackMode = GL_FILL;
ctx->Polygon.SmoothFlag = GL_FALSE;
ctx->Polygon.StippleFlag = GL_FALSE;
ctx->Polygon.OffsetFactor = 0.0F;
ctx->Polygon.OffsetUnits = 0.0F;
ctx->Polygon.OffsetPoint = GL_FALSE;
ctx->Polygon.OffsetLine = GL_FALSE;
ctx->Polygon.OffsetFill = GL_FALSE;
 
/* Polygon Stipple group */
MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
 
/* Scissor group */
ctx->Scissor.Enabled = GL_FALSE;
ctx->Scissor.X = 0;
ctx->Scissor.Y = 0;
ctx->Scissor.Width = 0;
ctx->Scissor.Height = 0;
 
/* Stencil group */
ctx->Stencil.Enabled = GL_FALSE;
ctx->Stencil.TestTwoSide = GL_FALSE;
ctx->Stencil.ActiveFace = 0; /* 0 = GL_FRONT, 1 = GL_BACK */
ctx->Stencil.Function[0] = GL_ALWAYS;
ctx->Stencil.Function[1] = GL_ALWAYS;
ctx->Stencil.FailFunc[0] = GL_KEEP;
ctx->Stencil.FailFunc[1] = GL_KEEP;
ctx->Stencil.ZPassFunc[0] = GL_KEEP;
ctx->Stencil.ZPassFunc[1] = GL_KEEP;
ctx->Stencil.ZFailFunc[0] = GL_KEEP;
ctx->Stencil.ZFailFunc[1] = GL_KEEP;
ctx->Stencil.Ref[0] = 0;
ctx->Stencil.Ref[1] = 0;
ctx->Stencil.ValueMask[0] = STENCIL_MAX;
ctx->Stencil.ValueMask[1] = STENCIL_MAX;
ctx->Stencil.WriteMask[0] = STENCIL_MAX;
ctx->Stencil.WriteMask[1] = STENCIL_MAX;
ctx->Stencil.Clear = 0;
 
/* Texture group */
ctx->Texture.CurrentUnit = 0; /* multitexture */
ctx->Texture._EnabledUnits = 0;
for (i=0; i<MAX_TEXTURE_UNITS; i++)
init_texture_unit( ctx, i );
ctx->Texture.SharedPalette = GL_FALSE;
_mesa_init_colortable(&ctx->Texture.Palette);
 
/* Transformation group */
ctx->Transform.MatrixMode = GL_MODELVIEW;
ctx->Transform.Normalize = GL_FALSE;
ctx->Transform.RescaleNormals = GL_FALSE;
ctx->Transform.RasterPositionUnclipped = GL_FALSE;
for (i=0;i<MAX_CLIP_PLANES;i++) {
ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
}
ctx->Transform.ClipPlanesEnabled = 0;
 
/* Viewport group */
ctx->Viewport.X = 0;
ctx->Viewport.Y = 0;
ctx->Viewport.Width = 0;
ctx->Viewport.Height = 0;
ctx->Viewport.Near = 0.0;
ctx->Viewport.Far = 1.0;
_math_matrix_ctr(&ctx->Viewport._WindowMap);
 
#define Sz 10
#define Tz 14
ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF;
ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF;
#undef Sz
#undef Tz
 
ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT;
 
/* Vertex arrays */
ctx->Array.Vertex.Size = 4;
ctx->Array.Vertex.Type = GL_FLOAT;
ctx->Array.Vertex.Stride = 0;
ctx->Array.Vertex.StrideB = 0;
ctx->Array.Vertex.Ptr = NULL;
ctx->Array.Vertex.Enabled = GL_FALSE;
ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
ctx->Array.Normal.Type = GL_FLOAT;
ctx->Array.Normal.Stride = 0;
ctx->Array.Normal.StrideB = 0;
ctx->Array.Normal.Ptr = NULL;
ctx->Array.Normal.Enabled = GL_FALSE;
ctx->Array.Normal.Flags = CA_CLIENT_DATA;
ctx->Array.Color.Size = 4;
ctx->Array.Color.Type = GL_FLOAT;
ctx->Array.Color.Stride = 0;
ctx->Array.Color.StrideB = 0;
ctx->Array.Color.Ptr = NULL;
ctx->Array.Color.Enabled = GL_FALSE;
ctx->Array.Color.Flags = CA_CLIENT_DATA;
ctx->Array.SecondaryColor.Size = 4;
ctx->Array.SecondaryColor.Type = GL_FLOAT;
ctx->Array.SecondaryColor.Stride = 0;
ctx->Array.SecondaryColor.StrideB = 0;
ctx->Array.SecondaryColor.Ptr = NULL;
ctx->Array.SecondaryColor.Enabled = GL_FALSE;
ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
ctx->Array.FogCoord.Size = 1;
ctx->Array.FogCoord.Type = GL_FLOAT;
ctx->Array.FogCoord.Stride = 0;
ctx->Array.FogCoord.StrideB = 0;
ctx->Array.FogCoord.Ptr = NULL;
ctx->Array.FogCoord.Enabled = GL_FALSE;
ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
ctx->Array.Index.Type = GL_FLOAT;
ctx->Array.Index.Stride = 0;
ctx->Array.Index.StrideB = 0;
ctx->Array.Index.Ptr = NULL;
ctx->Array.Index.Enabled = GL_FALSE;
ctx->Array.Index.Flags = CA_CLIENT_DATA;
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
ctx->Array.TexCoord[i].Size = 4;
ctx->Array.TexCoord[i].Type = GL_FLOAT;
ctx->Array.TexCoord[i].Stride = 0;
ctx->Array.TexCoord[i].StrideB = 0;
ctx->Array.TexCoord[i].Ptr = NULL;
ctx->Array.TexCoord[i].Enabled = GL_FALSE;
ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
}
ctx->Array.TexCoordInterleaveFactor = 1;
ctx->Array.EdgeFlag.Stride = 0;
ctx->Array.EdgeFlag.StrideB = 0;
ctx->Array.EdgeFlag.Ptr = NULL;
ctx->Array.EdgeFlag.Enabled = GL_FALSE;
ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */
 
/* Pixel transfer */
ctx->Pack.Alignment = 4;
ctx->Pack.RowLength = 0;
ctx->Pack.ImageHeight = 0;
ctx->Pack.SkipPixels = 0;
ctx->Pack.SkipRows = 0;
ctx->Pack.SkipImages = 0;
ctx->Pack.SwapBytes = GL_FALSE;
ctx->Pack.LsbFirst = GL_FALSE;
ctx->Unpack.Alignment = 4;
ctx->Unpack.RowLength = 0;
ctx->Unpack.ImageHeight = 0;
ctx->Unpack.SkipPixels = 0;
ctx->Unpack.SkipRows = 0;
ctx->Unpack.SkipImages = 0;
ctx->Unpack.SwapBytes = GL_FALSE;
ctx->Unpack.LsbFirst = GL_FALSE;
 
/* Feedback */
ctx->Feedback.Type = GL_2D; /* TODO: verify */
ctx->Feedback.Buffer = NULL;
ctx->Feedback.BufferSize = 0;
ctx->Feedback.Count = 0;
 
/* Selection/picking */
ctx->Select.Buffer = NULL;
ctx->Select.BufferSize = 0;
ctx->Select.BufferCount = 0;
ctx->Select.Hits = 0;
ctx->Select.NameStackDepth = 0;
 
/* Renderer and client attribute stacks */
ctx->AttribStackDepth = 0;
ctx->ClientAttribStackDepth = 0;
 
/* Display list */
ctx->CallDepth = 0;
ctx->ExecuteFlag = GL_TRUE;
ctx->CompileFlag = GL_FALSE;
ctx->CurrentListPtr = NULL;
ctx->CurrentBlock = NULL;
ctx->CurrentListNum = 0;
ctx->CurrentPos = 0;
 
/* Color tables */
_mesa_init_colortable(&ctx->ColorTable);
_mesa_init_colortable(&ctx->ProxyColorTable);
_mesa_init_colortable(&ctx->PostConvolutionColorTable);
_mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
_mesa_init_colortable(&ctx->PostColorMatrixColorTable);
_mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
 
/* GL_NV_vertex_program */
ctx->VertexProgram.Enabled = GL_FALSE;
ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
ctx->VertexProgram.CurrentID = 0;
ctx->VertexProgram.ErrorPos = -1;
ctx->VertexProgram.Current = NULL;
for (i = 0; i < VP_NUM_PROG_REGS / 4; i++) {
ctx->VertexProgram.TrackMatrix[i] = GL_NONE;
ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV;
}
 
/* Miscellaneous */
ctx->NewState = _NEW_ALL;
ctx->RenderMode = GL_RENDER;
ctx->_ImageTransferState = 0;
 
ctx->_NeedNormals = 0;
ctx->_NeedEyeCoords = 0;
ctx->_ModelViewInvScale = 1.0;
 
ctx->ErrorValue = (GLenum) GL_NO_ERROR;
 
ctx->CatchSignals = GL_TRUE;
ctx->OcclusionResult = GL_FALSE;
ctx->OcclusionResultSaved = GL_FALSE;
ctx->_Facing = 0;
 
/* For debug/development only */
ctx->NoRaster = _mesa_getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
ctx->FirstTimeCurrent = GL_TRUE;
 
/* Dither disable */
ctx->NoDither = _mesa_getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
if (ctx->NoDither) {
if (_mesa_getenv("MESA_DEBUG")) {
_mesa_debug(ctx, "MESA_NO_DITHER set - dithering disabled\n");
}
ctx->Color.DitherFlag = GL_FALSE;
}
}
 
 
 
 
/*
* Allocate the proxy textures. If we run out of memory part way through
* the allocations clean up and return GL_FALSE.
* Return: GL_TRUE=success, GL_FALSE=failure
*/
static GLboolean
alloc_proxy_textures( GLcontext *ctx )
{
GLboolean out_of_memory;
GLint i;
 
ctx->Texture.Proxy1D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_1D);
if (!ctx->Texture.Proxy1D) {
return GL_FALSE;
}
 
ctx->Texture.Proxy2D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_2D);
if (!ctx->Texture.Proxy2D) {
_mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
return GL_FALSE;
}
 
ctx->Texture.Proxy3D = _mesa_alloc_texture_object(NULL, 0, GL_TEXTURE_3D);
if (!ctx->Texture.Proxy3D) {
_mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
return GL_FALSE;
}
 
ctx->Texture.ProxyCubeMap = _mesa_alloc_texture_object(NULL, 0,
GL_TEXTURE_CUBE_MAP_ARB);
if (!ctx->Texture.ProxyCubeMap) {
_mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
return GL_FALSE;
}
 
ctx->Texture.ProxyRect = _mesa_alloc_texture_object(NULL, 0,
GL_TEXTURE_RECTANGLE_NV);
if (!ctx->Texture.ProxyRect) {
_mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
_mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
return GL_FALSE;
}
 
out_of_memory = GL_FALSE;
for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
ctx->Texture.ProxyCubeMap->Image[i] = _mesa_alloc_texture_image();
if (!ctx->Texture.Proxy1D->Image[i]
|| !ctx->Texture.Proxy2D->Image[i]
|| !ctx->Texture.Proxy3D->Image[i]
|| !ctx->Texture.ProxyCubeMap->Image[i]) {
out_of_memory = GL_TRUE;
}
}
ctx->Texture.ProxyRect->Image[0] = _mesa_alloc_texture_image();
if (!ctx->Texture.ProxyRect->Image[0])
out_of_memory = GL_TRUE;
 
if (out_of_memory) {
for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
if (ctx->Texture.Proxy1D->Image[i]) {
_mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
}
if (ctx->Texture.Proxy2D->Image[i]) {
_mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
}
if (ctx->Texture.Proxy3D->Image[i]) {
_mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
}
if (ctx->Texture.ProxyCubeMap->Image[i]) {
_mesa_free_texture_image(ctx->Texture.ProxyCubeMap->Image[i]);
}
}
if (ctx->Texture.ProxyRect->Image[0]) {
_mesa_free_texture_image(ctx->Texture.ProxyRect->Image[0]);
}
_mesa_free_texture_object(NULL, ctx->Texture.Proxy1D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy2D);
_mesa_free_texture_object(NULL, ctx->Texture.Proxy3D);
_mesa_free_texture_object(NULL, ctx->Texture.ProxyCubeMap);
_mesa_free_texture_object(NULL, ctx->Texture.ProxyRect);
return GL_FALSE;
}
else {
return GL_TRUE;
}
}
 
 
static void add_debug_flags( const char *debug )
{
#ifdef MESA_DEBUG
if (_mesa_strstr(debug, "varray"))
MESA_VERBOSE |= VERBOSE_VARRAY;
 
if (_mesa_strstr(debug, "tex"))
MESA_VERBOSE |= VERBOSE_TEXTURE;
 
if (_mesa_strstr(debug, "imm"))
MESA_VERBOSE |= VERBOSE_IMMEDIATE;
 
if (_mesa_strstr(debug, "pipe"))
MESA_VERBOSE |= VERBOSE_PIPELINE;
 
if (_mesa_strstr(debug, "driver"))
MESA_VERBOSE |= VERBOSE_DRIVER;
 
if (_mesa_strstr(debug, "state"))
MESA_VERBOSE |= VERBOSE_STATE;
 
if (_mesa_strstr(debug, "api"))
MESA_VERBOSE |= VERBOSE_API;
 
if (_mesa_strstr(debug, "list"))
MESA_VERBOSE |= VERBOSE_DISPLAY_LIST;
 
if (_mesa_strstr(debug, "lighting"))
MESA_VERBOSE |= VERBOSE_LIGHTING;
/* Debug flag:
*/
if (_mesa_strstr(debug, "flush"))
MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
#endif
}
 
 
/*
* Initialize a GLcontext struct. This includes allocating all the
* other structs and arrays which hang off of the context by pointers.
*/
GLboolean
_mesa_initialize_context( GLcontext *ctx,
const GLvisual *visual,
GLcontext *share_list,
void *driver_ctx,
GLboolean direct )
{
GLuint dispatchSize;
const char *c;
 
ASSERT(driver_ctx);
 
/* If the driver wants core Mesa to use special imports, it'll have to
* override these defaults.
*/
_mesa_init_default_imports( &(ctx->imports), driver_ctx );
 
/* initialize the exports (Mesa functions called by the window system) */
_mesa_init_default_exports( &(ctx->exports) );
 
/* misc one-time initializations */
one_time_init(ctx);
 
ctx->DriverCtx = driver_ctx;
ctx->Visual = *visual;
ctx->DrawBuffer = NULL;
ctx->ReadBuffer = NULL;
 
if (share_list) {
/* share state with another context */
ctx->Shared = share_list->Shared;
}
else {
/* allocate new, unshared state */
ctx->Shared = alloc_shared_state();
if (!ctx->Shared) {
return GL_FALSE;
}
}
_glthread_LOCK_MUTEX(ctx->Shared->Mutex);
ctx->Shared->RefCount++;
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
/* Effectively bind the default textures to all texture units */
ctx->Shared->Default1D->RefCount += MAX_TEXTURE_UNITS;
ctx->Shared->Default2D->RefCount += MAX_TEXTURE_UNITS;
ctx->Shared->Default3D->RefCount += MAX_TEXTURE_UNITS;
ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_UNITS;
ctx->Shared->DefaultRect->RefCount += MAX_TEXTURE_UNITS;
 
init_attrib_groups( ctx );
 
if (visual->doubleBufferMode) {
ctx->Color.DrawBuffer = GL_BACK;
ctx->Color._DrawDestMask = BACK_LEFT_BIT;
ctx->Pixel.ReadBuffer = GL_BACK;
ctx->Pixel._ReadSrcMask = BACK_LEFT_BIT;
}
else {
ctx->Color.DrawBuffer = GL_FRONT;
ctx->Color._DrawDestMask = FRONT_LEFT_BIT;
ctx->Pixel.ReadBuffer = GL_FRONT;
ctx->Pixel._ReadSrcMask = FRONT_LEFT_BIT;
}
 
if (!alloc_proxy_textures(ctx)) {
free_shared_state(ctx, ctx->Shared);
return GL_FALSE;
}
 
/*
* For XFree86/DRI: tell libGL to add these functions to the dispatcher.
* Basically, we should add all extension functions above offset 577.
* This enables older libGL libraries to work with newer drivers that
* have newer extensions.
*/
/* GL_ARB_window_pos aliases with GL_MESA_window_pos */
_glapi_add_entrypoint("glWindowPos2dARB", 513);
_glapi_add_entrypoint("glWindowPos2dvARB", 514);
_glapi_add_entrypoint("glWindowPos2fARB", 515);
_glapi_add_entrypoint("glWindowPos2fvARB", 516);
_glapi_add_entrypoint("glWindowPos2iARB", 517);
_glapi_add_entrypoint("glWindowPos2ivARB", 518);
_glapi_add_entrypoint("glWindowPos2sARB", 519);
_glapi_add_entrypoint("glWindowPos2svARB", 520);
_glapi_add_entrypoint("glWindowPos3dARB", 521);
_glapi_add_entrypoint("glWindowPos3dvARB", 522);
_glapi_add_entrypoint("glWindowPos3fARB", 523);
_glapi_add_entrypoint("glWindowPos3fvARB", 524);
_glapi_add_entrypoint("glWindowPos3iARB", 525);
_glapi_add_entrypoint("glWindowPos3ivARB", 526);
_glapi_add_entrypoint("glWindowPos3sARB", 527);
_glapi_add_entrypoint("glWindowPos3svARB", 528);
/* new extension functions */
_glapi_add_entrypoint("glAreProgramsResidentNV", 578);
_glapi_add_entrypoint("glBindProgramNV", 579);
_glapi_add_entrypoint("glDeleteProgramsNV", 580);
_glapi_add_entrypoint("glExecuteProgramNV", 581);
_glapi_add_entrypoint("glGenProgramsNV", 582);
_glapi_add_entrypoint("glGetProgramParameterdvNV", 583);
_glapi_add_entrypoint("glGetProgramParameterfvNV", 584);
_glapi_add_entrypoint("glGetProgramivNV", 585);
_glapi_add_entrypoint("glGetProgramStringNV", 586);
_glapi_add_entrypoint("glGetTrackMatrixivNV", 587);
_glapi_add_entrypoint("glGetVertexAttribdvNV", 588);
_glapi_add_entrypoint("glGetVertexAttribfvNV", 589);
_glapi_add_entrypoint("glGetVertexAttribivNV", 590);
_glapi_add_entrypoint("glGetVertexAttribPointervNV", 591);
_glapi_add_entrypoint("glIsProgramNV", 592);
_glapi_add_entrypoint("glLoadProgramNV", 593);
_glapi_add_entrypoint("glProgramParameter4dNV", 594);
_glapi_add_entrypoint("glProgramParameter4dvNV", 595);
_glapi_add_entrypoint("glProgramParameter4fNV", 596);
_glapi_add_entrypoint("glProgramParameter4fvNV", 597);
_glapi_add_entrypoint("glProgramParameters4dvNV", 598);
_glapi_add_entrypoint("glProgramParameters4fvNV", 599);
_glapi_add_entrypoint("glRequestResidentProgramsNV", 600);
_glapi_add_entrypoint("glTrackMatrixNV", 601);
_glapi_add_entrypoint("glVertexAttribPointerNV", 602);
_glapi_add_entrypoint("glVertexAttrib1dNV", 603);
_glapi_add_entrypoint("glVertexAttrib1dvNV", 604);
_glapi_add_entrypoint("glVertexAttrib1fNV", 605);
_glapi_add_entrypoint("glVertexAttrib1fvNV", 606);
_glapi_add_entrypoint("glVertexAttrib1sNV", 607);
_glapi_add_entrypoint("glVertexAttrib1svNV", 608);
_glapi_add_entrypoint("glVertexAttrib2dNV", 609);
_glapi_add_entrypoint("glVertexAttrib2dvNV", 610);
_glapi_add_entrypoint("glVertexAttrib2fNV", 611);
_glapi_add_entrypoint("glVertexAttrib2fvNV", 612);
_glapi_add_entrypoint("glVertexAttrib2sNV", 613);
_glapi_add_entrypoint("glVertexAttrib2svNV", 614);
_glapi_add_entrypoint("glVertexAttrib3dNV", 615);
_glapi_add_entrypoint("glVertexAttrib3dvNV", 616);
_glapi_add_entrypoint("glVertexAttrib3fNV", 617);
_glapi_add_entrypoint("glVertexAttrib3fvNV", 618);
_glapi_add_entrypoint("glVertexAttrib3sNV", 619);
_glapi_add_entrypoint("glVertexAttrib3svNV", 620);
_glapi_add_entrypoint("glVertexAttrib4dNV", 621);
_glapi_add_entrypoint("glVertexAttrib4dvNV", 622);
_glapi_add_entrypoint("glVertexAttrib4fNV", 623);
_glapi_add_entrypoint("glVertexAttrib4fvNV", 624);
_glapi_add_entrypoint("glVertexAttrib4sNV", 625);
_glapi_add_entrypoint("glVertexAttrib4svNV", 626);
_glapi_add_entrypoint("glVertexAttrib4ubNV", 627);
_glapi_add_entrypoint("glVertexAttrib4ubvNV", 628);
_glapi_add_entrypoint("glVertexAttribs1dvNV", 629);
_glapi_add_entrypoint("glVertexAttribs1fvNV", 630);
_glapi_add_entrypoint("glVertexAttribs1svNV", 631);
_glapi_add_entrypoint("glVertexAttribs2dvNV", 632);
_glapi_add_entrypoint("glVertexAttribs2fvNV", 633);
_glapi_add_entrypoint("glVertexAttribs2svNV", 634);
_glapi_add_entrypoint("glVertexAttribs3dvNV", 635);
_glapi_add_entrypoint("glVertexAttribs3fvNV", 636);
_glapi_add_entrypoint("glVertexAttribs3svNV", 637);
_glapi_add_entrypoint("glVertexAttribs4dvNV", 638);
_glapi_add_entrypoint("glVertexAttribs4fvNV", 639);
_glapi_add_entrypoint("glVertexAttribs4svNV", 640);
_glapi_add_entrypoint("glVertexAttribs4ubvNV", 641);
_glapi_add_entrypoint("glPointParameteriNV", 642);
_glapi_add_entrypoint("glPointParameterivNV", 643);
_glapi_add_entrypoint("glMultiDrawArraysEXT", 644);
_glapi_add_entrypoint("glMultiDrawElementsEXT", 645);
_glapi_add_entrypoint("glActiveStencilFaceEXT", 646);
_glapi_add_entrypoint("glDeleteFencesNV", 647);
_glapi_add_entrypoint("glGenFencesNV", 648);
_glapi_add_entrypoint("glIsFenceNV", 649);
_glapi_add_entrypoint("glTestFenceNV", 650);
_glapi_add_entrypoint("glGetFenceivNV", 651);
_glapi_add_entrypoint("glFinishFenceNV", 652);
_glapi_add_entrypoint("glSetFenceNV", 653);
 
/* Find the larger of Mesa's dispatch table and libGL's dispatch table.
* In practice, this'll be the same for stand-alone Mesa. But for DRI
* Mesa we do this to accomodate different versions of libGL and various
* DRI drivers.
*/
dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
sizeof(struct _glapi_table) / sizeof(void *));
 
/* setup API dispatch tables */
ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
if (!ctx->Exec || !ctx->Save) {
free_shared_state(ctx, ctx->Shared);
if (ctx->Exec)
FREE( ctx->Exec );
}
_mesa_init_exec_table(ctx->Exec, dispatchSize);
_mesa_init_dlist_table(ctx->Save, dispatchSize);
ctx->CurrentDispatch = ctx->Exec;
 
ctx->ExecPrefersFloat = GL_FALSE;
ctx->SavePrefersFloat = GL_FALSE;
 
/* Neutral tnl module stuff */
_mesa_init_exec_vtxfmt( ctx );
ctx->TnlModule.Current = NULL;
ctx->TnlModule.SwapCount = 0;
 
/* Z buffer stuff */
if (ctx->Visual.depthBits == 0) {
/* Special case. Even if we don't have a depth buffer we need
* good values for DepthMax for Z vertex transformation purposes
* and for per-fragment fog computation.
*/
ctx->DepthMax = 1 << 16;
ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
}
else if (ctx->Visual.depthBits < 32) {
ctx->DepthMax = (1 << ctx->Visual.depthBits) - 1;
ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
}
else {
/* Special case since shift values greater than or equal to the
* number of bits in the left hand expression's type are undefined.
*/
ctx->DepthMax = 0xffffffff;
ctx->DepthMaxF = (GLfloat) ctx->DepthMax;
}
ctx->MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
 
c = _mesa_getenv("MESA_DEBUG");
if (c)
add_debug_flags(c);
 
c = _mesa_getenv("MESA_VERBOSE");
if (c)
add_debug_flags(c);
 
return GL_TRUE;
}
 
 
 
/*
* Allocate and initialize a GLcontext structure.
* Input: visual - a GLvisual pointer (we copy the struct contents)
* sharelist - another context to share display lists with or NULL
* driver_ctx - pointer to device driver's context state struct
* direct - direct rendering?
* Return: pointer to a new __GLcontextRec or NULL if error.
*/
GLcontext *
_mesa_create_context( const GLvisual *visual,
GLcontext *share_list,
void *driver_ctx,
GLboolean direct )
 
{
GLcontext *ctx;
 
ASSERT(visual);
ASSERT(driver_ctx);
 
ctx = (GLcontext *) _mesa_calloc(sizeof(GLcontext));
if (!ctx)
return NULL;
 
if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
return ctx;
}
else {
_mesa_free(ctx);
return NULL;
}
}
 
 
 
/*
* Free the data associated with the given context.
* But don't free() the GLcontext struct itself!
*/
void
_mesa_free_context_data( GLcontext *ctx )
{
struct gl_shine_tab *s, *tmps;
GLuint i;
 
/* if we're destroying the current context, unbind it first */
if (ctx == _mesa_get_current_context()) {
_mesa_make_current(NULL, NULL);
}
 
/*
* Free transformation matrix stacks
*/
free_matrix_stack(&ctx->ModelviewMatrixStack);
free_matrix_stack(&ctx->ProjectionMatrixStack);
free_matrix_stack(&ctx->ColorMatrixStack);
for (i = 0; i < MAX_TEXTURE_UNITS; i++)
free_matrix_stack(&ctx->TextureMatrixStack[i]);
for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
free_matrix_stack(&ctx->ProgramMatrixStack[i]);
/* combined Modelview*Projection matrix */
_math_matrix_dtr( &ctx->_ModelProjectMatrix );
 
 
#if FEATURE_NV_vertex_program
if (ctx->VertexProgram.Current) {
ctx->VertexProgram.Current->RefCount--;
if (ctx->VertexProgram.Current->RefCount <= 0)
_mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
}
#endif
 
/* Shared context state (display lists, textures, etc) */
_glthread_LOCK_MUTEX(ctx->Shared->Mutex);
ctx->Shared->RefCount--;
assert(ctx->Shared->RefCount >= 0);
_glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
if (ctx->Shared->RefCount == 0) {
/* free shared state */
free_shared_state( ctx, ctx->Shared );
}
 
/* Free lighting shininess exponentiation table */
foreach_s( s, tmps, ctx->_ShineTabList ) {
FREE( s );
}
FREE( ctx->_ShineTabList );
 
/* Free proxy texture objects */
_mesa_free_texture_object( NULL, ctx->Texture.Proxy1D );
_mesa_free_texture_object( NULL, ctx->Texture.Proxy2D );
_mesa_free_texture_object( NULL, ctx->Texture.Proxy3D );
_mesa_free_texture_object( NULL, ctx->Texture.ProxyCubeMap );
_mesa_free_texture_object( NULL, ctx->Texture.ProxyRect );
 
/* Free evaluator data */
if (ctx->EvalMap.Map1Vertex3.Points)
FREE( ctx->EvalMap.Map1Vertex3.Points );
if (ctx->EvalMap.Map1Vertex4.Points)
FREE( ctx->EvalMap.Map1Vertex4.Points );
if (ctx->EvalMap.Map1Index.Points)
FREE( ctx->EvalMap.Map1Index.Points );
if (ctx->EvalMap.Map1Color4.Points)
FREE( ctx->EvalMap.Map1Color4.Points );
if (ctx->EvalMap.Map1Normal.Points)
FREE( ctx->EvalMap.Map1Normal.Points );
if (ctx->EvalMap.Map1Texture1.Points)
FREE( ctx->EvalMap.Map1Texture1.Points );
if (ctx->EvalMap.Map1Texture2.Points)
FREE( ctx->EvalMap.Map1Texture2.Points );
if (ctx->EvalMap.Map1Texture3.Points)
FREE( ctx->EvalMap.Map1Texture3.Points );
if (ctx->EvalMap.Map1Texture4.Points)
FREE( ctx->EvalMap.Map1Texture4.Points );
for (i = 0; i < 16; i++)
FREE((ctx->EvalMap.Map1Attrib[i].Points));
 
if (ctx->EvalMap.Map2Vertex3.Points)
FREE( ctx->EvalMap.Map2Vertex3.Points );
if (ctx->EvalMap.Map2Vertex4.Points)
FREE( ctx->EvalMap.Map2Vertex4.Points );
if (ctx->EvalMap.Map2Index.Points)
FREE( ctx->EvalMap.Map2Index.Points );
if (ctx->EvalMap.Map2Color4.Points)
FREE( ctx->EvalMap.Map2Color4.Points );
if (ctx->EvalMap.Map2Normal.Points)
FREE( ctx->EvalMap.Map2Normal.Points );
if (ctx->EvalMap.Map2Texture1.Points)
FREE( ctx->EvalMap.Map2Texture1.Points );
if (ctx->EvalMap.Map2Texture2.Points)
FREE( ctx->EvalMap.Map2Texture2.Points );
if (ctx->EvalMap.Map2Texture3.Points)
FREE( ctx->EvalMap.Map2Texture3.Points );
if (ctx->EvalMap.Map2Texture4.Points)
FREE( ctx->EvalMap.Map2Texture4.Points );
for (i = 0; i < 16; i++)
FREE((ctx->EvalMap.Map2Attrib[i].Points));
 
_mesa_free_colortable_data( &ctx->ColorTable );
_mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
_mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
_mesa_free_colortable_data( &ctx->Texture.Palette );
 
_math_matrix_dtr(&ctx->Viewport._WindowMap);
 
_mesa_extensions_dtr(ctx);
 
FREE(ctx->Exec);
FREE(ctx->Save);
}
 
 
 
/*
* Destroy a GLcontext structure.
*/
void
_mesa_destroy_context( GLcontext *ctx )
{
if (ctx) {
_mesa_free_context_data(ctx);
FREE( (void *) ctx );
}
}
 
 
 
/*
* Copy attribute groups from one context to another.
* Input: src - source context
* dst - destination context
* mask - bitwise OR of GL_*_BIT flags
*/
void
_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
{
if (mask & GL_ACCUM_BUFFER_BIT) {
/* OK to memcpy */
dst->Accum = src->Accum;
}
if (mask & GL_COLOR_BUFFER_BIT) {
/* OK to memcpy */
dst->Color = src->Color;
}
if (mask & GL_CURRENT_BIT) {
/* OK to memcpy */
dst->Current = src->Current;
}
if (mask & GL_DEPTH_BUFFER_BIT) {
/* OK to memcpy */
dst->Depth = src->Depth;
}
if (mask & GL_ENABLE_BIT) {
/* no op */
}
if (mask & GL_EVAL_BIT) {
/* OK to memcpy */
dst->Eval = src->Eval;
}
if (mask & GL_FOG_BIT) {
/* OK to memcpy */
dst->Fog = src->Fog;
}
if (mask & GL_HINT_BIT) {
/* OK to memcpy */
dst->Hint = src->Hint;
}
if (mask & GL_LIGHTING_BIT) {
GLuint i;
/* begin with memcpy */
MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
/* fixup linked lists to prevent pointer insanity */
make_empty_list( &(dst->Light.EnabledList) );
for (i = 0; i < MAX_LIGHTS; i++) {
if (dst->Light.Light[i].Enabled) {
insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
}
}
}
if (mask & GL_LINE_BIT) {
/* OK to memcpy */
dst->Line = src->Line;
}
if (mask & GL_LIST_BIT) {
/* OK to memcpy */
dst->List = src->List;
}
if (mask & GL_PIXEL_MODE_BIT) {
/* OK to memcpy */
dst->Pixel = src->Pixel;
}
if (mask & GL_POINT_BIT) {
/* OK to memcpy */
dst->Point = src->Point;
}
if (mask & GL_POLYGON_BIT) {
/* OK to memcpy */
dst->Polygon = src->Polygon;
}
if (mask & GL_POLYGON_STIPPLE_BIT) {
/* Use loop instead of MEMCPY due to problem with Portland Group's
* C compiler. Reported by John Stone.
*/
GLuint i;
for (i = 0; i < 32; i++) {
dst->PolygonStipple[i] = src->PolygonStipple[i];
}
}
if (mask & GL_SCISSOR_BIT) {
/* OK to memcpy */
dst->Scissor = src->Scissor;
}
if (mask & GL_STENCIL_BUFFER_BIT) {
/* OK to memcpy */
dst->Stencil = src->Stencil;
}
if (mask & GL_TEXTURE_BIT) {
/* Cannot memcpy because of pointers */
_mesa_copy_texture_state(src, dst);
}
if (mask & GL_TRANSFORM_BIT) {
/* OK to memcpy */
dst->Transform = src->Transform;
}
if (mask & GL_VIEWPORT_BIT) {
/* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
dst->Viewport.X = src->Viewport.X;
dst->Viewport.Y = src->Viewport.Y;
dst->Viewport.Width = src->Viewport.Width;
dst->Viewport.Height = src->Viewport.Height;
dst->Viewport.Near = src->Viewport.Near;
dst->Viewport.Far = src->Viewport.Far;
_math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
}
 
/* XXX FIXME: Call callbacks?
*/
dst->NewState = _NEW_ALL;
}
 
 
 
static void print_info( void )
{
_mesa_debug(NULL, "Mesa GL_VERSION = %s\n",
(char *) _mesa_GetString(GL_VERSION));
_mesa_debug(NULL, "Mesa GL_RENDERER = %s\n",
(char *) _mesa_GetString(GL_RENDERER));
_mesa_debug(NULL, "Mesa GL_VENDOR = %s\n",
(char *) _mesa_GetString(GL_VENDOR));
_mesa_debug(NULL, "Mesa GL_EXTENSIONS = %s\n",
(char *) _mesa_GetString(GL_EXTENSIONS));
#if defined(THREADS)
_mesa_debug(NULL, "Mesa thread-safe: YES\n");
#else
_mesa_debug(NULL, "Mesa thread-safe: NO\n");
#endif
#if defined(USE_X86_ASM)
_mesa_debug(NULL, "Mesa x86-optimized: YES\n");
#else
_mesa_debug(NULL, "Mesa x86-optimized: NO\n");
#endif
#if defined(USE_SPARC_ASM)
_mesa_debug(NULL, "Mesa sparc-optimized: YES\n");
#else
_mesa_debug(NULL, "Mesa sparc-optimized: NO\n");
#endif
}
 
 
/*
* Set the current context, binding the given frame buffer to the context.
*/
void
_mesa_make_current( GLcontext *newCtx, GLframebuffer *buffer )
{
_mesa_make_current2( newCtx, buffer, buffer );
}
 
 
/*
* Bind the given context to the given draw-buffer and read-buffer
* and make it the current context for this thread.
*/
void
_mesa_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
GLframebuffer *readBuffer )
{
if (MESA_VERBOSE)
_mesa_debug(newCtx, "_mesa_make_current2()\n");
 
/* Check that the context's and framebuffer's visuals are compatible.
* We could do a lot more checking here but this'll catch obvious
* problems.
*/
if (newCtx && drawBuffer && readBuffer) {
if (newCtx->Visual.rgbMode != drawBuffer->Visual.rgbMode ||
newCtx->Visual.redBits != drawBuffer->Visual.redBits ||
newCtx->Visual.depthBits != drawBuffer->Visual.depthBits ||
newCtx->Visual.stencilBits != drawBuffer->Visual.stencilBits ||
newCtx->Visual.accumRedBits != drawBuffer->Visual.accumRedBits) {
return; /* incompatible */
}
}
 
/* We call this function periodically (just here for now) in
* order to detect when multithreading has begun.
*/
_glapi_check_multithread();
 
_glapi_set_context((void *) newCtx);
ASSERT(_mesa_get_current_context() == newCtx);
 
 
if (!newCtx) {
_glapi_set_dispatch(NULL); /* none current */
}
else {
_glapi_set_dispatch(newCtx->CurrentDispatch);
 
if (drawBuffer && readBuffer) {
/* TODO: check if newCtx and buffer's visual match??? */
newCtx->DrawBuffer = drawBuffer;
newCtx->ReadBuffer = readBuffer;
newCtx->NewState |= _NEW_BUFFERS;
 
if (drawBuffer->Width == 0 && drawBuffer->Height == 0) {
/* get initial window size */
GLuint bufWidth, bufHeight;
 
/* ask device driver for size of output buffer */
(*newCtx->Driver.GetBufferSize)( drawBuffer, &bufWidth, &bufHeight );
 
if (drawBuffer->Width == bufWidth && drawBuffer->Height == bufHeight)
return; /* size is as expected */
 
drawBuffer->Width = bufWidth;
drawBuffer->Height = bufHeight;
 
newCtx->Driver.ResizeBuffers( drawBuffer );
}
 
if (readBuffer != drawBuffer &&
readBuffer->Width == 0 && readBuffer->Height == 0) {
/* get initial window size */
GLuint bufWidth, bufHeight;
 
/* ask device driver for size of output buffer */
(*newCtx->Driver.GetBufferSize)( readBuffer, &bufWidth, &bufHeight );
 
if (readBuffer->Width == bufWidth && readBuffer->Height == bufHeight)
return; /* size is as expected */
 
readBuffer->Width = bufWidth;
readBuffer->Height = bufHeight;
 
newCtx->Driver.ResizeBuffers( readBuffer );
}
}
 
/* This is only for T&L - a bit out of place, or misnamed (BP) */
if (newCtx->Driver.MakeCurrent)
newCtx->Driver.MakeCurrent( newCtx, drawBuffer, readBuffer );
 
/* We can use this to help debug user's problems. Tell them to set
* the MESA_INFO env variable before running their app. Then the
* first time each context is made current we'll print some useful
* information.
*/
if (newCtx->FirstTimeCurrent) {
if (_mesa_getenv("MESA_INFO")) {
print_info();
}
newCtx->FirstTimeCurrent = GL_FALSE;
}
}
}
 
 
 
/*
* Return current context handle for the calling thread.
* This isn't the fastest way to get the current context.
* If you need speed, see the GET_CURRENT_CONTEXT() macro in context.h
*/
GLcontext *
_mesa_get_current_context( void )
{
return (GLcontext *) _glapi_get_context();
}
 
 
/*
* Return pointer to this context's current API dispatch table.
* It'll either be the immediate-mode execute dispatcher or the
* display list compile dispatcher.
*/
struct _glapi_table *
_mesa_get_dispatch(GLcontext *ctx)
{
return ctx->CurrentDispatch;
}
 
 
 
/**********************************************************************/
/***** Miscellaneous functions *****/
/**********************************************************************/
 
 
/*
* Record the given error code and call the driver's Error function if defined.
* This is called via _mesa_error().
*/
void
_mesa_record_error( GLcontext *ctx, GLenum error )
{
if (!ctx)
return;
 
if (ctx->ErrorValue == GL_NO_ERROR) {
ctx->ErrorValue = error;
}
 
/* Call device driver's error handler, if any. This is used on the Mac. */
if (ctx->Driver.Error) {
(*ctx->Driver.Error)( ctx );
}
}
 
 
void
_mesa_Finish( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
if (ctx->Driver.Finish) {
(*ctx->Driver.Finish)( ctx );
}
}
 
 
 
void
_mesa_Flush( void )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
if (ctx->Driver.Flush) {
(*ctx->Driver.Flush)( ctx );
}
}
 
 
 
const char *_mesa_prim_name[GL_POLYGON+4] = {
"GL_POINTS",
"GL_LINES",
"GL_LINE_LOOP",
"GL_LINE_STRIP",
"GL_TRIANGLES",
"GL_TRIANGLE_STRIP",
"GL_TRIANGLE_FAN",
"GL_QUADS",
"GL_QUAD_STRIP",
"GL_POLYGON",
"outside begin/end",
"inside unkown primitive",
"unknown state"
};
/shark/trunk/ports/mesa/src/get.h
0,0 → 1,58
/* $Id: get.h,v 1.1 2003-02-28 11:42:01 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef GET_H
#define GET_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_GetBooleanv( GLenum pname, GLboolean *params );
 
extern void
_mesa_GetDoublev( GLenum pname, GLdouble *params );
 
extern void
_mesa_GetFloatv( GLenum pname, GLfloat *params );
 
extern void
_mesa_GetIntegerv( GLenum pname, GLint *params );
 
extern void
_mesa_GetPointerv( GLenum pname, GLvoid **params );
 
extern const GLubyte *
_mesa_GetString( GLenum name );
 
extern GLenum
_mesa_GetError( void );
 
 
 
#endif
/shark/trunk/ports/mesa/src/state.h
0,0 → 1,52
/* $Id: state.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef STATE_H
#define STATE_H
 
#include "mtypes.h"
 
 
extern void
_mesa_init_no_op_table(struct _glapi_table *exec, GLuint tableSize);
 
extern void
_mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize);
 
extern void
_mesa_update_state( GLcontext *ctx );
 
extern void
_mesa_print_state( const char *msg, GLuint state );
 
extern void
_mesa_print_enable_flags( const char *msg, GLuint flags );
 
extern void
_mesa_allow_light_in_model( GLcontext *ctx, GLboolean flag );
 
#endif
/shark/trunk/ports/mesa/src/enable.c
0,0 → 1,1286
/* $Id: enable.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "context.h"
#include "enable.h"
#include "light.h"
#include "macros.h"
#include "mmath.h"
#include "simple_list.h"
#include "mtypes.h"
#include "enums.h"
#include "math/m_matrix.h"
#include "math/m_xform.h"
 
 
 
#define CHECK_EXTENSION(EXTNAME, CAP) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(0x%x)", \
state ? "Enable" : "Disable", CAP); \
return; \
}
 
 
 
static void
client_state( GLcontext *ctx, GLenum cap, GLboolean state )
{
GLuint flag;
GLuint *var;
 
switch (cap) {
case GL_VERTEX_ARRAY:
var = &ctx->Array.Vertex.Enabled;
flag = _NEW_ARRAY_VERTEX;
break;
case GL_NORMAL_ARRAY:
var = &ctx->Array.Normal.Enabled;
flag = _NEW_ARRAY_NORMAL;
break;
case GL_COLOR_ARRAY:
var = &ctx->Array.Color.Enabled;
flag = _NEW_ARRAY_COLOR0;
break;
case GL_INDEX_ARRAY:
var = &ctx->Array.Index.Enabled;
flag = _NEW_ARRAY_INDEX;
break;
case GL_TEXTURE_COORD_ARRAY:
var = &ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture);
break;
case GL_EDGE_FLAG_ARRAY:
var = &ctx->Array.EdgeFlag.Enabled;
flag = _NEW_ARRAY_EDGEFLAG;
break;
case GL_FOG_COORDINATE_ARRAY_EXT:
var = &ctx->Array.FogCoord.Enabled;
flag = _NEW_ARRAY_FOGCOORD;
break;
case GL_SECONDARY_COLOR_ARRAY_EXT:
var = &ctx->Array.SecondaryColor.Enabled;
flag = _NEW_ARRAY_COLOR1;
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
{
GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
var = &ctx->Array.VertexAttrib[n].Enabled;
flag = _NEW_ARRAY_ATTRIB(n);
}
break;
#endif /* FEATURE_NV_vertex_program */
 
default:
_mesa_error( ctx, GL_INVALID_ENUM,
"glEnable/DisableClientState(0x%x)", cap);
return;
}
 
if (*var == state)
return;
 
FLUSH_VERTICES(ctx, _NEW_ARRAY);
ctx->Array.NewState |= flag;
*var = state;
 
if (state)
ctx->Array._Enabled |= flag;
else
ctx->Array._Enabled &= ~flag;
 
if (ctx->Driver.Enable) {
(*ctx->Driver.Enable)( ctx, cap, state );
}
}
 
 
 
void
_mesa_EnableClientState( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
client_state( ctx, cap, GL_TRUE );
}
 
 
 
void
_mesa_DisableClientState( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
client_state( ctx, cap, GL_FALSE );
}
 
 
#undef CHECK_EXTENSION
#define CHECK_EXTENSION(EXTNAME, CAP) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_ENUM, "gl%s(0x%x)", \
state ? "Enable" : "Disable", CAP); \
return; \
}
 
 
/*
* Perform glEnable and glDisable calls.
*/
void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
{
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "%s %s (newstate is %x)\n",
state ? "glEnable" : "glDisable",
_mesa_lookup_enum_by_nr(cap),
ctx->NewState);
 
switch (cap) {
case GL_ALPHA_TEST:
if (ctx->Color.AlphaEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.AlphaEnabled = state;
break;
case GL_AUTO_NORMAL:
if (ctx->Eval.AutoNormal == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.AutoNormal = state;
break;
case GL_BLEND:
if (ctx->Color.BlendEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.BlendEnabled = state;
/* The following needed to accomodate 1.0 RGB logic op blending */
ctx->Color.ColorLogicOpEnabled =
(ctx->Color.BlendEquation == GL_LOGIC_OP && state);
break;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
{
const GLuint p = cap - GL_CLIP_PLANE0;
 
if ((ctx->Transform.ClipPlanesEnabled & (1 << p)) == ((GLuint) state << p))
return;
 
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
 
if (state) {
ctx->Transform.ClipPlanesEnabled |= (1 << p);
 
if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY)
_math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
/* This derived state also calculated in clip.c and
* from _mesa_update_state() on changes to EyeUserPlane
* and ctx->ProjectionMatrix respectively.
*/
_mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
ctx->Transform.EyeUserPlane[p],
ctx->ProjectionMatrixStack.Top->inv );
}
else {
ctx->Transform.ClipPlanesEnabled &= ~(1 << p);
}
}
break;
case GL_COLOR_MATERIAL:
if (ctx->Light.ColorMaterialEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.ColorMaterialEnabled = state;
if (state) {
FLUSH_CURRENT(ctx, 0);
_mesa_update_color_material( ctx,
ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
}
break;
case GL_CULL_FACE:
if (ctx->Polygon.CullFlag == state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.CullFlag = state;
break;
case GL_DEPTH_TEST:
if (state && ctx->Visual.depthBits==0) {
_mesa_warning(ctx,"glEnable(GL_DEPTH_TEST) but no depth buffer");
return;
}
if (ctx->Depth.Test==state)
return;
FLUSH_VERTICES(ctx, _NEW_DEPTH);
ctx->Depth.Test = state;
break;
case GL_DITHER:
if (ctx->NoDither) {
state = GL_FALSE; /* MESA_NO_DITHER env var */
}
if (ctx->Color.DitherFlag==state)
return;
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.DitherFlag = state;
break;
case GL_FOG:
if (ctx->Fog.Enabled==state)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.Enabled = state;
break;
case GL_HISTOGRAM:
CHECK_EXTENSION(EXT_histogram, cap);
if (ctx->Pixel.HistogramEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.HistogramEnabled = state;
break;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
if (ctx->Light.Light[cap-GL_LIGHT0].Enabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
if (state) {
insert_at_tail(&ctx->Light.EnabledList,
&ctx->Light.Light[cap-GL_LIGHT0]);
}
else {
remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]);
}
break;
case GL_LIGHTING:
if (ctx->Light.Enabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Enabled = state;
 
if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
else
ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
if ((ctx->Light.Enabled &&
ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR)
|| ctx->Fog.ColorSumEnabled)
ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR;
else
ctx->_TriangleCaps &= ~DD_SEPARATE_SPECULAR;
 
break;
case GL_LINE_SMOOTH:
if (ctx->Line.SmoothFlag == state)
return;
FLUSH_VERTICES(ctx, _NEW_LINE);
ctx->Line.SmoothFlag = state;
ctx->_TriangleCaps ^= DD_LINE_SMOOTH;
break;
case GL_LINE_STIPPLE:
if (ctx->Line.StippleFlag == state)
return;
FLUSH_VERTICES(ctx, _NEW_LINE);
ctx->Line.StippleFlag = state;
ctx->_TriangleCaps ^= DD_LINE_STIPPLE;
break;
case GL_INDEX_LOGIC_OP:
if (ctx->Color.IndexLogicOpEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.IndexLogicOpEnabled = state;
break;
case GL_COLOR_LOGIC_OP:
if (ctx->Color.ColorLogicOpEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_COLOR);
ctx->Color.ColorLogicOpEnabled = state;
break;
case GL_MAP1_COLOR_4:
if (ctx->Eval.Map1Color4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Color4 = state;
break;
case GL_MAP1_INDEX:
if (ctx->Eval.Map1Index == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Index = state;
break;
case GL_MAP1_NORMAL:
if (ctx->Eval.Map1Normal == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Normal = state;
break;
case GL_MAP1_TEXTURE_COORD_1:
if (ctx->Eval.Map1TextureCoord1 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1TextureCoord1 = state;
break;
case GL_MAP1_TEXTURE_COORD_2:
if (ctx->Eval.Map1TextureCoord2 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1TextureCoord2 = state;
break;
case GL_MAP1_TEXTURE_COORD_3:
if (ctx->Eval.Map1TextureCoord3 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1TextureCoord3 = state;
break;
case GL_MAP1_TEXTURE_COORD_4:
if (ctx->Eval.Map1TextureCoord4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1TextureCoord4 = state;
break;
case GL_MAP1_VERTEX_3:
if (ctx->Eval.Map1Vertex3 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Vertex3 = state;
break;
case GL_MAP1_VERTEX_4:
if (ctx->Eval.Map1Vertex4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Vertex4 = state;
break;
case GL_MAP2_COLOR_4:
if (ctx->Eval.Map2Color4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Color4 = state;
break;
case GL_MAP2_INDEX:
if (ctx->Eval.Map2Index == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Index = state;
break;
case GL_MAP2_NORMAL:
if (ctx->Eval.Map2Normal == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Normal = state;
break;
case GL_MAP2_TEXTURE_COORD_1:
if (ctx->Eval.Map2TextureCoord1 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2TextureCoord1 = state;
break;
case GL_MAP2_TEXTURE_COORD_2:
if (ctx->Eval.Map2TextureCoord2 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2TextureCoord2 = state;
break;
case GL_MAP2_TEXTURE_COORD_3:
if (ctx->Eval.Map2TextureCoord3 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2TextureCoord3 = state;
break;
case GL_MAP2_TEXTURE_COORD_4:
if (ctx->Eval.Map2TextureCoord4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2TextureCoord4 = state;
break;
case GL_MAP2_VERTEX_3:
if (ctx->Eval.Map2Vertex3 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Vertex3 = state;
break;
case GL_MAP2_VERTEX_4:
if (ctx->Eval.Map2Vertex4 == state)
return;
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Vertex4 = state;
break;
case GL_MINMAX:
if (ctx->Pixel.MinMaxEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.MinMaxEnabled = state;
break;
case GL_NORMALIZE:
if (ctx->Transform.Normalize == state)
return;
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
ctx->Transform.Normalize = state;
break;
case GL_POINT_SMOOTH:
if (ctx->Point.SmoothFlag==state)
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.SmoothFlag = state;
ctx->_TriangleCaps ^= DD_POINT_SMOOTH;
break;
case GL_POLYGON_SMOOTH:
if (ctx->Polygon.SmoothFlag==state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.SmoothFlag = state;
ctx->_TriangleCaps ^= DD_TRI_SMOOTH;
break;
case GL_POLYGON_STIPPLE:
if (ctx->Polygon.StippleFlag==state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.StippleFlag = state;
ctx->_TriangleCaps ^= DD_TRI_STIPPLE;
break;
case GL_POLYGON_OFFSET_POINT:
if (ctx->Polygon.OffsetPoint==state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.OffsetPoint = state;
break;
case GL_POLYGON_OFFSET_LINE:
if (ctx->Polygon.OffsetLine==state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.OffsetLine = state;
break;
case GL_POLYGON_OFFSET_FILL:
/*case GL_POLYGON_OFFSET_EXT:*/
if (ctx->Polygon.OffsetFill==state)
return;
FLUSH_VERTICES(ctx, _NEW_POLYGON);
ctx->Polygon.OffsetFill = state;
break;
case GL_RESCALE_NORMAL_EXT:
if (ctx->Transform.RescaleNormals == state)
return;
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
ctx->Transform.RescaleNormals = state;
break;
case GL_SCISSOR_TEST:
if (ctx->Scissor.Enabled==state)
return;
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
ctx->Scissor.Enabled = state;
break;
case GL_SHARED_TEXTURE_PALETTE_EXT:
if (ctx->Texture.SharedPalette == state)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
ctx->Texture.SharedPalette = state;
break;
case GL_STENCIL_TEST:
if (state && ctx->Visual.stencilBits==0) {
_mesa_warning(ctx,
"glEnable(GL_STENCIL_TEST) but no stencil buffer");
return;
}
if (ctx->Stencil.Enabled==state)
return;
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.Enabled = state;
break;
case GL_TEXTURE_1D: {
const GLuint curr = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
GLuint newenabled = texUnit->Enabled & ~TEXTURE_1D_BIT;
if (state)
newenabled |= TEXTURE_1D_BIT;
if (!ctx->Visual.rgbMode || texUnit->Enabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->Enabled = newenabled;
break;
}
case GL_TEXTURE_2D: {
const GLuint curr = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
GLuint newenabled = texUnit->Enabled & ~TEXTURE_2D_BIT;
if (state)
newenabled |= TEXTURE_2D_BIT;
if (!ctx->Visual.rgbMode || texUnit->Enabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->Enabled = newenabled;
break;
}
case GL_TEXTURE_3D: {
const GLuint curr = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
GLuint newenabled = texUnit->Enabled & ~TEXTURE_3D_BIT;
if (state)
newenabled |= TEXTURE_3D_BIT;
if (!ctx->Visual.rgbMode || texUnit->Enabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->Enabled = newenabled;
break;
}
case GL_TEXTURE_GEN_Q: {
GLuint unit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
GLuint newenabled = texUnit->TexGenEnabled & ~Q_BIT;
if (state)
newenabled |= Q_BIT;
if (texUnit->TexGenEnabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->TexGenEnabled = newenabled;
break;
}
case GL_TEXTURE_GEN_R: {
GLuint unit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
GLuint newenabled = texUnit->TexGenEnabled & ~R_BIT;
if (state)
newenabled |= R_BIT;
if (texUnit->TexGenEnabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->TexGenEnabled = newenabled;
break;
}
break;
case GL_TEXTURE_GEN_S: {
GLuint unit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
GLuint newenabled = texUnit->TexGenEnabled & ~S_BIT;
if (state)
newenabled |= S_BIT;
if (texUnit->TexGenEnabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->TexGenEnabled = newenabled;
break;
}
break;
case GL_TEXTURE_GEN_T: {
GLuint unit = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
GLuint newenabled = texUnit->TexGenEnabled & ~T_BIT;
if (state)
newenabled |= T_BIT;
if (texUnit->TexGenEnabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->TexGenEnabled = newenabled;
break;
}
break;
 
/*
* CLIENT STATE!!!
*/
case GL_VERTEX_ARRAY:
case GL_NORMAL_ARRAY:
case GL_COLOR_ARRAY:
case GL_INDEX_ARRAY:
case GL_TEXTURE_COORD_ARRAY:
case GL_EDGE_FLAG_ARRAY:
case GL_FOG_COORDINATE_ARRAY_EXT:
case GL_SECONDARY_COLOR_ARRAY_EXT:
client_state( ctx, cap, state );
return;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION(HP_occlusion_test, cap);
if (ctx->Depth.OcclusionTest == state)
return;
FLUSH_VERTICES(ctx, _NEW_DEPTH);
ctx->Depth.OcclusionTest = state;
if (state)
ctx->OcclusionResult = ctx->OcclusionResultSaved;
else
ctx->OcclusionResultSaved = ctx->OcclusionResult;
break;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
CHECK_EXTENSION(SGIS_pixel_texture, cap);
if (ctx->Pixel.PixelTextureEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PixelTextureEnabled = state;
break;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
CHECK_EXTENSION(SGIX_pixel_texture, cap);
if (ctx->Pixel.PixelTextureEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PixelTextureEnabled = state;
break;
 
/* GL_SGI_color_table */
case GL_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table, cap);
if (ctx->Pixel.ColorTableEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.ColorTableEnabled = state;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table, cap);
if (ctx->Pixel.PostConvolutionColorTableEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostConvolutionColorTableEnabled = state;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table, cap);
if (ctx->Pixel.PostColorMatrixColorTableEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.PostColorMatrixColorTableEnabled = state;
break;
 
/* GL_EXT_convolution */
case GL_CONVOLUTION_1D:
CHECK_EXTENSION(EXT_convolution, cap);
if (ctx->Pixel.Convolution1DEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.Convolution1DEnabled = state;
break;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION(EXT_convolution, cap);
if (ctx->Pixel.Convolution2DEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.Convolution2DEnabled = state;
break;
case GL_SEPARABLE_2D:
CHECK_EXTENSION(EXT_convolution, cap);
if (ctx->Pixel.Separable2DEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->Pixel.Separable2DEnabled = state;
break;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
{
const GLuint curr = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
GLuint newenabled = texUnit->Enabled & ~TEXTURE_CUBE_BIT;
CHECK_EXTENSION(ARB_texture_cube_map, cap);
if (state)
newenabled |= TEXTURE_CUBE_BIT;
if (!ctx->Visual.rgbMode || texUnit->Enabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->Enabled = newenabled;
}
break;
 
/* GL_EXT_secondary_color */
case GL_COLOR_SUM_EXT:
CHECK_EXTENSION(EXT_secondary_color, cap);
if (ctx->Fog.ColorSumEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_FOG);
ctx->Fog.ColorSumEnabled = state;
 
if ((ctx->Light.Enabled &&
ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR)
|| ctx->Fog.ColorSumEnabled)
ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR;
else
ctx->_TriangleCaps &= ~DD_SEPARATE_SPECULAR;
 
break;
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION(ARB_multisample, cap);
if (ctx->Multisample.Enabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
ctx->Multisample.Enabled = state;
break;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION(ARB_multisample, cap);
if (ctx->Multisample.SampleAlphaToCoverage == state)
return;
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
ctx->Multisample.SampleAlphaToCoverage = state;
break;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION(ARB_multisample, cap);
if (ctx->Multisample.SampleAlphaToOne == state)
return;
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
ctx->Multisample.SampleAlphaToOne = state;
break;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION(ARB_multisample, cap);
if (ctx->Multisample.SampleCoverage == state)
return;
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
ctx->Multisample.SampleCoverage = state;
break;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION(ARB_multisample, cap);
if (ctx->Multisample.SampleCoverageInvert == state)
return;
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
ctx->Multisample.SampleCoverageInvert = state;
break;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION(IBM_rasterpos_clip, cap);
if (ctx->Transform.RasterPositionUnclipped == state)
return;
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
ctx->Transform.RasterPositionUnclipped = state;
break;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
CHECK_EXTENSION(NV_point_sprite, cap);
if (ctx->Point.PointSprite == state)
return;
FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.PointSprite = state;
break;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
if (ctx->VertexProgram.Enabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_TRANSFORM | _NEW_PROGRAM); /* XXX OK? */
ctx->VertexProgram.Enabled = state;
break;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
if (ctx->VertexProgram.PointSizeEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_POINT | _NEW_PROGRAM);
ctx->VertexProgram.PointSizeEnabled = state;
break;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
if (ctx->VertexProgram.TwoSideEnabled == state)
return;
FLUSH_VERTICES(ctx, _NEW_PROGRAM); /* XXX OK? */
ctx->VertexProgram.TwoSideEnabled = state;
break;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
{
const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV);
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map1Attrib[map] = state;
}
break;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION(NV_vertex_program, cap);
{
const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV);
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.Map2Attrib[map] = state;
}
break;
#endif /* FEATURE_NV_vertex_program */
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION(NV_texture_rectangle, cap);
{
const GLuint curr = ctx->Texture.CurrentUnit;
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
GLuint newenabled = texUnit->Enabled & ~TEXTURE_RECT_BIT;
CHECK_EXTENSION(NV_texture_rectangle, cap);
if (state)
newenabled |= TEXTURE_RECT_BIT;
if (!ctx->Visual.rgbMode || texUnit->Enabled == newenabled)
return;
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
texUnit->Enabled = newenabled;
}
break;
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION(EXT_stencil_two_side, cap);
if (ctx->Stencil.TestTwoSide == state)
return;
FLUSH_VERTICES(ctx, _NEW_STENCIL);
ctx->Stencil.TestTwoSide = state;
break;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM,
"%s(0x%x)", state ? "glEnable" : "glDisable", cap);
return;
}
 
if (ctx->Driver.Enable) {
(*ctx->Driver.Enable)( ctx, cap, state );
}
}
 
 
void
_mesa_Enable( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
_mesa_set_enable( ctx, cap, GL_TRUE );
}
 
 
void
_mesa_Disable( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
_mesa_set_enable( ctx, cap, GL_FALSE );
}
 
 
#undef CHECK_EXTENSION
#define CHECK_EXTENSION(EXTNAME) \
if (!ctx->Extensions.EXTNAME) { \
_mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled"); \
return GL_FALSE; \
}
 
 
GLboolean
_mesa_IsEnabled( GLenum cap )
{
GET_CURRENT_CONTEXT(ctx);
switch (cap) {
case GL_ALPHA_TEST:
return ctx->Color.AlphaEnabled;
case GL_AUTO_NORMAL:
return ctx->Eval.AutoNormal;
case GL_BLEND:
return ctx->Color.BlendEnabled;
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
return (ctx->Transform.ClipPlanesEnabled >> (cap - GL_CLIP_PLANE0)) & 1;
case GL_COLOR_MATERIAL:
return ctx->Light.ColorMaterialEnabled;
case GL_CULL_FACE:
return ctx->Polygon.CullFlag;
case GL_DEPTH_TEST:
return ctx->Depth.Test;
case GL_DITHER:
return ctx->Color.DitherFlag;
case GL_FOG:
return ctx->Fog.Enabled;
case GL_LIGHTING:
return ctx->Light.Enabled;
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
case GL_LINE_SMOOTH:
return ctx->Line.SmoothFlag;
case GL_LINE_STIPPLE:
return ctx->Line.StippleFlag;
case GL_INDEX_LOGIC_OP:
return ctx->Color.IndexLogicOpEnabled;
case GL_COLOR_LOGIC_OP:
return ctx->Color.ColorLogicOpEnabled;
case GL_MAP1_COLOR_4:
return ctx->Eval.Map1Color4;
case GL_MAP1_INDEX:
return ctx->Eval.Map1Index;
case GL_MAP1_NORMAL:
return ctx->Eval.Map1Normal;
case GL_MAP1_TEXTURE_COORD_1:
return ctx->Eval.Map1TextureCoord1;
case GL_MAP1_TEXTURE_COORD_2:
return ctx->Eval.Map1TextureCoord2;
case GL_MAP1_TEXTURE_COORD_3:
return ctx->Eval.Map1TextureCoord3;
case GL_MAP1_TEXTURE_COORD_4:
return ctx->Eval.Map1TextureCoord4;
case GL_MAP1_VERTEX_3:
return ctx->Eval.Map1Vertex3;
case GL_MAP1_VERTEX_4:
return ctx->Eval.Map1Vertex4;
case GL_MAP2_COLOR_4:
return ctx->Eval.Map2Color4;
case GL_MAP2_INDEX:
return ctx->Eval.Map2Index;
case GL_MAP2_NORMAL:
return ctx->Eval.Map2Normal;
case GL_MAP2_TEXTURE_COORD_1:
return ctx->Eval.Map2TextureCoord1;
case GL_MAP2_TEXTURE_COORD_2:
return ctx->Eval.Map2TextureCoord2;
case GL_MAP2_TEXTURE_COORD_3:
return ctx->Eval.Map2TextureCoord3;
case GL_MAP2_TEXTURE_COORD_4:
return ctx->Eval.Map2TextureCoord4;
case GL_MAP2_VERTEX_3:
return ctx->Eval.Map2Vertex3;
case GL_MAP2_VERTEX_4:
return ctx->Eval.Map2Vertex4;
case GL_NORMALIZE:
return ctx->Transform.Normalize;
case GL_POINT_SMOOTH:
return ctx->Point.SmoothFlag;
case GL_POLYGON_SMOOTH:
return ctx->Polygon.SmoothFlag;
case GL_POLYGON_STIPPLE:
return ctx->Polygon.StippleFlag;
case GL_POLYGON_OFFSET_POINT:
return ctx->Polygon.OffsetPoint;
case GL_POLYGON_OFFSET_LINE:
return ctx->Polygon.OffsetLine;
case GL_POLYGON_OFFSET_FILL:
/*case GL_POLYGON_OFFSET_EXT:*/
return ctx->Polygon.OffsetFill;
case GL_RESCALE_NORMAL_EXT:
return ctx->Transform.RescaleNormals;
case GL_SCISSOR_TEST:
return ctx->Scissor.Enabled;
case GL_SHARED_TEXTURE_PALETTE_EXT:
return ctx->Texture.SharedPalette;
case GL_STENCIL_TEST:
return ctx->Stencil.Enabled;
case GL_TEXTURE_1D:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->Enabled & TEXTURE_1D_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_2D:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->Enabled & TEXTURE_2D_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_3D:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->Enabled & TEXTURE_3D_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_GEN_Q:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_GEN_R:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_GEN_S:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
}
case GL_TEXTURE_GEN_T:
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
}
 
/*
* CLIENT STATE!!!
*/
case GL_VERTEX_ARRAY:
return (ctx->Array.Vertex.Enabled != 0);
case GL_NORMAL_ARRAY:
return (ctx->Array.Normal.Enabled != 0);
case GL_COLOR_ARRAY:
return (ctx->Array.Color.Enabled != 0);
case GL_INDEX_ARRAY:
return (ctx->Array.Index.Enabled != 0);
case GL_TEXTURE_COORD_ARRAY:
return (ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled != 0);
case GL_EDGE_FLAG_ARRAY:
return (ctx->Array.EdgeFlag.Enabled != 0);
case GL_FOG_COORDINATE_ARRAY_EXT:
CHECK_EXTENSION(EXT_fog_coord);
return (ctx->Array.FogCoord.Enabled != 0);
case GL_SECONDARY_COLOR_ARRAY_EXT:
CHECK_EXTENSION(EXT_secondary_color);
return (ctx->Array.SecondaryColor.Enabled != 0);
 
/* GL_EXT_histogram */
case GL_HISTOGRAM:
CHECK_EXTENSION(EXT_histogram);
return ctx->Pixel.HistogramEnabled;
case GL_MINMAX:
CHECK_EXTENSION(EXT_histogram);
return ctx->Pixel.MinMaxEnabled;
 
/* GL_HP_occlusion_test */
case GL_OCCLUSION_TEST_HP:
CHECK_EXTENSION(HP_occlusion_test);
return ctx->Depth.OcclusionTest;
 
/* GL_SGIS_pixel_texture */
case GL_PIXEL_TEXTURE_SGIS:
CHECK_EXTENSION(SGIS_pixel_texture);
return ctx->Pixel.PixelTextureEnabled;
 
/* GL_SGIX_pixel_texture */
case GL_PIXEL_TEX_GEN_SGIX:
CHECK_EXTENSION(SGIX_pixel_texture);
return ctx->Pixel.PixelTextureEnabled;
 
/* GL_SGI_color_table */
case GL_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table);
return ctx->Pixel.ColorTableEnabled;
case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table);
return ctx->Pixel.PostConvolutionColorTableEnabled;
case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
CHECK_EXTENSION(SGI_color_table);
return ctx->Pixel.PostColorMatrixColorTableEnabled;
 
/* GL_EXT_convolution */
case GL_CONVOLUTION_1D:
CHECK_EXTENSION(EXT_convolution);
return ctx->Pixel.Convolution1DEnabled;
case GL_CONVOLUTION_2D:
CHECK_EXTENSION(EXT_convolution);
return ctx->Pixel.Convolution2DEnabled;
case GL_SEPARABLE_2D:
CHECK_EXTENSION(EXT_convolution);
return ctx->Pixel.Separable2DEnabled;
 
/* GL_ARB_texture_cube_map */
case GL_TEXTURE_CUBE_MAP_ARB:
CHECK_EXTENSION(ARB_texture_cube_map);
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->Enabled & TEXTURE_CUBE_BIT) ? GL_TRUE : GL_FALSE;
}
 
/* GL_ARB_multisample */
case GL_MULTISAMPLE_ARB:
CHECK_EXTENSION(ARB_multisample);
return ctx->Multisample.Enabled;
case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
CHECK_EXTENSION(ARB_multisample);
return ctx->Multisample.SampleAlphaToCoverage;
case GL_SAMPLE_ALPHA_TO_ONE_ARB:
CHECK_EXTENSION(ARB_multisample);
return ctx->Multisample.SampleAlphaToOne;
case GL_SAMPLE_COVERAGE_ARB:
CHECK_EXTENSION(ARB_multisample);
return ctx->Multisample.SampleCoverage;
case GL_SAMPLE_COVERAGE_INVERT_ARB:
CHECK_EXTENSION(ARB_multisample);
return ctx->Multisample.SampleCoverageInvert;
 
/* GL_IBM_rasterpos_clip */
case GL_RASTER_POSITION_UNCLIPPED_IBM:
CHECK_EXTENSION(IBM_rasterpos_clip);
return ctx->Transform.RasterPositionUnclipped;
 
/* GL_NV_point_sprite */
case GL_POINT_SPRITE_NV:
return ctx->Point.PointSprite;
 
#if FEATURE_NV_vertex_program
case GL_VERTEX_PROGRAM_NV:
CHECK_EXTENSION(NV_vertex_program);
return ctx->VertexProgram.Enabled;
case GL_VERTEX_PROGRAM_POINT_SIZE_NV:
CHECK_EXTENSION(NV_vertex_program);
return ctx->VertexProgram.PointSizeEnabled;
case GL_VERTEX_PROGRAM_TWO_SIDE_NV:
CHECK_EXTENSION(NV_vertex_program);
return ctx->VertexProgram.TwoSideEnabled;
case GL_VERTEX_ATTRIB_ARRAY0_NV:
case GL_VERTEX_ATTRIB_ARRAY1_NV:
case GL_VERTEX_ATTRIB_ARRAY2_NV:
case GL_VERTEX_ATTRIB_ARRAY3_NV:
case GL_VERTEX_ATTRIB_ARRAY4_NV:
case GL_VERTEX_ATTRIB_ARRAY5_NV:
case GL_VERTEX_ATTRIB_ARRAY6_NV:
case GL_VERTEX_ATTRIB_ARRAY7_NV:
case GL_VERTEX_ATTRIB_ARRAY8_NV:
case GL_VERTEX_ATTRIB_ARRAY9_NV:
case GL_VERTEX_ATTRIB_ARRAY10_NV:
case GL_VERTEX_ATTRIB_ARRAY11_NV:
case GL_VERTEX_ATTRIB_ARRAY12_NV:
case GL_VERTEX_ATTRIB_ARRAY13_NV:
case GL_VERTEX_ATTRIB_ARRAY14_NV:
case GL_VERTEX_ATTRIB_ARRAY15_NV:
CHECK_EXTENSION(NV_vertex_program);
{
GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
return (ctx->Array.VertexAttrib[n].Enabled != 0);
}
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION(NV_vertex_program);
{
const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV);
return ctx->Eval.Map1Attrib[map];
}
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
CHECK_EXTENSION(NV_vertex_program);
{
const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV);
return ctx->Eval.Map2Attrib[map];
}
#endif /* FEATURE_NV_vertex_program */
 
/* GL_NV_texture_rectangle */
case GL_TEXTURE_RECTANGLE_NV:
CHECK_EXTENSION(NV_texture_rectangle);
{
const struct gl_texture_unit *texUnit;
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
return (texUnit->Enabled & TEXTURE_RECT_BIT) ? GL_TRUE : GL_FALSE;
}
 
/* GL_EXT_stencil_two_side */
case GL_STENCIL_TEST_TWO_SIDE_EXT:
CHECK_EXTENSION(EXT_stencil_two_side);
return ctx->Stencil.TestTwoSide;
 
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(0x%x)", (int) cap);
return GL_FALSE;
}
}
/shark/trunk/ports/mesa/src/pixel.h
0,0 → 1,139
/* $Id: pixel.h,v 1.1 2003-02-28 11:42:04 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef PIXEL_H
#define PIXEL_H
 
 
#include "mtypes.h"
 
 
/*
* API functions
*/
 
 
extern void
_mesa_GetPixelMapfv( GLenum map, GLfloat *values );
 
extern void
_mesa_GetPixelMapuiv( GLenum map, GLuint *values );
 
extern void
_mesa_GetPixelMapusv( GLenum map, GLushort *values );
 
extern void
_mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values );
 
extern void
_mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values );
 
extern void
_mesa_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values );
 
extern void
_mesa_PixelStoref( GLenum pname, GLfloat param );
 
extern void
_mesa_PixelStorei( GLenum pname, GLint param );
 
extern void
_mesa_PixelTransferf( GLenum pname, GLfloat param );
 
extern void
_mesa_PixelTransferi( GLenum pname, GLint param );
 
extern void
_mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor );
 
 
 
/*
* Pixel processing functions
*/
 
extern void
_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4],
GLfloat rScale, GLfloat gScale,
GLfloat bScale, GLfloat aScale,
GLfloat rBias, GLfloat gBias,
GLfloat bBias, GLfloat aBias);
 
extern void
_mesa_map_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]);
 
 
extern void
_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]);
 
 
extern void
_mesa_lookup_rgba(const struct gl_color_table *table,
GLuint n, GLfloat rgba[][4]);
 
 
extern void
_mesa_shift_and_offset_ci(const GLcontext *ctx, GLuint n,
GLuint indexes[]);
 
 
extern void
_mesa_map_ci(const GLcontext *ctx, GLuint n, GLuint index[]);
 
 
extern void
_mesa_map_ci_to_rgba_chan(const GLcontext *ctx,
GLuint n, const GLuint index[],
GLchan rgba[][4]);
 
 
extern void
_mesa_map_ci_to_rgba(const GLcontext *ctx,
GLuint n, const GLuint index[], GLfloat rgba[][4]);
 
 
extern void
_mesa_map_ci8_to_rgba(const GLcontext *ctx,
GLuint n, const GLubyte index[],
GLchan rgba[][4]);
 
 
extern void
_mesa_shift_and_offset_stencil(const GLcontext *ctx, GLuint n,
GLstencil indexes[]);
 
 
extern void
_mesa_map_stencil(const GLcontext *ctx, GLuint n, GLstencil index[]);
 
 
extern void
_mesa_chan_to_float_span(const GLcontext *ctx, GLuint n,
CONST GLchan rgba[][4], GLfloat rgbaf[][4]);
 
 
#endif
/shark/trunk/ports/mesa/src/glapitemp.h
0,0 → 1,5171
 
/* DO NOT EDIT! This file is generated by the glapitemp.py script. */
 
/*
* This file is a template which generates the OpenGL API entry point
* functions. It should be included by a .c file which first defines
* the following macros:
* KEYWORD1 - usually nothing, but might be __declspec(dllexport) on Win32
* KEYWORD2 - usually nothing, but might be __stdcall on Win32
* NAME(n) - builds the final function name (usually add "gl" prefix)
* DISPATCH(func, args, msg) - code to do dispatch of named function.
* msg is a printf-style debug message.
* RETURN_DISPATCH(func, args, msg) - code to do dispatch with a return value
*
* Here's an example which generates the usual OpenGL functions:
* #define KEYWORD1
* #define KEYWORD2
* #define NAME(func) gl##func
* #define DISPATCH(func, args, msg) \
* struct _glapi_table *dispatch = CurrentDispatch; \
* (*dispatch->func) args
* #define RETURN DISPATCH(func, args, msg) \
* struct _glapi_table *dispatch = CurrentDispatch; \
* return (*dispatch->func) args
*
*/
 
 
#ifndef KEYWORD1
#define KEYWORD1
#endif
 
#ifndef KEYWORD2
#define KEYWORD2
#endif
 
#ifndef NAME
#error NAME must be defined
#endif
 
#ifndef DISPATCH
#error DISPATCH must be defined
#endif
 
#ifndef RETURN_DISPATCH
#error RETURN_DISPATCH must be defined
#endif
 
GLAPI void GLAPIENTRY gl__unused413(void); /* silence warning */
 
KEYWORD1 void KEYWORD2 NAME(NewList)(GLuint list, GLenum mode)
{
DISPATCH(NewList, (list, mode), (F, "glNewList(%d, 0x%x);\n", list, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(EndList)(void)
{
DISPATCH(EndList, (), (F, "glEndList();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(CallList)(GLuint list)
{
DISPATCH(CallList, (list), (F, "glCallList(%d);\n", list));
}
 
KEYWORD1 void KEYWORD2 NAME(CallLists)(GLsizei n, GLenum type, const GLvoid * lists)
{
DISPATCH(CallLists, (n, type, lists), (F, "glCallLists(%d, 0x%x, %p);\n", n, type, (void *) lists));
}
 
KEYWORD1 void KEYWORD2 NAME(DeleteLists)(GLuint list, GLsizei range)
{
DISPATCH(DeleteLists, (list, range), (F, "glDeleteLists(%d, %d);\n", list, range));
}
 
KEYWORD1 GLuint KEYWORD2 NAME(GenLists)(GLsizei range)
{
RETURN_DISPATCH(GenLists, (range), (F, "glGenLists(%d);\n", range));
}
 
KEYWORD1 void KEYWORD2 NAME(ListBase)(GLuint base)
{
DISPATCH(ListBase, (base), (F, "glListBase(%d);\n", base));
}
 
KEYWORD1 void KEYWORD2 NAME(Begin)(GLenum mode)
{
DISPATCH(Begin, (mode), (F, "glBegin(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap)
{
DISPATCH(Bitmap, (width, height, xorig, yorig, xmove, ymove, bitmap), (F, "glBitmap(%d, %d, %f, %f, %f, %f, %p);\n", width, height, xorig, yorig, xmove, ymove, (void *) bitmap));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3b)(GLbyte red, GLbyte green, GLbyte blue)
{
DISPATCH(Color3b, (red, green, blue), (F, "glColor3b(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3bv)(const GLbyte * v)
{
DISPATCH(Color3bv, (v), (F, "glColor3bv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3d)(GLdouble red, GLdouble green, GLdouble blue)
{
DISPATCH(Color3d, (red, green, blue), (F, "glColor3d(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3dv)(const GLdouble * v)
{
DISPATCH(Color3dv, (v), (F, "glColor3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3f)(GLfloat red, GLfloat green, GLfloat blue)
{
DISPATCH(Color3f, (red, green, blue), (F, "glColor3f(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3fv)(const GLfloat * v)
{
DISPATCH(Color3fv, (v), (F, "glColor3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3i)(GLint red, GLint green, GLint blue)
{
DISPATCH(Color3i, (red, green, blue), (F, "glColor3i(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3iv)(const GLint * v)
{
DISPATCH(Color3iv, (v), (F, "glColor3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3s)(GLshort red, GLshort green, GLshort blue)
{
DISPATCH(Color3s, (red, green, blue), (F, "glColor3s(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3sv)(const GLshort * v)
{
DISPATCH(Color3sv, (v), (F, "glColor3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3ub)(GLubyte red, GLubyte green, GLubyte blue)
{
DISPATCH(Color3ub, (red, green, blue), (F, "glColor3ub(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3ubv)(const GLubyte * v)
{
DISPATCH(Color3ubv, (v), (F, "glColor3ubv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3ui)(GLuint red, GLuint green, GLuint blue)
{
DISPATCH(Color3ui, (red, green, blue), (F, "glColor3ui(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3uiv)(const GLuint * v)
{
DISPATCH(Color3uiv, (v), (F, "glColor3uiv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3us)(GLushort red, GLushort green, GLushort blue)
{
DISPATCH(Color3us, (red, green, blue), (F, "glColor3us(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(Color3usv)(const GLushort * v)
{
DISPATCH(Color3usv, (v), (F, "glColor3usv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)
{
DISPATCH(Color4b, (red, green, blue, alpha), (F, "glColor4b(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4bv)(const GLbyte * v)
{
DISPATCH(Color4bv, (v), (F, "glColor4bv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
{
DISPATCH(Color4d, (red, green, blue, alpha), (F, "glColor4d(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4dv)(const GLdouble * v)
{
DISPATCH(Color4dv, (v), (F, "glColor4dv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
DISPATCH(Color4f, (red, green, blue, alpha), (F, "glColor4f(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4fv)(const GLfloat * v)
{
DISPATCH(Color4fv, (v), (F, "glColor4fv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4i)(GLint red, GLint green, GLint blue, GLint alpha)
{
DISPATCH(Color4i, (red, green, blue, alpha), (F, "glColor4i(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4iv)(const GLint * v)
{
DISPATCH(Color4iv, (v), (F, "glColor4iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha)
{
DISPATCH(Color4s, (red, green, blue, alpha), (F, "glColor4s(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4sv)(const GLshort * v)
{
DISPATCH(Color4sv, (v), (F, "glColor4sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
DISPATCH(Color4ub, (red, green, blue, alpha), (F, "glColor4ub(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4ubv)(const GLubyte * v)
{
DISPATCH(Color4ubv, (v), (F, "glColor4ubv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha)
{
DISPATCH(Color4ui, (red, green, blue, alpha), (F, "glColor4ui(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4uiv)(const GLuint * v)
{
DISPATCH(Color4uiv, (v), (F, "glColor4uiv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha)
{
DISPATCH(Color4us, (red, green, blue, alpha), (F, "glColor4us(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(Color4usv)(const GLushort * v)
{
DISPATCH(Color4usv, (v), (F, "glColor4usv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(EdgeFlag)(GLboolean flag)
{
DISPATCH(EdgeFlag, (flag), (F, "glEdgeFlag(%d);\n", flag));
}
 
KEYWORD1 void KEYWORD2 NAME(EdgeFlagv)(const GLboolean * flag)
{
DISPATCH(EdgeFlagv, (flag), (F, "glEdgeFlagv(%p);\n", (void *) flag));
}
 
KEYWORD1 void KEYWORD2 NAME(End)(void)
{
DISPATCH(End, (), (F, "glEnd();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexd)(GLdouble c)
{
DISPATCH(Indexd, (c), (F, "glIndexd(%f);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexdv)(const GLdouble * c)
{
DISPATCH(Indexdv, (c), (F, "glIndexdv(%p);\n", (void *) c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexf)(GLfloat c)
{
DISPATCH(Indexf, (c), (F, "glIndexf(%f);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexfv)(const GLfloat * c)
{
DISPATCH(Indexfv, (c), (F, "glIndexfv(%p);\n", (void *) c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexi)(GLint c)
{
DISPATCH(Indexi, (c), (F, "glIndexi(%d);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexiv)(const GLint * c)
{
DISPATCH(Indexiv, (c), (F, "glIndexiv(%p);\n", (void *) c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexs)(GLshort c)
{
DISPATCH(Indexs, (c), (F, "glIndexs(%d);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexsv)(const GLshort * c)
{
DISPATCH(Indexsv, (c), (F, "glIndexsv(%p);\n", (void *) c));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz)
{
DISPATCH(Normal3b, (nx, ny, nz), (F, "glNormal3b(%d, %d, %d);\n", nx, ny, nz));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3bv)(const GLbyte * v)
{
DISPATCH(Normal3bv, (v), (F, "glNormal3bv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz)
{
DISPATCH(Normal3d, (nx, ny, nz), (F, "glNormal3d(%f, %f, %f);\n", nx, ny, nz));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3dv)(const GLdouble * v)
{
DISPATCH(Normal3dv, (v), (F, "glNormal3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz)
{
DISPATCH(Normal3f, (nx, ny, nz), (F, "glNormal3f(%f, %f, %f);\n", nx, ny, nz));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3fv)(const GLfloat * v)
{
DISPATCH(Normal3fv, (v), (F, "glNormal3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3i)(GLint nx, GLint ny, GLint nz)
{
DISPATCH(Normal3i, (nx, ny, nz), (F, "glNormal3i(%d, %d, %d);\n", nx, ny, nz));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3iv)(const GLint * v)
{
DISPATCH(Normal3iv, (v), (F, "glNormal3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3s)(GLshort nx, GLshort ny, GLshort nz)
{
DISPATCH(Normal3s, (nx, ny, nz), (F, "glNormal3s(%d, %d, %d);\n", nx, ny, nz));
}
 
KEYWORD1 void KEYWORD2 NAME(Normal3sv)(const GLshort * v)
{
DISPATCH(Normal3sv, (v), (F, "glNormal3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2d)(GLdouble x, GLdouble y)
{
DISPATCH(RasterPos2d, (x, y), (F, "glRasterPos2d(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2dv)(const GLdouble * v)
{
DISPATCH(RasterPos2dv, (v), (F, "glRasterPos2dv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2f)(GLfloat x, GLfloat y)
{
DISPATCH(RasterPos2f, (x, y), (F, "glRasterPos2f(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2fv)(const GLfloat * v)
{
DISPATCH(RasterPos2fv, (v), (F, "glRasterPos2fv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2i)(GLint x, GLint y)
{
DISPATCH(RasterPos2i, (x, y), (F, "glRasterPos2i(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2iv)(const GLint * v)
{
DISPATCH(RasterPos2iv, (v), (F, "glRasterPos2iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2s)(GLshort x, GLshort y)
{
DISPATCH(RasterPos2s, (x, y), (F, "glRasterPos2s(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos2sv)(const GLshort * v)
{
DISPATCH(RasterPos2sv, (v), (F, "glRasterPos2sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3d)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(RasterPos3d, (x, y, z), (F, "glRasterPos3d(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3dv)(const GLdouble * v)
{
DISPATCH(RasterPos3dv, (v), (F, "glRasterPos3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3f)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(RasterPos3f, (x, y, z), (F, "glRasterPos3f(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3fv)(const GLfloat * v)
{
DISPATCH(RasterPos3fv, (v), (F, "glRasterPos3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3i)(GLint x, GLint y, GLint z)
{
DISPATCH(RasterPos3i, (x, y, z), (F, "glRasterPos3i(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3iv)(const GLint * v)
{
DISPATCH(RasterPos3iv, (v), (F, "glRasterPos3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3s)(GLshort x, GLshort y, GLshort z)
{
DISPATCH(RasterPos3s, (x, y, z), (F, "glRasterPos3s(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos3sv)(const GLshort * v)
{
DISPATCH(RasterPos3sv, (v), (F, "glRasterPos3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
DISPATCH(RasterPos4d, (x, y, z, w), (F, "glRasterPos4d(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4dv)(const GLdouble * v)
{
DISPATCH(RasterPos4dv, (v), (F, "glRasterPos4dv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
DISPATCH(RasterPos4f, (x, y, z, w), (F, "glRasterPos4f(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4fv)(const GLfloat * v)
{
DISPATCH(RasterPos4fv, (v), (F, "glRasterPos4fv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4i)(GLint x, GLint y, GLint z, GLint w)
{
DISPATCH(RasterPos4i, (x, y, z, w), (F, "glRasterPos4i(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4iv)(const GLint * v)
{
DISPATCH(RasterPos4iv, (v), (F, "glRasterPos4iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w)
{
DISPATCH(RasterPos4s, (x, y, z, w), (F, "glRasterPos4s(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(RasterPos4sv)(const GLshort * v)
{
DISPATCH(RasterPos4sv, (v), (F, "glRasterPos4sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
{
DISPATCH(Rectd, (x1, y1, x2, y2), (F, "glRectd(%f, %f, %f, %f);\n", x1, y1, x2, y2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectdv)(const GLdouble * v1, const GLdouble * v2)
{
DISPATCH(Rectdv, (v1, v2), (F, "glRectdv(%p, %p);\n", (void *) v1, (void *) v2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
DISPATCH(Rectf, (x1, y1, x2, y2), (F, "glRectf(%f, %f, %f, %f);\n", x1, y1, x2, y2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectfv)(const GLfloat * v1, const GLfloat * v2)
{
DISPATCH(Rectfv, (v1, v2), (F, "glRectfv(%p, %p);\n", (void *) v1, (void *) v2));
}
 
KEYWORD1 void KEYWORD2 NAME(Recti)(GLint x1, GLint y1, GLint x2, GLint y2)
{
DISPATCH(Recti, (x1, y1, x2, y2), (F, "glRecti(%d, %d, %d, %d);\n", x1, y1, x2, y2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectiv)(const GLint * v1, const GLint * v2)
{
DISPATCH(Rectiv, (v1, v2), (F, "glRectiv(%p, %p);\n", (void *) v1, (void *) v2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2)
{
DISPATCH(Rects, (x1, y1, x2, y2), (F, "glRects(%d, %d, %d, %d);\n", x1, y1, x2, y2));
}
 
KEYWORD1 void KEYWORD2 NAME(Rectsv)(const GLshort * v1, const GLshort * v2)
{
DISPATCH(Rectsv, (v1, v2), (F, "glRectsv(%p, %p);\n", (void *) v1, (void *) v2));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1d)(GLdouble s)
{
DISPATCH(TexCoord1d, (s), (F, "glTexCoord1d(%f);\n", s));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1dv)(const GLdouble * v)
{
DISPATCH(TexCoord1dv, (v), (F, "glTexCoord1dv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1f)(GLfloat s)
{
DISPATCH(TexCoord1f, (s), (F, "glTexCoord1f(%f);\n", s));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1fv)(const GLfloat * v)
{
DISPATCH(TexCoord1fv, (v), (F, "glTexCoord1fv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1i)(GLint s)
{
DISPATCH(TexCoord1i, (s), (F, "glTexCoord1i(%d);\n", s));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1iv)(const GLint * v)
{
DISPATCH(TexCoord1iv, (v), (F, "glTexCoord1iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1s)(GLshort s)
{
DISPATCH(TexCoord1s, (s), (F, "glTexCoord1s(%d);\n", s));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord1sv)(const GLshort * v)
{
DISPATCH(TexCoord1sv, (v), (F, "glTexCoord1sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2d)(GLdouble s, GLdouble t)
{
DISPATCH(TexCoord2d, (s, t), (F, "glTexCoord2d(%f, %f);\n", s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2dv)(const GLdouble * v)
{
DISPATCH(TexCoord2dv, (v), (F, "glTexCoord2dv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2f)(GLfloat s, GLfloat t)
{
DISPATCH(TexCoord2f, (s, t), (F, "glTexCoord2f(%f, %f);\n", s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2fv)(const GLfloat * v)
{
DISPATCH(TexCoord2fv, (v), (F, "glTexCoord2fv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2i)(GLint s, GLint t)
{
DISPATCH(TexCoord2i, (s, t), (F, "glTexCoord2i(%d, %d);\n", s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2iv)(const GLint * v)
{
DISPATCH(TexCoord2iv, (v), (F, "glTexCoord2iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2s)(GLshort s, GLshort t)
{
DISPATCH(TexCoord2s, (s, t), (F, "glTexCoord2s(%d, %d);\n", s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord2sv)(const GLshort * v)
{
DISPATCH(TexCoord2sv, (v), (F, "glTexCoord2sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3d)(GLdouble s, GLdouble t, GLdouble r)
{
DISPATCH(TexCoord3d, (s, t, r), (F, "glTexCoord3d(%f, %f, %f);\n", s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3dv)(const GLdouble * v)
{
DISPATCH(TexCoord3dv, (v), (F, "glTexCoord3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3f)(GLfloat s, GLfloat t, GLfloat r)
{
DISPATCH(TexCoord3f, (s, t, r), (F, "glTexCoord3f(%f, %f, %f);\n", s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3fv)(const GLfloat * v)
{
DISPATCH(TexCoord3fv, (v), (F, "glTexCoord3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3i)(GLint s, GLint t, GLint r)
{
DISPATCH(TexCoord3i, (s, t, r), (F, "glTexCoord3i(%d, %d, %d);\n", s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3iv)(const GLint * v)
{
DISPATCH(TexCoord3iv, (v), (F, "glTexCoord3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3s)(GLshort s, GLshort t, GLshort r)
{
DISPATCH(TexCoord3s, (s, t, r), (F, "glTexCoord3s(%d, %d, %d);\n", s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord3sv)(const GLshort * v)
{
DISPATCH(TexCoord3sv, (v), (F, "glTexCoord3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
DISPATCH(TexCoord4d, (s, t, r, q), (F, "glTexCoord4d(%f, %f, %f, %f);\n", s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4dv)(const GLdouble * v)
{
DISPATCH(TexCoord4dv, (v), (F, "glTexCoord4dv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
DISPATCH(TexCoord4f, (s, t, r, q), (F, "glTexCoord4f(%f, %f, %f, %f);\n", s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4fv)(const GLfloat * v)
{
DISPATCH(TexCoord4fv, (v), (F, "glTexCoord4fv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4i)(GLint s, GLint t, GLint r, GLint q)
{
DISPATCH(TexCoord4i, (s, t, r, q), (F, "glTexCoord4i(%d, %d, %d, %d);\n", s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4iv)(const GLint * v)
{
DISPATCH(TexCoord4iv, (v), (F, "glTexCoord4iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q)
{
DISPATCH(TexCoord4s, (s, t, r, q), (F, "glTexCoord4s(%d, %d, %d, %d);\n", s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoord4sv)(const GLshort * v)
{
DISPATCH(TexCoord4sv, (v), (F, "glTexCoord4sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2d)(GLdouble x, GLdouble y)
{
DISPATCH(Vertex2d, (x, y), (F, "glVertex2d(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2dv)(const GLdouble * v)
{
DISPATCH(Vertex2dv, (v), (F, "glVertex2dv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2f)(GLfloat x, GLfloat y)
{
DISPATCH(Vertex2f, (x, y), (F, "glVertex2f(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2fv)(const GLfloat * v)
{
DISPATCH(Vertex2fv, (v), (F, "glVertex2fv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2i)(GLint x, GLint y)
{
DISPATCH(Vertex2i, (x, y), (F, "glVertex2i(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2iv)(const GLint * v)
{
DISPATCH(Vertex2iv, (v), (F, "glVertex2iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2s)(GLshort x, GLshort y)
{
DISPATCH(Vertex2s, (x, y), (F, "glVertex2s(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex2sv)(const GLshort * v)
{
DISPATCH(Vertex2sv, (v), (F, "glVertex2sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3d)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(Vertex3d, (x, y, z), (F, "glVertex3d(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3dv)(const GLdouble * v)
{
DISPATCH(Vertex3dv, (v), (F, "glVertex3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(Vertex3f, (x, y, z), (F, "glVertex3f(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3fv)(const GLfloat * v)
{
DISPATCH(Vertex3fv, (v), (F, "glVertex3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3i)(GLint x, GLint y, GLint z)
{
DISPATCH(Vertex3i, (x, y, z), (F, "glVertex3i(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3iv)(const GLint * v)
{
DISPATCH(Vertex3iv, (v), (F, "glVertex3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3s)(GLshort x, GLshort y, GLshort z)
{
DISPATCH(Vertex3s, (x, y, z), (F, "glVertex3s(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex3sv)(const GLshort * v)
{
DISPATCH(Vertex3sv, (v), (F, "glVertex3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
DISPATCH(Vertex4d, (x, y, z, w), (F, "glVertex4d(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4dv)(const GLdouble * v)
{
DISPATCH(Vertex4dv, (v), (F, "glVertex4dv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
DISPATCH(Vertex4f, (x, y, z, w), (F, "glVertex4f(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4fv)(const GLfloat * v)
{
DISPATCH(Vertex4fv, (v), (F, "glVertex4fv(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4i)(GLint x, GLint y, GLint z, GLint w)
{
DISPATCH(Vertex4i, (x, y, z, w), (F, "glVertex4i(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4iv)(const GLint * v)
{
DISPATCH(Vertex4iv, (v), (F, "glVertex4iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w)
{
DISPATCH(Vertex4s, (x, y, z, w), (F, "glVertex4s(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(Vertex4sv)(const GLshort * v)
{
DISPATCH(Vertex4sv, (v), (F, "glVertex4sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(ClipPlane)(GLenum plane, const GLdouble * equation)
{
DISPATCH(ClipPlane, (plane, equation), (F, "glClipPlane(0x%x, %p);\n", plane, (void *) equation));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorMaterial)(GLenum face, GLenum mode)
{
DISPATCH(ColorMaterial, (face, mode), (F, "glColorMaterial(0x%x, 0x%x);\n", face, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(CullFace)(GLenum mode)
{
DISPATCH(CullFace, (mode), (F, "glCullFace(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(Fogf)(GLenum pname, GLfloat param)
{
DISPATCH(Fogf, (pname, param), (F, "glFogf(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Fogfv)(GLenum pname, const GLfloat * params)
{
DISPATCH(Fogfv, (pname, params), (F, "glFogfv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(Fogi)(GLenum pname, GLint param)
{
DISPATCH(Fogi, (pname, param), (F, "glFogi(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Fogiv)(GLenum pname, const GLint * params)
{
DISPATCH(Fogiv, (pname, params), (F, "glFogiv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FrontFace)(GLenum mode)
{
DISPATCH(FrontFace, (mode), (F, "glFrontFace(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(Hint)(GLenum target, GLenum mode)
{
DISPATCH(Hint, (target, mode), (F, "glHint(0x%x, 0x%x);\n", target, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(Lightf)(GLenum light, GLenum pname, GLfloat param)
{
DISPATCH(Lightf, (light, pname, param), (F, "glLightf(0x%x, 0x%x, %f);\n", light, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Lightfv)(GLenum light, GLenum pname, const GLfloat * params)
{
DISPATCH(Lightfv, (light, pname, params), (F, "glLightfv(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(Lighti)(GLenum light, GLenum pname, GLint param)
{
DISPATCH(Lighti, (light, pname, param), (F, "glLighti(0x%x, 0x%x, %d);\n", light, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Lightiv)(GLenum light, GLenum pname, const GLint * params)
{
DISPATCH(Lightiv, (light, pname, params), (F, "glLightiv(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(LightModelf)(GLenum pname, GLfloat param)
{
DISPATCH(LightModelf, (pname, param), (F, "glLightModelf(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(LightModelfv)(GLenum pname, const GLfloat * params)
{
DISPATCH(LightModelfv, (pname, params), (F, "glLightModelfv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(LightModeli)(GLenum pname, GLint param)
{
DISPATCH(LightModeli, (pname, param), (F, "glLightModeli(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(LightModeliv)(GLenum pname, const GLint * params)
{
DISPATCH(LightModeliv, (pname, params), (F, "glLightModeliv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(LineStipple)(GLint factor, GLushort pattern)
{
DISPATCH(LineStipple, (factor, pattern), (F, "glLineStipple(%d, %d);\n", factor, pattern));
}
 
KEYWORD1 void KEYWORD2 NAME(LineWidth)(GLfloat width)
{
DISPATCH(LineWidth, (width), (F, "glLineWidth(%f);\n", width));
}
 
KEYWORD1 void KEYWORD2 NAME(Materialf)(GLenum face, GLenum pname, GLfloat param)
{
DISPATCH(Materialf, (face, pname, param), (F, "glMaterialf(0x%x, 0x%x, %f);\n", face, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Materialfv)(GLenum face, GLenum pname, const GLfloat * params)
{
DISPATCH(Materialfv, (face, pname, params), (F, "glMaterialfv(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(Materiali)(GLenum face, GLenum pname, GLint param)
{
DISPATCH(Materiali, (face, pname, param), (F, "glMateriali(0x%x, 0x%x, %d);\n", face, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(Materialiv)(GLenum face, GLenum pname, const GLint * params)
{
DISPATCH(Materialiv, (face, pname, params), (F, "glMaterialiv(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointSize)(GLfloat size)
{
DISPATCH(PointSize, (size), (F, "glPointSize(%f);\n", size));
}
 
KEYWORD1 void KEYWORD2 NAME(PolygonMode)(GLenum face, GLenum mode)
{
DISPATCH(PolygonMode, (face, mode), (F, "glPolygonMode(0x%x, 0x%x);\n", face, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(PolygonStipple)(const GLubyte * mask)
{
DISPATCH(PolygonStipple, (mask), (F, "glPolygonStipple(%p);\n", (void *) mask));
}
 
KEYWORD1 void KEYWORD2 NAME(Scissor)(GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(Scissor, (x, y, width, height), (F, "glScissor(%d, %d, %d, %d);\n", x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(ShadeModel)(GLenum mode)
{
DISPATCH(ShadeModel, (mode), (F, "glShadeModel(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(TexParameterf)(GLenum target, GLenum pname, GLfloat param)
{
DISPATCH(TexParameterf, (target, pname, param), (F, "glTexParameterf(0x%x, 0x%x, %f);\n", target, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(TexParameterfv, (target, pname, params), (F, "glTexParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexParameteri)(GLenum target, GLenum pname, GLint param)
{
DISPATCH(TexParameteri, (target, pname, param), (F, "glTexParameteri(0x%x, 0x%x, %d);\n", target, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexParameteriv)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(TexParameteriv, (target, pname, params), (F, "glTexParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexImage1D, (target, level, internalformat, width, border, format, type, pixels), (F, "glTexImage1D(0x%x, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, internalformat, width, border, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexImage2D, (target, level, internalformat, width, height, border, format, type, pixels), (F, "glTexImage2D(0x%x, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, internalformat, width, height, border, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexEnvf)(GLenum target, GLenum pname, GLfloat param)
{
DISPATCH(TexEnvf, (target, pname, param), (F, "glTexEnvf(0x%x, 0x%x, %f);\n", target, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(TexEnvfv, (target, pname, params), (F, "glTexEnvfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexEnvi)(GLenum target, GLenum pname, GLint param)
{
DISPATCH(TexEnvi, (target, pname, param), (F, "glTexEnvi(0x%x, 0x%x, %d);\n", target, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexEnviv)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(TexEnviv, (target, pname, params), (F, "glTexEnviv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGend)(GLenum coord, GLenum pname, GLdouble param)
{
DISPATCH(TexGend, (coord, pname, param), (F, "glTexGend(0x%x, 0x%x, %f);\n", coord, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGendv)(GLenum coord, GLenum pname, const GLdouble * params)
{
DISPATCH(TexGendv, (coord, pname, params), (F, "glTexGendv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGenf)(GLenum coord, GLenum pname, GLfloat param)
{
DISPATCH(TexGenf, (coord, pname, param), (F, "glTexGenf(0x%x, 0x%x, %f);\n", coord, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params)
{
DISPATCH(TexGenfv, (coord, pname, params), (F, "glTexGenfv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGeni)(GLenum coord, GLenum pname, GLint param)
{
DISPATCH(TexGeni, (coord, pname, param), (F, "glTexGeni(0x%x, 0x%x, %d);\n", coord, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(TexGeniv)(GLenum coord, GLenum pname, const GLint * params)
{
DISPATCH(TexGeniv, (coord, pname, params), (F, "glTexGeniv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer)
{
DISPATCH(FeedbackBuffer, (size, type, buffer), (F, "glFeedbackBuffer(%d, 0x%x, %p);\n", size, type, (void *) buffer));
}
 
KEYWORD1 void KEYWORD2 NAME(SelectBuffer)(GLsizei size, GLuint * buffer)
{
DISPATCH(SelectBuffer, (size, buffer), (F, "glSelectBuffer(%d, %p);\n", size, (void *) buffer));
}
 
KEYWORD1 GLint KEYWORD2 NAME(RenderMode)(GLenum mode)
{
RETURN_DISPATCH(RenderMode, (mode), (F, "glRenderMode(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(InitNames)(void)
{
DISPATCH(InitNames, (), (F, "glInitNames();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadName)(GLuint name)
{
DISPATCH(LoadName, (name), (F, "glLoadName(%d);\n", name));
}
 
KEYWORD1 void KEYWORD2 NAME(PassThrough)(GLfloat token)
{
DISPATCH(PassThrough, (token), (F, "glPassThrough(%f);\n", token));
}
 
KEYWORD1 void KEYWORD2 NAME(PopName)(void)
{
DISPATCH(PopName, (), (F, "glPopName();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(PushName)(GLuint name)
{
DISPATCH(PushName, (name), (F, "glPushName(%d);\n", name));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawBuffer)(GLenum mode)
{
DISPATCH(DrawBuffer, (mode), (F, "glDrawBuffer(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(Clear)(GLbitfield mask)
{
DISPATCH(Clear, (mask), (F, "glClear(%p);\n", (void *) mask));
}
 
KEYWORD1 void KEYWORD2 NAME(ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
DISPATCH(ClearAccum, (red, green, blue, alpha), (F, "glClearAccum(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(ClearIndex)(GLfloat c)
{
DISPATCH(ClearIndex, (c), (F, "glClearIndex(%f);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
DISPATCH(ClearColor, (red, green, blue, alpha), (F, "glClearColor(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(ClearStencil)(GLint s)
{
DISPATCH(ClearStencil, (s), (F, "glClearStencil(%d);\n", s));
}
 
KEYWORD1 void KEYWORD2 NAME(ClearDepth)(GLclampd depth)
{
DISPATCH(ClearDepth, (depth), (F, "glClearDepth(%f);\n", depth));
}
 
KEYWORD1 void KEYWORD2 NAME(StencilMask)(GLuint mask)
{
DISPATCH(StencilMask, (mask), (F, "glStencilMask(%d);\n", mask));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
{
DISPATCH(ColorMask, (red, green, blue, alpha), (F, "glColorMask(%d, %d, %d, %d);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(DepthMask)(GLboolean flag)
{
DISPATCH(DepthMask, (flag), (F, "glDepthMask(%d);\n", flag));
}
 
KEYWORD1 void KEYWORD2 NAME(IndexMask)(GLuint mask)
{
DISPATCH(IndexMask, (mask), (F, "glIndexMask(%d);\n", mask));
}
 
KEYWORD1 void KEYWORD2 NAME(Accum)(GLenum op, GLfloat value)
{
DISPATCH(Accum, (op, value), (F, "glAccum(0x%x, %f);\n", op, value));
}
 
KEYWORD1 void KEYWORD2 NAME(Disable)(GLenum cap)
{
DISPATCH(Disable, (cap), (F, "glDisable(0x%x);\n", cap));
}
 
KEYWORD1 void KEYWORD2 NAME(Enable)(GLenum cap)
{
DISPATCH(Enable, (cap), (F, "glEnable(0x%x);\n", cap));
}
 
KEYWORD1 void KEYWORD2 NAME(Finish)(void)
{
DISPATCH(Finish, (), (F, "glFinish();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(Flush)(void)
{
DISPATCH(Flush, (), (F, "glFlush();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(PopAttrib)(void)
{
DISPATCH(PopAttrib, (), (F, "glPopAttrib();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(PushAttrib)(GLbitfield mask)
{
DISPATCH(PushAttrib, (mask), (F, "glPushAttrib(%p);\n", (void *) mask));
}
 
KEYWORD1 void KEYWORD2 NAME(Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points)
{
DISPATCH(Map1d, (target, u1, u2, stride, order, points), (F, "glMap1d(0x%x, %f, %f, %d, %d, %p);\n", target, u1, u2, stride, order, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points)
{
DISPATCH(Map1f, (target, u1, u2, stride, order, points), (F, "glMap1f(0x%x, %f, %f, %d, %d, %p);\n", target, u1, u2, stride, order, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points)
{
DISPATCH(Map2d, (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points), (F, "glMap2d(0x%x, %f, %f, %d, %d, %f, %f, %d, %d, %p);\n", target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points)
{
DISPATCH(Map2f, (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points), (F, "glMap2f(0x%x, %f, %f, %d, %d, %f, %f, %d, %d, %p);\n", target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(MapGrid1d)(GLint un, GLdouble u1, GLdouble u2)
{
DISPATCH(MapGrid1d, (un, u1, u2), (F, "glMapGrid1d(%d, %f, %f);\n", un, u1, u2));
}
 
KEYWORD1 void KEYWORD2 NAME(MapGrid1f)(GLint un, GLfloat u1, GLfloat u2)
{
DISPATCH(MapGrid1f, (un, u1, u2), (F, "glMapGrid1f(%d, %f, %f);\n", un, u1, u2));
}
 
KEYWORD1 void KEYWORD2 NAME(MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)
{
DISPATCH(MapGrid2d, (un, u1, u2, vn, v1, v2), (F, "glMapGrid2d(%d, %f, %f, %d, %f, %f);\n", un, u1, u2, vn, v1, v2));
}
 
KEYWORD1 void KEYWORD2 NAME(MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)
{
DISPATCH(MapGrid2f, (un, u1, u2, vn, v1, v2), (F, "glMapGrid2f(%d, %f, %f, %d, %f, %f);\n", un, u1, u2, vn, v1, v2));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord1d)(GLdouble u)
{
DISPATCH(EvalCoord1d, (u), (F, "glEvalCoord1d(%f);\n", u));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord1dv)(const GLdouble * u)
{
DISPATCH(EvalCoord1dv, (u), (F, "glEvalCoord1dv(%p);\n", (void *) u));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord1f)(GLfloat u)
{
DISPATCH(EvalCoord1f, (u), (F, "glEvalCoord1f(%f);\n", u));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord1fv)(const GLfloat * u)
{
DISPATCH(EvalCoord1fv, (u), (F, "glEvalCoord1fv(%p);\n", (void *) u));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord2d)(GLdouble u, GLdouble v)
{
DISPATCH(EvalCoord2d, (u, v), (F, "glEvalCoord2d(%f, %f);\n", u, v));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord2dv)(const GLdouble * u)
{
DISPATCH(EvalCoord2dv, (u), (F, "glEvalCoord2dv(%p /* %g, %g */);\n", (void *) u, u[0], u[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord2f)(GLfloat u, GLfloat v)
{
DISPATCH(EvalCoord2f, (u, v), (F, "glEvalCoord2f(%f, %f);\n", u, v));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalCoord2fv)(const GLfloat * u)
{
DISPATCH(EvalCoord2fv, (u), (F, "glEvalCoord2fv(%p /* %g, %g */);\n", (void *) u, u[0], u[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalMesh1)(GLenum mode, GLint i1, GLint i2)
{
DISPATCH(EvalMesh1, (mode, i1, i2), (F, "glEvalMesh1(0x%x, %d, %d);\n", mode, i1, i2));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalPoint1)(GLint i)
{
DISPATCH(EvalPoint1, (i), (F, "glEvalPoint1(%d);\n", i));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
{
DISPATCH(EvalMesh2, (mode, i1, i2, j1, j2), (F, "glEvalMesh2(0x%x, %d, %d, %d, %d);\n", mode, i1, i2, j1, j2));
}
 
KEYWORD1 void KEYWORD2 NAME(EvalPoint2)(GLint i, GLint j)
{
DISPATCH(EvalPoint2, (i, j), (F, "glEvalPoint2(%d, %d);\n", i, j));
}
 
KEYWORD1 void KEYWORD2 NAME(AlphaFunc)(GLenum func, GLclampf ref)
{
DISPATCH(AlphaFunc, (func, ref), (F, "glAlphaFunc(0x%x, %f);\n", func, ref));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendFunc)(GLenum sfactor, GLenum dfactor)
{
DISPATCH(BlendFunc, (sfactor, dfactor), (F, "glBlendFunc(0x%x, 0x%x);\n", sfactor, dfactor));
}
 
KEYWORD1 void KEYWORD2 NAME(LogicOp)(GLenum opcode)
{
DISPATCH(LogicOp, (opcode), (F, "glLogicOp(0x%x);\n", opcode));
}
 
KEYWORD1 void KEYWORD2 NAME(StencilFunc)(GLenum func, GLint ref, GLuint mask)
{
DISPATCH(StencilFunc, (func, ref, mask), (F, "glStencilFunc(0x%x, %d, %d);\n", func, ref, mask));
}
 
KEYWORD1 void KEYWORD2 NAME(StencilOp)(GLenum fail, GLenum zfail, GLenum zpass)
{
DISPATCH(StencilOp, (fail, zfail, zpass), (F, "glStencilOp(0x%x, 0x%x, 0x%x);\n", fail, zfail, zpass));
}
 
KEYWORD1 void KEYWORD2 NAME(DepthFunc)(GLenum func)
{
DISPATCH(DepthFunc, (func), (F, "glDepthFunc(0x%x);\n", func));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelZoom)(GLfloat xfactor, GLfloat yfactor)
{
DISPATCH(PixelZoom, (xfactor, yfactor), (F, "glPixelZoom(%f, %f);\n", xfactor, yfactor));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTransferf)(GLenum pname, GLfloat param)
{
DISPATCH(PixelTransferf, (pname, param), (F, "glPixelTransferf(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTransferi)(GLenum pname, GLint param)
{
DISPATCH(PixelTransferi, (pname, param), (F, "glPixelTransferi(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelStoref)(GLenum pname, GLfloat param)
{
DISPATCH(PixelStoref, (pname, param), (F, "glPixelStoref(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelStorei)(GLenum pname, GLint param)
{
DISPATCH(PixelStorei, (pname, param), (F, "glPixelStorei(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelMapfv)(GLenum map, GLint mapsize, const GLfloat * values)
{
DISPATCH(PixelMapfv, (map, mapsize, values), (F, "glPixelMapfv(0x%x, %d, %p);\n", map, mapsize, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelMapuiv)(GLenum map, GLint mapsize, const GLuint * values)
{
DISPATCH(PixelMapuiv, (map, mapsize, values), (F, "glPixelMapuiv(0x%x, %d, %p);\n", map, mapsize, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelMapusv)(GLenum map, GLint mapsize, const GLushort * values)
{
DISPATCH(PixelMapusv, (map, mapsize, values), (F, "glPixelMapusv(0x%x, %d, %p);\n", map, mapsize, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(ReadBuffer)(GLenum mode)
{
DISPATCH(ReadBuffer, (mode), (F, "glReadBuffer(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
{
DISPATCH(CopyPixels, (x, y, width, height, type), (F, "glCopyPixels(%d, %d, %d, %d, 0x%x);\n", x, y, width, height, type));
}
 
KEYWORD1 void KEYWORD2 NAME(ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels)
{
DISPATCH(ReadPixels, (x, y, width, height, format, type, pixels), (F, "glReadPixels(%d, %d, %d, %d, 0x%x, 0x%x, %p);\n", x, y, width, height, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(DrawPixels, (width, height, format, type, pixels), (F, "glDrawPixels(%d, %d, 0x%x, 0x%x, %p);\n", width, height, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(GetBooleanv)(GLenum pname, GLboolean * params)
{
DISPATCH(GetBooleanv, (pname, params), (F, "glGetBooleanv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetClipPlane)(GLenum plane, GLdouble * equation)
{
DISPATCH(GetClipPlane, (plane, equation), (F, "glGetClipPlane(0x%x, %p);\n", plane, (void *) equation));
}
 
KEYWORD1 void KEYWORD2 NAME(GetDoublev)(GLenum pname, GLdouble * params)
{
DISPATCH(GetDoublev, (pname, params), (F, "glGetDoublev(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 GLenum KEYWORD2 NAME(GetError)(void)
{
RETURN_DISPATCH(GetError, (), (F, "glGetError();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFloatv)(GLenum pname, GLfloat * params)
{
DISPATCH(GetFloatv, (pname, params), (F, "glGetFloatv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetIntegerv)(GLenum pname, GLint * params)
{
DISPATCH(GetIntegerv, (pname, params), (F, "glGetIntegerv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetLightfv)(GLenum light, GLenum pname, GLfloat * params)
{
DISPATCH(GetLightfv, (light, pname, params), (F, "glGetLightfv(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetLightiv)(GLenum light, GLenum pname, GLint * params)
{
DISPATCH(GetLightiv, (light, pname, params), (F, "glGetLightiv(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMapdv)(GLenum target, GLenum query, GLdouble * v)
{
DISPATCH(GetMapdv, (target, query, v), (F, "glGetMapdv(0x%x, 0x%x, %p);\n", target, query, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMapfv)(GLenum target, GLenum query, GLfloat * v)
{
DISPATCH(GetMapfv, (target, query, v), (F, "glGetMapfv(0x%x, 0x%x, %p);\n", target, query, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMapiv)(GLenum target, GLenum query, GLint * v)
{
DISPATCH(GetMapiv, (target, query, v), (F, "glGetMapiv(0x%x, 0x%x, %p);\n", target, query, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params)
{
DISPATCH(GetMaterialfv, (face, pname, params), (F, "glGetMaterialfv(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMaterialiv)(GLenum face, GLenum pname, GLint * params)
{
DISPATCH(GetMaterialiv, (face, pname, params), (F, "glGetMaterialiv(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPixelMapfv)(GLenum map, GLfloat * values)
{
DISPATCH(GetPixelMapfv, (map, values), (F, "glGetPixelMapfv(0x%x, %p);\n", map, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPixelMapuiv)(GLenum map, GLuint * values)
{
DISPATCH(GetPixelMapuiv, (map, values), (F, "glGetPixelMapuiv(0x%x, %p);\n", map, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPixelMapusv)(GLenum map, GLushort * values)
{
DISPATCH(GetPixelMapusv, (map, values), (F, "glGetPixelMapusv(0x%x, %p);\n", map, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPolygonStipple)(GLubyte * mask)
{
DISPATCH(GetPolygonStipple, (mask), (F, "glGetPolygonStipple(%p);\n", (void *) mask));
}
 
KEYWORD1 const GLubyte * KEYWORD2 NAME(GetString)(GLenum name)
{
RETURN_DISPATCH(GetString, (name), (F, "glGetString(0x%x);\n", name));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetTexEnvfv, (target, pname, params), (F, "glGetTexEnvfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexEnviv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetTexEnviv, (target, pname, params), (F, "glGetTexEnviv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params)
{
DISPATCH(GetTexGendv, (coord, pname, params), (F, "glGetTexGendv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params)
{
DISPATCH(GetTexGenfv, (coord, pname, params), (F, "glGetTexGenfv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexGeniv)(GLenum coord, GLenum pname, GLint * params)
{
DISPATCH(GetTexGeniv, (coord, pname, params), (F, "glGetTexGeniv(0x%x, 0x%x, %p);\n", coord, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels)
{
DISPATCH(GetTexImage, (target, level, format, type, pixels), (F, "glGetTexImage(0x%x, %d, 0x%x, 0x%x, %p);\n", target, level, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetTexParameterfv, (target, pname, params), (F, "glGetTexParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexParameteriv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetTexParameteriv, (target, pname, params), (F, "glGetTexParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params)
{
DISPATCH(GetTexLevelParameterfv, (target, level, pname, params), (F, "glGetTexLevelParameterfv(0x%x, %d, 0x%x, %p);\n", target, level, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params)
{
DISPATCH(GetTexLevelParameteriv, (target, level, pname, params), (F, "glGetTexLevelParameteriv(0x%x, %d, 0x%x, %p);\n", target, level, pname, (void *) params));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsEnabled)(GLenum cap)
{
RETURN_DISPATCH(IsEnabled, (cap), (F, "glIsEnabled(0x%x);\n", cap));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsList)(GLuint list)
{
RETURN_DISPATCH(IsList, (list), (F, "glIsList(%d);\n", list));
}
 
KEYWORD1 void KEYWORD2 NAME(DepthRange)(GLclampd zNear, GLclampd zFar)
{
DISPATCH(DepthRange, (zNear, zFar), (F, "glDepthRange(%f, %f);\n", zNear, zFar));
}
 
KEYWORD1 void KEYWORD2 NAME(Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
DISPATCH(Frustum, (left, right, bottom, top, zNear, zFar), (F, "glFrustum(%f, %f, %f, %f, %f, %f);\n", left, right, bottom, top, zNear, zFar));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadIdentity)(void)
{
DISPATCH(LoadIdentity, (), (F, "glLoadIdentity();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadMatrixf)(const GLfloat * m)
{
DISPATCH(LoadMatrixf, (m), (F, "glLoadMatrixf(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadMatrixd)(const GLdouble * m)
{
DISPATCH(LoadMatrixd, (m), (F, "glLoadMatrixd(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MatrixMode)(GLenum mode)
{
DISPATCH(MatrixMode, (mode), (F, "glMatrixMode(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(MultMatrixf)(const GLfloat * m)
{
DISPATCH(MultMatrixf, (m), (F, "glMultMatrixf(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MultMatrixd)(const GLdouble * m)
{
DISPATCH(MultMatrixd, (m), (F, "glMultMatrixd(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
DISPATCH(Ortho, (left, right, bottom, top, zNear, zFar), (F, "glOrtho(%f, %f, %f, %f, %f, %f);\n", left, right, bottom, top, zNear, zFar));
}
 
KEYWORD1 void KEYWORD2 NAME(PopMatrix)(void)
{
DISPATCH(PopMatrix, (), (F, "glPopMatrix();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(PushMatrix)(void)
{
DISPATCH(PushMatrix, (), (F, "glPushMatrix();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(Rotated, (angle, x, y, z), (F, "glRotated(%f, %f, %f, %f);\n", angle, x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(Rotatef, (angle, x, y, z), (F, "glRotatef(%f, %f, %f, %f);\n", angle, x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Scaled)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(Scaled, (x, y, z), (F, "glScaled(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Scalef)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(Scalef, (x, y, z), (F, "glScalef(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Translated)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(Translated, (x, y, z), (F, "glTranslated(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Translatef)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(Translatef, (x, y, z), (F, "glTranslatef(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(Viewport)(GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(Viewport, (x, y, width, height), (F, "glViewport(%d, %d, %d, %d);\n", x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(ArrayElement)(GLint i)
{
DISPATCH(ArrayElement, (i), (F, "glArrayElement(%d);\n", i));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(ColorPointer, (size, type, stride, pointer), (F, "glColorPointer(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(DisableClientState)(GLenum array)
{
DISPATCH(DisableClientState, (array), (F, "glDisableClientState(0x%x);\n", array));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawArrays)(GLenum mode, GLint first, GLsizei count)
{
DISPATCH(DrawArrays, (mode, first, count), (F, "glDrawArrays(0x%x, %d, %d);\n", mode, first, count));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
{
DISPATCH(DrawElements, (mode, count, type, indices), (F, "glDrawElements(0x%x, %d, 0x%x, %p);\n", mode, count, type, (void *) indices));
}
 
KEYWORD1 void KEYWORD2 NAME(EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer)
{
DISPATCH(EdgeFlagPointer, (stride, pointer), (F, "glEdgeFlagPointer(%d, %p);\n", stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(EnableClientState)(GLenum array)
{
DISPATCH(EnableClientState, (array), (F, "glEnableClientState(0x%x);\n", array));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPointerv)(GLenum pname, GLvoid ** params)
{
DISPATCH(GetPointerv, (pname, params), (F, "glGetPointerv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(IndexPointer, (type, stride, pointer), (F, "glIndexPointer(0x%x, %d, %p);\n", type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(InterleavedArrays, (format, stride, pointer), (F, "glInterleavedArrays(0x%x, %d, %p);\n", format, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(NormalPointer, (type, stride, pointer), (F, "glNormalPointer(0x%x, %d, %p);\n", type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(TexCoordPointer, (size, type, stride, pointer), (F, "glTexCoordPointer(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(VertexPointer, (size, type, stride, pointer), (F, "glVertexPointer(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(PolygonOffset)(GLfloat factor, GLfloat units)
{
DISPATCH(PolygonOffset, (factor, units), (F, "glPolygonOffset(%f, %f);\n", factor, units));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
DISPATCH(CopyTexImage1D, (target, level, internalformat, x, y, width, border), (F, "glCopyTexImage1D(0x%x, %d, 0x%x, %d, %d, %d, %d);\n", target, level, internalformat, x, y, width, border));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
DISPATCH(CopyTexImage2D, (target, level, internalformat, x, y, width, height, border), (F, "glCopyTexImage2D(0x%x, %d, 0x%x, %d, %d, %d, %d, %d);\n", target, level, internalformat, x, y, width, height, border));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyTexSubImage1D, (target, level, xoffset, x, y, width), (F, "glCopyTexSubImage1D(0x%x, %d, %d, %d, %d, %d);\n", target, level, xoffset, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyTexSubImage2D, (target, level, xoffset, yoffset, x, y, width, height), (F, "glCopyTexSubImage2D(0x%x, %d, %d, %d, %d, %d, %d, %d);\n", target, level, xoffset, yoffset, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage1D, (target, level, xoffset, width, format, type, pixels), (F, "glTexSubImage1D(0x%x, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, width, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage2D, (target, level, xoffset, yoffset, width, height, format, type, pixels), (F, "glTexSubImage2D(0x%x, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, yoffset, width, height, format, type, (void *) pixels));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences)
{
RETURN_DISPATCH(AreTexturesResident, (n, textures, residences), (F, "glAreTexturesResident(%d, %p, %p);\n", n, (void *) textures, (void *) residences));
}
 
KEYWORD1 void KEYWORD2 NAME(BindTexture)(GLenum target, GLuint texture)
{
DISPATCH(BindTexture, (target, texture), (F, "glBindTexture(0x%x, %d);\n", target, texture));
}
 
KEYWORD1 void KEYWORD2 NAME(DeleteTextures)(GLsizei n, const GLuint * textures)
{
DISPATCH(DeleteTextures, (n, textures), (F, "glDeleteTextures(%d, %p);\n", n, (void *) textures));
}
 
KEYWORD1 void KEYWORD2 NAME(GenTextures)(GLsizei n, GLuint * textures)
{
DISPATCH(GenTextures, (n, textures), (F, "glGenTextures(%d, %p);\n", n, (void *) textures));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsTexture)(GLuint texture)
{
RETURN_DISPATCH(IsTexture, (texture), (F, "glIsTexture(%d);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities)
{
DISPATCH(PrioritizeTextures, (n, textures, priorities), (F, "glPrioritizeTextures(%d, %p, %p);\n", n, (void *) textures, (void *) priorities));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexub)(GLubyte c)
{
DISPATCH(Indexub, (c), (F, "glIndexub(%d);\n", c));
}
 
KEYWORD1 void KEYWORD2 NAME(Indexubv)(const GLubyte * c)
{
DISPATCH(Indexubv, (c), (F, "glIndexubv(%p);\n", (void *) c));
}
 
KEYWORD1 void KEYWORD2 NAME(PopClientAttrib)(void)
{
DISPATCH(PopClientAttrib, (), (F, "glPopClientAttrib();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(PushClientAttrib)(GLbitfield mask)
{
DISPATCH(PushClientAttrib, (mask), (F, "glPushClientAttrib(%p);\n", (void *) mask));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
DISPATCH(BlendColor, (red, green, blue, alpha), (F, "glBlendColor(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendEquation)(GLenum mode)
{
DISPATCH(BlendEquation, (mode), (F, "glBlendEquation(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)
{
DISPATCH(DrawRangeElements, (mode, start, end, count, type, indices), (F, "glDrawRangeElements(0x%x, %d, %d, %d, 0x%x, %p);\n", mode, start, end, count, type, (void *) indices));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)
{
DISPATCH(ColorTable, (target, internalformat, width, format, type, table), (F, "glColorTable(0x%x, 0x%x, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, format, type, (void *) table));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(ColorTableParameterfv, (target, pname, params), (F, "glColorTableParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(ColorTableParameteriv, (target, pname, params), (F, "glColorTableParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyColorTable, (target, internalformat, x, y, width), (F, "glCopyColorTable(0x%x, 0x%x, %d, %d, %d);\n", target, internalformat, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table)
{
DISPATCH(GetColorTable, (target, format, type, table), (F, "glGetColorTable(0x%x, 0x%x, 0x%x, %p);\n", target, format, type, (void *) table));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetColorTableParameterfv, (target, pname, params), (F, "glGetColorTableParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetColorTableParameteriv, (target, pname, params), (F, "glGetColorTableParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data)
{
DISPATCH(ColorSubTable, (target, start, count, format, type, data), (F, "glColorSubTable(0x%x, %d, %d, 0x%x, 0x%x, %p);\n", target, start, count, format, type, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyColorSubTable, (target, start, x, y, width), (F, "glCopyColorSubTable(0x%x, %d, %d, %d, %d);\n", target, start, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image)
{
DISPATCH(ConvolutionFilter1D, (target, internalformat, width, format, type, image), (F, "glConvolutionFilter1D(0x%x, 0x%x, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image)
{
DISPATCH(ConvolutionFilter2D, (target, internalformat, width, height, format, type, image), (F, "glConvolutionFilter2D(0x%x, 0x%x, %d, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, height, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params)
{
DISPATCH(ConvolutionParameterf, (target, pname, params), (F, "glConvolutionParameterf(0x%x, 0x%x, %f);\n", target, pname, params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(ConvolutionParameterfv, (target, pname, params), (F, "glConvolutionParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameteri)(GLenum target, GLenum pname, GLint params)
{
DISPATCH(ConvolutionParameteri, (target, pname, params), (F, "glConvolutionParameteri(0x%x, 0x%x, %d);\n", target, pname, params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(ConvolutionParameteriv, (target, pname, params), (F, "glConvolutionParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyConvolutionFilter1D, (target, internalformat, x, y, width), (F, "glCopyConvolutionFilter1D(0x%x, 0x%x, %d, %d, %d);\n", target, internalformat, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyConvolutionFilter2D, (target, internalformat, x, y, width, height), (F, "glCopyConvolutionFilter2D(0x%x, 0x%x, %d, %d, %d, %d);\n", target, internalformat, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image)
{
DISPATCH(GetConvolutionFilter, (target, format, type, image), (F, "glGetConvolutionFilter(0x%x, 0x%x, 0x%x, %p);\n", target, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetConvolutionParameterfv, (target, pname, params), (F, "glGetConvolutionParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetConvolutionParameteriv, (target, pname, params), (F, "glGetConvolutionParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span)
{
DISPATCH(GetSeparableFilter, (target, format, type, row, column, span), (F, "glGetSeparableFilter(0x%x, 0x%x, 0x%x, %p, %p, %p);\n", target, format, type, (void *) row, (void *) column, (void *) span));
}
 
KEYWORD1 void KEYWORD2 NAME(SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column)
{
DISPATCH(SeparableFilter2D, (target, internalformat, width, height, format, type, row, column), (F, "glSeparableFilter2D(0x%x, 0x%x, %d, %d, 0x%x, 0x%x, %p, %p);\n", target, internalformat, width, height, format, type, (void *) row, (void *) column));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)
{
DISPATCH(GetHistogram, (target, reset, format, type, values), (F, "glGetHistogram(0x%x, %d, 0x%x, 0x%x, %p);\n", target, reset, format, type, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetHistogramParameterfv, (target, pname, params), (F, "glGetHistogramParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetHistogramParameteriv, (target, pname, params), (F, "glGetHistogramParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)
{
DISPATCH(GetMinmax, (target, reset, format, type, values), (F, "glGetMinmax(0x%x, %d, 0x%x, 0x%x, %p);\n", target, reset, format, type, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetMinmaxParameterfv, (target, pname, params), (F, "glGetMinmaxParameterfv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetMinmaxParameteriv, (target, pname, params), (F, "glGetMinmaxParameteriv(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
{
DISPATCH(Histogram, (target, width, internalformat, sink), (F, "glHistogram(0x%x, %d, 0x%x, %d);\n", target, width, internalformat, sink));
}
 
KEYWORD1 void KEYWORD2 NAME(Minmax)(GLenum target, GLenum internalformat, GLboolean sink)
{
DISPATCH(Minmax, (target, internalformat, sink), (F, "glMinmax(0x%x, 0x%x, %d);\n", target, internalformat, sink));
}
 
KEYWORD1 void KEYWORD2 NAME(ResetHistogram)(GLenum target)
{
DISPATCH(ResetHistogram, (target), (F, "glResetHistogram(0x%x);\n", target));
}
 
KEYWORD1 void KEYWORD2 NAME(ResetMinmax)(GLenum target)
{
DISPATCH(ResetMinmax, (target), (F, "glResetMinmax(0x%x);\n", target));
}
 
KEYWORD1 void KEYWORD2 NAME(TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexImage3D, (target, level, internalformat, width, height, depth, border, format, type, pixels), (F, "glTexImage3D(0x%x, %d, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, internalformat, width, height, depth, border, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage3D, (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels), (F, "glTexSubImage3D(0x%x, %d, %d, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyTexSubImage3D, (target, level, xoffset, yoffset, zoffset, x, y, width, height), (F, "glCopyTexSubImage3D(0x%x, %d, %d, %d, %d, %d, %d, %d, %d);\n", target, level, xoffset, yoffset, zoffset, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(ActiveTextureARB)(GLenum texture)
{
DISPATCH(ActiveTextureARB, (texture), (F, "glActiveTextureARB(0x%x);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(ClientActiveTextureARB)(GLenum texture)
{
DISPATCH(ClientActiveTextureARB, (texture), (F, "glClientActiveTextureARB(0x%x);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1dARB)(GLenum target, GLdouble s)
{
DISPATCH(MultiTexCoord1dARB, (target, s), (F, "glMultiTexCoord1dARB(0x%x, %f);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1dvARB)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord1dvARB, (target, v), (F, "glMultiTexCoord1dvARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1fARB)(GLenum target, GLfloat s)
{
DISPATCH(MultiTexCoord1fARB, (target, s), (F, "glMultiTexCoord1fARB(0x%x, %f);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1fvARB)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord1fvARB, (target, v), (F, "glMultiTexCoord1fvARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1iARB)(GLenum target, GLint s)
{
DISPATCH(MultiTexCoord1iARB, (target, s), (F, "glMultiTexCoord1iARB(0x%x, %d);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1ivARB)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord1ivARB, (target, v), (F, "glMultiTexCoord1ivARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1sARB)(GLenum target, GLshort s)
{
DISPATCH(MultiTexCoord1sARB, (target, s), (F, "glMultiTexCoord1sARB(0x%x, %d);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1svARB)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord1svARB, (target, v), (F, "glMultiTexCoord1svARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t)
{
DISPATCH(MultiTexCoord2dARB, (target, s, t), (F, "glMultiTexCoord2dARB(0x%x, %f, %f);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2dvARB)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord2dvARB, (target, v), (F, "glMultiTexCoord2dvARB(0x%x, %p /* %g, %g */);\n", target, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t)
{
DISPATCH(MultiTexCoord2fARB, (target, s, t), (F, "glMultiTexCoord2fARB(0x%x, %f, %f);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2fvARB)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord2fvARB, (target, v), (F, "glMultiTexCoord2fvARB(0x%x, %p /* %g, %g */);\n", target, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2iARB)(GLenum target, GLint s, GLint t)
{
DISPATCH(MultiTexCoord2iARB, (target, s, t), (F, "glMultiTexCoord2iARB(0x%x, %d, %d);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2ivARB)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord2ivARB, (target, v), (F, "glMultiTexCoord2ivARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t)
{
DISPATCH(MultiTexCoord2sARB, (target, s, t), (F, "glMultiTexCoord2sARB(0x%x, %d, %d);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2svARB)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord2svARB, (target, v), (F, "glMultiTexCoord2svARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r)
{
DISPATCH(MultiTexCoord3dARB, (target, s, t, r), (F, "glMultiTexCoord3dARB(0x%x, %f, %f, %f);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3dvARB)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord3dvARB, (target, v), (F, "glMultiTexCoord3dvARB(0x%x, %p /* %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r)
{
DISPATCH(MultiTexCoord3fARB, (target, s, t, r), (F, "glMultiTexCoord3fARB(0x%x, %f, %f, %f);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3fvARB)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord3fvARB, (target, v), (F, "glMultiTexCoord3fvARB(0x%x, %p /* %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r)
{
DISPATCH(MultiTexCoord3iARB, (target, s, t, r), (F, "glMultiTexCoord3iARB(0x%x, %d, %d, %d);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3ivARB)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord3ivARB, (target, v), (F, "glMultiTexCoord3ivARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r)
{
DISPATCH(MultiTexCoord3sARB, (target, s, t, r), (F, "glMultiTexCoord3sARB(0x%x, %d, %d, %d);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3svARB)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord3svARB, (target, v), (F, "glMultiTexCoord3svARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
DISPATCH(MultiTexCoord4dARB, (target, s, t, r, q), (F, "glMultiTexCoord4dARB(0x%x, %f, %f, %f, %f);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4dvARB)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord4dvARB, (target, v), (F, "glMultiTexCoord4dvARB(0x%x, %p /* %g, %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
DISPATCH(MultiTexCoord4fARB, (target, s, t, r, q), (F, "glMultiTexCoord4fARB(0x%x, %f, %f, %f, %f);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4fvARB)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord4fvARB, (target, v), (F, "glMultiTexCoord4fvARB(0x%x, %p /* %g, %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q)
{
DISPATCH(MultiTexCoord4iARB, (target, s, t, r, q), (F, "glMultiTexCoord4iARB(0x%x, %d, %d, %d, %d);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4ivARB)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord4ivARB, (target, v), (F, "glMultiTexCoord4ivARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
{
DISPATCH(MultiTexCoord4sARB, (target, s, t, r, q), (F, "glMultiTexCoord4sARB(0x%x, %d, %d, %d, %d);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4svARB)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord4svARB, (target, v), (F, "glMultiTexCoord4svARB(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadTransposeMatrixfARB)(const GLfloat * m)
{
DISPATCH(LoadTransposeMatrixfARB, (m), (F, "glLoadTransposeMatrixfARB(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadTransposeMatrixdARB)(const GLdouble * m)
{
DISPATCH(LoadTransposeMatrixdARB, (m), (F, "glLoadTransposeMatrixdARB(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MultTransposeMatrixfARB)(const GLfloat * m)
{
DISPATCH(MultTransposeMatrixfARB, (m), (F, "glMultTransposeMatrixfARB(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MultTransposeMatrixdARB)(const GLdouble * m)
{
DISPATCH(MultTransposeMatrixdARB, (m), (F, "glMultTransposeMatrixdARB(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(SampleCoverageARB)(GLclampf value, GLboolean invert)
{
DISPATCH(SampleCoverageARB, (value, invert), (F, "glSampleCoverageARB(%f, %d);\n", value, invert));
}
 
KEYWORD1 void KEYWORD2 NAME(__unused413)(void)
{
DISPATCH(__unused413, (), (F, "gl__unused413();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage3DARB, (target, level, internalformat, width, height, depth, border, imageSize, data), (F, "glCompressedTexImage3DARB(0x%x, %d, 0x%x, %d, %d, %d, %d, %d, %p);\n", target, level, internalformat, width, height, depth, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage2DARB, (target, level, internalformat, width, height, border, imageSize, data), (F, "glCompressedTexImage2DARB(0x%x, %d, 0x%x, %d, %d, %d, %d, %p);\n", target, level, internalformat, width, height, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage1DARB, (target, level, internalformat, width, border, imageSize, data), (F, "glCompressedTexImage1DARB(0x%x, %d, 0x%x, %d, %d, %d, %p);\n", target, level, internalformat, width, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage3DARB, (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data), (F, "glCompressedTexSubImage3DARB(0x%x, %d, %d, %d, %d, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage2DARB, (target, level, xoffset, yoffset, width, height, format, imageSize, data), (F, "glCompressedTexSubImage2DARB(0x%x, %d, %d, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, yoffset, width, height, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage1DARB, (target, level, xoffset, width, format, imageSize, data), (F, "glCompressedTexSubImage1DARB(0x%x, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, width, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img)
{
DISPATCH(GetCompressedTexImageARB, (target, level, img), (F, "glGetCompressedTexImageARB(0x%x, %d, %p);\n", target, level, (void *) img));
}
 
KEYWORD1 void KEYWORD2 NAME(ActiveTexture)(GLenum texture)
{
DISPATCH(ActiveTextureARB, (texture), (F, "glActiveTexture(0x%x);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(ClientActiveTexture)(GLenum texture)
{
DISPATCH(ClientActiveTextureARB, (texture), (F, "glClientActiveTexture(0x%x);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1d)(GLenum target, GLdouble s)
{
DISPATCH(MultiTexCoord1dARB, (target, s), (F, "glMultiTexCoord1d(0x%x, %f);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1dv)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord1dvARB, (target, v), (F, "glMultiTexCoord1dv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1f)(GLenum target, GLfloat s)
{
DISPATCH(MultiTexCoord1fARB, (target, s), (F, "glMultiTexCoord1f(0x%x, %f);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1fv)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord1fvARB, (target, v), (F, "glMultiTexCoord1fv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1i)(GLenum target, GLint s)
{
DISPATCH(MultiTexCoord1iARB, (target, s), (F, "glMultiTexCoord1i(0x%x, %d);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1iv)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord1ivARB, (target, v), (F, "glMultiTexCoord1iv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1s)(GLenum target, GLshort s)
{
DISPATCH(MultiTexCoord1sARB, (target, s), (F, "glMultiTexCoord1s(0x%x, %d);\n", target, s));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord1sv)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord1svARB, (target, v), (F, "glMultiTexCoord1sv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2d)(GLenum target, GLdouble s, GLdouble t)
{
DISPATCH(MultiTexCoord2dARB, (target, s, t), (F, "glMultiTexCoord2d(0x%x, %f, %f);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2dv)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord2dvARB, (target, v), (F, "glMultiTexCoord2dv(0x%x, %p /* %g, %g */);\n", target, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2f)(GLenum target, GLfloat s, GLfloat t)
{
DISPATCH(MultiTexCoord2fARB, (target, s, t), (F, "glMultiTexCoord2f(0x%x, %f, %f);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2fv)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord2fvARB, (target, v), (F, "glMultiTexCoord2fv(0x%x, %p /* %g, %g */);\n", target, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2i)(GLenum target, GLint s, GLint t)
{
DISPATCH(MultiTexCoord2iARB, (target, s, t), (F, "glMultiTexCoord2i(0x%x, %d, %d);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2iv)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord2ivARB, (target, v), (F, "glMultiTexCoord2iv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2s)(GLenum target, GLshort s, GLshort t)
{
DISPATCH(MultiTexCoord2sARB, (target, s, t), (F, "glMultiTexCoord2s(0x%x, %d, %d);\n", target, s, t));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord2sv)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord2svARB, (target, v), (F, "glMultiTexCoord2sv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3d)(GLenum target, GLdouble s, GLdouble t, GLdouble r)
{
DISPATCH(MultiTexCoord3dARB, (target, s, t, r), (F, "glMultiTexCoord3d(0x%x, %f, %f, %f);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3dv)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord3dvARB, (target, v), (F, "glMultiTexCoord3dv(0x%x, %p /* %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3f)(GLenum target, GLfloat s, GLfloat t, GLfloat r)
{
DISPATCH(MultiTexCoord3fARB, (target, s, t, r), (F, "glMultiTexCoord3f(0x%x, %f, %f, %f);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3fv)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord3fvARB, (target, v), (F, "glMultiTexCoord3fv(0x%x, %p /* %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3i)(GLenum target, GLint s, GLint t, GLint r)
{
DISPATCH(MultiTexCoord3iARB, (target, s, t, r), (F, "glMultiTexCoord3i(0x%x, %d, %d, %d);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3iv)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord3ivARB, (target, v), (F, "glMultiTexCoord3iv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3s)(GLenum target, GLshort s, GLshort t, GLshort r)
{
DISPATCH(MultiTexCoord3sARB, (target, s, t, r), (F, "glMultiTexCoord3s(0x%x, %d, %d, %d);\n", target, s, t, r));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord3sv)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord3svARB, (target, v), (F, "glMultiTexCoord3sv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4d)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
{
DISPATCH(MultiTexCoord4dARB, (target, s, t, r, q), (F, "glMultiTexCoord4d(0x%x, %f, %f, %f, %f);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4dv)(GLenum target, const GLdouble * v)
{
DISPATCH(MultiTexCoord4dvARB, (target, v), (F, "glMultiTexCoord4dv(0x%x, %p /* %g, %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
DISPATCH(MultiTexCoord4fARB, (target, s, t, r, q), (F, "glMultiTexCoord4f(0x%x, %f, %f, %f, %f);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4fv)(GLenum target, const GLfloat * v)
{
DISPATCH(MultiTexCoord4fvARB, (target, v), (F, "glMultiTexCoord4fv(0x%x, %p /* %g, %g, %g, %g */);\n", target, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4i)(GLenum target, GLint s, GLint t, GLint r, GLint q)
{
DISPATCH(MultiTexCoord4iARB, (target, s, t, r, q), (F, "glMultiTexCoord4i(0x%x, %d, %d, %d, %d);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4iv)(GLenum target, const GLint * v)
{
DISPATCH(MultiTexCoord4ivARB, (target, v), (F, "glMultiTexCoord4iv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4s)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
{
DISPATCH(MultiTexCoord4sARB, (target, s, t, r, q), (F, "glMultiTexCoord4s(0x%x, %d, %d, %d, %d);\n", target, s, t, r, q));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiTexCoord4sv)(GLenum target, const GLshort * v)
{
DISPATCH(MultiTexCoord4svARB, (target, v), (F, "glMultiTexCoord4sv(0x%x, %p);\n", target, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadTransposeMatrixf)(const GLfloat * m)
{
DISPATCH(LoadTransposeMatrixfARB, (m), (F, "glLoadTransposeMatrixf(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadTransposeMatrixd)(const GLdouble * m)
{
DISPATCH(LoadTransposeMatrixdARB, (m), (F, "glLoadTransposeMatrixd(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MultTransposeMatrixf)(const GLfloat * m)
{
DISPATCH(MultTransposeMatrixfARB, (m), (F, "glMultTransposeMatrixf(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(MultTransposeMatrixd)(const GLdouble * m)
{
DISPATCH(MultTransposeMatrixdARB, (m), (F, "glMultTransposeMatrixd(%p);\n", (void *) m));
}
 
KEYWORD1 void KEYWORD2 NAME(SampleCoverage)(GLclampf value, GLboolean invert)
{
DISPATCH(SampleCoverageARB, (value, invert), (F, "glSampleCoverage(%f, %d);\n", value, invert));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage3DARB, (target, level, internalformat, width, height, depth, border, imageSize, data), (F, "glCompressedTexImage3D(0x%x, %d, 0x%x, %d, %d, %d, %d, %d, %p);\n", target, level, internalformat, width, height, depth, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage2DARB, (target, level, internalformat, width, height, border, imageSize, data), (F, "glCompressedTexImage2D(0x%x, %d, 0x%x, %d, %d, %d, %d, %p);\n", target, level, internalformat, width, height, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexImage1DARB, (target, level, internalformat, width, border, imageSize, data), (F, "glCompressedTexImage1D(0x%x, %d, 0x%x, %d, %d, %d, %p);\n", target, level, internalformat, width, border, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage3DARB, (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data), (F, "glCompressedTexSubImage3D(0x%x, %d, %d, %d, %d, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage2DARB, (target, level, xoffset, yoffset, width, height, format, imageSize, data), (F, "glCompressedTexSubImage2D(0x%x, %d, %d, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, yoffset, width, height, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CompressedTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data)
{
DISPATCH(CompressedTexSubImage1DARB, (target, level, xoffset, width, format, imageSize, data), (F, "glCompressedTexSubImage1D(0x%x, %d, %d, %d, 0x%x, %d, %p);\n", target, level, xoffset, width, format, imageSize, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCompressedTexImage)(GLenum target, GLint level, GLvoid * img)
{
DISPATCH(GetCompressedTexImageARB, (target, level, img), (F, "glGetCompressedTexImage(0x%x, %d, %p);\n", target, level, (void *) img));
}
 
/* No dispatch for WeightbvARB() */
/* No dispatch for WeightsvARB() */
/* No dispatch for WeightivARB() */
/* No dispatch for WeightfvARB() */
/* No dispatch for WeightdvARB() */
/* No dispatch for WeightubvARB() */
/* No dispatch for WeightusvARB() */
/* No dispatch for WeightuivARB() */
/* No dispatch for WeightPointerARB() */
/* No dispatch for VertexBlendARB() */
/* No dispatch for CurrentPaletteMatrixARB() */
/* No dispatch for MatrixIndexubvARB() */
/* No dispatch for MatrixIndexusvARB() */
/* No dispatch for MatrixIndexuivARB() */
/* No dispatch for MatrixIndexPointerARB() */
KEYWORD1 void KEYWORD2 NAME(BlendColorEXT)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
DISPATCH(BlendColor, (red, green, blue, alpha), (F, "glBlendColorEXT(%f, %f, %f, %f);\n", red, green, blue, alpha));
}
 
KEYWORD1 void KEYWORD2 NAME(PolygonOffsetEXT)(GLfloat factor, GLfloat bias)
{
DISPATCH(PolygonOffsetEXT, (factor, bias), (F, "glPolygonOffsetEXT(%f, %f);\n", factor, bias));
}
 
KEYWORD1 void KEYWORD2 NAME(TexImage3DEXT)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexImage3D, (target, level, internalformat, width, height, depth, border, format, type, pixels), (F, "glTexImage3DEXT(0x%x, %d, 0x%x, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, internalformat, width, height, depth, border, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage3DEXT)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage3D, (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels), (F, "glTexSubImage3DEXT(0x%x, %d, %d, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTexFilterFuncSGIS)(GLenum target, GLenum filter, GLfloat * weights)
{
DISPATCH(GetTexFilterFuncSGIS, (target, filter, weights), (F, "glGetTexFilterFuncSGIS(0x%x, 0x%x, %p);\n", target, filter, (void *) weights));
}
 
KEYWORD1 void KEYWORD2 NAME(TexFilterFuncSGIS)(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights)
{
DISPATCH(TexFilterFuncSGIS, (target, filter, n, weights), (F, "glTexFilterFuncSGIS(0x%x, 0x%x, %d, %p);\n", target, filter, n, (void *) weights));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage1DEXT)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage1D, (target, level, xoffset, width, format, type, pixels), (F, "glTexSubImage1DEXT(0x%x, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, width, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage2DEXT)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage2D, (target, level, xoffset, yoffset, width, height, format, type, pixels), (F, "glTexSubImage2DEXT(0x%x, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, yoffset, width, height, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexImage1DEXT)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)
{
DISPATCH(CopyTexImage1D, (target, level, internalformat, x, y, width, border), (F, "glCopyTexImage1DEXT(0x%x, %d, 0x%x, %d, %d, %d, %d);\n", target, level, internalformat, x, y, width, border));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexImage2DEXT)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
DISPATCH(CopyTexImage2D, (target, level, internalformat, x, y, width, height, border), (F, "glCopyTexImage2DEXT(0x%x, %d, 0x%x, %d, %d, %d, %d, %d);\n", target, level, internalformat, x, y, width, height, border));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage1DEXT)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyTexSubImage1D, (target, level, xoffset, x, y, width), (F, "glCopyTexSubImage1DEXT(0x%x, %d, %d, %d, %d, %d);\n", target, level, xoffset, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage2DEXT)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyTexSubImage2D, (target, level, xoffset, yoffset, x, y, width, height), (F, "glCopyTexSubImage2DEXT(0x%x, %d, %d, %d, %d, %d, %d, %d);\n", target, level, xoffset, yoffset, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyTexSubImage3DEXT)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyTexSubImage3D, (target, level, xoffset, yoffset, zoffset, x, y, width, height), (F, "glCopyTexSubImage3DEXT(0x%x, %d, %d, %d, %d, %d, %d, %d, %d);\n", target, level, xoffset, yoffset, zoffset, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogramEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)
{
DISPATCH(GetHistogramEXT, (target, reset, format, type, values), (F, "glGetHistogramEXT(0x%x, %d, 0x%x, 0x%x, %p);\n", target, reset, format, type, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogramParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetHistogramParameterfvEXT, (target, pname, params), (F, "glGetHistogramParameterfvEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetHistogramParameterivEXT)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetHistogramParameterivEXT, (target, pname, params), (F, "glGetHistogramParameterivEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmaxEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)
{
DISPATCH(GetMinmaxEXT, (target, reset, format, type, values), (F, "glGetMinmaxEXT(0x%x, %d, 0x%x, 0x%x, %p);\n", target, reset, format, type, (void *) values));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmaxParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetMinmaxParameterfvEXT, (target, pname, params), (F, "glGetMinmaxParameterfvEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetMinmaxParameterivEXT)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetMinmaxParameterivEXT, (target, pname, params), (F, "glGetMinmaxParameterivEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(HistogramEXT)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)
{
DISPATCH(Histogram, (target, width, internalformat, sink), (F, "glHistogramEXT(0x%x, %d, 0x%x, %d);\n", target, width, internalformat, sink));
}
 
KEYWORD1 void KEYWORD2 NAME(MinmaxEXT)(GLenum target, GLenum internalformat, GLboolean sink)
{
DISPATCH(Minmax, (target, internalformat, sink), (F, "glMinmaxEXT(0x%x, 0x%x, %d);\n", target, internalformat, sink));
}
 
KEYWORD1 void KEYWORD2 NAME(ResetHistogramEXT)(GLenum target)
{
DISPATCH(ResetHistogram, (target), (F, "glResetHistogramEXT(0x%x);\n", target));
}
 
KEYWORD1 void KEYWORD2 NAME(ResetMinmaxEXT)(GLenum target)
{
DISPATCH(ResetMinmax, (target), (F, "glResetMinmaxEXT(0x%x);\n", target));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionFilter1DEXT)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image)
{
DISPATCH(ConvolutionFilter1D, (target, internalformat, width, format, type, image), (F, "glConvolutionFilter1DEXT(0x%x, 0x%x, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionFilter2DEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image)
{
DISPATCH(ConvolutionFilter2D, (target, internalformat, width, height, format, type, image), (F, "glConvolutionFilter2DEXT(0x%x, 0x%x, %d, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, height, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameterfEXT)(GLenum target, GLenum pname, GLfloat params)
{
DISPATCH(ConvolutionParameterf, (target, pname, params), (F, "glConvolutionParameterfEXT(0x%x, 0x%x, %f);\n", target, pname, params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameterfvEXT)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(ConvolutionParameterfv, (target, pname, params), (F, "glConvolutionParameterfvEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameteriEXT)(GLenum target, GLenum pname, GLint params)
{
DISPATCH(ConvolutionParameteri, (target, pname, params), (F, "glConvolutionParameteriEXT(0x%x, 0x%x, %d);\n", target, pname, params));
}
 
KEYWORD1 void KEYWORD2 NAME(ConvolutionParameterivEXT)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(ConvolutionParameteriv, (target, pname, params), (F, "glConvolutionParameterivEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyConvolutionFilter1DEXT)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyConvolutionFilter1D, (target, internalformat, x, y, width), (F, "glCopyConvolutionFilter1DEXT(0x%x, 0x%x, %d, %d, %d);\n", target, internalformat, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyConvolutionFilter2DEXT)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)
{
DISPATCH(CopyConvolutionFilter2D, (target, internalformat, x, y, width, height), (F, "glCopyConvolutionFilter2DEXT(0x%x, 0x%x, %d, %d, %d, %d);\n", target, internalformat, x, y, width, height));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * image)
{
DISPATCH(GetConvolutionFilterEXT, (target, format, type, image), (F, "glGetConvolutionFilterEXT(0x%x, 0x%x, 0x%x, %p);\n", target, format, type, (void *) image));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetConvolutionParameterfvEXT, (target, pname, params), (F, "glGetConvolutionParameterfvEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetConvolutionParameterivEXT)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetConvolutionParameterivEXT, (target, pname, params), (F, "glGetConvolutionParameterivEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetSeparableFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span)
{
DISPATCH(GetSeparableFilterEXT, (target, format, type, row, column, span), (F, "glGetSeparableFilterEXT(0x%x, 0x%x, 0x%x, %p, %p, %p);\n", target, format, type, (void *) row, (void *) column, (void *) span));
}
 
KEYWORD1 void KEYWORD2 NAME(SeparableFilter2DEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column)
{
DISPATCH(SeparableFilter2D, (target, internalformat, width, height, format, type, row, column), (F, "glSeparableFilter2DEXT(0x%x, 0x%x, %d, %d, 0x%x, 0x%x, %p, %p);\n", target, internalformat, width, height, format, type, (void *) row, (void *) column));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableSGI)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)
{
DISPATCH(ColorTable, (target, internalformat, width, format, type, table), (F, "glColorTableSGI(0x%x, 0x%x, %d, 0x%x, 0x%x, %p);\n", target, internalformat, width, format, type, (void *) table));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableParameterfvSGI)(GLenum target, GLenum pname, const GLfloat * params)
{
DISPATCH(ColorTableParameterfv, (target, pname, params), (F, "glColorTableParameterfvSGI(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableParameterivSGI)(GLenum target, GLenum pname, const GLint * params)
{
DISPATCH(ColorTableParameteriv, (target, pname, params), (F, "glColorTableParameterivSGI(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyColorTableSGI)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyColorTable, (target, internalformat, x, y, width), (F, "glCopyColorTableSGI(0x%x, 0x%x, %d, %d, %d);\n", target, internalformat, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableSGI)(GLenum target, GLenum format, GLenum type, GLvoid * table)
{
DISPATCH(GetColorTableSGI, (target, format, type, table), (F, "glGetColorTableSGI(0x%x, 0x%x, 0x%x, %p);\n", target, format, type, (void *) table));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameterfvSGI)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetColorTableParameterfvSGI, (target, pname, params), (F, "glGetColorTableParameterfvSGI(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameterivSGI)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetColorTableParameterivSGI, (target, pname, params), (F, "glGetColorTableParameterivSGI(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTexGenSGIX)(GLenum mode)
{
DISPATCH(PixelTexGenSGIX, (mode), (F, "glPixelTexGenSGIX(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTexGenParameteriSGIS)(GLenum pname, GLint param)
{
DISPATCH(PixelTexGenParameteriSGIS, (pname, param), (F, "glPixelTexGenParameteriSGIS(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params)
{
DISPATCH(PixelTexGenParameterivSGIS, (pname, params), (F, "glPixelTexGenParameterivSGIS(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param)
{
DISPATCH(PixelTexGenParameterfSGIS, (pname, param), (F, "glPixelTexGenParameterfSGIS(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params)
{
DISPATCH(PixelTexGenParameterfvSGIS, (pname, params), (F, "glPixelTexGenParameterfvSGIS(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params)
{
DISPATCH(GetPixelTexGenParameterivSGIS, (pname, params), (F, "glGetPixelTexGenParameterivSGIS(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params)
{
DISPATCH(GetPixelTexGenParameterfvSGIS, (pname, params), (F, "glGetPixelTexGenParameterfvSGIS(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(TexImage4DSGIS)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexImage4DSGIS, (target, level, internalformat, width, height, depth, size4d, border, format, type, pixels), (F, "glTexImage4DSGIS(0x%x, %d, 0x%x, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, internalformat, width, height, depth, size4d, border, format, type, (void *) pixels));
}
 
KEYWORD1 void KEYWORD2 NAME(TexSubImage4DSGIS)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels)
{
DISPATCH(TexSubImage4DSGIS, (target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels), (F, "glTexSubImage4DSGIS(0x%x, %d, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x, 0x%x, %p);\n", target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, (void *) pixels));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(AreTexturesResidentEXT)(GLsizei n, const GLuint * textures, GLboolean * residences)
{
RETURN_DISPATCH(AreTexturesResidentEXT, (n, textures, residences), (F, "glAreTexturesResidentEXT(%d, %p, %p);\n", n, (void *) textures, (void *) residences));
}
 
KEYWORD1 void KEYWORD2 NAME(BindTextureEXT)(GLenum target, GLuint texture)
{
DISPATCH(BindTexture, (target, texture), (F, "glBindTextureEXT(0x%x, %d);\n", target, texture));
}
 
KEYWORD1 void KEYWORD2 NAME(DeleteTexturesEXT)(GLsizei n, const GLuint * textures)
{
DISPATCH(DeleteTextures, (n, textures), (F, "glDeleteTexturesEXT(%d, %p);\n", n, (void *) textures));
}
 
KEYWORD1 void KEYWORD2 NAME(GenTexturesEXT)(GLsizei n, GLuint * textures)
{
DISPATCH(GenTexturesEXT, (n, textures), (F, "glGenTexturesEXT(%d, %p);\n", n, (void *) textures));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsTextureEXT)(GLuint texture)
{
RETURN_DISPATCH(IsTextureEXT, (texture), (F, "glIsTextureEXT(%d);\n", texture));
}
 
KEYWORD1 void KEYWORD2 NAME(PrioritizeTexturesEXT)(GLsizei n, const GLuint * textures, const GLclampf * priorities)
{
DISPATCH(PrioritizeTextures, (n, textures, priorities), (F, "glPrioritizeTexturesEXT(%d, %p, %p);\n", n, (void *) textures, (void *) priorities));
}
 
KEYWORD1 void KEYWORD2 NAME(DetailTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points)
{
DISPATCH(DetailTexFuncSGIS, (target, n, points), (F, "glDetailTexFuncSGIS(0x%x, %d, %p);\n", target, n, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(GetDetailTexFuncSGIS)(GLenum target, GLfloat * points)
{
DISPATCH(GetDetailTexFuncSGIS, (target, points), (F, "glGetDetailTexFuncSGIS(0x%x, %p);\n", target, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(SharpenTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points)
{
DISPATCH(SharpenTexFuncSGIS, (target, n, points), (F, "glSharpenTexFuncSGIS(0x%x, %d, %p);\n", target, n, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(GetSharpenTexFuncSGIS)(GLenum target, GLfloat * points)
{
DISPATCH(GetSharpenTexFuncSGIS, (target, points), (F, "glGetSharpenTexFuncSGIS(0x%x, %p);\n", target, (void *) points));
}
 
KEYWORD1 void KEYWORD2 NAME(SampleMaskSGIS)(GLclampf value, GLboolean invert)
{
DISPATCH(SampleMaskSGIS, (value, invert), (F, "glSampleMaskSGIS(%f, %d);\n", value, invert));
}
 
KEYWORD1 void KEYWORD2 NAME(SamplePatternSGIS)(GLenum pattern)
{
DISPATCH(SamplePatternSGIS, (pattern), (F, "glSamplePatternSGIS(0x%x);\n", pattern));
}
 
KEYWORD1 void KEYWORD2 NAME(ArrayElementEXT)(GLint i)
{
DISPATCH(ArrayElement, (i), (F, "glArrayElementEXT(%d);\n", i));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)
{
DISPATCH(ColorPointerEXT, (size, type, stride, count, pointer), (F, "glColorPointerEXT(%d, 0x%x, %d, %d, %p);\n", size, type, stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawArraysEXT)(GLenum mode, GLint first, GLsizei count)
{
DISPATCH(DrawArrays, (mode, first, count), (F, "glDrawArraysEXT(0x%x, %d, %d);\n", mode, first, count));
}
 
KEYWORD1 void KEYWORD2 NAME(EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer)
{
DISPATCH(EdgeFlagPointerEXT, (stride, count, pointer), (F, "glEdgeFlagPointerEXT(%d, %d, %p);\n", stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(GetPointervEXT)(GLenum pname, GLvoid ** params)
{
DISPATCH(GetPointerv, (pname, params), (F, "glGetPointervEXT(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)
{
DISPATCH(IndexPointerEXT, (type, stride, count, pointer), (F, "glIndexPointerEXT(0x%x, %d, %d, %p);\n", type, stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)
{
DISPATCH(NormalPointerEXT, (type, stride, count, pointer), (F, "glNormalPointerEXT(0x%x, %d, %d, %p);\n", type, stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)
{
DISPATCH(TexCoordPointerEXT, (size, type, stride, count, pointer), (F, "glTexCoordPointerEXT(%d, 0x%x, %d, %d, %p);\n", size, type, stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)
{
DISPATCH(VertexPointerEXT, (size, type, stride, count, pointer), (F, "glVertexPointerEXT(%d, 0x%x, %d, %d, %p);\n", size, type, stride, count, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendEquationEXT)(GLenum mode)
{
DISPATCH(BlendEquation, (mode), (F, "glBlendEquationEXT(0x%x);\n", mode));
}
 
KEYWORD1 void KEYWORD2 NAME(SpriteParameterfSGIX)(GLenum pname, GLfloat param)
{
DISPATCH(SpriteParameterfSGIX, (pname, param), (F, "glSpriteParameterfSGIX(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(SpriteParameterfvSGIX)(GLenum pname, const GLfloat * params)
{
DISPATCH(SpriteParameterfvSGIX, (pname, params), (F, "glSpriteParameterfvSGIX(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(SpriteParameteriSGIX)(GLenum pname, GLint param)
{
DISPATCH(SpriteParameteriSGIX, (pname, param), (F, "glSpriteParameteriSGIX(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(SpriteParameterivSGIX)(GLenum pname, const GLint * params)
{
DISPATCH(SpriteParameterivSGIX, (pname, params), (F, "glSpriteParameterivSGIX(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfEXT)(GLenum pname, GLfloat param)
{
DISPATCH(PointParameterfEXT, (pname, param), (F, "glPointParameterfEXT(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfvEXT)(GLenum pname, const GLfloat * params)
{
DISPATCH(PointParameterfvEXT, (pname, params), (F, "glPointParameterfvEXT(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfARB)(GLenum pname, GLfloat param)
{
DISPATCH(PointParameterfEXT, (pname, param), (F, "glPointParameterfARB(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfvARB)(GLenum pname, const GLfloat * params)
{
DISPATCH(PointParameterfvEXT, (pname, params), (F, "glPointParameterfvARB(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfSGIS)(GLenum pname, GLfloat param)
{
DISPATCH(PointParameterfEXT, (pname, param), (F, "glPointParameterfSGIS(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfvSGIS)(GLenum pname, const GLfloat * params)
{
DISPATCH(PointParameterfvEXT, (pname, params), (F, "glPointParameterfvSGIS(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 GLint KEYWORD2 NAME(GetInstrumentsSGIX)(void)
{
RETURN_DISPATCH(GetInstrumentsSGIX, (), (F, "glGetInstrumentsSGIX();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(InstrumentsBufferSGIX)(GLsizei size, GLint * buffer)
{
DISPATCH(InstrumentsBufferSGIX, (size, buffer), (F, "glInstrumentsBufferSGIX(%d, %p);\n", size, (void *) buffer));
}
 
KEYWORD1 GLint KEYWORD2 NAME(PollInstrumentsSGIX)(GLint * marker_p)
{
RETURN_DISPATCH(PollInstrumentsSGIX, (marker_p), (F, "glPollInstrumentsSGIX(%p);\n", (void *) marker_p));
}
 
KEYWORD1 void KEYWORD2 NAME(ReadInstrumentsSGIX)(GLint marker)
{
DISPATCH(ReadInstrumentsSGIX, (marker), (F, "glReadInstrumentsSGIX(%d);\n", marker));
}
 
KEYWORD1 void KEYWORD2 NAME(StartInstrumentsSGIX)(void)
{
DISPATCH(StartInstrumentsSGIX, (), (F, "glStartInstrumentsSGIX();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(StopInstrumentsSGIX)(GLint marker)
{
DISPATCH(StopInstrumentsSGIX, (marker), (F, "glStopInstrumentsSGIX(%d);\n", marker));
}
 
KEYWORD1 void KEYWORD2 NAME(FrameZoomSGIX)(GLint factor)
{
DISPATCH(FrameZoomSGIX, (factor), (F, "glFrameZoomSGIX(%d);\n", factor));
}
 
KEYWORD1 void KEYWORD2 NAME(TagSampleBufferSGIX)(void)
{
DISPATCH(TagSampleBufferSGIX, (), (F, "glTagSampleBufferSGIX();\n"));
}
 
/* No dispatch for DeformationMap3dSGIX() */
/* No dispatch for DeformationMap3fSGIX() */
/* No dispatch for DeformSGIX() */
/* No dispatch for LoadIdentityDeformationMapSGIX() */
KEYWORD1 void KEYWORD2 NAME(ReferencePlaneSGIX)(const GLdouble * equation)
{
DISPATCH(ReferencePlaneSGIX, (equation), (F, "glReferencePlaneSGIX(%p);\n", (void *) equation));
}
 
KEYWORD1 void KEYWORD2 NAME(FlushRasterSGIX)(void)
{
DISPATCH(FlushRasterSGIX, (), (F, "glFlushRasterSGIX();\n"));
}
 
/* No dispatch for FogFuncSGIS() */
/* No dispatch for GetFogFuncSGIS() */
/* No dispatch for ImageTransformParameteriHP() */
/* No dispatch for ImageTransformParameterfHP() */
/* No dispatch for ImageTransformParameterivHP() */
/* No dispatch for ImageTransformParameterfvHP() */
/* No dispatch for GetImageTransformParameterivHP() */
/* No dispatch for GetImageTransformParameterfvHP() */
KEYWORD1 void KEYWORD2 NAME(ColorSubTableEXT)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data)
{
DISPATCH(ColorSubTable, (target, start, count, format, type, data), (F, "glColorSubTableEXT(0x%x, %d, %d, 0x%x, 0x%x, %p);\n", target, start, count, format, type, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(CopyColorSubTableEXT)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)
{
DISPATCH(CopyColorSubTable, (target, start, x, y, width), (F, "glCopyColorSubTableEXT(0x%x, %d, %d, %d, %d);\n", target, start, x, y, width));
}
 
KEYWORD1 void KEYWORD2 NAME(HintPGI)(GLenum target, GLint mode)
{
DISPATCH(HintPGI, (target, mode), (F, "glHintPGI(0x%x, %d);\n", target, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(ColorTableEXT)(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)
{
DISPATCH(ColorTable, (target, internalFormat, width, format, type, table), (F, "glColorTableEXT(0x%x, 0x%x, %d, 0x%x, 0x%x, %p);\n", target, internalFormat, width, format, type, (void *) table));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableEXT)(GLenum target, GLenum format, GLenum type, GLvoid * data)
{
DISPATCH(GetColorTableEXT, (target, format, type, data), (F, "glGetColorTableEXT(0x%x, 0x%x, 0x%x, %p);\n", target, format, type, (void *) data));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameterivEXT)(GLenum target, GLenum pname, GLint * params)
{
DISPATCH(GetColorTableParameterivEXT, (target, pname, params), (F, "glGetColorTableParameterivEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetColorTableParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params)
{
DISPATCH(GetColorTableParameterfvEXT, (target, pname, params), (F, "glGetColorTableParameterfvEXT(0x%x, 0x%x, %p);\n", target, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetListParameterfvSGIX)(GLuint list, GLenum pname, GLfloat * params)
{
DISPATCH(GetListParameterfvSGIX, (list, pname, params), (F, "glGetListParameterfvSGIX(%d, 0x%x, %p);\n", list, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetListParameterivSGIX)(GLuint list, GLenum pname, GLint * params)
{
DISPATCH(GetListParameterivSGIX, (list, pname, params), (F, "glGetListParameterivSGIX(%d, 0x%x, %p);\n", list, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ListParameterfSGIX)(GLuint list, GLenum pname, GLfloat param)
{
DISPATCH(ListParameterfSGIX, (list, pname, param), (F, "glListParameterfSGIX(%d, 0x%x, %f);\n", list, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(ListParameterfvSGIX)(GLuint list, GLenum pname, const GLfloat * params)
{
DISPATCH(ListParameterfvSGIX, (list, pname, params), (F, "glListParameterfvSGIX(%d, 0x%x, %p);\n", list, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ListParameteriSGIX)(GLuint list, GLenum pname, GLint param)
{
DISPATCH(ListParameteriSGIX, (list, pname, param), (F, "glListParameteriSGIX(%d, 0x%x, %d);\n", list, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(ListParameterivSGIX)(GLuint list, GLenum pname, const GLint * params)
{
DISPATCH(ListParameterivSGIX, (list, pname, params), (F, "glListParameterivSGIX(%d, 0x%x, %p);\n", list, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(IndexMaterialEXT)(GLenum face, GLenum mode)
{
DISPATCH(IndexMaterialEXT, (face, mode), (F, "glIndexMaterialEXT(0x%x, 0x%x);\n", face, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(IndexFuncEXT)(GLenum func, GLclampf ref)
{
DISPATCH(IndexFuncEXT, (func, ref), (F, "glIndexFuncEXT(0x%x, %f);\n", func, ref));
}
 
KEYWORD1 void KEYWORD2 NAME(LockArraysEXT)(GLint first, GLsizei count)
{
DISPATCH(LockArraysEXT, (first, count), (F, "glLockArraysEXT(%d, %d);\n", first, count));
}
 
KEYWORD1 void KEYWORD2 NAME(UnlockArraysEXT)(void)
{
DISPATCH(UnlockArraysEXT, (), (F, "glUnlockArraysEXT();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(CullParameterdvEXT)(GLenum pname, GLdouble * params)
{
DISPATCH(CullParameterdvEXT, (pname, params), (F, "glCullParameterdvEXT(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CullParameterfvEXT)(GLenum pname, GLfloat * params)
{
DISPATCH(CullParameterfvEXT, (pname, params), (F, "glCullParameterfvEXT(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentColorMaterialSGIX)(GLenum face, GLenum mode)
{
DISPATCH(FragmentColorMaterialSGIX, (face, mode), (F, "glFragmentColorMaterialSGIX(0x%x, 0x%x);\n", face, mode));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightfSGIX)(GLenum light, GLenum pname, GLfloat param)
{
DISPATCH(FragmentLightfSGIX, (light, pname, param), (F, "glFragmentLightfSGIX(0x%x, 0x%x, %f);\n", light, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightfvSGIX)(GLenum light, GLenum pname, const GLfloat * params)
{
DISPATCH(FragmentLightfvSGIX, (light, pname, params), (F, "glFragmentLightfvSGIX(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightiSGIX)(GLenum light, GLenum pname, GLint param)
{
DISPATCH(FragmentLightiSGIX, (light, pname, param), (F, "glFragmentLightiSGIX(0x%x, 0x%x, %d);\n", light, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightivSGIX)(GLenum light, GLenum pname, const GLint * params)
{
DISPATCH(FragmentLightivSGIX, (light, pname, params), (F, "glFragmentLightivSGIX(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightModelfSGIX)(GLenum pname, GLfloat param)
{
DISPATCH(FragmentLightModelfSGIX, (pname, param), (F, "glFragmentLightModelfSGIX(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightModelfvSGIX)(GLenum pname, const GLfloat * params)
{
DISPATCH(FragmentLightModelfvSGIX, (pname, params), (F, "glFragmentLightModelfvSGIX(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightModeliSGIX)(GLenum pname, GLint param)
{
DISPATCH(FragmentLightModeliSGIX, (pname, param), (F, "glFragmentLightModeliSGIX(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentLightModelivSGIX)(GLenum pname, const GLint * params)
{
DISPATCH(FragmentLightModelivSGIX, (pname, params), (F, "glFragmentLightModelivSGIX(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentMaterialfSGIX)(GLenum face, GLenum pname, GLfloat param)
{
DISPATCH(FragmentMaterialfSGIX, (face, pname, param), (F, "glFragmentMaterialfSGIX(0x%x, 0x%x, %f);\n", face, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentMaterialfvSGIX)(GLenum face, GLenum pname, const GLfloat * params)
{
DISPATCH(FragmentMaterialfvSGIX, (face, pname, params), (F, "glFragmentMaterialfvSGIX(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentMaterialiSGIX)(GLenum face, GLenum pname, GLint param)
{
DISPATCH(FragmentMaterialiSGIX, (face, pname, param), (F, "glFragmentMaterialiSGIX(0x%x, 0x%x, %d);\n", face, pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(FragmentMaterialivSGIX)(GLenum face, GLenum pname, const GLint * params)
{
DISPATCH(FragmentMaterialivSGIX, (face, pname, params), (F, "glFragmentMaterialivSGIX(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFragmentLightfvSGIX)(GLenum light, GLenum pname, GLfloat * params)
{
DISPATCH(GetFragmentLightfvSGIX, (light, pname, params), (F, "glGetFragmentLightfvSGIX(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFragmentLightivSGIX)(GLenum light, GLenum pname, GLint * params)
{
DISPATCH(GetFragmentLightivSGIX, (light, pname, params), (F, "glGetFragmentLightivSGIX(0x%x, 0x%x, %p);\n", light, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFragmentMaterialfvSGIX)(GLenum face, GLenum pname, GLfloat * params)
{
DISPATCH(GetFragmentMaterialfvSGIX, (face, pname, params), (F, "glGetFragmentMaterialfvSGIX(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFragmentMaterialivSGIX)(GLenum face, GLenum pname, GLint * params)
{
DISPATCH(GetFragmentMaterialivSGIX, (face, pname, params), (F, "glGetFragmentMaterialivSGIX(0x%x, 0x%x, %p);\n", face, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(LightEnviSGIX)(GLenum pname, GLint param)
{
DISPATCH(LightEnviSGIX, (pname, param), (F, "glLightEnviSGIX(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(DrawRangeElementsEXT)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)
{
DISPATCH(DrawRangeElements, (mode, start, end, count, type, indices), (F, "glDrawRangeElementsEXT(0x%x, %d, %d, %d, 0x%x, %p);\n", mode, start, end, count, type, (void *) indices));
}
 
/* No dispatch for ApplyTextureEXT() */
/* No dispatch for TextureLightEXT() */
/* No dispatch for TextureMaterialEXT() */
/* No dispatch for AsyncMarkerSGIX() */
/* No dispatch for FinishAsyncSGIX() */
/* No dispatch for PollAsyncSGIX() */
/* No dispatch for GenAsyncMarkersSGIX() */
/* No dispatch for DeleteAsyncMarkersSGIX() */
/* No dispatch for IsAsyncMarkerSGIX() */
/* No dispatch for VertexPointervINTEL() */
/* No dispatch for NormalPointervINTEL() */
/* No dispatch for ColorPointervINTEL() */
/* No dispatch for TexCoordPointervINTEL() */
/* No dispatch for PixelTransformParameteriEXT() */
/* No dispatch for PixelTransformParameterfEXT() */
/* No dispatch for PixelTransformParameterivEXT() */
/* No dispatch for PixelTransformParameterfvEXT() */
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue)
{
DISPATCH(SecondaryColor3bEXT, (red, green, blue), (F, "glSecondaryColor3bEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3bvEXT)(const GLbyte * v)
{
DISPATCH(SecondaryColor3bvEXT, (v), (F, "glSecondaryColor3bvEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue)
{
DISPATCH(SecondaryColor3dEXT, (red, green, blue), (F, "glSecondaryColor3dEXT(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3dvEXT)(const GLdouble * v)
{
DISPATCH(SecondaryColor3dvEXT, (v), (F, "glSecondaryColor3dvEXT(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue)
{
DISPATCH(SecondaryColor3fEXT, (red, green, blue), (F, "glSecondaryColor3fEXT(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3fvEXT)(const GLfloat * v)
{
DISPATCH(SecondaryColor3fvEXT, (v), (F, "glSecondaryColor3fvEXT(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3iEXT)(GLint red, GLint green, GLint blue)
{
DISPATCH(SecondaryColor3iEXT, (red, green, blue), (F, "glSecondaryColor3iEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ivEXT)(const GLint * v)
{
DISPATCH(SecondaryColor3ivEXT, (v), (F, "glSecondaryColor3ivEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue)
{
DISPATCH(SecondaryColor3sEXT, (red, green, blue), (F, "glSecondaryColor3sEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3svEXT)(const GLshort * v)
{
DISPATCH(SecondaryColor3svEXT, (v), (F, "glSecondaryColor3svEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue)
{
DISPATCH(SecondaryColor3ubEXT, (red, green, blue), (F, "glSecondaryColor3ubEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ubvEXT)(const GLubyte * v)
{
DISPATCH(SecondaryColor3ubvEXT, (v), (F, "glSecondaryColor3ubvEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue)
{
DISPATCH(SecondaryColor3uiEXT, (red, green, blue), (F, "glSecondaryColor3uiEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3uivEXT)(const GLuint * v)
{
DISPATCH(SecondaryColor3uivEXT, (v), (F, "glSecondaryColor3uivEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue)
{
DISPATCH(SecondaryColor3usEXT, (red, green, blue), (F, "glSecondaryColor3usEXT(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3usvEXT)(const GLushort * v)
{
DISPATCH(SecondaryColor3usvEXT, (v), (F, "glSecondaryColor3usvEXT(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(SecondaryColorPointerEXT, (size, type, stride, pointer), (F, "glSecondaryColorPointerEXT(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
/* No dispatch for TextureNormalEXT() */
KEYWORD1 void KEYWORD2 NAME(MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount)
{
DISPATCH(MultiDrawArraysEXT, (mode, first, count, primcount), (F, "glMultiDrawArraysEXT(0x%x, %p, %p, %d);\n", mode, (void *) first, (void *) count, primcount));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount)
{
DISPATCH(MultiDrawElementsEXT, (mode, count, type, indices, primcount), (F, "glMultiDrawElementsEXT(0x%x, %p, 0x%x, %p, %d);\n", mode, (void *) count, type, (void *) indices, primcount));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordfEXT)(GLfloat coord)
{
DISPATCH(FogCoordfEXT, (coord), (F, "glFogCoordfEXT(%f);\n", coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordfvEXT)(const GLfloat * coord)
{
DISPATCH(FogCoordfvEXT, (coord), (F, "glFogCoordfvEXT(%p);\n", (void *) coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoorddEXT)(GLdouble coord)
{
DISPATCH(FogCoorddEXT, (coord), (F, "glFogCoorddEXT(%f);\n", coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoorddvEXT)(const GLdouble * coord)
{
DISPATCH(FogCoorddvEXT, (coord), (F, "glFogCoorddvEXT(%p);\n", (void *) coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(FogCoordPointerEXT, (type, stride, pointer), (F, "glFogCoordPointerEXT(0x%x, %d, %p);\n", type, stride, (void *) pointer));
}
 
/* No dispatch for Tangent3bEXT() */
/* No dispatch for Tangent3bvEXT() */
/* No dispatch for Tangent3dEXT() */
/* No dispatch for Tangent3dvEXT() */
/* No dispatch for Tangent3fEXT() */
/* No dispatch for Tangent3fvEXT() */
/* No dispatch for Tangent3iEXT() */
/* No dispatch for Tangent3ivEXT() */
/* No dispatch for Tangent3sEXT() */
/* No dispatch for Tangent3svEXT() */
/* No dispatch for Binormal3bEXT() */
/* No dispatch for Binormal3bvEXT() */
/* No dispatch for Binormal3dEXT() */
/* No dispatch for Binormal3dvEXT() */
/* No dispatch for Binormal3fEXT() */
/* No dispatch for Binormal3fvEXT() */
/* No dispatch for Binormal3iEXT() */
/* No dispatch for Binormal3ivEXT() */
/* No dispatch for Binormal3sEXT() */
/* No dispatch for Binormal3svEXT() */
/* No dispatch for TangentPointerEXT() */
/* No dispatch for BinormalPointerEXT() */
/* No dispatch for FinishTextureSUNX() */
/* No dispatch for GlobalAlphaFactorbSUN() */
/* No dispatch for GlobalAlphaFactorsSUN() */
/* No dispatch for GlobalAlphaFactoriSUN() */
/* No dispatch for GlobalAlphaFactorfSUN() */
/* No dispatch for GlobalAlphaFactordSUN() */
/* No dispatch for GlobalAlphaFactorubSUN() */
/* No dispatch for GlobalAlphaFactorusSUN() */
/* No dispatch for GlobalAlphaFactoruiSUN() */
/* No dispatch for ReplacementCodeuiSUN() */
/* No dispatch for ReplacementCodeusSUN() */
/* No dispatch for ReplacementCodeubSUN() */
/* No dispatch for ReplacementCodeuivSUN() */
/* No dispatch for ReplacementCodeusvSUN() */
/* No dispatch for ReplacementCodeubvSUN() */
/* No dispatch for ReplacementCodePointerSUN() */
/* No dispatch for Color4ubVertex2fSUN() */
/* No dispatch for Color4ubVertex2fvSUN() */
/* No dispatch for Color4ubVertex3fSUN() */
/* No dispatch for Color4ubVertex3fvSUN() */
/* No dispatch for Color3fVertex3fSUN() */
/* No dispatch for Color3fVertex3fvSUN() */
/* No dispatch for Normal3fVertex3fSUN() */
/* No dispatch for Normal3fVertex3fvSUN() */
/* No dispatch for Color4fNormal3fVertex3fSUN() */
/* No dispatch for Color4fNormal3fVertex3fvSUN() */
/* No dispatch for TexCoord2fVertex3fSUN() */
/* No dispatch for TexCoord2fVertex3fvSUN() */
/* No dispatch for TexCoord4fVertex4fSUN() */
/* No dispatch for TexCoord4fVertex4fvSUN() */
/* No dispatch for TexCoord2fColor4ubVertex3fSUN() */
/* No dispatch for TexCoord2fColor4ubVertex3fvSUN() */
/* No dispatch for TexCoord2fColor3fVertex3fSUN() */
/* No dispatch for TexCoord2fColor3fVertex3fvSUN() */
/* No dispatch for TexCoord2fNormal3fVertex3fSUN() */
/* No dispatch for TexCoord2fNormal3fVertex3fvSUN() */
/* No dispatch for TexCoord2fColor4fNormal3fVertex3fSUN() */
/* No dispatch for TexCoord2fColor4fNormal3fVertex3fvSUN() */
/* No dispatch for TexCoord4fColor4fNormal3fVertex4fSUN() */
/* No dispatch for TexCoord4fColor4fNormal3fVertex4fvSUN() */
/* No dispatch for ReplacementCodeuiVertex3fSUN() */
/* No dispatch for ReplacementCodeuiVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiColor4ubVertex3fSUN() */
/* No dispatch for ReplacementCodeuiColor4ubVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiColor3fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiColor3fVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiNormal3fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiNormal3fVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiColor4fNormal3fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiColor4fNormal3fVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN() */
/* No dispatch for ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN() */
KEYWORD1 void KEYWORD2 NAME(BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
{
DISPATCH(BlendFuncSeparateEXT, (sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha), (F, "glBlendFuncSeparateEXT(0x%x, 0x%x, 0x%x, 0x%x);\n", sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendFuncSeparateINGR)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
{
DISPATCH(BlendFuncSeparateEXT, (sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha), (F, "glBlendFuncSeparateINGR(0x%x, 0x%x, 0x%x, 0x%x);\n", sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexWeightfEXT)(GLfloat weight)
{
DISPATCH(VertexWeightfEXT, (weight), (F, "glVertexWeightfEXT(%f);\n", weight));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexWeightfvEXT)(const GLfloat * weight)
{
DISPATCH(VertexWeightfvEXT, (weight), (F, "glVertexWeightfvEXT(%p);\n", (void *) weight));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexWeightPointerEXT)(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(VertexWeightPointerEXT, (size, type, stride, pointer), (F, "glVertexWeightPointerEXT(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(FlushVertexArrayRangeNV)(void)
{
DISPATCH(FlushVertexArrayRangeNV, (), (F, "glFlushVertexArrayRangeNV();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer)
{
DISPATCH(VertexArrayRangeNV, (length, pointer), (F, "glVertexArrayRangeNV(%d, %p);\n", length, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerParameterfvNV)(GLenum pname, const GLfloat * params)
{
DISPATCH(CombinerParameterfvNV, (pname, params), (F, "glCombinerParameterfvNV(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerParameterfNV)(GLenum pname, GLfloat param)
{
DISPATCH(CombinerParameterfNV, (pname, param), (F, "glCombinerParameterfNV(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerParameterivNV)(GLenum pname, const GLint * params)
{
DISPATCH(CombinerParameterivNV, (pname, params), (F, "glCombinerParameterivNV(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerParameteriNV)(GLenum pname, GLint param)
{
DISPATCH(CombinerParameteriNV, (pname, param), (F, "glCombinerParameteriNV(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)
{
DISPATCH(CombinerInputNV, (stage, portion, variable, input, mapping, componentUsage), (F, "glCombinerInputNV(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x);\n", stage, portion, variable, input, mapping, componentUsage));
}
 
KEYWORD1 void KEYWORD2 NAME(CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum)
{
DISPATCH(CombinerOutputNV, (stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum), (F, "glCombinerOutputNV(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, %d, %d, %d);\n", stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum));
}
 
KEYWORD1 void KEYWORD2 NAME(FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)
{
DISPATCH(FinalCombinerInputNV, (variable, input, mapping, componentUsage), (F, "glFinalCombinerInputNV(0x%x, 0x%x, 0x%x, 0x%x);\n", variable, input, mapping, componentUsage));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params)
{
DISPATCH(GetCombinerInputParameterfvNV, (stage, portion, variable, pname, params), (F, "glGetCombinerInputParameterfvNV(0x%x, 0x%x, 0x%x, 0x%x, %p);\n", stage, portion, variable, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params)
{
DISPATCH(GetCombinerInputParameterivNV, (stage, portion, variable, pname, params), (F, "glGetCombinerInputParameterivNV(0x%x, 0x%x, 0x%x, 0x%x, %p);\n", stage, portion, variable, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params)
{
DISPATCH(GetCombinerOutputParameterfvNV, (stage, portion, pname, params), (F, "glGetCombinerOutputParameterfvNV(0x%x, 0x%x, 0x%x, %p);\n", stage, portion, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params)
{
DISPATCH(GetCombinerOutputParameterivNV, (stage, portion, pname, params), (F, "glGetCombinerOutputParameterivNV(0x%x, 0x%x, 0x%x, %p);\n", stage, portion, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params)
{
DISPATCH(GetFinalCombinerInputParameterfvNV, (variable, pname, params), (F, "glGetFinalCombinerInputParameterfvNV(0x%x, 0x%x, %p);\n", variable, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params)
{
DISPATCH(GetFinalCombinerInputParameterivNV, (variable, pname, params), (F, "glGetFinalCombinerInputParameterivNV(0x%x, 0x%x, %p);\n", variable, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(ResizeBuffersMESA)(void)
{
DISPATCH(ResizeBuffersMESA, (), (F, "glResizeBuffersMESA();\n"));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2dMESA)(GLdouble x, GLdouble y)
{
DISPATCH(WindowPos2dMESA, (x, y), (F, "glWindowPos2dMESA(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2dvMESA)(const GLdouble * v)
{
DISPATCH(WindowPos2dvMESA, (v), (F, "glWindowPos2dvMESA(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2fMESA)(GLfloat x, GLfloat y)
{
DISPATCH(WindowPos2fMESA, (x, y), (F, "glWindowPos2fMESA(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2fvMESA)(const GLfloat * v)
{
DISPATCH(WindowPos2fvMESA, (v), (F, "glWindowPos2fvMESA(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2iMESA)(GLint x, GLint y)
{
DISPATCH(WindowPos2iMESA, (x, y), (F, "glWindowPos2iMESA(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2ivMESA)(const GLint * v)
{
DISPATCH(WindowPos2ivMESA, (v), (F, "glWindowPos2ivMESA(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2sMESA)(GLshort x, GLshort y)
{
DISPATCH(WindowPos2sMESA, (x, y), (F, "glWindowPos2sMESA(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2svMESA)(const GLshort * v)
{
DISPATCH(WindowPos2svMESA, (v), (F, "glWindowPos2svMESA(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(WindowPos3dMESA, (x, y, z), (F, "glWindowPos3dMESA(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3dvMESA)(const GLdouble * v)
{
DISPATCH(WindowPos3dvMESA, (v), (F, "glWindowPos3dvMESA(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(WindowPos3fMESA, (x, y, z), (F, "glWindowPos3fMESA(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3fvMESA)(const GLfloat * v)
{
DISPATCH(WindowPos3fvMESA, (v), (F, "glWindowPos3fvMESA(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3iMESA)(GLint x, GLint y, GLint z)
{
DISPATCH(WindowPos3iMESA, (x, y, z), (F, "glWindowPos3iMESA(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3ivMESA)(const GLint * v)
{
DISPATCH(WindowPos3ivMESA, (v), (F, "glWindowPos3ivMESA(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3sMESA)(GLshort x, GLshort y, GLshort z)
{
DISPATCH(WindowPos3sMESA, (x, y, z), (F, "glWindowPos3sMESA(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3svMESA)(const GLshort * v)
{
DISPATCH(WindowPos3svMESA, (v), (F, "glWindowPos3svMESA(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
DISPATCH(WindowPos4dMESA, (x, y, z, w), (F, "glWindowPos4dMESA(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4dvMESA)(const GLdouble * v)
{
DISPATCH(WindowPos4dvMESA, (v), (F, "glWindowPos4dvMESA(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
DISPATCH(WindowPos4fMESA, (x, y, z, w), (F, "glWindowPos4fMESA(%f, %f, %f, %f);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4fvMESA)(const GLfloat * v)
{
DISPATCH(WindowPos4fvMESA, (v), (F, "glWindowPos4fvMESA(%p /* %g, %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w)
{
DISPATCH(WindowPos4iMESA, (x, y, z, w), (F, "glWindowPos4iMESA(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4ivMESA)(const GLint * v)
{
DISPATCH(WindowPos4ivMESA, (v), (F, "glWindowPos4ivMESA(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w)
{
DISPATCH(WindowPos4sMESA, (x, y, z, w), (F, "glWindowPos4sMESA(%d, %d, %d, %d);\n", x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos4svMESA)(const GLshort * v)
{
DISPATCH(WindowPos4svMESA, (v), (F, "glWindowPos4svMESA(%p);\n", (void *) v));
}
 
/* No dispatch for MultiModeDrawArraysIBM() */
/* No dispatch for MultiModeDrawElementsIBM() */
/* No dispatch for ColorPointerListIBM() */
/* No dispatch for SecondaryColorPointerListIBM() */
/* No dispatch for EdgeFlagPointerListIBM() */
/* No dispatch for FogCoordPointerListIBM() */
/* No dispatch for IndexPointerListIBM() */
/* No dispatch for NormalPointerListIBM() */
/* No dispatch for TexCoordPointerListIBM() */
/* No dispatch for VertexPointerListIBM() */
KEYWORD1 void KEYWORD2 NAME(TbufferMask3DFX)(GLuint mask)
{
DISPATCH(TbufferMask3DFX, (mask), (F, "glTbufferMask3DFX(%d);\n", mask));
}
 
KEYWORD1 void KEYWORD2 NAME(SampleMaskEXT)(GLclampf value, GLboolean invert)
{
DISPATCH(SampleMaskSGIS, (value, invert), (F, "glSampleMaskEXT(%f, %d);\n", value, invert));
}
 
KEYWORD1 void KEYWORD2 NAME(SamplePatternEXT)(GLenum pattern)
{
DISPATCH(SamplePatternSGIS, (pattern), (F, "glSamplePatternEXT(0x%x);\n", pattern));
}
 
/* No dispatch for TextureColorMaskSGIS() */
/* No dispatch for IglooInterfaceSGIX() */
KEYWORD1 void KEYWORD2 NAME(DeleteFencesNV)(GLsizei n, const GLuint * fences)
{
DISPATCH(DeleteFencesNV, (n, fences), (F, "glDeleteFencesNV(%d, %p);\n", n, (void *) fences));
}
 
KEYWORD1 void KEYWORD2 NAME(GenFencesNV)(GLsizei n, GLuint * fences)
{
DISPATCH(GenFencesNV, (n, fences), (F, "glGenFencesNV(%d, %p);\n", n, (void *) fences));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsFenceNV)(GLuint fence)
{
RETURN_DISPATCH(IsFenceNV, (fence), (F, "glIsFenceNV(%d);\n", fence));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(TestFenceNV)(GLuint fence)
{
RETURN_DISPATCH(TestFenceNV, (fence), (F, "glTestFenceNV(%d);\n", fence));
}
 
KEYWORD1 void KEYWORD2 NAME(GetFenceivNV)(GLuint fence, GLenum pname, GLint * params)
{
DISPATCH(GetFenceivNV, (fence, pname, params), (F, "glGetFenceivNV(%d, 0x%x, %p);\n", fence, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(FinishFenceNV)(GLuint fence)
{
DISPATCH(FinishFenceNV, (fence), (F, "glFinishFenceNV(%d);\n", fence));
}
 
KEYWORD1 void KEYWORD2 NAME(SetFenceNV)(GLuint fence, GLenum condition)
{
DISPATCH(SetFenceNV, (fence, condition), (F, "glSetFenceNV(%d, 0x%x);\n", fence, condition));
}
 
/* No dispatch for MapControlPointsNV() */
/* No dispatch for MapParameterivNV() */
/* No dispatch for MapParameterfvNV() */
/* No dispatch for GetMapControlPointsNV() */
/* No dispatch for GetMapParameterivNV() */
/* No dispatch for GetMapParameterfvNV() */
/* No dispatch for GetMapAttribParameterivNV() */
/* No dispatch for GetMapAttribParameterfvNV() */
/* No dispatch for EvalMapsNV() */
/* No dispatch for CombinerStageParameterfvNV() */
/* No dispatch for GetCombinerStageParameterfvNV() */
KEYWORD1 void KEYWORD2 NAME(WindowPos2dARB)(GLdouble x, GLdouble y)
{
DISPATCH(WindowPos2dMESA, (x, y), (F, "glWindowPos2dARB(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2fARB)(GLfloat x, GLfloat y)
{
DISPATCH(WindowPos2fMESA, (x, y), (F, "glWindowPos2fARB(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2iARB)(GLint x, GLint y)
{
DISPATCH(WindowPos2iMESA, (x, y), (F, "glWindowPos2iARB(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2sARB)(GLshort x, GLshort y)
{
DISPATCH(WindowPos2sMESA, (x, y), (F, "glWindowPos2sARB(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2dvARB)(const GLdouble * p)
{
DISPATCH(WindowPos2dvMESA, (p), (F, "glWindowPos2dvARB(%p /* %g, %g */);\n", (void *) p, p[0], p[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2fvARB)(const GLfloat * p)
{
DISPATCH(WindowPos2fvMESA, (p), (F, "glWindowPos2fvARB(%p /* %g, %g */);\n", (void *) p, p[0], p[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2ivARB)(const GLint * p)
{
DISPATCH(WindowPos2ivMESA, (p), (F, "glWindowPos2ivARB(%p);\n", (void *) p));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2svARB)(const GLshort * p)
{
DISPATCH(WindowPos2svMESA, (p), (F, "glWindowPos2svARB(%p);\n", (void *) p));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3dARB)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(WindowPos3dMESA, (x, y, z), (F, "glWindowPos3dARB(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3fARB)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(WindowPos3fMESA, (x, y, z), (F, "glWindowPos3fARB(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3iARB)(GLint x, GLint y, GLint z)
{
DISPATCH(WindowPos3iMESA, (x, y, z), (F, "glWindowPos3iARB(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3sARB)(GLshort x, GLshort y, GLshort z)
{
DISPATCH(WindowPos3sMESA, (x, y, z), (F, "glWindowPos3sARB(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3dvARB)(const GLdouble * p)
{
DISPATCH(WindowPos3dvMESA, (p), (F, "glWindowPos3dvARB(%p /* %g, %g, %g */);\n", (void *) p, p[0], p[1], p[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3fvARB)(const GLfloat * p)
{
DISPATCH(WindowPos3fvMESA, (p), (F, "glWindowPos3fvARB(%p /* %g, %g, %g */);\n", (void *) p, p[0], p[1], p[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3ivARB)(const GLint * p)
{
DISPATCH(WindowPos3ivMESA, (p), (F, "glWindowPos3ivARB(%p);\n", (void *) p));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3svARB)(const GLshort * p)
{
DISPATCH(WindowPos3svMESA, (p), (F, "glWindowPos3svARB(%p);\n", (void *) p));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences)
{
RETURN_DISPATCH(AreProgramsResidentNV, (n, ids, residences), (F, "glAreProgramsResidentNV(%d, %p, %p);\n", n, (void *) ids, (void *) residences));
}
 
KEYWORD1 void KEYWORD2 NAME(BindProgramNV)(GLenum target, GLuint id)
{
DISPATCH(BindProgramNV, (target, id), (F, "glBindProgramNV(0x%x, %d);\n", target, id));
}
 
KEYWORD1 void KEYWORD2 NAME(DeleteProgramsNV)(GLsizei n, const GLuint * ids)
{
DISPATCH(DeleteProgramsNV, (n, ids), (F, "glDeleteProgramsNV(%d, %p);\n", n, (void *) ids));
}
 
KEYWORD1 void KEYWORD2 NAME(ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params)
{
DISPATCH(ExecuteProgramNV, (target, id, params), (F, "glExecuteProgramNV(0x%x, %d, %p);\n", target, id, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GenProgramsNV)(GLsizei n, GLuint * ids)
{
DISPATCH(GenProgramsNV, (n, ids), (F, "glGenProgramsNV(%d, %p);\n", n, (void *) ids));
}
 
KEYWORD1 void KEYWORD2 NAME(GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params)
{
DISPATCH(GetProgramParameterdvNV, (target, index, pname, params), (F, "glGetProgramParameterdvNV(0x%x, %d, 0x%x, %p);\n", target, index, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params)
{
DISPATCH(GetProgramParameterfvNV, (target, index, pname, params), (F, "glGetProgramParameterfvNV(0x%x, %d, 0x%x, %p);\n", target, index, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetProgramivNV)(GLuint id, GLenum pname, GLint * params)
{
DISPATCH(GetProgramivNV, (id, pname, params), (F, "glGetProgramivNV(%d, 0x%x, %p);\n", id, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program)
{
DISPATCH(GetProgramStringNV, (id, pname, program), (F, "glGetProgramStringNV(%d, 0x%x, %p);\n", id, pname, (void *) program));
}
 
KEYWORD1 void KEYWORD2 NAME(GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params)
{
DISPATCH(GetTrackMatrixivNV, (target, address, pname, params), (F, "glGetTrackMatrixivNV(0x%x, %d, 0x%x, %p);\n", target, address, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params)
{
DISPATCH(GetVertexAttribdvNV, (index, pname, params), (F, "glGetVertexAttribdvNV(%d, 0x%x, %p);\n", index, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params)
{
DISPATCH(GetVertexAttribfvNV, (index, pname, params), (F, "glGetVertexAttribfvNV(%d, 0x%x, %p);\n", index, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params)
{
DISPATCH(GetVertexAttribivNV, (index, pname, params), (F, "glGetVertexAttribivNV(%d, 0x%x, %p);\n", index, pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer)
{
DISPATCH(GetVertexAttribPointervNV, (index, pname, pointer), (F, "glGetVertexAttribPointervNV(%d, 0x%x, %p);\n", index, pname, (void *) pointer));
}
 
KEYWORD1 GLboolean KEYWORD2 NAME(IsProgramNV)(GLuint id)
{
RETURN_DISPATCH(IsProgramNV, (id), (F, "glIsProgramNV(%d);\n", id));
}
 
KEYWORD1 void KEYWORD2 NAME(LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program)
{
DISPATCH(LoadProgramNV, (target, id, len, program), (F, "glLoadProgramNV(0x%x, %d, %d, %p);\n", target, id, len, (void *) program));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
DISPATCH(ProgramParameter4dNV, (target, index, x, y, z, w), (F, "glProgramParameter4dNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params)
{
DISPATCH(ProgramParameter4dvNV, (target, index, params), (F, "glProgramParameter4dvNV(0x%x, %d, %p /* %g, %g, %g, %g */);\n", target, index, (void *) params, params[0], params[1], params[2], params[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
DISPATCH(ProgramParameter4fNV, (target, index, x, y, z, w), (F, "glProgramParameter4fNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params)
{
DISPATCH(ProgramParameter4fvNV, (target, index, params), (F, "glProgramParameter4fvNV(0x%x, %d, %p /* %g, %g, %g, %g */);\n", target, index, (void *) params, params[0], params[1], params[2], params[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params)
{
DISPATCH(ProgramParameters4dvNV, (target, index, num, params), (F, "glProgramParameters4dvNV(0x%x, %d, %d, %p /* %g, %g, %g, %g */);\n", target, index, num, (void *) params, params[0], params[1], params[2], params[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params)
{
DISPATCH(ProgramParameters4fvNV, (target, index, num, params), (F, "glProgramParameters4fvNV(0x%x, %d, %d, %p /* %g, %g, %g, %g */);\n", target, index, num, (void *) params, params[0], params[1], params[2], params[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(RequestResidentProgramsNV)(GLsizei n, const GLuint * ids)
{
DISPATCH(RequestResidentProgramsNV, (n, ids), (F, "glRequestResidentProgramsNV(%d, %p);\n", n, (void *) ids));
}
 
KEYWORD1 void KEYWORD2 NAME(TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform)
{
DISPATCH(TrackMatrixNV, (target, address, matrix, transform), (F, "glTrackMatrixNV(0x%x, %d, 0x%x, 0x%x);\n", target, address, matrix, transform));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(VertexAttribPointerNV, (index, size, type, stride, pointer), (F, "glVertexAttribPointerNV(%d, %d, 0x%x, %d, %p);\n", index, size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1dNV)(GLuint index, GLdouble x)
{
DISPATCH(VertexAttrib1dNV, (index, x), (F, "glVertexAttrib1dNV(%d, %f);\n", index, x));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1dvNV)(GLuint index, const GLdouble * v)
{
DISPATCH(VertexAttrib1dvNV, (index, v), (F, "glVertexAttrib1dvNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1fNV)(GLuint index, GLfloat x)
{
DISPATCH(VertexAttrib1fNV, (index, x), (F, "glVertexAttrib1fNV(%d, %f);\n", index, x));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
{
DISPATCH(VertexAttrib1fvNV, (index, v), (F, "glVertexAttrib1fvNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1sNV)(GLuint index, GLshort x)
{
DISPATCH(VertexAttrib1sNV, (index, x), (F, "glVertexAttrib1sNV(%d, %d);\n", index, x));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib1svNV)(GLuint index, const GLshort * v)
{
DISPATCH(VertexAttrib1svNV, (index, v), (F, "glVertexAttrib1svNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y)
{
DISPATCH(VertexAttrib2dNV, (index, x, y), (F, "glVertexAttrib2dNV(%d, %f, %f);\n", index, x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2dvNV)(GLuint index, const GLdouble * v)
{
DISPATCH(VertexAttrib2dvNV, (index, v), (F, "glVertexAttrib2dvNV(%d, %p /* %g, %g */);\n", index, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
{
DISPATCH(VertexAttrib2fNV, (index, x, y), (F, "glVertexAttrib2fNV(%d, %f, %f);\n", index, x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
{
DISPATCH(VertexAttrib2fvNV, (index, v), (F, "glVertexAttrib2fvNV(%d, %p /* %g, %g */);\n", index, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y)
{
DISPATCH(VertexAttrib2sNV, (index, x, y), (F, "glVertexAttrib2sNV(%d, %d, %d);\n", index, x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib2svNV)(GLuint index, const GLshort * v)
{
DISPATCH(VertexAttrib2svNV, (index, v), (F, "glVertexAttrib2svNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(VertexAttrib3dNV, (index, x, y, z), (F, "glVertexAttrib3dNV(%d, %f, %f, %f);\n", index, x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3dvNV)(GLuint index, const GLdouble * v)
{
DISPATCH(VertexAttrib3dvNV, (index, v), (F, "glVertexAttrib3dvNV(%d, %p /* %g, %g, %g */);\n", index, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(VertexAttrib3fNV, (index, x, y, z), (F, "glVertexAttrib3fNV(%d, %f, %f, %f);\n", index, x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3fvNV)(GLuint index, const GLfloat * v)
{
DISPATCH(VertexAttrib3fvNV, (index, v), (F, "glVertexAttrib3fvNV(%d, %p /* %g, %g, %g */);\n", index, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z)
{
DISPATCH(VertexAttrib3sNV, (index, x, y, z), (F, "glVertexAttrib3sNV(%d, %d, %d, %d);\n", index, x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib3svNV)(GLuint index, const GLshort * v)
{
DISPATCH(VertexAttrib3svNV, (index, v), (F, "glVertexAttrib3svNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
{
DISPATCH(VertexAttrib4dNV, (index, x, y, z, w), (F, "glVertexAttrib4dNV(%d, %f, %f, %f, %f);\n", index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4dvNV)(GLuint index, const GLdouble * v)
{
DISPATCH(VertexAttrib4dvNV, (index, v), (F, "glVertexAttrib4dvNV(%d, %p /* %g, %g, %g, %g */);\n", index, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
DISPATCH(VertexAttrib4fNV, (index, x, y, z, w), (F, "glVertexAttrib4fNV(%d, %f, %f, %f, %f);\n", index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
{
DISPATCH(VertexAttrib4fvNV, (index, v), (F, "glVertexAttrib4fvNV(%d, %p /* %g, %g, %g, %g */);\n", index, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
{
DISPATCH(VertexAttrib4sNV, (index, x, y, z, w), (F, "glVertexAttrib4sNV(%d, %d, %d, %d, %d);\n", index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4svNV)(GLuint index, const GLshort * v)
{
DISPATCH(VertexAttrib4svNV, (index, v), (F, "glVertexAttrib4svNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
{
DISPATCH(VertexAttrib4ubNV, (index, x, y, z, w), (F, "glVertexAttrib4ubNV(%d, %d, %d, %d, %d);\n", index, x, y, z, w));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttrib4ubvNV)(GLuint index, const GLubyte * v)
{
DISPATCH(VertexAttrib4ubvNV, (index, v), (F, "glVertexAttrib4ubvNV(%d, %p);\n", index, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v)
{
DISPATCH(VertexAttribs1dvNV, (index, n, v), (F, "glVertexAttribs1dvNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v)
{
DISPATCH(VertexAttribs1fvNV, (index, n, v), (F, "glVertexAttribs1fvNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v)
{
DISPATCH(VertexAttribs1svNV, (index, n, v), (F, "glVertexAttribs1svNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v)
{
DISPATCH(VertexAttribs2dvNV, (index, n, v), (F, "glVertexAttribs2dvNV(%d, %d, %p /* %g, %g */);\n", index, n, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v)
{
DISPATCH(VertexAttribs2fvNV, (index, n, v), (F, "glVertexAttribs2fvNV(%d, %d, %p /* %g, %g */);\n", index, n, (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v)
{
DISPATCH(VertexAttribs2svNV, (index, n, v), (F, "glVertexAttribs2svNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v)
{
DISPATCH(VertexAttribs3dvNV, (index, n, v), (F, "glVertexAttribs3dvNV(%d, %d, %p /* %g, %g, %g */);\n", index, n, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v)
{
DISPATCH(VertexAttribs3fvNV, (index, n, v), (F, "glVertexAttribs3fvNV(%d, %d, %p /* %g, %g, %g */);\n", index, n, (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v)
{
DISPATCH(VertexAttribs3svNV, (index, n, v), (F, "glVertexAttribs3svNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v)
{
DISPATCH(VertexAttribs4dvNV, (index, n, v), (F, "glVertexAttribs4dvNV(%d, %d, %p /* %g, %g, %g, %g */);\n", index, n, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v)
{
DISPATCH(VertexAttribs4fvNV, (index, n, v), (F, "glVertexAttribs4fvNV(%d, %d, %p /* %g, %g, %g, %g */);\n", index, n, (void *) v, v[0], v[1], v[2], v[3]));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v)
{
DISPATCH(VertexAttribs4svNV, (index, n, v), (F, "glVertexAttribs4svNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v)
{
DISPATCH(VertexAttribs4ubvNV, (index, n, v), (F, "glVertexAttribs4ubvNV(%d, %d, %p);\n", index, n, (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameteriNV)(GLenum pname, GLint params)
{
DISPATCH(PointParameteriNV, (pname, params), (F, "glPointParameteriNV(0x%x, %d);\n", pname, params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterivNV)(GLenum pname, const GLint * params)
{
DISPATCH(PointParameterivNV, (pname, params), (F, "glPointParameterivNV(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(BlendFuncSeparate)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)
{
DISPATCH(BlendFuncSeparateEXT, (sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha), (F, "glBlendFuncSeparate(0x%x, 0x%x, 0x%x, 0x%x);\n", sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordf)(GLfloat coord)
{
DISPATCH(FogCoordfEXT, (coord), (F, "glFogCoordf(%f);\n", coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordfv)(const GLfloat * coord)
{
DISPATCH(FogCoordfvEXT, (coord), (F, "glFogCoordfv(%p);\n", (void *) coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordd)(GLdouble coord)
{
DISPATCH(FogCoorddEXT, (coord), (F, "glFogCoordd(%f);\n", coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoorddv)(const GLdouble * coord)
{
DISPATCH(FogCoorddvEXT, (coord), (F, "glFogCoorddv(%p);\n", (void *) coord));
}
 
KEYWORD1 void KEYWORD2 NAME(FogCoordPointer)(GLenum type, GLsizei stride, const GLvoid * pointer)
{
DISPATCH(FogCoordPointerEXT, (type, stride, pointer), (F, "glFogCoordPointer(0x%x, %d, %p);\n", type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiDrawArrays)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount)
{
DISPATCH(MultiDrawArraysEXT, (mode, first, count, primcount), (F, "glMultiDrawArrays(0x%x, %p, %p, %d);\n", mode, (void *) first, (void *) count, primcount));
}
 
KEYWORD1 void KEYWORD2 NAME(MultiDrawElements)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount)
{
DISPATCH(MultiDrawElementsEXT, (mode, count, type, indices, primcount), (F, "glMultiDrawElements(0x%x, %p, 0x%x, %p, %d);\n", mode, (void *) count, type, (void *) indices, primcount));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterf)(GLenum pname, GLfloat param)
{
DISPATCH(PointParameterfEXT, (pname, param), (F, "glPointParameterf(0x%x, %f);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameterfv)(GLenum pname, const GLfloat * params)
{
DISPATCH(PointParameterfvEXT, (pname, params), (F, "glPointParameterfv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameteri)(GLenum pname, GLint param)
{
DISPATCH(PointParameteriNV, (pname, param), (F, "glPointParameteri(0x%x, %d);\n", pname, param));
}
 
KEYWORD1 void KEYWORD2 NAME(PointParameteriv)(GLenum pname, const GLint * params)
{
DISPATCH(PointParameterivNV, (pname, params), (F, "glPointParameteriv(0x%x, %p);\n", pname, (void *) params));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3b)(GLbyte red, GLbyte green, GLbyte blue)
{
DISPATCH(SecondaryColor3bEXT, (red, green, blue), (F, "glSecondaryColor3b(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3bv)(const GLbyte * v)
{
DISPATCH(SecondaryColor3bvEXT, (v), (F, "glSecondaryColor3bv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3d)(GLdouble red, GLdouble green, GLdouble blue)
{
DISPATCH(SecondaryColor3dEXT, (red, green, blue), (F, "glSecondaryColor3d(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3dv)(const GLdouble * v)
{
DISPATCH(SecondaryColor3dvEXT, (v), (F, "glSecondaryColor3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3f)(GLfloat red, GLfloat green, GLfloat blue)
{
DISPATCH(SecondaryColor3fEXT, (red, green, blue), (F, "glSecondaryColor3f(%f, %f, %f);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3fv)(const GLfloat * v)
{
DISPATCH(SecondaryColor3fvEXT, (v), (F, "glSecondaryColor3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3i)(GLint red, GLint green, GLint blue)
{
DISPATCH(SecondaryColor3iEXT, (red, green, blue), (F, "glSecondaryColor3i(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3iv)(const GLint * v)
{
DISPATCH(SecondaryColor3ivEXT, (v), (F, "glSecondaryColor3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3s)(GLshort red, GLshort green, GLshort blue)
{
DISPATCH(SecondaryColor3sEXT, (red, green, blue), (F, "glSecondaryColor3s(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3sv)(const GLshort * v)
{
DISPATCH(SecondaryColor3svEXT, (v), (F, "glSecondaryColor3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ub)(GLubyte red, GLubyte green, GLubyte blue)
{
DISPATCH(SecondaryColor3ubEXT, (red, green, blue), (F, "glSecondaryColor3ub(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ubv)(const GLubyte * v)
{
DISPATCH(SecondaryColor3ubvEXT, (v), (F, "glSecondaryColor3ubv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3ui)(GLuint red, GLuint green, GLuint blue)
{
DISPATCH(SecondaryColor3uiEXT, (red, green, blue), (F, "glSecondaryColor3ui(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3uiv)(const GLuint * v)
{
DISPATCH(SecondaryColor3uivEXT, (v), (F, "glSecondaryColor3uiv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3us)(GLushort red, GLushort green, GLushort blue)
{
DISPATCH(SecondaryColor3usEXT, (red, green, blue), (F, "glSecondaryColor3us(%d, %d, %d);\n", red, green, blue));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColor3usv)(const GLushort * v)
{
DISPATCH(SecondaryColor3usvEXT, (v), (F, "glSecondaryColor3usv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(SecondaryColorPointer)(GLint size, GLenum type, GLsizei stride, const void * pointer)
{
DISPATCH(SecondaryColorPointerEXT, (size, type, stride, pointer), (F, "glSecondaryColorPointer(%d, 0x%x, %d, %p);\n", size, type, stride, (void *) pointer));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2d)(GLdouble x, GLdouble y)
{
DISPATCH(WindowPos2dMESA, (x, y), (F, "glWindowPos2d(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2dv)(const GLdouble * v)
{
DISPATCH(WindowPos2dvMESA, (v), (F, "glWindowPos2dv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2f)(GLfloat x, GLfloat y)
{
DISPATCH(WindowPos2fMESA, (x, y), (F, "glWindowPos2f(%f, %f);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2fv)(const GLfloat * v)
{
DISPATCH(WindowPos2fvMESA, (v), (F, "glWindowPos2fv(%p /* %g, %g */);\n", (void *) v, v[0], v[1]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2i)(GLint x, GLint y)
{
DISPATCH(WindowPos2iMESA, (x, y), (F, "glWindowPos2i(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2iv)(const GLint * v)
{
DISPATCH(WindowPos2ivMESA, (v), (F, "glWindowPos2iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2s)(GLshort x, GLshort y)
{
DISPATCH(WindowPos2sMESA, (x, y), (F, "glWindowPos2s(%d, %d);\n", x, y));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos2sv)(const GLshort * v)
{
DISPATCH(WindowPos2svMESA, (v), (F, "glWindowPos2sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3d)(GLdouble x, GLdouble y, GLdouble z)
{
DISPATCH(WindowPos3dMESA, (x, y, z), (F, "glWindowPos3d(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3dv)(const GLdouble * v)
{
DISPATCH(WindowPos3dvMESA, (v), (F, "glWindowPos3dv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3f)(GLfloat x, GLfloat y, GLfloat z)
{
DISPATCH(WindowPos3fMESA, (x, y, z), (F, "glWindowPos3f(%f, %f, %f);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3fv)(const GLfloat * v)
{
DISPATCH(WindowPos3fvMESA, (v), (F, "glWindowPos3fv(%p /* %g, %g, %g */);\n", (void *) v, v[0], v[1], v[2]));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3i)(GLint x, GLint y, GLint z)
{
DISPATCH(WindowPos3iMESA, (x, y, z), (F, "glWindowPos3i(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3iv)(const GLint * v)
{
DISPATCH(WindowPos3ivMESA, (v), (F, "glWindowPos3iv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3s)(GLshort x, GLshort y, GLshort z)
{
DISPATCH(WindowPos3sMESA, (x, y, z), (F, "glWindowPos3s(%d, %d, %d);\n", x, y, z));
}
 
KEYWORD1 void KEYWORD2 NAME(WindowPos3sv)(const GLshort * v)
{
DISPATCH(WindowPos3svMESA, (v), (F, "glWindowPos3sv(%p);\n", (void *) v));
}
 
KEYWORD1 void KEYWORD2 NAME(ActiveStencilFaceEXT)(GLenum face)
{
DISPATCH(ActiveStencilFaceEXT, (face), (F, "glActiveStencilFaceEXT(0x%x);\n", face));
}
 
 
 
/*
* This is how a dispatch table can be initialized with all the functions
* we generated above.
*/
#ifdef DISPATCH_TABLE_NAME
 
#ifndef TABLE_ENTRY
#error TABLE_ENTRY must be defined
#endif
 
void *DISPATCH_TABLE_NAME[] = {
TABLE_ENTRY(NewList),
TABLE_ENTRY(EndList),
TABLE_ENTRY(CallList),
TABLE_ENTRY(CallLists),
TABLE_ENTRY(DeleteLists),
TABLE_ENTRY(GenLists),
TABLE_ENTRY(ListBase),
TABLE_ENTRY(Begin),
TABLE_ENTRY(Bitmap),
TABLE_ENTRY(Color3b),
TABLE_ENTRY(Color3bv),
TABLE_ENTRY(Color3d),
TABLE_ENTRY(Color3dv),
TABLE_ENTRY(Color3f),
TABLE_ENTRY(Color3fv),
TABLE_ENTRY(Color3i),
TABLE_ENTRY(Color3iv),
TABLE_ENTRY(Color3s),
TABLE_ENTRY(Color3sv),
TABLE_ENTRY(Color3ub),
TABLE_ENTRY(Color3ubv),
TABLE_ENTRY(Color3ui),
TABLE_ENTRY(Color3uiv),
TABLE_ENTRY(Color3us),
TABLE_ENTRY(Color3usv),
TABLE_ENTRY(Color4b),
TABLE_ENTRY(Color4bv),
TABLE_ENTRY(Color4d),
TABLE_ENTRY(Color4dv),
TABLE_ENTRY(Color4f),
TABLE_ENTRY(Color4fv),
TABLE_ENTRY(Color4i),
TABLE_ENTRY(Color4iv),
TABLE_ENTRY(Color4s),
TABLE_ENTRY(Color4sv),
TABLE_ENTRY(Color4ub),
TABLE_ENTRY(Color4ubv),
TABLE_ENTRY(Color4ui),
TABLE_ENTRY(Color4uiv),
TABLE_ENTRY(Color4us),
TABLE_ENTRY(Color4usv),
TABLE_ENTRY(EdgeFlag),
TABLE_ENTRY(EdgeFlagv),
TABLE_ENTRY(End),
TABLE_ENTRY(Indexd),
TABLE_ENTRY(Indexdv),
TABLE_ENTRY(Indexf),
TABLE_ENTRY(Indexfv),
TABLE_ENTRY(Indexi),
TABLE_ENTRY(Indexiv),
TABLE_ENTRY(Indexs),
TABLE_ENTRY(Indexsv),
TABLE_ENTRY(Normal3b),
TABLE_ENTRY(Normal3bv),
TABLE_ENTRY(Normal3d),
TABLE_ENTRY(Normal3dv),
TABLE_ENTRY(Normal3f),
TABLE_ENTRY(Normal3fv),
TABLE_ENTRY(Normal3i),
TABLE_ENTRY(Normal3iv),
TABLE_ENTRY(Normal3s),
TABLE_ENTRY(Normal3sv),
TABLE_ENTRY(RasterPos2d),
TABLE_ENTRY(RasterPos2dv),
TABLE_ENTRY(RasterPos2f),
TABLE_ENTRY(RasterPos2fv),
TABLE_ENTRY(RasterPos2i),
TABLE_ENTRY(RasterPos2iv),
TABLE_ENTRY(RasterPos2s),
TABLE_ENTRY(RasterPos2sv),
TABLE_ENTRY(RasterPos3d),
TABLE_ENTRY(RasterPos3dv),
TABLE_ENTRY(RasterPos3f),
TABLE_ENTRY(RasterPos3fv),
TABLE_ENTRY(RasterPos3i),
TABLE_ENTRY(RasterPos3iv),
TABLE_ENTRY(RasterPos3s),
TABLE_ENTRY(RasterPos3sv),
TABLE_ENTRY(RasterPos4d),
TABLE_ENTRY(RasterPos4dv),
TABLE_ENTRY(RasterPos4f),
TABLE_ENTRY(RasterPos4fv),
TABLE_ENTRY(RasterPos4i),
TABLE_ENTRY(RasterPos4iv),
TABLE_ENTRY(RasterPos4s),
TABLE_ENTRY(RasterPos4sv),
TABLE_ENTRY(Rectd),
TABLE_ENTRY(Rectdv),
TABLE_ENTRY(Rectf),
TABLE_ENTRY(Rectfv),
TABLE_ENTRY(Recti),
TABLE_ENTRY(Rectiv),
TABLE_ENTRY(Rects),
TABLE_ENTRY(Rectsv),
TABLE_ENTRY(TexCoord1d),
TABLE_ENTRY(TexCoord1dv),
TABLE_ENTRY(TexCoord1f),
TABLE_ENTRY(TexCoord1fv),
TABLE_ENTRY(TexCoord1i),
TABLE_ENTRY(TexCoord1iv),
TABLE_ENTRY(TexCoord1s),
TABLE_ENTRY(TexCoord1sv),
TABLE_ENTRY(TexCoord2d),
TABLE_ENTRY(TexCoord2dv),
TABLE_ENTRY(TexCoord2f),
TABLE_ENTRY(TexCoord2fv),
TABLE_ENTRY(TexCoord2i),
TABLE_ENTRY(TexCoord2iv),
TABLE_ENTRY(TexCoord2s),
TABLE_ENTRY(TexCoord2sv),
TABLE_ENTRY(TexCoord3d),
TABLE_ENTRY(TexCoord3dv),
TABLE_ENTRY(TexCoord3f),
TABLE_ENTRY(TexCoord3fv),
TABLE_ENTRY(TexCoord3i),
TABLE_ENTRY(TexCoord3iv),
TABLE_ENTRY(TexCoord3s),
TABLE_ENTRY(TexCoord3sv),
TABLE_ENTRY(TexCoord4d),
TABLE_ENTRY(TexCoord4dv),
TABLE_ENTRY(TexCoord4f),
TABLE_ENTRY(TexCoord4fv),
TABLE_ENTRY(TexCoord4i),
TABLE_ENTRY(TexCoord4iv),
TABLE_ENTRY(TexCoord4s),
TABLE_ENTRY(TexCoord4sv),
TABLE_ENTRY(Vertex2d),
TABLE_ENTRY(Vertex2dv),
TABLE_ENTRY(Vertex2f),
TABLE_ENTRY(Vertex2fv),
TABLE_ENTRY(Vertex2i),
TABLE_ENTRY(Vertex2iv),
TABLE_ENTRY(Vertex2s),
TABLE_ENTRY(Vertex2sv),
TABLE_ENTRY(Vertex3d),
TABLE_ENTRY(Vertex3dv),
TABLE_ENTRY(Vertex3f),
TABLE_ENTRY(Vertex3fv),
TABLE_ENTRY(Vertex3i),
TABLE_ENTRY(Vertex3iv),
TABLE_ENTRY(Vertex3s),
TABLE_ENTRY(Vertex3sv),
TABLE_ENTRY(Vertex4d),
TABLE_ENTRY(Vertex4dv),
TABLE_ENTRY(Vertex4f),
TABLE_ENTRY(Vertex4fv),
TABLE_ENTRY(Vertex4i),
TABLE_ENTRY(Vertex4iv),
TABLE_ENTRY(Vertex4s),
TABLE_ENTRY(Vertex4sv),
TABLE_ENTRY(ClipPlane),
TABLE_ENTRY(ColorMaterial),
TABLE_ENTRY(CullFace),
TABLE_ENTRY(Fogf),
TABLE_ENTRY(Fogfv),
TABLE_ENTRY(Fogi),
TABLE_ENTRY(Fogiv),
TABLE_ENTRY(FrontFace),
TABLE_ENTRY(Hint),
TABLE_ENTRY(Lightf),
TABLE_ENTRY(Lightfv),
TABLE_ENTRY(Lighti),
TABLE_ENTRY(Lightiv),
TABLE_ENTRY(LightModelf),
TABLE_ENTRY(LightModelfv),
TABLE_ENTRY(LightModeli),
TABLE_ENTRY(LightModeliv),
TABLE_ENTRY(LineStipple),
TABLE_ENTRY(LineWidth),
TABLE_ENTRY(Materialf),
TABLE_ENTRY(Materialfv),
TABLE_ENTRY(Materiali),
TABLE_ENTRY(Materialiv),
TABLE_ENTRY(PointSize),
TABLE_ENTRY(PolygonMode),
TABLE_ENTRY(PolygonStipple),
TABLE_ENTRY(Scissor),
TABLE_ENTRY(ShadeModel),
TABLE_ENTRY(TexParameterf),
TABLE_ENTRY(TexParameterfv),
TABLE_ENTRY(TexParameteri),
TABLE_ENTRY(TexParameteriv),
TABLE_ENTRY(TexImage1D),
TABLE_ENTRY(TexImage2D),
TABLE_ENTRY(TexEnvf),
TABLE_ENTRY(TexEnvfv),
TABLE_ENTRY(TexEnvi),
TABLE_ENTRY(TexEnviv),
TABLE_ENTRY(TexGend),
TABLE_ENTRY(TexGendv),
TABLE_ENTRY(TexGenf),
TABLE_ENTRY(TexGenfv),
TABLE_ENTRY(TexGeni),
TABLE_ENTRY(TexGeniv),
TABLE_ENTRY(FeedbackBuffer),
TABLE_ENTRY(SelectBuffer),
TABLE_ENTRY(RenderMode),
TABLE_ENTRY(InitNames),
TABLE_ENTRY(LoadName),
TABLE_ENTRY(PassThrough),
TABLE_ENTRY(PopName),
TABLE_ENTRY(PushName),
TABLE_ENTRY(DrawBuffer),
TABLE_ENTRY(Clear),
TABLE_ENTRY(ClearAccum),
TABLE_ENTRY(ClearIndex),
TABLE_ENTRY(ClearColor),
TABLE_ENTRY(ClearStencil),
TABLE_ENTRY(ClearDepth),
TABLE_ENTRY(StencilMask),
TABLE_ENTRY(ColorMask),
TABLE_ENTRY(DepthMask),
TABLE_ENTRY(IndexMask),
TABLE_ENTRY(Accum),
TABLE_ENTRY(Disable),
TABLE_ENTRY(Enable),
TABLE_ENTRY(Finish),
TABLE_ENTRY(Flush),
TABLE_ENTRY(PopAttrib),
TABLE_ENTRY(PushAttrib),
TABLE_ENTRY(Map1d),
TABLE_ENTRY(Map1f),
TABLE_ENTRY(Map2d),
TABLE_ENTRY(Map2f),
TABLE_ENTRY(MapGrid1d),
TABLE_ENTRY(MapGrid1f),
TABLE_ENTRY(MapGrid2d),
TABLE_ENTRY(MapGrid2f),
TABLE_ENTRY(EvalCoord1d),
TABLE_ENTRY(EvalCoord1dv),
TABLE_ENTRY(EvalCoord1f),
TABLE_ENTRY(EvalCoord1fv),
TABLE_ENTRY(EvalCoord2d),
TABLE_ENTRY(EvalCoord2dv),
TABLE_ENTRY(EvalCoord2f),
TABLE_ENTRY(EvalCoord2fv),
TABLE_ENTRY(EvalMesh1),
TABLE_ENTRY(EvalPoint1),
TABLE_ENTRY(EvalMesh2),
TABLE_ENTRY(EvalPoint2),
TABLE_ENTRY(AlphaFunc),
TABLE_ENTRY(BlendFunc),
TABLE_ENTRY(LogicOp),
TABLE_ENTRY(StencilFunc),
TABLE_ENTRY(StencilOp),
TABLE_ENTRY(DepthFunc),
TABLE_ENTRY(PixelZoom),
TABLE_ENTRY(PixelTransferf),
TABLE_ENTRY(PixelTransferi),
TABLE_ENTRY(PixelStoref),
TABLE_ENTRY(PixelStorei),
TABLE_ENTRY(PixelMapfv),
TABLE_ENTRY(PixelMapuiv),
TABLE_ENTRY(PixelMapusv),
TABLE_ENTRY(ReadBuffer),
TABLE_ENTRY(CopyPixels),
TABLE_ENTRY(ReadPixels),
TABLE_ENTRY(DrawPixels),
TABLE_ENTRY(GetBooleanv),
TABLE_ENTRY(GetClipPlane),
TABLE_ENTRY(GetDoublev),
TABLE_ENTRY(GetError),
TABLE_ENTRY(GetFloatv),
TABLE_ENTRY(GetIntegerv),
TABLE_ENTRY(GetLightfv),
TABLE_ENTRY(GetLightiv),
TABLE_ENTRY(GetMapdv),
TABLE_ENTRY(GetMapfv),
TABLE_ENTRY(GetMapiv),
TABLE_ENTRY(GetMaterialfv),
TABLE_ENTRY(GetMaterialiv),
TABLE_ENTRY(GetPixelMapfv),
TABLE_ENTRY(GetPixelMapuiv),
TABLE_ENTRY(GetPixelMapusv),
TABLE_ENTRY(GetPolygonStipple),
TABLE_ENTRY(GetString),
TABLE_ENTRY(GetTexEnvfv),
TABLE_ENTRY(GetTexEnviv),
TABLE_ENTRY(GetTexGendv),
TABLE_ENTRY(GetTexGenfv),
TABLE_ENTRY(GetTexGeniv),
TABLE_ENTRY(GetTexImage),
TABLE_ENTRY(GetTexParameterfv),
TABLE_ENTRY(GetTexParameteriv),
TABLE_ENTRY(GetTexLevelParameterfv),
TABLE_ENTRY(GetTexLevelParameteriv),
TABLE_ENTRY(IsEnabled),
TABLE_ENTRY(IsList),
TABLE_ENTRY(DepthRange),
TABLE_ENTRY(Frustum),
TABLE_ENTRY(LoadIdentity),
TABLE_ENTRY(LoadMatrixf),
TABLE_ENTRY(LoadMatrixd),
TABLE_ENTRY(MatrixMode),
TABLE_ENTRY(MultMatrixf),
TABLE_ENTRY(MultMatrixd),
TABLE_ENTRY(Ortho),
TABLE_ENTRY(PopMatrix),
TABLE_ENTRY(PushMatrix),
TABLE_ENTRY(Rotated),
TABLE_ENTRY(Rotatef),
TABLE_ENTRY(Scaled),
TABLE_ENTRY(Scalef),
TABLE_ENTRY(Translated),
TABLE_ENTRY(Translatef),
TABLE_ENTRY(Viewport),
TABLE_ENTRY(ArrayElement),
TABLE_ENTRY(BindTexture),
TABLE_ENTRY(ColorPointer),
TABLE_ENTRY(DisableClientState),
TABLE_ENTRY(DrawArrays),
TABLE_ENTRY(DrawElements),
TABLE_ENTRY(EdgeFlagPointer),
TABLE_ENTRY(EnableClientState),
TABLE_ENTRY(IndexPointer),
TABLE_ENTRY(Indexub),
TABLE_ENTRY(Indexubv),
TABLE_ENTRY(InterleavedArrays),
TABLE_ENTRY(NormalPointer),
TABLE_ENTRY(PolygonOffset),
TABLE_ENTRY(TexCoordPointer),
TABLE_ENTRY(VertexPointer),
TABLE_ENTRY(AreTexturesResident),
TABLE_ENTRY(CopyTexImage1D),
TABLE_ENTRY(CopyTexImage2D),
TABLE_ENTRY(CopyTexSubImage1D),
TABLE_ENTRY(CopyTexSubImage2D),
TABLE_ENTRY(DeleteTextures),
TABLE_ENTRY(GenTextures),
TABLE_ENTRY(GetPointerv),
TABLE_ENTRY(IsTexture),
TABLE_ENTRY(PrioritizeTextures),
TABLE_ENTRY(TexSubImage1D),
TABLE_ENTRY(TexSubImage2D),
TABLE_ENTRY(PopClientAttrib),
TABLE_ENTRY(PushClientAttrib),
TABLE_ENTRY(BlendColor),
TABLE_ENTRY(BlendEquation),
TABLE_ENTRY(DrawRangeElements),
TABLE_ENTRY(ColorTable),
TABLE_ENTRY(ColorTableParameterfv),
TABLE_ENTRY(ColorTableParameteriv),
TABLE_ENTRY(CopyColorTable),
TABLE_ENTRY(GetColorTable),
TABLE_ENTRY(GetColorTableParameterfv),
TABLE_ENTRY(GetColorTableParameteriv),
TABLE_ENTRY(ColorSubTable),
TABLE_ENTRY(CopyColorSubTable),
TABLE_ENTRY(ConvolutionFilter1D),
TABLE_ENTRY(ConvolutionFilter2D),
TABLE_ENTRY(ConvolutionParameterf),
TABLE_ENTRY(ConvolutionParameterfv),
TABLE_ENTRY(ConvolutionParameteri),
TABLE_ENTRY(ConvolutionParameteriv),
TABLE_ENTRY(CopyConvolutionFilter1D),
TABLE_ENTRY(CopyConvolutionFilter2D),
TABLE_ENTRY(GetConvolutionFilter),
TABLE_ENTRY(GetConvolutionParameterfv),
TABLE_ENTRY(GetConvolutionParameteriv),
TABLE_ENTRY(GetSeparableFilter),
TABLE_ENTRY(SeparableFilter2D),
TABLE_ENTRY(GetHistogram),
TABLE_ENTRY(GetHistogramParameterfv),
TABLE_ENTRY(GetHistogramParameteriv),
TABLE_ENTRY(GetMinmax),
TABLE_ENTRY(GetMinmaxParameterfv),
TABLE_ENTRY(GetMinmaxParameteriv),
TABLE_ENTRY(Histogram),
TABLE_ENTRY(Minmax),
TABLE_ENTRY(ResetHistogram),
TABLE_ENTRY(ResetMinmax),
TABLE_ENTRY(TexImage3D),
TABLE_ENTRY(TexSubImage3D),
TABLE_ENTRY(CopyTexSubImage3D),
TABLE_ENTRY(ActiveTextureARB),
TABLE_ENTRY(ClientActiveTextureARB),
TABLE_ENTRY(MultiTexCoord1dARB),
TABLE_ENTRY(MultiTexCoord1dvARB),
TABLE_ENTRY(MultiTexCoord1fARB),
TABLE_ENTRY(MultiTexCoord1fvARB),
TABLE_ENTRY(MultiTexCoord1iARB),
TABLE_ENTRY(MultiTexCoord1ivARB),
TABLE_ENTRY(MultiTexCoord1sARB),
TABLE_ENTRY(MultiTexCoord1svARB),
TABLE_ENTRY(MultiTexCoord2dARB),
TABLE_ENTRY(MultiTexCoord2dvARB),
TABLE_ENTRY(MultiTexCoord2fARB),
TABLE_ENTRY(MultiTexCoord2fvARB),
TABLE_ENTRY(MultiTexCoord2iARB),
TABLE_ENTRY(MultiTexCoord2ivARB),
TABLE_ENTRY(MultiTexCoord2sARB),
TABLE_ENTRY(MultiTexCoord2svARB),
TABLE_ENTRY(MultiTexCoord3dARB),
TABLE_ENTRY(MultiTexCoord3dvARB),
TABLE_ENTRY(MultiTexCoord3fARB),
TABLE_ENTRY(MultiTexCoord3fvARB),
TABLE_ENTRY(MultiTexCoord3iARB),
TABLE_ENTRY(MultiTexCoord3ivARB),
TABLE_ENTRY(MultiTexCoord3sARB),
TABLE_ENTRY(MultiTexCoord3svARB),
TABLE_ENTRY(MultiTexCoord4dARB),
TABLE_ENTRY(MultiTexCoord4dvARB),
TABLE_ENTRY(MultiTexCoord4fARB),
TABLE_ENTRY(MultiTexCoord4fvARB),
TABLE_ENTRY(MultiTexCoord4iARB),
TABLE_ENTRY(MultiTexCoord4ivARB),
TABLE_ENTRY(MultiTexCoord4sARB),
TABLE_ENTRY(MultiTexCoord4svARB),
TABLE_ENTRY(LoadTransposeMatrixfARB),
TABLE_ENTRY(LoadTransposeMatrixdARB),
TABLE_ENTRY(MultTransposeMatrixfARB),
TABLE_ENTRY(MultTransposeMatrixdARB),
TABLE_ENTRY(SampleCoverageARB),
TABLE_ENTRY(__unused413),
TABLE_ENTRY(PolygonOffsetEXT),
TABLE_ENTRY(GetTexFilterFuncSGIS),
TABLE_ENTRY(TexFilterFuncSGIS),
TABLE_ENTRY(GetHistogramEXT),
TABLE_ENTRY(GetHistogramParameterfvEXT),
TABLE_ENTRY(GetHistogramParameterivEXT),
TABLE_ENTRY(GetMinmaxEXT),
TABLE_ENTRY(GetMinmaxParameterfvEXT),
TABLE_ENTRY(GetMinmaxParameterivEXT),
TABLE_ENTRY(GetConvolutionFilterEXT),
TABLE_ENTRY(GetConvolutionParameterfvEXT),
TABLE_ENTRY(GetConvolutionParameterivEXT),
TABLE_ENTRY(GetSeparableFilterEXT),
TABLE_ENTRY(GetColorTableSGI),
TABLE_ENTRY(GetColorTableParameterfvSGI),
TABLE_ENTRY(GetColorTableParameterivSGI),
TABLE_ENTRY(PixelTexGenSGIX),
TABLE_ENTRY(PixelTexGenParameteriSGIS),
TABLE_ENTRY(PixelTexGenParameterivSGIS),
TABLE_ENTRY(PixelTexGenParameterfSGIS),
TABLE_ENTRY(PixelTexGenParameterfvSGIS),
TABLE_ENTRY(GetPixelTexGenParameterivSGIS),
TABLE_ENTRY(GetPixelTexGenParameterfvSGIS),
TABLE_ENTRY(TexImage4DSGIS),
TABLE_ENTRY(TexSubImage4DSGIS),
TABLE_ENTRY(AreTexturesResidentEXT),
TABLE_ENTRY(GenTexturesEXT),
TABLE_ENTRY(IsTextureEXT),
TABLE_ENTRY(DetailTexFuncSGIS),
TABLE_ENTRY(GetDetailTexFuncSGIS),
TABLE_ENTRY(SharpenTexFuncSGIS),
TABLE_ENTRY(GetSharpenTexFuncSGIS),
TABLE_ENTRY(SampleMaskSGIS),
TABLE_ENTRY(SamplePatternSGIS),
TABLE_ENTRY(ColorPointerEXT),
TABLE_ENTRY(EdgeFlagPointerEXT),
TABLE_ENTRY(IndexPointerEXT),
TABLE_ENTRY(NormalPointerEXT),
TABLE_ENTRY(TexCoordPointerEXT),
TABLE_ENTRY(VertexPointerEXT),
TABLE_ENTRY(SpriteParameterfSGIX),
TABLE_ENTRY(SpriteParameterfvSGIX),
TABLE_ENTRY(SpriteParameteriSGIX),
TABLE_ENTRY(SpriteParameterivSGIX),
TABLE_ENTRY(PointParameterfEXT),
TABLE_ENTRY(PointParameterfvEXT),
TABLE_ENTRY(GetInstrumentsSGIX),
TABLE_ENTRY(InstrumentsBufferSGIX),
TABLE_ENTRY(PollInstrumentsSGIX),
TABLE_ENTRY(ReadInstrumentsSGIX),
TABLE_ENTRY(StartInstrumentsSGIX),
TABLE_ENTRY(StopInstrumentsSGIX),
TABLE_ENTRY(FrameZoomSGIX),
TABLE_ENTRY(TagSampleBufferSGIX),
TABLE_ENTRY(ReferencePlaneSGIX),
TABLE_ENTRY(FlushRasterSGIX),
TABLE_ENTRY(GetListParameterfvSGIX),
TABLE_ENTRY(GetListParameterivSGIX),
TABLE_ENTRY(ListParameterfSGIX),
TABLE_ENTRY(ListParameterfvSGIX),
TABLE_ENTRY(ListParameteriSGIX),
TABLE_ENTRY(ListParameterivSGIX),
TABLE_ENTRY(FragmentColorMaterialSGIX),
TABLE_ENTRY(FragmentLightfSGIX),
TABLE_ENTRY(FragmentLightfvSGIX),
TABLE_ENTRY(FragmentLightiSGIX),
TABLE_ENTRY(FragmentLightivSGIX),
TABLE_ENTRY(FragmentLightModelfSGIX),
TABLE_ENTRY(FragmentLightModelfvSGIX),
TABLE_ENTRY(FragmentLightModeliSGIX),
TABLE_ENTRY(FragmentLightModelivSGIX),
TABLE_ENTRY(FragmentMaterialfSGIX),
TABLE_ENTRY(FragmentMaterialfvSGIX),
TABLE_ENTRY(FragmentMaterialiSGIX),
TABLE_ENTRY(FragmentMaterialivSGIX),
TABLE_ENTRY(GetFragmentLightfvSGIX),
TABLE_ENTRY(GetFragmentLightivSGIX),
TABLE_ENTRY(GetFragmentMaterialfvSGIX),
TABLE_ENTRY(GetFragmentMaterialivSGIX),
TABLE_ENTRY(LightEnviSGIX),
TABLE_ENTRY(VertexWeightfEXT),
TABLE_ENTRY(VertexWeightfvEXT),
TABLE_ENTRY(VertexWeightPointerEXT),
TABLE_ENTRY(FlushVertexArrayRangeNV),
TABLE_ENTRY(VertexArrayRangeNV),
TABLE_ENTRY(CombinerParameterfvNV),
TABLE_ENTRY(CombinerParameterfNV),
TABLE_ENTRY(CombinerParameterivNV),
TABLE_ENTRY(CombinerParameteriNV),
TABLE_ENTRY(CombinerInputNV),
TABLE_ENTRY(CombinerOutputNV),
TABLE_ENTRY(FinalCombinerInputNV),
TABLE_ENTRY(GetCombinerInputParameterfvNV),
TABLE_ENTRY(GetCombinerInputParameterivNV),
TABLE_ENTRY(GetCombinerOutputParameterfvNV),
TABLE_ENTRY(GetCombinerOutputParameterivNV),
TABLE_ENTRY(GetFinalCombinerInputParameterfvNV),
TABLE_ENTRY(GetFinalCombinerInputParameterivNV),
TABLE_ENTRY(ResizeBuffersMESA),
TABLE_ENTRY(WindowPos2dMESA),
TABLE_ENTRY(WindowPos2dvMESA),
TABLE_ENTRY(WindowPos2fMESA),
TABLE_ENTRY(WindowPos2fvMESA),
TABLE_ENTRY(WindowPos2iMESA),
TABLE_ENTRY(WindowPos2ivMESA),
TABLE_ENTRY(WindowPos2sMESA),
TABLE_ENTRY(WindowPos2svMESA),
TABLE_ENTRY(WindowPos3dMESA),
TABLE_ENTRY(WindowPos3dvMESA),
TABLE_ENTRY(WindowPos3fMESA),
TABLE_ENTRY(WindowPos3fvMESA),
TABLE_ENTRY(WindowPos3iMESA),
TABLE_ENTRY(WindowPos3ivMESA),
TABLE_ENTRY(WindowPos3sMESA),
TABLE_ENTRY(WindowPos3svMESA),
TABLE_ENTRY(WindowPos4dMESA),
TABLE_ENTRY(WindowPos4dvMESA),
TABLE_ENTRY(WindowPos4fMESA),
TABLE_ENTRY(WindowPos4fvMESA),
TABLE_ENTRY(WindowPos4iMESA),
TABLE_ENTRY(WindowPos4ivMESA),
TABLE_ENTRY(WindowPos4sMESA),
TABLE_ENTRY(WindowPos4svMESA),
TABLE_ENTRY(BlendFuncSeparateEXT),
TABLE_ENTRY(IndexMaterialEXT),
TABLE_ENTRY(IndexFuncEXT),
TABLE_ENTRY(LockArraysEXT),
TABLE_ENTRY(UnlockArraysEXT),
TABLE_ENTRY(CullParameterdvEXT),
TABLE_ENTRY(CullParameterfvEXT),
TABLE_ENTRY(HintPGI),
TABLE_ENTRY(FogCoordfEXT),
TABLE_ENTRY(FogCoordfvEXT),
TABLE_ENTRY(FogCoorddEXT),
TABLE_ENTRY(FogCoorddvEXT),
TABLE_ENTRY(FogCoordPointerEXT),
TABLE_ENTRY(GetColorTableEXT),
TABLE_ENTRY(GetColorTableParameterivEXT),
TABLE_ENTRY(GetColorTableParameterfvEXT),
TABLE_ENTRY(TbufferMask3DFX),
TABLE_ENTRY(CompressedTexImage3DARB),
TABLE_ENTRY(CompressedTexImage2DARB),
TABLE_ENTRY(CompressedTexImage1DARB),
TABLE_ENTRY(CompressedTexSubImage3DARB),
TABLE_ENTRY(CompressedTexSubImage2DARB),
TABLE_ENTRY(CompressedTexSubImage1DARB),
TABLE_ENTRY(GetCompressedTexImageARB),
TABLE_ENTRY(SecondaryColor3bEXT),
TABLE_ENTRY(SecondaryColor3bvEXT),
TABLE_ENTRY(SecondaryColor3dEXT),
TABLE_ENTRY(SecondaryColor3dvEXT),
TABLE_ENTRY(SecondaryColor3fEXT),
TABLE_ENTRY(SecondaryColor3fvEXT),
TABLE_ENTRY(SecondaryColor3iEXT),
TABLE_ENTRY(SecondaryColor3ivEXT),
TABLE_ENTRY(SecondaryColor3sEXT),
TABLE_ENTRY(SecondaryColor3svEXT),
TABLE_ENTRY(SecondaryColor3ubEXT),
TABLE_ENTRY(SecondaryColor3ubvEXT),
TABLE_ENTRY(SecondaryColor3uiEXT),
TABLE_ENTRY(SecondaryColor3uivEXT),
TABLE_ENTRY(SecondaryColor3usEXT),
TABLE_ENTRY(SecondaryColor3usvEXT),
TABLE_ENTRY(SecondaryColorPointerEXT),
TABLE_ENTRY(AreProgramsResidentNV),
TABLE_ENTRY(BindProgramNV),
TABLE_ENTRY(DeleteProgramsNV),
TABLE_ENTRY(ExecuteProgramNV),
TABLE_ENTRY(GenProgramsNV),
TABLE_ENTRY(GetProgramParameterdvNV),
TABLE_ENTRY(GetProgramParameterfvNV),
TABLE_ENTRY(GetProgramivNV),
TABLE_ENTRY(GetProgramStringNV),
TABLE_ENTRY(GetTrackMatrixivNV),
TABLE_ENTRY(GetVertexAttribdvNV),
TABLE_ENTRY(GetVertexAttribfvNV),
TABLE_ENTRY(GetVertexAttribivNV),
TABLE_ENTRY(GetVertexAttribPointervNV),
TABLE_ENTRY(IsProgramNV),
TABLE_ENTRY(LoadProgramNV),
TABLE_ENTRY(ProgramParameter4dNV),
TABLE_ENTRY(ProgramParameter4dvNV),
TABLE_ENTRY(ProgramParameter4fNV),
TABLE_ENTRY(ProgramParameter4fvNV),
TABLE_ENTRY(ProgramParameters4dvNV),
TABLE_ENTRY(ProgramParameters4fvNV),
TABLE_ENTRY(RequestResidentProgramsNV),
TABLE_ENTRY(TrackMatrixNV),
TABLE_ENTRY(VertexAttribPointerNV),
TABLE_ENTRY(VertexAttrib1dNV),
TABLE_ENTRY(VertexAttrib1dvNV),
TABLE_ENTRY(VertexAttrib1fNV),
TABLE_ENTRY(VertexAttrib1fvNV),
TABLE_ENTRY(VertexAttrib1sNV),
TABLE_ENTRY(VertexAttrib1svNV),
TABLE_ENTRY(VertexAttrib2dNV),
TABLE_ENTRY(VertexAttrib2dvNV),
TABLE_ENTRY(VertexAttrib2fNV),
TABLE_ENTRY(VertexAttrib2fvNV),
TABLE_ENTRY(VertexAttrib2sNV),
TABLE_ENTRY(VertexAttrib2svNV),
TABLE_ENTRY(VertexAttrib3dNV),
TABLE_ENTRY(VertexAttrib3dvNV),
TABLE_ENTRY(VertexAttrib3fNV),
TABLE_ENTRY(VertexAttrib3fvNV),
TABLE_ENTRY(VertexAttrib3sNV),
TABLE_ENTRY(VertexAttrib3svNV),
TABLE_ENTRY(VertexAttrib4dNV),
TABLE_ENTRY(VertexAttrib4dvNV),
TABLE_ENTRY(VertexAttrib4fNV),
TABLE_ENTRY(VertexAttrib4fvNV),
TABLE_ENTRY(VertexAttrib4sNV),
TABLE_ENTRY(VertexAttrib4svNV),
TABLE_ENTRY(VertexAttrib4ubNV),
TABLE_ENTRY(VertexAttrib4ubvNV),
TABLE_ENTRY(VertexAttribs1dvNV),
TABLE_ENTRY(VertexAttribs1fvNV),
TABLE_ENTRY(VertexAttribs1svNV),
TABLE_ENTRY(VertexAttribs2dvNV),
TABLE_ENTRY(VertexAttribs2fvNV),
TABLE_ENTRY(VertexAttribs2svNV),
TABLE_ENTRY(VertexAttribs3dvNV),
TABLE_ENTRY(VertexAttribs3fvNV),
TABLE_ENTRY(VertexAttribs3svNV),
TABLE_ENTRY(VertexAttribs4dvNV),
TABLE_ENTRY(VertexAttribs4fvNV),
TABLE_ENTRY(VertexAttribs4svNV),
TABLE_ENTRY(VertexAttribs4ubvNV),
TABLE_ENTRY(PointParameteriNV),
TABLE_ENTRY(PointParameterivNV),
TABLE_ENTRY(MultiDrawArraysEXT),
TABLE_ENTRY(MultiDrawElementsEXT),
TABLE_ENTRY(ActiveStencilFaceEXT),
TABLE_ENTRY(DeleteFencesNV),
TABLE_ENTRY(GenFencesNV),
TABLE_ENTRY(IsFenceNV),
TABLE_ENTRY(TestFenceNV),
TABLE_ENTRY(GetFenceivNV),
TABLE_ENTRY(FinishFenceNV),
TABLE_ENTRY(SetFenceNV),
/* A whole bunch of no-op functions. These might be called
* when someone tries to call a dynamically-registered
* extension function without a current rendering context.
*/
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
TABLE_ENTRY(Unused),
};
#endif /* DISPATCH_TABLE_NAME */
 
 
/*
* This is just used to silence compiler warnings.
* We list the functions which aren't otherwise used.
*/
#ifdef UNUSED_TABLE_NAME
void *UNUSED_TABLE_NAME[] = {
TABLE_ENTRY(ActiveTexture),
TABLE_ENTRY(ClientActiveTexture),
TABLE_ENTRY(MultiTexCoord1d),
TABLE_ENTRY(MultiTexCoord1dv),
TABLE_ENTRY(MultiTexCoord1f),
TABLE_ENTRY(MultiTexCoord1fv),
TABLE_ENTRY(MultiTexCoord1i),
TABLE_ENTRY(MultiTexCoord1iv),
TABLE_ENTRY(MultiTexCoord1s),
TABLE_ENTRY(MultiTexCoord1sv),
TABLE_ENTRY(MultiTexCoord2d),
TABLE_ENTRY(MultiTexCoord2dv),
TABLE_ENTRY(MultiTexCoord2f),
TABLE_ENTRY(MultiTexCoord2fv),
TABLE_ENTRY(MultiTexCoord2i),
TABLE_ENTRY(MultiTexCoord2iv),
TABLE_ENTRY(MultiTexCoord2s),
TABLE_ENTRY(MultiTexCoord2sv),
TABLE_ENTRY(MultiTexCoord3d),
TABLE_ENTRY(MultiTexCoord3dv),
TABLE_ENTRY(MultiTexCoord3f),
TABLE_ENTRY(MultiTexCoord3fv),
TABLE_ENTRY(MultiTexCoord3i),
TABLE_ENTRY(MultiTexCoord3iv),
TABLE_ENTRY(MultiTexCoord3s),
TABLE_ENTRY(MultiTexCoord3sv),
TABLE_ENTRY(MultiTexCoord4d),
TABLE_ENTRY(MultiTexCoord4dv),
TABLE_ENTRY(MultiTexCoord4f),
TABLE_ENTRY(MultiTexCoord4fv),
TABLE_ENTRY(MultiTexCoord4i),
TABLE_ENTRY(MultiTexCoord4iv),
TABLE_ENTRY(MultiTexCoord4s),
TABLE_ENTRY(MultiTexCoord4sv),
TABLE_ENTRY(LoadTransposeMatrixf),
TABLE_ENTRY(LoadTransposeMatrixd),
TABLE_ENTRY(MultTransposeMatrixf),
TABLE_ENTRY(MultTransposeMatrixd),
TABLE_ENTRY(SampleCoverage),
TABLE_ENTRY(CompressedTexImage3D),
TABLE_ENTRY(CompressedTexImage2D),
TABLE_ENTRY(CompressedTexImage1D),
TABLE_ENTRY(CompressedTexSubImage3D),
TABLE_ENTRY(CompressedTexSubImage2D),
TABLE_ENTRY(CompressedTexSubImage1D),
TABLE_ENTRY(GetCompressedTexImage),
TABLE_ENTRY(BlendColorEXT),
TABLE_ENTRY(TexImage3DEXT),
TABLE_ENTRY(TexSubImage3DEXT),
TABLE_ENTRY(TexSubImage1DEXT),
TABLE_ENTRY(TexSubImage2DEXT),
TABLE_ENTRY(CopyTexImage1DEXT),
TABLE_ENTRY(CopyTexImage2DEXT),
TABLE_ENTRY(CopyTexSubImage1DEXT),
TABLE_ENTRY(CopyTexSubImage2DEXT),
TABLE_ENTRY(CopyTexSubImage3DEXT),
TABLE_ENTRY(HistogramEXT),
TABLE_ENTRY(MinmaxEXT),
TABLE_ENTRY(ResetHistogramEXT),
TABLE_ENTRY(ResetMinmaxEXT),
TABLE_ENTRY(ConvolutionFilter1DEXT),
TABLE_ENTRY(ConvolutionFilter2DEXT),
TABLE_ENTRY(ConvolutionParameterfEXT),
TABLE_ENTRY(ConvolutionParameterfvEXT),
TABLE_ENTRY(ConvolutionParameteriEXT),
TABLE_ENTRY(ConvolutionParameterivEXT),
TABLE_ENTRY(CopyConvolutionFilter1DEXT),
TABLE_ENTRY(CopyConvolutionFilter2DEXT),
TABLE_ENTRY(SeparableFilter2DEXT),
TABLE_ENTRY(ColorTableSGI),
TABLE_ENTRY(ColorTableParameterfvSGI),
TABLE_ENTRY(ColorTableParameterivSGI),
TABLE_ENTRY(CopyColorTableSGI),
TABLE_ENTRY(BindTextureEXT),
TABLE_ENTRY(DeleteTexturesEXT),
TABLE_ENTRY(PrioritizeTexturesEXT),
TABLE_ENTRY(ArrayElementEXT),
TABLE_ENTRY(DrawArraysEXT),
TABLE_ENTRY(GetPointervEXT),
TABLE_ENTRY(BlendEquationEXT),
TABLE_ENTRY(PointParameterfARB),
TABLE_ENTRY(PointParameterfvARB),
TABLE_ENTRY(PointParameterfSGIS),
TABLE_ENTRY(PointParameterfvSGIS),
TABLE_ENTRY(ColorSubTableEXT),
TABLE_ENTRY(CopyColorSubTableEXT),
TABLE_ENTRY(ColorTableEXT),
TABLE_ENTRY(DrawRangeElementsEXT),
TABLE_ENTRY(BlendFuncSeparateINGR),
TABLE_ENTRY(SampleMaskEXT),
TABLE_ENTRY(SamplePatternEXT),
TABLE_ENTRY(WindowPos2dARB),
TABLE_ENTRY(WindowPos2fARB),
TABLE_ENTRY(WindowPos2iARB),
TABLE_ENTRY(WindowPos2sARB),
TABLE_ENTRY(WindowPos2dvARB),
TABLE_ENTRY(WindowPos2fvARB),
TABLE_ENTRY(WindowPos2ivARB),
TABLE_ENTRY(WindowPos2svARB),
TABLE_ENTRY(WindowPos3dARB),
TABLE_ENTRY(WindowPos3fARB),
TABLE_ENTRY(WindowPos3iARB),
TABLE_ENTRY(WindowPos3sARB),
TABLE_ENTRY(WindowPos3dvARB),
TABLE_ENTRY(WindowPos3fvARB),
TABLE_ENTRY(WindowPos3ivARB),
TABLE_ENTRY(WindowPos3svARB),
TABLE_ENTRY(BlendFuncSeparate),
TABLE_ENTRY(FogCoordf),
TABLE_ENTRY(FogCoordfv),
TABLE_ENTRY(FogCoordd),
TABLE_ENTRY(FogCoorddv),
TABLE_ENTRY(FogCoordPointer),
TABLE_ENTRY(MultiDrawArrays),
TABLE_ENTRY(MultiDrawElements),
TABLE_ENTRY(PointParameterf),
TABLE_ENTRY(PointParameterfv),
TABLE_ENTRY(PointParameteri),
TABLE_ENTRY(PointParameteriv),
TABLE_ENTRY(SecondaryColor3b),
TABLE_ENTRY(SecondaryColor3bv),
TABLE_ENTRY(SecondaryColor3d),
TABLE_ENTRY(SecondaryColor3dv),
TABLE_ENTRY(SecondaryColor3f),
TABLE_ENTRY(SecondaryColor3fv),
TABLE_ENTRY(SecondaryColor3i),
TABLE_ENTRY(SecondaryColor3iv),
TABLE_ENTRY(SecondaryColor3s),
TABLE_ENTRY(SecondaryColor3sv),
TABLE_ENTRY(SecondaryColor3ub),
TABLE_ENTRY(SecondaryColor3ubv),
TABLE_ENTRY(SecondaryColor3ui),
TABLE_ENTRY(SecondaryColor3uiv),
TABLE_ENTRY(SecondaryColor3us),
TABLE_ENTRY(SecondaryColor3usv),
TABLE_ENTRY(SecondaryColorPointer),
TABLE_ENTRY(WindowPos2d),
TABLE_ENTRY(WindowPos2dv),
TABLE_ENTRY(WindowPos2f),
TABLE_ENTRY(WindowPos2fv),
TABLE_ENTRY(WindowPos2i),
TABLE_ENTRY(WindowPos2iv),
TABLE_ENTRY(WindowPos2s),
TABLE_ENTRY(WindowPos2sv),
TABLE_ENTRY(WindowPos3d),
TABLE_ENTRY(WindowPos3dv),
TABLE_ENTRY(WindowPos3f),
TABLE_ENTRY(WindowPos3fv),
TABLE_ENTRY(WindowPos3i),
TABLE_ENTRY(WindowPos3iv),
TABLE_ENTRY(WindowPos3s),
TABLE_ENTRY(WindowPos3sv),
};
#endif /*UNUSED_TABLE_NAME*/
 
 
#undef KEYWORD1
#undef KEYWORD2
#undef NAME
#undef DISPATCH
#undef RETURN_DISPATCH
#undef DISPATCH_TABLE_NAME
#undef UNUSED_TABLE_NAME
#undef TABLE_ENTRY
 
/shark/trunk/ports/mesa/src/eval.c
0,0 → 1,799
/* $Id: eval.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
/*
* eval.c was written by
* Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
* Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
*
* My original implementation of evaluators was simplistic and didn't
* compute surface normal vectors properly. Bernd and Volker applied
* used more sophisticated methods to get better results.
*
* Thanks guys!
*/
 
 
#include "glheader.h"
#include "imports.h"
#include "colormac.h"
#include "context.h"
#include "eval.h"
#include "macros.h"
#include "mmath.h"
#include "mtypes.h"
 
 
/*
* Return the number of components per control point for any type of
* evaluator. Return 0 if bad target.
* See table 5.1 in the OpenGL 1.2 spec.
*/
GLuint _mesa_evaluator_components( GLenum target )
{
switch (target) {
case GL_MAP1_VERTEX_3: return 3;
case GL_MAP1_VERTEX_4: return 4;
case GL_MAP1_INDEX: return 1;
case GL_MAP1_COLOR_4: return 4;
case GL_MAP1_NORMAL: return 3;
case GL_MAP1_TEXTURE_COORD_1: return 1;
case GL_MAP1_TEXTURE_COORD_2: return 2;
case GL_MAP1_TEXTURE_COORD_3: return 3;
case GL_MAP1_TEXTURE_COORD_4: return 4;
case GL_MAP2_VERTEX_3: return 3;
case GL_MAP2_VERTEX_4: return 4;
case GL_MAP2_INDEX: return 1;
case GL_MAP2_COLOR_4: return 4;
case GL_MAP2_NORMAL: return 3;
case GL_MAP2_TEXTURE_COORD_1: return 1;
case GL_MAP2_TEXTURE_COORD_2: return 2;
case GL_MAP2_TEXTURE_COORD_3: return 3;
case GL_MAP2_TEXTURE_COORD_4: return 4;
default: break;
}
 
/* XXX need to check for the vertex program extension
if (!ctx->Extensions.NV_vertex_program)
return 0;
*/
 
if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV &&
target <= GL_MAP1_VERTEX_ATTRIB15_4_NV)
return 4;
 
if (target >= GL_MAP2_VERTEX_ATTRIB0_4_NV &&
target <= GL_MAP2_VERTEX_ATTRIB15_4_NV)
return 4;
 
return 0;
}
 
 
/*
* Return pointer to the gl_1d_map struct for the named target.
*/
static struct gl_1d_map *
get_1d_map( GLcontext *ctx, GLenum target )
{
switch (target) {
case GL_MAP1_VERTEX_3:
return &ctx->EvalMap.Map1Vertex3;
case GL_MAP1_VERTEX_4:
return &ctx->EvalMap.Map1Vertex4;
case GL_MAP1_INDEX:
return &ctx->EvalMap.Map1Index;
case GL_MAP1_COLOR_4:
return &ctx->EvalMap.Map1Color4;
case GL_MAP1_NORMAL:
return &ctx->EvalMap.Map1Normal;
case GL_MAP1_TEXTURE_COORD_1:
return &ctx->EvalMap.Map1Texture1;
case GL_MAP1_TEXTURE_COORD_2:
return &ctx->EvalMap.Map1Texture2;
case GL_MAP1_TEXTURE_COORD_3:
return &ctx->EvalMap.Map1Texture3;
case GL_MAP1_TEXTURE_COORD_4:
return &ctx->EvalMap.Map1Texture4;
case GL_MAP1_VERTEX_ATTRIB0_4_NV:
case GL_MAP1_VERTEX_ATTRIB1_4_NV:
case GL_MAP1_VERTEX_ATTRIB2_4_NV:
case GL_MAP1_VERTEX_ATTRIB3_4_NV:
case GL_MAP1_VERTEX_ATTRIB4_4_NV:
case GL_MAP1_VERTEX_ATTRIB5_4_NV:
case GL_MAP1_VERTEX_ATTRIB6_4_NV:
case GL_MAP1_VERTEX_ATTRIB7_4_NV:
case GL_MAP1_VERTEX_ATTRIB8_4_NV:
case GL_MAP1_VERTEX_ATTRIB9_4_NV:
case GL_MAP1_VERTEX_ATTRIB10_4_NV:
case GL_MAP1_VERTEX_ATTRIB11_4_NV:
case GL_MAP1_VERTEX_ATTRIB12_4_NV:
case GL_MAP1_VERTEX_ATTRIB13_4_NV:
case GL_MAP1_VERTEX_ATTRIB14_4_NV:
case GL_MAP1_VERTEX_ATTRIB15_4_NV:
if (!ctx->Extensions.NV_vertex_program)
return NULL;
return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV];
default:
return NULL;
}
}
 
 
/*
* Return pointer to the gl_2d_map struct for the named target.
*/
static struct gl_2d_map *
get_2d_map( GLcontext *ctx, GLenum target )
{
switch (target) {
case GL_MAP2_VERTEX_3:
return &ctx->EvalMap.Map2Vertex3;
case GL_MAP2_VERTEX_4:
return &ctx->EvalMap.Map2Vertex4;
case GL_MAP2_INDEX:
return &ctx->EvalMap.Map2Index;
case GL_MAP2_COLOR_4:
return &ctx->EvalMap.Map2Color4;
case GL_MAP2_NORMAL:
return &ctx->EvalMap.Map2Normal;
case GL_MAP2_TEXTURE_COORD_1:
return &ctx->EvalMap.Map2Texture1;
case GL_MAP2_TEXTURE_COORD_2:
return &ctx->EvalMap.Map2Texture2;
case GL_MAP2_TEXTURE_COORD_3:
return &ctx->EvalMap.Map2Texture3;
case GL_MAP2_TEXTURE_COORD_4:
return &ctx->EvalMap.Map2Texture4;
case GL_MAP2_VERTEX_ATTRIB0_4_NV:
case GL_MAP2_VERTEX_ATTRIB1_4_NV:
case GL_MAP2_VERTEX_ATTRIB2_4_NV:
case GL_MAP2_VERTEX_ATTRIB3_4_NV:
case GL_MAP2_VERTEX_ATTRIB4_4_NV:
case GL_MAP2_VERTEX_ATTRIB5_4_NV:
case GL_MAP2_VERTEX_ATTRIB6_4_NV:
case GL_MAP2_VERTEX_ATTRIB7_4_NV:
case GL_MAP2_VERTEX_ATTRIB8_4_NV:
case GL_MAP2_VERTEX_ATTRIB9_4_NV:
case GL_MAP2_VERTEX_ATTRIB10_4_NV:
case GL_MAP2_VERTEX_ATTRIB11_4_NV:
case GL_MAP2_VERTEX_ATTRIB12_4_NV:
case GL_MAP2_VERTEX_ATTRIB13_4_NV:
case GL_MAP2_VERTEX_ATTRIB14_4_NV:
case GL_MAP2_VERTEX_ATTRIB15_4_NV:
if (!ctx->Extensions.NV_vertex_program)
return NULL;
return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV];
default:
return NULL;
}
}
 
 
/**********************************************************************/
/*** Copy and deallocate control points ***/
/**********************************************************************/
 
 
/*
* Copy 1-parametric evaluator control points from user-specified
* memory space to a buffer of contiguous control points.
* Input: see glMap1f for details
* Return: pointer to buffer of contiguous control points or NULL if out
* of memory.
*/
GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
const GLfloat *points )
{
GLfloat *buffer, *p;
GLint i, k, size = _mesa_evaluator_components(target);
 
if (!points || !size)
return NULL;
 
buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
 
if (buffer)
for (i = 0, p = buffer; i < uorder; i++, points += ustride)
for (k = 0; k < size; k++)
*p++ = points[k];
 
return buffer;
}
 
 
 
/*
* Same as above but convert doubles to floats.
*/
GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
const GLdouble *points )
{
GLfloat *buffer, *p;
GLint i, k, size = _mesa_evaluator_components(target);
 
if (!points || !size)
return NULL;
 
buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
 
if (buffer)
for (i = 0, p = buffer; i < uorder; i++, points += ustride)
for (k = 0; k < size; k++)
*p++ = (GLfloat) points[k];
 
return buffer;
}
 
 
 
/*
* Copy 2-parametric evaluator control points from user-specified
* memory space to a buffer of contiguous control points.
* Additional memory is allocated to be used by the horner and
* de Casteljau evaluation schemes.
*
* Input: see glMap2f for details
* Return: pointer to buffer of contiguous control points or NULL if out
* of memory.
*/
GLfloat *_mesa_copy_map_points2f( GLenum target,
GLint ustride, GLint uorder,
GLint vstride, GLint vorder,
const GLfloat *points )
{
GLfloat *buffer, *p;
GLint i, j, k, size, dsize, hsize;
GLint uinc;
 
size = _mesa_evaluator_components(target);
 
if (!points || size==0) {
return NULL;
}
 
/* max(uorder, vorder) additional points are used in */
/* horner evaluation and uorder*vorder additional */
/* values are needed for de Casteljau */
dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
hsize = (uorder > vorder ? uorder : vorder)*size;
 
if(hsize>dsize)
buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
else
buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
 
/* compute the increment value for the u-loop */
uinc = ustride - vorder*vstride;
 
if (buffer)
for (i=0, p=buffer; i<uorder; i++, points += uinc)
for (j=0; j<vorder; j++, points += vstride)
for (k=0; k<size; k++)
*p++ = points[k];
 
return buffer;
}
 
 
 
/*
* Same as above but convert doubles to floats.
*/
GLfloat *_mesa_copy_map_points2d(GLenum target,
GLint ustride, GLint uorder,
GLint vstride, GLint vorder,
const GLdouble *points )
{
GLfloat *buffer, *p;
GLint i, j, k, size, hsize, dsize;
GLint uinc;
 
size = _mesa_evaluator_components(target);
 
if (!points || size==0) {
return NULL;
}
 
/* max(uorder, vorder) additional points are used in */
/* horner evaluation and uorder*vorder additional */
/* values are needed for de Casteljau */
dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
hsize = (uorder > vorder ? uorder : vorder)*size;
 
if(hsize>dsize)
buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
else
buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
 
/* compute the increment value for the u-loop */
uinc = ustride - vorder*vstride;
 
if (buffer)
for (i=0, p=buffer; i<uorder; i++, points += uinc)
for (j=0; j<vorder; j++, points += vstride)
for (k=0; k<size; k++)
*p++ = (GLfloat) points[k];
 
return buffer;
}
 
 
 
 
/**********************************************************************/
/*** API entry points ***/
/**********************************************************************/
 
 
/*
* This does the work of glMap1[fd].
*/
static void
map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
GLint uorder, const GLvoid *points, GLenum type )
{
GET_CURRENT_CONTEXT(ctx);
GLint k;
GLfloat *pnts;
struct gl_1d_map *map = NULL;
 
ASSERT_OUTSIDE_BEGIN_END(ctx);
ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
 
if (u1 == u2) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
return;
}
if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
return;
}
if (!points) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
return;
}
 
k = _mesa_evaluator_components( target );
if (k == 0) {
_mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
}
 
if (ustride < k) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
return;
}
 
if (ctx->Texture.CurrentUnit != 0) {
/* See OpenGL 1.2.1 spec, section F.2.13 */
_mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
return;
}
 
map = get_1d_map(ctx, target);
if (!map) {
_mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
return;
}
 
/* make copy of the control points */
if (type == GL_FLOAT)
pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
else
pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
 
 
FLUSH_VERTICES(ctx, _NEW_EVAL);
map->Order = uorder;
map->u1 = u1;
map->u2 = u2;
map->du = 1.0F / (u2 - u1);
if (map->Points)
FREE( map->Points );
map->Points = pnts;
}
 
 
 
void
_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
GLint order, const GLfloat *points )
{
map1(target, u1, u2, stride, order, points, GL_FLOAT);
}
 
 
void
_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
GLint order, const GLdouble *points )
{
map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
}
 
 
static void
map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
const GLvoid *points, GLenum type )
{
GET_CURRENT_CONTEXT(ctx);
GLint k;
GLfloat *pnts;
struct gl_2d_map *map = NULL;
 
ASSERT_OUTSIDE_BEGIN_END(ctx);
ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
 
if (u1==u2) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
return;
}
 
if (v1==v2) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
return;
}
 
if (uorder<1 || uorder>MAX_EVAL_ORDER) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
return;
}
 
if (vorder<1 || vorder>MAX_EVAL_ORDER) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
return;
}
 
k = _mesa_evaluator_components( target );
if (k==0) {
_mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
}
 
if (ustride < k) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
return;
}
if (vstride < k) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
return;
}
 
if (ctx->Texture.CurrentUnit != 0) {
/* See OpenGL 1.2.1 spec, section F.2.13 */
_mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
return;
}
 
map = get_2d_map(ctx, target);
if (!map) {
_mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
return;
}
 
/* make copy of the control points */
if (type == GL_FLOAT)
pnts = _mesa_copy_map_points2f(target, ustride, uorder,
vstride, vorder, (GLfloat*) points);
else
pnts = _mesa_copy_map_points2d(target, ustride, uorder,
vstride, vorder, (GLdouble*) points);
 
 
FLUSH_VERTICES(ctx, _NEW_EVAL);
map->Uorder = uorder;
map->u1 = u1;
map->u2 = u2;
map->du = 1.0F / (u2 - u1);
map->Vorder = vorder;
map->v1 = v1;
map->v2 = v2;
map->dv = 1.0F / (v2 - v1);
if (map->Points)
FREE( map->Points );
map->Points = pnts;
}
 
 
void
_mesa_Map2f( GLenum target,
GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
const GLfloat *points)
{
map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
points, GL_FLOAT);
}
 
 
void
_mesa_Map2d( GLenum target,
GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
const GLdouble *points )
{
map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
(GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
}
 
 
 
void
_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_1d_map *map1d;
struct gl_2d_map *map2d;
GLint i, n;
GLfloat *data;
GLuint comps;
 
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
comps = _mesa_evaluator_components(target);
if (!comps) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
return;
}
 
map1d = get_1d_map(ctx, target);
map2d = get_2d_map(ctx, target);
ASSERT(map1d || map2d);
 
switch (query) {
case GL_COEFF:
if (map1d) {
data = map1d->Points;
n = map1d->Order * comps;
}
else {
data = map2d->Points;
n = map2d->Uorder * map2d->Vorder * comps;
}
if (data) {
for (i=0;i<n;i++) {
v[i] = data[i];
}
}
break;
case GL_ORDER:
if (map1d) {
v[0] = (GLdouble) map1d->Order;
}
else {
v[0] = (GLdouble) map2d->Uorder;
v[1] = (GLdouble) map2d->Vorder;
}
break;
case GL_DOMAIN:
if (map1d) {
v[0] = (GLdouble) map1d->u1;
v[1] = (GLdouble) map1d->u2;
}
else {
v[0] = (GLdouble) map2d->u1;
v[1] = (GLdouble) map2d->u2;
v[2] = (GLdouble) map2d->v1;
v[3] = (GLdouble) map2d->v2;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
}
}
 
 
void
_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_1d_map *map1d;
struct gl_2d_map *map2d;
GLint i, n;
GLfloat *data;
GLuint comps;
 
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
comps = _mesa_evaluator_components(target);
if (!comps) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
return;
}
 
map1d = get_1d_map(ctx, target);
map2d = get_2d_map(ctx, target);
ASSERT(map1d || map2d);
 
switch (query) {
case GL_COEFF:
if (map1d) {
data = map1d->Points;
n = map1d->Order * comps;
}
else {
data = map2d->Points;
n = map2d->Uorder * map2d->Vorder * comps;
}
if (data) {
for (i=0;i<n;i++) {
v[i] = data[i];
}
}
break;
case GL_ORDER:
if (map1d) {
v[0] = (GLfloat) map1d->Order;
}
else {
v[0] = (GLfloat) map2d->Uorder;
v[1] = (GLfloat) map2d->Vorder;
}
break;
case GL_DOMAIN:
if (map1d) {
v[0] = map1d->u1;
v[1] = map1d->u2;
}
else {
v[0] = map2d->u1;
v[1] = map2d->u2;
v[2] = map2d->v1;
v[3] = map2d->v2;
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
}
}
 
 
void
_mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
{
GET_CURRENT_CONTEXT(ctx);
struct gl_1d_map *map1d;
struct gl_2d_map *map2d;
GLuint i, n;
GLfloat *data;
GLuint comps;
 
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
comps = _mesa_evaluator_components(target);
if (!comps) {
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
return;
}
 
map1d = get_1d_map(ctx, target);
map2d = get_2d_map(ctx, target);
ASSERT(map1d || map2d);
 
switch (query) {
case GL_COEFF:
if (map1d) {
data = map1d->Points;
n = map1d->Order * comps;
}
else {
data = map2d->Points;
n = map2d->Uorder * map2d->Vorder * comps;
}
if (data) {
for (i=0;i<n;i++) {
v[i] = ROUNDF(data[i]);
}
}
break;
case GL_ORDER:
if (map1d) {
v[0] = map1d->Order;
}
else {
v[0] = map2d->Uorder;
v[1] = map2d->Vorder;
}
break;
case GL_DOMAIN:
if (map1d) {
v[0] = ROUNDF(map1d->u1);
v[1] = ROUNDF(map1d->u2);
}
else {
v[0] = ROUNDF(map2d->u1);
v[1] = ROUNDF(map2d->u2);
v[2] = ROUNDF(map2d->v1);
v[3] = ROUNDF(map2d->v2);
}
break;
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
}
}
 
 
 
void
_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (un<1) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
return;
}
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.MapGrid1un = un;
ctx->Eval.MapGrid1u1 = u1;
ctx->Eval.MapGrid1u2 = u2;
ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
}
 
 
void
_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
{
_mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
}
 
 
void
_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
GLint vn, GLfloat v1, GLfloat v2 )
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (un<1) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
return;
}
if (vn<1) {
_mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
return;
}
 
FLUSH_VERTICES(ctx, _NEW_EVAL);
ctx->Eval.MapGrid2un = un;
ctx->Eval.MapGrid2u1 = u1;
ctx->Eval.MapGrid2u2 = u2;
ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
ctx->Eval.MapGrid2vn = vn;
ctx->Eval.MapGrid2v1 = v1;
ctx->Eval.MapGrid2v2 = v2;
ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
}
 
 
void
_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
GLint vn, GLdouble v1, GLdouble v2 )
{
_mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2,
vn, (GLfloat) v1, (GLfloat) v2 );
}
/shark/trunk/ports/mesa/src/context.h
0,0 → 1,240
/* $Id: context.h,v 1.1 2003-02-28 11:41:59 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef CONTEXT_H
#define CONTEXT_H
 
 
#include "glapi.h"
#include "mtypes.h"
 
 
/*
* There are three Mesa datatypes which are meant to be used by device
* drivers:
* GLcontext: this contains the Mesa rendering state
* GLvisual: this describes the color buffer (rgb vs. ci), whether
* or not there's a depth buffer, stencil buffer, etc.
* GLframebuffer: contains pointers to the depth buffer, stencil
* buffer, accum buffer and alpha buffers.
*
* These types should be encapsulated by corresponding device driver
* datatypes. See xmesa.h and xmesaP.h for an example.
*
* In OOP terms, GLcontext, GLvisual, and GLframebuffer are base classes
* which the device driver must derive from.
*
* The following functions create and destroy these datatypes.
*/
 
 
/*
* Create/destroy a GLvisual.
*/
extern GLvisual *
_mesa_create_visual( GLboolean rgbFlag,
GLboolean dbFlag,
GLboolean stereoFlag,
GLint redBits,
GLint greenBits,
GLint blueBits,
GLint alphaBits,
GLint indexBits,
GLint depthBits,
GLint stencilBits,
GLint accumRedBits,
GLint accumGreenBits,
GLint accumBlueBits,
GLint accumAlphaBits,
GLint numSamples );
 
extern GLboolean
_mesa_initialize_visual( GLvisual *v,
GLboolean rgbFlag,
GLboolean dbFlag,
GLboolean stereoFlag,
GLint redBits,
GLint greenBits,
GLint blueBits,
GLint alphaBits,
GLint indexBits,
GLint depthBits,
GLint stencilBits,
GLint accumRedBits,
GLint accumGreenBits,
GLint accumBlueBits,
GLint accumAlphaBits,
GLint numSamples );
 
extern void
_mesa_destroy_visual( GLvisual *vis );
 
 
 
/*
* Create/destroy a GLframebuffer.
*/
extern GLframebuffer *
_mesa_create_framebuffer( const GLvisual *visual,
GLboolean softwareDepth,
GLboolean softwareStencil,
GLboolean softwareAccum,
GLboolean softwareAlpha );
 
extern void
_mesa_initialize_framebuffer( GLframebuffer *fb,
const GLvisual *visual,
GLboolean softwareDepth,
GLboolean softwareStencil,
GLboolean softwareAccum,
GLboolean softwareAlpha );
 
extern void
_mesa_free_framebuffer_data( GLframebuffer *buffer );
 
extern void
_mesa_destroy_framebuffer( GLframebuffer *buffer );
 
 
 
/*
* Create/destroy a GLcontext.
*/
extern GLcontext *
_mesa_create_context( const GLvisual *visual,
GLcontext *share_list,
void *driver_ctx,
GLboolean direct );
 
extern GLboolean
_mesa_initialize_context( GLcontext *ctx,
const GLvisual *visual,
GLcontext *share_list,
void *driver_ctx,
GLboolean direct );
 
extern void
_mesa_free_context_data( GLcontext *ctx );
 
extern void
_mesa_destroy_context( GLcontext *ctx );
 
 
extern void
_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask);
 
 
extern void
_mesa_make_current( GLcontext *ctx, GLframebuffer *buffer );
 
 
extern void
_mesa_make_current2( GLcontext *ctx, GLframebuffer *drawBuffer,
GLframebuffer *readBuffer );
 
 
extern GLcontext *
_mesa_get_current_context(void);
 
 
 
/*
* Macros for fetching current context.
*/
#ifdef THREADS
 
#define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context())
 
#else
 
#define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_Context
 
#endif
 
 
 
/* OpenGL SI-style export functions. */
 
extern GLboolean
_mesa_destroyContext(__GLcontext *gc);
 
extern GLboolean
_mesa_loseCurrent(__GLcontext *gc);
 
extern GLboolean
_mesa_makeCurrent(__GLcontext *gc);
 
extern GLboolean
_mesa_shareContext(__GLcontext *gc, __GLcontext *gcShare);
 
extern GLboolean
_mesa_copyContext(__GLcontext *dst, const __GLcontext *src, GLuint mask);
 
extern GLboolean
_mesa_forceCurrent(__GLcontext *gc);
 
extern GLboolean
_mesa_notifyResize(__GLcontext *gc);
 
extern void
_mesa_notifyDestroy(__GLcontext *gc);
 
extern void
_mesa_notifySwapBuffers(__GLcontext *gc);
 
extern struct __GLdispatchStateRec *
_mesa_dispatchExec(__GLcontext *gc);
 
extern void
_mesa_beginDispatchOverride(__GLcontext *gc);
 
extern void
_mesa_endDispatchOverride(__GLcontext *gc);
 
 
 
extern struct _glapi_table *
_mesa_get_dispatch(GLcontext *ctx);
 
 
 
/*
* Miscellaneous
*/
 
extern void
_mesa_record_error( GLcontext *ctx, GLenum error );
 
 
extern void
_mesa_Finish( void );
 
extern void
_mesa_Flush( void );
 
 
#endif
/shark/trunk/ports/mesa/src/enable.h
0,0 → 1,54
/* $Id: enable.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef ENABLE_H
#define ENABLE_H
 
 
#include "mtypes.h"
 
 
extern void
_mesa_set_enable( GLcontext* ctx, GLenum cap, GLboolean state );
 
extern void
_mesa_Disable( GLenum cap );
 
extern void
_mesa_Enable( GLenum cap );
 
extern GLboolean
_mesa_IsEnabled( GLenum cap );
 
extern void
_mesa_EnableClientState( GLenum cap );
 
extern void
_mesa_DisableClientState( GLenum cap );
 
 
#endif
/shark/trunk/ports/mesa/src/eval.h
0,0 → 1,109
/* $Id: eval.h,v 1.1 2003-02-28 11:42:00 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#ifndef EVAL_H
#define EVAL_H
 
 
#include "mtypes.h"
 
 
extern void _mesa_init_eval( void );
 
 
extern GLuint _mesa_evaluator_components( GLenum target );
 
 
extern void gl_free_control_points( GLcontext *ctx,
GLenum target, GLfloat *data );
 
 
extern GLfloat *_mesa_copy_map_points1f( GLenum target,
GLint ustride, GLint uorder,
const GLfloat *points );
 
extern GLfloat *_mesa_copy_map_points1d( GLenum target,
GLint ustride, GLint uorder,
const GLdouble *points );
 
extern GLfloat *_mesa_copy_map_points2f( GLenum target,
GLint ustride, GLint uorder,
GLint vstride, GLint vorder,
const GLfloat *points );
 
extern GLfloat *_mesa_copy_map_points2d(GLenum target,
GLint ustride, GLint uorder,
GLint vstride, GLint vorder,
const GLdouble *points );
 
 
 
extern void
_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
GLint order, const GLfloat *points );
 
extern void
_mesa_Map2f( GLenum target,
GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
const GLfloat *points );
 
extern void
_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
GLint order, const GLdouble *points );
 
extern void
_mesa_Map2d( GLenum target,
GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
const GLdouble *points );
 
extern void
_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 );
 
extern void
_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 );
 
extern void
_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
GLint vn, GLfloat v1, GLfloat v2 );
 
extern void
_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
GLint vn, GLdouble v1, GLdouble v2 );
 
extern void
_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v );
 
extern void
_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v );
 
extern void
_mesa_GetMapiv( GLenum target, GLenum query, GLint *v );
 
 
#endif
/shark/trunk/ports/mesa/src/histogram.c
0,0 → 1,1031
/* $Id: histogram.c,v 1.1 2003-02-28 11:42:02 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
 
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "image.h"
#include "histogram.h"
#include "mmath.h"
 
 
/*
* XXX the packed pixel formats haven't been tested.
*/
static void
pack_histogram( GLcontext *ctx,
GLuint n, CONST GLuint rgba[][4],
GLenum format, GLenum type, GLvoid *destination,
const struct gl_pixelstore_attrib *packing )
{
const GLint comps = _mesa_components_in_format(format);
GLuint luminance[MAX_WIDTH];
 
if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) {
GLuint i;
for (i = 0; i < n; i++) {
luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
}
}
 
#define PACK_MACRO(TYPE) \
{ \
GLuint i; \
switch (format) { \
case GL_RED: \
for (i=0;i<n;i++) \
dst[i] = (TYPE) rgba[i][RCOMP]; \
break; \
case GL_GREEN: \
for (i=0;i<n;i++) \
dst[i] = (TYPE) rgba[i][GCOMP]; \
break; \
case GL_BLUE: \
for (i=0;i<n;i++) \
dst[i] = (TYPE) rgba[i][BCOMP]; \
break; \
case GL_ALPHA: \
for (i=0;i<n;i++) \
dst[i] = (TYPE) rgba[i][ACOMP]; \
break; \
case GL_LUMINANCE: \
for (i=0;i<n;i++) \
dst[i] = (TYPE) luminance[i]; \
break; \
case GL_LUMINANCE_ALPHA: \
for (i=0;i<n;i++) { \
dst[i*2+0] = (TYPE) luminance[i]; \
dst[i*2+1] = (TYPE) rgba[i][ACOMP]; \
} \
break; \
case GL_RGB: \
for (i=0;i<n;i++) { \
dst[i*3+0] = (TYPE) rgba[i][RCOMP]; \
dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \
dst[i*3+2] = (TYPE) rgba[i][BCOMP]; \
} \
break; \
case GL_RGBA: \
for (i=0;i<n;i++) { \
dst[i*4+0] = (TYPE) rgba[i][RCOMP]; \
dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \
dst[i*4+2] = (TYPE) rgba[i][BCOMP]; \
dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \
} \
break; \
case GL_BGR: \
for (i=0;i<n;i++) { \
dst[i*3+0] = (TYPE) rgba[i][BCOMP]; \
dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \
dst[i*3+2] = (TYPE) rgba[i][RCOMP]; \
} \
break; \
case GL_BGRA: \
for (i=0;i<n;i++) { \
dst[i*4+0] = (TYPE) rgba[i][BCOMP]; \
dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \
dst[i*4+2] = (TYPE) rgba[i][RCOMP]; \
dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \
} \
break; \
case GL_ABGR_EXT: \
for (i=0;i<n;i++) { \
dst[i*4+0] = (TYPE) rgba[i][ACOMP]; \
dst[i*4+1] = (TYPE) rgba[i][BCOMP]; \
dst[i*4+2] = (TYPE) rgba[i][GCOMP]; \
dst[i*4+3] = (TYPE) rgba[i][RCOMP]; \
} \
break; \
default: \
_mesa_problem(ctx, "bad format in pack_histogram"); \
} \
}
 
switch (type) {
case GL_UNSIGNED_BYTE:
{
GLubyte *dst = (GLubyte *) destination;
PACK_MACRO(GLubyte);
}
break;
case GL_BYTE:
{
GLbyte *dst = (GLbyte *) destination;
PACK_MACRO(GLbyte);
}
break;
case GL_UNSIGNED_SHORT:
{
GLushort *dst = (GLushort *) destination;
PACK_MACRO(GLushort);
if (packing->SwapBytes) {
_mesa_swap2(dst, n * comps);
}
}
break;
case GL_SHORT:
{
GLshort *dst = (GLshort *) destination;
PACK_MACRO(GLshort);
if (packing->SwapBytes) {
_mesa_swap2((GLushort *) dst, n * comps);
}
}
break;
case GL_UNSIGNED_INT:
{
GLuint *dst = (GLuint *) destination;
PACK_MACRO(GLuint);
if (packing->SwapBytes) {
_mesa_swap4(dst, n * comps);
}
}
break;
case GL_INT:
{
GLint *dst = (GLint *) destination;
PACK_MACRO(GLint);
if (packing->SwapBytes) {
_mesa_swap4((GLuint *) dst, n * comps);
}
}
break;
case GL_FLOAT:
{
GLfloat *dst = (GLfloat *) destination;
PACK_MACRO(GLfloat);
if (packing->SwapBytes) {
_mesa_swap4((GLuint *) dst, n * comps);
}
}
break;
case GL_UNSIGNED_BYTE_3_3_2:
if (format == GL_RGB) {
GLubyte *dst = (GLubyte *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x7) << 5)
| ((rgba[i][GCOMP] & 0x7) << 2)
| ((rgba[i][BCOMP] & 0x3) );
}
}
else {
GLubyte *dst = (GLubyte *) destination;
GLuint i;
ASSERT(format == GL_BGR);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x7) << 5)
| ((rgba[i][GCOMP] & 0x7) << 2)
| ((rgba[i][RCOMP] & 0x3) );
}
}
break;
case GL_UNSIGNED_BYTE_2_3_3_REV:
if (format == GL_RGB) {
GLubyte *dst = (GLubyte *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x3) << 6)
| ((rgba[i][GCOMP] & 0x7) << 3)
| ((rgba[i][BCOMP] & 0x7) );
}
}
else {
GLubyte *dst = (GLubyte *) destination;
GLuint i;
ASSERT(format == GL_BGR);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x3) << 6)
| ((rgba[i][GCOMP] & 0x7) << 3)
| ((rgba[i][RCOMP] & 0x7) );
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5:
if (format == GL_RGB) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x3f) << 5)
| ((rgba[i][BCOMP] & 0x1f) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_BGR);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x3f) << 5)
| ((rgba[i][RCOMP] & 0x1f) );
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5_REV:
if (format == GL_RGB) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x3f) << 5)
| ((rgba[i][RCOMP] & 0x1f) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_BGR);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x3f) << 5)
| ((rgba[i][BCOMP] & 0x1f) );
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
| ((rgba[i][GCOMP] & 0xf) << 8)
| ((rgba[i][BCOMP] & 0xf) << 4)
| ((rgba[i][ACOMP] & 0xf) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0xf) << 12)
| ((rgba[i][GCOMP] & 0xf) << 8)
| ((rgba[i][RCOMP] & 0xf) << 4)
| ((rgba[i][ACOMP] & 0xf) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
| ((rgba[i][BCOMP] & 0xf) << 8)
| ((rgba[i][GCOMP] & 0xf) << 4)
| ((rgba[i][RCOMP] & 0xf) );
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
| ((rgba[i][BCOMP] & 0xf) << 8)
| ((rgba[i][GCOMP] & 0xf) << 4)
| ((rgba[i][RCOMP] & 0xf) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xf) << 12)
| ((rgba[i][RCOMP] & 0xf) << 8)
| ((rgba[i][GCOMP] & 0xf) << 4)
| ((rgba[i][BCOMP] & 0xf) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xf) << 12)
| ((rgba[i][GCOMP] & 0xf) << 8)
| ((rgba[i][BCOMP] & 0xf) << 4)
| ((rgba[i][ACOMP] & 0xf) );
}
}
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][BCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][RCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][BCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][RCOMP] & 0x1) );
}
}
break;
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (format == GL_RGBA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][BCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][RCOMP] & 0x1) );
}
}
else if (format == GL_BGRA) {
GLushort *dst = (GLushort *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11)
| ((rgba[i][RCOMP] & 0x1f) << 6)
| ((rgba[i][GCOMP] & 0x1f) << 1)
| ((rgba[i][BCOMP] & 0x1) );
}
}
else {
GLushort *dst = (GLushort *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11)
| ((rgba[i][GCOMP] & 0x1f) << 6)
| ((rgba[i][BCOMP] & 0x1f) << 1)
| ((rgba[i][ACOMP] & 0x1) );
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][BCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][RCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][BCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][RCOMP] & 0xff) );
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8_REV:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][BCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][RCOMP] & 0xff) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0xff) << 24)
| ((rgba[i][RCOMP] & 0xff) << 16)
| ((rgba[i][GCOMP] & 0xff) << 8)
| ((rgba[i][BCOMP] & 0xff) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0xff) << 24)
| ((rgba[i][GCOMP] & 0xff) << 16)
| ((rgba[i][BCOMP] & 0xff) << 8)
| ((rgba[i][ACOMP] & 0xff) );
}
}
break;
case GL_UNSIGNED_INT_10_10_10_2:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][BCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][RCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][BCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][RCOMP] & 0x3) );
}
}
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (format == GL_RGBA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][BCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][RCOMP] & 0x3) );
}
}
else if (format == GL_BGRA) {
GLuint *dst = (GLuint *) destination;
GLuint i;
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22)
| ((rgba[i][RCOMP] & 0x3ff) << 12)
| ((rgba[i][GCOMP] & 0x3ff) << 2)
| ((rgba[i][BCOMP] & 0x3) );
}
}
else {
GLuint *dst = (GLuint *) destination;
GLuint i;
ASSERT(format == GL_ABGR_EXT);
for (i = 0; i < n; i++) {
dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22)
| ((rgba[i][GCOMP] & 0x3ff) << 12)
| ((rgba[i][BCOMP] & 0x3ff) << 2)
| ((rgba[i][ACOMP] & 0x3) );
}
}
break;
default:
_mesa_problem(ctx, "Bad type in pack_histogram");
}
 
#undef PACK_MACRO
}
 
 
/*
* Given an internalFormat token passed to glHistogram or glMinMax,
* return the corresponding base format.
* Return -1 if invalid token.
*/
static GLint
base_histogram_format( GLenum format )
{
switch (format) {
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
return GL_ALPHA;
case GL_LUMINANCE:
case GL_LUMINANCE4:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4:
case GL_LUMINANCE6_ALPHA2:
case GL_LUMINANCE8_ALPHA8:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return GL_LUMINANCE_ALPHA;
case GL_RGB:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
case GL_RGB8:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
return GL_RGB;
case GL_RGBA:
case GL_RGBA2:
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
default:
return -1; /* error */
}
}
 
 
void
_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax");
return;
}
 
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(target)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmax(format or type)");
return;
}
 
if (type != GL_UNSIGNED_BYTE &&
type != GL_BYTE &&
type != GL_UNSIGNED_SHORT &&
type != GL_SHORT &&
type != GL_UNSIGNED_INT &&
type != GL_INT &&
type != GL_FLOAT &&
type != GL_UNSIGNED_BYTE_3_3_2 &&
type != GL_UNSIGNED_BYTE_2_3_3_REV &&
type != GL_UNSIGNED_SHORT_5_6_5 &&
type != GL_UNSIGNED_SHORT_5_6_5_REV &&
type != GL_UNSIGNED_SHORT_4_4_4_4 &&
type != GL_UNSIGNED_SHORT_4_4_4_4_REV &&
type != GL_UNSIGNED_SHORT_5_5_5_1 &&
type != GL_UNSIGNED_SHORT_1_5_5_5_REV &&
type != GL_UNSIGNED_INT_8_8_8_8 &&
type != GL_UNSIGNED_INT_8_8_8_8_REV &&
type != GL_UNSIGNED_INT_10_10_10_2 &&
type != GL_UNSIGNED_INT_2_10_10_10_REV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmax(type)");
return;
}
 
if (!values)
return;
 
{
GLfloat minmax[2][4];
minmax[0][RCOMP] = CLAMP(ctx->MinMax.Min[RCOMP], 0.0F, 1.0F);
minmax[0][GCOMP] = CLAMP(ctx->MinMax.Min[GCOMP], 0.0F, 1.0F);
minmax[0][BCOMP] = CLAMP(ctx->MinMax.Min[BCOMP], 0.0F, 1.0F);
minmax[0][ACOMP] = CLAMP(ctx->MinMax.Min[ACOMP], 0.0F, 1.0F);
minmax[1][RCOMP] = CLAMP(ctx->MinMax.Max[RCOMP], 0.0F, 1.0F);
minmax[1][GCOMP] = CLAMP(ctx->MinMax.Max[GCOMP], 0.0F, 1.0F);
minmax[1][BCOMP] = CLAMP(ctx->MinMax.Max[BCOMP], 0.0F, 1.0F);
minmax[1][ACOMP] = CLAMP(ctx->MinMax.Max[ACOMP], 0.0F, 1.0F);
_mesa_pack_float_rgba_span(ctx, 2, (CONST GLfloat (*)[4]) minmax,
format, type, values, &ctx->Pack, 0);
}
 
if (reset) {
_mesa_ResetMinmax(GL_MINMAX);
}
}
 
 
void
_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram");
return;
}
 
if (target != GL_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(target)");
return;
}
 
if (!_mesa_is_legal_format_and_type(format, type)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogram(format or type)");
return;
}
 
if (type != GL_UNSIGNED_BYTE &&
type != GL_BYTE &&
type != GL_UNSIGNED_SHORT &&
type != GL_SHORT &&
type != GL_UNSIGNED_INT &&
type != GL_INT &&
type != GL_FLOAT &&
type != GL_UNSIGNED_BYTE_3_3_2 &&
type != GL_UNSIGNED_BYTE_2_3_3_REV &&
type != GL_UNSIGNED_SHORT_5_6_5 &&
type != GL_UNSIGNED_SHORT_5_6_5_REV &&
type != GL_UNSIGNED_SHORT_4_4_4_4 &&
type != GL_UNSIGNED_SHORT_4_4_4_4_REV &&
type != GL_UNSIGNED_SHORT_5_5_5_1 &&
type != GL_UNSIGNED_SHORT_1_5_5_5_REV &&
type != GL_UNSIGNED_INT_8_8_8_8 &&
type != GL_UNSIGNED_INT_8_8_8_8_REV &&
type != GL_UNSIGNED_INT_10_10_10_2 &&
type != GL_UNSIGNED_INT_2_10_10_10_REV) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogram(type)");
return;
}
 
if (!values)
return;
 
pack_histogram(ctx, ctx->Histogram.Width,
(CONST GLuint (*)[4]) ctx->Histogram.Count,
format, type, values, &ctx->Pack);
 
if (reset) {
GLuint i;
for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
ctx->Histogram.Count[i][0] = 0;
ctx->Histogram.Count[i][1] = 0;
ctx->Histogram.Count[i][2] = 0;
ctx->Histogram.Count[i][3] = 0;
}
}
}
 
 
void
_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameterfv");
return;
}
 
if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(target)");
return;
}
 
switch (pname) {
case GL_HISTOGRAM_WIDTH:
*params = (GLfloat) ctx->Histogram.Width;
break;
case GL_HISTOGRAM_FORMAT:
*params = (GLfloat) ctx->Histogram.Format;
break;
case GL_HISTOGRAM_RED_SIZE:
*params = (GLfloat) ctx->Histogram.RedSize;
break;
case GL_HISTOGRAM_GREEN_SIZE:
*params = (GLfloat) ctx->Histogram.GreenSize;
break;
case GL_HISTOGRAM_BLUE_SIZE:
*params = (GLfloat) ctx->Histogram.BlueSize;
break;
case GL_HISTOGRAM_ALPHA_SIZE:
*params = (GLfloat) ctx->Histogram.AlphaSize;
break;
case GL_HISTOGRAM_LUMINANCE_SIZE:
*params = (GLfloat) ctx->Histogram.LuminanceSize;
break;
case GL_HISTOGRAM_SINK:
*params = (GLfloat) ctx->Histogram.Sink;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameterfv(pname)");
}
}
 
 
void
_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetHistogramParameteriv");
return;
}
 
if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(target)");
return;
}
 
switch (pname) {
case GL_HISTOGRAM_WIDTH:
*params = (GLint) ctx->Histogram.Width;
break;
case GL_HISTOGRAM_FORMAT:
*params = (GLint) ctx->Histogram.Format;
break;
case GL_HISTOGRAM_RED_SIZE:
*params = (GLint) ctx->Histogram.RedSize;
break;
case GL_HISTOGRAM_GREEN_SIZE:
*params = (GLint) ctx->Histogram.GreenSize;
break;
case GL_HISTOGRAM_BLUE_SIZE:
*params = (GLint) ctx->Histogram.BlueSize;
break;
case GL_HISTOGRAM_ALPHA_SIZE:
*params = (GLint) ctx->Histogram.AlphaSize;
break;
case GL_HISTOGRAM_LUMINANCE_SIZE:
*params = (GLint) ctx->Histogram.LuminanceSize;
break;
case GL_HISTOGRAM_SINK:
*params = (GLint) ctx->Histogram.Sink;
break;
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetHistogramParameteriv(pname)");
}
}
 
 
void
_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameterfv");
return;
}
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameterfv(target)");
return;
}
if (pname == GL_MINMAX_FORMAT) {
*params = (GLfloat) ctx->MinMax.Format;
}
else if (pname == GL_MINMAX_SINK) {
*params = (GLfloat) ctx->MinMax.Sink;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameterfv(pname)");
}
}
 
 
void
_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetMinmaxParameteriv");
return;
}
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinmaxParameteriv(target)");
return;
}
if (pname == GL_MINMAX_FORMAT) {
*params = (GLint) ctx->MinMax.Format;
}
else if (pname == GL_MINMAX_SINK) {
*params = (GLint) ctx->MinMax.Sink;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetMinMaxParameteriv(pname)");
}
}
 
 
void
_mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink)
{
GLuint i;
GLboolean error = GL_FALSE;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glHistogram");
return;
}
 
if (target != GL_HISTOGRAM && target != GL_PROXY_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(target)");
return;
}
 
if (width < 0 || width > HISTOGRAM_TABLE_SIZE) {
if (target == GL_PROXY_HISTOGRAM) {
error = GL_TRUE;
}
else {
if (width < 0)
_mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
else
_mesa_error(ctx, GL_TABLE_TOO_LARGE, "glHistogram(width)");
return;
}
}
 
if (width != 0 && _mesa_bitcount(width) != 1) {
if (target == GL_PROXY_HISTOGRAM) {
error = GL_TRUE;
}
else {
_mesa_error(ctx, GL_INVALID_VALUE, "glHistogram(width)");
return;
}
}
 
if (base_histogram_format(internalFormat) < 0) {
if (target == GL_PROXY_HISTOGRAM) {
error = GL_TRUE;
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glHistogram(internalFormat)");
return;
}
}
 
/* reset histograms */
for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
ctx->Histogram.Count[i][0] = 0;
ctx->Histogram.Count[i][1] = 0;
ctx->Histogram.Count[i][2] = 0;
ctx->Histogram.Count[i][3] = 0;
}
 
if (error) {
ctx->Histogram.Width = 0;
ctx->Histogram.Format = 0;
ctx->Histogram.RedSize = 0;
ctx->Histogram.GreenSize = 0;
ctx->Histogram.BlueSize = 0;
ctx->Histogram.AlphaSize = 0;
ctx->Histogram.LuminanceSize = 0;
}
else {
ctx->Histogram.Width = width;
ctx->Histogram.Format = internalFormat;
ctx->Histogram.Sink = sink;
ctx->Histogram.RedSize = 8 * sizeof(GLuint);
ctx->Histogram.GreenSize = 8 * sizeof(GLuint);
ctx->Histogram.BlueSize = 8 * sizeof(GLuint);
ctx->Histogram.AlphaSize = 8 * sizeof(GLuint);
ctx->Histogram.LuminanceSize = 8 * sizeof(GLuint);
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glMinmax");
return;
}
 
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(target)");
return;
}
 
if (base_histogram_format(internalFormat) < 0) {
_mesa_error(ctx, GL_INVALID_ENUM, "glMinMax(internalFormat)");
return;
}
 
if (ctx->MinMax.Sink == sink)
return;
FLUSH_VERTICES(ctx, _NEW_PIXEL);
ctx->MinMax.Sink = sink;
}
 
 
void
_mesa_ResetHistogram(GLenum target)
{
GLuint i;
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* sideeffects */
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glResetHistogram");
return;
}
 
if (target != GL_HISTOGRAM) {
_mesa_error(ctx, GL_INVALID_ENUM, "glResetHistogram(target)");
return;
}
 
for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
ctx->Histogram.Count[i][0] = 0;
ctx->Histogram.Count[i][1] = 0;
ctx->Histogram.Count[i][2] = 0;
ctx->Histogram.Count[i][3] = 0;
}
 
ctx->NewState |= _NEW_PIXEL;
}
 
 
void
_mesa_ResetMinmax(GLenum target)
{
GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
if (!ctx->Extensions.EXT_histogram && !ctx->Extensions.ARB_imaging) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glResetMinmax");
return;
}
 
if (target != GL_MINMAX) {
_mesa_error(ctx, GL_INVALID_ENUM, "glResetMinMax(target)");
return;
}
 
ctx->MinMax.Min[RCOMP] = 1000; ctx->MinMax.Max[RCOMP] = -1000;
ctx->MinMax.Min[GCOMP] = 1000; ctx->MinMax.Max[GCOMP] = -1000;
ctx->MinMax.Min[BCOMP] = 1000; ctx->MinMax.Max[BCOMP] = -1000;
ctx->MinMax.Min[ACOMP] = 1000; ctx->MinMax.Max[ACOMP] = -1000;
ctx->NewState |= _NEW_PIXEL;
}
/shark/trunk/ports/mesa/src-glu/nurbs.h
0,0 → 1,253
/* $Id: nurbs.h,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
* See README2 for more info.
*/
 
 
#ifndef NURBS_H
#define NURBS_H
 
 
#define EPSILON 1e-06 /* epsilon for double precision compares */
 
typedef enum
{
GLU_NURBS_CURVE, GLU_NURBS_SURFACE, GLU_NURBS_TRIM, GLU_NURBS_NO_TRIM,
GLU_NURBS_TRIM_DONE, GLU_NURBS_NONE
}
GLU_nurbs_enum;
 
typedef enum
{
GLU_TRIM_NURBS, GLU_TRIM_PWL
}
GLU_trim_enum;
 
typedef struct
{
GLint sknot_count;
GLfloat *sknot;
GLint tknot_count;
GLfloat *tknot;
GLint s_stride;
GLint t_stride;
GLfloat *ctrlarray;
GLint sorder;
GLint torder;
GLint dim;
GLenum type;
}
surface_attribs;
 
typedef struct
{
surface_attribs geom;
surface_attribs color;
surface_attribs texture;
surface_attribs normal;
}
nurbs_surface;
 
typedef struct
{
GLint knot_count;
GLfloat *knot;
GLint stride;
GLfloat *ctrlarray;
GLint order;
GLint dim;
GLenum type;
}
curve_attribs;
 
typedef struct
{
GLint pt_count;
GLfloat *ctrlarray;
GLint stride;
GLint dim;
GLenum type;
}
pwl_curve_attribs;
 
typedef struct
{
curve_attribs geom;
curve_attribs color;
curve_attribs texture;
curve_attribs normal;
}
nurbs_curve;
 
typedef struct trim_list_str
{
GLU_trim_enum trim_type;
union
{
pwl_curve_attribs pwl_curve;
curve_attribs nurbs_curve;
}
curve;
struct trim_list_str *next;
}
trim_list;
 
typedef struct seg_trim_str
{
GLfloat *points;
GLint pt_cnt, seg_array_len;
struct seg_trim_str *next;
}
trim_segments;
 
typedef struct nurbs_trim_str
{
trim_list *trim_loop;
trim_segments *segments;
struct nurbs_trim_str *next;
}
nurbs_trim;
 
typedef struct
{
GLfloat model[16], proj[16], viewport[4];
}
culling_and_sampling_str;
 
struct GLUnurbs
{
GLboolean culling;
GLenum error;
void (GLCALLBACK * error_callback) (GLenum err);
GLenum display_mode;
GLU_nurbs_enum nurbs_type;
GLboolean auto_load_matrix;
culling_and_sampling_str sampling_matrices;
GLenum sampling_method;
GLfloat sampling_tolerance;
GLfloat parametric_tolerance;
GLint u_step, v_step;
nurbs_surface surface;
nurbs_curve curve;
nurbs_trim *trim;
};
 
typedef struct
{
GLfloat *knot;
GLint nknots;
GLfloat *unified_knot;
GLint unified_nknots;
GLint order;
GLint t_min, t_max;
GLint delta_nknots;
GLboolean open_at_begin, open_at_end;
GLfloat *new_knot;
GLfloat *alpha;
}
knot_str_type;
 
typedef struct
{
GLfloat *geom_ctrl;
GLint geom_s_stride, geom_t_stride;
GLfloat **geom_offsets;
GLint geom_s_pt_cnt, geom_t_pt_cnt;
GLfloat *color_ctrl;
GLint color_s_stride, color_t_stride;
GLfloat **color_offsets;
GLint color_s_pt_cnt, color_t_pt_cnt;
GLfloat *normal_ctrl;
GLint normal_s_stride, normal_t_stride;
GLfloat **normal_offsets;
GLint normal_s_pt_cnt, normal_t_pt_cnt;
GLfloat *texture_ctrl;
GLint texture_s_stride, texture_t_stride;
GLfloat **texture_offsets;
GLint texture_s_pt_cnt, texture_t_pt_cnt;
GLint s_bezier_cnt, t_bezier_cnt;
}
new_ctrl_type;
 
extern void call_user_error(GLUnurbsObj * nobj, GLenum error);
 
extern GLenum test_knot(GLint nknots, GLfloat * knot, GLint order);
 
extern GLenum explode_knot(knot_str_type * the_knot);
 
extern GLenum calc_alphas(knot_str_type * the_knot);
 
extern GLenum calc_new_ctrl_pts(GLfloat * ctrl, GLint stride,
knot_str_type * the_knot, GLint dim,
GLfloat ** new_ctrl, GLint * ncontrol);
 
extern GLenum glu_do_sampling_crv(GLUnurbsObj * nobj, GLfloat * new_ctrl,
GLint n_ctrl, GLint order, GLint dim,
GLint ** factors);
 
extern GLenum glu_do_sampling_3D(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
int **sfactors, GLint ** tfactors);
 
extern GLenum glu_do_sampling_uv(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
int **sfactors, GLint ** tfactors);
 
extern GLenum glu_do_sampling_param_3D(GLUnurbsObj * nobj,
new_ctrl_type * new_ctrl,
int **sfactors, GLint ** tfactors);
 
extern GLboolean fine_culling_test_2D(GLUnurbsObj * nobj, GLfloat * ctrl,
GLint n_ctrl, GLint stride, GLint dim);
 
extern GLboolean fine_culling_test_3D(GLUnurbsObj * nobj, GLfloat * ctrl,
GLint s_n_ctrl, GLint t_n_ctrl,
GLint s_stride, GLint t_stride,
GLint dim);
 
extern void do_nurbs_curve(GLUnurbsObj * nobj);
 
extern void do_nurbs_surface(GLUnurbsObj * nobj);
 
extern GLenum patch_trimming(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
GLint * sfactors, GLint * tfactors);
 
extern void collect_unified_knot(knot_str_type * dest, knot_str_type * src,
GLfloat maximal_min_knot,
GLfloat minimal_max_knot);
 
extern GLenum select_knot_working_range(GLUnurbsObj * nobj,
knot_str_type * geom_knot,
knot_str_type * color_knot,
knot_str_type * normal_knot,
knot_str_type * texture_knot);
 
extern void free_unified_knots(knot_str_type * geom_knot,
knot_str_type * color_knot,
knot_str_type * normal_knot,
knot_str_type * texture_knot);
 
 
 
#endif
/shark/trunk/ports/mesa/src-glu/tess.c
0,0 → 1,328
/* $Id: tess.c,v 1.1 2003-02-28 11:42:08 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file is part of the polygon tesselation code contributed by
* Bogdan Sikorski
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdlib.h>
#include "tess.h"
#endif
 
 
/*
* This is ugly, but seems the easiest way to do things to make the
* code work under YellowBox for Windows
*/
#if defined(OPENSTEP) && defined(CALLBACK)
#undef CALLBACK
#define CALLBACK
#endif
 
 
static void delete_contours(GLUtriangulatorObj *);
 
#ifdef __CYGWIN32__
#define _CALLBACK
#else
#define _CALLBACK GLCALLBACK
#endif
 
 
static void
init_callbacks(tess_callbacks * callbacks)
{
callbacks->begin = (void (_CALLBACK *) (GLenum)) 0;
callbacks->edgeFlag = (void (_CALLBACK *) (GLboolean)) 0;
callbacks->vertex = (void (_CALLBACK *) (void *)) 0;
callbacks->end = (void (_CALLBACK *) (void)) 0;
callbacks->error = (void (_CALLBACK *) (GLenum)) 0;
}
 
void
tess_call_user_error(GLUtriangulatorObj * tobj, GLenum gluerr)
{
if (tobj->error == GLU_NO_ERROR)
tobj->error = gluerr;
if (tobj->callbacks.error != NULL)
(tobj->callbacks.error) (gluerr);
}
 
GLUtriangulatorObj *GLAPIENTRY
gluNewTess(void)
{
GLUtriangulatorObj *tobj;
 
if ((tobj = (GLUtriangulatorObj *)
malloc(sizeof(struct GLUtesselator))) == NULL)
return NULL;
tobj->contours = tobj->last_contour = NULL;
init_callbacks(&tobj->callbacks);
tobj->error = GLU_NO_ERROR;
tobj->current_polygon = NULL;
tobj->contour_cnt = 0;
return tobj;
}
 
 
void GLAPIENTRY
gluTessCallback(GLUtriangulatorObj * tobj, GLenum which,
void (GLCALLBACK * fn) ())
{
switch (which) {
case GLU_BEGIN:
tobj->callbacks.begin = (void (_CALLBACK *) (GLenum)) fn;
break;
case GLU_EDGE_FLAG:
tobj->callbacks.edgeFlag = (void (_CALLBACK *) (GLboolean)) fn;
break;
case GLU_VERTEX:
tobj->callbacks.vertex = (void (_CALLBACK *) (void *)) fn;
break;
case GLU_END:
tobj->callbacks.end = (void (_CALLBACK *) (void)) fn;
break;
case GLU_ERROR:
tobj->callbacks.error = (void (_CALLBACK *) (GLenum)) fn;
break;
default:
tobj->error = GLU_INVALID_ENUM;
break;
}
}
 
 
 
void GLAPIENTRY
gluDeleteTess(GLUtriangulatorObj * tobj)
{
if (tobj->error == GLU_NO_ERROR && tobj->contour_cnt)
/* was gluEndPolygon called? */
tess_call_user_error(tobj, GLU_TESS_ERROR1);
/* delete all internal structures */
delete_contours(tobj);
free(tobj);
}
 
 
void GLAPIENTRY
gluBeginPolygon(GLUtriangulatorObj * tobj)
{
/*
if(tobj->error!=GLU_NO_ERROR)
return;
*/
tobj->error = GLU_NO_ERROR;
if (tobj->current_polygon != NULL) {
/* gluEndPolygon was not called */
tess_call_user_error(tobj, GLU_TESS_ERROR1);
/* delete all internal structures */
delete_contours(tobj);
}
else {
if ((tobj->current_polygon =
(tess_polygon *) malloc(sizeof(tess_polygon))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return;
}
tobj->current_polygon->vertex_cnt = 0;
tobj->current_polygon->vertices =
tobj->current_polygon->last_vertex = NULL;
}
}
 
 
void GLAPIENTRY
gluEndPolygon(GLUtriangulatorObj * tobj)
{
/*tess_contour *contour_ptr; */
 
/* there was an error */
if (tobj->error != GLU_NO_ERROR)
goto end;
 
/* check if gluBeginPolygon was called */
if (tobj->current_polygon == NULL) {
tess_call_user_error(tobj, GLU_TESS_ERROR2);
return;
}
tess_test_polygon(tobj);
/* there was an error */
if (tobj->error != GLU_NO_ERROR)
goto end;
 
/* any real contours? */
if (tobj->contour_cnt == 0) {
/* delete all internal structures */
delete_contours(tobj);
return;
}
tess_find_contour_hierarchies(tobj);
/* there was an error */
if (tobj->error != GLU_NO_ERROR)
goto end;
 
tess_handle_holes(tobj);
/* there was an error */
if (tobj->error != GLU_NO_ERROR)
goto end;
 
/* if no callbacks, nothing to do */
if (tobj->callbacks.begin != NULL && tobj->callbacks.vertex != NULL &&
tobj->callbacks.end != NULL) {
if (tobj->callbacks.edgeFlag == NULL)
tess_tesselate(tobj);
else
tess_tesselate_with_edge_flag(tobj);
}
 
end:
/* delete all internal structures */
delete_contours(tobj);
}
 
 
void GLAPIENTRY
gluNextContour(GLUtriangulatorObj * tobj, GLenum type)
{
if (tobj->error != GLU_NO_ERROR)
return;
if (tobj->current_polygon == NULL) {
tess_call_user_error(tobj, GLU_TESS_ERROR2);
return;
}
/* first contour? */
if (tobj->current_polygon->vertex_cnt)
tess_test_polygon(tobj);
}
 
 
void GLAPIENTRY
gluTessVertex(GLUtriangulatorObj * tobj, GLdouble v[3], void *data)
{
tess_polygon *polygon = tobj->current_polygon;
tess_vertex *last_vertex_ptr;
 
if (tobj->error != GLU_NO_ERROR)
return;
if (polygon == NULL) {
tess_call_user_error(tobj, GLU_TESS_ERROR2);
return;
}
last_vertex_ptr = polygon->last_vertex;
if (last_vertex_ptr == NULL) {
if ((last_vertex_ptr = (tess_vertex *)
malloc(sizeof(tess_vertex))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return;
}
polygon->vertices = last_vertex_ptr;
polygon->last_vertex = last_vertex_ptr;
last_vertex_ptr->data = data;
last_vertex_ptr->location[0] = v[0];
last_vertex_ptr->location[1] = v[1];
last_vertex_ptr->location[2] = v[2];
last_vertex_ptr->next = NULL;
last_vertex_ptr->previous = NULL;
++(polygon->vertex_cnt);
}
else {
tess_vertex *vertex_ptr;
 
/* same point twice? */
if (fabs(last_vertex_ptr->location[0] - v[0]) < EPSILON &&
fabs(last_vertex_ptr->location[1] - v[1]) < EPSILON &&
fabs(last_vertex_ptr->location[2] - v[2]) < EPSILON) {
tess_call_user_error(tobj, GLU_TESS_ERROR6);
return;
}
if ((vertex_ptr = (tess_vertex *)
malloc(sizeof(tess_vertex))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return;
}
vertex_ptr->data = data;
vertex_ptr->location[0] = v[0];
vertex_ptr->location[1] = v[1];
vertex_ptr->location[2] = v[2];
vertex_ptr->next = NULL;
vertex_ptr->previous = last_vertex_ptr;
++(polygon->vertex_cnt);
last_vertex_ptr->next = vertex_ptr;
polygon->last_vertex = vertex_ptr;
}
}
 
 
static void
delete_contours(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
tess_contour *contour, *contour_tmp;
tess_vertex *vertex, *vertex_tmp;
 
/* remove current_polygon list - if exists due to detected error */
if (polygon != NULL) {
if (polygon->vertices) {
for (vertex = polygon->vertices; vertex != polygon->last_vertex;) {
vertex_tmp = vertex->next;
free(vertex);
vertex = vertex_tmp;
}
free(vertex);
}
free(polygon);
tobj->current_polygon = NULL;
}
/* remove all contour data */
for (contour = tobj->contours; contour != NULL;) {
for (vertex = contour->vertices; vertex != contour->last_vertex;) {
vertex_tmp = vertex->next;
free(vertex);
vertex = vertex_tmp;
}
free(vertex);
contour_tmp = contour->next;
free(contour);
contour = contour_tmp;
}
tobj->contours = tobj->last_contour = NULL;
tobj->contour_cnt = 0;
}
 
 
void GLAPIENTRY
gluTessNormal(GLUtesselator *tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ)
{
/* dummy function */
(void) tess;
(void) valueX;
(void) valueY;
(void) valueZ;
}
/shark/trunk/ports/mesa/src-glu/nurbsutl.c
0,0 → 1,1310
/* $Id: nurbsutl.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
* See README2 for more info.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdlib.h>
#include "gluP.h"
#include "nurbs.h"
#endif
 
 
GLenum test_knot(GLint nknots, GLfloat * knot, GLint order)
{
GLsizei i;
GLint knot_mult;
GLfloat tmp_knot;
 
tmp_knot = knot[0];
knot_mult = 1;
for (i = 1; i < nknots; i++) {
if (knot[i] < tmp_knot)
return GLU_NURBS_ERROR4;
if (fabs(tmp_knot - knot[i]) > EPSILON) {
if (knot_mult > order)
return GLU_NURBS_ERROR5;
knot_mult = 1;
tmp_knot = knot[i];
}
else
++knot_mult;
}
return GLU_NO_ERROR;
}
 
static int
/* qsort function */
#if defined(WIN32) && !defined(OPENSTEP)
__cdecl
#endif
knot_sort(const void *a, const void *b)
{
GLfloat x, y;
 
x = *((GLfloat *) a);
y = *((GLfloat *) b);
if (fabs(x - y) < EPSILON)
return 0;
if (x > y)
return 1;
return -1;
}
 
/* insert into dest knot all values within the valid range from src knot */
/* that do not appear in dest */
void
collect_unified_knot(knot_str_type * dest, knot_str_type * src,
GLfloat maximal_min_knot, GLfloat minimal_max_knot)
{
GLfloat *src_knot, *dest_knot;
GLint src_t_min, src_t_max, dest_t_min, dest_t_max;
GLint src_nknots, dest_nknots;
GLint i, j, k, new_cnt;
GLboolean not_found_flag;
 
src_knot = src->unified_knot;
dest_knot = dest->unified_knot;
src_t_min = src->t_min;
src_t_max = src->t_max;
dest_t_min = dest->t_min;
dest_t_max = dest->t_max;
src_nknots = src->unified_nknots;
dest_nknots = dest->unified_nknots;
 
k = new_cnt = dest_nknots;
for (i = src_t_min; i <= src_t_max; i++)
if (src_knot[i] - maximal_min_knot > -EPSILON &&
src_knot[i] - minimal_max_knot < EPSILON) {
not_found_flag = GL_TRUE;
for (j = dest_t_min; j <= dest_t_max; j++)
if (fabs(dest_knot[j] - src_knot[i]) < EPSILON) {
not_found_flag = GL_FALSE;
break;
}
if (not_found_flag) {
/* knot from src is not in dest - add this knot to dest */
dest_knot[k++] = src_knot[i];
++new_cnt;
++(dest->t_max); /* the valid range widens */
++(dest->delta_nknots); /* increment the extra knot value counter */
}
}
dest->unified_nknots = new_cnt;
qsort((void *) dest_knot, (size_t) new_cnt, (size_t) sizeof(GLfloat),
&knot_sort);
}
 
/* basing on the new common knot range for all attributes set */
/* t_min and t_max values for each knot - they will be used later on */
/* by explode_knot() and calc_new_ctrl_pts */
static void
set_new_t_min_t_max(knot_str_type * geom_knot, knot_str_type * color_knot,
knot_str_type * normal_knot, knot_str_type * texture_knot,
GLfloat maximal_min_knot, GLfloat minimal_max_knot)
{
GLuint t_min = 0, t_max = 0, cnt = 0;
 
if (minimal_max_knot - maximal_min_knot < EPSILON) {
/* knot common range empty */
geom_knot->t_min = geom_knot->t_max = 0;
color_knot->t_min = color_knot->t_max = 0;
normal_knot->t_min = normal_knot->t_max = 0;
texture_knot->t_min = texture_knot->t_max = 0;
}
else {
if (geom_knot->unified_knot != NULL) {
cnt = geom_knot->unified_nknots;
for (t_min = 0; t_min < cnt; t_min++)
if (fabs((geom_knot->unified_knot)[t_min] - maximal_min_knot) <
EPSILON) break;
for (t_max = cnt - 1; t_max; t_max--)
if (fabs((geom_knot->unified_knot)[t_max] - minimal_max_knot) <
EPSILON) break;
}
else if (geom_knot->nknots) {
cnt = geom_knot->nknots;
for (t_min = 0; t_min < cnt; t_min++)
if (fabs((geom_knot->knot)[t_min] - maximal_min_knot) < EPSILON)
break;
for (t_max = cnt - 1; t_max; t_max--)
if (fabs((geom_knot->knot)[t_max] - minimal_max_knot) < EPSILON)
break;
}
geom_knot->t_min = t_min;
geom_knot->t_max = t_max;
if (color_knot->unified_knot != NULL) {
cnt = color_knot->unified_nknots;
for (t_min = 0; t_min < cnt; t_min++)
if (fabs((color_knot->unified_knot)[t_min] - maximal_min_knot) <
EPSILON) break;
for (t_max = cnt - 1; t_max; t_max--)
if (fabs((color_knot->unified_knot)[t_max] - minimal_max_knot) <
EPSILON) break;
color_knot->t_min = t_min;
color_knot->t_max = t_max;
}
if (normal_knot->unified_knot != NULL) {
cnt = normal_knot->unified_nknots;
for (t_min = 0; t_min < cnt; t_min++)
if (fabs((normal_knot->unified_knot)[t_min] - maximal_min_knot) <
EPSILON) break;
for (t_max = cnt - 1; t_max; t_max--)
if (fabs((normal_knot->unified_knot)[t_max] - minimal_max_knot) <
EPSILON) break;
normal_knot->t_min = t_min;
normal_knot->t_max = t_max;
}
if (texture_knot->unified_knot != NULL) {
cnt = texture_knot->unified_nknots;
for (t_min = 0; t_min < cnt; t_min++)
if (fabs((texture_knot->unified_knot)[t_min] - maximal_min_knot)
< EPSILON)
break;
for (t_max = cnt - 1; t_max; t_max--)
if (fabs((texture_knot->unified_knot)[t_max] - minimal_max_knot)
< EPSILON)
break;
texture_knot->t_min = t_min;
texture_knot->t_max = t_max;
}
}
}
 
/* modify all knot valid ranges in such a way that all have the same */
/* range, common to all knots */
/* do this by knot insertion */
GLenum
select_knot_working_range(GLUnurbsObj * nobj, knot_str_type * geom_knot,
knot_str_type * color_knot,
knot_str_type * normal_knot,
knot_str_type * texture_knot)
{
GLint max_nknots;
GLfloat maximal_min_knot, minimal_max_knot;
GLint i;
 
/* find the maximum modified knot length */
max_nknots = geom_knot->nknots;
if (color_knot->unified_knot)
max_nknots += color_knot->nknots;
if (normal_knot->unified_knot)
max_nknots += normal_knot->nknots;
if (texture_knot->unified_knot)
max_nknots += texture_knot->nknots;
maximal_min_knot = (geom_knot->knot)[geom_knot->t_min];
minimal_max_knot = (geom_knot->knot)[geom_knot->t_max];
/* any attirb data ? */
if (max_nknots != geom_knot->nknots) {
/* allocate space for the unified knots */
if ((geom_knot->unified_knot =
(GLfloat *) malloc(sizeof(GLfloat) * max_nknots)) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
/* copy the original knot to the unified one */
geom_knot->unified_nknots = geom_knot->nknots;
for (i = 0; i < geom_knot->nknots; i++)
(geom_knot->unified_knot)[i] = (geom_knot->knot)[i];
if (color_knot->unified_knot) {
if ((color_knot->knot)[color_knot->t_min] - maximal_min_knot >
EPSILON)
maximal_min_knot = (color_knot->knot)[color_knot->t_min];
if (minimal_max_knot - (color_knot->knot)[color_knot->t_max] >
EPSILON)
minimal_max_knot = (color_knot->knot)[color_knot->t_max];
if ((color_knot->unified_knot =
(GLfloat *) malloc(sizeof(GLfloat) * max_nknots)) == NULL) {
free(geom_knot->unified_knot);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
/* copy the original knot to the unified one */
color_knot->unified_nknots = color_knot->nknots;
for (i = 0; i < color_knot->nknots; i++)
(color_knot->unified_knot)[i] = (color_knot->knot)[i];
}
if (normal_knot->unified_knot) {
if ((normal_knot->knot)[normal_knot->t_min] - maximal_min_knot >
EPSILON)
maximal_min_knot = (normal_knot->knot)[normal_knot->t_min];
if (minimal_max_knot - (normal_knot->knot)[normal_knot->t_max] >
EPSILON)
minimal_max_knot = (normal_knot->knot)[normal_knot->t_max];
if ((normal_knot->unified_knot =
(GLfloat *) malloc(sizeof(GLfloat) * max_nknots)) == NULL) {
free(geom_knot->unified_knot);
free(color_knot->unified_knot);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
/* copy the original knot to the unified one */
normal_knot->unified_nknots = normal_knot->nknots;
for (i = 0; i < normal_knot->nknots; i++)
(normal_knot->unified_knot)[i] = (normal_knot->knot)[i];
}
if (texture_knot->unified_knot) {
if ((texture_knot->knot)[texture_knot->t_min] - maximal_min_knot >
EPSILON)
maximal_min_knot = (texture_knot->knot)[texture_knot->t_min];
if (minimal_max_knot - (texture_knot->knot)[texture_knot->t_max] >
EPSILON)
minimal_max_knot = (texture_knot->knot)[texture_knot->t_max];
if ((texture_knot->unified_knot =
(GLfloat *) malloc(sizeof(GLfloat) * max_nknots)) == NULL) {
free(geom_knot->unified_knot);
free(color_knot->unified_knot);
free(normal_knot->unified_knot);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
/* copy the original knot to the unified one */
texture_knot->unified_nknots = texture_knot->nknots;
for (i = 0; i < texture_knot->nknots; i++)
(texture_knot->unified_knot)[i] = (texture_knot->knot)[i];
}
/* work on the geometry knot with all additional knot values */
/* appearing in attirbutive knots */
if (minimal_max_knot - maximal_min_knot < EPSILON) {
/* empty working range */
geom_knot->unified_nknots = 0;
color_knot->unified_nknots = 0;
normal_knot->unified_nknots = 0;
texture_knot->unified_nknots = 0;
}
else {
if (color_knot->unified_knot)
collect_unified_knot(geom_knot, color_knot, maximal_min_knot,
minimal_max_knot);
if (normal_knot->unified_knot)
collect_unified_knot(geom_knot, normal_knot, maximal_min_knot,
minimal_max_knot);
if (texture_knot->unified_knot)
collect_unified_knot(geom_knot, texture_knot, maximal_min_knot,
minimal_max_knot);
/* since we have now built the "unified" geometry knot */
/* add same knot values to all attributive knots */
if (color_knot->unified_knot)
collect_unified_knot(color_knot, geom_knot, maximal_min_knot,
minimal_max_knot);
if (normal_knot->unified_knot)
collect_unified_knot(normal_knot, geom_knot, maximal_min_knot,
minimal_max_knot);
if (texture_knot->unified_knot)
collect_unified_knot(texture_knot, geom_knot, maximal_min_knot,
minimal_max_knot);
}
}
set_new_t_min_t_max(geom_knot, color_knot, normal_knot, texture_knot,
maximal_min_knot, minimal_max_knot);
return GLU_NO_ERROR;
}
 
void
free_unified_knots(knot_str_type * geom_knot, knot_str_type * color_knot,
knot_str_type * normal_knot, knot_str_type * texture_knot)
{
if (geom_knot->unified_knot)
free(geom_knot->unified_knot);
if (color_knot->unified_knot)
free(color_knot->unified_knot);
if (normal_knot->unified_knot)
free(normal_knot->unified_knot);
if (texture_knot->unified_knot)
free(texture_knot->unified_knot);
}
 
GLenum explode_knot(knot_str_type * the_knot)
{
GLfloat *knot, *new_knot;
GLint nknots, n_new_knots = 0;
GLint t_min, t_max;
GLint ord;
GLsizei i, j, k;
GLfloat tmp_float;
 
if (the_knot->unified_knot) {
knot = the_knot->unified_knot;
nknots = the_knot->unified_nknots;
}
else {
knot = the_knot->knot;
nknots = the_knot->nknots;
}
ord = the_knot->order;
t_min = the_knot->t_min;
t_max = the_knot->t_max;
 
for (i = t_min; i <= t_max;) {
tmp_float = knot[i];
for (j = 0; j < ord && (i + j) <= t_max; j++)
if (fabs(tmp_float - knot[i + j]) > EPSILON)
break;
n_new_knots += ord - j;
i += j;
}
/* alloc space for new_knot */
if (
(new_knot =
(GLfloat *) malloc(sizeof(GLfloat) * (nknots + n_new_knots + 1))) == NULL) {
return GLU_OUT_OF_MEMORY;
}
/* fill in new knot */
for (j = 0; j < t_min; j++)
new_knot[j] = knot[j];
for (i = j; i <= t_max; i++) {
tmp_float = knot[i];
for (k = 0; k < ord; k++) {
new_knot[j++] = knot[i];
if (tmp_float == knot[i + 1])
i++;
}
}
for (i = t_max + 1; i < (int) nknots; i++)
new_knot[j++] = knot[i];
/* fill in the knot structure */
the_knot->new_knot = new_knot;
the_knot->delta_nknots += n_new_knots;
the_knot->t_max += n_new_knots;
return GLU_NO_ERROR;
}
 
GLenum calc_alphas(knot_str_type * the_knot)
{
GLfloat tmp_float;
int i, j, k, m, n;
int order;
GLfloat *alpha, *alpha_new, *tmp_alpha;
GLfloat denom;
GLfloat *knot, *new_knot;
 
 
knot = the_knot->knot;
order = the_knot->order;
new_knot = the_knot->new_knot;
n = the_knot->nknots - the_knot->order;
m = n + the_knot->delta_nknots;
if ((alpha = (GLfloat *) malloc(sizeof(GLfloat) * n * m)) == NULL) {
return GLU_OUT_OF_MEMORY;
}
if ((alpha_new = (GLfloat *) malloc(sizeof(GLfloat) * n * m)) == NULL) {
free(alpha);
return GLU_OUT_OF_MEMORY;
}
for (j = 0; j < m; j++) {
for (i = 0; i < n; i++) {
if ((knot[i] <= new_knot[j]) && (new_knot[j] < knot[i + 1]))
tmp_float = 1.0;
else
tmp_float = 0.0;
alpha[i + j * n] = tmp_float;
}
}
for (k = 1; k < order; k++) {
for (j = 0; j < m; j++)
for (i = 0; i < n; i++) {
denom = knot[i + k] - knot[i];
if (fabs(denom) < EPSILON)
tmp_float = 0.0;
else
tmp_float = (new_knot[j + k] - knot[i]) / denom *
alpha[i + j * n];
denom = knot[i + k + 1] - knot[i + 1];
if (fabs(denom) > EPSILON)
tmp_float += (knot[i + k + 1] - new_knot[j + k]) / denom *
alpha[(i + 1) + j * n];
alpha_new[i + j * n] = tmp_float;
}
tmp_alpha = alpha_new;
alpha_new = alpha;
alpha = tmp_alpha;
}
the_knot->alpha = alpha;
free(alpha_new);
return GLU_NO_ERROR;
}
 
GLenum
calc_new_ctrl_pts(GLfloat * ctrl, GLint stride, knot_str_type * the_knot,
GLint dim, GLfloat ** new_ctrl, GLint * ncontrol)
{
GLsizei i, j, k, l, m, n;
GLsizei index1, index2;
GLfloat *alpha;
GLfloat *new_knot;
 
new_knot = the_knot->new_knot;
n = the_knot->nknots - the_knot->order;
alpha = the_knot->alpha;
 
m = the_knot->t_max + 1 - the_knot->t_min - the_knot->order;
k = the_knot->t_min;
/* allocate space for new control points */
if ((*new_ctrl = (GLfloat *) malloc(sizeof(GLfloat) * dim * m)) == NULL) {
return GLU_OUT_OF_MEMORY;
}
for (j = 0; j < m; j++) {
for (l = 0; l < dim; l++)
(*new_ctrl)[j * dim + l] = 0.0;
for (i = 0; i < n; i++) {
index1 = i + (j + k) * n;
index2 = i * stride;
for (l = 0; l < dim; l++)
(*new_ctrl)[j * dim + l] += alpha[index1] * ctrl[index2 + l];
}
}
*ncontrol = (GLint) m;
return GLU_NO_ERROR;
}
 
static GLint
calc_factor(GLfloat * pts, GLint order, GLint indx, GLint stride,
GLfloat tolerance, GLint dim)
{
GLdouble model[16], proj[16];
GLint viewport[4];
GLdouble x, y, z, w, winx1, winy1, winz, winx2, winy2;
GLint i;
GLdouble len, dx, dy;
 
glGetDoublev(GL_MODELVIEW_MATRIX, model);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, viewport);
if (dim == 4) {
w = (GLdouble) pts[indx + 3];
x = (GLdouble) pts[indx] / w;
y = (GLdouble) pts[indx + 1] / w;
z = (GLdouble) pts[indx + 2] / w;
gluProject(x, y, z, model, proj, viewport, &winx1, &winy1, &winz);
len = 0.0;
for (i = 1; i < order; i++) {
w = (GLdouble) pts[indx + i * stride + 3];
x = (GLdouble) pts[indx + i * stride] / w;
y = (GLdouble) pts[indx + i * stride + 1] / w;
z = (GLdouble) pts[indx + i * stride + 2] / w;
if (gluProject
(x, y, z, model, proj, viewport, &winx2, &winy2, &winz)) {
dx = winx2 - winx1;
dy = winy2 - winy1;
len += sqrt(dx * dx + dy * dy);
}
winx1 = winx2;
winy1 = winy2;
}
}
else {
x = (GLdouble) pts[indx];
y = (GLdouble) pts[indx + 1];
if (dim == 2)
z = 0.0;
else
z = (GLdouble) pts[indx + 2];
gluProject(x, y, z, model, proj, viewport, &winx1, &winy1, &winz);
len = 0.0;
for (i = 1; i < order; i++) {
x = (GLdouble) pts[indx + i * stride];
y = (GLdouble) pts[indx + i * stride + 1];
if (dim == 2)
z = 0.0;
else
z = (GLdouble) pts[indx + i * stride + 2];
if (gluProject
(x, y, z, model, proj, viewport, &winx2, &winy2, &winz)) {
dx = winx2 - winx1;
dy = winy2 - winy1;
len += sqrt(dx * dx + dy * dy);
}
winx1 = winx2;
winy1 = winy2;
}
}
len /= tolerance;
return ((GLint) len + 1);
}
 
/* we can't use the Mesa evaluators - no way to get the point coords */
/* so we use our own Bezier point calculus routines */
/* because I'm lazy, I reuse the ones from eval.c */
 
static void
bezier_curve(GLfloat * cp, GLfloat * out, GLfloat t,
GLuint dim, GLuint order, GLint offset)
{
GLfloat s, powert;
GLuint i, k, bincoeff;
 
if (order >= 2) {
bincoeff = order - 1;
s = 1.0 - t;
 
for (k = 0; k < dim; k++)
out[k] = s * cp[k] + bincoeff * t * cp[offset + k];
 
for (i = 2, cp += 2 * offset, powert = t * t; i < order;
i++, powert *= t, cp += offset) {
bincoeff *= order - i;
bincoeff /= i;
 
for (k = 0; k < dim; k++)
out[k] = s * out[k] + bincoeff * powert * cp[k];
}
}
else { /* order=1 -> constant curve */
 
for (k = 0; k < dim; k++)
out[k] = cp[k];
}
}
 
static GLint
calc_parametric_factor(GLfloat * pts, GLint order, GLint indx, GLint stride,
GLfloat tolerance, GLint dim)
{
GLdouble model[16], proj[16];
GLint viewport[4];
GLdouble x, y, z, w, x1, y1, z1, x2, y2, z2, x3, y3, z3;
GLint i;
GLint P;
GLfloat bez_pt[4];
GLdouble len = 0.0, tmp, z_med;
 
P = 2 * (order + 2);
glGetDoublev(GL_MODELVIEW_MATRIX, model);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, viewport);
z_med = (viewport[2] + viewport[3]) * 0.5;
switch (dim) {
case 4:
for (i = 1; i < P; i++) {
bezier_curve(pts + indx, bez_pt, (GLfloat) i / (GLfloat) P, 4,
order, stride);
w = (GLdouble) bez_pt[3];
x = (GLdouble) bez_pt[0] / w;
y = (GLdouble) bez_pt[1] / w;
z = (GLdouble) bez_pt[2] / w;
gluProject(x, y, z, model, proj, viewport, &x3, &y3, &z3);
z3 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i - 1) / (GLfloat) P, 4,
order, stride);
w = (GLdouble) bez_pt[3];
x = (GLdouble) bez_pt[0] / w;
y = (GLdouble) bez_pt[1] / w;
z = (GLdouble) bez_pt[2] / w;
gluProject(x, y, z, model, proj, viewport, &x1, &y1, &z1);
z1 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i + 1) / (GLfloat) P, 4,
order, stride);
w = (GLdouble) bez_pt[3];
x = (GLdouble) bez_pt[0] / w;
y = (GLdouble) bez_pt[1] / w;
z = (GLdouble) bez_pt[2] / w;
gluProject(x, y, z, model, proj, viewport, &x2, &y2, &z2);
z2 *= z_med;
/* calc distance between point (x3,y3,z3) and line segment */
/* <x1,y1,z1><x2,y2,z2> */
x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
tmp = sqrt(x * x + y * y + z * z);
x /= tmp;
y /= tmp;
z /= tmp;
tmp = x3 * x + y3 * y + z3 * z - x1 * x - y1 * y - z1 * z;
x = x1 + x * tmp - x3;
y = y1 + y * tmp - y3;
z = z1 + z * tmp - z3;
tmp = sqrt(x * x + y * y + z * z);
if (tmp > len)
len = tmp;
}
break;
case 3:
for (i = 1; i < P; i++) {
bezier_curve(pts + indx, bez_pt, (GLfloat) i / (GLfloat) P, 3,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = (GLdouble) bez_pt[2];
gluProject(x, y, z, model, proj, viewport, &x3, &y3, &z3);
z3 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i - 1) / (GLfloat) P, 3,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = (GLdouble) bez_pt[2];
gluProject(x, y, z, model, proj, viewport, &x1, &y1, &z1);
z1 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i + 1) / (GLfloat) P, 3,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = (GLdouble) bez_pt[2];
gluProject(x, y, z, model, proj, viewport, &x2, &y2, &z2);
z2 *= z_med;
/* calc distance between point (x3,y3,z3) and line segment */
/* <x1,y1,z1><x2,y2,z2> */
x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
tmp = sqrt(x * x + y * y + z * z);
x /= tmp;
y /= tmp;
z /= tmp;
tmp = x3 * x + y3 * y + z3 * z - x1 * x - y1 * y - z1 * z;
x = x1 + x * tmp - x3;
y = y1 + y * tmp - y3;
z = z1 + z * tmp - z3;
tmp = sqrt(x * x + y * y + z * z);
if (tmp > len)
len = tmp;
}
break;
case 2:
for (i = 1; i < P; i++) {
bezier_curve(pts + indx, bez_pt, (GLfloat) i / (GLfloat) P, 2,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = 0.0;
gluProject(x, y, z, model, proj, viewport, &x3, &y3, &z3);
z3 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i - 1) / (GLfloat) P, 2,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = 0.0;
gluProject(x, y, z, model, proj, viewport, &x1, &y1, &z1);
z1 *= z_med;
bezier_curve(pts + indx, bez_pt, (GLfloat) (i + 1) / (GLfloat) P, 2,
order, stride);
x = (GLdouble) bez_pt[0];
y = (GLdouble) bez_pt[1];
z = 0.0;
gluProject(x, y, z, model, proj, viewport, &x2, &y2, &z2);
z2 *= z_med;
/* calc distance between point (x3,y3,z3) and line segment */
/* <x1,y1,z1><x2,y2,z2> */
x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
tmp = sqrt(x * x + y * y + z * z);
x /= tmp;
y /= tmp;
z /= tmp;
tmp = x3 * x + y3 * y + z3 * z - x1 * x - y1 * y - z1 * z;
x = x1 + x * tmp - x3;
y = y1 + y * tmp - y3;
z = z1 + z * tmp - z3;
tmp = sqrt(x * x + y * y + z * z);
if (tmp > len)
len = tmp;
}
break;
 
}
if (len < tolerance)
return (order);
else
return (GLint) (sqrt(len / tolerance) * (order + 2) + 1);
}
 
static GLenum
calc_sampling_3D(new_ctrl_type * new_ctrl, GLfloat tolerance, GLint dim,
GLint uorder, GLint vorder, GLint ** ufactors,
GLint ** vfactors)
{
GLfloat *ctrl;
GLint tmp_factor1, tmp_factor2;
GLint ufactor_cnt, vfactor_cnt;
GLint offset1, offset2, offset3;
GLint i, j;
 
ufactor_cnt = new_ctrl->s_bezier_cnt;
vfactor_cnt = new_ctrl->t_bezier_cnt;
if ((*ufactors = (GLint *) malloc(sizeof(GLint) * ufactor_cnt * 3))
== NULL) {
return GLU_OUT_OF_MEMORY;
}
if ((*vfactors = (GLint *) malloc(sizeof(GLint) * vfactor_cnt * 3))
== NULL) {
free(*ufactors);
return GLU_OUT_OF_MEMORY;
}
ctrl = new_ctrl->geom_ctrl;
offset1 = new_ctrl->geom_t_stride * vorder;
offset2 = new_ctrl->geom_s_stride * uorder;
for (j = 0; j < vfactor_cnt; j++) {
*(*vfactors + j * 3 + 1) = tmp_factor1 = calc_factor(ctrl, vorder,
j * offset1, dim,
tolerance, dim);
/* loop ufactor_cnt-1 times */
for (i = 1; i < ufactor_cnt; i++) {
tmp_factor2 = calc_factor(ctrl, vorder,
j * offset1 + i * offset2, dim, tolerance,
dim);
if (tmp_factor2 > tmp_factor1)
tmp_factor1 = tmp_factor2;
}
/* last time for the opposite edge */
*(*vfactors + j * 3 + 2) = tmp_factor2 = calc_factor(ctrl, vorder,
j * offset1 +
i * offset2 -
new_ctrl->
geom_s_stride, dim,
tolerance, dim);
if (tmp_factor2 > tmp_factor1)
*(*vfactors + j * 3) = tmp_factor2;
else
*(*vfactors + j * 3) = tmp_factor1;
}
offset3 = new_ctrl->geom_s_stride;
offset2 = new_ctrl->geom_s_stride * uorder;
for (j = 0; j < ufactor_cnt; j++) {
*(*ufactors + j * 3 + 1) = tmp_factor1 = calc_factor(ctrl, uorder,
j * offset2,
offset3, tolerance,
dim);
/* loop vfactor_cnt-1 times */
for (i = 1; i < vfactor_cnt; i++) {
tmp_factor2 = calc_factor(ctrl, uorder,
j * offset2 + i * offset1, offset3,
tolerance, dim);
if (tmp_factor2 > tmp_factor1)
tmp_factor1 = tmp_factor2;
}
/* last time for the opposite edge */
*(*ufactors + j * 3 + 2) = tmp_factor2 = calc_factor(ctrl, uorder,
j * offset2 +
i * offset1 -
new_ctrl->
geom_t_stride,
offset3, tolerance,
dim);
if (tmp_factor2 > tmp_factor1)
*(*ufactors + j * 3) = tmp_factor2;
else
*(*ufactors + j * 3) = tmp_factor1;
}
return GL_NO_ERROR;
}
 
static GLenum
calc_sampling_param_3D(new_ctrl_type * new_ctrl, GLfloat tolerance, GLint dim,
GLint uorder, GLint vorder, GLint ** ufactors,
GLint ** vfactors)
{
GLfloat *ctrl;
GLint tmp_factor1, tmp_factor2;
GLint ufactor_cnt, vfactor_cnt;
GLint offset1, offset2, offset3;
GLint i, j;
 
ufactor_cnt = new_ctrl->s_bezier_cnt;
vfactor_cnt = new_ctrl->t_bezier_cnt;
if ((*ufactors = (GLint *) malloc(sizeof(GLint) * ufactor_cnt * 3))
== NULL) {
return GLU_OUT_OF_MEMORY;
}
if ((*vfactors = (GLint *) malloc(sizeof(GLint) * vfactor_cnt * 3))
== NULL) {
free(*ufactors);
return GLU_OUT_OF_MEMORY;
}
ctrl = new_ctrl->geom_ctrl;
offset1 = new_ctrl->geom_t_stride * vorder;
offset2 = new_ctrl->geom_s_stride * uorder;
for (j = 0; j < vfactor_cnt; j++) {
*(*vfactors + j * 3 + 1) = tmp_factor1 =
calc_parametric_factor(ctrl, vorder, j * offset1, dim, tolerance,
dim);
/* loop ufactor_cnt-1 times */
for (i = 1; i < ufactor_cnt; i++) {
tmp_factor2 = calc_parametric_factor(ctrl, vorder,
j * offset1 + i * offset2, dim,
tolerance, dim);
if (tmp_factor2 > tmp_factor1)
tmp_factor1 = tmp_factor2;
}
/* last time for the opposite edge */
*(*vfactors + j * 3 + 2) = tmp_factor2 =
calc_parametric_factor(ctrl, vorder,
j * offset1 + i * offset2 -
new_ctrl->geom_s_stride, dim, tolerance, dim);
if (tmp_factor2 > tmp_factor1)
*(*vfactors + j * 3) = tmp_factor2;
else
*(*vfactors + j * 3) = tmp_factor1;
}
offset3 = new_ctrl->geom_s_stride;
offset2 = new_ctrl->geom_s_stride * uorder;
for (j = 0; j < ufactor_cnt; j++) {
*(*ufactors + j * 3 + 1) = tmp_factor1 =
calc_parametric_factor(ctrl, uorder, j * offset2, offset3, tolerance,
dim);
/* loop vfactor_cnt-1 times */
for (i = 1; i < vfactor_cnt; i++) {
tmp_factor2 = calc_parametric_factor(ctrl, uorder,
j * offset2 + i * offset1,
offset3, tolerance, dim);
if (tmp_factor2 > tmp_factor1)
tmp_factor1 = tmp_factor2;
}
/* last time for the opposite edge */
*(*ufactors + j * 3 + 2) = tmp_factor2 =
calc_parametric_factor(ctrl, uorder,
j * offset2 + i * offset1 -
new_ctrl->geom_t_stride, offset3, tolerance,
dim);
if (tmp_factor2 > tmp_factor1)
*(*ufactors + j * 3) = tmp_factor2;
else
*(*ufactors + j * 3) = tmp_factor1;
}
return GL_NO_ERROR;
}
 
static GLenum
calc_sampling_2D(GLfloat * ctrl, GLint cnt, GLint order,
GLfloat tolerance, GLint dim, GLint ** factors)
{
GLint factor_cnt;
GLint tmp_factor;
GLint offset;
GLint i;
 
factor_cnt = cnt / order;
if ((*factors = (GLint *) malloc(sizeof(GLint) * factor_cnt)) == NULL) {
return GLU_OUT_OF_MEMORY;
}
offset = order * dim;
for (i = 0; i < factor_cnt; i++) {
tmp_factor = calc_factor(ctrl, order, i * offset, dim, tolerance, dim);
if (tmp_factor == 0)
(*factors)[i] = 1;
else
(*factors)[i] = tmp_factor;
}
return GL_NO_ERROR;
}
 
static void
set_sampling_and_culling(GLUnurbsObj * nobj)
{
if (nobj->auto_load_matrix == GL_FALSE) {
GLint i;
GLfloat m[4];
 
glPushAttrib((GLbitfield) (GL_VIEWPORT_BIT | GL_TRANSFORM_BIT));
for (i = 0; i < 4; i++)
m[i] = nobj->sampling_matrices.viewport[i];
glViewport(m[0], m[1], m[2], m[3]);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixf(nobj->sampling_matrices.proj);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf(nobj->sampling_matrices.model);
}
}
 
static void
revert_sampling_and_culling(GLUnurbsObj * nobj)
{
if (nobj->auto_load_matrix == GL_FALSE) {
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
}
}
 
GLenum
glu_do_sampling_3D(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
GLint ** sfactors, GLint ** tfactors)
{
GLint dim;
GLenum err;
 
*sfactors = NULL;
*tfactors = NULL;
dim = nobj->surface.geom.dim;
set_sampling_and_culling(nobj);
if ((err = calc_sampling_3D(new_ctrl, nobj->sampling_tolerance, dim,
nobj->surface.geom.sorder,
nobj->surface.geom.torder, sfactors,
tfactors)) == GLU_ERROR) {
revert_sampling_and_culling(nobj);
call_user_error(nobj, err);
return GLU_ERROR;
}
revert_sampling_and_culling(nobj);
return GLU_NO_ERROR;
}
 
GLenum
glu_do_sampling_uv(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
GLint ** sfactors, GLint ** tfactors)
{
GLint s_cnt, t_cnt, i;
GLint u_steps, v_steps;
 
s_cnt = new_ctrl->s_bezier_cnt;
t_cnt = new_ctrl->t_bezier_cnt;
*sfactors = NULL;
*tfactors = NULL;
if ((*sfactors = (GLint *) malloc(sizeof(GLint) * s_cnt * 3))
== NULL) {
return GLU_OUT_OF_MEMORY;
}
if ((*tfactors = (GLint *) malloc(sizeof(GLint) * t_cnt * 3))
== NULL) {
free(*sfactors);
return GLU_OUT_OF_MEMORY;
}
u_steps = nobj->u_step;
v_steps = nobj->v_step;
for (i = 0; i < s_cnt; i++) {
*(*sfactors + i * 3) = u_steps;
*(*sfactors + i * 3 + 1) = u_steps;
*(*sfactors + i * 3 + 2) = u_steps;
}
for (i = 0; i < t_cnt; i++) {
*(*tfactors + i * 3) = v_steps;
*(*tfactors + i * 3 + 1) = v_steps;
*(*tfactors + i * 3 + 2) = v_steps;
}
return GLU_NO_ERROR;
}
 
 
GLenum
glu_do_sampling_param_3D(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
GLint ** sfactors, GLint ** tfactors)
{
GLint dim;
GLenum err;
 
*sfactors = NULL;
*tfactors = NULL;
dim = nobj->surface.geom.dim;
set_sampling_and_culling(nobj);
if (
(err =
calc_sampling_param_3D(new_ctrl, nobj->parametric_tolerance, dim,
nobj->surface.geom.sorder,
nobj->surface.geom.torder, sfactors,
tfactors)) == GLU_ERROR) {
revert_sampling_and_culling(nobj);
call_user_error(nobj, err);
return GLU_ERROR;
}
revert_sampling_and_culling(nobj);
return GLU_NO_ERROR;
}
 
 
static GLenum
glu_do_sampling_2D(GLUnurbsObj * nobj, GLfloat * ctrl, GLint cnt, GLint order,
GLint dim, GLint ** factors)
{
GLenum err;
 
set_sampling_and_culling(nobj);
err = calc_sampling_2D(ctrl, cnt, order, nobj->sampling_tolerance, dim,
factors);
revert_sampling_and_culling(nobj);
return err;
}
 
 
static GLenum
glu_do_sampling_u(GLUnurbsObj * nobj, GLfloat * ctrl, GLint cnt, GLint order,
GLint dim, GLint ** factors)
{
GLint i;
GLint u_steps;
 
cnt /= order;
if ((*factors = (GLint *) malloc(sizeof(GLint) * cnt))
== NULL) {
return GLU_OUT_OF_MEMORY;
}
u_steps = nobj->u_step;
for (i = 0; i < cnt; i++)
(*factors)[i] = u_steps;
return GLU_NO_ERROR;
}
 
 
static GLenum
glu_do_sampling_param_2D(GLUnurbsObj * nobj, GLfloat * ctrl, GLint cnt,
GLint order, GLint dim, GLint ** factors)
{
GLint i;
GLint u_steps;
GLfloat tolerance;
 
set_sampling_and_culling(nobj);
tolerance = nobj->parametric_tolerance;
cnt /= order;
if ((*factors = (GLint *) malloc(sizeof(GLint) * cnt))
== NULL) {
revert_sampling_and_culling(nobj);
return GLU_OUT_OF_MEMORY;
}
u_steps = nobj->u_step;
for (i = 0; i < cnt; i++) {
(*factors)[i] = calc_parametric_factor(ctrl, order, 0,
dim, tolerance, dim);
 
}
revert_sampling_and_culling(nobj);
return GLU_NO_ERROR;
}
 
GLenum
glu_do_sampling_crv(GLUnurbsObj * nobj, GLfloat * ctrl, GLint cnt,
GLint order, GLint dim, GLint ** factors)
{
GLenum err;
 
*factors = NULL;
switch (nobj->sampling_method) {
case GLU_PATH_LENGTH:
if ((err = glu_do_sampling_2D(nobj, ctrl, cnt, order, dim, factors)) !=
GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
break;
case GLU_DOMAIN_DISTANCE:
if ((err = glu_do_sampling_u(nobj, ctrl, cnt, order, dim, factors)) !=
GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
break;
case GLU_PARAMETRIC_ERROR:
if (
(err =
glu_do_sampling_param_2D(nobj, ctrl, cnt, order, dim,
factors)) != GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
break;
default:
abort();
}
 
return GLU_NO_ERROR;
}
 
/* TODO - i don't like this culling - this one just tests if at least one */
/* ctrl point lies within the viewport . Also the point_in_viewport() */
/* should be included in the fnctions for efficiency reasons */
 
static GLboolean
point_in_viewport(GLfloat * pt, GLint dim)
{
GLdouble model[16], proj[16];
GLint viewport[4];
GLdouble x, y, z, w, winx, winy, winz;
 
glGetDoublev(GL_MODELVIEW_MATRIX, model);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, viewport);
if (dim == 3) {
x = (GLdouble) pt[0];
y = (GLdouble) pt[1];
z = (GLdouble) pt[2];
gluProject(x, y, z, model, proj, viewport, &winx, &winy, &winz);
}
else {
w = (GLdouble) pt[3];
x = (GLdouble) pt[0] / w;
y = (GLdouble) pt[1] / w;
z = (GLdouble) pt[2] / w;
gluProject(x, y, z, model, proj, viewport, &winx, &winy, &winz);
}
if ((GLint) winx >= viewport[0] && (GLint) winx < viewport[2] &&
(GLint) winy >= viewport[1] && (GLint) winy < viewport[3])
return GL_TRUE;
return GL_FALSE;
}
 
GLboolean
fine_culling_test_3D(GLUnurbsObj * nobj, GLfloat * pts, GLint s_cnt,
GLint t_cnt, GLint s_stride, GLint t_stride, GLint dim)
{
GLint i, j;
 
if (nobj->culling == GL_FALSE)
return GL_FALSE;
set_sampling_and_culling(nobj);
 
if (dim == 3) {
for (i = 0; i < s_cnt; i++)
for (j = 0; j < t_cnt; j++)
if (point_in_viewport(pts + i * s_stride + j * t_stride, dim)) {
revert_sampling_and_culling(nobj);
return GL_FALSE;
}
}
else {
for (i = 0; i < s_cnt; i++)
for (j = 0; j < t_cnt; j++)
if (point_in_viewport(pts + i * s_stride + j * t_stride, dim)) {
revert_sampling_and_culling(nobj);
return GL_FALSE;
}
}
revert_sampling_and_culling(nobj);
return GL_TRUE;
}
 
/*GLboolean
fine_culling_test_3D(GLUnurbsObj *nobj,GLfloat *pts,GLint s_cnt,GLint t_cnt,
GLint s_stride,GLint t_stride, GLint dim)
{
GLint visible_cnt;
GLfloat feedback_buffer[5];
GLsizei buffer_size;
GLint i,j;
 
if(nobj->culling==GL_FALSE)
return GL_FALSE;
buffer_size=5;
set_sampling_and_culling(nobj);
glFeedbackBuffer(buffer_size,GL_2D,feedback_buffer);
glRenderMode(GL_FEEDBACK);
if(dim==3)
{
for(i=0;i<s_cnt;i++)
{
glBegin(GL_LINE_LOOP);
for(j=0;j<t_cnt;j++)
glVertex3fv(pts+i*s_stride+j*t_stride);
glEnd();
}
for(j=0;j<t_cnt;j++)
{
glBegin(GL_LINE_LOOP);
for(i=0;i<s_cnt;i++)
glVertex3fv(pts+i*s_stride+j*t_stride);
glEnd();
}
}
else
{
for(i=0;i<s_cnt;i++)
{
glBegin(GL_LINE_LOOP);
for(j=0;j<t_cnt;j++)
glVertex4fv(pts+i*s_stride+j*t_stride);
glEnd();
}
for(j=0;j<t_cnt;j++)
{
glBegin(GL_LINE_LOOP);
for(i=0;i<s_cnt;i++)
glVertex4fv(pts+i*s_stride+j*t_stride);
glEnd();
}
}
visible_cnt=glRenderMode(GL_RENDER);
 
revert_sampling_and_culling(nobj);
return (GLboolean)(visible_cnt==0);
}*/
 
GLboolean
fine_culling_test_2D(GLUnurbsObj * nobj, GLfloat * pts, GLint cnt,
GLint stride, GLint dim)
{
GLint i;
 
if (nobj->culling == GL_FALSE)
return GL_FALSE;
set_sampling_and_culling(nobj);
 
if (dim == 3) {
for (i = 0; i < cnt; i++)
if (point_in_viewport(pts + i * stride, dim)) {
revert_sampling_and_culling(nobj);
return GL_FALSE;
}
}
else {
for (i = 0; i < cnt; i++)
if (point_in_viewport(pts + i * stride, dim)) {
revert_sampling_and_culling(nobj);
return GL_FALSE;
}
}
revert_sampling_and_culling(nobj);
return GL_TRUE;
}
 
/*GLboolean
fine_culling_test_2D(GLUnurbsObj *nobj,GLfloat *pts,GLint cnt,
GLint stride, GLint dim)
{
GLint visible_cnt;
GLfloat feedback_buffer[5];
GLsizei buffer_size;
GLint i;
 
if(nobj->culling==GL_FALSE)
return GL_FALSE;
buffer_size=5;
set_sampling_and_culling(nobj);
glFeedbackBuffer(buffer_size,GL_2D,feedback_buffer);
glRenderMode(GL_FEEDBACK);
glBegin(GL_LINE_LOOP);
if(dim==3)
{
for(i=0;i<cnt;i++)
glVertex3fv(pts+i*stride);
}
else
{
for(i=0;i<cnt;i++)
glVertex4fv(pts+i*stride);
}
glEnd();
visible_cnt=glRenderMode(GL_RENDER);
 
revert_sampling_and_culling(nobj);
return (GLboolean)(visible_cnt==0);
}*/
/shark/trunk/ports/mesa/src-glu/polytest.c
0,0 → 1,938
/* $Id: polytest.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file is part of the polygon tesselation code contributed by
* Bogdan Sikorski
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdlib.h>
#include "gluP.h"
#include "tess.h"
#endif
 
 
 
static GLenum store_polygon_as_contour(GLUtriangulatorObj *);
static void free_current_polygon(tess_polygon *);
static void prepare_projection_info(GLUtriangulatorObj *);
static GLdouble twice_the_polygon_area(tess_vertex *, tess_vertex *);
static GLenum verify_edge_vertex_intersections(GLUtriangulatorObj *);
void tess_find_contour_hierarchies(GLUtriangulatorObj *);
static GLenum test_for_overlapping_contours(GLUtriangulatorObj *);
static GLenum contours_overlap(tess_contour *, tess_polygon *);
static GLenum is_contour_contained_in(tess_contour *, tess_contour *);
static void add_new_exterior(GLUtriangulatorObj *, tess_contour *);
static void add_new_interior(GLUtriangulatorObj *, tess_contour *,
tess_contour *);
static void add_interior_with_hierarchy_check(GLUtriangulatorObj *,
tess_contour *, tess_contour *);
static void reverse_hierarchy_and_add_exterior(GLUtriangulatorObj *,
tess_contour *,
tess_contour *);
static GLboolean point_in_polygon(tess_contour *, GLdouble, GLdouble);
static void shift_interior_to_exterior(GLUtriangulatorObj *, tess_contour *);
static void add_exterior_with_check(GLUtriangulatorObj *, tess_contour *,
tess_contour *);
static GLenum cut_out_hole(GLUtriangulatorObj *, tess_contour *,
tess_contour *);
static GLenum merge_hole_with_contour(GLUtriangulatorObj *,
tess_contour *, tess_contour *,
tess_vertex *, tess_vertex *);
 
static GLenum
find_normal(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
tess_vertex *va, *vb, *vc;
GLdouble A, B, C;
GLdouble A0, A1, A2, B0, B1, B2;
 
va = polygon->vertices;
vb = va->next;
A0 = vb->location[0] - va->location[0];
A1 = vb->location[1] - va->location[1];
A2 = vb->location[2] - va->location[2];
for (vc = vb->next; vc != va; vc = vc->next) {
B0 = vc->location[0] - va->location[0];
B1 = vc->location[1] - va->location[1];
B2 = vc->location[2] - va->location[2];
A = A1 * B2 - A2 * B1;
B = A2 * B0 - A0 * B2;
C = A0 * B1 - A1 * B0;
if (fabs(A) > EPSILON || fabs(B) > EPSILON || fabs(C) > EPSILON) {
polygon->A = A;
polygon->B = B;
polygon->C = C;
polygon->D =
-A * va->location[0] - B * va->location[1] - C * va->location[2];
return GLU_NO_ERROR;
}
}
tess_call_user_error(tobj, GLU_TESS_ERROR7);
return GLU_ERROR;
}
 
void
tess_test_polygon(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
 
/* any vertices defined? */
if (polygon->vertex_cnt < 3) {
free_current_polygon(polygon);
return;
}
/* wrap pointers */
polygon->last_vertex->next = polygon->vertices;
polygon->vertices->previous = polygon->last_vertex;
/* determine the normal */
if (find_normal(tobj) == GLU_ERROR)
return;
/* compare the normals of previously defined contours and this one */
/* first contour define ? */
if (tobj->contours == NULL) {
tobj->A = polygon->A;
tobj->B = polygon->B;
tobj->C = polygon->C;
tobj->D = polygon->D;
/* determine the best projection to use */
if (fabs(polygon->A) > fabs(polygon->B))
if (fabs(polygon->A) > fabs(polygon->C))
tobj->projection = OYZ;
else
tobj->projection = OXY;
else if (fabs(polygon->B) > fabs(polygon->C))
tobj->projection = OXZ;
else
tobj->projection = OXY;
}
else {
GLdouble a[3], b[3];
tess_vertex *vertex = polygon->vertices;
 
a[0] = tobj->A;
a[1] = tobj->B;
a[2] = tobj->C;
b[0] = polygon->A;
b[1] = polygon->B;
b[2] = polygon->C;
 
/* compare the normals */
if (fabs(a[1] * b[2] - a[2] * b[1]) > EPSILON ||
fabs(a[2] * b[0] - a[0] * b[2]) > EPSILON ||
fabs(a[0] * b[1] - a[1] * b[0]) > EPSILON) {
/* not coplanar */
tess_call_user_error(tobj, GLU_TESS_ERROR9);
return;
}
/* the normals are parallel - test for plane equation */
if (fabs(a[0] * vertex->location[0] + a[1] * vertex->location[1] +
a[2] * vertex->location[2] + tobj->D) > EPSILON) {
/* not the same plane */
tess_call_user_error(tobj, GLU_TESS_ERROR9);
return;
}
}
prepare_projection_info(tobj);
if (verify_edge_vertex_intersections(tobj) == GLU_ERROR)
return;
if (test_for_overlapping_contours(tobj) == GLU_ERROR)
return;
if (store_polygon_as_contour(tobj) == GLU_ERROR)
return;
}
 
static GLenum
test_for_overlapping_contours(GLUtriangulatorObj * tobj)
{
tess_contour *contour;
tess_polygon *polygon;
 
polygon = tobj->current_polygon;
for (contour = tobj->contours; contour != NULL; contour = contour->next)
if (contours_overlap(contour, polygon) != GLU_NO_ERROR) {
tess_call_user_error(tobj, GLU_TESS_ERROR5);
return GLU_ERROR;
}
return GLU_NO_ERROR;
}
 
static GLenum
store_polygon_as_contour(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
tess_contour *contour = tobj->contours;
 
/* the first contour defined */
if (contour == NULL) {
if ((contour = (tess_contour *) malloc(sizeof(tess_contour))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
free_current_polygon(polygon);
return GLU_ERROR;
}
tobj->contours = tobj->last_contour = contour;
contour->next = contour->previous = NULL;
}
else {
if ((contour = (tess_contour *) malloc(sizeof(tess_contour))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
free_current_polygon(polygon);
return GLU_ERROR;
}
contour->previous = tobj->last_contour;
tobj->last_contour->next = contour;
tobj->last_contour = contour;
contour->next = NULL;
}
/* mark all vertices in new contour as not special */
/* and all are boundary edges */
{
tess_vertex *vertex;
GLuint vertex_cnt, i;
 
for (vertex = polygon->vertices, i = 0, vertex_cnt =
polygon->vertex_cnt; i < vertex_cnt; vertex = vertex->next, i++) {
vertex->shadow_vertex = NULL;
vertex->edge_flag = GL_TRUE;
}
}
contour->vertex_cnt = polygon->vertex_cnt;
contour->area = polygon->area;
contour->orientation = polygon->orientation;
contour->type = GLU_UNKNOWN;
contour->vertices = polygon->vertices;
contour->last_vertex = polygon->last_vertex;
polygon->vertices = polygon->last_vertex = NULL;
polygon->vertex_cnt = 0;
++(tobj->contour_cnt);
return GLU_NO_ERROR;
}
 
static void
free_current_polygon(tess_polygon * polygon)
{
tess_vertex *vertex, *vertex_tmp;
GLuint i;
 
/* free current_polygon structures */
for (vertex = polygon->vertices, i = 0; i < polygon->vertex_cnt; i++) {
vertex_tmp = vertex->next;
free(vertex);
vertex = vertex_tmp;
}
polygon->vertices = polygon->last_vertex = NULL;
polygon->vertex_cnt = 0;
}
 
static void
prepare_projection_info(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
tess_vertex *vertex, *last_vertex_ptr;
GLdouble area;
 
last_vertex_ptr = polygon->last_vertex;
switch (tobj->projection) {
case OXY:
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
vertex = vertex->next) {
vertex->x = vertex->location[0];
vertex->y = vertex->location[1];
}
last_vertex_ptr->x = last_vertex_ptr->location[0];
last_vertex_ptr->y = last_vertex_ptr->location[1];
break;
case OXZ:
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
vertex = vertex->next) {
vertex->x = vertex->location[0];
vertex->y = vertex->location[2];
}
last_vertex_ptr->x = last_vertex_ptr->location[0];
last_vertex_ptr->y = last_vertex_ptr->location[2];
break;
case OYZ:
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
vertex = vertex->next) {
vertex->x = vertex->location[1];
vertex->y = vertex->location[2];
}
last_vertex_ptr->x = last_vertex_ptr->location[1];
last_vertex_ptr->y = last_vertex_ptr->location[2];
break;
}
area = twice_the_polygon_area(polygon->vertices, polygon->last_vertex);
if (area >= 0.0) {
polygon->orientation = GLU_CCW;
polygon->area = area;
}
else {
polygon->orientation = GLU_CW;
polygon->area = -area;
}
}
 
static GLdouble
twice_the_polygon_area(tess_vertex * vertex, tess_vertex * last_vertex)
{
tess_vertex *next;
GLdouble area, x, y;
 
area = 0.0;
x = vertex->x;
y = vertex->y;
vertex = vertex->next;
for (; vertex != last_vertex; vertex = vertex->next) {
next = vertex->next;
area +=
(vertex->x - x) * (next->y - y) - (vertex->y - y) * (next->x - x);
}
return area;
}
 
/* test if edges ab and cd intersect */
/* if not return GLU_NO_ERROR, else if cross return GLU_TESS_ERROR8, */
/* else if adjacent return GLU_TESS_ERROR4 */
static GLenum
edge_edge_intersect(tess_vertex * a,
tess_vertex * b, tess_vertex * c, tess_vertex * d)
{
GLdouble denom, r, s;
GLdouble xba, ydc, yba, xdc, yac, xac;
 
xba = b->x - a->x;
yba = b->y - a->y;
xdc = d->x - c->x;
ydc = d->y - c->y;
xac = a->x - c->x;
yac = a->y - c->y;
denom = xba * ydc - yba * xdc;
r = yac * xdc - xac * ydc;
/* parallel? */
if (fabs(denom) < EPSILON) {
if (fabs(r) < EPSILON) {
/* colinear */
if (fabs(xba) < EPSILON) {
/* compare the Y coordinate */
if (yba > 0.0) {
if (
(fabs(a->y - c->y) < EPSILON
&& fabs(c->y - b->y) < EPSILON)
|| (fabs(a->y - d->y) < EPSILON
&& fabs(d->y - b->y) <
EPSILON)) return GLU_TESS_ERROR4;
 
}
else {
if (
(fabs(b->y - c->y) < EPSILON
&& fabs(c->y - a->y) < EPSILON)
|| (fabs(b->y - d->y) < EPSILON
&& fabs(d->y - a->y) <
EPSILON)) return GLU_TESS_ERROR4;
}
}
else {
/* compare the X coordinate */
if (xba > 0.0) {
if (
(fabs(a->x - c->x) < EPSILON
&& fabs(c->x - b->x) < EPSILON)
|| (fabs(a->x - d->x) < EPSILON
&& fabs(d->x - b->x) <
EPSILON)) return GLU_TESS_ERROR4;
}
else {
if (
(fabs(b->x - c->x) < EPSILON
&& fabs(c->x - a->x) < EPSILON)
|| (fabs(b->x - d->x) < EPSILON
&& fabs(d->x - a->x) <
EPSILON)) return GLU_TESS_ERROR4;
}
}
}
return GLU_NO_ERROR;
}
r /= denom;
s = (yac * xba - xac * yba) / denom;
/* test if one vertex lies on other edge */
if (((fabs(r) < EPSILON || (r < 1.0 + EPSILON && r > 1.0 - EPSILON)) &&
s > -EPSILON && s < 1.0 + EPSILON) ||
((fabs(s) < EPSILON || (s < 1.0 + EPSILON && s > 1.0 - EPSILON)) &&
r > -EPSILON && r < 1.0 + EPSILON)) {
return GLU_TESS_ERROR4;
}
/* test for crossing */
if (r > -EPSILON && r < 1.0 + EPSILON && s > -EPSILON && s < 1.0 + EPSILON) {
return GLU_TESS_ERROR8;
}
return GLU_NO_ERROR;
}
 
static GLenum
verify_edge_vertex_intersections(GLUtriangulatorObj * tobj)
{
tess_polygon *polygon = tobj->current_polygon;
tess_vertex *vertex1, *last_vertex, *vertex2;
GLenum test;
 
last_vertex = polygon->last_vertex;
vertex1 = last_vertex;
for (vertex2 = vertex1->next->next;
vertex2->next != last_vertex; vertex2 = vertex2->next) {
test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
vertex2->next);
if (test != GLU_NO_ERROR) {
tess_call_user_error(tobj, test);
return GLU_ERROR;
}
}
for (vertex1 = polygon->vertices;
vertex1->next->next != last_vertex; vertex1 = vertex1->next) {
for (vertex2 = vertex1->next->next;
vertex2 != last_vertex; vertex2 = vertex2->next) {
test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
vertex2->next);
if (test != GLU_NO_ERROR) {
tess_call_user_error(tobj, test);
return GLU_ERROR;
}
}
}
return GLU_NO_ERROR;
}
 
static int
#ifdef WIN32
__cdecl
#endif
area_compare(const void *a, const void *b)
{
GLdouble area1, area2;
 
area1 = (*((tess_contour **) a))->area;
area2 = (*((tess_contour **) b))->area;
if (area1 < area2)
return 1;
if (area1 > area2)
return -1;
return 0;
}
 
void
tess_find_contour_hierarchies(GLUtriangulatorObj * tobj)
{
tess_contour **contours; /* dinamic array of pointers */
tess_contour *tmp_contour_ptr = tobj->contours;
GLuint cnt, i;
GLenum result;
GLboolean hierarchy_changed;
 
/* any contours? */
if (tobj->contour_cnt < 2) {
tobj->contours->type = GLU_EXTERIOR;
return;
}
if ((contours = (tess_contour **)
malloc(sizeof(tess_contour *) * (tobj->contour_cnt))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return;
}
for (tmp_contour_ptr = tobj->contours, cnt = 0;
tmp_contour_ptr != NULL; tmp_contour_ptr = tmp_contour_ptr->next)
contours[cnt++] = tmp_contour_ptr;
/* now sort the contours in decreasing area size order */
qsort((void *) contours, (size_t) cnt, (size_t) sizeof(tess_contour *),
area_compare);
/* we leave just the first contour - remove others from list */
tobj->contours = contours[0];
tobj->contours->next = tobj->contours->previous = NULL;
tobj->last_contour = tobj->contours;
tobj->contour_cnt = 1;
/* first contour is the one with greatest area */
/* must be EXTERIOR */
tobj->contours->type = GLU_EXTERIOR;
tmp_contour_ptr = tobj->contours;
/* now we play! */
for (i = 1; i < cnt; i++) {
hierarchy_changed = GL_FALSE;
for (tmp_contour_ptr = tobj->contours;
tmp_contour_ptr != NULL; tmp_contour_ptr = tmp_contour_ptr->next) {
if (tmp_contour_ptr->type == GLU_EXTERIOR) {
/* check if contour completely contained in EXTERIOR */
result = is_contour_contained_in(tmp_contour_ptr, contours[i]);
switch (result) {
case GLU_INTERIOR:
/* now we have to check if contour is inside interiors */
/* or not */
/* any interiors? */
if (tmp_contour_ptr->next != NULL &&
tmp_contour_ptr->next->type == GLU_INTERIOR) {
/* for all interior, check if inside any of them */
/* if not inside any of interiors, its another */
/* interior */
/* or it may contain some interiors, then change */
/* the contained interiors to exterior ones */
add_interior_with_hierarchy_check(tobj,
tmp_contour_ptr,
contours[i]);
}
else {
/* not in interior, add as new interior contour */
add_new_interior(tobj, tmp_contour_ptr, contours[i]);
}
hierarchy_changed = GL_TRUE;
break;
case GLU_EXTERIOR:
/* ooops, the marked as EXTERIOR (contours[i]) is */
/* actually an interior of tmp_contour_ptr */
/* reverse the local hierarchy */
reverse_hierarchy_and_add_exterior(tobj, tmp_contour_ptr,
contours[i]);
hierarchy_changed = GL_TRUE;
break;
case GLU_NO_ERROR:
break;
default:
abort();
}
}
if (hierarchy_changed)
break; /* break from for loop */
}
if (hierarchy_changed == GL_FALSE) {
/* disjoint with all contours, add to contour list */
add_new_exterior(tobj, contours[i]);
}
}
free(contours);
}
 
/* returns GLU_INTERIOR if inner is completey enclosed within outer */
/* returns GLU_EXTERIOR if outer is completely enclosed within inner */
/* returns GLU_NO_ERROR if contours are disjoint */
static GLenum
is_contour_contained_in(tess_contour * outer, tess_contour * inner)
{
GLenum relation_flag;
 
/* set relation_flag to relation of containment of first inner vertex */
/* regarding outer contour */
if (point_in_polygon(outer, inner->vertices->x, inner->vertices->y))
relation_flag = GLU_INTERIOR;
else
relation_flag = GLU_EXTERIOR;
if (relation_flag == GLU_INTERIOR)
return GLU_INTERIOR;
if (point_in_polygon(inner, outer->vertices->x, outer->vertices->y))
return GLU_EXTERIOR;
return GLU_NO_ERROR;
}
 
static GLboolean
point_in_polygon(tess_contour * contour, GLdouble x, GLdouble y)
{
tess_vertex *v1, *v2;
GLuint i, vertex_cnt;
GLdouble xp1, yp1, xp2, yp2;
GLboolean tst;
 
tst = GL_FALSE;
v1 = contour->vertices;
v2 = contour->vertices->previous;
for (i = 0, vertex_cnt = contour->vertex_cnt; i < vertex_cnt; i++) {
xp1 = v1->x;
yp1 = v1->y;
xp2 = v2->x;
yp2 = v2->y;
if ((((yp1 <= y) && (y < yp2)) || ((yp2 <= y) && (y < yp1))) &&
(x < (xp2 - xp1) * (y - yp1) / (yp2 - yp1) + xp1))
tst = (tst == GL_FALSE ? GL_TRUE : GL_FALSE);
v2 = v1;
v1 = v1->next;
}
return tst;
}
 
static GLenum
contours_overlap(tess_contour * contour, tess_polygon * polygon)
{
tess_vertex *vertex1, *vertex2;
GLuint vertex1_cnt, vertex2_cnt, i, j;
GLenum test;
 
vertex1 = contour->vertices;
vertex2 = polygon->vertices;
vertex1_cnt = contour->vertex_cnt;
vertex2_cnt = polygon->vertex_cnt;
for (i = 0; i < vertex1_cnt; vertex1 = vertex1->next, i++) {
for (j = 0; j < vertex2_cnt; vertex2 = vertex2->next, j++)
if ((test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
vertex2->next)) != GLU_NO_ERROR)
return test;
}
return GLU_NO_ERROR;
}
 
static void
add_new_exterior(GLUtriangulatorObj * tobj, tess_contour * contour)
{
contour->type = GLU_EXTERIOR;
contour->next = NULL;
contour->previous = tobj->last_contour;
tobj->last_contour->next = contour;
tobj->last_contour = contour;
}
 
static void
add_new_interior(GLUtriangulatorObj * tobj,
tess_contour * outer, tess_contour * contour)
{
contour->type = GLU_INTERIOR;
contour->next = outer->next;
contour->previous = outer;
if (outer->next != NULL)
outer->next->previous = contour;
outer->next = contour;
if (tobj->last_contour == outer)
tobj->last_contour = contour;
}
 
static void
add_interior_with_hierarchy_check(GLUtriangulatorObj * tobj,
tess_contour * outer,
tess_contour * contour)
{
tess_contour *ptr;
 
/* for all interiors of outer check if they are interior of contour */
/* if so, change that interior to exterior and move it of of the */
/* interior sequence */
if (outer->next != NULL && outer->next->type == GLU_INTERIOR) {
GLenum test;
 
for (ptr = outer->next; ptr != NULL && ptr->type == GLU_INTERIOR;
ptr = ptr->next) {
test = is_contour_contained_in(ptr, contour);
switch (test) {
case GLU_INTERIOR:
/* contour is contained in one of the interiors */
/* check if possibly contained in other exteriors */
/* move ptr to first EXTERIOR */
for (; ptr != NULL && ptr->type == GLU_INTERIOR; ptr = ptr->next);
if (ptr == NULL)
/* another exterior */
add_new_exterior(tobj, contour);
else
add_exterior_with_check(tobj, ptr, contour);
return;
case GLU_EXTERIOR:
/* one of the interiors is contained in the contour */
/* change it to EXTERIOR, and shift it away from the */
/* interior sequence */
shift_interior_to_exterior(tobj, ptr);
break;
case GLU_NO_ERROR:
/* disjoint */
break;
default:
abort();
}
}
}
/* add contour to the interior sequence */
add_new_interior(tobj, outer, contour);
}
 
static void
reverse_hierarchy_and_add_exterior(GLUtriangulatorObj * tobj,
tess_contour * outer,
tess_contour * contour)
{
tess_contour *ptr;
 
/* reverse INTERIORS to EXTERIORS */
/* any INTERIORS? */
if (outer->next != NULL && outer->next->type == GLU_INTERIOR)
for (ptr = outer->next; ptr != NULL && ptr->type == GLU_INTERIOR;
ptr = ptr->next) ptr->type = GLU_EXTERIOR;
/* the outer now becomes inner */
outer->type = GLU_INTERIOR;
/* contour is the EXTERIOR */
contour->next = outer;
if (tobj->contours == outer) {
/* first contour beeing reversed */
contour->previous = NULL;
tobj->contours = contour;
}
else {
outer->previous->next = contour;
contour->previous = outer->previous;
}
outer->previous = contour;
}
 
static void
shift_interior_to_exterior(GLUtriangulatorObj * tobj, tess_contour * contour)
{
contour->previous->next = contour->next;
if (contour->next != NULL)
contour->next->previous = contour->previous;
else
tobj->last_contour = contour->previous;
}
 
static void
add_exterior_with_check(GLUtriangulatorObj * tobj,
tess_contour * outer, tess_contour * contour)
{
GLenum test;
 
/* this contour might be interior to further exteriors - check */
/* if not, just add as a new exterior */
for (; outer != NULL && outer->type == GLU_EXTERIOR; outer = outer->next) {
test = is_contour_contained_in(outer, contour);
switch (test) {
case GLU_INTERIOR:
/* now we have to check if contour is inside interiors */
/* or not */
/* any interiors? */
if (outer->next != NULL && outer->next->type == GLU_INTERIOR) {
/* for all interior, check if inside any of them */
/* if not inside any of interiors, its another */
/* interior */
/* or it may contain some interiors, then change */
/* the contained interiors to exterior ones */
add_interior_with_hierarchy_check(tobj, outer, contour);
}
else {
/* not in interior, add as new interior contour */
add_new_interior(tobj, outer, contour);
}
return;
case GLU_NO_ERROR:
/* disjoint */
break;
default:
abort();
}
}
/* add contour to the exterior sequence */
add_new_exterior(tobj, contour);
}
 
void
tess_handle_holes(GLUtriangulatorObj * tobj)
{
tess_contour *contour, *hole;
GLenum exterior_orientation;
 
/* verify hole orientation */
for (contour = tobj->contours; contour != NULL;) {
exterior_orientation = contour->orientation;
for (contour = contour->next;
contour != NULL && contour->type == GLU_INTERIOR;
contour = contour->next) {
if (contour->orientation == exterior_orientation) {
tess_call_user_error(tobj, GLU_TESS_ERROR5);
return;
}
}
}
/* now cut-out holes */
for (contour = tobj->contours; contour != NULL;) {
hole = contour->next;
while (hole != NULL && hole->type == GLU_INTERIOR) {
if (cut_out_hole(tobj, contour, hole) == GLU_ERROR)
return;
hole = contour->next;
}
contour = contour->next;
}
}
 
static GLenum
cut_out_hole(GLUtriangulatorObj * tobj,
tess_contour * contour, tess_contour * hole)
{
tess_contour *tmp_hole;
tess_vertex *v1, *v2, *tmp_vertex;
GLuint vertex1_cnt, vertex2_cnt, tmp_vertex_cnt;
GLuint i, j, k;
GLenum test = 0;
 
/* find an edge connecting contour and hole not intersecting any other */
/* edge belonging to either the contour or any of the other holes */
for (v1 = contour->vertices, vertex1_cnt = contour->vertex_cnt, i = 0;
i < vertex1_cnt; i++, v1 = v1->next) {
for (v2 = hole->vertices, vertex2_cnt = hole->vertex_cnt, j = 0;
j < vertex2_cnt; j++, v2 = v2->next) {
/* does edge (v1,v2) intersect any edge of contour */
for (tmp_vertex = contour->vertices, tmp_vertex_cnt =
contour->vertex_cnt, k = 0; k < tmp_vertex_cnt;
tmp_vertex = tmp_vertex->next, k++) {
/* skip edge tests for edges directly connected */
if (v1 == tmp_vertex || v1 == tmp_vertex->next)
continue;
test = edge_edge_intersect(v1, v2, tmp_vertex, tmp_vertex->next);
if (test != GLU_NO_ERROR)
break;
}
if (test == GLU_NO_ERROR) {
/* does edge (v1,v2) intersect any edge of hole */
for (tmp_vertex = hole->vertices,
tmp_vertex_cnt = hole->vertex_cnt, k = 0;
k < tmp_vertex_cnt; tmp_vertex = tmp_vertex->next, k++) {
/* skip edge tests for edges directly connected */
if (v2 == tmp_vertex || v2 == tmp_vertex->next)
continue;
test =
edge_edge_intersect(v1, v2, tmp_vertex, tmp_vertex->next);
if (test != GLU_NO_ERROR)
break;
}
if (test == GLU_NO_ERROR) {
/* does edge (v1,v2) intersect any other hole? */
for (tmp_hole = hole->next;
tmp_hole != NULL && tmp_hole->type == GLU_INTERIOR;
tmp_hole = tmp_hole->next) {
/* does edge (v1,v2) intersect any edge of hole */
for (tmp_vertex = tmp_hole->vertices,
tmp_vertex_cnt = tmp_hole->vertex_cnt, k = 0;
k < tmp_vertex_cnt; tmp_vertex = tmp_vertex->next, k++) {
test = edge_edge_intersect(v1, v2, tmp_vertex,
tmp_vertex->next);
if (test != GLU_NO_ERROR)
break;
}
if (test != GLU_NO_ERROR)
break;
}
}
}
if (test == GLU_NO_ERROR) {
/* edge (v1,v2) is good for eliminating the hole */
if (merge_hole_with_contour(tobj, contour, hole, v1, v2)
== GLU_NO_ERROR)
return GLU_NO_ERROR;
else
return GLU_ERROR;
}
}
}
/* other holes are blocking all possible connections of hole */
/* with contour, we shift this hole as the last hole and retry */
for (tmp_hole = hole;
tmp_hole != NULL && tmp_hole->type == GLU_INTERIOR;
tmp_hole = tmp_hole->next);
contour->next = hole->next;
hole->next->previous = contour;
if (tmp_hole == NULL) {
/* last EXTERIOR contour, shift hole as last contour */
hole->next = NULL;
hole->previous = tobj->last_contour;
tobj->last_contour->next = hole;
tobj->last_contour = hole;
}
else {
tmp_hole->previous->next = hole;
hole->previous = tmp_hole->previous;
tmp_hole->previous = hole;
hole->next = tmp_hole;
}
hole = contour->next;
/* try once again - recurse */
return cut_out_hole(tobj, contour, hole);
}
 
static GLenum
merge_hole_with_contour(GLUtriangulatorObj * tobj,
tess_contour * contour,
tess_contour * hole,
tess_vertex * v1, tess_vertex * v2)
{
tess_vertex *v1_new, *v2_new;
 
/* make copies of v1 and v2, place them respectively after their originals */
if ((v1_new = (tess_vertex *) malloc(sizeof(tess_vertex))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
if ((v2_new = (tess_vertex *) malloc(sizeof(tess_vertex))) == NULL) {
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
v1_new->edge_flag = GL_TRUE;
v1_new->data = v1->data;
v1_new->location[0] = v1->location[0];
v1_new->location[1] = v1->location[1];
v1_new->location[2] = v1->location[2];
v1_new->x = v1->x;
v1_new->y = v1->y;
v1_new->shadow_vertex = v1;
v1->shadow_vertex = v1_new;
v1_new->next = v1->next;
v1_new->previous = v1;
v1->next->previous = v1_new;
v1->next = v1_new;
v2_new->edge_flag = GL_TRUE;
v2_new->data = v2->data;
v2_new->location[0] = v2->location[0];
v2_new->location[1] = v2->location[1];
v2_new->location[2] = v2->location[2];
v2_new->x = v2->x;
v2_new->y = v2->y;
v2_new->shadow_vertex = v2;
v2->shadow_vertex = v2_new;
v2_new->next = v2->next;
v2_new->previous = v2;
v2->next->previous = v2_new;
v2->next = v2_new;
/* link together the two lists */
v1->next = v2_new;
v2_new->previous = v1;
v2->next = v1_new;
v1_new->previous = v2;
/* update the vertex count of the contour */
contour->vertex_cnt += hole->vertex_cnt + 2;
/* remove the INTERIOR contour */
contour->next = hole->next;
if (hole->next != NULL)
hole->next->previous = contour;
free(hole);
/* update tobj structure */
--(tobj->contour_cnt);
if (contour->last_vertex == v1)
contour->last_vertex = v1_new;
/* mark two vertices with edge_flag */
v2->edge_flag = GL_FALSE;
v1->edge_flag = GL_FALSE;
return GLU_NO_ERROR;
}
/shark/trunk/ports/mesa/src-glu/mipmap.c
0,0 → 1,825
/* $Id: mipmap.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.4
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "gluP.h"
#endif
 
 
/*
* Compute ceiling of integer quotient of A divided by B:
*/
#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
 
 
 
#ifdef EPSILON
#undef EPSILON
#endif
#define EPSILON 0.001
 
 
/* To work around optimizer bug in MSVC4.1 */
#if defined(__WIN32__) && !defined(OPENSTEP)
void
dummy(GLuint j, GLuint k)
{
}
#else
#define dummy(J, K)
#endif
 
 
GLint GLAPIENTRY
gluScaleImage(GLenum format,
GLsizei widthin, GLsizei heightin,
GLenum typein, const void *datain,
GLsizei widthout, GLsizei heightout,
GLenum typeout, void *dataout)
{
GLint components, i, j, k;
GLfloat *tempin, *tempout;
GLfloat sx, sy;
GLint unpackrowlength, unpackalignment, unpackskiprows, unpackskippixels;
GLint packrowlength, packalignment, packskiprows, packskippixels;
GLint sizein, sizeout;
GLint rowstride, rowlen;
 
 
/* Determine number of components per pixel */
switch (format) {
case GL_COLOR_INDEX:
case GL_STENCIL_INDEX:
case GL_DEPTH_COMPONENT:
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_LUMINANCE:
components = 1;
break;
case GL_LUMINANCE_ALPHA:
components = 2;
break;
case GL_RGB:
case GL_BGR:
components = 3;
break;
case GL_RGBA:
case GL_BGRA:
#ifdef GL_EXT_abgr
case GL_ABGR_EXT:
#endif
components = 4;
break;
default:
return GLU_INVALID_ENUM;
}
 
/* Determine bytes per input datum */
switch (typein) {
case GL_UNSIGNED_BYTE:
sizein = sizeof(GLubyte);
break;
case GL_BYTE:
sizein = sizeof(GLbyte);
break;
case GL_UNSIGNED_SHORT:
sizein = sizeof(GLushort);
break;
case GL_SHORT:
sizein = sizeof(GLshort);
break;
case GL_UNSIGNED_INT:
sizein = sizeof(GLuint);
break;
case GL_INT:
sizein = sizeof(GLint);
break;
case GL_FLOAT:
sizein = sizeof(GLfloat);
break;
case GL_BITMAP:
/* not implemented yet */
default:
return GL_INVALID_ENUM;
}
 
/* Determine bytes per output datum */
switch (typeout) {
case GL_UNSIGNED_BYTE:
sizeout = sizeof(GLubyte);
break;
case GL_BYTE:
sizeout = sizeof(GLbyte);
break;
case GL_UNSIGNED_SHORT:
sizeout = sizeof(GLushort);
break;
case GL_SHORT:
sizeout = sizeof(GLshort);
break;
case GL_UNSIGNED_INT:
sizeout = sizeof(GLuint);
break;
case GL_INT:
sizeout = sizeof(GLint);
break;
case GL_FLOAT:
sizeout = sizeof(GLfloat);
break;
case GL_BITMAP:
/* not implemented yet */
default:
return GL_INVALID_ENUM;
}
 
/* Get glPixelStore state */
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &unpackrowlength);
glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpackalignment);
glGetIntegerv(GL_UNPACK_SKIP_ROWS, &unpackskiprows);
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &unpackskippixels);
glGetIntegerv(GL_PACK_ROW_LENGTH, &packrowlength);
glGetIntegerv(GL_PACK_ALIGNMENT, &packalignment);
glGetIntegerv(GL_PACK_SKIP_ROWS, &packskiprows);
glGetIntegerv(GL_PACK_SKIP_PIXELS, &packskippixels);
 
/* Allocate storage for intermediate images */
tempin = (GLfloat *) malloc(widthin * heightin
* components * sizeof(GLfloat));
if (!tempin) {
return GLU_OUT_OF_MEMORY;
}
tempout = (GLfloat *) malloc(widthout * heightout
* components * sizeof(GLfloat));
if (!tempout) {
free(tempin);
return GLU_OUT_OF_MEMORY;
}
 
 
/*
* Unpack the pixel data and convert to floating point
*/
 
if (unpackrowlength > 0) {
rowlen = unpackrowlength;
}
else {
rowlen = widthin;
}
if (sizein >= unpackalignment) {
rowstride = components * rowlen;
}
else {
rowstride = unpackalignment / sizein
* CEILING(components * rowlen * sizein, unpackalignment);
}
 
switch (typein) {
case GL_UNSIGNED_BYTE:
k = 0;
for (i = 0; i < heightin; i++) {
GLubyte *ubptr = (GLubyte *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * ubptr++;
}
}
break;
case GL_BYTE:
k = 0;
for (i = 0; i < heightin; i++) {
GLbyte *bptr = (GLbyte *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * bptr++;
}
}
break;
case GL_UNSIGNED_SHORT:
k = 0;
for (i = 0; i < heightin; i++) {
GLushort *usptr = (GLushort *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * usptr++;
}
}
break;
case GL_SHORT:
k = 0;
for (i = 0; i < heightin; i++) {
GLshort *sptr = (GLshort *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * sptr++;
}
}
break;
case GL_UNSIGNED_INT:
k = 0;
for (i = 0; i < heightin; i++) {
GLuint *uiptr = (GLuint *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * uiptr++;
}
}
break;
case GL_INT:
k = 0;
for (i = 0; i < heightin; i++) {
GLint *iptr = (GLint *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = (GLfloat) * iptr++;
}
}
break;
case GL_FLOAT:
k = 0;
for (i = 0; i < heightin; i++) {
GLfloat *fptr = (GLfloat *) datain
+ i * rowstride
+ unpackskiprows * rowstride + unpackskippixels * components;
for (j = 0; j < widthin * components; j++) {
dummy(j, k);
tempin[k++] = *fptr++;
}
}
break;
default:
return GLU_INVALID_ENUM;
}
 
 
/*
* Scale the image!
*/
 
if (widthout > 1)
sx = (GLfloat) (widthin - 1) / (GLfloat) (widthout - 1);
else
sx = (GLfloat) (widthin - 1);
if (heightout > 1)
sy = (GLfloat) (heightin - 1) / (GLfloat) (heightout - 1);
else
sy = (GLfloat) (heightin - 1);
 
/*#define POINT_SAMPLE*/
#ifdef POINT_SAMPLE
for (i = 0; i < heightout; i++) {
GLint ii = i * sy;
for (j = 0; j < widthout; j++) {
GLint jj = j * sx;
 
GLfloat *src = tempin + (ii * widthin + jj) * components;
GLfloat *dst = tempout + (i * widthout + j) * components;
 
for (k = 0; k < components; k++) {
*dst++ = *src++;
}
}
}
#else
if (sx < 1.0 && sy < 1.0) {
/* magnify both width and height: use weighted sample of 4 pixels */
GLint i0, i1, j0, j1;
GLfloat alpha, beta;
GLfloat *src00, *src01, *src10, *src11;
GLfloat s1, s2;
GLfloat *dst;
 
for (i = 0; i < heightout; i++) {
i0 = i * sy;
i1 = i0 + 1;
if (i1 >= heightin)
i1 = heightin - 1;
/* i1 = (i+1) * sy - EPSILON;*/
alpha = i * sy - i0;
for (j = 0; j < widthout; j++) {
j0 = j * sx;
j1 = j0 + 1;
if (j1 >= widthin)
j1 = widthin - 1;
/* j1 = (j+1) * sx - EPSILON; */
beta = j * sx - j0;
 
/* compute weighted average of pixels in rect (i0,j0)-(i1,j1) */
src00 = tempin + (i0 * widthin + j0) * components;
src01 = tempin + (i0 * widthin + j1) * components;
src10 = tempin + (i1 * widthin + j0) * components;
src11 = tempin + (i1 * widthin + j1) * components;
 
dst = tempout + (i * widthout + j) * components;
 
for (k = 0; k < components; k++) {
s1 = *src00++ * (1.0 - beta) + *src01++ * beta;
s2 = *src10++ * (1.0 - beta) + *src11++ * beta;
*dst++ = s1 * (1.0 - alpha) + s2 * alpha;
}
}
}
}
else {
/* shrink width and/or height: use an unweighted box filter */
GLint i0, i1;
GLint j0, j1;
GLint ii, jj;
GLfloat sum, *dst;
 
for (i = 0; i < heightout; i++) {
i0 = i * sy;
i1 = i0 + 1;
if (i1 >= heightin)
i1 = heightin - 1;
/* i1 = (i+1) * sy - EPSILON; */
for (j = 0; j < widthout; j++) {
j0 = j * sx;
j1 = j0 + 1;
if (j1 >= widthin)
j1 = widthin - 1;
/* j1 = (j+1) * sx - EPSILON; */
 
dst = tempout + (i * widthout + j) * components;
 
/* compute average of pixels in the rectangle (i0,j0)-(i1,j1) */
for (k = 0; k < components; k++) {
sum = 0.0;
for (ii = i0; ii <= i1; ii++) {
for (jj = j0; jj <= j1; jj++) {
sum += *(tempin + (ii * widthin + jj) * components + k);
}
}
sum /= (j1 - j0 + 1) * (i1 - i0 + 1);
*dst++ = sum;
}
}
}
}
#endif
 
 
/*
* Return output image
*/
 
if (packrowlength > 0) {
rowlen = packrowlength;
}
else {
rowlen = widthout;
}
if (sizeout >= packalignment) {
rowstride = components * rowlen;
}
else {
rowstride = packalignment / sizeout
* CEILING(components * rowlen * sizeout, packalignment);
}
 
switch (typeout) {
case GL_UNSIGNED_BYTE:
k = 0;
for (i = 0; i < heightout; i++) {
GLubyte *ubptr = (GLubyte *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*ubptr++ = (GLubyte) tempout[k++];
}
}
break;
case GL_BYTE:
k = 0;
for (i = 0; i < heightout; i++) {
GLbyte *bptr = (GLbyte *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*bptr++ = (GLbyte) tempout[k++];
}
}
break;
case GL_UNSIGNED_SHORT:
k = 0;
for (i = 0; i < heightout; i++) {
GLushort *usptr = (GLushort *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*usptr++ = (GLushort) tempout[k++];
}
}
break;
case GL_SHORT:
k = 0;
for (i = 0; i < heightout; i++) {
GLshort *sptr = (GLshort *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*sptr++ = (GLshort) tempout[k++];
}
}
break;
case GL_UNSIGNED_INT:
k = 0;
for (i = 0; i < heightout; i++) {
GLuint *uiptr = (GLuint *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*uiptr++ = (GLuint) tempout[k++];
}
}
break;
case GL_INT:
k = 0;
for (i = 0; i < heightout; i++) {
GLint *iptr = (GLint *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*iptr++ = (GLint) tempout[k++];
}
}
break;
case GL_FLOAT:
k = 0;
for (i = 0; i < heightout; i++) {
GLfloat *fptr = (GLfloat *) dataout
+ i * rowstride
+ packskiprows * rowstride + packskippixels * components;
for (j = 0; j < widthout * components; j++) {
dummy(j, k + i);
*fptr++ = tempout[k++];
}
}
break;
default:
return GLU_INVALID_ENUM;
}
 
 
/* free temporary image storage */
free(tempin);
free(tempout);
 
return 0;
}
 
 
 
/*
* Return the largest k such that 2^k <= n.
*/
static GLint
ilog2(GLint n)
{
GLint k;
 
if (n <= 0)
return 0;
for (k = 0; n >>= 1; k++);
return k;
}
 
 
 
/*
* Find the value nearest to n which is also a power of two.
*/
static GLint
round2(GLint n)
{
GLint m;
 
for (m = 1; m < n; m *= 2);
 
/* m>=n */
if (m - n <= n - m / 2) {
return m;
}
else {
return m / 2;
}
}
 
 
/*
* Given an pixel format and datatype, return the number of bytes to
* store one pixel.
*/
static GLint
bytes_per_pixel(GLenum format, GLenum type)
{
GLint n, m;
 
switch (format) {
case GL_COLOR_INDEX:
case GL_STENCIL_INDEX:
case GL_DEPTH_COMPONENT:
case GL_RED:
case GL_GREEN:
case GL_BLUE:
case GL_ALPHA:
case GL_LUMINANCE:
n = 1;
break;
case GL_LUMINANCE_ALPHA:
n = 2;
break;
case GL_RGB:
case GL_BGR:
n = 3;
break;
case GL_RGBA:
case GL_BGRA:
#ifdef GL_EXT_abgr
case GL_ABGR_EXT:
#endif
n = 4;
break;
default:
n = 0;
}
 
switch (type) {
case GL_UNSIGNED_BYTE:
m = sizeof(GLubyte);
break;
case GL_BYTE:
m = sizeof(GLbyte);
break;
case GL_BITMAP:
m = 1;
break;
case GL_UNSIGNED_SHORT:
m = sizeof(GLushort);
break;
case GL_SHORT:
m = sizeof(GLshort);
break;
case GL_UNSIGNED_INT:
m = sizeof(GLuint);
break;
case GL_INT:
m = sizeof(GLint);
break;
case GL_FLOAT:
m = sizeof(GLfloat);
break;
default:
m = 0;
}
 
return n * m;
}
 
 
 
/*
* WARNING: This function isn't finished and has never been tested!!!!
*/
GLint GLAPIENTRY
gluBuild1DMipmaps(GLenum target, GLint components,
GLsizei width, GLenum format, GLenum type, const void *data)
{
GLubyte *texture;
GLint levels, max_levels;
GLint new_width, max_width;
GLint i, j, k, l;
 
if (width < 1)
return GLU_INVALID_VALUE;
 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_width);
max_levels = ilog2(max_width) + 1;
 
/* Compute how many mipmap images to make */
levels = ilog2(width) + 1;
if (levels > max_levels) {
levels = max_levels;
}
 
new_width = 1 << (levels - 1);
 
texture = (GLubyte *) malloc(new_width * components);
if (!texture) {
return GLU_OUT_OF_MEMORY;
}
 
if (width != new_width) {
/* initial rescaling */
switch (type) {
case GL_UNSIGNED_BYTE:
{
GLubyte *ub_data = (GLubyte *) data;
for (i = 0; i < new_width; i++) {
j = i * width / new_width;
for (k = 0; k < components; k++) {
texture[i * components + k] = ub_data[j * components + k];
}
}
}
break;
default:
/* Not implemented */
return GLU_ERROR;
}
}
 
/* generate and load mipmap images */
for (l = 0; l < levels; l++) {
glTexImage1D(GL_TEXTURE_1D, l, components, new_width, 0,
format, GL_UNSIGNED_BYTE, texture);
 
/* Scale image down to 1/2 size */
new_width = new_width / 2;
for (i = 0; i < new_width; i++) {
for (k = 0; k < components; k++) {
GLint sample1, sample2;
sample1 = (GLint) texture[i * 2 * components + k];
sample2 = (GLint) texture[(i * 2 + 1) * components + k];
texture[i * components + k] = (GLubyte) ((sample1 + sample2) / 2);
}
}
}
 
free(texture);
 
return 0;
}
 
 
 
GLint GLAPIENTRY
gluBuild2DMipmaps(GLenum target, GLint components,
GLsizei width, GLsizei height, GLenum format,
GLenum type, const void *data)
{
GLint w, h, maxsize;
void *image, *newimage;
GLint neww, newh, level, bpp;
int error;
GLboolean done;
GLint retval = 0;
GLint unpackrowlength, unpackalignment, unpackskiprows, unpackskippixels;
GLint packrowlength, packalignment, packskiprows, packskippixels;
 
if (width < 1 || height < 1)
return GLU_INVALID_VALUE;
 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxsize);
 
w = round2(width);
if (w > maxsize) {
w = maxsize;
}
h = round2(height);
if (h > maxsize) {
h = maxsize;
}
 
bpp = bytes_per_pixel(format, type);
if (bpp == 0) {
/* probably a bad format or type enum */
return GLU_INVALID_ENUM;
}
 
/* Get current glPixelStore values */
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &unpackrowlength);
glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpackalignment);
glGetIntegerv(GL_UNPACK_SKIP_ROWS, &unpackskiprows);
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &unpackskippixels);
glGetIntegerv(GL_PACK_ROW_LENGTH, &packrowlength);
glGetIntegerv(GL_PACK_ALIGNMENT, &packalignment);
glGetIntegerv(GL_PACK_SKIP_ROWS, &packskiprows);
glGetIntegerv(GL_PACK_SKIP_PIXELS, &packskippixels);
 
/* set pixel packing */
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
 
done = GL_FALSE;
 
if (w != width || h != height) {
/* must rescale image to get "top" mipmap texture image */
image = malloc((w + 4) * h * bpp);
if (!image) {
return GLU_OUT_OF_MEMORY;
}
error = gluScaleImage(format, width, height, type, data,
w, h, type, image);
if (error) {
retval = error;
done = GL_TRUE;
}
}
else {
image = (void *) data;
}
 
level = 0;
while (!done) {
if (image != data) {
/* set pixel unpacking */
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
}
 
glTexImage2D(target, level, components, w, h, 0, format, type, image);
 
if (w == 1 && h == 1)
break;
 
neww = (w < 2) ? 1 : w / 2;
newh = (h < 2) ? 1 : h / 2;
newimage = malloc((neww + 4) * newh * bpp);
if (!newimage) {
return GLU_OUT_OF_MEMORY;
}
 
error = gluScaleImage(format, w, h, type, image,
neww, newh, type, newimage);
if (error) {
retval = error;
done = GL_TRUE;
}
 
if (image != data) {
free(image);
}
image = newimage;
 
w = neww;
h = newh;
level++;
}
 
if (image != data) {
free(image);
}
 
/* Restore original glPixelStore state */
glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackrowlength);
glPixelStorei(GL_UNPACK_ALIGNMENT, unpackalignment);
glPixelStorei(GL_UNPACK_SKIP_ROWS, unpackskiprows);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackskippixels);
glPixelStorei(GL_PACK_ROW_LENGTH, packrowlength);
glPixelStorei(GL_PACK_ALIGNMENT, packalignment);
glPixelStorei(GL_PACK_SKIP_ROWS, packskiprows);
glPixelStorei(GL_PACK_SKIP_PIXELS, packskippixels);
 
return retval;
}
/shark/trunk/ports/mesa/src-glu/tess.h
0,0 → 1,108
/* $Id: tess.h,v 1.1 2003-02-28 11:42:08 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file is part of the polygon tesselation code contributed by
* Bogdan Sikorski
*/
 
 
#ifndef TESS_H
#define TESS_H
 
 
#include "gluP.h"
 
#define EPSILON 1e-06 /* epsilon for double precision compares */
 
typedef enum
{
OXY,
OYZ,
OXZ
}
projection_type;
 
typedef struct callbacks_str
{
void (GLCALLBACK * begin) (GLenum mode);
void (GLCALLBACK * edgeFlag) (GLboolean flag);
void (GLCALLBACK * vertex) (GLvoid * v);
void (GLCALLBACK * end) (void);
void (GLCALLBACK * error) (GLenum err);
}
tess_callbacks;
 
typedef struct vertex_str
{
void *data;
GLdouble location[3];
GLdouble x, y;
GLboolean edge_flag;
struct vertex_str *shadow_vertex;
struct vertex_str *next, *previous;
}
tess_vertex;
 
typedef struct contour_str
{
GLenum type;
GLuint vertex_cnt;
GLdouble area;
GLenum orientation;
struct vertex_str *vertices, *last_vertex;
struct contour_str *next, *previous;
}
tess_contour;
 
typedef struct polygon_str
{
GLuint vertex_cnt;
GLdouble A, B, C, D;
GLdouble area;
GLenum orientation;
struct vertex_str *vertices, *last_vertex;
}
tess_polygon;
 
struct GLUtesselator
{
tess_contour *contours, *last_contour;
GLuint contour_cnt;
tess_callbacks callbacks;
tess_polygon *current_polygon;
GLenum error;
GLdouble A, B, C, D;
projection_type projection;
};
 
 
extern void tess_call_user_error(GLUtriangulatorObj *, GLenum);
extern void tess_test_polygon(GLUtriangulatorObj *);
extern void tess_find_contour_hierarchies(GLUtriangulatorObj *);
extern void tess_handle_holes(GLUtriangulatorObj *);
extern void tess_tesselate(GLUtriangulatorObj *);
extern void tess_tesselate_with_edge_flag(GLUtriangulatorObj *);
 
 
#endif
/shark/trunk/ports/mesa/src-glu/nurbscrv.c
0,0 → 1,445
/* $Id: nurbscrv.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
* See README2 for more info.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdlib.h>
#include "gluP.h"
#include "nurbs.h"
#endif
 
 
static int
get_curve_dim(GLenum type)
{
switch (type) {
case GL_MAP1_VERTEX_3:
return 3;
case GL_MAP1_VERTEX_4:
return 4;
case GL_MAP1_INDEX:
return 1;
case GL_MAP1_COLOR_4:
return 4;
case GL_MAP1_NORMAL:
return 3;
case GL_MAP1_TEXTURE_COORD_1:
return 1;
case GL_MAP1_TEXTURE_COORD_2:
return 2;
case GL_MAP1_TEXTURE_COORD_3:
return 3;
case GL_MAP1_TEXTURE_COORD_4:
return 4;
default:
abort(); /* TODO: is this OK? */
}
return 0; /*never get here */
}
 
static GLenum
test_nurbs_curve(GLUnurbsObj * nobj, curve_attribs * attribs)
{
GLenum err;
GLint tmp_int;
 
if (attribs->order < 0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return GLU_ERROR;
}
glGetIntegerv(GL_MAX_EVAL_ORDER, &tmp_int);
if (attribs->order > tmp_int || attribs->order < 2) {
call_user_error(nobj, GLU_NURBS_ERROR1);
return GLU_ERROR;
}
if (attribs->knot_count < attribs->order + 2) {
call_user_error(nobj, GLU_NURBS_ERROR2);
return GLU_ERROR;
}
if (attribs->stride < 0) {
call_user_error(nobj, GLU_NURBS_ERROR34);
return GLU_ERROR;
}
if (attribs->knot == NULL || attribs->ctrlarray == NULL) {
call_user_error(nobj, GLU_NURBS_ERROR36);
return GLU_ERROR;
}
if ((err = test_knot(attribs->knot_count, attribs->knot, attribs->order))
!= GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
return GLU_NO_ERROR;
}
 
static GLenum
test_nurbs_curves(GLUnurbsObj * nobj)
{
/* test the geometric data */
if (test_nurbs_curve(nobj, &(nobj->curve.geom)) != GLU_NO_ERROR)
return GLU_ERROR;
/* now test the attributive data */
/* color */
if (nobj->curve.color.type != GLU_INVALID_ENUM)
if (test_nurbs_curve(nobj, &(nobj->curve.color)) != GLU_NO_ERROR)
return GLU_ERROR;
/* normal */
if (nobj->curve.normal.type != GLU_INVALID_ENUM)
if (test_nurbs_curve(nobj, &(nobj->curve.normal)) != GLU_NO_ERROR)
return GLU_ERROR;
/* texture */
if (nobj->curve.texture.type != GLU_INVALID_ENUM)
if (test_nurbs_curve(nobj, &(nobj->curve.texture)) != GLU_NO_ERROR)
return GLU_ERROR;
return GLU_NO_ERROR;
}
 
/* prepare the knot information structures */
static GLenum
fill_knot_structures(GLUnurbsObj * nobj, knot_str_type * geom_knot,
knot_str_type * color_knot, knot_str_type * normal_knot,
knot_str_type * texture_knot)
{
GLint order;
GLfloat *knot;
GLint nknots;
GLint t_min, t_max;
 
geom_knot->unified_knot = NULL;
knot = geom_knot->knot = nobj->curve.geom.knot;
nknots = geom_knot->nknots = nobj->curve.geom.knot_count;
order = geom_knot->order = nobj->curve.geom.order;
geom_knot->delta_nknots = 0;
t_min = geom_knot->t_min = order - 1;
t_max = geom_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
geom_knot->open_at_begin = GL_TRUE;
}
else
geom_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
geom_knot->open_at_end = GL_TRUE;
}
else
geom_knot->open_at_end = GL_FALSE;
if (nobj->curve.color.type != GLU_INVALID_ENUM) {
color_knot->unified_knot = (GLfloat *) 1;
knot = color_knot->knot = nobj->curve.color.knot;
nknots = color_knot->nknots = nobj->curve.color.knot_count;
order = color_knot->order = nobj->curve.color.order;
color_knot->delta_nknots = 0;
t_min = color_knot->t_min = order - 1;
t_max = color_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
color_knot->open_at_begin = GL_TRUE;
}
else
color_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
color_knot->open_at_end = GL_TRUE;
}
else
color_knot->open_at_end = GL_FALSE;
}
else
color_knot->unified_knot = NULL;
if (nobj->curve.normal.type != GLU_INVALID_ENUM) {
normal_knot->unified_knot = (GLfloat *) 1;
knot = normal_knot->knot = nobj->curve.normal.knot;
nknots = normal_knot->nknots = nobj->curve.normal.knot_count;
order = normal_knot->order = nobj->curve.normal.order;
normal_knot->delta_nknots = 0;
t_min = normal_knot->t_min = order - 1;
t_max = normal_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
normal_knot->open_at_begin = GL_TRUE;
}
else
normal_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
normal_knot->open_at_end = GL_TRUE;
}
else
normal_knot->open_at_end = GL_FALSE;
}
else
normal_knot->unified_knot = NULL;
if (nobj->curve.texture.type != GLU_INVALID_ENUM) {
texture_knot->unified_knot = (GLfloat *) 1;
knot = texture_knot->knot = nobj->curve.texture.knot;
nknots = texture_knot->nknots = nobj->curve.texture.knot_count;
order = texture_knot->order = nobj->curve.texture.order;
texture_knot->delta_nknots = 0;
t_min = texture_knot->t_min = order - 1;
t_max = texture_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
texture_knot->open_at_begin = GL_TRUE;
}
else
texture_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
texture_knot->open_at_end = GL_TRUE;
}
else
texture_knot->open_at_end = GL_FALSE;
}
else
texture_knot->unified_knot = NULL;
return GLU_NO_ERROR;
}
 
/* covert the NURBS curve into a series of adjacent Bezier curves */
static GLenum
convert_curve(knot_str_type * the_knot, curve_attribs * attrib,
GLfloat ** new_ctrl, GLint * ncontrol)
{
GLenum err;
 
if ((err = explode_knot(the_knot)) != GLU_NO_ERROR) {
if (the_knot->unified_knot) {
free(the_knot->unified_knot);
the_knot->unified_knot = NULL;
}
return err;
}
if (the_knot->unified_knot) {
free(the_knot->unified_knot);
the_knot->unified_knot = NULL;
}
if ((err = calc_alphas(the_knot)) != GLU_NO_ERROR) {
free(the_knot->new_knot);
return err;
}
free(the_knot->new_knot);
if ((err = calc_new_ctrl_pts(attrib->ctrlarray, attrib->stride, the_knot,
attrib->dim, new_ctrl, ncontrol))
!= GLU_NO_ERROR) {
free(the_knot->alpha);
return err;
}
free(the_knot->alpha);
return GLU_NO_ERROR;
}
 
/* covert curves - geometry and possible attribute ones into equivalent */
/* sequence of adjacent Bezier curves */
static GLenum
convert_curves(GLUnurbsObj * nobj, GLfloat ** new_geom_ctrl,
GLint * ncontrol, GLfloat ** new_color_ctrl,
GLfloat ** new_normal_ctrl, GLfloat ** new_texture_ctrl)
{
knot_str_type geom_knot, color_knot, normal_knot, texture_knot;
GLint junk;
GLenum err;
 
*new_color_ctrl = *new_normal_ctrl = *new_texture_ctrl = NULL;
 
if (fill_knot_structures(nobj, &geom_knot, &color_knot, &normal_knot,
&texture_knot) != GLU_NO_ERROR)
return GLU_ERROR;
 
/* unify knots - all knots should have the same number of working */
/* ranges */
if (
(err =
select_knot_working_range(nobj, &geom_knot, &color_knot, &normal_knot,
&texture_knot)) != GLU_NO_ERROR) {
return err;
}
/* convert the geometry curve */
nobj->curve.geom.dim = get_curve_dim(nobj->curve.geom.type);
if ((err = convert_curve(&geom_knot, &(nobj->curve.geom), new_geom_ctrl,
ncontrol)) != GLU_NO_ERROR) {
free_unified_knots(&geom_knot, &color_knot, &normal_knot,
&texture_knot);
call_user_error(nobj, err);
return err;
}
/* if additional attributive curves are given convert them as well */
if (color_knot.unified_knot) {
nobj->curve.color.dim = get_curve_dim(nobj->curve.color.type);
if ((err = convert_curve(&color_knot, &(nobj->curve.color),
new_color_ctrl, &junk)) != GLU_NO_ERROR) {
free_unified_knots(&geom_knot, &color_knot, &normal_knot,
&texture_knot);
free(*new_geom_ctrl);
call_user_error(nobj, err);
return err;
}
}
if (normal_knot.unified_knot) {
nobj->curve.normal.dim = get_curve_dim(nobj->curve.normal.type);
if ((err = convert_curve(&normal_knot, &(nobj->curve.normal),
new_normal_ctrl, &junk)) != GLU_NO_ERROR) {
free_unified_knots(&geom_knot, &color_knot, &normal_knot,
&texture_knot);
free(*new_geom_ctrl);
if (*new_color_ctrl)
free(*new_color_ctrl);
call_user_error(nobj, err);
return err;
}
}
if (texture_knot.unified_knot) {
nobj->curve.texture.dim = get_curve_dim(nobj->curve.texture.type);
if ((err = convert_curve(&texture_knot, &(nobj->curve.texture),
new_texture_ctrl, &junk)) != GLU_NO_ERROR) {
free_unified_knots(&geom_knot, &color_knot, &normal_knot,
&texture_knot);
free(*new_geom_ctrl);
if (*new_color_ctrl)
free(*new_color_ctrl);
if (*new_normal_ctrl)
free(*new_normal_ctrl);
call_user_error(nobj, err);
return err;
}
}
return GLU_NO_ERROR;
}
 
/* main NURBS curve procedure */
void
do_nurbs_curve(GLUnurbsObj * nobj)
{
GLint geom_order, color_order = 0, normal_order = 0, texture_order = 0;
GLenum geom_type;
GLint n_ctrl;
GLfloat *new_geom_ctrl, *new_color_ctrl, *new_normal_ctrl,
*new_texture_ctrl;
GLfloat *geom_ctrl = 0, *color_ctrl = 0, *normal_ctrl = 0, *texture_ctrl = 0;
GLint *factors;
GLint i, j;
GLint geom_dim, color_dim = 0, normal_dim = 0, texture_dim = 0;
 
/* test the user supplied data */
if (test_nurbs_curves(nobj) != GLU_NO_ERROR)
return;
 
if (convert_curves(nobj, &new_geom_ctrl, &n_ctrl, &new_color_ctrl,
&new_normal_ctrl, &new_texture_ctrl) != GLU_NO_ERROR)
return;
 
geom_order = nobj->curve.geom.order;
geom_type = nobj->curve.geom.type;
geom_dim = nobj->curve.geom.dim;
 
if (glu_do_sampling_crv(nobj, new_geom_ctrl, n_ctrl, geom_order, geom_dim,
&factors) != GLU_NO_ERROR) {
free(new_geom_ctrl);
if (new_color_ctrl)
free(new_color_ctrl);
if (new_normal_ctrl)
free(new_normal_ctrl);
if (new_texture_ctrl)
free(new_texture_ctrl);
return;
}
glEnable(geom_type);
if (new_color_ctrl) {
glEnable(nobj->curve.color.type);
color_dim = nobj->curve.color.dim;
color_ctrl = new_color_ctrl;
color_order = nobj->curve.color.order;
}
if (new_normal_ctrl) {
glEnable(nobj->curve.normal.type);
normal_dim = nobj->curve.normal.dim;
normal_ctrl = new_normal_ctrl;
normal_order = nobj->curve.normal.order;
}
if (new_texture_ctrl) {
glEnable(nobj->curve.texture.type);
texture_dim = nobj->curve.texture.dim;
texture_ctrl = new_texture_ctrl;
texture_order = nobj->curve.texture.order;
}
for (i = 0, j = 0, geom_ctrl = new_geom_ctrl;
i < n_ctrl; i += geom_order, j++, geom_ctrl += geom_order * geom_dim) {
if (fine_culling_test_2D
(nobj, geom_ctrl, geom_order, geom_dim, geom_dim)) {
color_ctrl += color_order * color_dim;
normal_ctrl += normal_order * normal_dim;
texture_ctrl += texture_order * texture_dim;
continue;
}
glMap1f(geom_type, 0.0, 1.0, geom_dim, geom_order, geom_ctrl);
if (new_color_ctrl) {
glMap1f(nobj->curve.color.type, 0.0, 1.0, color_dim,
color_order, color_ctrl);
color_ctrl += color_order * color_dim;
}
if (new_normal_ctrl) {
glMap1f(nobj->curve.normal.type, 0.0, 1.0, normal_dim,
normal_order, normal_ctrl);
normal_ctrl += normal_order * normal_dim;
}
if (new_texture_ctrl) {
glMap1f(nobj->curve.texture.type, 0.0, 1.0, texture_dim,
texture_order, texture_ctrl);
texture_ctrl += texture_order * texture_dim;
}
glMapGrid1f(factors[j], 0.0, 1.0);
glEvalMesh1(GL_LINE, 0, factors[j]);
}
free(new_geom_ctrl);
free(factors);
if (new_color_ctrl)
free(new_color_ctrl);
if (new_normal_ctrl)
free(new_normal_ctrl);
if (new_texture_ctrl)
free(new_texture_ctrl);
}
/shark/trunk/ports/mesa/src-glu/nurbssrf.c
0,0 → 1,1318
/* $Id: nurbssrf.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
* See README2 for more info.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "gluP.h"
#include "nurbs.h"
#endif
 
 
static int
get_surface_dim(GLenum type)
{
switch (type) {
case GL_MAP2_VERTEX_3:
return 3;
case GL_MAP2_VERTEX_4:
return 4;
case GL_MAP2_INDEX:
return 1;
case GL_MAP2_COLOR_4:
return 4;
case GL_MAP2_NORMAL:
return 3;
case GL_MAP2_TEXTURE_COORD_1:
return 1;
case GL_MAP2_TEXTURE_COORD_2:
return 2;
case GL_MAP2_TEXTURE_COORD_3:
return 3;
case GL_MAP2_TEXTURE_COORD_4:
return 4;
default:
abort(); /* TODO: is this OK? */
}
return 0; /*never get here */
}
 
static GLenum
test_nurbs_surface(GLUnurbsObj * nobj, surface_attribs * attrib)
{
GLenum err;
GLint tmp_int;
 
if (attrib->sorder < 0 || attrib->torder < 0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return GLU_ERROR;
}
glGetIntegerv(GL_MAX_EVAL_ORDER, &tmp_int);
if (attrib->sorder > tmp_int || attrib->sorder < 2) {
call_user_error(nobj, GLU_NURBS_ERROR1);
return GLU_ERROR;
}
if (attrib->torder > tmp_int || attrib->torder < 2) {
call_user_error(nobj, GLU_NURBS_ERROR1);
return GLU_ERROR;
}
if (attrib->sknot_count < attrib->sorder + 2) {
call_user_error(nobj, GLU_NURBS_ERROR2);
return GLU_ERROR;
}
if (attrib->tknot_count < attrib->torder + 2) {
call_user_error(nobj, GLU_NURBS_ERROR2);
return GLU_ERROR;
}
if (attrib->s_stride < 0 || attrib->t_stride < 0) {
call_user_error(nobj, GLU_NURBS_ERROR34);
return GLU_ERROR;
}
if (attrib->sknot == NULL || attrib->tknot == NULL
|| attrib->ctrlarray == NULL) {
call_user_error(nobj, GLU_NURBS_ERROR36);
return GLU_ERROR;
}
if ((err = test_knot(attrib->tknot_count, attrib->tknot, attrib->torder))
!= GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
if ((err = test_knot(attrib->sknot_count, attrib->sknot, attrib->sorder))
!= GLU_NO_ERROR) {
call_user_error(nobj, err);
return GLU_ERROR;
}
return GLU_NO_ERROR;
}
 
static GLenum
test_nurbs_surfaces(GLUnurbsObj * nobj)
{
/* test the geometric data */
if (test_nurbs_surface(nobj, &(nobj->surface.geom)) != GLU_NO_ERROR)
return GLU_ERROR;
/* now test the attributive data */
/* color */
if (nobj->surface.color.type != GLU_INVALID_ENUM)
if (test_nurbs_surface(nobj, &(nobj->surface.color)) != GLU_NO_ERROR)
return GLU_ERROR;
/* normal */
if (nobj->surface.normal.type != GLU_INVALID_ENUM)
if (test_nurbs_surface(nobj, &(nobj->surface.normal)) != GLU_NO_ERROR)
return GLU_ERROR;
/* texture */
if (nobj->surface.texture.type != GLU_INVALID_ENUM)
if (test_nurbs_surface(nobj, &(nobj->surface.texture)) != GLU_NO_ERROR)
return GLU_ERROR;
return GLU_NO_ERROR;
}
 
static GLenum
convert_surf(knot_str_type * s_knot, knot_str_type * t_knot,
surface_attribs * attrib, GLfloat ** new_ctrl,
GLint * s_n_ctrl, GLint * t_n_ctrl)
{
GLfloat **tmp_ctrl;
GLfloat *ctrl_offset;
GLint tmp_n_control;
GLint i, j, t_cnt, s_cnt;
GLint tmp_stride;
GLint dim;
GLenum err;
 
/* valid range is empty? */
if ((s_knot->unified_knot != NULL && s_knot->unified_nknots == 0) ||
(t_knot->unified_knot != NULL && t_knot->unified_nknots == 0)) {
if (s_knot->unified_knot) {
free(s_knot->unified_knot);
s_knot->unified_knot = NULL;
}
if (t_knot->unified_knot) {
free(t_knot->unified_knot);
t_knot->unified_knot = NULL;
}
*s_n_ctrl = 0;
*t_n_ctrl = 0;
return GLU_NO_ERROR;
}
t_cnt = attrib->tknot_count - attrib->torder;
s_cnt = attrib->sknot_count - attrib->sorder;
if ((tmp_ctrl = (GLfloat **) malloc(sizeof(GLfloat *) * t_cnt)) == NULL)
return GLU_OUT_OF_MEMORY;
if ((err = explode_knot(s_knot)) != GLU_NO_ERROR) {
free(tmp_ctrl);
if (s_knot->unified_knot) {
free(s_knot->unified_knot);
s_knot->unified_knot = NULL;
}
return err;
}
if (s_knot->unified_knot) {
free(s_knot->unified_knot);
s_knot->unified_knot = NULL;
}
if ((err = calc_alphas(s_knot)) != GLU_NO_ERROR) {
free(tmp_ctrl);
free(s_knot->new_knot);
return err;
}
free(s_knot->new_knot);
ctrl_offset = attrib->ctrlarray;
dim = attrib->dim;
for (i = 0; i < t_cnt; i++) {
if ((err = calc_new_ctrl_pts(ctrl_offset, attrib->s_stride, s_knot,
dim, &(tmp_ctrl[i]),
&tmp_n_control)) != GLU_NO_ERROR) {
for (--i; i <= 0; i--)
free(tmp_ctrl[i]);
free(tmp_ctrl);
free(s_knot->alpha);
return err;
}
ctrl_offset += attrib->t_stride;
}
free(s_knot->alpha);
tmp_stride = dim * tmp_n_control;
if ((*new_ctrl = (GLfloat *) malloc(sizeof(GLfloat) * tmp_stride * t_cnt))
== NULL) {
for (i = 0; i < t_cnt; i++)
free(tmp_ctrl[i]);
free(tmp_ctrl);
return GLU_OUT_OF_MEMORY;
}
for (i = 0; i < tmp_n_control; i++)
for (j = 0; j < t_cnt; j++)
MEMCPY(*new_ctrl + j * dim + i * dim * t_cnt, tmp_ctrl[j] + dim * i,
sizeof(GLfloat) * dim);
for (i = 0; i < t_cnt; i++)
free(tmp_ctrl[i]);
free(tmp_ctrl);
*s_n_ctrl = tmp_n_control;
 
if ((tmp_ctrl = (GLfloat **) malloc(sizeof(GLfloat *) * (*s_n_ctrl))) ==
NULL) {
return GLU_OUT_OF_MEMORY;
}
if ((err = explode_knot(t_knot)) != GLU_NO_ERROR) {
free(tmp_ctrl);
if (t_knot->unified_knot) {
free(t_knot->unified_knot);
t_knot->unified_knot = NULL;
}
return err;
}
if (t_knot->unified_knot) {
free(t_knot->unified_knot);
t_knot->unified_knot = NULL;
}
if ((err = calc_alphas(t_knot)) != GLU_NO_ERROR) {
free(tmp_ctrl);
free(t_knot->new_knot);
return err;
}
free(t_knot->new_knot);
ctrl_offset = *new_ctrl;
for (i = 0; i < (*s_n_ctrl); i++) {
if ((err = calc_new_ctrl_pts(ctrl_offset, dim, t_knot,
dim, &(tmp_ctrl[i]),
&tmp_n_control)) != GLU_NO_ERROR) {
for (--i; i <= 0; i--)
free(tmp_ctrl[i]);
free(tmp_ctrl);
free(t_knot->alpha);
return err;
}
ctrl_offset += dim * t_cnt;
}
free(t_knot->alpha);
free(*new_ctrl);
tmp_stride = dim * tmp_n_control;
if (
(*new_ctrl =
(GLfloat *) malloc(sizeof(GLfloat) * tmp_stride * (*s_n_ctrl))) ==
NULL) {
for (i = 0; i < (*s_n_ctrl); i++)
free(tmp_ctrl[i]);
free(tmp_ctrl);
return GLU_OUT_OF_MEMORY;
}
for (i = 0; i < (*s_n_ctrl); i++) {
MEMCPY(*new_ctrl + i * tmp_stride, tmp_ctrl[i],
sizeof(GLfloat) * tmp_stride);
free(tmp_ctrl[i]);
}
free(tmp_ctrl);
*t_n_ctrl = tmp_n_control;
return GLU_NO_ERROR;
}
 
/* prepare the knot information structures */
static GLenum
fill_knot_structures(GLUnurbsObj * nobj,
knot_str_type * geom_s_knot, knot_str_type * geom_t_knot,
knot_str_type * color_s_knot,
knot_str_type * color_t_knot,
knot_str_type * normal_s_knot,
knot_str_type * normal_t_knot,
knot_str_type * texture_s_knot,
knot_str_type * texture_t_knot)
{
GLint order;
GLfloat *knot;
GLint nknots;
GLint t_min, t_max;
 
geom_s_knot->unified_knot = NULL;
knot = geom_s_knot->knot = nobj->surface.geom.sknot;
nknots = geom_s_knot->nknots = nobj->surface.geom.sknot_count;
order = geom_s_knot->order = nobj->surface.geom.sorder;
geom_s_knot->delta_nknots = 0;
t_min = geom_s_knot->t_min = order - 1;
t_max = geom_s_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
geom_s_knot->open_at_begin = GL_TRUE;
}
else
geom_s_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
geom_s_knot->open_at_end = GL_TRUE;
}
else
geom_s_knot->open_at_end = GL_FALSE;
geom_t_knot->unified_knot = NULL;
knot = geom_t_knot->knot = nobj->surface.geom.tknot;
nknots = geom_t_knot->nknots = nobj->surface.geom.tknot_count;
order = geom_t_knot->order = nobj->surface.geom.torder;
geom_t_knot->delta_nknots = 0;
t_min = geom_t_knot->t_min = order - 1;
t_max = geom_t_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
geom_t_knot->open_at_begin = GL_TRUE;
}
else
geom_t_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
geom_t_knot->open_at_end = GL_TRUE;
}
else
geom_t_knot->open_at_end = GL_FALSE;
 
if (nobj->surface.color.type != GLU_INVALID_ENUM) {
color_s_knot->unified_knot = (GLfloat *) 1;
knot = color_s_knot->knot = nobj->surface.color.sknot;
nknots = color_s_knot->nknots = nobj->surface.color.sknot_count;
order = color_s_knot->order = nobj->surface.color.sorder;
color_s_knot->delta_nknots = 0;
t_min = color_s_knot->t_min = order - 1;
t_max = color_s_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
color_s_knot->open_at_begin = GL_TRUE;
}
else
color_s_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
color_s_knot->open_at_end = GL_TRUE;
}
else
color_s_knot->open_at_end = GL_FALSE;
color_t_knot->unified_knot = (GLfloat *) 1;
knot = color_t_knot->knot = nobj->surface.color.tknot;
nknots = color_t_knot->nknots = nobj->surface.color.tknot_count;
order = color_t_knot->order = nobj->surface.color.torder;
color_t_knot->delta_nknots = 0;
t_min = color_t_knot->t_min = order - 1;
t_max = color_t_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
color_t_knot->open_at_begin = GL_TRUE;
}
else
color_t_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
color_t_knot->open_at_end = GL_TRUE;
}
else
color_t_knot->open_at_end = GL_FALSE;
}
else {
color_s_knot->unified_knot = NULL;
color_t_knot->unified_knot = NULL;
}
 
if (nobj->surface.normal.type != GLU_INVALID_ENUM) {
normal_s_knot->unified_knot = (GLfloat *) 1;
knot = normal_s_knot->knot = nobj->surface.normal.sknot;
nknots = normal_s_knot->nknots = nobj->surface.normal.sknot_count;
order = normal_s_knot->order = nobj->surface.normal.sorder;
normal_s_knot->delta_nknots = 0;
t_min = normal_s_knot->t_min = order - 1;
t_max = normal_s_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
normal_s_knot->open_at_begin = GL_TRUE;
}
else
normal_s_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
normal_s_knot->open_at_end = GL_TRUE;
}
else
normal_s_knot->open_at_end = GL_FALSE;
normal_t_knot->unified_knot = (GLfloat *) 1;
knot = normal_t_knot->knot = nobj->surface.normal.tknot;
nknots = normal_t_knot->nknots = nobj->surface.normal.tknot_count;
order = normal_t_knot->order = nobj->surface.normal.torder;
normal_t_knot->delta_nknots = 0;
t_min = normal_t_knot->t_min = order - 1;
t_max = normal_t_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
normal_t_knot->open_at_begin = GL_TRUE;
}
else
normal_t_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
normal_t_knot->open_at_end = GL_TRUE;
}
else
normal_t_knot->open_at_end = GL_FALSE;
}
else {
normal_s_knot->unified_knot = NULL;
normal_t_knot->unified_knot = NULL;
}
 
if (nobj->surface.texture.type != GLU_INVALID_ENUM) {
texture_s_knot->unified_knot = (GLfloat *) 1;
knot = texture_s_knot->knot = nobj->surface.texture.sknot;
nknots = texture_s_knot->nknots = nobj->surface.texture.sknot_count;
order = texture_s_knot->order = nobj->surface.texture.sorder;
texture_s_knot->delta_nknots = 0;
t_min = texture_s_knot->t_min = order - 1;
t_max = texture_s_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
texture_s_knot->open_at_begin = GL_TRUE;
}
else
texture_s_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
texture_s_knot->open_at_end = GL_TRUE;
}
else
texture_s_knot->open_at_end = GL_FALSE;
texture_t_knot->unified_knot = (GLfloat *) 1;
knot = texture_t_knot->knot = nobj->surface.texture.tknot;
nknots = texture_t_knot->nknots = nobj->surface.texture.tknot_count;
order = texture_t_knot->order = nobj->surface.texture.torder;
texture_t_knot->delta_nknots = 0;
t_min = texture_t_knot->t_min = order - 1;
t_max = texture_t_knot->t_max = nknots - order;
if (fabs(knot[t_min] - knot[t_max]) < EPSILON) {
call_user_error(nobj, GLU_NURBS_ERROR3);
return GLU_ERROR;
}
if (fabs(knot[0] - knot[t_min]) < EPSILON) {
/* knot open at beggining */
texture_t_knot->open_at_begin = GL_TRUE;
}
else
texture_t_knot->open_at_begin = GL_FALSE;
if (fabs(knot[t_max] - knot[nknots - 1]) < EPSILON) {
/* knot open at end */
texture_t_knot->open_at_end = GL_TRUE;
}
else
texture_t_knot->open_at_end = GL_FALSE;
}
else {
texture_s_knot->unified_knot = NULL;
texture_t_knot->unified_knot = NULL;
}
return GLU_NO_ERROR;
}
 
 
static void
free_new_ctrl(new_ctrl_type * p)
{
if (p->geom_ctrl)
free(p->geom_ctrl);
if (p->geom_offsets)
free(p->geom_offsets);
if (p->color_ctrl) {
free(p->color_ctrl);
if (p->color_offsets)
free(p->color_offsets);
}
if (p->normal_ctrl) {
free(p->normal_ctrl);
if (p->normal_offsets)
free(p->normal_offsets);
}
if (p->texture_ctrl) {
free(p->texture_ctrl);
if (p->texture_offsets)
free(p->texture_offsets);
}
}
 
/* convert surfaces - geometry and possible attribute ones into equivalent */
/* sequence of adjacent Bezier patches */
static GLenum
convert_surfs(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl)
{
knot_str_type geom_s_knot, color_s_knot, normal_s_knot, texture_s_knot;
knot_str_type geom_t_knot, color_t_knot, normal_t_knot, texture_t_knot;
GLenum err;
 
if ((err = fill_knot_structures(nobj, &geom_s_knot, &geom_t_knot,
&color_s_knot, &color_t_knot,
&normal_s_knot, &normal_t_knot,
&texture_s_knot,
&texture_t_knot)) != GLU_NO_ERROR) {
return err;
}
/* unify knots - all knots should have the same working range */
if ((err = select_knot_working_range(nobj, &geom_s_knot, &color_s_knot,
&normal_s_knot,
&texture_s_knot)) != GLU_NO_ERROR) {
call_user_error(nobj, err);
return err;
}
if ((err = select_knot_working_range(nobj, &geom_t_knot, &color_t_knot,
&normal_t_knot,
&texture_t_knot)) != GLU_NO_ERROR) {
free_unified_knots(&geom_s_knot, &color_s_knot, &normal_s_knot,
&texture_s_knot);
call_user_error(nobj, err);
return err;
}
 
/* convert the geometry surface */
nobj->surface.geom.dim = get_surface_dim(nobj->surface.geom.type);
if ((err = convert_surf(&geom_s_knot, &geom_t_knot, &(nobj->surface.geom),
&(new_ctrl->geom_ctrl), &(new_ctrl->geom_s_pt_cnt),
&(new_ctrl->geom_t_pt_cnt))) != GLU_NO_ERROR) {
free_unified_knots(&geom_s_knot, &color_s_knot, &normal_s_knot,
&texture_s_knot);
free_unified_knots(&geom_t_knot, &color_t_knot, &normal_t_knot,
&texture_t_knot);
call_user_error(nobj, err);
return err;
}
/* if additional attributive surfaces are given convert them as well */
if (color_s_knot.unified_knot) {
nobj->surface.color.dim = get_surface_dim(nobj->surface.color.type);
if (
(err =
convert_surf(&color_s_knot, &color_t_knot, &(nobj->surface.color),
&(new_ctrl->color_ctrl), &(new_ctrl->color_s_pt_cnt),
&(new_ctrl->color_t_pt_cnt))) != GLU_NO_ERROR) {
free_unified_knots(&color_s_knot, &color_s_knot, &normal_s_knot,
&texture_s_knot);
free_unified_knots(&color_t_knot, &color_t_knot, &normal_t_knot,
&texture_t_knot);
free_new_ctrl(new_ctrl);
call_user_error(nobj, err);
return err;
}
}
if (normal_s_knot.unified_knot) {
nobj->surface.normal.dim = get_surface_dim(nobj->surface.normal.type);
if ((err = convert_surf(&normal_s_knot, &normal_t_knot,
&(nobj->surface.normal),
&(new_ctrl->normal_ctrl),
&(new_ctrl->normal_s_pt_cnt),
&(new_ctrl->normal_t_pt_cnt))) !=
GLU_NO_ERROR) {
free_unified_knots(&normal_s_knot, &normal_s_knot, &normal_s_knot,
&texture_s_knot);
free_unified_knots(&normal_t_knot, &normal_t_knot, &normal_t_knot,
&texture_t_knot);
free_new_ctrl(new_ctrl);
call_user_error(nobj, err);
return err;
}
}
if (texture_s_knot.unified_knot) {
nobj->surface.texture.dim = get_surface_dim(nobj->surface.texture.type);
if ((err = convert_surf(&texture_s_knot, &texture_t_knot,
&(nobj->surface.texture),
&(new_ctrl->texture_ctrl),
&(new_ctrl->texture_s_pt_cnt),
&(new_ctrl->texture_t_pt_cnt))) !=
GLU_NO_ERROR) {
free_unified_knots(&texture_s_knot, &texture_s_knot, &texture_s_knot,
&texture_s_knot);
free_unified_knots(&texture_t_knot, &texture_t_knot, &texture_t_knot,
&texture_t_knot);
free_new_ctrl(new_ctrl);
call_user_error(nobj, err);
return err;
}
}
return GLU_NO_ERROR;
}
 
/* tesselate the "boundary" Bezier edge strips */
static void
tesselate_strip_t_line(GLint top_start, GLint top_end, GLint top_z,
GLint bottom_start, GLint bottom_end, GLint bottom_z,
GLint bottom_domain)
{
GLint top_cnt, bottom_cnt, tri_cnt, k;
GLint direction;
 
top_cnt = top_end - top_start;
direction = (top_cnt >= 0 ? 1 : -1);
bottom_cnt = bottom_end - bottom_start;
glBegin(GL_LINES);
while (top_cnt) {
if (bottom_cnt)
tri_cnt = top_cnt / bottom_cnt;
else
tri_cnt = abs(top_cnt);
for (k = 0; k <= tri_cnt; k++, top_start += direction) {
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
glEvalPoint2(top_z, top_start);
}
if (bottom_cnt) {
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
bottom_start += direction;
top_start -= direction;
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
glEvalPoint2(top_z, top_start);
}
top_cnt -= direction * tri_cnt;
bottom_cnt -= direction;
}
glEnd();
}
 
 
static void
tesselate_strip_t_fill(GLint top_start, GLint top_end, GLint top_z,
GLint bottom_start, GLint bottom_end, GLint bottom_z,
GLint bottom_domain)
{
GLint top_cnt, bottom_cnt, tri_cnt, k;
GLint direction;
 
top_cnt = top_end - top_start;
direction = (top_cnt >= 0 ? 1 : -1);
bottom_cnt = bottom_end - bottom_start;
while (top_cnt) {
if (bottom_cnt)
tri_cnt = top_cnt / bottom_cnt;
else
tri_cnt = abs(top_cnt);
glBegin(GL_TRIANGLE_FAN);
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
for (k = 0; k <= tri_cnt; k++, top_start += direction)
glEvalPoint2(top_z, top_start);
if (bottom_cnt) {
bottom_start += direction;
top_start -= direction;
glEvalCoord2f((GLfloat) bottom_z / bottom_domain,
(GLfloat) bottom_start / bottom_domain);
}
glEnd();
top_cnt -= direction * tri_cnt;
bottom_cnt -= direction;
}
}
 
 
static void
tesselate_strip_t(GLenum display_mode, GLint top_start, GLint top_end,
GLint top_z, GLint bottom_start, GLint bottom_end,
GLint bottom_z, GLint bottom_domain)
{
if (display_mode == GL_FILL)
tesselate_strip_t_fill(top_start, top_end, top_z, bottom_start,
bottom_end, bottom_z, bottom_domain);
else
tesselate_strip_t_line(top_start, top_end, top_z, bottom_start,
bottom_end, bottom_z, bottom_domain);
}
 
 
static void
tesselate_strip_s_fill(GLint top_start, GLint top_end, GLint top_z,
GLint bottom_start, GLint bottom_end, GLint bottom_z,
GLfloat bottom_domain)
{
GLint top_cnt, bottom_cnt, tri_cnt, k;
GLint direction;
 
top_cnt = top_end - top_start;
direction = (top_cnt >= 0 ? 1 : -1);
bottom_cnt = bottom_end - bottom_start;
while (top_cnt) {
if (bottom_cnt)
tri_cnt = top_cnt / bottom_cnt;
else
tri_cnt = abs(top_cnt);
glBegin(GL_TRIANGLE_FAN);
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
for (k = 0; k <= tri_cnt; k++, top_start += direction)
glEvalPoint2(top_start, top_z);
if (bottom_cnt) {
bottom_start += direction;
top_start -= direction;
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
}
glEnd();
top_cnt -= direction * tri_cnt;
bottom_cnt -= direction;
}
}
 
 
static void
tesselate_strip_s_line(GLint top_start, GLint top_end, GLint top_z,
GLint bottom_start, GLint bottom_end, GLint bottom_z,
GLfloat bottom_domain)
{
GLint top_cnt, bottom_cnt, tri_cnt, k;
GLint direction;
 
top_cnt = top_end - top_start;
direction = (top_cnt >= 0 ? 1 : -1);
bottom_cnt = bottom_end - bottom_start;
glBegin(GL_LINES);
while (top_cnt) {
if (bottom_cnt)
tri_cnt = top_cnt / bottom_cnt;
else
tri_cnt = abs(top_cnt);
for (k = 0; k <= tri_cnt; k++, top_start += direction) {
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
glEvalPoint2(top_start, top_z);
}
if (bottom_cnt) {
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
bottom_start += direction;
top_start -= direction;
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
glEvalPoint2(top_start, top_z);
glEvalCoord2f((GLfloat) bottom_start / bottom_domain,
(GLfloat) bottom_z / bottom_domain);
}
top_cnt -= direction * tri_cnt;
bottom_cnt -= direction;
}
glEnd();
}
 
 
static void
tesselate_strip_s(GLenum display_mode, GLint top_start, GLint top_end,
GLint top_z, GLint bottom_start, GLint bottom_end,
GLint bottom_z, GLfloat bottom_domain)
{
if (display_mode == GL_FILL)
tesselate_strip_s_fill(top_start, top_end, top_z, bottom_start,
bottom_end, bottom_z, bottom_domain);
else
tesselate_strip_s_line(top_start, top_end, top_z, bottom_start,
bottom_end, bottom_z, bottom_domain);
}
 
static void
tesselate_bottom_left_corner(GLenum display_mode, GLfloat s_1, GLfloat t_1)
{
if (display_mode == GL_FILL) {
glBegin(GL_TRIANGLE_FAN);
glEvalPoint2(1, 1);
glEvalCoord2f(s_1, 0.0);
glEvalCoord2f(0.0, 0.0);
glEvalCoord2f(0.0, t_1);
}
else {
glBegin(GL_LINES);
glEvalCoord2f(0.0, 0.0);
glEvalCoord2f(0.0, t_1);
glEvalCoord2f(0.0, 0.0);
glEvalPoint2(1, 1);
glEvalCoord2f(0.0, 0.0);
glEvalCoord2f(s_1, 0.0);
}
glEnd();
}
 
static void
tesselate_bottom_right_corner(GLenum display_mode, GLint v_top,
GLint v_bottom, GLfloat s_1, GLfloat t_1)
{
if (display_mode == GL_FILL) {
glBegin(GL_TRIANGLE_FAN);
glEvalPoint2(1, v_top);
glEvalCoord2f(0.0, v_bottom * t_1);
glEvalCoord2f(0.0, (v_bottom + 1) * t_1);
glEvalCoord2f(s_1, (v_bottom + 1) * t_1);
}
else {
glBegin(GL_LINES);
glEvalCoord2f(0.0, (v_bottom + 1) * t_1);
glEvalPoint2(1, v_top);
glEvalCoord2f(0.0, (v_bottom + 1) * t_1);
glEvalCoord2f(0.0, v_bottom * t_1);
glEvalCoord2f(0.0, (v_bottom + 1) * t_1);
glEvalCoord2f(s_1, (v_bottom + 1) * t_1);
}
glEnd();
}
 
static void
tesselate_top_left_corner(GLenum display_mode, GLint u_right, GLint u_left,
GLfloat s_1, GLfloat t_1)
{
if (display_mode == GL_FILL) {
glBegin(GL_TRIANGLE_FAN);
glEvalPoint2(u_right, 1);
glEvalCoord2f((u_left + 1) * s_1, t_1);
glEvalCoord2f((u_left + 1) * s_1, 0.0);
glEvalCoord2f(u_left * s_1, 0.0);
}
else {
glBegin(GL_LINES);
glEvalCoord2f((u_left + 1) * s_1, 0.0);
glEvalPoint2(u_right, 1);
glEvalCoord2f((u_left + 1) * s_1, 0.0);
glEvalCoord2f(u_left * s_1, 0.0);
glEvalCoord2f((u_left + 1) * s_1, 0.0);
glEvalCoord2f((u_left + 1) * s_1, t_1);
}
glEnd();
}
 
static void
tesselate_top_right_corner(GLenum display_mode, GLint u_left, GLint v_bottom,
GLint u_right, GLint v_top, GLfloat s_1,
GLfloat t_1)
{
if (display_mode == GL_FILL) {
glBegin(GL_TRIANGLE_FAN);
glEvalPoint2(u_left, v_bottom);
glEvalCoord2f((u_right - 1) * s_1, v_top * t_1);
glEvalCoord2f(u_right * s_1, v_top * t_1);
glEvalCoord2f(u_right * s_1, (v_top - 1) * t_1);
}
else {
glBegin(GL_LINES);
glEvalCoord2f(u_right * s_1, v_top * t_1);
glEvalPoint2(u_left, v_bottom);
glEvalCoord2f(u_right * s_1, v_top * t_1);
glEvalCoord2f(u_right * s_1, (v_top - 1) * t_1);
glEvalCoord2f(u_right * s_1, v_top * t_1);
glEvalCoord2f((u_right - 1) * s_1, v_top * t_1);
}
glEnd();
}
 
/* do mesh mapping of Bezier */
static void
nurbs_map_bezier(GLenum display_mode, GLint * sfactors, GLint * tfactors,
GLint s_bezier_cnt, GLint t_bezier_cnt, GLint s, GLint t)
{
GLint top, bottom, right, left;
 
 
if (s == 0) {
top = *(tfactors + t * 3);
bottom = *(tfactors + t * 3 + 1);
}
else if (s == s_bezier_cnt - 1) {
top = *(tfactors + t * 3 + 2);
bottom = *(tfactors + t * 3);
}
else {
top = bottom = *(tfactors + t * 3);
}
if (t == 0) {
left = *(sfactors + s * 3 + 1);
right = *(sfactors + s * 3);
}
else if (t == t_bezier_cnt - 1) {
left = *(sfactors + s * 3);
right = *(sfactors + s * 3 + 2);
}
else {
left = right = *(sfactors + s * 3);
}
 
if (top > bottom) {
if (left < right) {
glMapGrid2f(right, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 1, right, 1, top);
tesselate_strip_s(display_mode, 1, right, 1, 1, left, 0,
(GLfloat) left);
tesselate_bottom_left_corner(display_mode, (GLfloat) (1.0 / left),
(GLfloat) (1.0 / bottom));
/* tesselate_strip_t(display_mode,1,top,1,1,bottom,0,(GLfloat)bottom);*/
tesselate_strip_t(display_mode, top, 1, 1, bottom, 1, 0,
(GLfloat) bottom);
}
else if (left == right) {
glMapGrid2f(right, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 1, right, 0, top);
/* tesselate_strip_t(display_mode,0,top,1,0,bottom,0,(GLfloat)bottom);*/
tesselate_strip_t(display_mode, top, 0, 1, bottom, 0, 0,
(GLfloat) bottom);
}
else {
glMapGrid2f(left, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 1, left, 0, top - 1);
/* tesselate_strip_t(display_mode,0,top-1,1,0,bottom-1,0,
(GLfloat)bottom);*/
tesselate_strip_t(display_mode, top - 1, 0, 1, bottom - 1, 0, 0,
(GLfloat) bottom);
tesselate_bottom_right_corner(display_mode, top - 1, bottom - 1,
(GLfloat) (1.0 / right),
(GLfloat) (1.0 / bottom));
/* tesselate_strip_s(display_mode,1,left,top-1,1,right,right,
(GLfloat)right);*/
tesselate_strip_s(display_mode, left, 1, top - 1, right, 1, right,
(GLfloat) right);
}
}
else if (top == bottom) {
if (left < right) {
glMapGrid2f(right, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 0, right, 1, top);
tesselate_strip_s(display_mode, 0, right, 1, 0, left, 0,
(GLfloat) left);
}
else if (left == right) {
glMapGrid2f(right, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 0, right, 0, top);
}
else {
glMapGrid2f(left, 0.0, 1.0, top, 0.0, 1.0);
glEvalMesh2(display_mode, 0, left, 0, top - 1);
/* tesselate_strip_s(display_mode,0,left,top-1,0,right,right,
(GLfloat)right);*/
tesselate_strip_s(display_mode, left, 0, top - 1, right, 0, right,
(GLfloat) right);
}
}
else {
if (left < right) {
glMapGrid2f(right, 0.0, 1.0, bottom, 0.0, 1.0);
glEvalMesh2(display_mode, 0, right - 1, 1, bottom);
tesselate_strip_s(display_mode, 0, right - 1, 1, 0, left - 1, 0,
(GLfloat) left);
tesselate_top_left_corner(display_mode, right - 1, left - 1,
(GLfloat) (1.0 / left),
(GLfloat) (1.0 / top));
tesselate_strip_t(display_mode, 1, bottom, right - 1, 1, top, top,
(GLfloat) top);
}
else if (left == right) {
glMapGrid2f(right, 0.0, 1.0, bottom, 0.0, 1.0);
glEvalMesh2(display_mode, 0, right - 1, 0, bottom);
tesselate_strip_t(display_mode, 0, bottom, right - 1, 0, top, top,
(GLfloat) top);
}
else {
glMapGrid2f(left, 0.0, 1.0, bottom, 0.0, 1.0);
glEvalMesh2(display_mode, 0, left - 1, 0, bottom - 1);
tesselate_strip_t(display_mode, 0, bottom - 1, left - 1, 0, top - 1,
top, (GLfloat) top);
tesselate_top_right_corner(display_mode, left - 1, bottom - 1, right,
top, (GLfloat) (1.0 / right),
(GLfloat) (1.0 / top));
/* tesselate_strip_s(display_mode,0,left-1,bottom-1,0,right-1,right,
(GLfloat)right);*/
tesselate_strip_s(display_mode, left - 1, 0, bottom - 1, right - 1,
0, right, (GLfloat) right);
}
}
}
 
/* draw NURBS surface in OUTLINE POLYGON mode */
static void
draw_polygon_mode(GLenum display_mode, GLUnurbsObj * nobj,
new_ctrl_type * new_ctrl, GLint * sfactors,
GLint * tfactors)
{
GLsizei offset;
GLint t_bezier_cnt, s_bezier_cnt;
GLboolean do_color, do_normal, do_texture;
GLint i, j;
 
t_bezier_cnt = new_ctrl->t_bezier_cnt;
s_bezier_cnt = new_ctrl->s_bezier_cnt;
glEnable(nobj->surface.geom.type);
if (new_ctrl->color_ctrl) {
glEnable(nobj->surface.color.type);
do_color = GL_TRUE;
}
else
do_color = GL_FALSE;
if (new_ctrl->normal_ctrl) {
glEnable(nobj->surface.normal.type);
do_normal = GL_TRUE;
}
else
do_normal = GL_FALSE;
if (new_ctrl->texture_ctrl) {
glEnable(nobj->surface.texture.type);
do_texture = GL_TRUE;
}
else
do_texture = GL_FALSE;
for (j = 0; j < s_bezier_cnt; j++) {
for (i = 0; i < t_bezier_cnt; i++) {
offset = j * t_bezier_cnt + i;
if (fine_culling_test_3D(nobj, *(new_ctrl->geom_offsets + offset),
nobj->surface.geom.sorder,
nobj->surface.geom.torder,
new_ctrl->geom_s_stride,
new_ctrl->geom_t_stride,
nobj->surface.geom.dim)) continue;
glMap2f(nobj->surface.geom.type, 0.0, 1.0, new_ctrl->geom_s_stride,
nobj->surface.geom.sorder, 0.0, 1.0, new_ctrl->geom_t_stride,
nobj->surface.geom.torder,
*(new_ctrl->geom_offsets + offset));
if (do_color) {
glMap2f(nobj->surface.color.type, 0.0, 1.0,
new_ctrl->color_s_stride, nobj->surface.color.sorder,
0.0, 1.0, new_ctrl->color_t_stride,
nobj->surface.color.torder,
*(new_ctrl->color_offsets + offset));
}
if (do_normal) {
glMap2f(nobj->surface.normal.type, 0.0, 1.0,
new_ctrl->normal_s_stride, nobj->surface.normal.sorder,
0.0, 1.0, new_ctrl->normal_t_stride,
nobj->surface.normal.torder,
*(new_ctrl->normal_offsets + offset));
}
if (do_texture) {
glMap2f(nobj->surface.texture.type, 0.0, 1.0,
new_ctrl->texture_s_stride, nobj->surface.texture.sorder,
0.0, 1.0, new_ctrl->texture_t_stride,
nobj->surface.texture.torder,
*(new_ctrl->texture_offsets + offset));
}
/* glMapGrid2f(sfactors[j*3+0],0.0,1.0,tfactors[i*3+0],0.0,1.0);
glEvalMesh2(display_mode,0,sfactors[j*3+0],0,tfactors[i*3+0]);*/
nurbs_map_bezier(display_mode, sfactors, tfactors, s_bezier_cnt,
t_bezier_cnt, j, i);
}
}
}
 
 
 
/* draw NURBS surface in OUTLINE POLYGON mode */
#if 0
static void
draw_patch_mode(GLenum display_mode, GLUnurbsObj * nobj,
new_ctrl_type * new_ctrl, GLint * sfactors, GLint * tfactors)
{
GLsizei offset;
GLint t_bezier_cnt, s_bezier_cnt;
GLboolean do_color, do_normal, do_texture;
GLint i, j;
 
t_bezier_cnt = new_ctrl->t_bezier_cnt;
s_bezier_cnt = new_ctrl->s_bezier_cnt;
glEnable(nobj->surface.geom.type);
if (new_ctrl->color_ctrl) {
glEnable(nobj->surface.color.type);
do_color = GL_TRUE;
}
else
do_color = GL_FALSE;
if (new_ctrl->normal_ctrl) {
glEnable(nobj->surface.normal.type);
do_normal = GL_TRUE;
}
else
do_normal = GL_FALSE;
if (new_ctrl->texture_ctrl) {
glEnable(nobj->surface.texture.type);
do_texture = GL_TRUE;
}
else
do_texture = GL_FALSE;
for (j = 0; j < s_bezier_cnt; j++) {
for (i = 0; i < t_bezier_cnt; i++) {
offset = j * t_bezier_cnt + i;
if (fine_culling_test_3D(nobj, *(new_ctrl->geom_offsets + offset),
nobj->surface.geom.sorder,
nobj->surface.geom.torder,
new_ctrl->geom_s_stride,
new_ctrl->geom_t_stride,
nobj->surface.geom.dim)) continue;
glMap2f(nobj->surface.geom.type, 0.0, 1.0, new_ctrl->geom_s_stride,
nobj->surface.geom.sorder, 0.0, 1.0, new_ctrl->geom_t_stride,
nobj->surface.geom.torder,
*(new_ctrl->geom_offsets + offset));
if (do_color) {
glMap2f(nobj->surface.color.type, 0.0, 1.0,
new_ctrl->color_s_stride, nobj->surface.color.sorder,
0.0, 1.0, new_ctrl->color_t_stride,
nobj->surface.color.torder,
*(new_ctrl->color_offsets + offset));
}
if (do_normal) {
glMap2f(nobj->surface.normal.type, 0.0, 1.0,
new_ctrl->normal_s_stride, nobj->surface.normal.sorder,
0.0, 1.0, new_ctrl->normal_t_stride,
nobj->surface.normal.torder,
*(new_ctrl->normal_offsets + offset));
}
if (do_texture) {
glMap2f(nobj->surface.texture.type, 0.0, 1.0,
new_ctrl->texture_s_stride, nobj->surface.texture.sorder,
0.0, 1.0, new_ctrl->texture_t_stride,
nobj->surface.texture.torder,
*(new_ctrl->texture_offsets + offset));
}
nurbs_map_bezier(display_mode, sfactors, tfactors, s_bezier_cnt,
t_bezier_cnt, i, j);
/* glMapGrid2f(sfactors[j],0.0,1.0,tfactors[i],0.0,1.0);
glEvalMesh2(display_mode,0,sfactors[j],0,tfactors[i]);*/
}
}
}
#endif
 
 
 
static void
init_new_ctrl(new_ctrl_type * p)
{
p->geom_ctrl = p->color_ctrl = p->normal_ctrl = p->texture_ctrl = NULL;
p->geom_offsets = p->color_offsets = p->normal_offsets =
p->texture_offsets = NULL;
p->s_bezier_cnt = p->t_bezier_cnt = 0;
}
 
 
static GLenum
augment_new_ctrl(GLUnurbsObj * nobj, new_ctrl_type * p)
{
GLsizei offset_size;
GLint i, j;
 
p->s_bezier_cnt = (p->geom_s_pt_cnt) / (nobj->surface.geom.sorder);
p->t_bezier_cnt = (p->geom_t_pt_cnt) / (nobj->surface.geom.torder);
offset_size = (p->s_bezier_cnt) * (p->t_bezier_cnt);
p->geom_t_stride = nobj->surface.geom.dim;
p->geom_s_stride = (p->geom_t_pt_cnt) * (nobj->surface.geom.dim);
p->color_t_stride = nobj->surface.color.dim;
p->color_s_stride = (p->color_t_pt_cnt) * (nobj->surface.color.dim);
p->normal_t_stride = nobj->surface.normal.dim;
p->normal_s_stride = (p->normal_t_pt_cnt) * (nobj->surface.normal.dim);
p->texture_t_stride = nobj->surface.texture.dim;
p->texture_s_stride = (p->texture_t_pt_cnt) * (nobj->surface.texture.dim);
if (
(p->geom_offsets =
(GLfloat **) malloc(sizeof(GLfloat *) * offset_size)) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
if (p->color_ctrl)
if (
(p->color_offsets =
(GLfloat **) malloc(sizeof(GLfloat *) * offset_size)) == NULL) {
free_new_ctrl(p);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
if (p->normal_ctrl)
if (
(p->normal_offsets =
(GLfloat **) malloc(sizeof(GLfloat *) * offset_size)) == NULL) {
free_new_ctrl(p);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
if (p->texture_ctrl)
if (
(p->texture_offsets =
(GLfloat **) malloc(sizeof(GLfloat *) * offset_size)) == NULL) {
free_new_ctrl(p);
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return GLU_ERROR;
}
for (i = 0; i < p->s_bezier_cnt; i++)
for (j = 0; j < p->t_bezier_cnt; j++)
*(p->geom_offsets + i * (p->t_bezier_cnt) + j) =
p->geom_ctrl + i * (nobj->surface.geom.sorder) *
(nobj->surface.geom.dim) * (p->geom_t_pt_cnt) +
j * (nobj->surface.geom.dim) * (nobj->surface.geom.torder);
if (p->color_ctrl)
for (i = 0; i < p->s_bezier_cnt; i++)
for (j = 0; j < p->t_bezier_cnt; j++)
*(p->color_offsets + i * (p->t_bezier_cnt) + j) =
p->color_ctrl + i * (nobj->surface.color.sorder) *
(nobj->surface.color.dim) * (p->color_t_pt_cnt) +
j * (nobj->surface.color.dim) * (nobj->surface.color.torder);
if (p->normal_ctrl)
for (i = 0; i < p->s_bezier_cnt; i++)
for (j = 0; j < p->t_bezier_cnt; j++)
*(p->normal_offsets + i * (p->t_bezier_cnt) + j) =
p->normal_ctrl + i * (nobj->surface.normal.sorder) *
(nobj->surface.normal.dim) * (p->normal_t_pt_cnt) +
j * (nobj->surface.normal.dim) * (nobj->surface.normal.torder);
if (p->texture_ctrl)
for (i = 0; i < p->s_bezier_cnt; i++)
for (j = 0; j < p->t_bezier_cnt; j++)
*(p->texture_offsets + i * (p->t_bezier_cnt) + j) =
p->texture_ctrl + i * (nobj->surface.texture.sorder) *
(nobj->surface.texture.dim) * (p->texture_t_pt_cnt) +
j * (nobj->surface.texture.dim) *
(nobj->surface.texture.torder);
return GLU_NO_ERROR;
}
 
/* main NURBS surface procedure */
void
do_nurbs_surface(GLUnurbsObj * nobj)
{
GLint *sfactors, *tfactors;
new_ctrl_type new_ctrl;
 
/* test user supplied data */
if (test_nurbs_surfaces(nobj) != GLU_NO_ERROR)
return;
 
init_new_ctrl(&new_ctrl);
 
if (convert_surfs(nobj, &new_ctrl) != GLU_NO_ERROR)
return;
if (augment_new_ctrl(nobj, &new_ctrl) != GLU_NO_ERROR)
return;
switch (nobj->sampling_method) {
case GLU_PATH_LENGTH:
if (glu_do_sampling_3D(nobj, &new_ctrl, &sfactors, &tfactors) !=
GLU_NO_ERROR) {
free_new_ctrl(&new_ctrl);
return;
}
break;
case GLU_DOMAIN_DISTANCE:
if (glu_do_sampling_uv(nobj, &new_ctrl, &sfactors, &tfactors) !=
GLU_NO_ERROR) {
free_new_ctrl(&new_ctrl);
return;
}
break;
case GLU_PARAMETRIC_ERROR:
if (glu_do_sampling_param_3D(nobj, &new_ctrl, &sfactors, &tfactors) !=
GLU_NO_ERROR) {
free_new_ctrl(&new_ctrl);
return;
}
break;
default:
abort();
}
glFrontFace(GL_CW);
switch (nobj->display_mode) {
case GLU_FILL:
/* if(polygon_trimming(nobj,&new_ctrl,sfactors,tfactors)==GLU_NO_ERROR)*/
draw_polygon_mode(GL_FILL, nobj, &new_ctrl, sfactors, tfactors);
break;
case GLU_OUTLINE_POLYGON:
/* TODO - missing trimming handeling */
/* just for now - no OUTLINE_PATCH mode
draw_patch_mode(GL_LINE,nobj,&new_ctrl,sfactors,tfactors);
break; */
case GLU_OUTLINE_PATCH:
/* if(polygon_trimming(nobj,&new_ctrl,sfactors,tfactors)==GLU_NO_ERROR)*/
draw_polygon_mode(GL_LINE, nobj, &new_ctrl, sfactors, tfactors);
break;
default:
abort(); /* TODO: is this OK? */
}
free(sfactors);
free(tfactors);
free_new_ctrl(&new_ctrl);
}
/shark/trunk/ports/mesa/src-glu/tesselat.c
0,0 → 1,407
/* $Id: tesselat.c,v 1.1 2003-02-28 11:42:08 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file is part of the polygon tesselation code contributed by
* Bogdan Sikorski
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <stdlib.h>
#include <math.h>
#include "tess.h"
#endif
 
 
 
static GLboolean edge_flag;
 
static void emit_triangle(GLUtriangulatorObj *, tess_vertex *,
tess_vertex *, tess_vertex *);
 
static void emit_triangle_with_edge_flag(GLUtriangulatorObj *,
tess_vertex *, GLboolean,
tess_vertex *, GLboolean,
tess_vertex *, GLboolean);
 
static GLdouble
twice_the_triangle_area(tess_vertex * va, tess_vertex * vb, tess_vertex * vc)
{
return (vb->x - va->x) * (vc->y - va->y) - (vb->y - va->y) * (vc->x -
va->x);
}
 
static GLboolean
left(GLdouble A, GLdouble B, GLdouble C, GLdouble x, GLdouble y)
{
if (A * x + B * y + C > -EPSILON)
return GL_TRUE;
else
return GL_FALSE;
}
 
static GLboolean
right(GLdouble A, GLdouble B, GLdouble C, GLdouble x, GLdouble y)
{
if (A * x + B * y + C < EPSILON)
return GL_TRUE;
else
return GL_FALSE;
}
 
static GLint
convex_ccw(tess_vertex * va,
tess_vertex * vb, tess_vertex * vc, GLUtriangulatorObj * tobj)
{
GLdouble d;
 
d = twice_the_triangle_area(va, vb, vc);
 
if (d > EPSILON) {
return 1;
}
else if (d < -EPSILON) {
return 0;
}
else {
return -1;
}
}
 
static GLint
convex_cw(tess_vertex * va,
tess_vertex * vb, tess_vertex * vc, GLUtriangulatorObj * tobj)
{
GLdouble d;
 
d = twice_the_triangle_area(va, vb, vc);
 
if (d < -EPSILON) {
return 1;
}
else if (d > EPSILON) {
return 0;
}
else {
return -1;
}
}
 
static GLboolean
diagonal_ccw(tess_vertex * va,
tess_vertex * vb,
GLUtriangulatorObj * tobj, tess_contour * contour)
{
tess_vertex *vc = va->next, *vertex, *shadow_vertex;
struct
{
GLdouble A, B, C;
}
ac, cb, ba;
GLdouble x, y;
 
GLint res = convex_ccw(va, vc, vb, tobj);
if (res == 0)
return GL_FALSE;
if (res == -1)
return GL_TRUE;
 
ba.A = vb->y - va->y;
ba.B = va->x - vb->x;
ba.C = -ba.A * va->x - ba.B * va->y;
ac.A = va->y - vc->y;
ac.B = vc->x - va->x;
ac.C = -ac.A * vc->x - ac.B * vc->y;
cb.A = vc->y - vb->y;
cb.B = vb->x - vc->x;
cb.C = -cb.A * vb->x - cb.B * vb->y;
for (vertex = vb->next; vertex != va; vertex = vertex->next) {
shadow_vertex = vertex->shadow_vertex;
if (shadow_vertex != NULL &&
(shadow_vertex == va || shadow_vertex == vb || shadow_vertex == vc))
continue;
x = vertex->x;
y = vertex->y;
if (left(ba.A, ba.B, ba.C, x, y) &&
left(ac.A, ac.B, ac.C, x, y) && left(cb.A, cb.B, cb.C, x, y))
return GL_FALSE;
}
return GL_TRUE;
}
 
static GLboolean
diagonal_cw(tess_vertex * va,
tess_vertex * vb,
GLUtriangulatorObj * tobj, tess_contour * contour)
{
tess_vertex *vc = va->next, *vertex, *shadow_vertex;
struct
{
GLdouble A, B, C;
}
ac, cb, ba;
GLdouble x, y;
 
GLint res = convex_cw(va, vc, vb, tobj);
if (res == 0)
return GL_FALSE;
if (res == -1)
return GL_TRUE;
 
ba.A = vb->y - va->y;
ba.B = va->x - vb->x;
ba.C = -ba.A * va->x - ba.B * va->y;
ac.A = va->y - vc->y;
ac.B = vc->x - va->x;
ac.C = -ac.A * vc->x - ac.B * vc->y;
cb.A = vc->y - vb->y;
cb.B = vb->x - vc->x;
cb.C = -cb.A * vb->x - cb.B * vb->y;
for (vertex = vb->next; vertex != va; vertex = vertex->next) {
shadow_vertex = vertex->shadow_vertex;
if (shadow_vertex != NULL &&
(shadow_vertex == va || shadow_vertex == vb || shadow_vertex == vc))
continue;
x = vertex->x;
y = vertex->y;
if (right(ba.A, ba.B, ba.C, x, y) &&
right(ac.A, ac.B, ac.C, x, y) && right(cb.A, cb.B, cb.C, x, y))
return GL_FALSE;
}
return GL_TRUE;
}
 
static void
clip_ear(GLUtriangulatorObj * tobj, tess_vertex * v, tess_contour * contour)
{
emit_triangle(tobj, v->previous, v, v->next);
/* the first in the list */
if (contour->vertices == v) {
contour->vertices = v->next;
contour->last_vertex->next = v->next;
v->next->previous = contour->last_vertex;
}
else
/* the last ? */
if (contour->last_vertex == v) {
contour->vertices->previous = v->previous;
v->previous->next = v->next;
contour->last_vertex = v->previous;
}
else {
v->next->previous = v->previous;
v->previous->next = v->next;
}
free(v);
--(contour->vertex_cnt);
}
 
static void
clip_ear_with_edge_flag(GLUtriangulatorObj * tobj,
tess_vertex * v, tess_contour * contour)
{
emit_triangle_with_edge_flag(tobj, v->previous, v->previous->edge_flag,
v, v->edge_flag, v->next, GL_FALSE);
v->previous->edge_flag = GL_FALSE;
/* the first in the list */
if (contour->vertices == v) {
contour->vertices = v->next;
contour->last_vertex->next = v->next;
v->next->previous = contour->last_vertex;
}
else
/* the last ? */
if (contour->last_vertex == v) {
contour->vertices->previous = v->previous;
v->previous->next = v->next;
contour->last_vertex = v->previous;
}
else {
v->next->previous = v->previous;
v->previous->next = v->next;
}
free(v);
--(contour->vertex_cnt);
}
 
static void
triangulate_ccw(GLUtriangulatorObj * tobj, tess_contour * contour)
{
tess_vertex *vertex;
GLuint vertex_cnt = contour->vertex_cnt;
 
while (vertex_cnt > 3) {
vertex = contour->vertices;
while (diagonal_ccw(vertex, vertex->next->next, tobj, contour) ==
GL_FALSE && tobj->error == GLU_NO_ERROR)
vertex = vertex->next;
if (tobj->error != GLU_NO_ERROR)
return;
clip_ear(tobj, vertex->next, contour);
--vertex_cnt;
}
}
 
static void
triangulate_cw(GLUtriangulatorObj * tobj, tess_contour * contour)
{
tess_vertex *vertex;
GLuint vertex_cnt = contour->vertex_cnt;
 
while (vertex_cnt > 3) {
vertex = contour->vertices;
while (diagonal_cw(vertex, vertex->next->next, tobj, contour) ==
GL_FALSE && tobj->error == GLU_NO_ERROR)
vertex = vertex->next;
if (tobj->error != GLU_NO_ERROR)
return;
clip_ear(tobj, vertex->next, contour);
--vertex_cnt;
}
}
 
static void
triangulate_ccw_with_edge_flag(GLUtriangulatorObj * tobj,
tess_contour * contour)
{
tess_vertex *vertex;
GLuint vertex_cnt = contour->vertex_cnt;
 
while (vertex_cnt > 3) {
vertex = contour->vertices;
while (diagonal_ccw(vertex, vertex->next->next, tobj, contour) ==
GL_FALSE && tobj->error == GLU_NO_ERROR)
vertex = vertex->next;
if (tobj->error != GLU_NO_ERROR)
return;
clip_ear_with_edge_flag(tobj, vertex->next, contour);
--vertex_cnt;
}
}
 
static void
triangulate_cw_with_edge_flag(GLUtriangulatorObj * tobj,
tess_contour * contour)
{
tess_vertex *vertex;
GLuint vertex_cnt = contour->vertex_cnt;
 
while (vertex_cnt > 3) {
vertex = contour->vertices;
while (diagonal_cw(vertex, vertex->next->next, tobj, contour) ==
GL_FALSE && tobj->error == GLU_NO_ERROR)
vertex = vertex->next;
if (tobj->error != GLU_NO_ERROR)
return;
clip_ear_with_edge_flag(tobj, vertex->next, contour);
--vertex_cnt;
}
}
 
void
tess_tesselate(GLUtriangulatorObj * tobj)
{
tess_contour *contour;
 
for (contour = tobj->contours; contour != NULL; contour = contour->next) {
if (contour->orientation == GLU_CCW) {
triangulate_ccw(tobj, contour);
}
else {
triangulate_cw(tobj, contour);
}
if (tobj->error != GLU_NO_ERROR)
return;
 
/* emit the last triangle */
emit_triangle(tobj, contour->vertices, contour->vertices->next,
contour->vertices->next->next);
}
}
 
void
tess_tesselate_with_edge_flag(GLUtriangulatorObj * tobj)
{
tess_contour *contour;
 
edge_flag = GL_TRUE;
/* first callback with edgeFlag set to GL_TRUE */
(tobj->callbacks.edgeFlag) (GL_TRUE);
 
for (contour = tobj->contours; contour != NULL; contour = contour->next) {
if (contour->orientation == GLU_CCW)
triangulate_ccw_with_edge_flag(tobj, contour);
else
triangulate_cw_with_edge_flag(tobj, contour);
if (tobj->error != GLU_NO_ERROR)
return;
/* emit the last triangle */
emit_triangle_with_edge_flag(tobj, contour->vertices,
contour->vertices->edge_flag,
contour->vertices->next,
contour->vertices->next->edge_flag,
contour->vertices->next->next,
contour->vertices->next->next->edge_flag);
}
}
 
static void
emit_triangle(GLUtriangulatorObj * tobj,
tess_vertex * v1, tess_vertex * v2, tess_vertex * v3)
{
(tobj->callbacks.begin) (GL_TRIANGLES);
(tobj->callbacks.vertex) (v1->data);
(tobj->callbacks.vertex) (v2->data);
(tobj->callbacks.vertex) (v3->data);
(tobj->callbacks.end) ();
}
 
static void
emit_triangle_with_edge_flag(GLUtriangulatorObj * tobj,
tess_vertex * v1,
GLboolean edge_flag1,
tess_vertex * v2,
GLboolean edge_flag2,
tess_vertex * v3, GLboolean edge_flag3)
{
(tobj->callbacks.begin) (GL_TRIANGLES);
if (edge_flag1 != edge_flag) {
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
(tobj->callbacks.edgeFlag) (edge_flag);
}
(tobj->callbacks.vertex) (v1->data);
if (edge_flag2 != edge_flag) {
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
(tobj->callbacks.edgeFlag) (edge_flag);
}
(tobj->callbacks.vertex) (v2->data);
if (edge_flag3 != edge_flag) {
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
(tobj->callbacks.edgeFlag) (edge_flag);
}
(tobj->callbacks.vertex) (v3->data);
(tobj->callbacks.end) ();
}
/shark/trunk/ports/mesa/src-glu/project.c
0,0 → 1,402
/* $Id: project.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "gluP.h"
#endif
 
 
/*
* This code was contributed by Marc Buffat (buffat@mecaflu.ec-lyon.fr).
* Thanks Marc!!!
*/
 
 
 
/* implementation de gluProject et gluUnproject */
/* M. Buffat 17/2/95 */
 
 
 
/*
* Transform a point (column vector) by a 4x4 matrix. I.e. out = m * in
* Input: m - the 4x4 matrix
* in - the 4x1 vector
* Output: out - the resulting 4x1 vector.
*/
static void
transform_point(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
{
#define M(row,col) m[col*4+row]
out[0] =
M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
out[1] =
M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
out[2] =
M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
out[3] =
M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];
#undef M
}
 
 
 
 
/*
* Perform a 4x4 matrix multiplication (product = a x b).
* Input: a, b - matrices to multiply
* Output: product - product of a and b
*/
static void
matmul(GLdouble * product, const GLdouble * a, const GLdouble * b)
{
/* This matmul was contributed by Thomas Malik */
GLdouble temp[16];
GLint i;
 
#define A(row,col) a[(col<<2)+row]
#define B(row,col) b[(col<<2)+row]
#define T(row,col) temp[(col<<2)+row]
 
/* i-te Zeile */
for (i = 0; i < 4; i++) {
T(i, 0) =
A(i, 0) * B(0, 0) + A(i, 1) * B(1, 0) + A(i, 2) * B(2, 0) + A(i,
3) *
B(3, 0);
T(i, 1) =
A(i, 0) * B(0, 1) + A(i, 1) * B(1, 1) + A(i, 2) * B(2, 1) + A(i,
3) *
B(3, 1);
T(i, 2) =
A(i, 0) * B(0, 2) + A(i, 1) * B(1, 2) + A(i, 2) * B(2, 2) + A(i,
3) *
B(3, 2);
T(i, 3) =
A(i, 0) * B(0, 3) + A(i, 1) * B(1, 3) + A(i, 2) * B(2, 3) + A(i,
3) *
B(3, 3);
}
 
#undef A
#undef B
#undef T
MEMCPY(product, temp, 16 * sizeof(GLdouble));
}
 
 
 
/*
* Compute inverse of 4x4 transformation matrix.
* Code contributed by Jacques Leroy jle@star.be
* Return GL_TRUE for success, GL_FALSE for failure (singular matrix)
*/
static GLboolean
invert_matrix(const GLdouble * m, GLdouble * out)
{
/* NB. OpenGL Matrices are COLUMN major. */
#define SWAP_ROWS(a, b) { GLdouble *_tmp = a; (a)=(b); (b)=_tmp; }
#define MAT(m,r,c) (m)[(c)*4+(r)]
 
GLdouble wtmp[4][8];
GLdouble m0, m1, m2, m3, s;
GLdouble *r0, *r1, *r2, *r3;
 
r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
 
r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1),
r0[2] = MAT(m, 0, 2), r0[3] = MAT(m, 0, 3),
r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1),
r1[2] = MAT(m, 1, 2), r1[3] = MAT(m, 1, 3),
r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1),
r2[2] = MAT(m, 2, 2), r2[3] = MAT(m, 2, 3),
r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
r3[0] = MAT(m, 3, 0), r3[1] = MAT(m, 3, 1),
r3[2] = MAT(m, 3, 2), r3[3] = MAT(m, 3, 3),
r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
 
/* choose pivot - or die */
if (fabs(r3[0]) > fabs(r2[0]))
SWAP_ROWS(r3, r2);
if (fabs(r2[0]) > fabs(r1[0]))
SWAP_ROWS(r2, r1);
if (fabs(r1[0]) > fabs(r0[0]))
SWAP_ROWS(r1, r0);
if (0.0 == r0[0])
return GL_FALSE;
 
/* eliminate first variable */
m1 = r1[0] / r0[0];
m2 = r2[0] / r0[0];
m3 = r3[0] / r0[0];
s = r0[1];
r1[1] -= m1 * s;
r2[1] -= m2 * s;
r3[1] -= m3 * s;
s = r0[2];
r1[2] -= m1 * s;
r2[2] -= m2 * s;
r3[2] -= m3 * s;
s = r0[3];
r1[3] -= m1 * s;
r2[3] -= m2 * s;
r3[3] -= m3 * s;
s = r0[4];
if (s != 0.0) {
r1[4] -= m1 * s;
r2[4] -= m2 * s;
r3[4] -= m3 * s;
}
s = r0[5];
if (s != 0.0) {
r1[5] -= m1 * s;
r2[5] -= m2 * s;
r3[5] -= m3 * s;
}
s = r0[6];
if (s != 0.0) {
r1[6] -= m1 * s;
r2[6] -= m2 * s;
r3[6] -= m3 * s;
}
s = r0[7];
if (s != 0.0) {
r1[7] -= m1 * s;
r2[7] -= m2 * s;
r3[7] -= m3 * s;
}
 
/* choose pivot - or die */
if (fabs(r3[1]) > fabs(r2[1]))
SWAP_ROWS(r3, r2);
if (fabs(r2[1]) > fabs(r1[1]))
SWAP_ROWS(r2, r1);
if (0.0 == r1[1])
return GL_FALSE;
 
/* eliminate second variable */
m2 = r2[1] / r1[1];
m3 = r3[1] / r1[1];
r2[2] -= m2 * r1[2];
r3[2] -= m3 * r1[2];
r2[3] -= m2 * r1[3];
r3[3] -= m3 * r1[3];
s = r1[4];
if (0.0 != s) {
r2[4] -= m2 * s;
r3[4] -= m3 * s;
}
s = r1[5];
if (0.0 != s) {
r2[5] -= m2 * s;
r3[5] -= m3 * s;
}
s = r1[6];
if (0.0 != s) {
r2[6] -= m2 * s;
r3[6] -= m3 * s;
}
s = r1[7];
if (0.0 != s) {
r2[7] -= m2 * s;
r3[7] -= m3 * s;
}
 
/* choose pivot - or die */
if (fabs(r3[2]) > fabs(r2[2]))
SWAP_ROWS(r3, r2);
if (0.0 == r2[2])
return GL_FALSE;
 
/* eliminate third variable */
m3 = r3[2] / r2[2];
r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4],
r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6], r3[7] -= m3 * r2[7];
 
/* last check */
if (0.0 == r3[3])
return GL_FALSE;
 
s = 1.0 / r3[3]; /* now back substitute row 3 */
r3[4] *= s;
r3[5] *= s;
r3[6] *= s;
r3[7] *= s;
 
m2 = r2[3]; /* now back substitute row 2 */
s = 1.0 / r2[2];
r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
m1 = r1[3];
r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1,
r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1;
m0 = r0[3];
r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0,
r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0;
 
m1 = r1[2]; /* now back substitute row 1 */
s = 1.0 / r1[1];
r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
m0 = r0[2];
r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0,
r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0;
 
m0 = r0[1]; /* now back substitute row 0 */
s = 1.0 / r0[0];
r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
 
MAT(out, 0, 0) = r0[4];
MAT(out, 0, 1) = r0[5], MAT(out, 0, 2) = r0[6];
MAT(out, 0, 3) = r0[7], MAT(out, 1, 0) = r1[4];
MAT(out, 1, 1) = r1[5], MAT(out, 1, 2) = r1[6];
MAT(out, 1, 3) = r1[7], MAT(out, 2, 0) = r2[4];
MAT(out, 2, 1) = r2[5], MAT(out, 2, 2) = r2[6];
MAT(out, 2, 3) = r2[7], MAT(out, 3, 0) = r3[4];
MAT(out, 3, 1) = r3[5], MAT(out, 3, 2) = r3[6];
MAT(out, 3, 3) = r3[7];
 
return GL_TRUE;
 
#undef MAT
#undef SWAP_ROWS
}
 
 
 
/* projection du point (objx,objy,obz) sur l'ecran (winx,winy,winz) */
GLint GLAPIENTRY
gluProject(GLdouble objx, GLdouble objy, GLdouble objz,
const GLdouble model[16], const GLdouble proj[16],
const GLint viewport[4],
GLdouble * winx, GLdouble * winy, GLdouble * winz)
{
/* matrice de transformation */
GLdouble in[4], out[4];
 
/* initilise la matrice et le vecteur a transformer */
in[0] = objx;
in[1] = objy;
in[2] = objz;
in[3] = 1.0;
transform_point(out, model, in);
transform_point(in, proj, out);
 
/* d'ou le resultat normalise entre -1 et 1 */
if (in[3] == 0.0)
return GL_FALSE;
 
in[0] /= in[3];
in[1] /= in[3];
in[2] /= in[3];
 
/* en coordonnees ecran */
*winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
*winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
*winz = (1 + in[2]) / 2;
return GL_TRUE;
}
 
 
 
/* transformation du point ecran (winx,winy,winz) en point objet */
GLint GLAPIENTRY
gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz,
const GLdouble model[16], const GLdouble proj[16],
const GLint viewport[4],
GLdouble * objx, GLdouble * objy, GLdouble * objz)
{
/* matrice de transformation */
GLdouble m[16], A[16];
GLdouble in[4], out[4];
 
/* transformation coordonnees normalisees entre -1 et 1 */
in[0] = (winx - viewport[0]) * 2 / viewport[2] - 1.0;
in[1] = (winy - viewport[1]) * 2 / viewport[3] - 1.0;
in[2] = 2 * winz - 1.0;
in[3] = 1.0;
 
/* calcul transformation inverse */
matmul(A, proj, model);
invert_matrix(A, m);
 
/* d'ou les coordonnees objets */
transform_point(out, m, in);
if (out[3] == 0.0)
return GL_FALSE;
*objx = out[0] / out[3];
*objy = out[1] / out[3];
*objz = out[2] / out[3];
return GL_TRUE;
}
 
 
/*
* New in GLU 1.3
* This is like gluUnProject but also takes near and far DepthRange values.
*/
#ifdef GLU_VERSION_1_3
GLint GLAPIENTRY
gluUnProject4(GLdouble winx, GLdouble winy, GLdouble winz, GLdouble clipw,
const GLdouble modelMatrix[16],
const GLdouble projMatrix[16],
const GLint viewport[4],
GLclampd nearZ, GLclampd farZ,
GLdouble * objx, GLdouble * objy, GLdouble * objz,
GLdouble * objw)
{
/* matrice de transformation */
GLdouble m[16], A[16];
GLdouble in[4], out[4];
GLdouble z = nearZ + winz * (farZ - nearZ);
 
/* transformation coordonnees normalisees entre -1 et 1 */
in[0] = (winx - viewport[0]) * 2 / viewport[2] - 1.0;
in[1] = (winy - viewport[1]) * 2 / viewport[3] - 1.0;
in[2] = 2.0 * z - 1.0;
in[3] = clipw;
 
/* calcul transformation inverse */
matmul(A, projMatrix, modelMatrix);
invert_matrix(A, m);
 
/* d'ou les coordonnees objets */
transform_point(out, m, in);
if (out[3] == 0.0)
return GL_FALSE;
*objx = out[0] / out[3];
*objy = out[1] / out[3];
*objz = out[2] / out[3];
*objw = out[3];
return GL_TRUE;
}
#endif
/shark/trunk/ports/mesa/src-glu/glu.c
0,0 → 1,417
/* $Id: glu.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.5
* Copyright (C) 1995-2001 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gluP.h"
#endif
 
 
/*
* Miscellaneous utility functions
*/
 
 
#ifndef M_PI
#define M_PI 3.1415926536
#endif
#define EPS 0.00001
 
#ifndef GLU_INCOMPATIBLE_GL_VERSION
#define GLU_INCOMPATIBLE_GL_VERSION 100903
#endif
 
 
void GLAPIENTRY
gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz,
GLdouble upx, GLdouble upy, GLdouble upz)
{
GLdouble m[16];
GLdouble x[3], y[3], z[3];
GLdouble mag;
 
/* Make rotation matrix */
 
/* Z vector */
z[0] = eyex - centerx;
z[1] = eyey - centery;
z[2] = eyez - centerz;
mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
if (mag) { /* mpichler, 19950515 */
z[0] /= mag;
z[1] /= mag;
z[2] /= mag;
}
 
/* Y vector */
y[0] = upx;
y[1] = upy;
y[2] = upz;
 
/* X vector = Y cross Z */
x[0] = y[1] * z[2] - y[2] * z[1];
x[1] = -y[0] * z[2] + y[2] * z[0];
x[2] = y[0] * z[1] - y[1] * z[0];
 
/* Recompute Y = Z cross X */
y[0] = z[1] * x[2] - z[2] * x[1];
y[1] = -z[0] * x[2] + z[2] * x[0];
y[2] = z[0] * x[1] - z[1] * x[0];
 
/* mpichler, 19950515 */
/* cross product gives area of parallelogram, which is < 1.0 for
* non-perpendicular unit-length vectors; so normalize x, y here
*/
 
mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
if (mag) {
x[0] /= mag;
x[1] /= mag;
x[2] /= mag;
}
 
mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
if (mag) {
y[0] /= mag;
y[1] /= mag;
y[2] /= mag;
}
 
#define M(row,col) m[col*4+row]
M(0, 0) = x[0];
M(0, 1) = x[1];
M(0, 2) = x[2];
M(0, 3) = 0.0;
M(1, 0) = y[0];
M(1, 1) = y[1];
M(1, 2) = y[2];
M(1, 3) = 0.0;
M(2, 0) = z[0];
M(2, 1) = z[1];
M(2, 2) = z[2];
M(2, 3) = 0.0;
M(3, 0) = 0.0;
M(3, 1) = 0.0;
M(3, 2) = 0.0;
M(3, 3) = 1.0;
#undef M
glMultMatrixd(m);
 
/* Translate Eye to Origin */
glTranslated(-eyex, -eyey, -eyez);
 
}
 
 
 
void GLAPIENTRY
gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)
{
glOrtho(left, right, bottom, top, -1.0, 1.0);
}
 
 
 
static void
frustum(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble nearval, GLdouble farval)
{
GLdouble x, y, a, b, c, d;
GLdouble m[16];
 
x = (2.0 * nearval) / (right - left);
y = (2.0 * nearval) / (top - bottom);
a = (right + left) / (right - left);
b = (top + bottom) / (top - bottom);
c = -(farval + nearval) / ( farval - nearval);
d = -(2.0 * farval * nearval) / (farval - nearval);
 
#define M(row,col) m[col*4+row]
M(0,0) = x; M(0,1) = 0.0F; M(0,2) = a; M(0,3) = 0.0F;
M(1,0) = 0.0F; M(1,1) = y; M(1,2) = b; M(1,3) = 0.0F;
M(2,0) = 0.0F; M(2,1) = 0.0F; M(2,2) = c; M(2,3) = d;
M(3,0) = 0.0F; M(3,1) = 0.0F; M(3,2) = -1.0F; M(3,3) = 0.0F;
#undef M
 
glMultMatrixd(m);
}
 
 
void GLAPIENTRY
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
{
GLdouble xmin, xmax, ymin, ymax;
 
ymax = zNear * tan(fovy * M_PI / 360.0);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;
 
/* don't call glFrustum() because of error semantics (covglu) */
frustum(xmin, xmax, ymin, ymax, zNear, zFar);
}
 
 
 
void GLAPIENTRY
gluPickMatrix(GLdouble x, GLdouble y,
GLdouble width, GLdouble height, GLint viewport[4])
{
GLfloat m[16];
GLfloat sx, sy;
GLfloat tx, ty;
 
sx = viewport[2] / width;
sy = viewport[3] / height;
tx = (viewport[2] + 2.0 * (viewport[0] - x)) / width;
ty = (viewport[3] + 2.0 * (viewport[1] - y)) / height;
 
#define M(row,col) m[col*4+row]
M(0, 0) = sx;
M(0, 1) = 0.0;
M(0, 2) = 0.0;
M(0, 3) = tx;
M(1, 0) = 0.0;
M(1, 1) = sy;
M(1, 2) = 0.0;
M(1, 3) = ty;
M(2, 0) = 0.0;
M(2, 1) = 0.0;
M(2, 2) = 1.0;
M(2, 3) = 0.0;
M(3, 0) = 0.0;
M(3, 1) = 0.0;
M(3, 2) = 0.0;
M(3, 3) = 1.0;
#undef M
 
glMultMatrixf(m);
}
 
 
 
const GLubyte *GLAPIENTRY
gluErrorString(GLenum errorCode)
{
static char *tess_error[] = {
"missing gluBeginPolygon",
"missing gluBeginContour",
"missing gluEndPolygon",
"missing gluEndContour",
"misoriented or self-intersecting loops",
"coincident vertices",
"colinear vertices",
"FIST recovery process fatal error"
};
static char *nurbs_error[] = {
"spline order un-supported",
"too few knots",
"valid knot range is empty",
"decreasing knot sequence knot",
"knot multiplicity greater than order of spline",
"endcurve() must follow bgncurve()",
"bgncurve() must precede endcurve()",
"missing or extra geometric data",
"can't draw pwlcurves",
"missing bgncurve()",
"missing bgnsurface()",
"endtrim() must precede endsurface()",
"bgnsurface() must precede endsurface()",
"curve of improper type passed as trim curve",
"bgnsurface() must precede bgntrim()",
"endtrim() must follow bgntrim()",
"bgntrim() must precede endtrim()",
"invalid or missing trim curve",
"bgntrim() must precede pwlcurve()",
"pwlcurve referenced twice",
"pwlcurve and nurbscurve mixed",
"improper usage of trim data type",
"nurbscurve referenced twice",
"nurbscurve and pwlcurve mixed",
"nurbssurface referenced twice",
"invalid property",
"endsurface() must follow bgnsurface()",
"misoriented trim curves",
"intersecting trim curves",
"UNUSED",
"unconnected trim curves",
"unknown knot error",
"negative vertex count encountered",
"negative byte-stride encountered",
"unknown type descriptor",
"null control array or knot vector",
"duplicate point on pwlcurve"
};
 
/* GL Errors */
if (errorCode == GL_NO_ERROR) {
return (GLubyte *) "no error";
}
else if (errorCode == GL_INVALID_VALUE) {
return (GLubyte *) "invalid value";
}
else if (errorCode == GL_INVALID_ENUM) {
return (GLubyte *) "invalid enum";
}
else if (errorCode == GL_INVALID_OPERATION) {
return (GLubyte *) "invalid operation";
}
else if (errorCode == GL_STACK_OVERFLOW) {
return (GLubyte *) "stack overflow";
}
else if (errorCode == GL_STACK_UNDERFLOW) {
return (GLubyte *) "stack underflow";
}
else if (errorCode == GL_OUT_OF_MEMORY) {
return (GLubyte *) "out of memory";
}
/* GLU Errors */
else if (errorCode == GLU_NO_ERROR) {
return (GLubyte *) "no error";
}
else if (errorCode == GLU_INVALID_ENUM) {
return (GLubyte *) "invalid enum";
}
else if (errorCode == GLU_INVALID_VALUE) {
return (GLubyte *) "invalid value";
}
else if (errorCode == GLU_OUT_OF_MEMORY) {
return (GLubyte *) "out of memory";
}
else if (errorCode == GLU_INCOMPATIBLE_GL_VERSION) {
return (GLubyte *) "incompatible GL version";
}
else if (errorCode >= GLU_TESS_ERROR1 && errorCode <= GLU_TESS_ERROR8) {
return (GLubyte *) tess_error[errorCode - GLU_TESS_ERROR1];
}
else if (errorCode >= GLU_NURBS_ERROR1 && errorCode <= GLU_NURBS_ERROR37) {
return (GLubyte *) nurbs_error[errorCode - GLU_NURBS_ERROR1];
}
else {
return NULL;
}
}
 
 
 
/*
* New in GLU 1.1
*/
 
const GLubyte *GLAPIENTRY
gluGetString(GLenum name)
{
static char *extensions = "GL_EXT_abgr";
static char *version = "1.1 Mesa 3.5";
 
switch (name) {
case GLU_EXTENSIONS:
return (GLubyte *) extensions;
case GLU_VERSION:
return (GLubyte *) version;
default:
return NULL;
}
}
 
 
 
#if 0 /* gluGetProcAddressEXT not finalized yet! */
 
#ifdef __cplusplus
/* for BeOS R4.5 */
void GLAPIENTRY(*gluGetProcAddressEXT(const GLubyte * procName)) (...)
#else
void (GLAPIENTRY * gluGetProcAddressEXT(const GLubyte * procName)) ()
#endif
{
struct proc
{
const char *name;
void *address;
};
static struct proc procTable[] = {
{"gluGetProcAddressEXT", (void *) gluGetProcAddressEXT}, /* me! */
 
/* new 1.1 functions */
{"gluGetString", (void *) gluGetString},
 
/* new 1.2 functions */
{"gluTessBeginPolygon", (void *) gluTessBeginPolygon},
{"gluTessBeginContour", (void *) gluTessBeginContour},
{"gluTessEndContour", (void *) gluTessEndContour},
{"gluTessEndPolygon", (void *) gluTessEndPolygon},
{"gluGetTessProperty", (void *) gluGetTessProperty},
 
/* new 1.3 functions */
 
{NULL, NULL}
};
GLuint i;
 
for (i = 0; procTable[i].address; i++) {
if (strcmp((const char *) procName, procTable[i].name) == 0)
return (void (GLAPIENTRY *) ()) procTable[i].address;
}
 
return NULL;
}
 
#endif
 
 
 
/*
* New in GLU 1.3
*/
#ifdef GLU_VERSION_1_3
GLboolean GLAPIENTRY
gluCheckExtension(const GLubyte *extName, const GLubyte * extString)
{
assert(extName);
assert(extString);
{
const int len = strlen((const char *) extName);
const char *start = (const char *) extString;
 
/*while (1) {
const char *c = strstr(start, (const char *) extName);
if (!c)
return GL_FALSE;
 
if ((c == start || c[-1] == ' ') && (c[len] == ' ' || c[len] == 0))
return GL_TRUE;
 
start = c + len;
}*/ return GL_TRUE;
}
}
#endif
/shark/trunk/ports/mesa/src-glu/quadric.c
0,0 → 1,820
/* $Id: quadric.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1999-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/* TODO:
* texture coordinate support
* flip normals according to orientation
* there's still some inside/outside orientation bugs in possibly all
* but the sphere function
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "gluP.h"
#endif
 
 
 
#ifndef M_PI
# define M_PI (3.1415926)
#endif
 
 
/*
* Convert degrees to radians:
*/
#define DEG_TO_RAD(A) ((A)*(M_PI/180.0))
 
 
/*
* Sin and Cos for degree angles:
*/
#define SIND( A ) sin( (A)*(M_PI/180.0) )
#define COSD( A) cos( (A)*(M_PI/180.0) )
 
 
/*
* Texture coordinates if texture flag is set
*/
#define TXTR_COORD(x,y) if (qobj->TextureFlag) glTexCoord2f(x,y);
 
 
 
struct GLUquadric
{
GLenum DrawStyle; /* GLU_FILL, LINE, SILHOUETTE, or POINT */
GLenum Orientation; /* GLU_INSIDE or GLU_OUTSIDE */
GLboolean TextureFlag; /* Generate texture coords? */
GLenum Normals; /* GLU_NONE, GLU_FLAT, or GLU_SMOOTH */
void (GLCALLBACK * ErrorFunc) (GLenum err); /* Error handler callback function */
};
 
 
 
/*
* Process a GLU error.
*/
static void
quadric_error(GLUquadricObj * qobj, GLenum error, const char *msg)
{
/* Call the error call back function if any */
if (qobj->ErrorFunc) {
(*qobj->ErrorFunc) (error);
}
/* Print a message to stdout if MESA_DEBUG variable is defined */
if (getenv("MESA_DEBUG")) {
fprintf(stderr, "GLUError: %s: %s\n", (char *) gluErrorString(error),
msg);
}
}
 
 
 
 
GLUquadricObj *GLAPIENTRY
gluNewQuadric(void)
{
GLUquadricObj *q;
 
q = (GLUquadricObj *) malloc(sizeof(struct GLUquadric));
if (q) {
q->DrawStyle = GLU_FILL;
q->Orientation = GLU_OUTSIDE;
q->TextureFlag = GL_FALSE;
q->Normals = GLU_SMOOTH;
q->ErrorFunc = NULL;
}
return q;
}
 
 
 
void GLAPIENTRY
gluDeleteQuadric(GLUquadricObj * state)
{
if (state) {
free((void *) state);
}
}
 
 
 
/*
* Set the drawing style to be GLU_FILL, GLU_LINE, GLU_SILHOUETTE,
* or GLU_POINT.
*/
void GLAPIENTRY
gluQuadricDrawStyle(GLUquadricObj * quadObject, GLenum drawStyle)
{
if (quadObject && (drawStyle == GLU_FILL || drawStyle == GLU_LINE
|| drawStyle == GLU_SILHOUETTE
|| drawStyle == GLU_POINT)) {
quadObject->DrawStyle = drawStyle;
}
else {
quadric_error(quadObject, GLU_INVALID_ENUM, "qluQuadricDrawStyle");
}
}
 
 
 
/*
* Set the orientation to GLU_INSIDE or GLU_OUTSIDE.
*/
void GLAPIENTRY
gluQuadricOrientation(GLUquadricObj * quadObject, GLenum orientation)
{
if (quadObject
&& (orientation == GLU_INSIDE || orientation == GLU_OUTSIDE)) {
quadObject->Orientation = orientation;
}
else {
quadric_error(quadObject, GLU_INVALID_ENUM, "qluQuadricOrientation");
}
}
 
 
 
/*
* Set the error handler callback function.
*/
void GLAPIENTRY
gluQuadricCallback(GLUquadricObj * qobj,
GLenum which, void (GLCALLBACK * fn) ())
{
/*
* UGH, this is a mess! I thought ANSI was a standard.
*/
if (qobj && which == GLU_ERROR) {
#ifdef __CYGWIN32__
qobj->ErrorFunc = (void (GLCALLBACKPCAST) (GLenum)) fn;
#elif defined(OPENSTEP)
qobj->ErrorFunc = (void (*)(GLenum)) fn;
#elif defined(_WIN32)
qobj->ErrorFunc = (void (GLCALLBACK *) (int)) fn;
#elif defined(__STORM__)
qobj->ErrorFunc = (void (GLCALLBACK *) (GLenum)) fn;
#elif defined(__BEOS__)
qobj->ErrorFunc = (void (*)(GLenum)) fn;
#else
qobj->ErrorFunc = (void (GLCALLBACK *) ()) fn;
#endif
}
}
 
 
void GLAPIENTRY
gluQuadricNormals(GLUquadricObj * quadObject, GLenum normals)
{
if (quadObject
&& (normals == GLU_NONE || normals == GLU_FLAT
|| normals == GLU_SMOOTH)) {
quadObject->Normals = normals;
}
}
 
 
void GLAPIENTRY
gluQuadricTexture(GLUquadricObj * quadObject, GLboolean textureCoords)
{
if (quadObject) {
quadObject->TextureFlag = textureCoords;
}
}
 
 
 
 
/*
* Call glNormal3f after scaling normal to unit length.
*/
static void
normal3f(GLfloat x, GLfloat y, GLfloat z)
{
GLdouble mag;
 
mag = sqrt(x * x + y * y + z * z);
if (mag > 0.00001F) {
x /= mag;
y /= mag;
z /= mag;
}
glNormal3f(x, y, z);
}
 
 
 
void GLAPIENTRY
gluCylinder(GLUquadricObj * qobj,
GLdouble baseRadius, GLdouble topRadius,
GLdouble height, GLint slices, GLint stacks)
{
GLdouble da, r, dr, dz;
GLfloat x, y, z, nz, nsign;
GLint i, j;
 
if (qobj->Orientation == GLU_INSIDE) {
nsign = -1.0;
}
else {
nsign = 1.0;
}
 
da = 2.0 * M_PI / slices;
dr = (topRadius - baseRadius) / stacks;
dz = height / stacks;
nz = (baseRadius - topRadius) / height; /* Z component of normal vectors */
 
if (qobj->DrawStyle == GLU_POINT) {
glBegin(GL_POINTS);
for (i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
normal3f(x * nsign, y * nsign, nz * nsign);
 
z = 0.0;
r = baseRadius;
for (j = 0; j <= stacks; j++) {
glVertex3f(x * r, y * r, z);
z += dz;
r += dr;
}
}
glEnd();
}
else if (qobj->DrawStyle == GLU_LINE || qobj->DrawStyle == GLU_SILHOUETTE) {
/* Draw rings */
if (qobj->DrawStyle == GLU_LINE) {
z = 0.0;
r = baseRadius;
for (j = 0; j <= stacks; j++) {
glBegin(GL_LINE_LOOP);
for (i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
normal3f(x * nsign, y * nsign, nz * nsign);
glVertex3f(x * r, y * r, z);
}
glEnd();
z += dz;
r += dr;
}
}
else {
/* draw one ring at each end */
if (baseRadius != 0.0) {
glBegin(GL_LINE_LOOP);
for (i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
normal3f(x * nsign, y * nsign, nz * nsign);
glVertex3f(x * baseRadius, y * baseRadius, 0.0);
}
glEnd();
glBegin(GL_LINE_LOOP);
for (i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
normal3f(x * nsign, y * nsign, nz * nsign);
glVertex3f(x * topRadius, y * topRadius, height);
}
glEnd();
}
}
/* draw length lines */
glBegin(GL_LINES);
for (i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
normal3f(x * nsign, y * nsign, nz * nsign);
glVertex3f(x * baseRadius, y * baseRadius, 0.0);
glVertex3f(x * topRadius, y * topRadius, height);
}
glEnd();
}
else if (qobj->DrawStyle == GLU_FILL) {
GLfloat ds = 1.0 / slices;
GLfloat dt = 1.0 / stacks;
GLfloat t = 0.0;
z = 0.0;
r = baseRadius;
for (j = 0; j < stacks; j++) {
GLfloat s = 0.0;
glBegin(GL_QUAD_STRIP);
for (i = 0; i <= slices; i++) {
GLfloat x, y;
if (i == slices) {
x = sin(0.0);
y = cos(0.0);
}
else {
x = sin(i * da);
y = cos(i * da);
}
if (nsign == 1.0) {
normal3f(x * nsign, y * nsign, nz * nsign);
TXTR_COORD(s, t);
glVertex3f(x * r, y * r, z);
normal3f(x * nsign, y * nsign, nz * nsign);
TXTR_COORD(s, t + dt);
glVertex3f(x * (r + dr), y * (r + dr), z + dz);
}
else {
normal3f(x * nsign, y * nsign, nz * nsign);
TXTR_COORD(s, t);
glVertex3f(x * r, y * r, z);
normal3f(x * nsign, y * nsign, nz * nsign);
TXTR_COORD(s, t + dt);
glVertex3f(x * (r + dr), y * (r + dr), z + dz);
}
s += ds;
} /* for slices */
glEnd();
r += dr;
t += dt;
z += dz;
} /* for stacks */
}
}
 
 
 
 
 
void GLAPIENTRY
gluSphere(GLUquadricObj * qobj, GLdouble radius, GLint slices, GLint stacks)
{
GLfloat rho, drho, theta, dtheta;
GLfloat x, y, z;
GLfloat s, t, ds, dt;
GLint i, j, imin, imax;
GLboolean normals;
GLfloat nsign;
 
if (qobj->Normals == GLU_NONE) {
normals = GL_FALSE;
}
else {
normals = GL_TRUE;
}
if (qobj->Orientation == GLU_INSIDE) {
nsign = -1.0;
}
else {
nsign = 1.0;
}
 
drho = M_PI / (GLfloat) stacks;
dtheta = 2.0 * M_PI / (GLfloat) slices;
 
/* texturing: s goes from 0.0/0.25/0.5/0.75/1.0 at +y/+x/-y/-x/+y axis */
/* t goes from -1.0/+1.0 at z = -radius/+radius (linear along longitudes) */
/* cannot use triangle fan on texturing (s coord. at top/bottom tip varies) */
 
if (qobj->DrawStyle == GLU_FILL) {
if (!qobj->TextureFlag) {
/* draw +Z end as a triangle fan */
glBegin(GL_TRIANGLE_FAN);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, nsign * radius);
for (j = 0; j <= slices; j++) {
theta = (j == slices) ? 0.0 : j * dtheta;
x = -sin(theta) * sin(drho);
y = cos(theta) * sin(drho);
z = nsign * cos(drho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
glVertex3f(x * radius, y * radius, z * radius);
}
glEnd();
}
 
ds = 1.0 / slices;
dt = 1.0 / stacks;
t = 1.0; /* because loop now runs from 0 */
if (qobj->TextureFlag) {
imin = 0;
imax = stacks;
}
else {
imin = 1;
imax = stacks - 1;
}
 
/* draw intermediate stacks as quad strips */
for (i = imin; i < imax; i++) {
rho = i * drho;
glBegin(GL_QUAD_STRIP);
s = 0.0;
for (j = 0; j <= slices; j++) {
theta = (j == slices) ? 0.0 : j * dtheta;
x = -sin(theta) * sin(rho);
y = cos(theta) * sin(rho);
z = nsign * cos(rho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
TXTR_COORD(s, t);
glVertex3f(x * radius, y * radius, z * radius);
x = -sin(theta) * sin(rho + drho);
y = cos(theta) * sin(rho + drho);
z = nsign * cos(rho + drho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
TXTR_COORD(s, t - dt);
s += ds;
glVertex3f(x * radius, y * radius, z * radius);
}
glEnd();
t -= dt;
}
 
if (!qobj->TextureFlag) {
/* draw -Z end as a triangle fan */
glBegin(GL_TRIANGLE_FAN);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(0.0, 0.0, -radius * nsign);
rho = M_PI - drho;
s = 1.0;
t = dt;
for (j = slices; j >= 0; j--) {
theta = (j == slices) ? 0.0 : j * dtheta;
x = -sin(theta) * sin(rho);
y = cos(theta) * sin(rho);
z = nsign * cos(rho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
s -= ds;
glVertex3f(x * radius, y * radius, z * radius);
}
glEnd();
}
}
else if (qobj->DrawStyle == GLU_LINE || qobj->DrawStyle == GLU_SILHOUETTE) {
/* draw stack lines */
for (i = 1; i < stacks; i++) { /* stack line at i==stacks-1 was missing here */
rho = i * drho;
glBegin(GL_LINE_LOOP);
for (j = 0; j < slices; j++) {
theta = j * dtheta;
x = cos(theta) * sin(rho);
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
glVertex3f(x * radius, y * radius, z * radius);
}
glEnd();
}
/* draw slice lines */
for (j = 0; j < slices; j++) {
theta = j * dtheta;
glBegin(GL_LINE_STRIP);
for (i = 0; i <= stacks; i++) {
rho = i * drho;
x = cos(theta) * sin(rho);
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
glVertex3f(x * radius, y * radius, z * radius);
}
glEnd();
}
}
else if (qobj->DrawStyle == GLU_POINT) {
/* top and bottom-most points */
glBegin(GL_POINTS);
if (normals)
glNormal3f(0.0, 0.0, nsign);
glVertex3d(0.0, 0.0, radius);
if (normals)
glNormal3f(0.0, 0.0, -nsign);
glVertex3d(0.0, 0.0, -radius);
 
/* loop over stacks */
for (i = 1; i < stacks - 1; i++) {
rho = i * drho;
for (j = 0; j < slices; j++) {
theta = j * dtheta;
x = cos(theta) * sin(rho);
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals)
glNormal3f(x * nsign, y * nsign, z * nsign);
glVertex3f(x * radius, y * radius, z * radius);
}
}
glEnd();
}
 
}
 
 
 
void GLAPIENTRY
gluDisk(GLUquadricObj * qobj,
GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops)
{
GLfloat da, dr;
#if 0
GLdouble a, da;
GLfloat r, dr;
GLfloat x, y;
GLfloat r1, r2, dtc;
GLint s, l;
#endif
 
/* Normal vectors */
if (qobj->Normals != GLU_NONE) {
if (qobj->Orientation == GLU_OUTSIDE) {
glNormal3f(0.0, 0.0, +1.0);
}
else {
glNormal3f(0.0, 0.0, -1.0);
}
}
 
da = 2.0 * M_PI / slices;
dr = (outerRadius - innerRadius) / (GLfloat) loops;
 
switch (qobj->DrawStyle) {
case GLU_FILL:
{
/* texture of a gluDisk is a cut out of the texture unit square
* x, y in [-outerRadius, +outerRadius]; s, t in [0, 1]
* (linear mapping)
*/
GLfloat dtc = 2.0f * outerRadius;
GLfloat sa, ca;
GLfloat r1 = innerRadius;
GLint l;
for (l = 0; l < loops; l++) {
GLfloat r2 = r1 + dr;
if (qobj->Orientation == GLU_OUTSIDE) {
GLint s;
glBegin(GL_QUAD_STRIP);
for (s = 0; s <= slices; s++) {
GLfloat a;
if (s == slices)
a = 0.0;
else
a = s * da;
sa = sin(a);
ca = cos(a);
TXTR_COORD(0.5 + sa * r2 / dtc, 0.5 + ca * r2 / dtc);
glVertex2f(r2 * sa, r2 * ca);
TXTR_COORD(0.5 + sa * r1 / dtc, 0.5 + ca * r1 / dtc);
glVertex2f(r1 * sa, r1 * ca);
}
glEnd();
}
else {
GLint s;
glBegin(GL_QUAD_STRIP);
for (s = slices; s >= 0; s--) {
GLfloat a;
if (s == slices)
a = 0.0;
else
a = s * da;
sa = sin(a);
ca = cos(a);
TXTR_COORD(0.5 - sa * r2 / dtc, 0.5 + ca * r2 / dtc);
glVertex2f(r2 * sa, r2 * ca);
TXTR_COORD(0.5 - sa * r1 / dtc, 0.5 + ca * r1 / dtc);
glVertex2f(r1 * sa, r1 * ca);
}
glEnd();
}
r1 = r2;
}
break;
}
case GLU_LINE:
{
GLint l, s;
/* draw loops */
for (l = 0; l <= loops; l++) {
GLfloat r = innerRadius + l * dr;
glBegin(GL_LINE_LOOP);
for (s = 0; s < slices; s++) {
GLfloat a = s * da;
glVertex2f(r * sin(a), r * cos(a));
}
glEnd();
}
/* draw spokes */
for (s = 0; s < slices; s++) {
GLfloat a = s * da;
GLfloat x = sin(a);
GLfloat y = cos(a);
glBegin(GL_LINE_STRIP);
for (l = 0; l <= loops; l++) {
GLfloat r = innerRadius + l * dr;
glVertex2f(r * x, r * y);
}
glEnd();
}
break;
}
case GLU_POINT:
{
GLint s;
glBegin(GL_POINTS);
for (s = 0; s < slices; s++) {
GLfloat a = s * da;
GLfloat x = sin(a);
GLfloat y = cos(a);
GLint l;
for (l = 0; l <= loops; l++) {
GLfloat r = innerRadius * l * dr;
glVertex2f(r * x, r * y);
}
}
glEnd();
break;
}
case GLU_SILHOUETTE:
{
if (innerRadius != 0.0) {
GLfloat a;
glBegin(GL_LINE_LOOP);
for (a = 0.0; a < 2.0 * M_PI; a += da) {
GLfloat x = innerRadius * sin(a);
GLfloat y = innerRadius * cos(a);
glVertex2f(x, y);
}
glEnd();
}
{
GLfloat a;
glBegin(GL_LINE_LOOP);
for (a = 0; a < 2.0 * M_PI; a += da) {
GLfloat x = outerRadius * sin(a);
GLfloat y = outerRadius * cos(a);
glVertex2f(x, y);
}
glEnd();
}
break;
}
default:
abort();
}
}
 
 
 
void GLAPIENTRY
gluPartialDisk(GLUquadricObj * qobj, GLdouble innerRadius,
GLdouble outerRadius, GLint slices, GLint loops,
GLdouble startAngle, GLdouble sweepAngle)
{
if (qobj->Normals != GLU_NONE) {
if (qobj->Orientation == GLU_OUTSIDE) {
glNormal3f(0.0, 0.0, +1.0);
}
else {
glNormal3f(0.0, 0.0, -1.0);
}
}
 
if (qobj->DrawStyle == GLU_POINT) {
GLint loop, slice;
GLdouble radius, delta_radius;
GLdouble angle, delta_angle;
delta_radius = (outerRadius - innerRadius) / (loops - 1);
delta_angle = DEG_TO_RAD((sweepAngle) / (slices - 1));
glBegin(GL_POINTS);
radius = innerRadius;
for (loop = 0; loop < loops; loop++) {
angle = DEG_TO_RAD(startAngle);
for (slice = 0; slice < slices; slice++) {
glVertex2d(radius * sin(angle), radius * cos(angle));
angle += delta_angle;
}
radius += delta_radius;
}
glEnd();
}
else if (qobj->DrawStyle == GLU_LINE) {
GLint loop, slice;
GLdouble radius, delta_radius;
GLdouble angle, delta_angle;
delta_radius = (outerRadius - innerRadius) / loops;
delta_angle = DEG_TO_RAD(sweepAngle / slices);
/* draw rings */
radius = innerRadius;
for (loop = 0; loop < loops; loop++) {
angle = DEG_TO_RAD(startAngle);
glBegin(GL_LINE_STRIP);
for (slice = 0; slice <= slices; slice++) {
glVertex2d(radius * sin(angle), radius * cos(angle));
angle += delta_angle;
}
glEnd();
radius += delta_radius;
}
/* draw spokes */
angle = DEG_TO_RAD(startAngle);
for (slice = 0; slice <= slices; slice++) {
radius = innerRadius;
glBegin(GL_LINE_STRIP);
for (loop = 0; loop < loops; loop++) {
glVertex2d(radius * sin(angle), radius * cos(angle));
radius += delta_radius;
}
glEnd();
angle += delta_angle;
}
}
else if (qobj->DrawStyle == GLU_SILHOUETTE) {
GLint slice;
GLdouble angle, delta_angle;
delta_angle = DEG_TO_RAD(sweepAngle / slices);
/* draw outer ring */
glBegin(GL_LINE_STRIP);
angle = DEG_TO_RAD(startAngle);
for (slice = 0; slice <= slices; slice++) {
glVertex2d(outerRadius * sin(angle), outerRadius * cos(angle));
angle += delta_angle;
}
glEnd();
/* draw inner ring */
if (innerRadius > 0.0) {
glBegin(GL_LINE_STRIP);
angle = DEG_TO_RAD(startAngle);
for (slice = 0; slice < slices; slice++) {
glVertex2d(innerRadius * sin(angle), innerRadius * cos(angle));
angle += delta_angle;
}
glEnd();
}
/* draw spokes */
if (sweepAngle < 360.0) {
GLdouble stopAngle = startAngle + sweepAngle;
glBegin(GL_LINES);
glVertex2d(innerRadius * SIND(startAngle),
innerRadius * COSD(startAngle));
glVertex2d(outerRadius * SIND(startAngle),
outerRadius * COSD(startAngle));
glVertex2d(innerRadius * SIND(stopAngle),
innerRadius * COSD(stopAngle));
glVertex2d(outerRadius * SIND(stopAngle),
outerRadius * COSD(stopAngle));
glEnd();
}
}
else if (qobj->DrawStyle == GLU_FILL) {
GLint loop, slice;
GLdouble radius, delta_radius;
GLdouble angle, delta_angle;
delta_radius = (outerRadius - innerRadius) / loops;
delta_angle = DEG_TO_RAD(sweepAngle / slices);
radius = innerRadius;
for (loop = 0; loop < loops; loop++) {
glBegin(GL_QUAD_STRIP);
angle = DEG_TO_RAD(startAngle);
for (slice = 0; slice <= slices; slice++) {
if (qobj->Orientation == GLU_OUTSIDE) {
glVertex2d((radius + delta_radius) * sin(angle),
(radius + delta_radius) * cos(angle));
glVertex2d(radius * sin(angle), radius * cos(angle));
}
else {
glVertex2d(radius * sin(angle), radius * cos(angle));
glVertex2d((radius + delta_radius) * sin(angle),
(radius + delta_radius) * cos(angle));
}
angle += delta_angle;
}
glEnd();
radius += delta_radius;
}
}
}
/shark/trunk/ports/mesa/src-glu/nurbs.c
0,0 → 1,629
/* $Id: nurbs.c,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
* See README2 for more info.
*/
 
 
#ifdef PC_HEADER
#include "all.h"
#else
#include <stdio.h>
#include <stdlib.h>
#include "gluP.h"
#include "nurbs.h"
#endif
 
 
void
call_user_error(GLUnurbsObj * nobj, GLenum error)
{
nobj->error = error;
if (nobj->error_callback != NULL) {
(*(nobj->error_callback)) (error);
}
else {
printf("NURBS error %d %s\n", error, (char *) gluErrorString(error));
}
}
 
 
 
GLUnurbsObj *GLAPIENTRY
gluNewNurbsRenderer(void)
{
GLUnurbsObj *n;
GLfloat tmp_viewport[4];
GLint i, j;
 
n = (GLUnurbsObj *) malloc(sizeof(GLUnurbsObj));
if (n) {
/* init */
n->culling = GL_FALSE;
n->nurbs_type = GLU_NURBS_NONE;
n->error = GLU_NO_ERROR;
n->error_callback = NULL;
n->auto_load_matrix = GL_TRUE;
n->sampling_tolerance = 50.0;
n->parametric_tolerance = 0.5;
n->u_step = n->v_step = 100;
n->sampling_method = GLU_PATH_LENGTH;
n->display_mode = GLU_FILL;
/* in case the user doesn't supply the sampling matrices */
/* set projection and modelview to identity */
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (i == j) {
n->sampling_matrices.model[i * 4 + j] = 1.0;
n->sampling_matrices.proj[i * 4 + j] = 1.0;
}
else {
n->sampling_matrices.model[i * 4 + j] = 0.0;
n->sampling_matrices.proj[i * 4 + j] = 0.0;
}
/* and set the viewport sampling matrix to current ciewport */
glGetFloatv(GL_VIEWPORT, tmp_viewport);
for (i = 0; i < 4; i++)
n->sampling_matrices.viewport[i] = tmp_viewport[i];
n->trim = NULL;
}
return n;
}
 
 
 
void GLAPIENTRY
gluDeleteNurbsRenderer(GLUnurbsObj * nobj)
{
if (nobj) {
free(nobj);
}
}
 
 
 
void GLAPIENTRY
gluLoadSamplingMatrices(GLUnurbsObj * nobj,
const GLfloat modelMatrix[16],
const GLfloat projMatrix[16], const GLint viewport[4])
{
GLint i;
 
for (i = 0; i < 16; i++) {
nobj->sampling_matrices.model[i] = modelMatrix[i];
nobj->sampling_matrices.proj[i] = projMatrix[i];
}
for (i = 0; i < 4; i++)
nobj->sampling_matrices.viewport[i] = viewport[i];
}
 
 
void GLAPIENTRY
gluNurbsProperty(GLUnurbsObj * nobj, GLenum property, GLfloat value)
{
GLenum val;
 
switch (property) {
case GLU_SAMPLING_TOLERANCE:
if (value <= 0.0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return;
}
nobj->sampling_tolerance = value;
break;
case GLU_PARAMETRIC_TOLERANCE:
if (value <= 0.0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return;
}
nobj->parametric_tolerance = value;
break;
case GLU_U_STEP:
if (value <= 0.0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return;
}
nobj->u_step = (GLint) value;
break;
case GLU_V_STEP:
if (value <= 0.0) {
call_user_error(nobj, GLU_INVALID_VALUE);
return;
}
nobj->v_step = (GLint) value;
break;
case GLU_SAMPLING_METHOD:
val = (GLenum) value;
if (val != GLU_PATH_LENGTH && val != GLU_PARAMETRIC_ERROR
&& val != GLU_DOMAIN_DISTANCE) {
call_user_error(nobj, GLU_INVALID_ENUM);
return;
}
nobj->sampling_method = val;
break;
case GLU_DISPLAY_MODE:
val = (GLenum) value;
if (val != GLU_FILL && val != GLU_OUTLINE_POLYGON
&& val != GLU_OUTLINE_PATCH) {
call_user_error(nobj, GLU_INVALID_ENUM);
return;
}
if (nobj->nurbs_type == GLU_NURBS_CURVE) {
call_user_error(nobj, GLU_NURBS_ERROR26);
return;
}
nobj->display_mode = val;
if (val == GLU_OUTLINE_PATCH)
fprintf(stderr,
"NURBS, for the moment, can display only in POLYGON mode\n");
break;
case GLU_CULLING:
val = (GLenum) value;
if (val != GL_TRUE && val != GL_FALSE) {
call_user_error(nobj, GLU_INVALID_ENUM);
return;
}
nobj->culling = (GLboolean) value;
break;
case GLU_AUTO_LOAD_MATRIX:
val = (GLenum) value;
if (val != GL_TRUE && val != GL_FALSE) {
call_user_error(nobj, GLU_INVALID_ENUM);
return;
}
nobj->auto_load_matrix = (GLboolean) value;
break;
default:
call_user_error(nobj, GLU_NURBS_ERROR26);
}
}
 
 
void GLAPIENTRY
gluGetNurbsProperty(GLUnurbsObj * nobj, GLenum property, GLfloat * value)
{
switch (property) {
case GLU_SAMPLING_TOLERANCE:
*value = nobj->sampling_tolerance;
break;
case GLU_DISPLAY_MODE:
*value = (GLfloat) (GLint) nobj->display_mode;
break;
case GLU_CULLING:
*value = nobj->culling ? 1.0 : 0.0;
break;
case GLU_AUTO_LOAD_MATRIX:
*value = nobj->auto_load_matrix ? 1.0 : 0.0;
break;
default:
call_user_error(nobj, GLU_INVALID_ENUM);
}
}
 
 
 
void GLAPIENTRY
gluBeginCurve(GLUnurbsObj * nobj)
{
if (nobj->nurbs_type == GLU_NURBS_CURVE) {
call_user_error(nobj, GLU_NURBS_ERROR6);
return;
}
nobj->nurbs_type = GLU_NURBS_CURVE;
nobj->curve.geom.type = GLU_INVALID_ENUM;
nobj->curve.color.type = GLU_INVALID_ENUM;
nobj->curve.texture.type = GLU_INVALID_ENUM;
nobj->curve.normal.type = GLU_INVALID_ENUM;
}
 
 
void GLAPIENTRY
gluEndCurve(GLUnurbsObj * nobj)
{
if (nobj->nurbs_type == GLU_NURBS_NONE) {
call_user_error(nobj, GLU_NURBS_ERROR7);
return;
}
if (nobj->curve.geom.type == GLU_INVALID_ENUM) {
call_user_error(nobj, GLU_NURBS_ERROR8);
nobj->nurbs_type = GLU_NURBS_NONE;
return;
}
glPushAttrib((GLbitfield) (GL_EVAL_BIT | GL_ENABLE_BIT));
glDisable(GL_MAP1_VERTEX_3);
glDisable(GL_MAP1_VERTEX_4);
glDisable(GL_MAP1_INDEX);
glDisable(GL_MAP1_COLOR_4);
glDisable(GL_MAP1_NORMAL);
glDisable(GL_MAP1_TEXTURE_COORD_1);
glDisable(GL_MAP1_TEXTURE_COORD_2);
glDisable(GL_MAP1_TEXTURE_COORD_3);
glDisable(GL_MAP1_TEXTURE_COORD_4);
glDisable(GL_MAP2_VERTEX_3);
glDisable(GL_MAP2_VERTEX_4);
glDisable(GL_MAP2_INDEX);
glDisable(GL_MAP2_COLOR_4);
glDisable(GL_MAP2_NORMAL);
glDisable(GL_MAP2_TEXTURE_COORD_1);
glDisable(GL_MAP2_TEXTURE_COORD_2);
glDisable(GL_MAP2_TEXTURE_COORD_3);
glDisable(GL_MAP2_TEXTURE_COORD_4);
do_nurbs_curve(nobj);
glPopAttrib();
nobj->nurbs_type = GLU_NURBS_NONE;
}
 
 
void GLAPIENTRY
gluNurbsCurve(GLUnurbsObj * nobj, GLint nknots, GLfloat * knot,
GLint stride, GLfloat * ctlarray, GLint order, GLenum type)
{
if (nobj->nurbs_type == GLU_NURBS_TRIM) {
#if 0
/* TODO: NOT IMPLEMENTED YET */
nurbs_trim *ptr1;
trim_list *ptr2;
 
if (type != GLU_MAP1_TRIM_2 && type != GLU_MAP1_TRIM_3) {
call_user_error(nobj, GLU_NURBS_ERROR14);
return;
}
for (ptr1 = nobj->trim; ptr1->next; ptr1 = ptr1->next);
if (ptr1->trim_loop) {
for (ptr2 = ptr1->trim_loop; ptr2->next; ptr2 = ptr2->next);
if ((ptr2->next = (trim_list *) malloc(sizeof(trim_list))) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return;
}
ptr2 = ptr2->next;
}
else {
if ((ptr2 = (trim_list *) malloc(sizeof(trim_list))) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return;
}
ptr1->trim_loop = ptr2;
}
ptr2->trim_type = GLU_TRIM_NURBS;
ptr2->curve.nurbs_curve.knot_count = nknots;
ptr2->curve.nurbs_curve.knot = knot;
ptr2->curve.nurbs_curve.stride = stride;
ptr2->curve.nurbs_curve.ctrlarray = ctlarray;
ptr2->curve.nurbs_curve.order = order;
ptr2->curve.nurbs_curve.dim = (type == GLU_MAP1_TRIM_2 ? 2 : 3);
ptr2->curve.nurbs_curve.type = type;
ptr2->next = NULL;
#endif
}
else {
if (type == GLU_MAP1_TRIM_2 || type == GLU_MAP1_TRIM_3) {
call_user_error(nobj, GLU_NURBS_ERROR22);
return;
}
if (nobj->nurbs_type != GLU_NURBS_CURVE) {
call_user_error(nobj, GLU_NURBS_ERROR10);
return;
}
switch (type) {
case GL_MAP1_VERTEX_3:
case GL_MAP1_VERTEX_4:
if (nobj->curve.geom.type != GLU_INVALID_ENUM) {
call_user_error(nobj, GLU_NURBS_ERROR8);
return;
}
nobj->curve.geom.type = type;
nobj->curve.geom.knot_count = nknots;
nobj->curve.geom.knot = knot;
nobj->curve.geom.stride = stride;
nobj->curve.geom.ctrlarray = ctlarray;
nobj->curve.geom.order = order;
break;
case GL_MAP1_INDEX:
case GL_MAP1_COLOR_4:
nobj->curve.color.type = type;
nobj->curve.color.knot_count = nknots;
nobj->curve.color.knot = knot;
nobj->curve.color.stride = stride;
nobj->curve.color.ctrlarray = ctlarray;
nobj->curve.color.order = order;
break;
case GL_MAP1_NORMAL:
nobj->curve.normal.type = type;
nobj->curve.normal.knot_count = nknots;
nobj->curve.normal.knot = knot;
nobj->curve.normal.stride = stride;
nobj->curve.normal.ctrlarray = ctlarray;
nobj->curve.normal.order = order;
break;
case GL_MAP1_TEXTURE_COORD_1:
case GL_MAP1_TEXTURE_COORD_2:
case GL_MAP1_TEXTURE_COORD_3:
case GL_MAP1_TEXTURE_COORD_4:
nobj->curve.texture.type = type;
nobj->curve.texture.knot_count = nknots;
nobj->curve.texture.knot = knot;
nobj->curve.texture.stride = stride;
nobj->curve.texture.ctrlarray = ctlarray;
nobj->curve.texture.order = order;
break;
default:
call_user_error(nobj, GLU_INVALID_ENUM);
}
}
}
 
 
void GLAPIENTRY
gluBeginSurface(GLUnurbsObj * nobj)
{
switch (nobj->nurbs_type) {
case GLU_NURBS_NONE:
nobj->nurbs_type = GLU_NURBS_SURFACE;
nobj->surface.geom.type = GLU_INVALID_ENUM;
nobj->surface.color.type = GLU_INVALID_ENUM;
nobj->surface.texture.type = GLU_INVALID_ENUM;
nobj->surface.normal.type = GLU_INVALID_ENUM;
break;
case GLU_NURBS_TRIM:
call_user_error(nobj, GLU_NURBS_ERROR16);
break;
case GLU_NURBS_SURFACE:
case GLU_NURBS_NO_TRIM:
case GLU_NURBS_TRIM_DONE:
call_user_error(nobj, GLU_NURBS_ERROR27);
break;
case GLU_NURBS_CURVE:
call_user_error(nobj, GLU_NURBS_ERROR6);
break;
}
}
 
 
void GLAPIENTRY
gluEndSurface(GLUnurbsObj * nobj)
{
switch (nobj->nurbs_type) {
case GLU_NURBS_NONE:
call_user_error(nobj, GLU_NURBS_ERROR13);
break;
case GLU_NURBS_TRIM:
call_user_error(nobj, GLU_NURBS_ERROR12);
break;
case GLU_NURBS_TRIM_DONE:
/* if(nobj->trim->trim_loop==NULL)
{
call_user_error(nobj,GLU_NURBS_ERROR18);
return;
}*/
/* no break - fallthrough */
case GLU_NURBS_NO_TRIM:
glPushAttrib((GLbitfield)
(GL_EVAL_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT));
glDisable(GL_MAP2_VERTEX_3);
glDisable(GL_MAP2_VERTEX_4);
glDisable(GL_MAP2_INDEX);
glDisable(GL_MAP2_COLOR_4);
glDisable(GL_MAP2_NORMAL);
glDisable(GL_MAP2_TEXTURE_COORD_1);
glDisable(GL_MAP2_TEXTURE_COORD_2);
glDisable(GL_MAP2_TEXTURE_COORD_3);
glDisable(GL_MAP2_TEXTURE_COORD_4);
/* glDisable(GL_MAP1_VERTEX_3);
glDisable(GL_MAP1_VERTEX_4);
glDisable(GL_MAP1_INDEX);
glDisable(GL_MAP1_COLOR_4);
glDisable(GL_MAP1_NORMAL);
glDisable(GL_MAP1_TEXTURE_COORD_1);
glDisable(GL_MAP1_TEXTURE_COORD_2);
glDisable(GL_MAP1_TEXTURE_COORD_3);
glDisable(GL_MAP1_TEXTURE_COORD_4);*/
do_nurbs_surface(nobj);
glPopAttrib();
break;
default:
call_user_error(nobj, GLU_NURBS_ERROR8);
}
nobj->nurbs_type = GLU_NURBS_NONE;
}
 
 
void GLAPIENTRY
gluNurbsSurface(GLUnurbsObj * nobj,
GLint sknot_count, GLfloat * sknot,
GLint tknot_count, GLfloat * tknot,
GLint s_stride, GLint t_stride,
GLfloat * ctrlarray, GLint sorder, GLint torder, GLenum type)
{
if (nobj->nurbs_type == GLU_NURBS_NO_TRIM
|| nobj->nurbs_type == GLU_NURBS_TRIM
|| nobj->nurbs_type == GLU_NURBS_TRIM_DONE) {
if (type == GL_MAP2_VERTEX_3 || type == GL_MAP2_VERTEX_4) {
call_user_error(nobj, GLU_NURBS_ERROR8);
return;
}
}
else if (nobj->nurbs_type != GLU_NURBS_SURFACE) {
call_user_error(nobj, GLU_NURBS_ERROR11);
return;
}
switch (type) {
case GL_MAP2_VERTEX_3:
case GL_MAP2_VERTEX_4:
nobj->surface.geom.sknot_count = sknot_count;
nobj->surface.geom.sknot = sknot;
nobj->surface.geom.tknot_count = tknot_count;
nobj->surface.geom.tknot = tknot;
nobj->surface.geom.s_stride = s_stride;
nobj->surface.geom.t_stride = t_stride;
nobj->surface.geom.ctrlarray = ctrlarray;
nobj->surface.geom.sorder = sorder;
nobj->surface.geom.torder = torder;
nobj->surface.geom.type = type;
nobj->nurbs_type = GLU_NURBS_NO_TRIM;
break;
case GL_MAP2_INDEX:
case GL_MAP2_COLOR_4:
nobj->surface.color.sknot_count = sknot_count;
nobj->surface.color.sknot = sknot;
nobj->surface.color.tknot_count = tknot_count;
nobj->surface.color.tknot = tknot;
nobj->surface.color.s_stride = s_stride;
nobj->surface.color.t_stride = t_stride;
nobj->surface.color.ctrlarray = ctrlarray;
nobj->surface.color.sorder = sorder;
nobj->surface.color.torder = torder;
nobj->surface.color.type = type;
break;
case GL_MAP2_NORMAL:
nobj->surface.normal.sknot_count = sknot_count;
nobj->surface.normal.sknot = sknot;
nobj->surface.normal.tknot_count = tknot_count;
nobj->surface.normal.tknot = tknot;
nobj->surface.normal.s_stride = s_stride;
nobj->surface.normal.t_stride = t_stride;
nobj->surface.normal.ctrlarray = ctrlarray;
nobj->surface.normal.sorder = sorder;
nobj->surface.normal.torder = torder;
nobj->surface.normal.type = type;
break;
case GL_MAP2_TEXTURE_COORD_1:
case GL_MAP2_TEXTURE_COORD_2:
case GL_MAP2_TEXTURE_COORD_3:
case GL_MAP2_TEXTURE_COORD_4:
nobj->surface.texture.sknot_count = sknot_count;
nobj->surface.texture.sknot = sknot;
nobj->surface.texture.tknot_count = tknot_count;
nobj->surface.texture.tknot = tknot;
nobj->surface.texture.s_stride = s_stride;
nobj->surface.texture.t_stride = t_stride;
nobj->surface.texture.ctrlarray = ctrlarray;
nobj->surface.texture.sorder = sorder;
nobj->surface.texture.torder = torder;
nobj->surface.texture.type = type;
break;
default:
call_user_error(nobj, GLU_INVALID_ENUM);
}
}
 
 
void GLAPIENTRY
gluNurbsCallback(GLUnurbsObj * nobj, GLenum which, void (GLCALLBACK * fn) ())
{
nobj->error_callback = (void (GLCALLBACKPCAST) (GLenum)) fn;
 
if (which != GLU_ERROR)
call_user_error(nobj, GLU_INVALID_ENUM);
}
 
void GLAPIENTRY
gluBeginTrim(GLUnurbsObj * nobj)
{
#if 0
nurbs_trim *ptr;
#endif
 
if (nobj->nurbs_type != GLU_NURBS_TRIM_DONE)
if (nobj->nurbs_type != GLU_NURBS_NO_TRIM) {
call_user_error(nobj, GLU_NURBS_ERROR15);
return;
}
nobj->nurbs_type = GLU_NURBS_TRIM;
fprintf(stderr, "NURBS - trimming not supported yet\n");
#if 0
if ((ptr = (nurbs_trim *) malloc(sizeof(nurbs_trim))) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return;
}
if (nobj->trim) {
nurbs_trim *tmp_ptr;
 
for (tmp_ptr = nobj->trim; tmp_ptr->next; tmp_ptr = tmp_ptr->next);
tmp_ptr->next = ptr;
}
else
nobj->trim = ptr;
ptr->trim_loop = NULL;
ptr->segments = NULL;
ptr->next = NULL;
#endif
}
 
void GLAPIENTRY
gluPwlCurve(GLUnurbsObj * nobj, GLint count, GLfloat * array, GLint stride,
GLenum type)
{
#if 0
nurbs_trim *ptr1;
trim_list *ptr2;
#endif
if (nobj->nurbs_type == GLU_NURBS_CURVE) {
call_user_error(nobj, GLU_NURBS_ERROR9);
return;
}
if (nobj->nurbs_type == GLU_NURBS_NONE) {
call_user_error(nobj, GLU_NURBS_ERROR19);
return;
}
if (type != GLU_MAP1_TRIM_2 && type != GLU_MAP1_TRIM_3) {
call_user_error(nobj, GLU_NURBS_ERROR14);
return;
}
#if 0
for (ptr1 = nobj->trim; ptr1->next; ptr1 = ptr1->next);
if (ptr1->trim_loop) {
for (ptr2 = ptr1->trim_loop; ptr2->next; ptr2 = ptr2->next);
if ((ptr2->next = (trim_list *) malloc(sizeof(trim_list))) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return;
}
ptr2 = ptr2->next;
}
else {
if ((ptr2 = (trim_list *) malloc(sizeof(trim_list))) == NULL) {
call_user_error(nobj, GLU_OUT_OF_MEMORY);
return;
}
ptr1->trim_loop = ptr2;
}
ptr2->trim_type = GLU_TRIM_PWL;
ptr2->curve.pwl_curve.pt_count = count;
ptr2->curve.pwl_curve.ctrlarray = array;
ptr2->curve.pwl_curve.stride = stride;
ptr2->curve.pwl_curve.dim = (type == GLU_MAP1_TRIM_2 ? 2 : 3);
ptr2->curve.pwl_curve.type = type;
ptr2->next = NULL;
#endif
}
 
void GLAPIENTRY
gluEndTrim(GLUnurbsObj * nobj)
{
if (nobj->nurbs_type != GLU_NURBS_TRIM) {
call_user_error(nobj, GLU_NURBS_ERROR17);
return;
}
nobj->nurbs_type = GLU_NURBS_TRIM_DONE;
}
/shark/trunk/ports/mesa/src-glu/gluP.h
0,0 → 1,143
/* $Id: gluP.h,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file allows the GLU code to be compiled either with the Mesa
* headers or with the real OpenGL headers.
*/
 
 
#ifndef GLUP_H
#define GLUP_H
 
 
#include <GL/gl.h>
#include <GL/glu.h>
#include <string.h>
#include <kernel/mem.h> //SHARK
#include <stdlib.h>
 
#if defined(_WIN32) && !defined(__WIN32__)
# define __WIN32__
#endif
 
#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN__))
# pragma warning( disable : 4068 ) /* unknown pragma */
# pragma warning( disable : 4710 ) /* function 'foo' not inlined */
# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */
# pragma warning( disable : 4127 ) /* conditional expression is constant */
# if defined(MESA_MINWARN)
# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */
# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */
# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */
# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */
# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */
# endif
# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */
# define GLAPI __declspec(dllexport)
# define WGLAPI __declspec(dllexport)
# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */
# define GLAPI __declspec(dllimport)
# define WGLAPI __declspec(dllimport)
# else /* for use with static link lib build of Win32 edition only */
# define GLAPI extern
# define WGLAPI __declspec(dllimport)
# endif /* _STATIC_MESA support */
# define GLAPIENTRY __stdcall
# define GLAPIENTRYP __stdcall *
# define GLCALLBACK __stdcall
# define GLCALLBACKP __stdcall *
# if defined(__CYGWIN__)
# define GLCALLBACKPCAST *
# else
# define GLCALLBACKPCAST __stdcall *
# endif
# define GLWINAPI __stdcall
# define GLWINAPIV __cdecl
#else
/* non-Windows compilation */
# define GLAPI extern
# define GLAPIENTRY
# define GLAPIENTRYP *
# define GLCALLBACK
# define GLCALLBACKP *
# define GLCALLBACKPCAST *
# define GLWINAPI
# define GLWINAPIV
#endif /* WIN32 / CYGWIN bracket */
 
/* compatability guard so we don't need to change client code */
 
#if defined(_WIN32) && !defined(_WINDEF_) && !defined(_GNU_H_WINDOWS32_BASE) && !defined(OPENSTEP)
# define CALLBACK GLCALLBACK
typedef int (GLAPIENTRY *PROC)();
typedef void *HGLRC;
typedef void *HDC;
typedef unsigned long COLORREF;
#endif
 
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP)
# define WGL_FONT_LINES 0
# define WGL_FONT_POLYGONS 1
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
# ifdef UNICODE
# define wglUseFontBitmaps wglUseFontBitmapsW
# define wglUseFontOutlines wglUseFontOutlinesW
# else
# define wglUseFontBitmaps wglUseFontBitmapsA
# define wglUseFontOutlines wglUseFontOutlinesA
# endif /* !UNICODE */
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT;
typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR;
#include <gl/mesa_wgl.h>
#endif
 
 
 
#ifndef GLU_TESS_ERROR9
/* If we're using the real OpenGL header files... */
# define GLU_TESS_ERROR9 100159
#endif
 
 
#define GLU_NO_ERROR GL_NO_ERROR
 
 
/* for Sun: */
#ifdef SUNOS4
#define MEMCPY( DST, SRC, BYTES) \
memcpy( (char *) (DST), (char *) (SRC), (int) (BYTES) )
#else
#define MEMCPY( DST, SRC, BYTES) \
memcpy( (void *) (DST), (void *) (SRC), (size_t) (BYTES) )
#endif
 
 
#ifndef NULL
# define NULL 0
#endif
 
 
#endif
/shark/trunk/ports/mesa/src-glu/all.h
0,0 → 1,55
/* $Id: all.h,v 1.1 2003-02-28 11:42:07 pj Exp $ */
 
/*
* Mesa 3-D graphics library
* Version: 3.3
* Copyright (C) 1995-2000 Brian Paul
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
 
 
/*
* This file includes all .h files needed for the GLU source code for
* the purpose of precompiled headers.
*
* If the preprocessor symbol PCH is defined at compile time then each
* of the .c files will #include "all.h" only, instead of a bunch of
* individual .h files.
*/
 
 
#ifndef GLU_ALL_H
#define GLU_ALL_H
 
 
#ifndef PC_HEADER
This is an error. all.h should be included only if PCH is defined.
#endif
 
 
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "GL/gl.h"
#include "GL/glu.h"
#include "gluP.h"
#include "nurbs.h"
#include "tess.h"
 
 
#endif /*GLU_ALL_H */
/shark/trunk/ports/mesa/makefile
0,0 → 1,43
 
dirs := $(filter-out CVS cvs makefile readme include, $(wildcard *))
p_all := $(addprefix prefixall_, $(dirs))
p_install := $(addprefix prefixinstall_, $(dirs))
p_clean := $(addprefix prefixclean_, $(dirs))
pcleanall := $(addprefix prefixcleanall_, $(dirs))
pdepend := $(addprefix prefixdepend_, $(dirs))
 
 
.PHONY: all install clean cleanall depend
 
install: $(p_install)
 
all: $(p_all)
 
clean: $(p_clean)
 
cleanall: $(p_cleanall)
 
depend: $(pdepend)
 
prefixinstall_%:
make -C $* install
 
prefixall_%:
make -C $* all
 
prefixclean_%:
make -C $* clean
 
prefixcleanall_%:
make -C $* cleanall
 
prefixdepend_%:
make -C $* depend
 
 
 
 
 
 
 
 
/shark/trunk/ports/mesa/readme
0,0 → 1,20
Project: S.Ha.R.K.
Mesa-5.0 Porting
 
Coordinators:
 
Giorgio Buttazzo <giorgio@sssup.it>
Paolo Gai <pj@gandalf.sssup.it>
 
Authors:
 
Giacomo Guidi <giacomo@gandalf.sssup.it>
 
This is the alpha version of the Mesa libraries (Release 5.0) porting
under SHARK.
 
KNOWN-BUGS:
 
Kernel Panik using glCallList function