mesa/es: Add OpenGL ES overlay.
authorChia-I Wu <olvaffe@gmail.com>
Mon, 21 Sep 2009 09:57:57 +0000 (17:57 +0800)
committerBrian Paul <brianp@vmware.com>
Fri, 6 Nov 2009 03:04:20 +0000 (20:04 -0700)
This is primitive support for OpenGL ES.  It uses a subset of mesa
sources to build libesXgallium.a and libesXapi.a, where X is 1 for
OpenGL ES 1.x, 2 for OpenGL ES 2.x.  The static libraries serve the same
purpose as libmesagallium.a and libglapi.a do for OpenGL.

This is based on the work of opengl-es branch.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
17 files changed:
Makefile
src/mesa/es/Makefile [new file with mode: 0644]
src/mesa/es/main/APIspec.txt [new file with mode: 0644]
src/mesa/es/main/apiutil.py [new file with mode: 0644]
src/mesa/es/main/es1_special [new file with mode: 0644]
src/mesa/es/main/es2_special [new file with mode: 0644]
src/mesa/es/main/es_cpaltex.c [new file with mode: 0644]
src/mesa/es/main/es_fbo.c [new file with mode: 0644]
src/mesa/es/main/es_generator.py [new file with mode: 0644]
src/mesa/es/main/es_query_matrix.c [new file with mode: 0644]
src/mesa/es/main/get_gen.py [new file with mode: 0644]
src/mesa/es/main/mfeatures_es1.h [new file with mode: 0644]
src/mesa/es/main/mfeatures_es2.h [new file with mode: 0644]
src/mesa/es/main/specials_es1.c [new file with mode: 0644]
src/mesa/es/main/specials_es2.c [new file with mode: 0644]
src/mesa/es/main/stubs.c [new file with mode: 0644]
src/mesa/es/sources.mak [new file with mode: 0644]

index 7f073fd..4c4aba0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -303,10 +303,25 @@ MAIN_FILES = \
        $(DIRECTORY)/progs/util/sampleMakefile                          \
        $(DIRECTORY)/windows/VC8/
 
-EGL_FILES = \
-       $(DIRECTORY)/include/EGL/*.h                                    \
+ES_FILES = \
        $(DIRECTORY)/include/GLES/*.h                                   \
        $(DIRECTORY)/include/GLES2/*.h                                  \
+       $(DIRECTORY)/src/mesa/glapi/*.xml                               \
+       $(DIRECTORY)/src/mesa/glapi/*.py                                \
+       $(DIRECTORY)/src/mesa/glapi/*.dtd                               \
+       $(DIRECTORY)/src/mesa/es/glapi/Makefile                         \
+       $(DIRECTORY)/src/mesa/es/glapi/*.xml                            \
+       $(DIRECTORY)/src/mesa/es/glapi/*.py                             \
+       $(DIRECTORY)/src/mesa/es/state_tracker/*.[ch]                   \
+       $(DIRECTORY)/src/mesa/es/main/*.[ch]                            \
+       $(DIRECTORY)/src/mesa/es/main/*.py                              \
+       $(DIRECTORY)/src/mesa/es/main/*.txt                             \
+       $(DIRECTORY)/src/mesa/es/main/es*_special                       \
+       $(DIRECTORY)/src/mesa/es/Makefile                               \
+       $(DIRECTORY)/src/mesa/es/sources.mak                            \
+
+EGL_FILES = \
+       $(DIRECTORY)/include/EGL/*.h                                    \
        $(DIRECTORY)/src/egl/Makefile                                   \
        $(DIRECTORY)/src/egl/*/Makefile                                 \
        $(DIRECTORY)/src/egl/*/*.[ch]                                   \
@@ -477,6 +492,7 @@ DEPEND_FILES = \
 
 LIB_FILES = \
        $(MAIN_FILES)           \
+       $(ES_FILES)             \
        $(EGL_FILES)            \
        $(GALLIUM_FILES)        \
        $(DRI_FILES)            \
diff --git a/src/mesa/es/Makefile b/src/mesa/es/Makefile
new file mode 100644 (file)
index 0000000..42347d0
--- /dev/null
@@ -0,0 +1,125 @@
+# src/mesa/es/Makefile
+#
+TOP := ../../..
+MESA := ..
+
+include $(TOP)/configs/current
+include sources.mak
+
+ES1_LIBS := libes1gallium.a libes1api.a
+ES2_LIBS := libes2gallium.a libes2api.a
+
+# Default rule: create ES1 and ES2 libs
+.PHONY: default
+default: subdirs depend es1 es2
+
+es1: $(ES1_LIBS)
+
+es2: $(ES2_LIBS)
+
+# force the inclusion of es's mfeatures.h
+ES1_CPPFLAGS := -include main/mfeatures_es1.h -D__GL_EXPORTS
+ES2_CPPFLAGS := -include main/mfeatures_es2.h -D__GL_EXPORTS
+
+ES1_OBJ_DIR := objs-es1
+ES2_OBJ_DIR := objs-es2
+
+# adjust output dirs
+ES1_OBJECTS := $(addprefix $(ES1_OBJ_DIR)/, $(ES1_OBJECTS))
+ES1_GALLIUM_OBJECTS := $(addprefix $(ES1_OBJ_DIR)/, $(ES1_GALLIUM_OBJECTS))
+ES1_API_OBJECTS := $(addprefix $(ES1_OBJ_DIR)/, $(ES1_API_OBJECTS))
+
+ES2_OBJECTS := $(addprefix $(ES2_OBJ_DIR)/, $(ES2_OBJECTS))
+ES2_GALLIUM_OBJECTS := $(addprefix $(ES2_OBJ_DIR)/, $(ES2_GALLIUM_OBJECTS))
+ES2_API_OBJECTS := $(addprefix $(ES2_OBJ_DIR)/, $(ES2_API_OBJECTS))
+
+# compile either ES1 or ES2 sources
+define es-compile
+       @mkdir -p $(dir $@)
+       $(CC) -c $(CFLAGS) $(ES$(1)_CPPFLAGS) $(ES$(1)_INCLUDES) -o $@ $<
+endef
+
+$(ES1_OBJ_DIR)/%.o: %.c
+       $(call es-compile,1)
+
+$(ES1_OBJ_DIR)/%.o: %.S
+       $(call es-compile,1)
+
+$(ES1_OBJ_DIR)/%.o: $(MESA)/%.c
+       $(call es-compile,1)
+
+$(ES1_OBJ_DIR)/%.o: $(MESA)/%.S
+       $(call es-compile,1)
+
+$(ES2_OBJ_DIR)/%.o: %.c
+       $(call es-compile,2)
+
+$(ES2_OBJ_DIR)/%.o: %.S
+       $(call es-compile,2)
+
+$(ES2_OBJ_DIR)/%.o: $(MESA)/%.c
+       $(call es-compile,2)
+
+$(ES2_OBJ_DIR)/%.o: $(MESA)/%.S
+       $(call es-compile,2)
+
+libes1.a: $(ES1_OBJECTS)
+       @$(TOP)/bin/mklib -o es1 -static $(ES1_OBJECTS)
+
+libes2.a: $(ES2_OBJECTS)
+       @$(TOP)/bin/mklib -o es2 -static $(ES1_OBJECTS)
+
+libes1gallium.a: $(ES1_GALLIUM_OBJECTS)
+       @$(TOP)/bin/mklib -o es1gallium -static $(ES1_GALLIUM_OBJECTS)
+
+libes2gallium.a: $(ES2_GALLIUM_OBJECTS)
+       @$(TOP)/bin/mklib -o es2gallium -static $(ES2_GALLIUM_OBJECTS)
+
+libes1api.a: $(ES1_API_OBJECTS)
+       @$(TOP)/bin/mklib -o es1api -static $(ES1_API_OBJECTS)
+
+libes2api.a: $(ES2_API_OBJECTS)
+       @$(TOP)/bin/mklib -o es2api -static $(ES2_API_OBJECTS)
+
+GENERATED_SOURCES :=           \
+       main/api_exec_es1.c     \
+       main/api_exec_es2.c     \
+       main/get_es1.c          \
+       main/get_es2.c
+
+main/api_exec_es1.c: main/APIspec.txt main/es_generator.py main/apiutil.py main/es1_special
+       $(PYTHON2) $(PYTHON_FLAGS) main/es_generator.py -S main/APIspec.txt -V GLES1.1 > $@
+
+main/api_exec_es2.c: main/APIspec.txt main/es_generator.py main/apiutil.py main/es2_special
+       $(PYTHON2) $(PYTHON_FLAGS) main/es_generator.py -S main/APIspec.txt -V GLES2.0 > $@
+
+main/get_es1.c: main/get_gen.py
+       $(PYTHON2) $(PYTHON_FLAGS) $< 1 > $@
+
+main/get_es2.c: main/get_gen.py
+       $(PYTHON2) $(PYTHON_FLAGS) $< 2 > $@
+
+.PHONY: clean
+clean:
+       -rm -f $(ES1_LIBS) $(ES2_LIBS)
+       -rm -rf $(ES1_OBJ_DIR) $(ES2_OBJ_DIR)
+       -rm -f $(GENERATED_SOURCES)
+       -rm -f depend
+       -rm -f *~
+
+subdirs:
+       make -C glapi
+       make -C $(MESA) asm_subdirs
+
+depend: $(ES1_ALL_SOURCES) $(ES2_ALL_SOURCES)
+       @echo "running $(MKDEP)"
+       @touch depend
+       @# MESA is "..", but luckily, directories are longer than 2 characters
+       @$(MKDEP) -f- -p$(ES1_OBJ_DIR)/ $(DEFINES) $(ES1_CFLAGS) \
+               $(ES1_INCLUDES) $(ES1_ALL_SOURCES) 2>/dev/null | \
+               sed -e 's,^$(ES1_OBJ_DIR)/$(MESA)/,$(ES1_OBJ_DIR)/,' > depend
+       @$(MKDEP) -f- -p$(ES2_OBJ_DIR)/ $(DEFINES) $(ES2_CFLAGS) \
+               $(ES2_INCLUDES) $(ES2_ALL_SOURCES) 2>/dev/null | \
+               sed -e 's,^$(ES2_OBJ_DIR)/$(MESA)/,$(ES2_OBJ_DIR)/,' >> depend
+
+-include depend
diff --git a/src/mesa/es/main/APIspec.txt b/src/mesa/es/main/APIspec.txt
new file mode 100644 (file)
index 0000000..86dd546
--- /dev/null
@@ -0,0 +1,2886 @@
+## Adapted from Mesa and Chromium.
+# Python scripts read this file and generate various C files.
+
+# Possible lines:
+#  name     Name of the function (without "gl" prefix).  Required.
+#
+#  return   Datatype of returned value, or void.  Required.
+#
+#  param    Zero or more of these lines may be present.  Each describes a
+#           function parameter.  Two fields follow: parameter name and the
+#           parameter type (which may be several tokens like "const GLvoid *").
+#
+#  vector   Used to indicate the size of constant arrays referenced by
+#          the given parameter.  (If the number of elements in the
+#          array is dependent on another parameter, use "dependentvector"
+#          (below) instead.) 
+#           Two fields follow:  the parameter name (previously defined by a
+#           'param' line) and a number indicating how may elements are
+#           referenced by the vector.  If the number is unknown, don't use
+#           a vector line.  Example for glGetClipPlane:
+#                vector  equation  4
+#
+#  dependentvector  Used to indicate how many elements are referenced by 
+#           pointer params, if the number depends on the value of another
+#           parameter.  It is followed by the parameter name of the vector
+#           parameter (previously defined by a 'param' line, one of the
+#           potential sizes of the array, the name of the controlling
+#           parameter, and a list (one or more) of parameter values of the
+#           controlling parameter that are associated with the given size.
+#           There will always be more than one line of this type (or otherwise
+#           you could have used the "vector" specifier above).
+#          As a convenience, each parameter value named in a
+#           "dependentvector" specifier will also be considered as a
+#           "paramprop" specifier.
+#           Example for glLightfv:
+#               dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION
+#               dependentvector params 3 pname GL_SPOT_DIRECTION
+#               dependentvector params 1 pname GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+#
+#  category May be 1.x to indicate that the function belongs to OpenGL
+#           version 1.x.  Or may be the name of an extension such as
+#           GL_ARB_multitexture.  Or may be GLES1.x to indicate
+#          that the function belongs to GLES version 1.x.  Required.
+#           May have more than one token to indicate that a function
+#          belongs to more than one category.
+#
+#  alias    Names the Mesa function _mesa_<alias> that will be called.
+#           Mostly used when the function was originally defined and
+#           introduced into Mesa as an extension function (i.e. <func>ARB);
+#           even though the function loses the extension as it is adopted
+#           into the core, the Mesa support remains named the same
+#           (for compatibility).
+#
+#  aliasprefix  May be used to change the default Mesa support functional
+#          prefix on a per-function basis.  By default, it's "_mesa_";
+#          but this allows it to be changed (e.g. to "_vbo_" for many
+#          of the core functions).
+#
+#  props    An optional list of properties for this function.  Possible
+#           properties include:
+#             get       - the function is a state-getter
+#
+# convertalias
+#
+# convertparams
+#
+# checkparam
+#
+# checkdependentparam
+
+name           Color4f
+aliasprefix    _vbo_
+return         void
+param          red             GLfloat
+param          green           GLfloat
+param          blue            GLfloat
+param          alpha           GLfloat
+category       1.0 GLES1.1
+
+name           Color4ub
+return         void
+param          red             GLubyte
+param          green           GLubyte
+param          blue            GLubyte
+param          alpha           GLubyte
+aliasprefix    _vbo_
+convertalias   Color4f
+convertparams   GLfloat red green blue alpha
+category       1.0 GLES1.1
+
+name           Color4x
+return         void
+param          red             GLfixed
+param          green           GLfixed
+param          blue            GLfixed
+param          alpha           GLfixed
+aliasprefix    _vbo_
+convertalias   Color4f
+convertparams   GLfloat red green blue alpha
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           ClipPlane
+return         void
+param          plane           GLenum
+checkparam     plane           GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+param          equation        const GLdouble *
+vector         equation        4
+category       1.0
+
+name           ClipPlanef
+return         void
+param          plane           GLenum
+checkparam     plane           GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+param          equation        const GLfloat *
+vector         equation        4
+convertalias   ClipPlane
+convertparams  GLdouble        equation
+category       GLES1.1 GLES1.1:OES_single_precision
+
+name           ClipPlanex
+return         void
+param          plane           GLenum
+checkparam     plane           GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+param          equation        const GLfixed *
+vector         equation        4
+convertalias   ClipPlane
+convertparams  GLdouble        equation
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           CullFace
+return         void
+param          mode            GLenum
+checkparam     mode            GL_FRONT GL_BACK GL_FRONT_AND_BACK
+category       1.0 GLES1.1 GLES2.0
+
+name           Fogf
+return         void
+param          pname           GLenum
+checkparam      pname GL_FOG_MODE GL_FOG_DENSITY GL_FOG_START GL_FOG_END 
+param          param           GLfloat
+checkdependentparam pname GL_FOG_MODE param GL_EXP GL_EXP2 GL_LINEAR
+category       1.0 GLES1.1
+
+name           Fogfv
+return         void
+param          pname           GLenum
+param          params          const GLfloat *
+paramvec       params          GL_LINEAR
+dependentvector        params 4 pname GL_FOG_COLOR
+dependentvector params 1 pname GL_FOG_DENSITY GL_FOG_START GL_FOG_END 
+dependentvector params 1 pname GL_FOG_MODE
+checkdependentparam pname GL_FOG_MODE params GL_EXP GL_EXP2 GL_LINEAR
+category       1.0 GLES1.1
+
+name           Fogx
+return         void
+param          pname           GLenum
+checkparam      pname GL_FOG_MODE GL_FOG_DENSITY GL_FOG_START GL_FOG_END 
+param          param           GLfixed
+checkdependentparam pname GL_FOG_MODE param GL_EXP GL_EXP2 GL_LINEAR
+convertalias   Fogf
+convertparams  GLfloat         param
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Fogxv
+return         void
+param          pname           GLenum
+param          params          const GLfixed *
+dependentvector        params 4 pname GL_FOG_COLOR
+dependentvector params 1 pname GL_FOG_DENSITY GL_FOG_START GL_FOG_END 
+dependentvector params 1 pname GL_FOG_MODE
+checkdependentparam pname GL_FOG_MODE params GL_EXP GL_EXP2 GL_LINEAR
+convertalias   Fogfv
+convertparams  GLfloat     params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           FrontFace
+return         void
+param          mode            GLenum
+checkparam     mode            GL_CW GL_CCW
+category       1.0 GLES1.1 GLES2.0
+
+name           Hint
+return         void
+param          target          GLenum
+param          mode            GLenum
+checkparam     target          GLES1.1:GL_FOG_HINT GLES1.1:GL_LINE_SMOOTH_HINT GLES1.1:GL_PERSPECTIVE_CORRECTION_HINT GLES1.1:GL_POINT_SMOOTH_HINT 
+checkparam      target          GL_GENERATE_MIPMAP_HINT
+checkparam     mode            GL_FASTEST GL_NICEST GL_DONT_CARE
+# OES_standard_derivatives
+checkparam      target          GLES2.0:GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
+category       GLES1.1 GLES2.0
+
+name           Lightf
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+checkparam     pname           GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+param          param           GLfloat
+category       1.0 GLES1.1
+
+name           Lightfv
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+param          params          const GLfloat *
+paramvec       params          0.0 1.0 1.0 0.0
+dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION
+dependentvector params 3 pname GL_SPOT_DIRECTION
+dependentvector params 1 pname GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+category       1.0 1.1 GLES1.1
+
+name           Lightx
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+checkparam     pname           GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+param          param           GLfixed
+convertalias   Lightf
+convertparams  GLfloat         param
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Lightxv
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+param          params          const GLfixed *
+dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION
+dependentvector params 3 pname GL_SPOT_DIRECTION
+dependentvector params 1 pname GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+convertalias   Lightfv
+convertparams  GLfloat         params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           LightModelf
+return         void
+param          pname           GLenum
+checkparam      pname           GL_LIGHT_MODEL_TWO_SIDE
+param          param           GLfloat
+checkdependentparam pname GL_LIGHT_MODEL_TWO_SIDE param GL_TRUE GL_FALSE
+category       1.0 GLES1.1
+
+name           LightModelfv
+return         void
+param          pname           GLenum
+param          params          const GLfloat *
+dependentvector        params 4 pname GL_LIGHT_MODEL_AMBIENT
+dependentvector        params 1 pname GL_LIGHT_MODEL_TWO_SIDE
+category       1.0 GLES1.1
+
+name           LightModelx
+return         void
+param          pname           GLenum
+checkparam     pname           GL_LIGHT_MODEL_TWO_SIDE
+param          param           GLfixed
+checkdependentparam pname GL_LIGHT_MODEL_TWO_SIDE param GL_TRUE GL_FALSE
+convertalias   LightModelf
+convertparams  GLfloat         param
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           LightModelxv
+return         void
+param          pname           GLenum
+param          params          const GLfixed *
+dependentvector        params 4 pname GL_LIGHT_MODEL_AMBIENT
+dependentvector        params 1 pname GL_LIGHT_MODEL_TWO_SIDE
+checkdependentparam pname GL_LIGHT_MODEL_TWO_SIDE params GL_TRUE GL_FALSE
+convertalias   LightModelfv
+convertparams  GLfloat         params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           LineWidth
+return         void
+param          width           GLfloat
+category       1.0 GLES1.1 GLES2.0
+
+name           LineWidthx
+return         void
+param          width           GLfixed
+convertalias   LineWidth
+convertparams  GLfloat         width
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Materialf
+aliasprefix    _vbo_
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT_AND_BACK
+param          pname           GLenum
+checkparam     pname           GL_SHININESS
+param          param           GLfloat
+category       1.0 GLES1.1
+
+name           Materialfv
+aliasprefix    _vbo_
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT_AND_BACK
+param          pname           GLenum
+param          params          const GLfloat *
+paramvec       params          0.8 0.8 0.5 0.1
+dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION
+dependentvector params 1 pname GL_SHININESS
+category       1.0 GLES1.1
+
+name           Materialx
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT_AND_BACK
+param          pname           GLenum
+checkparam     pname           GL_SHININESS
+param          param           GLfixed
+aliasprefix    _vbo_
+convertalias   Materialf
+convertparams  GLfloat         param
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Materialxv
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT_AND_BACK
+param          pname           GLenum
+param          params          const GLfixed *
+dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION
+dependentvector params 1 pname GL_SHININESS
+aliasprefix    _vbo_
+convertalias   Materialfv
+convertparams  GLfloat         params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           PointSize
+return         void
+param          size            GLfloat
+category       1.0 GLES1.1
+
+name           PointSizex
+return         void
+param          size            GLfixed
+convertalias   PointSize
+convertparams  GLfloat         size
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           PointSizePointer
+return         void
+param          type            GLenum
+checkparam     type            GL_FIXED GL_FLOAT
+param          stride          GLsizei
+param          pointer         const GLvoid *
+props          setclient
+# OES_vertex_half_float - not in glext.h
+#checkparam    type            GL_HALF_FLOAT_OES
+category       GLES1.1:OES_point_size_array
+
+name           Scissor
+return         void
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+category       1.0 GLES1.1 GLES2.0
+
+name           ShadeModel
+return         void
+param          mode            GLenum
+checkparam     mode            GL_FLAT GL_SMOOTH
+category       1.0 GLES1.1
+
+name           TexParameterf
+return         void
+param          target          GLenum
+checkparam      target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          param           GLfloat
+checkdependentparam pname GL_TEXTURE_WRAP_S param GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T param GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER param GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER param GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP param GLES1.1:GL_TRUE GLES1.1:GL_FALSE
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S param GLES1.1:GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T param GLES1.1:GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+checkparam      pname           GL_TEXTURE_MAX_ANISOTROPY_EXT
+# OES_texture_3D
+checkdependentparam pname GL_TEXTURE_WRAP_R_OES param GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+category       GLES1.1 GLES2.0
+
+name           TexParameterfv
+return         void
+param          target          GLenum 
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          params          const GLfloat *
+dependentvector        params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GLES1.1:GL_GENERATE_MIPMAP
+checkdependentparam pname GL_TEXTURE_WRAP_S params GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T params GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER params GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER params GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP params GLES1.1:GL_TRUE GLES1.1:GL_FALSE
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S params GLES1.1:GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T params GLES1.1:GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+dependentvector        params 1 pname  GL_TEXTURE_MAX_ANISOTROPY_EXT
+# OES_texture_3D
+checkdependentparam pname GL_TEXTURE_WRAP_R_OES params GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+category       GLES1.1 GLES2.0
+
+name           TexParameteri
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          param           GLint
+checkdependentparam pname GL_TEXTURE_WRAP_S param GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T param GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER param GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER param GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP param GLES1.1:GL_TRUE GLES1.1:GL_FALSE
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S param GLES1.1:GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T param GLES1.1:GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+checkparam      pname           GL_TEXTURE_MAX_ANISOTROPY_EXT
+# OES_texture_3D
+checkdependentparam pname GL_TEXTURE_WRAP_R_OES param GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+category       GLES1.1 GLES2.0
+
+name           TexParameteriv
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          params          const GLint *
+dependentvector        params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GLES1.1:GL_GENERATE_MIPMAP
+checkdependentparam pname GL_TEXTURE_WRAP_S params GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T params GL_CLAMP_TO_EDGE GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER params GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER params GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP params GLES1.1:GL_TRUE GLES1.1:GL_FALSE
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S params GLES1.1:GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T params GLES1.1:GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+dependentvector params 1 pname  GL_TEXTURE_MAX_ANISOTROPY_EXT
+# OES_texture_3D
+checkdependentparam pname GL_TEXTURE_WRAP_R_OES params GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+category       GLES1.1 GLES2.0
+
+name           TexParameterx
+return         void
+param          target          GLenum
+checkparam      target          GL_TEXTURE_2D
+param          pname           GLenum
+param          param           GLfixed
+checkdependentparam pname GL_TEXTURE_WRAP_S param GL_CLAMP_TO_EDGE GL_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T param GL_CLAMP_TO_EDGE GL_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER param GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER param GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP param GL_TRUE GL_FALSE
+convertalias   TexParameterf
+convertparams   GLfloat         param
+# OES_texture_cube_map
+checkparam      target          GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S param GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T param GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+checkparam pname GL_TEXTURE_MAX_ANISOTROPY_EXT
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+
+# Same is true for this function.
+name           TexParameterxv
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GL_TEXTURE_CUBE_MAP_OES
+param          pname           GLenum
+param          params          const GLfixed *
+vector          params          1
+dependentvector        params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GL_GENERATE_MIPMAP
+checkdependentparam pname GL_TEXTURE_WRAP_S params GL_CLAMP_TO_EDGE GL_REPEAT
+checkdependentparam pname GL_TEXTURE_WRAP_T params GL_CLAMP_TO_EDGE GL_REPEAT
+checkdependentparam pname GL_TEXTURE_MIN_FILTER params GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR
+checkdependentparam pname GL_TEXTURE_MAG_FILTER params GL_NEAREST GL_LINEAR
+checkdependentparam pname GL_GENERATE_MIPMAP params GL_TRUE GL_FALSE
+convertalias   TexParameterfv
+convertparams   GLfloat         params
+# OES_texture_cube_map
+checkparam      target          GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_mirrored_repeat
+checkdependentparam pname GL_TEXTURE_WRAP_S params GL_MIRRORED_REPEAT_OES
+checkdependentparam pname GL_TEXTURE_WRAP_T params GL_MIRRORED_REPEAT_OES
+# EXT_texture_filter_anisotropic
+dependentvector params 1 pname GL_TEXTURE_MAX_ANISOTROPY_EXT
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+# TexImage2D has *different* versions for GLES1 and GLES2, strangely,
+# with different types for "internalFormat".  There's also a few
+# tokens with different spellings.
+name           TexImage2D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D
+param          level           GLint
+param          internalFormat  GLint
+param          width           GLsizei
+param          height          GLsizei
+param          border          GLint
+param          format          GLenum
+param          type            GLenum
+param          pixels          const GLvoid *
+checkparam      internalFormat /GL_INVALID_VALUE GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+checkparam      border         /GL_INVALID_VALUE 0
+# OES_texture_cube_map
+checkparam     target          GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+## OES_packed_depth_stencil - only appears in GLES2 header files?
+#checkdependentparam format GL_DEPTH_STENCIL_OES internalFormat GL_UNSIGNED_INT_24_8_OES
+category       1.0 GLES1.1 
+
+name           TexImage2D
+return         void
+param          target          GLenum
+param          level           GLint
+# it is compiled with OpenGL header
+#param         internalFormat  GLenum
+param          internalFormat  GLint
+param          width           GLsizei
+param          height          GLsizei
+param          border          GLint
+param          format          GLenum
+param          type            GLenum
+param          pixels          const GLvoid *
+checkparam     target          GL_TEXTURE_2D GL_TEXTURE_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+checkparam      internalFormat /GL_INVALID_VALUE GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+checkparam      border         /GL_INVALID_VALUE 0
+checkdependentparam format GL_ALPHA type GL_UNSIGNED_BYTE
+checkdependentparam format GL_RGB type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_5_6_5
+checkdependentparam format GL_RGBA type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_4_4_4_4 GL_UNSIGNED_SHORT_5_5_5_1
+checkdependentparam format GL_LUMINANCE type GL_UNSIGNED_BYTE
+checkdependentparam format GL_LUMINANCE_ALPHA type GL_UNSIGNED_BYTE
+# OES_texture_float
+checkdependentparam format GL_ALPHA type GL_FLOAT
+checkdependentparam format GL_RGB type GL_FLOAT
+checkdependentparam format GL_RGBA type GL_FLOAT
+checkdependentparam format GL_LUMINANCE type GL_FLOAT
+checkdependentparam format GL_LUMINANCE_ALPHA type GL_FLOAT
+# OES_texture_half_float
+checkdependentparam format GL_ALPHA type GL_HALF_FLOAT_OES
+checkdependentparam format GL_RGB type GL_HALF_FLOAT_OES
+checkdependentparam format GL_RGBA type GL_HALF_FLOAT_OES
+checkdependentparam format GL_LUMINANCE type GL_HALF_FLOAT_OES
+checkdependentparam format GL_LUMINANCE_ALPHA type GL_HALF_FLOAT_OES
+# EXT_texture_type_2_10_10_10_REV
+checkdependentparam format GL_RGBA type GL_UNSIGNED_INT_2_10_10_10_REV_EXT
+# OES_depth_texture
+checkdependentparam format GL_DEPTH_COMPONENT type GL_UNSIGNED_SHORT GL_UNSIGNED_INT
+checkparam     internalFormat  GL_DEPTH_COMPONENT
+category       GLES2.0
+
+name           TexEnvf
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          param           GLfloat
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE param GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_RGB_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+# OES_texture_env_crossbar
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+# OES_point_sprite
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES param GL_TRUE GL_FALSE
+category       1.0 GLES1.1
+
+name           TexEnvfv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          const GLfloat *
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES params GL_TRUE GL_FALSE
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE params GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_RGB_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_COORD_REPLACE_OES GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+dependentvector params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+# OES_texture_env_crossbar
+dependentvector params 1 pname GL_SRC0_RGB GL_SRC1_RGB GL_SRC2_RGB GL_SRC0_ALPHA GL_SRC1_ALPHA GL_SRC2_ALPHA
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.0 GLES1.1
+
+name           TexEnvi
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          param           GLint
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES param GL_TRUE GL_FALSE
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE param GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_RGB_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+# OES_texture_env_crossbar
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.0 GLES1.1
+
+name           TexEnviv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          const GLint *
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES params GL_TRUE GL_FALSE
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE params GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_RGB_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_COORD_REPLACE_OES GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+dependentvector params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+# OES_texture_env_crossbar
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.0 GLES1.1
+
+name           TexEnvx
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          param           GLfixed
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES param GL_TRUE GL_FALSE
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE param GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA param GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_RGB_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE param /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB param GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA param GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+convertalias   TexEnvf
+convertparams  GLfloat     param
+# OES_texture_env_crossbar
+checkdependentparam pname GL_SRC0_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA param GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.0 GLES1.1 GLES1.1:OES_fixed_point
+
+name           TexEnvxv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          const GLfixed *
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam pname GL_COORD_REPLACE_OES params GL_TRUE GL_FALSE
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+checkdependentparam pname GL_TEXTURE_ENV_MODE params GL_REPLACE GL_MODULATE GL_DECAL GL_BLEND GL_ADD GL_COMBINE
+checkdependentparam pname GL_COMBINE_RGB params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT GL_DOT3_RGB GL_DOT3_RGBA
+checkdependentparam pname GL_COMBINE_ALPHA params GL_REPLACE GL_MODULATE GL_ADD GL_ADD_SIGNED GL_INTERPOLATE GL_SUBTRACT
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND0_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND1_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_RGB params GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE GL_CONSTANT GL_PRIMARY_COLOR GL_PREVIOUS
+checkdependentparam pname GL_OPERAND2_ALPHA params GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+checkdependentparam pname GL_RGB_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+checkdependentparam pname GL_ALPHA_SCALE params /GL_INVALID_VALUE 1.0 2.0 4.0
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_COORD_REPLACE_OES GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+dependentvector params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+convertalias   TexEnvfv
+convertparams  GLfloat     params
+# OES_texture_env_crossbar
+dependentvector params 1 pname GL_SRC0_RGB GL_SRC1_RGB GL_SRC2_RGB GL_SRC0_ALPHA GL_SRC1_ALPHA GL_SRC2_ALPHA
+checkdependentparam pname GL_SRC0_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_RGB params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC0_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC1_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+checkdependentparam pname GL_SRC2_ALPHA params GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           TexGenx
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          param           GLfixed
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES param GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+convertalias    TexGenf
+convertparams   GLfloat         param
+category       GLES1.1:OES_texture_cube_map
+
+name           TexGenxv
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          params          const GLfixed *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES params GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+convertalias    TexGenfv
+convertparams   GLfloat         params
+category       GLES1.1:OES_texture_cube_map
+
+name           TexGenf
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+checkparam      pname           GL_TEXTURE_GEN_MODE_OES
+param          param           GLfloat
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES param GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           TexGenfv
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          params          const GLfloat *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES params GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           TexGeni
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+checkparam      pname           GL_TEXTURE_GEN_MODE_OES
+param          param           GLint
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES param GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           TexGeniv
+return         void
+param          coord           GLenum
+checkparam      coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+checkparam      pname           GL_TEXTURE_GEN_MODE_OES
+param          params          const GLint *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+checkdependentparam pname GL_TEXTURE_GEN_MODE_OES params GL_NORMAL_MAP_OES GL_REFLECTION_MAP_OES
+convertalias    TexGenfv
+convertparams   GLfloat         params
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           Clear
+return         void
+param          mask            GLbitfield
+checkparam      mask   /GL_INVALID_VALUE 0 (GL_COLOR_BUFFER_BIT) (GL_DEPTH_BUFFER_BIT) (GL_STENCIL_BUFFER_BIT) (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) (GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT) (GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT) (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)
+category       1.0 GLES1.1 GLES2.0
+
+name           ClearColor
+return         void
+param          red             GLclampf
+param          green           GLclampf
+param          blue            GLclampf
+param          alpha           GLclampf
+category       1.0 GLES1.1 GLES2.0
+
+name           ClearColorx
+return         void
+param          red             GLclampx
+param          green           GLclampx
+param          blue            GLclampx
+param          alpha           GLclampx
+convertalias   ClearColor
+convertparams   GLclampf        red green blue alpha
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           ClearStencil
+return         void
+param          s               GLint
+category       1.0 GLES1.1 GLES2.0
+
+name           ClearDepthf
+return         void
+param          depth           GLclampf
+convertalias   ClearDepth
+convertparams  GLclampd        depth
+category       GLES1.1 GLES1.1:OES_single_precision GLES2.0
+
+name           ClearDepthx
+return         void
+param          depth           GLclampx
+convertalias   ClearDepth
+convertparams  GLclampd        depth
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           StencilMask
+return         void
+param          mask            GLuint
+category       1.0 GLES1.1 GLES2.0
+
+name           StencilMaskSeparate
+return         void
+param           face            GLenum
+param          mask            GLuint
+checkparam      face            GL_FRONT GL_BACK GL_FRONT_AND_BACK
+category       GLES2.0
+
+name           ColorMask
+return         void
+param          red             GLboolean
+param          green           GLboolean
+param          blue            GLboolean
+param          alpha           GLboolean
+category       1.0 GLES1.1 GLES2.0
+
+name           DepthMask
+return         void
+param          flag            GLboolean
+category       1.0 GLES1.1 GLES2.0
+
+# Two versions, as GLES2 has a vastly different set of enable/disable capabilities
+name           Disable
+return         void
+param          cap             GLenum
+checkparam      cap             GL_VERTEX_ARRAY GL_NORMAL_ARRAY GL_COLOR_ARRAY GL_TEXTURE_COORD_ARRAY GL_NORMALIZE GL_RESCALE_NORMAL GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5 GL_FOG GL_LIGHTING GL_COLOR_MATERIAL GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7 GL_POINT_SMOOTH GL_LINE_SMOOTH GL_CULL_FACE GL_POLYGON_OFFSET_FILL GL_MULTISAMPLE GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_ALPHA_TO_ONE GL_SAMPLE_COVERAGE GL_TEXTURE_2D GL_SCISSOR_TEST GL_ALPHA_TEST GL_STENCIL_TEST GL_DEPTH_TEST GL_BLEND GL_DITHER GL_COLOR_LOGIC_OP
+# OES_matrix_palette
+checkparam      cap             GL_MATRIX_INDEX_ARRAY_OES GL_WEIGHT_ARRAY_OES
+# OES_point_size_array
+checkparam      cap             GL_POINT_SIZE_ARRAY_OES
+# OES_point_sprite
+checkparam      cap             GL_POINT_SPRITE_OES
+# OES_texture_cube_map
+checkparam      cap             GL_TEXTURE_CUBE_MAP_OES GL_TEXTURE_GEN_STR_OES
+category       GLES1.1
+
+name           Disable
+return         void
+param          cap             GLenum
+checkparam      cap             GL_CULL_FACE GL_SCISSOR_TEST GL_POLYGON_OFFSET_FILL GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_COVERAGE GL_STENCIL_TEST GL_DEPTH_TEST GL_DITHER GL_BLEND
+category       GLES2.0
+
+# Two versions, as GLES2 has a vastly different set of enable/disable capabilities
+name           Enable
+return         void
+param          cap             GLenum
+checkparam      cap             GL_VERTEX_ARRAY GL_NORMAL_ARRAY GL_COLOR_ARRAY GL_TEXTURE_COORD_ARRAY GL_NORMALIZE GL_RESCALE_NORMAL GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5 GL_FOG GL_LIGHTING GL_COLOR_MATERIAL GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7 GL_POINT_SMOOTH GL_LINE_SMOOTH GL_CULL_FACE GL_POLYGON_OFFSET_FILL GL_MULTISAMPLE GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_ALPHA_TO_ONE GL_SAMPLE_COVERAGE GL_TEXTURE_2D GL_SCISSOR_TEST GL_ALPHA_TEST GL_STENCIL_TEST GL_DEPTH_TEST GL_BLEND GL_DITHER GL_COLOR_LOGIC_OP
+# OES_matrix_palette
+checkparam      cap             GL_MATRIX_INDEX_ARRAY_OES GL_WEIGHT_ARRAY_OES
+# OES_point_size_array
+checkparam      cap             GL_POINT_SIZE_ARRAY_OES
+# OES_point_sprite
+checkparam      cap             GL_POINT_SPRITE_OES
+# OES_texture_cube_map
+checkparam      cap             GL_TEXTURE_CUBE_MAP_OES GL_TEXTURE_GEN_STR_OES
+category       GLES1.1
+
+name           Enable
+return         void
+param          cap             GLenum
+checkparam      cap             GL_CULL_FACE GL_SCISSOR_TEST GL_POLYGON_OFFSET_FILL GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_COVERAGE GL_STENCIL_TEST GL_DEPTH_TEST GL_DITHER GL_BLEND
+category       GLES2.0
+
+name           Finish
+return         void
+category       1.0 GLES1.1 GLES2.0
+
+name           Flush
+return         void
+category       1.0 GLES1.1 GLES2.0
+
+name           AlphaFunc
+return         void
+param          func            GLenum
+checkparam     func            GL_NEVER GL_LESS GL_EQUAL GL_LEQUAL GL_GREATER GL_NOTEQUAL GL_GEQUAL GL_ALWAYS
+param          ref             GLclampf
+category       1.0 GLES1.1
+
+name           AlphaFuncx
+return         void
+param          func            GLenum
+checkparam     func            GL_NEVER GL_LESS GL_EQUAL GL_LEQUAL GL_GREATER GL_NOTEQUAL GL_GEQUAL GL_ALWAYS
+param          ref             GLclampx
+convertalias   AlphaFunc
+convertparams  GLclampf        ref
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           BlendFunc
+return         void
+param          sfactor         GLenum
+checkparam     sfactor         GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_COLOR GL_DST_ALPHA GL_ONE_MINUS_DST_COLOR GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE
+checkparam      sfactor         GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+param          dfactor         GLenum
+checkparam     dfactor         GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_COLOR GL_DST_ALPHA GL_ONE_MINUS_DST_COLOR GL_ONE_MINUS_DST_ALPHA
+checkparam      dfactor         GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+category       1.0 GLES1.1 GLES2.0
+
+name           LogicOp
+return         void
+param          opcode          GLenum
+checkparam     opcode          GL_CLEAR GL_SET GL_COPY GL_COPY_INVERTED GL_NOOP GL_INVERT GL_AND GL_NAND GL_OR GL_NOR GL_XOR GL_EQUIV GL_AND_REVERSE GL_AND_INVERTED GL_OR_REVERSE GL_OR_INVERTED
+category       1.0 GLES1.1
+
+name           StencilFunc
+return         void
+param          func            GLenum
+param          ref             GLint
+param          mask            GLuint
+checkparam     func            GL_NEVER GL_LESS GL_LEQUAL GL_GREATER GL_GEQUAL GL_EQUAL GL_NOTEQUAL GL_ALWAYS
+category       1.0 GLES1.1 GLES2.0
+
+name            StencilFuncSeparate
+return          void
+param           face            GLenum
+param           func            GLenum
+param           ref             GLint
+param           mask            GLuint
+checkparam      face            GL_FRONT GL_BACK GL_FRONT_AND_BACK
+checkparam     func            GL_NEVER GL_LESS GL_LEQUAL GL_GREATER GL_GEQUAL GL_EQUAL GL_NOTEQUAL GL_ALWAYS
+category        GLES2.0
+
+name           StencilOp
+return         void
+param          fail            GLenum
+param          zfail           GLenum
+param          zpass           GLenum
+checkparam     fail            GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GLES2.0:GL_INCR_WRAP GLES2.0:GL_DECR_WRAP
+checkparam     zfail           GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GLES2.0:GL_INCR_WRAP GLES2.0:GL_DECR_WRAP
+checkparam     zpass           GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GLES2.0:GL_INCR_WRAP GLES2.0:GL_DECR_WRAP
+# OES_stencil_wrap
+checkparam      fail            GLES1.1:GL_INCR_WRAP_OES GLES1.1:GL_DECR_WRAP_OES
+checkparam      zfail           GLES1.1:GL_INCR_WRAP_OES GLES1.1:GL_DECR_WRAP_OES
+checkparam      zpass           GLES1.1:GL_INCR_WRAP_OES GLES1.1:GL_DECR_WRAP_OES
+category       GLES1.1 GLES2.0
+
+name           StencilOpSeparate
+return         void
+param           face            GLenum
+param          fail            GLenum
+param          zfail           GLenum
+param          zpass           GLenum
+checkparam      face            GL_FRONT GL_BACK GL_FRONT_AND_BACK
+checkparam     fail            GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GL_INCR_WRAP GL_DECR_WRAP
+checkparam     zfail           GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GL_INCR_WRAP GL_DECR_WRAP
+checkparam     zpass           GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GL_INCR_WRAP GL_DECR_WRAP
+category       GLES2.0
+
+name           DepthFunc
+return         void
+param          func            GLenum
+checkparam     func            GL_NEVER GL_LESS GL_EQUAL GL_LEQUAL GL_GREATER GL_NOTEQUAL GL_GEQUAL GL_ALWAYS
+category       1.0 GLES1.1 GLES2.0
+
+name           PixelStorei
+return         void
+param          pname           GLenum
+checkparam     pname           GL_PACK_ALIGNMENT GL_UNPACK_ALIGNMENT
+param          param           GLint
+checkparam      param /GL_INVALID_VALUE 1 2 4 8
+category       1.0 GLES1.1 GLES2.0
+
+name           ReadPixels
+return         void
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+param          format          GLenum
+param          type            GLenum
+param          pixels          GLvoid *
+# Technically, only two combinations are actually allowed:
+# GL_RGBA/GL_UNSIGNED_BYTE, and some implementation-specific internal 
+# preferred combination.  I don't know what that is, so I'm allowing
+# any valid combination for now; the underlying support should fail
+# when necessary.
+checkdependentparam format GL_RGBA type GL_UNSIGNED_BYTE
+checkdependentparam format GL_RGBA type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_4_4_4_4  GL_UNSIGNED_SHORT_5_5_5_1
+checkdependentparam format GL_RGB type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_5_6_5
+checkdependentparam format GL_LUMINANCE_ALPHA format GL_UNSIGNED_BYTE
+checkdependentparam format GL_LUMINANCE format GL_UNSIGNED_BYTE
+checkdependentparam format GL_ALPHA format GL_UNSIGNED_BYTE
+props          get 
+category       1.0 GLES1.1 GLES2.0
+
+# Note: glGetBooleanv param checking done inside Mesa
+name           GetBooleanv
+return         void
+param          pname           GLenum
+param          params          GLboolean *
+props          get
+category       GLES1.1 GLES2.0
+
+name           GetClipPlanef
+return         void
+param          plane           GLenum
+checkparam     plane           GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+param          equation        GLfloat *
+paramvec       equation        0.0 0.0 0.0 0.0
+vector         equation        4
+convertalias   GetClipPlane
+convertparams  GLdouble        equation
+props          get
+category       GLES1.1 GLES1.1:OES_single_precision
+
+name           GetClipPlanex
+return         void
+param          plane           GLenum
+checkparam     plane           GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+param          equation        GLfixed *
+paramvec       equation        0.0 0.0 0.0 0.0
+vector         equation        4
+convertalias   GetClipPlane
+convertparams  GLdouble        equation
+props          get
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           GetError
+return         GLenum
+props          get
+category       1.0 GLES1.1 GLES2.0
+
+# Note: glGetFloatv param checking done inside Mesa
+name           GetFloatv
+return         void
+param          pname           GLenum
+param          params          GLfloat *
+props          get
+category       GLES1.1 GLES2.0
+
+name           GetFixedv
+return         void
+param          pname           GLenum
+param          params          GLfixed *
+convertalias   GetFloatv
+convertparams  GLfloat         params
+props          get
+dependentvector params 1 pname GL_CLIENT_ACTIVE_TEXTURE GL_VERTEX_ARRAY GL_VERTEX_ARRAY_SIZE GL_VERTEX_ARRAY_TYPE GL_VERTEX_ARRAY_STRIDE GL_NORMAL_ARRAY GL_NORMAL_ARRAY_TYPE GL_NORMAL_ARRAY_STRIDE GL_COLOR_ARRAY GL_COLOR_ARRAY_SIZE GL_COLOR_ARRAY_TYPE 
+dependentvector params 1 pname GL_TEXTURE_COORD_ARRAY GL_TEXTURE_COORD_ARRAY_SIZE GL_TEXTURE_COORD_ARRAY_TYPE GL_TEXTURE_COORD_ARRAY_STRIDE GL_POINT_SIZE_ARRAY_OES GL_POINT_SIZE_ARRAY_STRIDE_OES GL_ARRAY_BUFFER_BINDING GL_VERTEX_ARRAY_BUFFER_BINDING GL_NORMAL_ARRAY_BUFFER_BINDING GL_COLOR_ARRAY_BUFFER_BINDING GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES GL_ELEMENT_ARRAY_BUFFER_BINDING
+dependentvector params 1 pname GL_MODELVIEW_STACK_DEPTH GL_PROJECTION_STACK_DEPTH GL_TEXTURE_STACK_DEPTH GL_MATRIX_MODE GL_NORMALIZE GL_RESCALE_NORMAL GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5
+dependentvector params 1 pname GL_FOG_DENSITY GL_FOG_START GL_FOG_END GL_FOG_MODE GL_FOG GL_SHADE_MODEL
+dependentvector params 1 pname GL_LIGHTING GL_COLOR_MATERIAL GL_LIGHT_MODEL_TWO_SIDE
+dependentvector params 1 pname GL_POINT_SIZE GL_POINT_SMOOTH GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE GL_POINT_SPRITE_OES GL_LINE_WIDTH  GL_LINE_SMOOTH GL_CULL_FACE GL_CULL_FACE_MODE GL_FRONT_FACE GL_POLYGON_OFFSET_FACTOR GL_POLYGON_OFFSET_UNITS GL_POLYGON_OFFSET_FILL 
+dependentvector params 1 pname GL_MULTISAMPLE GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_ALPHA_TO_ONE GL_SAMPLE_COVERAGE GL_SAMPLE_COVERAGE_VALUE
+dependentvector params 1 pname GL_TEXTURE_2D GL_TEXTURE_BINDING_2D 
+dependentvector params 1 pname GL_ACTIVE_TEXTURE
+dependentvector params 1 pname GL_SCISSOR_TEST GL_ALPHA_TEST_FUNC GL_ALPHA_TEST_REF GL_STENCIL_TEST GL_STENCIL_FUNC GL_STENCIL_VALUE_MASK GL_STENCIL_REF GL_STENCIL_FAIL GL_STENCIL_PASS_DEPTH_FAIL GL_STENCIL_PASS_DEPTH_PASS GL_DEPTH_TEST GL_DEPTH_FUNC GL_BLEND GL_BLEND_SRC GL_BLEND_DST GL_DITHER GL_COLOR_LOGIC_OP GL_LOGIC_OP_MODE
+dependentvector params 1 pname GL_DEPTH_WRITEMASK GL_STENCIL_WRITEMASK GL_DEPTH_CLEAR_VALUE GL_STENCIL_CLEAR_VALUE
+dependentvector params 1 pname GL_UNPACK_ALIGNMENT GL_PACK_ALIGNMENT
+dependentvector params 1 pname GL_PERSPECTIVE_CORRECTION_HINT GL_POINT_SMOOTH_HINT GL_LINE_SMOOTH_HINT GL_FOG_HINT GL_GENERATE_MIPMAP_HINT
+dependentvector params 1 pname GL_MAX_LIGHTS GL_MAX_CLIP_PLANES GL_MAX_MODELVIEW_STACK_DEPTH GL_MAX_PROJECTION_STACK_DEPTH GL_MAX_TEXTURE_STACK_DEPTH GL_SUBPIXEL_BITS GL_MAX_TEXTURE_SIZE GL_MAX_TEXTURE_UNITS GL_SAMPLE_BUFFERS GL_SAMPLES GL_NUM_COMPRESSED_TEXTURE_FORMATS GL_RED_BITS GL_GREEN_BITS GL_BLUE_BITS GL_ALPHA_BITS GL_DEPTH_BITS GL_STENCIL_BITS
+dependentvector params 2 pname GL_MAX_VIEWPORT_DIMS GL_ALIASED_POINT_SIZE_RANGE GL_SMOOTH_POINT_SIZE_RANGE GL_ALIASED_LINE_WIDTH_RANGE GL_SMOOTH_LINE_WIDTH_RANGE
+dependentvector params 2 pname GL_DEPTH_RANGE
+dependentvector params 3 pname GL_CURRENT_NORMAL
+dependentvector params 3 pname GL_POINT_DISTANCE_ATTENUATION
+dependentvector params 4 pname GL_CURRENT_COLOR GL_CURRENT_TEXTURE_COORDS
+dependentvector params 4 pname GL_SCISSOR_BOX
+dependentvector params 4 pname GL_COLOR_WRITEMASK GL_COLOR_CLEAR_VALUE
+dependentvector params 4 pname GL_LIGHT_MODEL_AMBIENT
+dependentvector params 4 pname GL_VIEWPORT
+dependentvector params 4 pname GL_FOG_COLOR
+dependentvector params 16 pname GL_MODELVIEW_MATRIX GL_PROJECTION_MATRIX GL_TEXTURE_MATRIX 
+dependentvector params _get_size(GL_NUM_COMPRESSED_TEXTURE_FORMATS) pname GL_COMPRESSED_TEXTURE_FORMATS 
+# OES_blend_subtract
+dependentvector params 1 pname GL_BLEND_SRC_RGB_OES GL_BLEND_DST_RGB_OES GL_BLEND_SRC_ALPHA_OES GL_BLEND_DST_ALPHA_OES
+# OES_blend_equation_separate
+dependentvector params 1 pname GL_BLEND_EQUATION_RGB_OES GL_BLEND_EQUATION_ALPHA_OES
+# OES_framebuffer_object
+dependentvector params 1 pname GL_FRAMEBUFFER_BINDING_OES GL_RENDERBUFFER_BINDING_OES GL_MAX_RENDERBUFFER_SIZE_OES
+# OES_matrix_get
+dependentvector params 16 pname GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES
+# OES_matrix_palette
+dependentvector params 1 pname GL_MAX_PALETTE_MATRICES_OES GL_MAX_VERTEX_UNITS_OES GL_CURRENT_PALETTE_MATRIX_OES
+dependentvector params 1 pname GL_MATRIX_INDEX_ARRAY_SIZE_OES GL_MATRIX_INDEX_ARRAY_TYPE_OES GL_MATRIX_INDEX_ARRAY_STRIDE_OES GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES GL_WEIGHT_ARRAY_SIZE_OES GL_WEIGHT_ARRAY_TYPE_OES GL_WEIGHT_ARRAY_STRIDE_OES GL_WEIGHT_ARRAY_BUFFER_BINDING_OES
+# OES_point_size_array
+dependentvector params 1 pname GL_POINT_SIZE_ARRAY_TYPE_OES GL_POINT_SIZE_ARRAY_STRIDE_OES GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES
+# OES_read_format
+dependentvector params 1 pname GL_IMPLEMENTATION_COLOR_READ_TYPE_OES GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES
+# OES_texture_cube_map
+dependentvector params 1 pname GL_TEXTURE_CUBE_MAP_OES GL_TEXTURE_BINDING_CUBE_MAP_OES GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES
+# EXT_texture_filter_anisotropic
+dependentvector params 1 pname GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# These values return booleans or GLenums, and should not have their
+# value converted when used with glGetFixed()
+dependentnovalueconvert params pname GL_VERTEX_ARRAY GL_VERTEX_ARRAY_TYPE GL_NORMAL_ARRAY GL_NORMAL_ARRAY_TYPE GL_COLOR_ARRAY GL_COLOR_ARRAY_TYPE GL_TEXTURE_COORD_ARRAY GL_TEXTURE_COORD_ARRAY_TYPE GL_POINT_SIZE_ARRAY_OES GL_MATRIX_MODE GL_NORMALIZE GL_RESCALE_NORMAL GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5 GL_FOG_MODE GL_FOG GL_SHADE_MODEL GL_LIGHTING GL_COLOR_MATERIAL GL_LIGHT_MODEL_TWO_SIDE GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7 GL_POINT_SMOOTH GL_POINT_SPRITE_OES GL_LINE_SMOOTH GL_CULL_FACE GL_CULL_FACE_MODE GL_FRONT_FACE GL_POLYGON_OFFSET_FILL GL_MULTISAMPLE GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_ALPHA_TO_ONE GL_SAMPLE_COVERAGE GL_TEXTURE_2D GL_ACTIVE_TEXTURE GL_SCISSOR_TEST GL_ALPHA_TEST GL_ALPHA_TEST_FUNC GL_STENCIL_TEST GL_STENCIL_FUNC GL_STENCIL_FAIL GL_STENCIL_PASS_DEPTH_FAIL GL_STENCIL_PASS_DEPTH_PASS GL_DEPTH_TEST GL_DEPTH_FUNC GL_BLEND GL_BLEND_SRC GL_BLEND_DST GL_DITHER GL_COLOR_LOGIC_OP GL_LOGIC_OP_MODE GL_DEPTH_WRITEMASK GL_PERSPECTIVE_CORRECTION_HINT GL_POINT_SMOOTH_HINT GL_LINE_SMOOTH_HINT GL_FOG_HINT GL_GENERATE_MIPMAP_HINT GL_COMPRESSED_TEXTURE_FORMATS GL_IMPLEMENTATION_COLOR_READ_TYPE_OES GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES GL_BLEND_SRC_RGB_OES GL_BLEND_DST_RGB_OES GL_BLEND_SRC_ALPHA_OES GL_BLEND_DST_ALPHA_OES GL_BLEND_EQUATION_RGB_OES GL_BLEND_EQUATION_ALPHA_OES GL_MATRIX_INDEX_ARRAY_TYPE_OES GL_WEIGHT_ARRAY_TYPE_OES GL_POINT_SIZE_ARRAY_TYPE_OES GL_TEXTURE_CUBE_MAP_OES 
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+# Note: glGetIntegerv param checking done inside Mesa
+name           GetIntegerv
+return         void
+param          pname           GLenum
+param          params          GLint *
+props          get
+category       GLES1.1 GLES2.0
+
+
+# This does *not* specify dependent vectors because everything is just
+# passed down to Mesa - no copy or conversion is done.
+name           GetLightfv
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+checkparam     pname           GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION GL_SPOT_DIRECTION GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_LINEAR_ATTENUATION GL_QUADRATIC_ATTENUATION
+param          params          GLfloat *
+props          get
+category       1.0 GLES1.1
+
+name           GetLightxv
+return         void
+param          light           GLenum
+checkparam     light           GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7
+param          pname           GLenum
+param          params          GLfixed *
+dependentvector        params 4 pname GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION
+dependentvector params 3 pname GL_SPOT_DIRECTION 
+dependentvector params 1 pname GL_SPOT_EXPONENT GL_SPOT_CUTOFF GL_CONSTANT_ATTENUATION GL_QUADRATIC_ATTENUATION 
+convertalias   GetLightfv
+convertparams  GLfloat         params
+props          get
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           GetMaterialfv
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT GL_BACK
+param          pname           GLenum
+checkparam     pname           GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION GL_SHININESS
+param          params          GLfloat *
+props          get
+category       1.0 GLES1.1
+
+name           GetMaterialiv
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT GL_BACK
+param          pname           GLenum
+checkparam     pname           GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION GL_SHININESS
+param          params          GLint *
+category       1.0
+props          get
+
+name           GetMaterialxv
+return         void
+param          face            GLenum
+checkparam     face            GL_FRONT GL_BACK
+param          pname           GLenum
+param          params          GLfixed *
+props          get
+dependentvector params 1 pname GL_SHININESS 
+dependentvector params 4 pname GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION
+convertalias   GetMaterialfv
+convertparams  GLfloat         params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           GetString
+return         const GLubyte *
+param          name            GLenum
+checkparam     name            GL_VENDOR GL_RENDERER GL_VERSION GL_EXTENSIONS
+props          get
+category       1.0 GLES1.1 GLES2.0
+
+name           GetTexEnvfv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          GLfloat *
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector        params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+dependentvector        params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_SRC1_RGB GL_SRC2_RGB GL_SRC0_ALPHA GL_SRC1_ALPHA GL_SRC2_ALPHA GL_OPERAND0_RGB GL_OPERAND1_RGB GL_OPERAND2_RGB GL_OPERAND0_ALPHA GL_OPERAND1_ALPHA GL_OPERAND2_ALPHA GL_COORD_REPLACE_OES
+dependentnovalueconvert params pname GL_COORD_REPLACE_OES GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+props          get
+category       1.0 GLES1.1
+
+name           GetTexEnviv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          GLint *
+props          get
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+category       1.0 GLES1.1
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector        params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+dependentvector        params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_SRC1_RGB GL_SRC2_RGB GL_SRC0_ALPHA GL_SRC1_ALPHA GL_SRC2_ALPHA GL_OPERAND0_RGB GL_OPERAND1_RGB GL_OPERAND2_RGB GL_OPERAND0_ALPHA GL_OPERAND1_ALPHA GL_OPERAND2_ALPHA GL_COORD_REPLACE_OES
+dependentnovalueconvert params pname GL_COORD_REPLACE_OES GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+
+name           GetTexEnvxv
+return         void
+param          target          GLenum
+param          pname           GLenum
+param          params          GLfixed *
+checkdependentparam target GL_POINT_SPRITE_OES pname GL_COORD_REPLACE_OES
+checkdependentparam target GL_TEXTURE_ENV pname GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR GL_COMBINE_RGB GL_COMBINE_ALPHA GL_RGB_SCALE GL_ALPHA_SCALE GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+dependentvector        params 4 pname GL_TEXTURE_ENV_COLOR
+dependentvector        params 1 pname GL_RGB_SCALE GL_ALPHA_SCALE
+dependentvector        params 1 pname GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_SRC1_RGB GL_SRC2_RGB GL_SRC0_ALPHA GL_SRC1_ALPHA GL_SRC2_ALPHA GL_OPERAND0_RGB GL_OPERAND1_RGB GL_OPERAND2_RGB GL_OPERAND0_ALPHA GL_OPERAND1_ALPHA GL_OPERAND2_ALPHA GL_COORD_REPLACE_OES
+dependentnovalueconvert params pname GL_COORD_REPLACE_OES GL_TEXTURE_ENV_MODE GL_COMBINE_RGB GL_COMBINE_ALPHA GL_SRC0_RGB GL_OPERAND0_RGB GL_SRC0_ALPHA GL_OPERAND0_ALPHA GL_SRC1_RGB GL_OPERAND1_RGB GL_SRC1_ALPHA GL_OPERAND1_ALPHA GL_SRC2_RGB GL_OPERAND2_RGB GL_SRC2_ALPHA GL_OPERAND2_ALPHA
+convertalias   GetTexEnvfv
+convertparams  GLfloat         params
+props          get
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           GetTexGenfv
+return         void
+param          coord           GLenum
+checkparam     coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          params          GLfloat *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+props          get
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           GetTexGenxv
+return         void
+param          coord           GLenum
+checkparam     coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          params          GLfixed *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+convertalias    GetTexGenfv
+convertparams  GLfloat         params
+dependentnovalueconvert params pname GL_TEXTURE_GEN_MODE_OES 
+props          get
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           GetTexGeniv
+return         void
+param          coord           GLenum
+checkparam     coord           GL_TEXTURE_GEN_STR_OES
+param          pname           GLenum
+param          params          GLint *
+dependentvector params 1 pname GL_TEXTURE_GEN_MODE_OES
+convertalias    GetTexGenfv
+convertparams  GLfloat         params
+dependentnovalueconvert params pname GL_TEXTURE_GEN_MODE_OES 
+props          get
+category       1.0 GLES1.1:OES_texture_cube_map
+
+name           GetTexParameterfv
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          params          GLfloat *
+dependentvector params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GLES1.1:GL_GENERATE_MIPMAP
+props          get
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+category       GLES1.1 GLES2.0
+
+name           GetTexParameteriv
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          pname           GLenum
+param          params          GLint *
+dependentvector params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GLES1.1:GL_GENERATE_MIPMAP
+props          get
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_texture_3D
+checkparam      target          GLES2.0:GL_TEXTURE_3D_OES
+category       GLES1.1 GLES2.0
+
+name           GetTexParameterxv
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D
+param          pname           GLenum
+param          params          GLfixed *
+dependentvector params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GL_GENERATE_MIPMAP
+convertalias   GetTexParameterfv
+convertparams  GLfloat         params
+dependentnovalueconvert params pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GL_GENERATE_MIPMAP
+props          get
+# OES_texture_cube_map
+checkparam      target          GL_TEXTURE_CUBE_MAP_OES
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+# GLES1.1 and GLES2.0 have different capabilities
+name           IsEnabled
+return         GLboolean
+param          cap             GLenum
+props           get
+checkparam      cap             GL_VERTEX_ARRAY GL_NORMAL_ARRAY GL_COLOR_ARRAY GL_TEXTURE_COORD_ARRAY GL_NORMALIZE GL_RESCALE_NORMAL GL_CLIP_PLANE0 GL_CLIP_PLANE1 GL_CLIP_PLANE2 GL_CLIP_PLANE3 GL_CLIP_PLANE4 GL_CLIP_PLANE5 GL_FOG GL_LIGHTING GL_COLOR_MATERIAL GL_LIGHT0 GL_LIGHT1 GL_LIGHT2 GL_LIGHT3 GL_LIGHT4 GL_LIGHT5 GL_LIGHT6 GL_LIGHT7 GL_POINT_SMOOTH GL_LINE_SMOOTH GL_CULL_FACE GL_POLYGON_OFFSET_FILL GL_MULTISAMPLE GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_ALPHA_TO_ONE GL_SAMPLE_COVERAGE GL_TEXTURE_2D GL_SCISSOR_TEST GL_ALPHA_TEST GL_STENCIL_TEST GL_DEPTH_TEST GL_BLEND GL_DITHER GL_COLOR_LOGIC_OP
+# OES_matrix_palette
+checkparam      cap             GL_MATRIX_INDEX_ARRAY_OES GL_WEIGHT_ARRAY_OES
+# OES_point_size_array
+checkparam      cap             GL_POINT_SIZE_ARRAY_OES
+# OES_point_sprite
+checkparam      cap             GL_POINT_SPRITE_OES
+# OES_texture_cube_map
+checkparam      cap             GL_TEXTURE_CUBE_MAP_OES GL_TEXTURE_GEN_STR_OES
+category       GLES1.1
+
+name           IsEnabled
+return         GLboolean
+param          cap             GLenum
+checkparam      cap             GL_CULL_FACE GL_SCISSOR_TEST GL_POLYGON_OFFSET_FILL GL_SAMPLE_ALPHA_TO_COVERAGE GL_SAMPLE_COVERAGE GL_STENCIL_TEST GL_DEPTH_TEST GL_DITHER GL_BLEND
+props          get
+category       GLES2.0
+
+
+name           DepthRangef
+return         void
+param          zNear           GLclampf
+param          zFar            GLclampf
+convertalias   DepthRange
+convertparams  GLclampd        zNear zFar
+category       GLES1.1 GLES1.1:OES_single_precision GLES2.0
+
+name           DepthRangex
+return         void
+param          zNear           GLclampx
+param          zFar            GLclampx
+convertalias   DepthRange
+convertparams  GLclampd        zNear zFar
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Frustumf
+return         void
+param          left            GLfloat
+param          right           GLfloat
+param          bottom          GLfloat
+param          top             GLfloat
+param          zNear           GLfloat
+param          zFar            GLfloat
+convertalias   Frustum
+convertparams  GLdouble        left right bottom top zNear zFar
+category       GLES1.1 GLES1.1:OES_single_precision
+
+name           Frustumx
+return         void
+param          left            GLfixed
+param          right           GLfixed
+param          bottom          GLfixed
+param          top             GLfixed
+param          zNear           GLfixed
+param          zFar            GLfixed
+convertalias   Frustum
+convertparams  GLdouble        left right bottom top zNear zFar
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           LoadIdentity
+return         void
+category       1.0 GLES1.1
+
+name           LoadMatrixf
+return         void
+param          m               const GLfloat *
+vector         m               16
+category       1.0 GLES1.1
+
+name           LoadMatrixx
+return         void
+param          m               const GLfixed *
+vector         m               16
+convertalias   LoadMatrixf
+convertparams  GLfloat         m
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           MatrixMode
+return         void
+param          mode            GLenum
+checkparam     mode            GL_MODELVIEW GL_PROJECTION GL_TEXTURE
+# OES_matrix_palette
+checkparam      mode            GL_MATRIX_PALETTE_OES
+category       1.0 GLES1.1
+
+name           MultMatrixf
+return         void
+param          m               const GLfloat *
+vector         m               16
+category       1.0 GLES1.1
+
+name           MultMatrixx
+return         void
+param          m               const GLfixed *
+vector         m               16
+convertalias   MultMatrixf
+convertparams  GLfloat         m
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Orthof
+return         void
+param          left            GLfloat
+param          right           GLfloat
+param          bottom          GLfloat
+param          top             GLfloat
+param          zNear           GLfloat
+param          zFar            GLfloat
+convertalias   Ortho
+convertparams  GLdouble        left right bottom top zNear zFar
+category       GLES1.1 GLES1.1:OES_single_precision
+
+name           Orthox
+return         void
+param          left            GLfixed
+param          right           GLfixed
+param          bottom          GLfixed
+param          top             GLfixed
+param          zNear           GLfixed
+param          zFar            GLfixed
+convertalias   Ortho
+convertparams  GLdouble        left right bottom top zNear zFar
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name            PopMatrix
+return          void
+category        GLES1.1
+
+name            PushMatrix
+return          void
+category        GLES1.1
+
+name           Rotatef
+return         void
+param          angle           GLfloat
+param          x               GLfloat
+param          y               GLfloat
+param          z               GLfloat
+category       1.0 GLES1.1
+
+name           Rotatex
+return         void
+param          angle           GLfixed
+param          x               GLfixed
+param          y               GLfixed
+param          z               GLfixed
+convertalias   Rotatef
+convertparams  GLfloat         angle x y z
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Scalef
+return         void
+param          x               GLfloat
+param          y               GLfloat
+param          z               GLfloat
+category       1.0 GLES1.1
+
+name           Scalex
+return         void
+param          x               GLfixed
+param          y               GLfixed
+param          z               GLfixed
+convertalias   Scalef
+convertparams  GLfloat         x y z
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Translatef
+return         void
+param          x               GLfloat
+param          y               GLfloat
+param          z               GLfloat
+category       1.0 GLES1.1
+
+name           Translatex
+return         void
+param          x               GLfixed
+param          y               GLfixed
+param          z               GLfixed
+convertalias   Translatef
+convertparams  GLfloat         x y z
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           Viewport
+return         void
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+category       1.0 GLES1.1 GLES2.0
+
+name           ColorPointer
+return         void
+param          size            GLint
+param          type            GLenum
+param          stride          GLsizei
+paramlist      stride          0
+param          pointer         const GLvoid *
+checkparam      size            /GL_INVALID_VALUE 4
+checkparam      type            GL_UNSIGNED_BYTE GL_FIXED GL_FLOAT
+# OES_vertex_half_float: its values aren't in glext.h yet
+#checkparam    type            GL_HALF_FLOAT_OES
+category       1.1 GLES1.1
+
+name           DisableClientState
+return         void
+param          array           GLenum
+checkparam     array           GL_COLOR_ARRAY GL_NORMAL_ARRAY GL_TEXTURE_COORD_ARRAY GL_VERTEX_ARRAY
+# OES_matrix_palette
+checkparam      array GL_MATRIX_INDEX_ARRAY_OES GL_WEIGHT_ARRAY_OES
+# OES_point_size_array
+checkparam      array           GL_POINT_SIZE_ARRAY_OES
+category       1.1 GLES1.1
+
+name           DrawArrays
+return         void
+param          mode            GLenum
+checkparam     mode            GL_POINTS GL_LINE_STRIP GL_LINE_LOOP GL_LINES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_TRIANGLES
+param          first           GLint
+param          count           GLsizei
+category       1.1 GLES1.1 GLES2.0
+
+name           DrawElements
+return         void
+param          mode            GLenum
+checkparam     mode            GL_POINTS GL_LINE_STRIP GL_LINE_LOOP GL_LINES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_TRIANGLES
+param          count           GLsizei
+param          type            GLenum
+checkparam     type            GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT 
+param          indices         const GLvoid *
+# OES_element_index_uint - not in GLES1.1 extension headers yet
+checkparam     type            GLES2.0:GL_UNSIGNED_INT
+category       1.1 GLES1.1 GLES2.0
+
+name           EnableClientState
+return         void
+param          array           GLenum
+checkparam     array           GL_COLOR_ARRAY GL_NORMAL_ARRAY GL_TEXTURE_COORD_ARRAY GL_VERTEX_ARRAY
+# OES_matrix_palette
+checkparam      array GL_MATRIX_INDEX_ARRAY_OES GL_WEIGHT_ARRAY_OES
+# OES_point_size_array
+checkparam      array           GL_POINT_SIZE_ARRAY_OES
+category       1.1 GLES1.1
+
+name           GetPointerv
+return         void
+param          pname           GLenum
+checkparam     pname           GL_COLOR_ARRAY_POINTER GL_NORMAL_ARRAY_POINTER GL_TEXTURE_COORD_ARRAY_POINTER GL_VERTEX_ARRAY_POINTER
+param          params          GLvoid **
+props          get
+# OES_matrix_palette
+checkparam      pname           GL_MATRIX_INDEX_ARRAY_POINTER_OES GL_WEIGHT_ARRAY_POINTER_OES
+# OES_point_size_array
+checkparam      pname           GL_POINT_SIZE_ARRAY_POINTER_OES
+category       1.1 GLES1.1
+
+name           Normal3f
+aliasprefix    _vbo_
+return         void
+param          nx              GLfloat
+param          ny              GLfloat
+param          nz              GLfloat
+category       GLES1.1
+
+name           Normal3x
+aliasprefix    _vbo_
+return         void
+param          nx              GLfixed
+param          ny              GLfixed
+param          nz              GLfixed
+convertalias   Normal3f
+convertparams  GLfloat         nx ny nz
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           NormalPointer
+return         void
+param          type            GLenum
+checkparam     type            GL_BYTE GL_SHORT GL_FIXED GL_FLOAT
+param          stride          GLsizei
+param          pointer         const GLvoid *
+# OES_vertex_half_float - not yet in glext.h
+#checkparam    type            GL_HALF_FLOAT_OES
+category       1.1 GLES1.1
+
+name           TexCoordPointer
+return         void
+param          size            GLint
+param          type            GLenum
+param          stride          GLsizei
+param          pointer         const GLvoid *
+checkparam      size            /GL_INVALID_VALUE 2 3 4
+checkparam     type            GL_BYTE GL_SHORT GL_FIXED GL_FLOAT
+# OES_vertex_half_float - not yet in glext.h
+#checkparam    type            GL_HALF_FLOAT_OES
+category       1.1 GLES1.1
+
+name           VertexPointer
+return         void
+param          size            GLint
+param          type            GLenum
+param          stride          GLsizei
+param          pointer         const GLvoid *
+checkparam      size  /GL_INVALID_VALUE 2 3 4
+checkparam     type            GL_BYTE GL_SHORT GL_FIXED GL_FLOAT
+# OES_vertex_half_float - not yet in glext.h
+#checkparam    type            GL_HALF_FLOAT_OES
+category       1.1 GLES1.1
+
+name           PolygonOffset
+return         void
+param          factor          GLfloat
+param          units           GLfloat
+category       1.1 GLES1.1 GLES2.0
+
+name           PolygonOffsetx
+return         void
+param          factor          GLfixed
+param          units           GLfixed
+convertalias   PolygonOffset
+convertparams  GLfloat         factor units
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           CopyTexImage2D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+param          level           GLint
+param          internalFormat  GLenum
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+param          border          GLint
+checkparam      internalFormat /GL_INVALID_VALUE GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+checkparam      border         /GL_INVALID_VALUE 0
+# OES_texture_cube_map
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+# OES_depth_texture
+checkparam     internalFormat   GLES2.0:GL_DEPTH_COMPONENT
+category       GLES1.1 GLES2.0
+
+name           CopyTexSubImage2D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+# OES_texture_cube_map
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+category       GLES1.1 GLES2.0
+
+name           TexSubImage2D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          width           GLsizei
+param          height          GLsizei
+param          format          GLenum
+param          type            GLenum
+param          pixels          const GLvoid *
+checkparam      format /GL_INVALID_VALUE GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+checkdependentparam format GL_RGBA type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_4_4_4_4  GL_UNSIGNED_SHORT_5_5_5_1
+checkdependentparam format GL_RGB type GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_5_6_5
+checkdependentparam format GL_LUMINANCE_ALPHA type GL_UNSIGNED_BYTE
+checkdependentparam format GL_LUMINANCE type GL_UNSIGNED_BYTE
+checkdependentparam format GL_ALPHA type GL_UNSIGNED_BYTE
+# OES_texture_cube_map
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+# OES_texture_float
+checkdependentparam format GL_ALPHA type GL_FLOAT
+checkdependentparam format GL_RGB type GL_FLOAT
+checkdependentparam format GL_RGBA type GL_FLOAT
+checkdependentparam format GL_LUMINANCE type GL_FLOAT
+checkdependentparam format GL_LUMINANCE_ALPHA type GL_FLOAT
+# OES_texture_half_float
+checkdependentparam format GL_ALPHA type GLES2.0:GL_HALF_FLOAT_OES
+checkdependentparam format GL_RGB type GLES2.0:GL_HALF_FLOAT_OES
+checkdependentparam format GL_RGBA type GLES2.0:GL_HALF_FLOAT_OES
+checkdependentparam format GL_LUMINANCE type GLES2.0:GL_HALF_FLOAT_OES
+checkdependentparam format GL_LUMINANCE_ALPHA type GLES2.0:GL_HALF_FLOAT_OES
+# EXT_texture_type_2_10_10_10_REV
+checkdependentparam format GL_RGBA type GLES2.0:GL_UNSIGNED_INT_2_10_10_10_REV_EXT
+# OES_depth_texture
+checkdependentparam format GL_DEPTH_COMPONENT type GLES2.0:GL_UNSIGNED_SHORT GLES2.0:GL_UNSIGNED_INT
+category       GLES1.1 GLES2.0
+
+name           BindTexture
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+param          texture         GLuint
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+category       GLES1.1 GLES2.0
+
+name           DeleteTextures
+return         void
+param          n               GLsizei
+param          textures        const GLuint *
+category       1.1 GLES1.1 GLES2.0
+
+name           GenTextures
+return         void
+param          n               GLsizei
+param          textures        GLuint *
+props          get
+category       1.1 GLES1.1 GLES2.0
+
+name           IsTexture
+return         GLboolean
+param          texture         GLuint
+props          get
+category       1.1 GLES1.1 GLES2.0
+
+name           BlendColor
+return         void
+param          red             GLclampf
+param          green           GLclampf
+param          blue            GLclampf
+param          alpha           GLclampf
+category       1.2 GLES2.0
+
+name           BlendEquation
+return         void
+param          mode            GLenum
+checkparam     mode            GLES1.1:GL_FUNC_ADD_OES GLES1.1:GL_FUNC_SUBTRACT_OES GLES1.1:GL_FUNC_REVERSE_SUBTRACT_OES
+checkparam     mode            GLES2.0:GL_FUNC_ADD GLES2.0:GL_FUNC_SUBTRACT GLES2.0:GL_FUNC_REVERSE_SUBTRACT
+category       GLES1.1:OES_blend_subtract GLES2.0
+
+name            BlendEquationSeparate
+alias          BlendEquationSeparateEXT
+return          void
+param           modeRGB         GLenum
+param           modeAlpha       GLenum
+checkparam     modeRGB GLES1.1:GL_FUNC_ADD_OES GLES1.1:GL_FUNC_SUBTRACT_OES GLES1.1:GL_FUNC_REVERSE_SUBTRACT_OES
+checkparam     modeAlpha GLES1.1:GL_FUNC_ADD_OES GLES1.1:GL_FUNC_SUBTRACT_OES GLES1.1:GL_FUNC_REVERSE_SUBTRACT_OES
+checkparam     modeRGB GLES1.1:GL_FUNC_ADD_OES GLES1.1:GL_FUNC_SUBTRACT_OES GLES1.1:GL_FUNC_REVERSE_SUBTRACT_OES
+checkparam     modeAlpha GLES1.1:GL_FUNC_ADD_OES GLES1.1:GL_FUNC_SUBTRACT_OES GLES1.1:GL_FUNC_REVERSE_SUBTRACT_OES
+checkparam     modeRGB GLES2.0:GL_FUNC_ADD GLES2.0:GL_FUNC_SUBTRACT GLES2.0:GL_FUNC_REVERSE_SUBTRACT
+checkparam     modeAlpha GLES2.0:GL_FUNC_ADD GLES2.0:GL_FUNC_SUBTRACT GLES2.0:GL_FUNC_REVERSE_SUBTRACT
+checkparam     modeRGB GLES2.0:GL_FUNC_ADD GLES2.0:GL_FUNC_SUBTRACT GLES2.0:GL_FUNC_REVERSE_SUBTRACT
+checkparam     modeAlpha GLES2.0:GL_FUNC_ADD GLES2.0:GL_FUNC_SUBTRACT GLES2.0:GL_FUNC_REVERSE_SUBTRACT
+category        GLES1.1:OES_blend_equation_separate GLES2.0
+
+name           TexImage3D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_3D_OES
+param          level           GLint
+param          internalFormat  GLenum
+checkparam      internalFormat  GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+param          width           GLsizei
+param          height          GLsizei
+param          depth           GLsizei
+param          border          GLint
+param          format          GLenum
+param          type            GLenum
+param          pixels          const GLvoid *
+# OES_texture_float
+checkparam    type            GL_FLOAT
+# OES_texture_half_float
+checkparam    type            GL_HALF_FLOAT_OES
+category       GLES2.0:OES_texture_3D
+
+name           TexSubImage3D
+return         void
+param          target          GLenum
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          zoffset         GLint
+param          width           GLsizei
+param          height          GLsizei
+param          depth           GLsizei
+param          format          GLenum
+param          type            GLenum
+param          pixels          const GLvoid *
+# OES_texture_float
+checkparam    type            GL_FLOAT
+# OES_texture_half_float
+checkparam    type            GL_HALF_FLOAT_OES
+category       GLES2.0:OES_texture_3D
+
+name           CopyTexSubImage3D
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_3D_OES
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          zoffset         GLint
+param          x               GLint
+param          y               GLint
+param          width           GLsizei
+param          height          GLsizei
+category       GLES2.0:OES_texture_3D
+
+name           MultiTexCoord4x
+return         void
+param          texture         GLenum
+checkparam     texture         GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7
+param          s               GLfixed
+param          t               GLfixed
+param          r               GLfixed
+param          q               GLfixed
+aliasprefix    _vbo_
+convertalias   MultiTexCoord4f
+convertparams  GLfloat         s t r q
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           CompressedTexImage3D
+alias          CompressedTexImage3DARB
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_3D_OES
+param          level           GLint
+param          internalFormat  GLenum
+checkparam      internalFormat  GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA
+param          width           GLsizei
+param          height          GLsizei
+param          depth           GLsizei
+param          border          GLint
+param          imagesize       GLsizei
+param          data            const GLvoid *
+# AMD_compressed_3DC_texture
+checkparam      internalFormat  GL_3DC_X_AMD GL_3DC_XY_AMD
+# AMD_compressed_ATC_texture
+checkparam      internalFormat  GL_ATC_RGB_AMD GL_ATC_RGBA_EXPLICIT_ALPHA_AMD GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD
+category       GLES2.0:OES_texture_3D
+
+name           CompressedTexSubImage3D
+alias          CompressedTexSubImage3DARB
+return         void
+param          target          GLenum
+checkparam     target          GL_TEXTURE_3D_OES
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          zoffset         GLint
+param          width           GLsizei
+param          height          GLsizei
+param          depth           GLsizei
+param          format          GLenum
+param          imagesize       GLsizei
+param          data            const GLvoid *
+category       GLES2.0:OES_texture_3D
+
+name           ActiveTexture
+alias          ActiveTextureARB
+return         void
+param          texture         GLenum
+checkparam     texture         GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.3 GLES1.1 GLES2.0
+
+name           ClientActiveTexture
+alias          ClientActiveTextureARB
+return         void
+param          texture         GLenum
+checkparam     texture         GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+category       1.3 GLES1.1
+
+name           MultiTexCoord4f
+aliasprefix    _vbo_
+return         void
+param          texture         GLenum
+checkparam     texture         GL_TEXTURE0 GL_TEXTURE1 GL_TEXTURE2 GL_TEXTURE3 GL_TEXTURE4 GL_TEXTURE5 GL_TEXTURE6 GL_TEXTURE7 GL_TEXTURE8 GL_TEXTURE9 GL_TEXTURE10 GL_TEXTURE11 GL_TEXTURE12 GL_TEXTURE13 GL_TEXTURE14 GL_TEXTURE15 GL_TEXTURE16 GL_TEXTURE17 GL_TEXTURE18 GL_TEXTURE19 GL_TEXTURE20 GL_TEXTURE21 GL_TEXTURE22 GL_TEXTURE23 GL_TEXTURE24 GL_TEXTURE25 GL_TEXTURE26 GL_TEXTURE27 GL_TEXTURE28 GL_TEXTURE29 GL_TEXTURE30 GL_TEXTURE31
+param          s               GLfloat
+param          t               GLfloat
+param          r               GLfloat
+param          q               GLfloat
+category       1.3 GLES1.1
+
+name           SampleCoverage
+alias          SampleCoverageARB
+return         void
+param          value           GLclampf
+param          invert          GLboolean
+category       1.3 GLES1.1 GLES2.0
+
+name           SampleCoveragex
+return         void
+param          value           GLclampx
+param          invert          GLboolean
+convertalias   SampleCoverageARB
+convertparams  GLclampf        value
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           CompressedTexImage2D
+alias          CompressedTexImage2DARB
+return         void
+param          target          GLenum
+param          level           GLint
+param          internalFormat  GLenum
+param          width           GLsizei
+param          height          GLsizei
+param          border          GLint
+param          imageSize       GLsizei
+param          data            const GLvoid *
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+checkparam      border         /GL_INVALID_VALUE 0
+# OES_texture_cube_map
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+# OES_compressed_paletted_texture
+checkparam     internalFormat  /GL_INVALID_VALUE GL_PALETTE4_RGB8_OES GL_PALETTE4_RGBA8_OES GL_PALETTE4_R5_G6_B5_OES GL_PALETTE4_RGBA4_OES GL_PALETTE4_RGB5_A1_OES GL_PALETTE8_RGB8_OES GL_PALETTE8_RGBA8_OES GL_PALETTE8_R5_G6_B5_OES GL_PALETTE8_RGBA4_OES GL_PALETTE8_RGB5_A1_OES
+# OES_compressed_ETC1_RGB8_texture
+checkparam      internalFormat  GL_ETC1_RGB8_OES
+# AMD_compressed_3DC_texture
+checkparam      internalFormat  GL_3DC_X_AMD GL_3DC_XY_AMD
+# AMD_compressed_ATC_texture (GLES2.0 only?)
+checkparam      internalFormat  GL_ATC_RGB_AMD GL_ATC_RGBA_EXPLICIT_ALPHA_AMD GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD
+category       GLES1.1 GLES2.0
+
+name           CompressedTexSubImage2D
+alias          CompressedTexSubImage2DARB
+return         void
+param          target          GLenum
+param          level           GLint
+param          xoffset         GLint
+param          yoffset         GLint
+param          width           GLsizei
+param          height          GLsizei
+param          format          GLenum
+param          imageSize       GLsizei
+param          data            const GLvoid *
+checkparam     target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+checkparam     format  GL_PALETTE4_RGB8_OES GL_PALETTE4_RGBA8_OES GL_PALETTE4_R5_G6_B5_OES GL_PALETTE4_RGBA4_OES GL_PALETTE4_RGB5_A1_OES GL_PALETTE8_RGB8_OES GL_PALETTE8_RGBA8_OES GL_PALETTE8_R5_G6_B5_OES GL_PALETTE8_RGBA4_OES GL_PALETTE8_RGB5_A1_OES
+# OES_texture_cube_map
+checkparam     target          GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+category       GLES1.1 GLES2.0
+
+name           BlendFuncSeparate
+alias          BlendFuncSeparateEXT
+return         void
+param          srcRGB  GLenum
+param          dstRGB  GLenum
+param          srcAlpha        GLenum
+param          dstAlpha        GLenum
+checkparam      srcRGB      GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+checkparam      dstRGB      GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA  GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+checkparam      srcAlpha    GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+checkparam      dstAlpha    GL_ZERO GL_ONE GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GLES2.0:GL_CONSTANT_COLOR GLES2.0:GL_ONE_MINUS_CONSTANT_COLOR GLES2.0:GL_CONSTANT_ALPHA GLES2.0:GL_ONE_MINUS_CONSTANT_ALPHA
+category       GLES1.1:OES_blend_func_separate GLES2.0
+
+name           PointParameterf
+return         void
+param          pname           GLenum
+checkparam     pname           GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE
+param          param           GLfloat
+category       1.4 GLES1.1
+
+name           PointParameterfv
+return         void
+param          pname           GLenum
+checkparam     pname           GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE GL_POINT_DISTANCE_ATTENUATION
+param          params          const GLfloat *
+dependentvector        params 1 pname GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE
+dependentvector params 3 pname GL_POINT_DISTANCE_ATTENUATION
+category       1.4 GLES1.1
+
+name           PointParameterx
+return         void
+param          pname           GLenum
+checkparam     pname           GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE
+param          param           GLfixed
+convertalias   PointParameterf
+convertparams  GLfloat         param
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name           PointParameterxv
+return         void
+param          pname           GLenum
+checkparam     pname           GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE GL_POINT_DISTANCE_ATTENUATION
+param          params          const GLfixed *
+dependentvector        params 1 pname GL_POINT_SIZE_MIN GL_POINT_SIZE_MAX GL_POINT_FADE_THRESHOLD_SIZE
+dependentvector params 3 pname GL_POINT_DISTANCE_ATTENUATION
+convertalias   PointParameterfv
+convertparams  GLfloat         params
+category       GLES1.1 GLES1.1:OES_fixed_point
+
+name            VertexAttrib1f
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          x               GLfloat
+category       GLES2.0
+
+name           VertexAttrib2f
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          x               GLfloat
+param          y               GLfloat
+category       GLES2.0
+
+name           VertexAttrib3f
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          x               GLfloat
+param          y               GLfloat
+param          z               GLfloat
+category       GLES2.0
+
+name           VertexAttrib4f
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          x               GLfloat
+param          y               GLfloat
+param          z               GLfloat
+param          w               GLfloat
+category       GLES2.0
+
+name           VertexAttrib1fv
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          v               const GLfloat *
+vector         v               1
+category       GLES2.0
+
+name           VertexAttrib2fv
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          v               const GLfloat *
+vector         v               2
+category       GLES2.0
+
+name           VertexAttrib3fv
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          v               const GLfloat *
+vector         v               3
+category       GLES2.0
+
+name           VertexAttrib4fv
+aliasprefix    _vbo_
+return         void
+param          index           GLuint
+param          v               const GLfloat *
+vector         v               4
+category       GLES2.0
+
+name           VertexAttribPointer
+alias          VertexAttribPointerARB
+return         void
+param          index           GLuint
+param          size            GLint
+checkparam      size            /GL_INVALID_VALUE 1 2 3 4
+param          type            GLenum
+checkparam     type            /GL_INVALID_VALUE GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_FIXED GL_FLOAT
+param          normalized      GLboolean
+param          stride          GLsizei
+param          pointer         const GLvoid *
+# OES_vertex_half_float
+checkparam     type            GL_HALF_FLOAT_OES
+# OES_vertex_type_10_10_10_2
+checkdependentparam type GL_UNSIGNED_INT_10_10_10_2_OES size /GL_INVALID_VALUE 3 4
+checkdependentparam type GL_INT_10_10_10_2_OES size /GL_INVALID_VALUE 3 4
+category       GLES2.0
+
+name           EnableVertexAttribArray
+alias          EnableVertexAttribArrayARB
+return         void
+param          index           GLuint
+category       GLES2.0
+
+name           DisableVertexAttribArray
+alias          DisableVertexAttribArrayARB
+return         void
+param          index           GLuint
+category       GLES2.0
+
+name           IsProgram
+return         GLboolean
+param          program         GLuint
+props          get
+category       GLES2.0
+
+name           GetProgramiv
+return         void
+param          program         GLuint
+param          pname           GLenum
+checkparam      pname           GL_DELETE_STATUS GL_LINK_STATUS GL_VALIDATE_STATUS GL_INFO_LOG_LENGTH GL_ATTACHED_SHADERS GL_ACTIVE_ATTRIBUTES GL_ACTIVE_ATTRIBUTE_MAX_LENGTH GL_ACTIVE_UNIFORMS GL_ACTIVE_UNIFORM_MAX_LENGTH
+param          params          GLint *
+props          get
+# OES_get_program_binary
+checkparam      pname           GL_PROGRAM_BINARY_LENGTH_OES
+category       GLES2.0
+
+name           GetVertexAttribfv
+alias          GetVertexAttribfvARB
+return         void
+param          index           GLuint
+param          pname           GLenum
+param          params          GLfloat *
+dependentvector params 1 pname GL_VERTEX_ATTRIB_ARRAY_ENABLED GL_VERTEX_ATTRIB_ARRAY_SIZE GL_VERTEX_ATTRIB_ARRAY_STRIDE GL_VERTEX_ATTRIB_ARRAY_TYPE GL_VERTEX_ATTRIB_ARRAY_NORMALIZED GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 
+dependentvector params 16? pname GL_CURRENT_VERTEX_ATTRIB
+props          get
+category       GLES2.0
+
+name           GetVertexAttribiv
+alias          GetVertexAttribivARB
+return         void
+param          index           GLuint
+param          pname           GLenum
+param          params          GLint *
+dependentvector params 1 pname GL_VERTEX_ATTRIB_ARRAY_ENABLED GL_VERTEX_ATTRIB_ARRAY_SIZE GL_VERTEX_ATTRIB_ARRAY_STRIDE GL_VERTEX_ATTRIB_ARRAY_TYPE GL_VERTEX_ATTRIB_ARRAY_NORMALIZED GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING GL_CURRENT_VERTEX_ATTRIB
+props          get
+category       GLES2.0
+
+name           GetVertexAttribPointerv
+alias          GetVertexAttribPointervARB
+return         void
+param          index           GLuint
+param          pname           GLenum
+checkparam     pname           GL_VERTEX_ATTRIB_ARRAY_POINTER
+param          pointer         GLvoid **
+props          get
+category       GLES2.0
+
+name           GetBufferPointerv
+alias          GetBufferPointervARB
+return         void
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          pname           GLenum
+checkparam     pname           GL_BUFFER_MAP_POINTER_OES
+param          params          GLvoid **
+props          get 
+category       GLES1.1:OES_mapbuffer GLES2.0:OES_mapbuffer
+
+name           MapBuffer
+alias          MapBufferARB
+return         void *
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          access          GLenum
+checkparam      access          GL_WRITE_ONLY_OES
+props          get
+category       GLES1.1:OES_mapbuffer GLES2.0:OES_mapbuffer
+
+name           UnmapBuffer
+alias          UnmapBufferARB
+return         GLboolean
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+props          get
+category       GLES1.1:OES_mapbuffer GLES2.0:OES_mapbuffer
+
+name           BindBuffer
+alias          BindBufferARB
+return         void
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          buffer          GLuint
+category       1.5 GLES1.1 GLES2.0
+
+name           BufferData
+alias          BufferDataARB
+return         void
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          size            GLsizeiptr
+param          data            const GLvoid *
+param          usage           GLenum
+checkparam     usage           GL_STATIC_DRAW GL_DYNAMIC_DRAW GLES2.0:GL_STREAM_DRAW
+category       GLES1.1 GLES2.0
+
+name           BufferSubData
+alias          BufferSubDataARB
+return         void
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          offset          GLintptr
+param          size            GLsizeiptr
+param          data            const GLvoid *
+category       1.5 GLES1.1 GLES2.0
+
+name           DeleteBuffers
+return         void
+param          n               GLsizei
+param          buffer          const GLuint *
+category       1.5 GLES1.1 GLES2.0
+alias          DeleteBuffersARB
+
+name           GenBuffers
+alias          GenBuffersARB
+return         void
+param          n               GLsizei
+param          buffer          GLuint *
+props          get
+category       1.5 GLES1.1 GLES2.0
+
+name           GetBufferParameteriv
+alias          GetBufferParameterivARB
+return         void
+param          target          GLenum
+checkparam     target          GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER
+param          pname           GLenum
+checkparam     pname           GL_BUFFER_SIZE GL_BUFFER_USAGE
+param          params          GLint *
+props          get
+# OES_mapbuffer
+checkparam      pname           GL_BUFFER_ACCESS_OES GL_BUFFER_MAPPED_OES
+category       1.5 GLES1.1 GLES2.0
+
+name           IsBuffer
+alias          IsBufferARB
+return         GLboolean
+param          buffer          GLuint
+paramlist      buffer          0
+props          get
+category       1.5 GLES1.1 GLES2.0
+
+name           CreateShader
+return         GLuint
+param          type            GLenum
+checkparam     type            GL_VERTEX_SHADER GL_FRAGMENT_SHADER
+category       GLES2.0
+
+name            ShaderSource
+alias          ShaderSourceARB
+return          void
+param           shader          GLuint
+param           count           GLsizei
+param           string          const GLchar **
+param           length          const int *
+category        GLES2.0
+
+name            CompileShader
+alias          CompileShaderARB
+return          void
+param           shader          GLuint
+category        GLES2.0
+
+name            ReleaseShaderCompiler
+return          void
+category        GLES2.0
+
+name            DeleteShader
+return          void
+param           shader          GLuint
+category        GLES2.0
+
+name            ShaderBinary
+return          void
+param           n               GLsizei
+param           shaders         const GLuint *
+param           binaryformat    GLenum
+param           binary          const GLvoid *
+param           length          GLsizei
+category        GLES2.0
+
+name            CreateProgram
+return          GLuint
+category        GLES2.0
+
+name            AttachShader
+return          void
+param           program         GLuint
+param           shader          GLuint
+category        GLES2.0
+
+name            DetachShader
+return          void
+param           program         GLuint
+param           shader          GLuint
+category        GLES2.0
+
+name            LinkProgram
+alias          LinkProgramARB
+return          void
+param           program         GLuint
+category        GLES2.0
+
+name            UseProgram
+alias          UseProgramObjectARB
+return          void
+param           program         GLuint
+category        GLES2.0
+
+name            DeleteProgram
+return          void
+param           program         GLuint
+category        GLES2.0
+
+name            GetActiveAttrib
+alias          GetActiveAttribARB
+return          void
+param           program         GLuint
+param           index           GLuint
+param           bufSize         GLsizei
+param           length          GLsizei *
+param           size            GLint *
+param           type            GLenum *
+param           name            GLchar *
+props get
+category        GLES2.0
+
+name            GetAttribLocation
+alias          GetAttribLocationARB
+return          GLint
+param           program         GLuint
+param           name            const char *
+props get
+category        GLES2.0
+
+name            BindAttribLocation
+alias          BindAttribLocationARB
+return          void
+param           program         GLuint
+param           index           GLuint
+param           name            const char *
+category        GLES2.0
+
+name            GetUniformLocation
+alias          GetUniformLocationARB
+return          GLint
+param           program         GLuint
+param           name            const char *
+props           get
+category        GLES2.0
+
+name            GetActiveUniform
+alias          GetActiveUniformARB
+return          void
+param           program         GLuint
+param           index           GLuint
+param           bufSize         GLsizei
+param           length          GLsizei *
+param           size            GLint *
+param           type            GLenum *
+param           name            GLchar *
+props           get
+category        GLES2.0
+
+name            Uniform1f
+alias          Uniform1fARB
+return          void
+param           location        GLint
+param           v0              GLfloat
+category        GLES2.0
+
+name            Uniform2f
+alias          Uniform2fARB
+return          void
+return          void
+param           location        GLint
+param           v0              GLfloat
+param           v1              GLfloat
+category        GLES2.0
+
+name            Uniform3f
+alias          Uniform3fARB
+return          void
+return          void
+param           location        GLint
+param           v0              GLfloat
+param           v1              GLfloat
+param           v2              GLfloat
+category        GLES2.0
+
+name            Uniform4f
+alias          Uniform4fARB
+return          void
+return          void
+param           location        GLint
+param           v0              GLfloat
+param           v1              GLfloat
+param           v2              GLfloat
+param           v3              GLfloat
+category        GLES2.0
+
+name            Uniform1i
+alias          Uniform1iARB
+return          void
+param           location        GLint
+param           v0              GLint
+category        GLES2.0
+
+name            Uniform2i
+alias          Uniform2iARB
+return          void
+param           location        GLint
+param           v0              GLint
+param           v1              GLint
+category        GLES2.0
+
+name            Uniform3i
+alias          Uniform3iARB
+return          void
+param           location        GLint
+param           v0              GLint
+param           v1              GLint
+param           v2              GLint
+category        GLES2.0
+
+name            Uniform4i
+alias          Uniform4iARB
+return          void
+param           location        GLint
+param           v0              GLint
+param           v1              GLint
+param           v2              GLint
+param           v3              GLint
+category        GLES2.0
+
+name            Uniform1fv
+alias          Uniform1fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLfloat *
+category        GLES2.0
+
+name            Uniform2fv
+alias          Uniform2fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLfloat *
+category        GLES2.0
+
+name            Uniform3fv
+alias          Uniform3fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLfloat *
+category        GLES2.0
+
+name            Uniform4fv
+alias          Uniform4fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLfloat *
+category        GLES2.0
+
+name            Uniform1iv
+alias           Uniform1ivARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLint *
+category        GLES2.0
+
+name            Uniform2iv
+alias           Uniform2ivARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLint *
+category        GLES2.0
+
+name            Uniform3iv
+alias           Uniform3ivARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLint *
+category        GLES2.0
+
+name            Uniform4iv
+alias           Uniform4ivARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           values          const GLint *
+category        GLES2.0
+
+name            UniformMatrix2fv
+alias           UniformMatrix2fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           transpose       GLboolean
+param           value           const GLfloat *
+category        GLES2.0
+
+name            UniformMatrix3fv
+alias           UniformMatrix3fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           transpose       GLboolean
+param           value           const GLfloat *
+category        GLES2.0
+
+name            UniformMatrix4fv
+alias           UniformMatrix4fvARB
+return          void
+param           location        GLint
+param           count           GLsizei
+param           transpose       GLboolean
+param           value           const GLfloat *
+category        GLES2.0
+
+name            ValidateProgram
+alias           ValidateProgramARB
+return          void
+param           program         GLuint
+category        GLES2.0
+
+name            GenerateMipmap
+alias           GenerateMipmapEXT
+return          void
+param           target          GLenum
+checkparam      target          GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP
+# OES_texture_cube_map
+checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+
+name            BindFramebuffer
+alias           BindFramebufferEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_FRAMEBUFFER_OES GLES2.0:GL_FRAMEBUFFER
+param           framebuffer     GLuint
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            DeleteFramebuffers
+alias           DeleteFramebuffersEXT
+return          void
+param           n               GLsizei
+param           framebuffers    const GLuint *
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            GenFramebuffers
+alias           GenFramebuffersEXT
+return          void
+param           n               GLsizei
+param           ids             GLuint *
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            BindRenderbuffer
+alias           BindRenderbufferEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_RENDERBUFFER_OES GLES2.0:GL_RENDERBUFFER
+param           renderbuffer    GLuint
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            DeleteRenderbuffers
+alias           DeleteRenderbuffersEXT
+return          void
+param           n               GLsizei
+param           renderbuffers   const GLuint *
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            GenRenderbuffers
+alias           GenRenderbuffersEXT
+return          void
+param           n               GLsizei
+param           renderbuffers   GLuint *
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            RenderbufferStorage
+alias           RenderbufferStorageEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_RENDERBUFFER_OES GLES2.0:GL_RENDERBUFFER
+param           internalFormat  GLenum
+checkparam      internalFormat  GL_DEPTH_COMPONENT16_OES GL_RGBA4_OES GL_RGB5_A1_OES GL_RGB565_OES
+param           width           GLsizei
+param           height          GLsizei
+# OES_depth24
+checkparam      internalFormat  GL_DEPTH_COMPONENT24_OES
+# OES_depth32
+checkparam      internalFormat  GL_DEPTH_COMPONENT32_OES
+# OES_rgb8_rgba8
+checkparam      internalFormat  GL_RGB8_OES GL_RGBA8_OES
+# OES_stencil1
+checkparam      internalFormat  GL_STENCIL_INDEX1_OES
+# OES_stencil4
+checkparam      internalFormat  GL_STENCIL_INDEX4_OES
+# OES_stencil8
+checkparam      internalFormat  GL_STENCIL_INDEX8_OES
+# OES_packed_depth_stencil - not in glext.h yet
+checkparam      internalFormat  GLES2.0:GL_DEPTH24_STENCIL8_OES
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            FramebufferRenderbuffer
+alias           FramebufferRenderbufferEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_FRAMEBUFFER_OES  GLES2.0:GL_FRAMEBUFFER
+param           attachment      GLenum
+checkparam      attachment      GLES1.1:GL_COLOR_ATTACHMENT0_OES GLES1.1:GL_DEPTH_ATTACHMENT_OES GLES1.1:GL_STENCIL_ATTACHMENT_OES
+checkparam      attachment      GLES2.0:GL_COLOR_ATTACHMENT0 GLES2.0:GL_DEPTH_ATTACHMENT GLES2.0:GL_STENCIL_ATTACHMENT
+param           renderbuffertarget      GLenum
+checkparam      renderbuffertarget      GLES1.1:GL_RENDERBUFFER_OES GLES2.0:GL_RENDERBUFFER
+param           renderbuffer    GLuint
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            FramebufferTexture2D
+alias           FramebufferTexture2DEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_FRAMEBUFFER_OES GLES2.0:GL_FRAMEBUFFER
+param           attachment      GLenum
+checkparam      attachment      GLES1.1:GL_COLOR_ATTACHMENT0_OES GLES1.1:GL_DEPTH_ATTACHMENT_OES GLES1.1:GL_STENCIL_ATTACHMENT_OES
+checkparam      attachment      GLES2.0:GL_COLOR_ATTACHMENT0 GLES2.0:GL_DEPTH_ATTACHMENT GLES2.0:GL_STENCIL_ATTACHMENT
+param           textarget       GLenum
+checkparam      textarget       /GL_INVALID_OPERATION GL_TEXTURE_2D GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_POSITIVE_Z GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_X GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GLES2.0:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+param           texture         GLuint
+param           level           GLint
+# OES_texture_cube_map
+checkparam      textarget       GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GLES1.1:GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES
+# According to the base specification, "level" must be 0.  But
+# extension GL_OES_fbo_render_mipmap lifts that restriction,
+# so no restriction is placed here.
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            FramebufferTexture3D
+alias           FramebufferTexture3DEXT
+return          void
+param           target          GLenum
+param           attachment      GLenum
+param           textarget       GLenum
+param           texture         GLuint
+param           level           GLint
+param           zoffset         GLint
+category        GLES2.0:OES_texture_3D
+
+name            CheckFramebufferStatus
+alias           CheckFramebufferStatusEXT
+return          GLenum
+param           target          GLenum
+checkparam      target          GLES1.1:GL_FRAMEBUFFER_OES GLES2.0:GL_FRAMEBUFFER
+props           get
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+# One for GLES1.1 extension, one for GLES2.0 core
+name            GetFramebufferAttachmentParameteriv
+alias           GetFramebufferAttachmentParameterivEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_FRAMEBUFFER_OES GLES2.0:GL_FRAMEBUFFER
+param           attachment      GLenum
+param           pname           GLenum
+param           params          GLint *
+props           get
+dependentvector params 1 pname GLES1.1:GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES GLES1.1:GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES GLES1.1:GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES GLES1.1:GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 
+dependentvector params 1 pname GLES2.0:GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE GLES2.0:GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME GLES2.0:GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL GLES2.0:GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 
+# OES_texture3D
+dependentvector params 1 pname GLES2.0:GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            GetRenderbufferParameteriv
+alias           GetRenderbufferParameterivEXT
+return          void
+param           target          GLenum
+checkparam      target          GLES1.1:GL_RENDERBUFFER_OES GLES2.0:GL_RENDERBUFFER
+param           pname           GLenum
+param           params          GLint *
+props           get
+dependentvector params 1 pname GLES1.1:GL_RENDERBUFFER_WIDTH_OES GLES1.1:GL_RENDERBUFFER_HEIGHT_OES GLES1.1:GL_RENDERBUFFER_INTERNAL_FORMAT_OES GLES1.1:GL_RENDERBUFFER_RED_SIZE_OES GLES1.1:GL_RENDERBUFFER_GREEN_SIZE_OES GLES1.1:GL_RENDERBUFFER_BLUE_SIZE_OES GLES1.1:GL_RENDERBUFFER_ALPHA_SIZE_OES GLES1.1:GL_RENDERBUFFER_DEPTH_SIZE_OES GLES1.1:GL_RENDERBUFFER_STENCIL_SIZE_OES
+dependentvector params 1 pname GLES2.0:GL_RENDERBUFFER_WIDTH GLES2.0:GL_RENDERBUFFER_HEIGHT GLES2.0:GL_RENDERBUFFER_INTERNAL_FORMAT GLES2.0:GL_RENDERBUFFER_RED_SIZE GLES2.0:GL_RENDERBUFFER_GREEN_SIZE GLES2.0:GL_RENDERBUFFER_BLUE_SIZE GLES2.0:GL_RENDERBUFFER_ALPHA_SIZE GLES2.0:GL_RENDERBUFFER_DEPTH_SIZE GLES2.0:GL_RENDERBUFFER_STENCIL_SIZE
+category        GLES1.1:OES_framebuffer_object GLES2.0
+
+name            IsRenderbuffer
+alias           IsRenderbufferEXT
+return          GLboolean
+param           renderbuffer    GLuint
+props           get
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            IsFramebuffer
+alias           IsFramebufferEXT
+return          GLboolean
+param           framebuffer    GLuint
+props           get
+category        GLES2.0 GLES1.1:OES_framebuffer_object
+
+name            IsShader
+return          GLboolean
+param           shader          GLuint
+props           get
+category        GLES2.0
+
+name            GetShaderiv
+return          void
+param           shader          GLuint
+param           pname           GLenum
+param           params          GLint *
+props           get
+checkparam      pname           GL_SHADER_TYPE GL_COMPILE_STATUS GL_DELETE_STATUS GL_INFO_LOG_LENGTH GL_SHADER_SOURCE_LENGTH
+category        GLES2.0
+
+name            GetAttachedShaders
+return          void
+param           program         GLuint
+param           maxCount        GLsizei
+param           count           GLsizei *
+param           shaders         GLuint *
+props           get
+category        GLES2.0
+
+name            GetShaderInfoLog
+return          void
+param           shader          GLuint
+param           bufSize         GLsizei
+param           length          GLsizei *
+param           infoLog         GLchar *
+props           get
+category        GLES2.0
+
+name            GetProgramInfoLog
+return          void
+param           program         GLuint
+param           bufSize         GLsizei
+param           length          GLsizei *
+param           infoLog         GLchar *
+props           get
+category        GLES2.0
+
+name            GetShaderSource
+alias          GetShaderSourceARB
+return          void
+param           shader          GLuint
+param           bufSize         GLsizei
+param           length          GLsizei *
+param           source          GLchar *
+props           get
+category        GLES2.0
+
+name            GetShaderPrecisionFormat
+return          void
+param           shadertype      GLenum
+param           precisiontype   GLenum
+param           range           GLint *
+param           precision       GLint *
+props           get
+checkparam      shadertype      GL_VERTEX_SHADER GL_FRAGMENT_SHADER
+checkparam      precisiontype   GL_LOW_FLOAT GL_MEDIUM_FLOAT GL_HIGH_FLOAT GL_LOW_INT GL_MEDIUM_INT GL_HIGH_INT
+category        GLES2.0
+
+name            GetUniformfv
+alias          GetUniformfvARB
+return          void
+param           program         GLuint
+param           location        GLint
+param           params          GLfloat *
+props           get
+category        GLES2.0
+
+name            GetUniformiv
+alias          GetUniformivARB
+return          void
+param           program         GLuint
+param           location        GLint
+param           params          GLint *
+props           get
+category        GLES2.0
+
+name            QueryMatrixx
+return          GLbitfield
+param           mantissa        GLfixed *
+vector         mantissa        16
+param           exponent        GLint *
+vector         exponent        16
+props           get
+category        GLES1.1:OES_query_matrix
+
+# We don't support OES_get_program_binary yet either
+#name GetProgramBinary
+#return void
+#param          program         GLuint
+#param          bufSize         GLsizei
+#param          length          GLsizei *
+#param          binaryFormat    GLenum *
+#param          binary          GLvoid *
+#category       GLES2.0:OES_get_program_binary
+#
+#name           ProgramBinary
+#return         void
+#param          program         GLuint
+#param          binaryFormat    GLenum
+#param          binary          const GLvoid *
+#param          length          GLint
+#category       GLES2.0:OES_get_program_binary
diff --git a/src/mesa/es/main/apiutil.py b/src/mesa/es/main/apiutil.py
new file mode 100644 (file)
index 0000000..7fb1afc
--- /dev/null
@@ -0,0 +1,1117 @@
+
+# apiutil.py
+#
+# This file defines a bunch of utility functions for OpenGL API code
+# generation.
+
+import sys, string, re
+
+
+#======================================================================
+
+def CopyrightC( ):
+        print """/* Copyright (c) 2001, Stanford University
+        All rights reserved.
+
+        See the file LICENSE.txt for information on redistributing this software. */
+        """
+
+def CopyrightDef( ):
+        print """; Copyright (c) 2001, Stanford University
+        ; All rights reserved.
+        ;
+        ; See the file LICENSE.txt for information on redistributing this software.
+        """
+
+
+#======================================================================
+
+class APIFunction:
+        """Class to represent a GL API function (name, return type,
+        parameters, etc)."""
+        def __init__(self):
+                self.name = ''
+                self.returnType = ''
+                self.category = ''
+                self.categories = []
+                self.offset = -1
+                self.alias = ''
+                self.vectoralias = ''
+                self.convertalias = ''
+                self.aliasprefix = ''
+                self.params = []
+                self.paramlist = []
+                self.paramvec = []
+                self.paramaction = []
+                self.paramprop = []
+                self.paramset = []
+                self.props = []
+                self.chromium = []
+
+def FindParamIndex(params, paramName):
+        """Given a function record, find the index of a named parameter"""
+        for i in range (len(params)):
+                if paramName == params[i][0]:
+                        return i
+        # If we get here, there was no such parameter
+        return None
+
+def SetTupleIndex(tuple, index, value):
+        t = ()
+        for i in range(len(tuple)):
+                if i == index:
+                        t += (value,)
+                else:
+                        t += (tuple[i],)
+        return t
+
+def VersionSpecificValues(category, values):
+        selectedValues = []
+        for value in values:
+                # Version-specific values are prefixed with the version
+                # number, e.g. GLES1.0:GL_TEXTURE_CUBE_MAP_OES
+                splitValue = value.split(":")
+                if len(splitValue) == 2:
+                        if category != None and splitValue[0] != category:
+                                # Don't want this one.
+                                continue
+                        else:
+                                selectedValues.append(splitValue[1])
+                else:
+                        selectedValues.append(value)
+        return selectedValues
+
+def ProcessSpecFile(filename, userFunc, category = None):
+        """Open the named API spec file and call userFunc(record, category) for each record
+        processed."""
+        specFile = open(filename, "r")
+        if not specFile:
+                print >>sys.stderr, "Error: couldn't open %s file!" % filename
+                sys.exit()
+
+        record = APIFunction()
+
+        for line in specFile.readlines():
+
+                # split line into tokens
+                tokens = string.split(line)
+
+                if len(tokens) > 0 and line[0] != '#':
+
+                        if tokens[0] == 'name':
+                                if record.name != '':
+                                        # process the old function now
+                                        userFunc(record, category)
+                                        # reset the record
+                                        record = APIFunction()
+
+                                record.name = tokens[1]
+
+                        elif tokens[0] == 'return':
+                                record.returnType = string.join(tokens[1:], ' ')
+                        
+                        elif tokens[0] == 'param':
+                                name = tokens[1]
+                                type = string.join(tokens[2:], ' ')
+                                vecSize = 0
+                                record.params.append((name, type, vecSize, None, [], None))
+
+                        elif tokens[0] == 'paramprop':
+                                name = tokens[1]
+                                str = tokens[2:]
+                                enums = []
+                                for i in range(len(str)):
+                                        enums.append(str[i]) 
+                                record.paramprop.append((name, enums))
+
+                        elif tokens[0] == 'paramlist':
+                                name = tokens[1]
+                                str = tokens[2:]
+                                list = []
+                                for i in range(len(str)):
+                                        list.append(str[i]) 
+                                record.paramlist.append((name,list))
+
+                        elif tokens[0] == 'paramvec':
+                                name = tokens[1]
+                                str = tokens[2:]
+                                vec = []
+                                for i in range(len(str)):
+                                        vec.append(str[i]) 
+                                record.paramvec.append((name,vec))
+
+                        elif tokens[0] == 'paramset':
+                                line = tokens[1:]
+                                result = []
+                                for i in range(len(line)):
+                                        tset = line[i]
+                                        if tset == '[':
+                                                nlist = []
+                                        elif tset == ']':
+                                                result.append(nlist)
+                                                nlist = []
+                                        else:
+                                                nlist.append(tset)
+                                if result != []:
+                                        record.paramset.append(result)
+
+                        elif tokens[0] == 'paramaction':
+                                name = tokens[1]
+                                str = tokens[2:]
+                                list = []
+                                for i in range(len(str)):
+                                        list.append(str[i]) 
+                                record.paramaction.append((name,list))
+
+                        elif tokens[0] == 'category':
+                                record.category = tokens[1]
+                                record.categories = tokens[1:]
+
+                        elif tokens[0] == 'offset':
+                                if tokens[1] == '?':
+                                        record.offset = -2
+                                else:
+                                        record.offset = int(tokens[1])
+
+                        elif tokens[0] == 'alias':
+                                record.alias = tokens[1]
+
+                        elif tokens[0] == 'vectoralias':
+                                record.vectoralias = tokens[1]
+
+                        elif tokens[0] == 'convertalias':
+                                record.convertalias = tokens[1]
+
+                        elif tokens[0] == 'aliasprefix':
+                                record.aliasprefix = tokens[1]
+
+                        elif tokens[0] == 'props':
+                                record.props = tokens[1:]
+
+                        elif tokens[0] == 'chromium':
+                                record.chromium = tokens[1:]
+
+                        elif tokens[0] == 'vector':
+                                vecName = tokens[1]
+                                vecSize = int(tokens[2])
+                                index = FindParamIndex(record.params, vecName)
+                                if index == None:
+                                        print >>sys.stderr, "Can't find vector '%s' for function '%s'" % (vecName, record.name)
+                                # Adjust just the vector size
+                                record.params[index] = SetTupleIndex(record.params[index], 2, vecSize)
+
+                        elif tokens[0] == 'dependentvector':
+                                dependentVecName = tokens[1]
+                                # the dependentVecSize may be an int
+                                # expression
+                                dependentVecSize = tokens[2]
+                                controllingParam = tokens[3]
+                                controllingParamIndex = FindParamIndex(record.params, controllingParam)
+                                if controllingParamIndex == None:
+                                        print >>sys.stderr, "Can't find controlling param '%s' for function '%s'" % (controllingParam, record.name)
+                                controllingValues = tokens[4:]
+
+                                # Remember that all of the controllingValues
+                                # are valid values for the controllingParam.
+                                # We may be duplicating controllingValues
+                                # here (i.e. if we get them from different
+                                # places); we'll sort them out later.
+                                validValues = record.params[controllingParamIndex][4]
+                                for value in VersionSpecificValues(category, controllingValues):
+                                        validValues.append((value, dependentVecSize, dependentVecName, [], None, None))
+                                # Don't need to reassign validValues back
+                                # to the tuple - it's a shallow pointer,
+                                # so the tuple is already modified.  
+                                # (And attempting to do so would produce an
+                                # error anyway.)
+
+                        elif tokens[0] == "dependentnovalueconvert":
+                                paramName = tokens[1]
+                                controllingParamName = tokens[2]
+                                controllingValues = tokens[3:]
+
+                                controllingParamIndex = FindParamIndex(record.params, controllingParamName)
+                                if controllingParamIndex == None:
+                                        print >>sys.stderr, "Can't find controlling param '%s' for function '%s'" % (controllingParamName, record.name)
+
+                                validValues = record.params[controllingParamIndex][4]
+                                for value in VersionSpecificValues(category, controllingValues):
+                                        validValues.append((value, None, None, [], None, "noconvert"))
+
+
+
+                        elif tokens[0] == 'checkparam':
+                                paramName = tokens[1]
+                                values = tokens[2:]
+                                paramIndex = FindParamIndex(record.params, paramName)
+                                if paramIndex == None:
+                                        print >>sys.stderr, "Can't find checked param '%s' for function '%s'" % (paramName, record.name)
+
+                                errorCode = None
+
+                                # We may be duplicating valid values here;
+                                # just add all values to the existing
+                                # record, and we'll prune out duplicates
+                                # later
+                                validValues = record.params[paramIndex][4]
+
+                                # A /GL_* value represents an error, not
+                                # a real value.  Look through the values
+                                # and only append the non-error values.
+                                for v in VersionSpecificValues(category, values):
+                                        if v[0] == "/":
+                                                errorCode = v[1:]
+                                        else:
+                                            validValues.append((v, None, None, [], errorCode, None))
+                                # Don't need to reassign validValues back
+                                # to the parameter tuple - it's a shallow pointer,
+                                # so the tuple is already modified.  
+                                # (And attempting to do so would produce an
+                                # error anyway.)
+
+                        elif tokens[0] == 'checkdependentparam':
+                                paramName = tokens[1]
+                                controllingValue = tokens[2]
+                                dependentParamName = tokens[3]
+                                validDependentValues = tokens[4:]
+                                errorCode = None
+
+                                # A /GL_* value represents an error, not
+                                # a real value.  Look through the values
+                                # and only append the non-error values.
+                                validDependentValues = []
+                                for v in tokens[4:]:
+                                        if v[0] == "/":
+                                                errorCode = v[1:]
+                                        else:
+                                            validDependentValues.append(v)
+
+                                paramIndex = FindParamIndex(record.params, paramName)
+                                if paramIndex == None:
+                                        print >>sys.stderr, "Can't find dependent param '%s' for function '%s'" % (paramName, record.name)
+
+                                validValues = record.params[paramIndex][4]
+                                # We may be duplicating valid values here;
+                                # we'll sort them out later.  Avoid
+                                # adding a controlling value record
+                                # at all if there are no values
+                                # in the list of values (so that
+                                # controlling values with only
+                                # version-specific values listed
+                                # end up as version-specific
+                                # themselves).
+                                versionSpecificValues = VersionSpecificValues(category, validDependentValues)
+                                if versionSpecificValues != []:
+                                        validValues.append((controllingValue, None, dependentParamName, versionSpecificValues, errorCode, None))
+                                # Don't need to reassign validValues back
+                                # to the tuple - it's a shallow pointer,
+                                # so the tuple is already modified.  
+                                # (And attempting to do so would produce an
+                                # error anyway.)
+
+                        elif tokens[0] == 'convertparams':
+                                convertToType = tokens[1]
+                                # Replace the conversion type in each named
+                                # parameter
+                                for paramName in tokens[2:]:
+                                        paramIndex = FindParamIndex(record.params, paramName)
+                                        if paramIndex == None:
+                                            print >>sys.stderr, "Can't find converted param '%s' for function '%s'" % (paramName, record.name)
+                                        # Tuples don't support item assignment,
+                                        # so to replace scalar values in a
+                                        # tuple, you have to reassign the
+                                        # whole friggin' thing.
+                                        record.params[paramIndex] = SetTupleIndex(record.params[paramIndex], 3, convertToType)
+
+                        else:
+                                print >>sys.stderr, 'Invalid token %s after function %s' % (tokens[0], record.name)
+                        #endif
+                #endif
+        #endfor
+
+        # Call the user function for the last record, if we still have one
+        # lying around nearly finished
+        if record.name != '':
+                # process the function now
+                userFunc(record, category)
+        specFile.close()
+#enddef
+
+
+# Dictionary [name] of APIFunction:
+__FunctionDict = {}
+
+# Dictionary [name] of name
+__VectorVersion = {}
+
+# Reverse mapping of function name aliases
+__ReverseAliases = {}
+
+def CheckCategories(category, categories):
+    for c in categories:
+        if category == c.split(":")[0]:
+            return 1
+
+    return 0
+
+def AddFunction(record, category):
+        # If there is a category, we only want records from that category.
+        # Note that a category may be in the form "GLES1.1:OES_extension_name",
+        # which means that the function is supported as an extension in 
+        # GLES1.1...
+        if category and not CheckCategories(category, record.categories):
+                return
+
+        # Don't allow duplicates
+        if __FunctionDict.has_key(record.name):
+                print >>sys.stderr, "Duplicate record name '%s' ignored" % record.name
+                return
+
+        # Clean up a bit.  We collected valid values for parameters
+        # on the fly; it's quite possible that there are duplicates.
+        # If there are, collect them together.
+        # 
+        # We're also going to keep track of all the dependent values
+        # that can show up for a parameter; the number of GLenum values
+        # (identified with a prefixed "GL_") affects how parameter
+        # value conversion happens, as GLenum values are not scaled
+        # when converted to or from GLfixed values, the way integer
+        # and floating point values are.
+        paramValueConversion = {}
+
+        for i in range(len(record.params)):
+                foundValidValues = {}
+
+                (name, type, maxVecSize, convertToType, validValues, valueConversion) = record.params[i]
+                for (controllingValue, vecSize, dependentParamName, dependentValues, errorCode, valueConvert) in validValues:
+                        # Keep track of the maximum vector size for the
+                        # *dependent* parameter, not for the controlling
+                        # parameter.  Note that the dependent parameter
+                        # may be an expression - in this case, don't
+                        # consider it.
+                        if dependentParamName != None and vecSize != None and vecSize.isdigit():
+                                dependentParamIndex = FindParamIndex(record.params, dependentParamName)
+                                if dependentParamIndex == None:
+                                        print >>sys.stderr, "Couldn't find dependent parameter '%s' of function '%s'" % (dependentParamName, record.name)
+                                (dName, dType, dMaxVecSize, dConvert, dValid, dValueConversion) = record.params[dependentParamIndex]
+                                if dMaxVecSize == None or int(vecSize) > dMaxVecSize:
+                                        dMaxVecSize = int(vecSize)
+                                        record.params[dependentParamIndex] = (dName, dType, dMaxVecSize, dConvert, dValid, dValueConversion)
+
+                        # Make sure an entry for the controlling value
+                        # exists in the foundValidValues dictionary
+                        if controllingValue in foundValidValues:
+                                # The value was already there.  Merge the
+                                # two together, giving errors if needed.
+                                (oldControllingValue, oldVecSize, oldDependentParamName, oldDependentValues, oldErrorCode, oldValueConvert) = foundValidValues[controllingValue]
+
+                                # Make sure the vector sizes are compatible;
+                                # either one should be None (and be 
+                                # overridden by the other), or they should
+                                # match exactly.  If one is not an
+                                # integer (this can happen if the 
+                                # dependent value is an integer expression,
+                                # which occurs a couple of times), don't
+                                # use it.
+                                if oldVecSize == None:
+                                        oldVecSize = vecSize
+                                elif vecSize != None and vecSize != oldVecSize:
+                                        print >>sys.stderr, "Found two different vector sizes (%s and %s) for the same controlling value '%s' of the same parameter '%s' of function '%s'" % (oldVecSize, vecSize, controllingValue, name, record.name)
+
+                                # Same for the dependent parameter name.
+                                if oldDependentParamName == None:
+                                        oldDependentParamName = dependentParamName
+                                elif dependentParamName != None and dependentParamName != oldDependentParamName:
+                                        print >>sys.stderr, "Found two different dependent parameter names (%s and %s) for the same controlling value '%s' of the same parameter '%s' of function '%s'" % (oldDependentParamName, dependentParamName, controllingValue, name, record.name)
+
+                                # And for the error code.
+                                if oldErrorCode == None:
+                                        oldErrorCode = errorCode
+                                elif errorCode != None and errorCode != oldErrorCode:
+                                        print >>sys.stderr, "Found two different error codes(%s and %s) for the same controlling value '%s' of the same parameter '%s' of function '%s'" % (oldErrorCode, errorCode, controllingValue, name, record.name)
+
+                                # And for the value conversion flag
+                                if oldValueConvert == None:
+                                        oldValueConvert = valueConvert
+                                elif valueConvert != None and valueConvert != oldValueConvert:
+                                        print >>sys.stderr, "Found two different value conversions(%s and %s) for the same controlling value '%s' of the same parameter '%s' of function '%s'" % (oldValueConvert, valueConvert, controllingValue, name, record.name)
+
+                                # Combine the dependentValues together
+                                # directly, but uniquely
+                                for value in dependentValues:
+                                        if value not in oldDependentValues:
+                                                oldDependentValues.append(value)
+
+                                # Stick the combined value back into the
+                                # dictionary.  We'll sort it back to the
+                                # array later.
+                                foundValidValues[oldControllingValue] = (oldControllingValue, oldVecSize, oldDependentParamName, oldDependentValues, oldErrorCode, oldValueConvert)
+                        else: # new controlling value
+                                # Just add it to the dictionary so we don't
+                                # add the same value more than once.
+                                foundValidValues[controllingValue] = (controllingValue, vecSize, dependentParamName, dependentValues, errorCode, valueConvert)
+                        # endif a new controlling value
+
+                # endfor all valid values for this parameter
+
+                # Now the foundValidValues[] dictionary holds all the
+                # pruned values (at most one for each valid value).
+                # But the validValues[] array still holds the order,
+                # which we want to maintain.  Go through the validValues
+                # array just for the names of the controlling values; 
+                # add any uncopied values to the prunedValidValues array.
+                prunedValidValues = []
+
+                for (controllingValue, vecSize, dependentParamName, dependentValues, errorCode, valueConvert) in validValues:
+                        if controllingValue in foundValidValues:
+                                prunedValidValues.append(foundValidValues[controllingValue])
+                                # Delete it from the dictionary so it isn't
+                                # copied again.
+                                del foundValidValues[controllingValue]
+
+                # Each parameter that is being converted may have a
+                # subset of values that are GLenums and are never
+                # converted.  In some cases, the parameter will 
+                # be implicitly determined to be such, by examining
+                # the listed possible values and determining for
+                # any particular controlling value whether there are
+                # any GLenum-valued allowed values.
+                #
+                # In other cases, the parameter will be explicitly
+                # marked as such with the "dependentnovalueconvert" flag;
+                # this is the way it has to be done with queries (which
+                # cannot list a valid list of values to be passed,
+                # because values are returned, not passed).
+                #
+                # For each value of controlling GLenum, we'll also
+                # need to know whether its dependent values are
+                # always converted (none of its values require
+                # GLenums to be passed in dependent parameters),
+                # never converted (all of its values require GLenums),
+                # or sometimes converted.
+                numNoConvertValues = 0
+                allDependentParams = []
+                for j in range(len(prunedValidValues)):
+                        (controllingValue, vecSize, dependentParamName, dependentValues, errorCode, valueConvert) = prunedValidValues[j]
+                        if dependentParamName != None and dependentParamName not in allDependentParams:
+                                allDependentParams.append(dependentParamName)
+
+                        # Check for an explicit noconvert marking...
+                        if valueConvert == "noconvert":
+                                numNoConvertValues += 1
+                        else:
+                                # Or check for an implicit one.
+                                for value in dependentValues:
+                                        if value[0:3] == "GL_":
+                                                valueConvert = "noconvert"
+                                                prunedValidValues[j] = (controllingValue, vecSize, dependentParamName, dependentValues, errorCode, valueConvert)
+                                                numNoConvertValues += 1
+                                                break
+
+                # For each named dependent param, set the value conversion
+                # flag based on whether all values, none, or some need
+                # value conversion.  This value is set stepwise
+                # for each parameter examined - 
+                for dp in allDependentParams:
+                        if numNoConvertValues == 0:
+                                if not paramValueConversion.has_key(dp):
+                                        paramValueConversion[dp] = "all"
+                                elif paramValueConversion[dp] == "none":
+                                        paramValueConversion[dp] = "some"
+                        elif numNoConvertValues == len(prunedValidValues):
+                                if not paramValueConversion.has_key(dp):
+                                        paramValueConversion[dp] = "none"
+                                elif paramValueConversion[dp] == "all":
+                                        paramValueConversion[dp] = "some"
+                        else:
+                                paramValueConversion[dp] = "some"
+
+                # Save away the record.  Save a placeholder in the
+                # valueConversion field - we can't set that until we've
+                # examined all the parameters.
+                record.params[i] = (name, type, maxVecSize, convertToType, prunedValidValues, None)
+
+        # endfor each param of the passed-in function record
+
+        # One more pass: for each parameter, if it is a parameter that
+        # needs conversion, save its value conversion type ("all", "none",
+        # or "some").  We only have to worry about conditional value 
+        # conversion for GLfixed parameters; in all other cases, we
+        # either don't convert at all (for non-converting parameters) or
+        # we convert everything.
+        for i in range(len(record.params)):
+                (name, type, maxVecSize, convertToType, validValues, valueConversion) = record.params[i]
+                if convertToType == None:
+                    valueConversion = None
+                elif paramValueConversion.has_key(name):
+                    valueConversion = paramValueConversion[name]
+                else:
+                    valueConversion = "all"
+
+                record.params[i] = (name, type, maxVecSize, convertToType, validValues, valueConversion)
+                                        
+        # We're done cleaning up!
+        # Add the function to the permanent record and we're done.
+        __FunctionDict[record.name] = record
+
+
+def GetFunctionDict(specFile = "", category = None):
+        if not specFile:
+                specFile = "../glapi_parser/APIspec.txt"
+        if len(__FunctionDict) == 0:
+                ProcessSpecFile(specFile, AddFunction, category)
+                # Look for vector aliased functions
+                for func in __FunctionDict.keys():
+                        va = __FunctionDict[func].vectoralias
+                        if va != '':
+                                __VectorVersion[va] = func
+                        #endif
+
+                        # and look for regular aliases (for glloader)
+                        a = __FunctionDict[func].alias
+                        if a:
+                                __ReverseAliases[a] = func
+                        #endif
+                #endfor
+        #endif
+        return __FunctionDict
+
+
+def GetAllFunctions(specFile = "", category = None):
+        """Return sorted list of all functions known to Chromium."""
+        d = GetFunctionDict(specFile, category)
+        funcs = []
+        for func in d.keys():
+                rec = d[func]
+                if not "omit" in rec.chromium:
+                        funcs.append(func)
+        funcs.sort()
+        return funcs
+        
+
+def GetDispatchedFunctions(specFile = "", category = None):
+        """Return sorted list of all functions handled by SPU dispatch table."""
+        d = GetFunctionDict(specFile, category)
+        funcs = []
+        for func in d.keys():
+                rec = d[func]
+                if (not "omit" in rec.chromium and
+                        not "stub" in rec.chromium and
+                        rec.alias == ''):
+                        funcs.append(func)
+        funcs.sort()
+        return funcs
+
+#======================================================================
+
+def ReturnType(funcName):
+        """Return the C return type of named function.
+        Examples: "void" or "const GLubyte *". """
+        d = GetFunctionDict()
+        return d[funcName].returnType
+
+
+def Parameters(funcName):
+        """Return list of tuples (name, type, vecSize) of function parameters.
+        Example: if funcName=="ClipPlane" return
+        [ ("plane", "GLenum", 0), ("equation", "const GLdouble *", 4) ] """
+        d = GetFunctionDict()
+        return d[funcName].params
+
+def ParamAction(funcName):
+        """Return list of names of actions for testing.
+        For PackerTest only."""
+        d = GetFunctionDict()
+        return d[funcName].paramaction
+
+def ParamList(funcName):
+        """Return list of tuples (name, list of values) of function parameters.
+        For PackerTest only."""
+        d = GetFunctionDict()
+        return d[funcName].paramlist
+
+def ParamVec(funcName):
+        """Return list of tuples (name, vector of values) of function parameters.
+        For PackerTest only."""
+        d = GetFunctionDict()
+        return d[funcName].paramvec
+
+def ParamSet(funcName):
+        """Return list of tuples (name, list of values) of function parameters.
+        For PackerTest only."""
+        d = GetFunctionDict()
+        return d[funcName].paramset
+
+
+def Properties(funcName):
+        """Return list of properties of the named GL function."""
+        d = GetFunctionDict()
+        return d[funcName].props
+
+def AllWithProperty(property):
+        """Return list of functions that have the named property."""
+        funcs = []
+        for funcName in GetDispatchedFunctions():
+                if property in Properties(funcName):
+                        funcs.append(funcName)
+        return funcs
+
+def Category(funcName):
+        """Return the primary category of the named GL function."""
+        d = GetFunctionDict()
+        return d[funcName].category
+
+def Categories(funcName):
+        """Return all the categories of the named GL function."""
+        d = GetFunctionDict()
+        return d[funcName].categories
+
+def ChromiumProps(funcName):
+        """Return list of Chromium-specific properties of the named GL function."""
+        d = GetFunctionDict()
+        return d[funcName].chromium
+
+def ParamProps(funcName):
+        """Return list of Parameter-specific properties of the named GL function."""
+        d = GetFunctionDict()
+        return d[funcName].paramprop
+
+def Alias(funcName):
+        """Return the function that the named function is an alias of.
+        Ex: Alias('DrawArraysEXT') = 'DrawArrays'.
+        """
+        d = GetFunctionDict()
+        return d[funcName].alias
+
+def AliasPrefix(funcName):
+        """Return the function that the named function is an alias of.
+        Ex: Alias('DrawArraysEXT') = 'DrawArrays'.
+        """
+        d = GetFunctionDict()
+        if d[funcName].aliasprefix == '':
+            return "_mesa_"
+        else:
+            return d[funcName].aliasprefix
+
+def ReverseAlias(funcName):
+        """Like Alias(), but the inverse."""
+        d = GetFunctionDict()
+        if funcName in __ReverseAliases.keys():
+                return __ReverseAliases[funcName]
+        else:
+                return ''
+
+def NonVectorFunction(funcName):
+        """Return the non-vector version of the given function, or ''.
+        For example: NonVectorFunction("Color3fv") = "Color3f"."""
+        d = GetFunctionDict()
+        return d[funcName].vectoralias
+
+def ConversionFunction(funcName):
+        """Return a function that can be used to implement the
+        given function, using different types.
+        For example: ConvertedFunction("Color4x") = "Color4f"."""
+        d = GetFunctionDict()
+        return d[funcName].convertalias
+
+def VectorFunction(funcName):
+        """Return the vector version of the given non-vector-valued function,
+        or ''.
+        For example: VectorVersion("Color3f") = "Color3fv"."""
+        d = GetFunctionDict()
+        if funcName in __VectorVersion.keys():
+                return __VectorVersion[funcName]
+        else:
+                return ''
+
+def GetCategoryWrapper(func_name):
+        """Return a C preprocessor token to test in order to wrap code.
+        This handles extensions.
+        Example: GetTestWrapper("glActiveTextureARB") = "CR_multitexture"
+        Example: GetTestWrapper("glBegin") = ""
+        """
+        cat = Category(func_name)
+        if (cat == "1.0" or
+                cat == "1.1" or
+                cat == "1.2" or
+                cat == "Chromium" or
+                cat == "GL_chromium"):
+                return ''
+        elif cat[0] =='1':
+                # i.e. OpenGL 1.3 or 1.4 or 1.5
+                return "OPENGL_VERSION_" + string.replace(cat, ".", "_")
+        else:
+                assert cat != ''
+                return string.replace(cat, "GL_", "")
+
+
+def CanCompile(funcName):
+        """Return 1 if the function can be compiled into display lists, else 0."""
+        props = Properties(funcName)
+        if ("nolist" in props or
+                "get" in props or
+                "setclient" in props):
+                return 0
+        else:
+                return 1
+
+def HasChromiumProperty(funcName, propertyList):
+        """Return 1 if the function or any alias has any property in the
+        propertyList"""
+        for funcAlias in [funcName, NonVectorFunction(funcName), VectorFunction(funcName)]:
+                if funcAlias:
+                        props = ChromiumProps(funcAlias)
+                        for p in propertyList:
+                                if p in props:
+                                        return 1
+        return 0
+
+def CanPack(funcName):
+        """Return 1 if the function can be packed, else 0."""
+        return HasChromiumProperty(funcName, ['pack', 'extpack', 'expandpack'])
+
+def HasPackOpcode(funcName):
+        """Return 1 if the function has a true pack opcode"""
+        return HasChromiumProperty(funcName, ['pack', 'extpack'])
+
+def SetsState(funcName):
+        """Return 1 if the function sets server-side state, else 0."""
+        props = Properties(funcName)
+
+        # Exceptions.  The first set of these functions *do* have 
+        # server-side state-changing  effects, but will be missed 
+        # by the general query, because they either render (e.g. 
+        # Bitmap) or do not compile into display lists (e.g. all the others).
+        # 
+        # The second set do *not* have server-side state-changing
+        # effects, despite the fact that they do not render
+        # and can be compiled.  They are control functions
+        # that are not trackable via state.
+        if funcName in ['Bitmap', 'DeleteTextures', 'FeedbackBuffer', 
+                'RenderMode', 'BindBufferARB', 'DeleteFencesNV']:
+                return 1
+        elif funcName in ['ExecuteProgramNV']:
+                return 0
+
+        # All compilable functions that do not render and that do
+        # not set or use client-side state (e.g. DrawArrays, et al.), set
+        # server-side state.
+        if CanCompile(funcName) and "render" not in props and "useclient" not in props and "setclient" not in props:
+                return 1
+
+        # All others don't set server-side state.
+        return 0
+
+def SetsClientState(funcName):
+        """Return 1 if the function sets client-side state, else 0."""
+        props = Properties(funcName)
+        if "setclient" in props:
+                return 1
+        return 0
+
+def SetsTrackedState(funcName):
+        """Return 1 if the function sets state that is tracked by
+        the state tracker, else 0."""
+        # These functions set state, but aren't tracked by the state
+        # tracker for various reasons: 
+        # - because the state tracker doesn't manage display lists
+        #   (e.g. CallList and CallLists)
+        # - because the client doesn't have information about what
+        #   the server supports, so the function has to go to the
+        #   server (e.g. CompressedTexImage calls)
+        # - because they require a round-trip to the server (e.g.
+        #   the CopyTexImage calls, SetFenceNV, TrackMatrixNV)
+        if funcName in [
+                'CopyTexImage1D', 'CopyTexImage2D',
+                'CopyTexSubImage1D', 'CopyTexSubImage2D', 'CopyTexSubImage3D',
+                'CallList', 'CallLists',
+                'CompressedTexImage1DARB', 'CompressedTexSubImage1DARB',
+                'CompressedTexImage2DARB', 'CompressedTexSubImage2DARB',
+                'CompressedTexImage3DARB', 'CompressedTexSubImage3DARB',
+                'SetFenceNV'
+                ]:
+                return 0
+
+        # Anything else that affects client-side state is trackable.
+        if SetsClientState(funcName):
+                return 1
+
+        # Anything else that doesn't set state at all is certainly
+        # not trackable.
+        if not SetsState(funcName):
+                return 0
+
+        # Per-vertex state isn't tracked the way other state is
+        # tracked, so it is specifically excluded.
+        if "pervertex" in Properties(funcName):
+                return 0
+
+        # Everything else is fine
+        return 1
+
+def UsesClientState(funcName):
+        """Return 1 if the function uses client-side state, else 0."""
+        props = Properties(funcName)
+        if "pixelstore" in props or "useclient" in props:
+                return 1
+        return 0
+
+def IsQuery(funcName):
+        """Return 1 if the function returns information to the user, else 0."""
+        props = Properties(funcName)
+        if "get" in props:
+                return 1
+        return 0
+
+def FuncGetsState(funcName):
+        """Return 1 if the function gets GL state, else 0."""
+        d = GetFunctionDict()
+        props = Properties(funcName)
+        if "get" in props:
+                return 1
+        else:
+                return 0
+
+def IsPointer(dataType):
+        """Determine if the datatype is a pointer.  Return 1 or 0."""
+        if string.find(dataType, "*") == -1:
+                return 0
+        else:
+                return 1
+
+
+def PointerType(pointerType):
+        """Return the type of a pointer.
+        Ex: PointerType('const GLubyte *') = 'GLubyte'
+        """
+        t = string.split(pointerType, ' ')
+        if t[0] == "const":
+                t[0] = t[1]
+        return t[0]
+
+
+
+
+def OpcodeName(funcName):
+        """Return the C token for the opcode for the given function."""
+        return "CR_" + string.upper(funcName) + "_OPCODE"
+
+
+def ExtendedOpcodeName(funcName):
+        """Return the C token for the extended opcode for the given function."""
+        return "CR_" + string.upper(funcName) + "_EXTEND_OPCODE"
+
+
+
+
+#======================================================================
+
+def MakeCallString(params):
+        """Given a list of (name, type, vectorSize) parameters, make a C-style
+        formal parameter string.
+        Ex return: 'index, x, y, z'.
+        """
+        result = ''
+        i = 1
+        n = len(params)
+        for (name, type, vecSize, convertToType, validValues, valueConversion) in params:
+                result += name
+                if i < n:
+                        result = result + ', '
+                i += 1
+        #endfor
+        return result
+#enddef
+
+
+def MakeDeclarationString(params):
+        """Given a list of (name, type, vectorSize) parameters, make a C-style
+        parameter declaration string.
+        Ex return: 'GLuint index, GLfloat x, GLfloat y, GLfloat z'.
+        """
+        n = len(params)
+        if n == 0:
+                return 'void'
+        else:
+                result = ''
+                i = 1
+                for (name, type, vecSize, convertToType, validValues, valueConversion) in params:
+                        result = result + type + ' ' + name
+                        if i < n:
+                                result = result + ', '
+                        i += 1
+                #endfor
+                return result
+        #endif
+#enddef
+
+
+def MakePrototypeString(params):
+        """Given a list of (name, type, vectorSize) parameters, make a C-style
+        parameter prototype string (types only).
+        Ex return: 'GLuint, GLfloat, GLfloat, GLfloat'.
+        """
+        n = len(params)
+        if n == 0:
+                return 'void'
+        else:
+                result = ''
+                i = 1
+                for (name, type, vecSize, convertToType, validValues, valueConversion) in params:
+                        result = result + type
+                        # see if we need a comma separator
+                        if i < n:
+                                result = result + ', '
+                        i += 1
+                #endfor
+                return result
+        #endif
+#enddef
+
+
+#======================================================================
+        
+__lengths = {
+        'GLbyte': 1,
+        'GLubyte': 1,
+        'GLshort': 2,
+        'GLushort': 2,
+        'GLint': 4,
+        'GLuint': 4,
+        'GLfloat': 4,
+        'GLclampf': 4,
+        'GLdouble': 8,
+        'GLclampd': 8,
+        'GLenum': 4,
+        'GLboolean': 1,
+        'GLsizei': 4,
+        'GLbitfield': 4,
+        'void': 0,  # XXX why?
+        'int': 4,
+        'GLintptrARB': 4,   # XXX or 8 bytes?
+        'GLsizeiptrARB': 4  # XXX or 8 bytes?
+}
+
+def sizeof(type):
+        """Return size of C datatype, in bytes."""
+        if not type in __lengths.keys():
+                print >>sys.stderr, "%s not in lengths!" % type
+        return __lengths[type]
+
+
+#======================================================================
+align_types = 1
+
+def FixAlignment( pos, alignment ):
+        # if we want double-alignment take word-alignment instead,
+        # yes, this is super-lame, but we know what we are doing
+        if alignment > 4:
+                alignment = 4
+        if align_types and alignment and ( pos % alignment ):
+                pos += alignment - ( pos % alignment )
+        return pos
+
+def WordAlign( pos ):
+        return FixAlignment( pos, 4 )
+
+def PointerSize():
+        return 8 # Leave room for a 64 bit pointer
+
+def PacketLength( params ):
+        len = 0
+        for (name, type, vecSize, convertToType, validValues, valueConversion) in params:
+                if IsPointer(type):
+                        size = PointerSize()
+                else:
+                        assert string.find(type, "const") == -1
+                        size = sizeof(type)
+                len = FixAlignment( len, size ) + size
+        len = WordAlign( len )
+        return len
+
+#======================================================================
+
+__specials = {}
+
+def LoadSpecials( filename ):
+        table = {}
+        try:
+                f = open( filename, "r" )
+        except:
+                __specials[filename] = {}
+                print >>sys.stderr, "%s not present" % filename
+                return {}
+        
+        for line in f.readlines():
+                line = string.strip(line)
+                if line == "" or line[0] == '#':
+                        continue
+                table[line] = 1
+        
+        __specials[filename] = table
+        return table
+
+
+def FindSpecial( filename, glName ):
+        table = {}
+        try:
+                table = __specials[filename]
+        except KeyError:
+                table = LoadSpecials( filename )
+        
+        try:
+                if (table[glName] == 1):
+                        return 1
+                else:
+                        return 0 #should never happen
+        except KeyError:
+                return 0
+
+
+def AllSpecials( table_file ):
+        table = {}
+        filename = table_file + "_special"
+        try:
+                table = __specials[filename]
+        except KeyError:
+                table = LoadSpecials( filename )
+        
+        keys = table.keys()
+        keys.sort()
+        return keys
+
+
+def AllSpecials( table_file ):
+        filename = table_file + "_special"
+        table = {}
+        try:
+                table = __specials[filename]
+        except KeyError:
+                table = LoadSpecials(filename)
+        
+        ret = table.keys()
+        ret.sort()
+        return ret
+        
+
+def NumSpecials( table_file ):
+        filename = table_file + "_special"
+        table = {}
+        try:
+                table = __specials[filename]
+        except KeyError:
+                table = LoadSpecials(filename)
+        return len(table.keys())
+
+def PrintRecord(record):
+        argList = MakeDeclarationString(record.params)
+        if record.category == "Chromium":
+                prefix = "cr"
+        else:
+                prefix = "gl"
+        print '%s %s%s(%s);' % (record.returnType, prefix, record.name, argList )
+        if len(record.props) > 0:
+                print '   /* %s */' % string.join(record.props, ' ')
+
+#ProcessSpecFile("APIspec.txt", PrintRecord)
+
diff --git a/src/mesa/es/main/es1_special b/src/mesa/es/main/es1_special
new file mode 100644 (file)
index 0000000..4cc97c3
--- /dev/null
@@ -0,0 +1,8 @@
+# GetString is always special.
+GetString
+# CompressedTexImage2D calls out to two different functions based on
+# whether the image is a paletted image or not
+CompressedTexImage2D
+# QueryMatrixx returns values in an unusual, decomposed, fixed-value
+# form; it has its own code for this
+QueryMatrixx
diff --git a/src/mesa/es/main/es2_special b/src/mesa/es/main/es2_special
new file mode 100644 (file)
index 0000000..8de76a3
--- /dev/null
@@ -0,0 +1,5 @@
+# GetString must always have its own implementation, so we return our
+# implementation values instead of Mesa's.
+GetString
+CompressedTexImage2D
+RenderbufferStorage
diff --git a/src/mesa/es/main/es_cpaltex.c b/src/mesa/es/main/es_cpaltex.c
new file mode 100644 (file)
index 0000000..0d6f741
--- /dev/null
@@ -0,0 +1,240 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+/**
+ * Code to convert compressed/paletted texture images to ordinary 4-byte RGBA.
+ * See the GL_OES_compressed_paletted_texture spec at
+ * http://khronos.org/registry/gles/extensions/OES/OES_compressed_paletted_texture.txt
+ */
+
+
+#include <stdlib.h>
+#include <assert.h>
+#include "GLES/gl.h"
+#include "GLES/glext.h"
+
+
+void GL_APIENTRY _es_CompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+
+void GL_APIENTRY _mesa_TexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+void GL_APIENTRY _mesa_CompressedTexImage2DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+
+
+static const struct {
+   GLenum format;
+   GLuint palette_size;
+   GLuint size;
+} formats[] = {
+   { GL_PALETTE4_RGB8_OES,      16, 3 },
+   { GL_PALETTE4_RGBA8_OES,     16, 4 },
+   { GL_PALETTE4_R5_G6_B5_OES,  16, 2 },
+   { GL_PALETTE4_RGBA4_OES,     16, 2 },
+   { GL_PALETTE4_RGB5_A1_OES,   16, 2 },
+   { GL_PALETTE8_RGB8_OES,     256, 3 },
+   { GL_PALETTE8_RGBA8_OES,    256, 4 },
+   { GL_PALETTE8_R5_G6_B5_OES, 256, 2 },
+   { GL_PALETTE8_RGBA4_OES,    256, 2 },
+   { GL_PALETTE8_RGB5_A1_OES,  256, 2 }
+};
+
+
+/**
+ * Get a color/entry from the palette.  Convert to GLubyte/RGBA format.
+ */
+static void
+get_palette_entry(GLenum format, const void *palette, GLuint index,
+                  GLubyte rgba[4])
+{
+   switch (format) {
+   case GL_PALETTE4_RGB8_OES:
+   case GL_PALETTE8_RGB8_OES:
+      {
+         const GLubyte *pal = (const GLubyte *) palette;
+         rgba[0] = pal[index * 3 + 0];
+         rgba[1] = pal[index * 3 + 1];
+         rgba[2] = pal[index * 3 + 2];
+         rgba[3] = 255;
+      }
+      break;
+   case GL_PALETTE4_RGBA8_OES:
+   case GL_PALETTE8_RGBA8_OES:
+      {
+         const GLubyte *pal = (const GLubyte *) palette;
+         rgba[0] = pal[index * 4 + 0];
+         rgba[1] = pal[index * 4 + 1];
+         rgba[2] = pal[index * 4 + 2];
+         rgba[3] = pal[index * 4 + 3];
+      }
+      break;
+   case GL_PALETTE4_R5_G6_B5_OES:
+   case GL_PALETTE8_R5_G6_B5_OES:
+      {
+         const GLushort *pal = (const GLushort *) palette;
+         const GLushort color = pal[index];
+         rgba[0] = ((color >> 8) & 0xf8) | ((color >> 11) & 0x3);
+         rgba[1] = ((color >> 3) & 0xfc) | ((color >> 1 ) & 0x3);
+         rgba[2] = ((color << 3) & 0xf8) | ((color      ) & 0x7);
+         rgba[3] = 255;
+      }
+      break;
+   case GL_PALETTE4_RGBA4_OES:
+   case GL_PALETTE8_RGBA4_OES:
+      {
+         const GLushort *pal = (const GLushort *) palette;
+         const GLushort color = pal[index];
+         rgba[0] = ((color & 0xf000) >> 8) | ((color & 0xf000) >> 12);
+         rgba[1] = ((color & 0x0f00) >> 4) | ((color & 0x0f00) >>  8);
+         rgba[2] = ((color & 0x00f0)     ) | ((color & 0x00f0) >>  4);
+         rgba[3] = ((color & 0x000f) << 4) | ((color & 0x000f)      );
+      }
+      break;
+   case GL_PALETTE4_RGB5_A1_OES:
+   case GL_PALETTE8_RGB5_A1_OES:
+      {
+         const GLushort *pal = (const GLushort *) palette;
+         const GLushort color = pal[index];
+         rgba[0] = ((color >> 8) & 0xf8) | ((color >> 11) & 0x7);
+         rgba[1] = ((color >> 3) & 0xf8) | ((color >>  6) & 0x7);
+         rgba[2] = ((color << 2) & 0xf8) | ((color >>  1) & 0x7);
+         rgba[3] = (color & 0x1) * 255;
+      }
+      break;
+   default:
+      assert(0);
+   }
+}
+
+
+/**
+ * Convert paletted texture to simple GLubyte/RGBA format.
+ */
+static void
+paletted_to_rgba(GLenum src_format,
+                 const void *palette,
+                 const void *indexes,
+                 GLsizei width, GLsizei height,
+                 GLubyte *rgba)
+{
+   GLuint pal_ents, i;
+
+   assert(src_format >= GL_PALETTE4_RGB8_OES);
+   assert(src_format <= GL_PALETTE8_RGB5_A1_OES);
+   assert(formats[src_format - GL_PALETTE4_RGB8_OES].format == src_format);
+
+   pal_ents = formats[src_format - GL_PALETTE4_RGB8_OES].palette_size;
+
+   if (pal_ents == 16) {
+      /* 4 bits per index */
+      const GLubyte *ind = (const GLubyte *) indexes;
+
+      if (width * height == 1) {
+         /* special case the only odd-sized image */
+         GLuint index0 = ind[0] >> 4;
+         get_palette_entry(src_format, palette, index0, rgba);
+         return;
+      }
+      /* two pixels per iteration */
+      for (i = 0; i < width * height / 2; i++) {
+         GLuint index0 = ind[i] >> 4;
+         GLuint index1 = ind[i] & 0xf;
+         get_palette_entry(src_format, palette, index0, rgba + i * 8);
+         get_palette_entry(src_format, palette, index1, rgba + i * 8 + 4);
+      }
+   }
+   else {
+      /* 8 bits per index */
+      const GLubyte *ind = (const GLubyte *) indexes;
+      for (i = 0; i < width * height; i++) {
+         GLuint index = ind[i];
+         get_palette_entry(src_format, palette, index, rgba + i * 4);
+      }
+   }
+}
+
+
+/**
+ * Convert a call to glCompressedTexImage2D() where internalFormat is a
+ *  compressed palette format into a regular GLubyte/RGBA glTexImage2D() call.
+ */
+static void
+cpal_compressed_teximage2d(GLenum target, GLint level,
+                           GLenum internalFormat,
+                           GLsizei width, GLsizei height,
+                           const void *pixels)
+{
+   GLuint pal_ents, pal_ent_size, pal_bytes;
+   const GLint num_levels = level + 1;
+   GLint lvl;
+   const GLubyte *indexes;
+
+   assert(internalFormat >= GL_PALETTE4_RGB8_OES);
+   assert(internalFormat <= GL_PALETTE8_RGB5_A1_OES);
+   assert(formats[internalFormat - GL_PALETTE4_RGB8_OES].format == internalFormat);
+
+   pal_ents = formats[internalFormat - GL_PALETTE4_RGB8_OES].palette_size;
+   pal_ent_size = formats[internalFormat - GL_PALETTE4_RGB8_OES].size;
+   pal_bytes = pal_ents * pal_ent_size;
+
+   /* first image follows the palette */
+   indexes = (const GLubyte *) pixels + pal_bytes;
+
+   /* No worries about glPixelStore state since the only supported parameter is
+    * GL_UNPACK_ALIGNMENT and it doesn't matter when unpacking GLubyte/RGBA.
+    */
+
+   for (lvl = 0; lvl < num_levels; lvl++) {
+      /* Allocate GLubyte/RGBA dest image buffer */
+      GLubyte *rgba = (GLubyte *) malloc(width * height * 4);
+
+      if (pixels)
+         paletted_to_rgba(internalFormat, pixels, indexes, width, height, rgba);
+
+      _mesa_TexImage2D(target, lvl, GL_RGBA, width, height, 0,
+                       GL_RGBA, GL_UNSIGNED_BYTE, rgba);
+
+      free(rgba);
+
+      /* advance index pointer to point to next src mipmap */
+      if (pal_ents == 4)
+         indexes += width * height / 2;
+      else
+         indexes += width * height;
+
+      /* next mipmap level size */
+      if (width > 1)
+         width /= 2;
+      if (height > 1)
+         height /= 2;
+   }
+}
+
+
+void GL_APIENTRY
+_es_CompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat,
+                       GLsizei width, GLsizei height, GLint border,
+                       GLsizei imageSize, const GLvoid *data)
+{
+   switch (internalFormat) {
+   case GL_PALETTE4_RGB8_OES:
+   case GL_PALETTE4_RGBA8_OES:
+   case GL_PALETTE4_R5_G6_B5_OES:
+   case GL_PALETTE4_RGBA4_OES:
+   case GL_PALETTE4_RGB5_A1_OES:
+   case GL_PALETTE8_RGB8_OES:
+   case GL_PALETTE8_RGBA8_OES:
+   case GL_PALETTE8_R5_G6_B5_OES:
+   case GL_PALETTE8_RGBA4_OES:
+   case GL_PALETTE8_RGB5_A1_OES:
+      cpal_compressed_teximage2d(target, level, internalFormat,
+                                 width, height, data);
+      break;
+   default:
+      _mesa_CompressedTexImage2DARB(target, level, internalFormat,
+                                    width, height, border, imageSize, data);
+   }
+}
diff --git a/src/mesa/es/main/es_fbo.c b/src/mesa/es/main/es_fbo.c
new file mode 100644 (file)
index 0000000..545c46c
--- /dev/null
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+#include "GLES2/gl2.h"
+#include "GLES2/gl2ext.h"
+
+
+extern void GL_APIENTRY _es_RenderbufferStorage(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height);
+
+extern void GL_APIENTRY _mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height);
+
+
+void GL_APIENTRY
+_es_RenderbufferStorage(GLenum target, GLenum internalFormat,
+                        GLsizei width, GLsizei height)
+{
+   switch (internalFormat) {
+   case GL_RGBA4:
+   case GL_RGB5_A1:
+   case GL_RGB565:
+      internalFormat = GL_RGBA;
+      break;
+   case GL_STENCIL_INDEX1_OES:
+   case GL_STENCIL_INDEX4_OES:
+   case GL_STENCIL_INDEX8:
+      internalFormat = GL_STENCIL_INDEX;
+      break;
+   default:
+      ; /* no op */
+   }
+   _mesa_RenderbufferStorageEXT(target, internalFormat, width, height);
+}
diff --git a/src/mesa/es/main/es_generator.py b/src/mesa/es/main/es_generator.py
new file mode 100644 (file)
index 0000000..2e38b59
--- /dev/null
@@ -0,0 +1,773 @@
+#*************************************************************************
+# Copyright 2008 Tungsten Graphics, 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, 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
+# TUNGSTEN GRAPHICS 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.
+#*************************************************************************
+
+
+import sys, os
+import apiutil
+
+# These dictionary entries are used for automatic conversion.
+# The string will be used as a format string with the conversion
+# variable.
+Converters = {
+    'GLfloat': {
+        'GLdouble': "(GLdouble) (%s)",
+        'GLfixed' : "(GLint) (%s * 65536)",
+    },
+    'GLfixed': {
+        'GLfloat': "(GLfloat) (%s / 65536.0f)",
+        'GLdouble': "(GLdouble) (%s / 65536.0)",
+    },
+    'GLdouble': {
+        'GLfloat': "(GLfloat) (%s)",
+        'GLfixed': "(GLfixed) (%s * 65536)",
+    },
+    'GLclampf': {
+        'GLclampd': "(GLclampd) (%s)",
+        'GLclampx': "(GLclampx) (%s * 65536)",
+    },
+    'GLclampx': {
+        'GLclampf': "(GLclampf) (%s / 65536.0f)",
+        'GLclampd': "(GLclampd) (%s / 65536.0)",
+    },
+    'GLubyte': {
+        'GLfloat': "(GLfloat) (%s / 255.0f)",
+    },
+}
+
+def GetBaseType(type):
+    typeTokens = type.split(' ')
+    baseType = None
+    typeModifiers = []
+    for t in typeTokens:
+        if t in ['const', '*']:
+            typeModifiers.append(t)
+        else:
+            baseType = t
+    return (baseType, typeModifiers)
+
+def ConvertValue(value, fromType, toType):
+    """Returns a string that represents the given parameter string, 
+    type-converted if necessary."""
+
+    if not Converters.has_key(fromType):
+        print >> sys.stderr, "No base converter for type '%s' found.  Ignoring." % fromType
+        return value
+
+    if not Converters[fromType].has_key(toType):
+        print >> sys.stderr, "No converter found for type '%s' to type '%s'.  Ignoring." % (fromType, toType)
+        return value
+
+    # This part is simple.  Return the proper conversion.
+    conversionString = Converters[fromType][toType]
+    return conversionString % value
+
+def GetLoopSizeExpression(funcName, paramName, paramMaxVecSize):
+    # The VariantArrays() list will have all the information (for all
+    # parameters) on how to calculate variant array sizes.
+    variantArrays = apiutil.VariantArrays(funcName)
+    defaultSize = paramMaxVecSize
+    loopSizeExpression = ''
+
+    # There can be many different entries in the variantArrays for the
+    # same parameter.  We have to look at all of them and pick out the
+    # ones of interest.
+    for (variantName, variantSize, controllingParam, controllingValues) in variantArrays:
+        if paramName == variantName:
+            # This variant specification applies to us.  It may be of
+            # the form "param size default", meaning that the value should
+            # replace the default size, or it may be 
+            # "param size controlParam value...", in which case the size should
+            # be used if the controlParam has any one of the given values.
+            if len(controllingValues) == 0:
+                defaultSize = variantSize
+            else:
+                # Create a compound conditional that expresses
+                # all the possible values in the list
+                conditional = ''
+                for value in controllingValues:
+                    if len(conditional) > 0:
+                        conditional = conditional + " || "
+                    conditional = conditional + "%s == %s" % (controllingParam, value)
+
+                # Add the possibly compound conditional and
+                # the associated vector size to the 
+                # loop control expression
+                loopSizeExpression = loopSizeExpression + "(%s) ? %s : " % (conditional, variantSize)
+
+        # end if the name matches
+    # end for the list of all variant array declarations
+
+    # Return the expression that returns the actual size of the
+    # array.  Note that 'loopSizeExpression' will already have a 
+    # trailing ": " if it is nonempty.
+    if len(loopSizeExpression) > 0:
+        return "(%s%s)" % (loopSizeExpression, defaultSize)
+    else:
+        return "%s" % defaultSize
+
+FormatStrings = {
+    'GLenum' : '0x%x',
+    'GLfloat' : '%f',
+    'GLint' : '%d',
+    'GLbitfield' : '0x%x',
+}
+def GetFormatString(type):
+    if FormatStrings.has_key(type):
+        return FormatStrings[type]
+    else:
+        return None
+
+
+######################################################################
+# Version-specific values to be used in the main script
+# header: which header file to include
+# api: what text specifies an API-level function
+# special: the name of the "specials" file
+VersionSpecificValues = {
+    'GLES1.1' : {
+        'description' : 'GLES1.1 functions',
+        'header' : 'GLES/gl.h',
+        'extheader' : 'GLES/glext.h',
+        'special' : 'es1_special',
+    },
+    'GLES2.0': {
+        'description' : 'GLES2.0 functions',
+        'header' : 'GLES2/gl2.h',
+        'extheader' : 'GLES2/gl2ext.h',
+        'special' : 'es2_special',
+    }
+}
+
+
+######################################################################
+# Main code for the script begins here.
+
+# Get the name of the program (without the directory part) for use in
+# error messages.
+program = os.path.basename(sys.argv[0])
+
+# We assume that the directory that the Python script is in also
+# houses the "special" files.
+programDir = os.path.dirname(sys.argv[0])
+
+# Set default values
+verbose = 0
+functionList = "APIspec.txt"
+version = "GLES1.1"
+
+# Allow for command-line switches
+import getopt, time
+options = "hvV:S:"
+try:
+    optlist, args = getopt.getopt(sys.argv[1:], options)
+except getopt.GetoptError, message:
+    sys.stderr.write("%s: %s.  Use -h for help.\n" % (program, message))
+    sys.exit(1)
+
+for option, optarg in optlist:
+    if option == "-h":
+        sys.stderr.write("Usage: %s [-%s]\n" % (program, options))
+        sys.stderr.write("Parse an API specification file and generate wrapper functions for a given GLES version\n")
+        sys.stderr.write("-h gives help\n")
+        sys.stderr.write("-v is verbose\n")
+        sys.stderr.write("-V specifies GLES version to generate [%s]:\n" % version)
+        for key in VersionSpecificValues.keys():
+            sys.stderr.write("    %s - %s\n" % (key, VersionSpecificValues[key]['description']))
+        sys.stderr.write("-S specifies API specification file to use [%s]\n" % functionList)
+        sys.exit(1)
+    elif option == "-v":
+        verbose += 1
+    elif option == "-V":
+        version = optarg
+    elif option == "-S":
+        functionList = optarg
+
+# Beyond switches, we support no further command-line arguments
+if len(args) >  0:
+    sys.stderr.write("%s: only switch arguments are supported - use -h for help\n" % program)
+    sys.exit(1)
+
+# If we don't have a valid version, abort.
+if not VersionSpecificValues.has_key(version):
+    sys.stderr.write("%s: version '%s' is not valid - use -h for help\n" % (program, version))
+    sys.exit(1)
+
+# Grab the version-specific items we need to use
+versionHeader = VersionSpecificValues[version]['header']
+versionExtHeader = VersionSpecificValues[version]['extheader']
+versionSpecial = VersionSpecificValues[version]['special']
+
+# We're probably being invoked from a different directory,
+# so look for the "special" file in the same directory that
+# holds the Python script
+specialFile = os.path.join(programDir, versionSpecial)
+if not os.path.isfile(specialFile):
+    sys.stderr.write("%s: can't find special file '%s' for version '%s' - aborting" % (program, specialFile, version))
+    sys.exit(1)
+
+allSpecials = apiutil.AllSpecials(specialFile.split("_")[0])
+
+# If we get to here, we're good to go.  The "version" parameter
+# directs GetDispatchedFunctions to only allow functions from
+# that "category" (version in our parlance).  This allows 
+# functions with different declarations in different categories
+# to exist (glTexImage2D, for example, is different between
+# GLES1 and GLES2).
+keys = apiutil.GetAllFunctions(functionList, version)
+
+print """/* DO NOT EDIT *************************************************
+ * THIS FILE AUTOMATICALLY GENERATED BY THE %s SCRIPT
+ * API specification file:   %s
+ * GLES version:             %s
+ * date:                     %s
+ */
+""" % (program, functionList, version, time.strftime("%Y-%m-%d %H:%M:%S"))
+
+# The headers we choose are version-specific.
+print """
+#include "%s"
+#include "%s"
+""" % (versionHeader, versionExtHeader)
+
+# Everyone needs these types.
+print """
+/* These types are needed for the Mesa veneer, but are not defined in
+ * the standard GLES headers.
+ */
+typedef double GLdouble;
+typedef double GLclampd;
+
+/* This type is normally in glext.h, but needed here */
+typedef char GLchar;
+
+/* Mesa error handling requires these */
+extern void *_mesa_get_current_context(void);
+extern void _mesa_error(void *ctx, GLenum error, const char *fmtString, ... );
+
+#include "main/compiler.h"
+#include "main/api_exec.h"
+
+#include "glapi/dispatch.h"
+
+typedef void (*_glapi_proc)(void); /* generic function pointer */
+"""
+
+# All variant-length arrays in the GLES API are controlled by some
+# selector parameter.  Almost all of those are constant length based
+# on the selector parameter (e.g., in glFogfv(), if the "pname" 
+# parameter is GL_FOG_COLOR, the "params" array is considered to be
+# 4 floats long; for any other value of "pname", the "params' array
+# is considered to be 1 float long.
+#
+# There are a very few instances where the selector parameter chooses
+# a runtime-determined value:
+#   glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS)
+#   glGetIntegerv(GL_SHADER_BINARY_FORMATS)
+# plus the glGetBooleanv, glGetFloatv, glGetFixedv counterparts.
+#
+# The number of formats in both cases is not a constant, but is a
+# runtime-determined value (based on the return value of
+# glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS) or
+# glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS).
+#
+# Rather than hard-code some value (and risk memory errors when we
+# overshoot arrays), in these cases we'll use a constant expresssion
+# (e.g. _get_size(GL_NUM_COMPRESSED_TEXTURE_FORMATS)) to get the
+# value of the variant array.  Note, though, that in these cases the
+# "vector" parameter should be set to some size large enough to hold
+# all values  (and must be set for GLfixed-based conversions, which
+# need it to define an auxiliary array size).
+#
+# Here's the function itself.  Although we only need a couple of values,
+# we'll make it general.
+print """
+extern void GLAPIENTRY _mesa_GetIntegerv(GLenum, GLint *);
+static INLINE unsigned int _get_size(GLenum pname)
+{
+    /* In case of error, make sure the value returned is 0. */
+    GLint value = 0;
+    _mesa_GetIntegerv(pname, &value);
+    return (unsigned int) value;
+}
+"""
+
+# Finally we get to the all-important functions
+print """/*************************************************************
+ * Generated functions begin here
+ */
+"""
+for funcName in keys:
+    if verbose > 0: sys.stderr.write("%s: processing function %s\n" % (program, funcName))
+
+    # start figuring out what this function will look like.
+    returnType = apiutil.ReturnType(funcName)
+    props = apiutil.Properties(funcName)
+    params = apiutil.Parameters(funcName)
+    declarationString = apiutil.MakeDeclarationString(params)
+
+    # In case of error, a function may have to return.  Make
+    # sure we have valid return values in this case.
+    if returnType == "void":
+        errorReturn = "return"
+    elif returnType == "GLboolean":
+        errorReturn = "return GL_FALSE"
+    else:
+        errorReturn = "return (%s) 0" % returnType
+
+    # These are the output of this large calculation block.
+    # passthroughDeclarationString: a typed set of parameters that
+    # will be used to create the "extern" reference for the
+    # underlying Mesa or support function.  Note that as generated
+    # these have an extra ", " at the beginning, which will be
+    # removed before use.
+    # 
+    # passthroughDeclarationString: an untyped list of parameters
+    # that will be used to call the underlying Mesa or support
+    # function (including references to converted parameters).
+    # This will also be generated with an extra ", " at the
+    # beginning, which will be removed before use.
+    #
+    # variables: C code to create any local variables determined to
+    # be necessary.
+    # conversionCodeOutgoing: C code to convert application parameters
+    # to a necessary type before calling the underlying support code.
+    # May be empty if no conversion is required.  
+    # conversionCodeIncoming: C code to do the converse: convert 
+    # values returned by underlying Mesa code to the types needed
+    # by the application.
+    # Note that *either* the conversionCodeIncoming will be used (for
+    # generated query functions), *or* the conversionCodeOutgoing will
+    # be used (for generated non-query functions), never both.
+    passthroughFuncName = ""
+    passthroughDeclarationString = ""
+    passthroughCallString = ""
+    variables = []
+    conversionCodeOutgoing = []
+    conversionCodeIncoming = []
+    switchCode = []
+
+    # Calculate the name of the underlying support function to call.
+    # By default, the passthrough function is named _mesa_<funcName>.
+    # We're allowed to override the prefix and/or the function name
+    # for each function record, though.  The "ConversionFunction"
+    # utility is poorly named, BTW...
+    aliasprefix = apiutil.AliasPrefix(funcName)
+    alias = apiutil.ConversionFunction(funcName)
+    if not alias:
+        # There may still be a Mesa alias for the function
+        if apiutil.Alias(funcName):
+            passthroughFuncName = "%s%s" % (aliasprefix, apiutil.Alias(funcName))
+        else:
+            passthroughFuncName = "%s%s" % (aliasprefix, funcName)
+    else: # a specific alias is provided
+        passthroughFuncName = "%s%s" % (aliasprefix, alias)
+
+    # Look at every parameter: each one may have only specific
+    # allowed values, or dependent parameters to check, or 
+    # variant-sized vector arrays to calculate
+    for (paramName, paramType, paramMaxVecSize, paramConvertToType, paramValidValues, paramValueConversion) in params:
+        # We'll need this below if we're doing conversions
+        (paramBaseType, paramTypeModifiers) = GetBaseType(paramType)
+
+        # Conversion management.
+        # We'll handle three cases, easiest to hardest: a parameter
+        # that doesn't require conversion, a scalar parameter that
+        # requires conversion, and a vector parameter that requires
+        # conversion.
+        if paramConvertToType == None:
+            # Unconverted parameters are easy, whether they're vector
+            # or scalar - just add them to the call list.  No conversions
+            # or anything to worry about.
+            passthroughDeclarationString += ", %s %s" % (paramType, paramName)
+            passthroughCallString += ", %s" % paramName
+
+        elif paramMaxVecSize == 0: # a scalar parameter that needs conversion
+            # A scalar to hold a converted parameter
+            variables.append("    %s converted_%s;" % (paramConvertToType, paramName))
+
+            # Outgoing conversion depends on whether we have to conditionally
+            # perform value conversion.
+            if paramValueConversion == "none":
+                conversionCodeOutgoing.append("    converted_%s = (%s) %s;" % (paramName, paramConvertToType, paramName))
+            elif paramValueConversion == "some":
+                # We'll need a conditional variable to keep track of
+                # whether we're converting values or not.
+                if ("    int convert_%s_value = 1;" % paramName) not in variables:
+                    variables.append("    int convert_%s_value = 1;" % paramName)
+
+                # Write code based on that conditional.
+                conversionCodeOutgoing.append("    if (convert_%s_value) {" % paramName)
+                conversionCodeOutgoing.append("        converted_%s = %s;" % (paramName, ConvertValue(paramName, paramBaseType, paramConvertToType))) 
+                conversionCodeOutgoing.append("    } else {")
+                conversionCodeOutgoing.append("        converted_%s = (%s) %s;" % (paramName, paramConvertToType, paramName))
+                conversionCodeOutgoing.append("    }")
+            else: # paramValueConversion == "all"
+                conversionCodeOutgoing.append("    converted_%s = %s;" % (paramName, ConvertValue(paramName, paramBaseType, paramConvertToType)))
+
+            # Note that there can be no incoming conversion for a
+            # scalar parameter; changing the scalar will only change
+            # the local value, and won't ultimately change anything
+            # that passes back to the application.
+
+            # Call strings.  The unusual " ".join() call will join the
+            # array of parameter modifiers with spaces as separators.
+            passthroughDeclarationString += ", %s %s %s" % (paramConvertToType, " ".join(paramTypeModifiers), paramName)
+            passthroughCallString += ", converted_%s" % paramName
+
+        else: # a vector parameter that needs conversion
+            # We'll need an index variable for conversions
+            if "    register unsigned int i;" not in variables:
+                variables.append("    register unsigned int i;")
+
+            # This variable will hold the (possibly variant) size of
+            # this array needing conversion.  By default, we'll set
+            # it to the maximal size (which is correct for functions
+            # with a constant-sized vector parameter); for true
+            # variant arrays, we'll modify it with other code.
+            variables.append("    unsigned int n_%s = %d;" % (paramName, paramMaxVecSize))
+
+            # This array will hold the actual converted values.
+            variables.append("    %s converted_%s[%d];" % (paramConvertToType, paramName, paramMaxVecSize))
+
+            # Again, we choose the conversion code based on whether we
+            # have to always convert values, never convert values, or 
+            # conditionally convert values.
+            if paramValueConversion == "none":
+                conversionCodeOutgoing.append("    for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeOutgoing.append("        converted_%s[i] = (%s) %s[i];" % (paramName, paramConvertToType, paramName))
+                conversionCodeOutgoing.append("    }")
+            elif paramValueConversion == "some":
+                # We'll need a conditional variable to keep track of
+                # whether we're converting values or not.
+                if ("    int convert_%s_value = 1;" % paramName) not in variables:
+                    variables.append("    int convert_%s_value = 1;" % paramName)
+                # Write code based on that conditional.
+                conversionCodeOutgoing.append("    if (convert_%s_value) {" % paramName)
+                conversionCodeOutgoing.append("        for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeOutgoing.append("            converted_%s[i] = %s;" % (paramName, ConvertValue("%s[i]" % paramName, paramBaseType, paramConvertToType))) 
+                conversionCodeOutgoing.append("        }")
+                conversionCodeOutgoing.append("    } else {")
+                conversionCodeOutgoing.append("        for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeOutgoing.append("            converted_%s[i] = (%s) %s[i];" % (paramName, paramConvertToType, paramName))
+                conversionCodeOutgoing.append("        }")
+                conversionCodeOutgoing.append("    }")
+            else: # paramValueConversion == "all"
+                conversionCodeOutgoing.append("    for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeOutgoing.append("        converted_%s[i] = %s;" % (paramName, ConvertValue("%s[i]" % paramName, paramBaseType, paramConvertToType)))
+
+                conversionCodeOutgoing.append("    }")
+
+            # If instead we need an incoming conversion (i.e. results
+            # from Mesa have to be converted before handing back
+            # to the application), this is it.  Fortunately, we don't
+            # have to worry about conditional value conversion - the
+            # functions that do (e.g. glGetFixedv()) are handled
+            # specially, outside this code generation.
+            #
+            # Whether we use incoming conversion or outgoing conversion
+            # is determined later - we only ever use one or the other.
+
+            if paramValueConversion == "none":
+                conversionCodeIncoming.append("    for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeIncoming.append("        %s[i] = (%s) converted_%s[i];" % (paramName, paramConvertToType, paramName))
+                conversionCodeIncoming.append("    }")
+            elif paramValueConversion == "some":
+                # We'll need a conditional variable to keep track of
+                # whether we're converting values or not.
+                if ("    int convert_%s_value = 1;" % paramName) not in variables:
+                    variables.append("    int convert_%s_value = 1;" % paramName)
+
+                # Write code based on that conditional.
+                conversionCodeIncoming.append("    if (convert_%s_value) {" % paramName)
+                conversionCodeIncoming.append("        for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeIncoming.append("            %s[i] = %s;" % (paramName, ConvertValue("converted_%s[i]" % paramName, paramConvertToType, paramBaseType))) 
+                conversionCodeIncoming.append("        }")
+                conversionCodeIncoming.append("    } else {")
+                conversionCodeIncoming.append("        for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeIncoming.append("            %s[i] = (%s) converted_%s[i];" % (paramName, paramBaseType, paramName))
+                conversionCodeIncoming.append("        }")
+                conversionCodeIncoming.append("    }")
+            else: # paramValueConversion == "all"
+                conversionCodeIncoming.append("    for (i = 0; i < n_%s; i++) {" % paramName)
+                conversionCodeIncoming.append("        %s[i] = %s;" % (paramName, ConvertValue("converted_%s[i]" % paramName, paramConvertToType, paramBaseType)))
+                conversionCodeIncoming.append("    }")
+
+            # Call strings.  The unusual " ".join() call will join the
+            # array of parameter modifiers with spaces as separators.
+            passthroughDeclarationString += ", %s %s %s" % (paramConvertToType, " ".join(paramTypeModifiers), paramName)
+            passthroughCallString += ", converted_%s" % paramName
+
+        # endif conversion management
+
+        # Parameter checking.  If the parameter has a specific list of
+        # valid values, we have to make sure that the passed-in values
+        # match these, or we make an error.
+        if len(paramValidValues) > 0:
+            # We're about to make a big switch statement with an
+            # error at the end.  By default, the error is GL_INVALID_ENUM,
+            # unless we find a "case" statement in the middle with a
+            # non-GLenum value.
+            errorDefaultCase = "GL_INVALID_ENUM"
+
+            # This parameter has specific valid values.  Make a big
+            # switch statement to handle it.  Note that the original
+            # parameters are always what is checked, not the
+            # converted parameters.
+            switchCode.append("    switch(%s) {" % paramName)
+
+            for valueIndex in range(len(paramValidValues)):
+                (paramValue, dependentVecSize, dependentParamName, dependentValidValues, errorCode, valueConvert) = paramValidValues[valueIndex]
+
+                # We're going to need information on the dependent param
+                # as well.
+                if dependentParamName:
+                    depParamIndex = apiutil.FindParamIndex(params, dependentParamName)
+                    if depParamIndex == None:
+                        sys.stderr.write("%s: can't find dependent param '%s' for function '%s'\n" % (program, dependentParamName, funcName))
+
+                    (depParamName, depParamType, depParamMaxVecSize, depParamConvertToType, depParamValidValues, depParamValueConversion) = params[depParamIndex]
+                else:
+                    (depParamName, depParamType, depParamMaxVecSize, depParamConvertToType, depParamValidValues, depParamValueConversion) = (None, None, None, None, [], None)
+
+                # This is a sneaky trick.  It's valid syntax for a parameter
+                # that is *not* going to be converted to be declared
+                # with a dependent vector size; but in this case, the
+                # dependent vector size is unused and unnecessary.
+                # So check for this and ignore the dependent vector size
+                # if the parameter is not going to be converted.
+                if depParamConvertToType:
+                    usedDependentVecSize = dependentVecSize
+                else:
+                    usedDependentVecSize = None
+
+                # We'll peek ahead at the next parameter, to see whether
+                # we can combine cases
+                if valueIndex + 1 < len(paramValidValues) :
+                    (nextParamValue, nextDependentVecSize, nextDependentParamName, nextDependentValidValues, nextErrorCode, nextValueConvert) = paramValidValues[valueIndex + 1]
+                    if depParamConvertToType:
+                        usedNextDependentVecSize = nextDependentVecSize
+                    else:
+                        usedNextDependentVecSize = None
+
+                # Create a case for this value.  As a mnemonic,
+                # if we have a dependent vector size that we're ignoring,
+                # add it as a comment.
+                if usedDependentVecSize == None and dependentVecSize != None:
+                    switchCode.append("        case %s: /* size %s */" % (paramValue, dependentVecSize))
+                else:
+                    switchCode.append("        case %s:" % paramValue)
+
+                # If this is not a GLenum case, then switch our error
+                # if no value is matched to be GL_INVALID_VALUE instead
+                # of GL_INVALID_ENUM.  (Yes, this does get confused
+                # if there are both values and GLenums in the same
+                # switch statement, which shouldn't happen.)
+                if paramValue[0:3] != "GL_":
+                    errorDefaultCase = "GL_INVALID_VALUE"
+
+                # If all the remaining parameters are identical to the
+                # next set, then we're done - we'll just create the
+                # official code on the next pass through, and the two
+                # cases will share the code.
+                if valueIndex + 1 < len(paramValidValues) and usedDependentVecSize == usedNextDependentVecSize and dependentParamName == nextDependentParamName and dependentValidValues == nextDependentValidValues and errorCode == nextErrorCode and valueConvert == nextValueConvert:
+                    continue
+
+                # Otherwise, we'll have to generate code for this case.
+                # Start off with a check: if there is a dependent parameter,
+                # and a list of valid values for that parameter, we need
+                # to generate an error if something other than one
+                # of those values is passed.
+                if len(dependentValidValues) > 0:
+                    conditional=""
+
+                    # If the parameter being checked is actually an array,
+                    # check only its first element.
+                    if depParamMaxVecSize == 0:
+                        valueToCheck = dependentParamName
+                    else:
+                        valueToCheck = "%s[0]" % dependentParamName
+
+                    for v in dependentValidValues:
+                        conditional += " && %s != %s" % (valueToCheck, v)
+                    switchCode.append("            if (%s) {" % conditional[4:])
+                    if errorCode == None:
+                        errorCode = "GL_INVALID_ENUM"
+                    switchCode.append('                _mesa_error(_mesa_get_current_context(), %s, "gl%s(%s=0x%s)", %s);' % (errorCode, funcName, paramName, "%x", paramName))
+                    switchCode.append("                %s;" % errorReturn)
+                    switchCode.append("            }")
+                # endif there are dependent valid values
+
+                # The dependent parameter may require conditional
+                # value conversion.  If it does, and we don't want
+                # to convert values, we'll have to generate code for that
+                if depParamValueConversion == "some" and valueConvert == "noconvert":
+                    switchCode.append("            convert_%s_value = 0;" % dependentParamName)
+
+                # If there's a dependent vector size for this parameter
+                # that we're actually going to use (i.e. we need conversion),
+                # mark it.
+                if usedDependentVecSize:
+                    switchCode.append("            n_%s = %s;" % (dependentParamName, dependentVecSize))
+
+                # In all cases, break out of the switch if any valid
+                # value is found.
+                switchCode.append("            break;")
+
+
+            # Need a default case to catch all the other, invalid
+            # parameter values.  These will all generate errors.
+            switchCode.append("        default:")
+            if errorCode == None:
+                errorCode = "GL_INVALID_ENUM"
+            formatString = GetFormatString(paramType)
+            if formatString == None:
+                switchCode.append('            _mesa_error(_mesa_get_current_context(), %s, "gl%s(%s)");' % (errorCode, funcName, paramName))
+            else:
+                switchCode.append('            _mesa_error(_mesa_get_current_context(), %s, "gl%s(%s=%s)", %s);' % (errorCode, funcName, paramName, formatString, paramName))
+            switchCode.append("            %s;" % errorReturn)
+
+            # End of our switch code.
+            switchCode.append("    }")
+
+        # endfor every recognized parameter value
+
+    # endfor every param
+
+    # Here, the passthroughDeclarationString and passthroughCallString
+    # are complete; remove the extra ", " at the front of each.
+    passthroughDeclarationString = passthroughDeclarationString[2:]
+    passthroughCallString = passthroughCallString[2:]
+
+    # The Mesa functions are scattered across all the Mesa
+    # header files.  The easiest way to manage declarations
+    # is to create them ourselves.
+    if funcName not in allSpecials:
+        print "extern %s GLAPIENTRY %s(%s);" % (returnType, passthroughFuncName, passthroughDeclarationString)
+
+    # A function may be a core function (i.e. it exists in
+    # the core specification), a core addition (extension
+    # functions added officially to the core), a required
+    # extension (usually an extension for an earlier version
+    # that has been officially adopted), or an optional extension.
+    #
+    # Core functions have a simple category (e.g. "GLES1.1");
+    # we generate only a simple callback for them.
+    #
+    # Core additions have two category listings, one simple
+    # and one compound (e.g.  ["GLES1.1", "GLES1.1:OES_fixed_point"]).  
+    # We generate the core function, and also an extension function.
+    #
+    # Required extensions and implemented optional extensions
+    # have a single compound category "GLES1.1:OES_point_size_array".
+    # For these we generate just the extension function.
+    for categorySpec in apiutil.Categories(funcName):
+        compoundCategory = categorySpec.split(":")
+
+        # This category isn't for us, if the base category doesn't match
+        # our version
+        if compoundCategory[0] != version:
+            continue
+
+        # Otherwise, determine if we're writing code for a core
+        # function (no suffix) or an extension function.
+        if len(compoundCategory) == 1:
+            # This is a core function
+            extensionName = None
+            fullFuncName = "_es_" + funcName
+        else:
+            # This is an extension function.  We'll need to append
+            # the extension suffix.
+            extensionName = compoundCategory[1]
+            extensionSuffix = extensionName.split("_")[0]
+            fullFuncName = "_es_" + funcName + extensionSuffix
+
+        # Now the generated function.  The text used to mark an API-level
+        # function, oddly, is version-specific.
+        if extensionName:
+            print "/* Extension %s */" % extensionName
+
+        if funcName in allSpecials:
+            print "/* this function is special and is defined elsewhere */"
+            print "extern %s %s(%s);" % (returnType, fullFuncName, declarationString)
+            print
+            continue
+
+        print "static %s %s(%s)" % (returnType, fullFuncName, declarationString)
+        print "{"
+
+        # Start printing our code pieces.  Start with any local
+        # variables we need.  This unusual syntax joins the 
+        # lines in the variables[] array with the "\n" separator.
+        if len(variables) > 0:
+            print "\n".join(variables) + "\n"
+
+        # If there's any sort of parameter checking or variable
+        # array sizing, the switch code will contain it.
+        if len(switchCode) > 0:
+            print "\n".join(switchCode) + "\n"
+
+        # In the case of an outgoing conversion (i.e. parameters must
+        # be converted before calling the underlying Mesa function),
+        # use the appropriate code.
+        if "get" not in props and len(conversionCodeOutgoing) > 0:
+            print "\n".join(conversionCodeOutgoing) + "\n"
+
+        # Call the Mesa function.  Note that there are very few functions
+        # that return a value (i.e. returnType is not "void"), and that
+        # none of them require incoming translation; so we're safe
+        # to generate code that directly returns in those cases,
+        # even though it's not completely independent.
+
+        if returnType == "void":
+            print "    %s(%s);" % (passthroughFuncName, passthroughCallString)
+        else:
+            print "    return %s(%s);" % (passthroughFuncName, passthroughCallString)
+
+        # If the function is one that returns values (i.e. "get" in props),
+        # it might return values of a different type than we need, that
+        # require conversion before passing back to the application.
+        if "get" in props and len(conversionCodeIncoming) > 0:
+            print "\n".join(conversionCodeIncoming)
+
+        # All done.
+        print "}"
+        print
+    # end for each category provided for a function
+
+# end for each function
+
+print "void"
+print "_mesa_init_exec_table(struct _glapi_table *exec)"
+print "{"
+for func in keys:
+    for spec in apiutil.Categories(func):
+        ext = spec.split(":")
+        # version does not match
+        if ext.pop(0) != version:
+            continue
+        entry = func
+        if ext:
+            suffix = ext[0].split("_")[0]
+            entry += suffix
+        print "    SET_%s(exec, _es_%s);" % (entry, entry)
+print "}"
diff --git a/src/mesa/es/main/es_query_matrix.c b/src/mesa/es/main/es_query_matrix.c
new file mode 100644 (file)
index 0000000..82b6fe7
--- /dev/null
@@ -0,0 +1,199 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+/**
+ * Code to implement GL_OES_query_matrix.  See the spec at:
+ * http://www.khronos.org/registry/gles/extensions/OES/OES_query_matrix.txt
+ */
+
+
+#include <stdlib.h>
+#include <math.h>
+#include "GLES/gl.h"
+#include "GLES/glext.h"
+
+
+/**
+ * This is from the GL_OES_query_matrix extension specification:
+ *
+ *  GLbitfield glQueryMatrixxOES( GLfixed mantissa[16],
+ *                                GLint   exponent[16] )
+ *  mantissa[16] contains the contents of the current matrix in GLfixed
+ *  format.  exponent[16] contains the unbiased exponents applied to the
+ *  matrix components, so that the internal representation of component i
+ *  is close to mantissa[i] * 2^exponent[i].  The function returns a status
+ *  word which is zero if all the components are valid. If
+ *  status & (1<<i) != 0, the component i is invalid (e.g., NaN, Inf).
+ *  The implementations are not required to keep track of overflows.  In
+ *  that case, the invalid bits are never set.
+ */
+
+#define INT_TO_FIXED(x) ((GLfixed) ((x) << 16))
+#define FLOAT_TO_FIXED(x) ((GLfixed) ((x) * 65536.0))
+
+#if defined(WIN32) || defined(_WIN32_WCE)
+/* Oddly, the fpclassify() function doesn't exist in such a form
+ * on Windows.  This is an implementation using slightly different
+ * lower-level Windows functions.
+ */
+#include <float.h>
+
+enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
+fpclassify(double x)
+{
+    switch(_fpclass(x)) {
+        case _FPCLASS_SNAN: /* signaling NaN */
+        case _FPCLASS_QNAN: /* quiet NaN */
+            return FP_NAN;
+        case _FPCLASS_NINF: /* negative infinity */
+        case _FPCLASS_PINF: /* positive infinity */
+            return FP_INFINITE;
+        case _FPCLASS_NN:   /* negative normal */
+        case _FPCLASS_PN:   /* positive normal */
+            return FP_NORMAL;
+        case _FPCLASS_ND:   /* negative denormalized */
+        case _FPCLASS_PD:   /* positive denormalized */
+            return FP_SUBNORMAL;
+        case _FPCLASS_NZ:   /* negative zero */
+        case _FPCLASS_PZ:   /* positive zero */
+            return FP_ZERO;
+        default:
+            /* Should never get here; but if we do, this will guarantee
+             * that the pattern is not treated like a number.
+             */
+            return FP_NAN;
+    }
+}
+#endif
+
+extern GLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]);
+
+/* The Mesa functions we'll need */
+extern void GL_APIENTRY _mesa_GetIntegerv(GLenum pname, GLint *params);
+extern void GL_APIENTRY _mesa_GetFloatv(GLenum pname, GLfloat *params);
+
+GLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16])
+{
+    GLfloat matrix[16];
+    GLint tmp;
+    GLenum currentMode = GL_FALSE;
+    GLenum desiredMatrix = GL_FALSE;
+    /* The bitfield returns 1 for each component that is invalid (i.e.
+     * NaN or Inf).  In case of error, everything is invalid.
+     */
+    GLbitfield rv;
+    register unsigned int i;
+    unsigned int bit;
+
+    /* This data structure defines the mapping between the current matrix
+     * mode and the desired matrix identifier.
+     */
+    static struct {
+        GLenum currentMode;
+        GLenum desiredMatrix;
+    } modes[] = {
+        {GL_MODELVIEW, GL_MODELVIEW_MATRIX},
+        {GL_PROJECTION, GL_PROJECTION_MATRIX},
+        {GL_TEXTURE, GL_TEXTURE_MATRIX},
+#if 0
+        /* this doesn't exist in GLES */
+        {GL_COLOR, GL_COLOR_MATRIX},
+#endif
+    };
+
+    /* Call Mesa to get the current matrix in floating-point form.  First,
+     * we have to figure out what the current matrix mode is.
+     */
+    _mesa_GetIntegerv(GL_MATRIX_MODE, &tmp);
+    currentMode = (GLenum) tmp;
+
+    /* The mode is either GL_FALSE, if for some reason we failed to query
+     * the mode, or a given mode from the above table.  Search for the
+     * returned mode to get the desired matrix; if we don't find it,
+     * we can return immediately, as _mesa_GetInteger() will have
+     * logged the necessary error already.
+     */
+    for (i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) {
+        if (modes[i].currentMode == currentMode) {
+            desiredMatrix = modes[i].desiredMatrix;
+            break;
+        }
+    }
+    if (desiredMatrix == GL_FALSE) {
+        /* Early error means all values are invalid. */
+        return 0xffff;
+    }
+
+    /* Now pull the matrix itself. */
+    _mesa_GetFloatv(desiredMatrix, matrix);
+
+    rv = 0;
+    for (i = 0, bit = 1; i < 16; i++, bit<<=1) {
+        float normalizedFraction;
+        int exp;
+
+        switch (fpclassify(matrix[i])) {
+            /* A "subnormal" or denormalized number is too small to be
+             * represented in normal format; but despite that it's a
+             * valid floating point number.  FP_ZERO and FP_NORMAL
+             * are both valid as well.  We should be fine treating
+             * these three cases as legitimate floating-point numbers.
+             */
+            case FP_SUBNORMAL:
+            case FP_NORMAL:
+            case FP_ZERO:
+                normalizedFraction = (GLfloat)frexp(matrix[i], &exp);
+                mantissa[i] = FLOAT_TO_FIXED(normalizedFraction);
+                exponent[i] = (GLint) exp;
+                break;
+
+            /* If the entry is not-a-number or an infinity, then the
+             * matrix component is invalid.  The invalid flag for
+             * the component is already set; might as well set the
+             * other return values to known values.  We'll set
+             * distinct values so that a savvy end user could determine
+             * whether the matrix component was a NaN or an infinity,
+             * but this is more useful for debugging than anything else
+             * since the standard doesn't specify any such magic
+             * values to return.
+             */
+            case FP_NAN:
+                mantissa[i] = INT_TO_FIXED(0);
+                exponent[i] = (GLint) 0;
+                rv |= bit;
+                break;
+
+            case FP_INFINITE:
+                /* Return +/- 1 based on whether it's a positive or
+                 * negative infinity.
+                 */
+                if (matrix[i] > 0) {
+                    mantissa[i] = INT_TO_FIXED(1);
+                }
+                else {
+                    mantissa[i] = -INT_TO_FIXED(1);
+                }
+                exponent[i] = (GLint) 0;
+                rv |= bit;
+                break;
+
+            /* We should never get here; but here's a catching case
+             * in case fpclassify() is returnings something unexpected.
+             */
+            default:
+                mantissa[i] = INT_TO_FIXED(2);
+                exponent[i] = (GLint) 0;
+                rv |= bit;
+                break;
+        }
+
+    } /* for each component */
+
+    /* All done */
+    return rv;
+}
diff --git a/src/mesa/es/main/get_gen.py b/src/mesa/es/main/get_gen.py
new file mode 100644 (file)
index 0000000..516facc
--- /dev/null
@@ -0,0 +1,785 @@
+#!/usr/bin/env python
+
+# Mesa 3-D graphics library
+#
+# Copyright (C) 1999-2006  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 script is used to generate the get.c file:
+# python get_gen.py > get.c
+
+
+import string
+import sys
+
+
+GLint = 1
+GLenum = 2
+GLfloat = 3
+GLdouble = 4
+GLboolean = 5
+GLfloatN = 6    # A normalized value, such as a color or depth range
+
+
+TypeStrings = {
+       GLint : "GLint",
+       GLenum : "GLenum",
+       GLfloat : "GLfloat",
+       GLdouble : "GLdouble",
+       GLboolean : "GLboolean"
+}
+
+
+# Each entry is a tuple of:
+#  - the GL state name, such as GL_CURRENT_COLOR
+#  - the state datatype, one of GLint, GLfloat, GLboolean or GLenum
+#  - list of code fragments to get the state, such as ["ctx->Foo.Bar"]
+#  - optional extra code or empty string
+#  - optional extensions to check, or None
+#
+
+# Present in ES 1.x and 2.x:
+StateVars_common = [
+       ( "GL_ALPHA_BITS", GLint, ["ctx->DrawBuffer->Visual.alphaBits"],
+         "", None ),
+       ( "GL_BLEND", GLboolean, ["ctx->Color.BlendEnabled"], "", None ),
+       ( "GL_BLEND_SRC", GLenum, ["ctx->Color.BlendSrcRGB"], "", None ),
+       ( "GL_BLUE_BITS", GLint, ["ctx->DrawBuffer->Visual.blueBits"], "", None ),
+       ( "GL_COLOR_CLEAR_VALUE", GLfloatN,
+         [ "ctx->Color.ClearColor[0]",
+               "ctx->Color.ClearColor[1]",
+               "ctx->Color.ClearColor[2]",
+               "ctx->Color.ClearColor[3]" ], "", None ),
+       ( "GL_COLOR_WRITEMASK", GLint,
+         [ "ctx->Color.ColorMask[RCOMP] ? 1 : 0",
+               "ctx->Color.ColorMask[GCOMP] ? 1 : 0",
+               "ctx->Color.ColorMask[BCOMP] ? 1 : 0",
+               "ctx->Color.ColorMask[ACOMP] ? 1 : 0" ], "", None ),
+       ( "GL_CULL_FACE", GLboolean, ["ctx->Polygon.CullFlag"], "", None ),
+       ( "GL_CULL_FACE_MODE", GLenum, ["ctx->Polygon.CullFaceMode"], "", None ),
+       ( "GL_DEPTH_BITS", GLint, ["ctx->DrawBuffer->Visual.depthBits"],
+         "", None ),
+       ( "GL_DEPTH_CLEAR_VALUE", GLfloatN, ["ctx->Depth.Clear"], "", None ),
+       ( "GL_DEPTH_FUNC", GLenum, ["ctx->Depth.Func"], "", None ),
+       ( "GL_DEPTH_RANGE", GLfloatN,
+         [ "ctx->Viewport.Near", "ctx->Viewport.Far" ], "", None ),
+       ( "GL_DEPTH_TEST", GLboolean, ["ctx->Depth.Test"], "", None ),
+       ( "GL_DEPTH_WRITEMASK", GLboolean, ["ctx->Depth.Mask"], "", None ),
+       ( "GL_DITHER", GLboolean, ["ctx->Color.DitherFlag"], "", None ),
+       ( "GL_FRONT_FACE", GLenum, ["ctx->Polygon.FrontFace"], "", None ),
+       ( "GL_GREEN_BITS", GLint, ["ctx->DrawBuffer->Visual.greenBits"],
+         "", None ),
+       ( "GL_LINE_WIDTH", GLfloat, ["ctx->Line.Width"], "", None ),
+       ( "GL_ALIASED_LINE_WIDTH_RANGE", GLfloat,
+         ["ctx->Const.MinLineWidth",
+          "ctx->Const.MaxLineWidth"], "", None ),
+       ( "GL_MAX_ELEMENTS_INDICES", GLint, ["ctx->Const.MaxArrayLockSize"], "", None ),
+       ( "GL_MAX_ELEMENTS_VERTICES", GLint, ["ctx->Const.MaxArrayLockSize"], "", None ),
+
+       ( "GL_MAX_TEXTURE_SIZE", GLint, ["1 << (ctx->Const.MaxTextureLevels - 1)"], "", None ),
+       ( "GL_MAX_VIEWPORT_DIMS", GLint,
+         ["ctx->Const.MaxViewportWidth", "ctx->Const.MaxViewportHeight"],
+         "", None ),
+       ( "GL_PACK_ALIGNMENT", GLint, ["ctx->Pack.Alignment"], "", None ),
+       ( "GL_ALIASED_POINT_SIZE_RANGE", GLfloat,
+         ["ctx->Const.MinPointSize",
+          "ctx->Const.MaxPointSize"], "", None ),
+       ( "GL_POLYGON_OFFSET_FACTOR", GLfloat, ["ctx->Polygon.OffsetFactor "], "", None ),
+       ( "GL_POLYGON_OFFSET_UNITS", GLfloat, ["ctx->Polygon.OffsetUnits "], "", None ),
+       ( "GL_RED_BITS", GLint, ["ctx->DrawBuffer->Visual.redBits"], "", None ),
+       ( "GL_SCISSOR_BOX", GLint,
+         ["ctx->Scissor.X",
+          "ctx->Scissor.Y",
+          "ctx->Scissor.Width",
+          "ctx->Scissor.Height"], "", None ),
+       ( "GL_SCISSOR_TEST", GLboolean, ["ctx->Scissor.Enabled"], "", None ),
+       ( "GL_STENCIL_BITS", GLint, ["ctx->DrawBuffer->Visual.stencilBits"], "", None ),
+       ( "GL_STENCIL_CLEAR_VALUE", GLint, ["ctx->Stencil.Clear"], "", None ),
+       ( "GL_STENCIL_FAIL", GLenum,
+         ["ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_FUNC", GLenum,
+         ["ctx->Stencil.Function[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_PASS_DEPTH_FAIL", GLenum,
+         ["ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_PASS_DEPTH_PASS", GLenum,
+         ["ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_REF", GLint,
+         ["ctx->Stencil.Ref[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_TEST", GLboolean, ["ctx->Stencil.Enabled"], "", None ),
+       ( "GL_STENCIL_VALUE_MASK", GLint,
+         ["ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_STENCIL_WRITEMASK", GLint,
+         ["ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace]"], "", None ),
+       ( "GL_SUBPIXEL_BITS", GLint, ["ctx->Const.SubPixelBits"], "", None ),
+       ( "GL_TEXTURE_BINDING_2D", GLint,
+         ["ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentTex[TEXTURE_2D_INDEX]->Name"], "", None ),
+       ( "GL_UNPACK_ALIGNMENT", GLint, ["ctx->Unpack.Alignment"], "", None ),
+       ( "GL_VIEWPORT", GLint, [ "ctx->Viewport.X", "ctx->Viewport.Y",
+         "ctx->Viewport.Width", "ctx->Viewport.Height" ], "", None ),
+
+       # GL_ARB_multitexture
+       ( "GL_ACTIVE_TEXTURE_ARB", GLint,
+         [ "GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit"], "", ["ARB_multitexture"] ),
+
+        # Note that all the OES_* extensions require that the Mesa
+        # "struct gl_extensions" include a member with the name of
+        # the extension.  That structure does not yet include OES
+        # extensions (and we're not sure whether it will).  If
+        # it does, all the OES_* extensions below should mark the
+        # dependency.
+
+       # OES_texture_cube_map
+       ( "GL_TEXTURE_BINDING_CUBE_MAP_ARB", GLint,
+         ["ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentTex[TEXTURE_CUBE_INDEX]->Name"],
+         "", None),
+       ( "GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB", GLint,
+         ["(1 << (ctx->Const.MaxCubeTextureLevels - 1))"],
+         "", None),
+
+        # OES_blend_subtract
+       ( "GL_BLEND_SRC_RGB_EXT", GLenum, ["ctx->Color.BlendSrcRGB"], "", None),
+       ( "GL_BLEND_DST_RGB_EXT", GLenum, ["ctx->Color.BlendDstRGB"], "", None),
+       ( "GL_BLEND_SRC_ALPHA_EXT", GLenum, ["ctx->Color.BlendSrcA"], "", None),
+       ( "GL_BLEND_DST_ALPHA_EXT", GLenum, ["ctx->Color.BlendDstA"], "", None),
+
+        # GL_BLEND_EQUATION_RGB, which is what we're really after,
+        # is defined identically to GL_BLEND_EQUATION.
+       ( "GL_BLEND_EQUATION", GLenum, ["ctx->Color.BlendEquationRGB "], "", None),
+       ( "GL_BLEND_EQUATION_ALPHA_EXT", GLenum, ["ctx->Color.BlendEquationA "],
+         "", None),
+
+       # GL_ARB_texture_compression */
+#      ( "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB", GLint,
+#        ["_mesa_get_compressed_formats(ctx, NULL, GL_FALSE)"],
+#        "", ["ARB_texture_compression"] ),
+#      ( "GL_COMPRESSED_TEXTURE_FORMATS_ARB", GLenum,
+#        [],
+#        """GLint formats[100];
+#         GLuint i, n = _mesa_get_compressed_formats(ctx, formats, GL_FALSE);
+#         ASSERT(n <= 100);
+#         for (i = 0; i < n; i++)
+#            params[i] = ENUM_TO_INT(formats[i]);""",
+#        ["ARB_texture_compression"] ),
+
+       # GL_ARB_multisample
+       ( "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB", GLboolean,
+         ["ctx->Multisample.SampleAlphaToCoverage"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLE_COVERAGE_ARB", GLboolean,
+         ["ctx->Multisample.SampleCoverage"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLE_COVERAGE_VALUE_ARB", GLfloat,
+         ["ctx->Multisample.SampleCoverageValue"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLE_COVERAGE_INVERT_ARB", GLboolean,
+         ["ctx->Multisample.SampleCoverageInvert"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLE_BUFFERS_ARB", GLint,
+         ["ctx->DrawBuffer->Visual.sampleBuffers"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLES_ARB", GLint,
+         ["ctx->DrawBuffer->Visual.samples"], "", ["ARB_multisample"] ),
+
+
+       # GL_SGIS_generate_mipmap
+       ( "GL_GENERATE_MIPMAP_HINT_SGIS", GLenum, ["ctx->Hint.GenerateMipmap"],
+         "", ["SGIS_generate_mipmap"] ),
+
+       # GL_ARB_vertex_buffer_object
+       ( "GL_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ArrayBufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+       # GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB - not supported
+       ( "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ElementArrayBufferObj->Name"],
+         "", ["ARB_vertex_buffer_object"] ),
+
+       # GL_OES_read_format
+       ( "GL_IMPLEMENTATION_COLOR_READ_TYPE_OES", GLint,
+         ["ctx->Const.ColorReadType"], "", None),
+       ( "GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES", GLint,
+         ["ctx->Const.ColorReadFormat"], "", None),
+
+       # GL_OES_framebuffer_object
+       ( "GL_FRAMEBUFFER_BINDING_EXT", GLint, ["ctx->DrawBuffer->Name"], "",
+         None),
+       ( "GL_RENDERBUFFER_BINDING_EXT", GLint,
+         ["ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0"], "",
+         None),
+       ( "GL_MAX_RENDERBUFFER_SIZE_EXT", GLint,
+         ["ctx->Const.MaxRenderbufferSize"], "",
+         None),
+
+       # OpenGL ES 1/2 special:
+       ( "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB", GLint,
+         [ "ARRAY_SIZE(compressed_formats)" ],
+         "",
+         None ),
+
+       ("GL_COMPRESSED_TEXTURE_FORMATS_ARB", GLint,
+        [],
+        """
+     int i;
+     for (i = 0; i < ARRAY_SIZE(compressed_formats); i++) {
+        params[i] = compressed_formats[i];
+     }""",
+        None ),
+
+       ( "GL_POLYGON_OFFSET_FILL", GLboolean, ["ctx->Polygon.OffsetFill"], "", None ),
+
+]
+
+# Only present in ES 1.x:
+StateVars_es1 = [
+       ( "GL_MAX_LIGHTS", GLint, ["ctx->Const.MaxLights"], "", None ),
+       ( "GL_LIGHT0", GLboolean, ["ctx->Light.Light[0].Enabled"], "", None ),
+       ( "GL_LIGHT1", GLboolean, ["ctx->Light.Light[1].Enabled"], "", None ),
+       ( "GL_LIGHT2", GLboolean, ["ctx->Light.Light[2].Enabled"], "", None ),
+       ( "GL_LIGHT3", GLboolean, ["ctx->Light.Light[3].Enabled"], "", None ),
+       ( "GL_LIGHT4", GLboolean, ["ctx->Light.Light[4].Enabled"], "", None ),
+       ( "GL_LIGHT5", GLboolean, ["ctx->Light.Light[5].Enabled"], "", None ),
+       ( "GL_LIGHT6", GLboolean, ["ctx->Light.Light[6].Enabled"], "", None ),
+       ( "GL_LIGHT7", GLboolean, ["ctx->Light.Light[7].Enabled"], "", None ),
+       ( "GL_LIGHTING", GLboolean, ["ctx->Light.Enabled"], "", None ),
+       ( "GL_LIGHT_MODEL_AMBIENT", GLfloatN,
+         ["ctx->Light.Model.Ambient[0]",
+          "ctx->Light.Model.Ambient[1]",
+          "ctx->Light.Model.Ambient[2]",
+          "ctx->Light.Model.Ambient[3]"], "", None ),
+       ( "GL_LIGHT_MODEL_TWO_SIDE", GLboolean, ["ctx->Light.Model.TwoSide"], "", None ),
+       ( "GL_ALPHA_TEST", GLboolean, ["ctx->Color.AlphaEnabled"], "", None ),
+       ( "GL_ALPHA_TEST_FUNC", GLenum, ["ctx->Color.AlphaFunc"], "", None ),
+       ( "GL_ALPHA_TEST_REF", GLfloatN, ["ctx->Color.AlphaRef"], "", None ),
+       ( "GL_BLEND_DST", GLenum, ["ctx->Color.BlendDstRGB"], "", None ),
+       ( "GL_MAX_CLIP_PLANES", GLint, ["ctx->Const.MaxClipPlanes"], "", None ),
+       ( "GL_CLIP_PLANE0", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 0) & 1" ], "", None ),
+       ( "GL_CLIP_PLANE1", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 1) & 1" ], "", None ),
+       ( "GL_CLIP_PLANE2", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 2) & 1" ], "", None ),
+       ( "GL_CLIP_PLANE3", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 3) & 1" ], "", None ),
+       ( "GL_CLIP_PLANE4", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 4) & 1" ], "", None ),
+       ( "GL_CLIP_PLANE5", GLboolean,
+         [ "(ctx->Transform.ClipPlanesEnabled >> 5) & 1" ], "", None ),
+       ( "GL_COLOR_MATERIAL", GLboolean,
+         ["ctx->Light.ColorMaterialEnabled"], "", None ),
+       ( "GL_CURRENT_COLOR", GLfloatN,
+         [ "ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0]",
+               "ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1]",
+               "ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2]",
+               "ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3]" ],
+         "FLUSH_CURRENT(ctx, 0);", None ),
+       ( "GL_CURRENT_NORMAL", GLfloatN,
+         [ "ctx->Current.Attrib[VERT_ATTRIB_NORMAL][0]",
+               "ctx->Current.Attrib[VERT_ATTRIB_NORMAL][1]",
+               "ctx->Current.Attrib[VERT_ATTRIB_NORMAL][2]"],
+         "FLUSH_CURRENT(ctx, 0);", None ),
+       ( "GL_CURRENT_TEXTURE_COORDS", GLfloat,
+         ["ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][0]",
+          "ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][1]",
+          "ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][2]",
+          "ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texUnit][3]"],
+         "const GLuint texUnit = ctx->Texture.CurrentUnit;", None ),
+       ( "GL_DISTANCE_ATTENUATION_EXT", GLfloat,
+         ["ctx->Point.Params[0]",
+          "ctx->Point.Params[1]",
+          "ctx->Point.Params[2]"], "", None ),
+       ( "GL_FOG", GLboolean, ["ctx->Fog.Enabled"], "", None ),
+       ( "GL_FOG_COLOR", GLfloatN,
+         [ "ctx->Fog.Color[0]",
+               "ctx->Fog.Color[1]",
+               "ctx->Fog.Color[2]",
+               "ctx->Fog.Color[3]" ], "", None ),
+       ( "GL_FOG_DENSITY", GLfloat, ["ctx->Fog.Density"], "", None ),
+       ( "GL_FOG_END", GLfloat, ["ctx->Fog.End"], "", None ),
+       ( "GL_FOG_HINT", GLenum, ["ctx->Hint.Fog"], "", None ),
+       ( "GL_FOG_MODE", GLenum, ["ctx->Fog.Mode"], "", None ),
+       ( "GL_FOG_START", GLfloat, ["ctx->Fog.Start"], "", None ),
+       ( "GL_LINE_SMOOTH", GLboolean, ["ctx->Line.SmoothFlag"], "", None ),
+       ( "GL_LINE_SMOOTH_HINT", GLenum, ["ctx->Hint.LineSmooth"], "", None ),
+       ( "GL_LINE_WIDTH_RANGE", GLfloat,
+         ["ctx->Const.MinLineWidthAA",
+          "ctx->Const.MaxLineWidthAA"], "", None ),
+       ( "GL_COLOR_LOGIC_OP", GLboolean, ["ctx->Color.ColorLogicOpEnabled"], "", None ),
+       ( "GL_LOGIC_OP_MODE", GLenum, ["ctx->Color.LogicOp"], "", None ),
+       ( "GL_MATRIX_MODE", GLenum, ["ctx->Transform.MatrixMode"], "", None ),
+
+       ( "GL_MAX_MODELVIEW_STACK_DEPTH", GLint, ["MAX_MODELVIEW_STACK_DEPTH"], "", None ),
+       ( "GL_MAX_PROJECTION_STACK_DEPTH", GLint, ["MAX_PROJECTION_STACK_DEPTH"], "", None ),
+       ( "GL_MAX_TEXTURE_STACK_DEPTH", GLint, ["MAX_TEXTURE_STACK_DEPTH"], "", None ),
+       ( "GL_MODELVIEW_MATRIX", GLfloat,
+         [ "matrix[0]", "matrix[1]", "matrix[2]", "matrix[3]",
+               "matrix[4]", "matrix[5]", "matrix[6]", "matrix[7]",
+               "matrix[8]", "matrix[9]", "matrix[10]", "matrix[11]",
+               "matrix[12]", "matrix[13]", "matrix[14]", "matrix[15]" ],
+         "const GLfloat *matrix = ctx->ModelviewMatrixStack.Top->m;", None ),
+       ( "GL_MODELVIEW_STACK_DEPTH", GLint, ["ctx->ModelviewMatrixStack.Depth + 1"], "", None ),
+       ( "GL_NORMALIZE", GLboolean, ["ctx->Transform.Normalize"], "", None ),
+       ( "GL_PACK_SKIP_IMAGES_EXT", GLint, ["ctx->Pack.SkipImages"], "", None ),
+       ( "GL_PERSPECTIVE_CORRECTION_HINT", GLenum,
+         ["ctx->Hint.PerspectiveCorrection"], "", None ),
+       ( "GL_POINT_SIZE", GLfloat, ["ctx->Point.Size"], "", None ),
+       ( "GL_POINT_SIZE_RANGE", GLfloat,
+         ["ctx->Const.MinPointSizeAA",
+          "ctx->Const.MaxPointSizeAA"], "", None ),
+       ( "GL_POINT_SMOOTH", GLboolean, ["ctx->Point.SmoothFlag"], "", None ),
+       ( "GL_POINT_SMOOTH_HINT", GLenum, ["ctx->Hint.PointSmooth"], "", None ),
+       ( "GL_POINT_SIZE_MIN_EXT", GLfloat, ["ctx->Point.MinSize"], "", None ),
+       ( "GL_POINT_SIZE_MAX_EXT", GLfloat, ["ctx->Point.MaxSize"], "", None ),
+       ( "GL_POINT_FADE_THRESHOLD_SIZE_EXT", GLfloat,
+         ["ctx->Point.Threshold"], "", None ),
+       ( "GL_PROJECTION_MATRIX", GLfloat,
+         [ "matrix[0]", "matrix[1]", "matrix[2]", "matrix[3]",
+               "matrix[4]", "matrix[5]", "matrix[6]", "matrix[7]",
+               "matrix[8]", "matrix[9]", "matrix[10]", "matrix[11]",
+               "matrix[12]", "matrix[13]", "matrix[14]", "matrix[15]" ],
+         "const GLfloat *matrix = ctx->ProjectionMatrixStack.Top->m;", None ),
+       ( "GL_PROJECTION_STACK_DEPTH", GLint,
+         ["ctx->ProjectionMatrixStack.Depth + 1"], "", None ),
+       ( "GL_RESCALE_NORMAL", GLboolean,
+         ["ctx->Transform.RescaleNormals"], "", None ),
+       ( "GL_SHADE_MODEL", GLenum, ["ctx->Light.ShadeModel"], "", None ),
+       ( "GL_TEXTURE_2D", GLboolean, ["_mesa_IsEnabled(GL_TEXTURE_2D)"], "", None ),
+       ( "GL_TEXTURE_MATRIX", GLfloat,
+         ["matrix[0]", "matrix[1]", "matrix[2]", "matrix[3]",
+          "matrix[4]", "matrix[5]", "matrix[6]", "matrix[7]",
+          "matrix[8]", "matrix[9]", "matrix[10]", "matrix[11]",
+          "matrix[12]", "matrix[13]", "matrix[14]", "matrix[15]" ],
+         "const GLfloat *matrix = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top->m;", None ),
+       ( "GL_TEXTURE_STACK_DEPTH", GLint,
+         ["ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Depth + 1"], "", None ),
+       ( "GL_VERTEX_ARRAY", GLboolean, ["ctx->Array.ArrayObj->Vertex.Enabled"], "", None ),
+       ( "GL_VERTEX_ARRAY_SIZE", GLint, ["ctx->Array.ArrayObj->Vertex.Size"], "", None ),
+       ( "GL_VERTEX_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Vertex.Type"], "", None ),
+       ( "GL_VERTEX_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Vertex.Stride"], "", None ),
+       ( "GL_NORMAL_ARRAY", GLenum, ["ctx->Array.ArrayObj->Normal.Enabled"], "", None ),
+       ( "GL_NORMAL_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Normal.Type"], "", None ),
+       ( "GL_NORMAL_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Normal.Stride"], "", None ),
+       ( "GL_COLOR_ARRAY", GLboolean, ["ctx->Array.ArrayObj->Color.Enabled"], "", None ),
+       ( "GL_COLOR_ARRAY_SIZE", GLint, ["ctx->Array.ArrayObj->Color.Size"], "", None ),
+       ( "GL_COLOR_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Color.Type"], "", None ),
+       ( "GL_COLOR_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Color.Stride"], "", None ),
+       ( "GL_TEXTURE_COORD_ARRAY", GLboolean,
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled"], "", None ),
+       ( "GL_TEXTURE_COORD_ARRAY_SIZE", GLint,
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Size"], "", None ),
+       ( "GL_TEXTURE_COORD_ARRAY_TYPE", GLenum,
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Type"], "", None ),
+       ( "GL_TEXTURE_COORD_ARRAY_STRIDE", GLint,
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Stride"], "", None ),
+       # GL_ARB_multitexture
+       ( "GL_MAX_TEXTURE_UNITS_ARB", GLint,
+         ["ctx->Const.MaxTextureUnits"], "", ["ARB_multitexture"] ),
+       ( "GL_CLIENT_ACTIVE_TEXTURE_ARB", GLint,
+         ["GL_TEXTURE0_ARB + ctx->Array.ActiveTexture"], "", ["ARB_multitexture"] ),
+        # OES_texture_cube_map
+       ( "GL_TEXTURE_CUBE_MAP_ARB", GLboolean,
+         ["_mesa_IsEnabled(GL_TEXTURE_CUBE_MAP_ARB)"], "", None),
+       ( "GL_TEXTURE_GEN_S", GLboolean,
+         ["((ctx->Texture.Unit[ctx->Texture.CurrentUnit].TexGenEnabled & S_BIT) ? 1 : 0)"], "", None),
+       ( "GL_TEXTURE_GEN_T", GLboolean,
+         ["((ctx->Texture.Unit[ctx->Texture.CurrentUnit].TexGenEnabled & T_BIT) ? 1 : 0)"], "", None),
+       ( "GL_TEXTURE_GEN_R", GLboolean,
+         ["((ctx->Texture.Unit[ctx->Texture.CurrentUnit].TexGenEnabled & R_BIT) ? 1 : 0)"], "", None),
+        # ARB_multisample
+       ( "GL_MULTISAMPLE_ARB", GLboolean,
+         ["ctx->Multisample.Enabled"], "", ["ARB_multisample"] ),
+       ( "GL_SAMPLE_ALPHA_TO_ONE_ARB", GLboolean,
+         ["ctx->Multisample.SampleAlphaToOne"], "", ["ARB_multisample"] ),
+
+       ( "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ArrayObj->Vertex.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+       ( "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ArrayObj->Normal.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+       ( "GL_COLOR_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ArrayObj->Color.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+       ( "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB", GLint,
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].BufferObj->Name"],
+         "", ["ARB_vertex_buffer_object"] ),
+
+       # OES_point_sprite
+       ( "GL_POINT_SPRITE_NV", GLboolean, ["ctx->Point.PointSprite"], # == GL_POINT_SPRITE_ARB
+         "", None),
+
+       # GL_ARB_fragment_shader
+       ( "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB", GLint,
+         ["ctx->Const.FragmentProgram.MaxUniformComponents"], "",
+         ["ARB_fragment_shader"] ),
+
+        # GL_ARB_vertex_shader
+       ( "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB", GLint,
+         ["ctx->Const.VertexProgram.MaxUniformComponents"], "",
+         ["ARB_vertex_shader"] ),
+       ( "GL_MAX_VARYING_FLOATS_ARB", GLint,
+         ["ctx->Const.MaxVarying * 4"], "", ["ARB_vertex_shader"] ),
+
+        # OES_matrix_get
+       ( "GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES", GLint, [],
+         """
+      /* See GL_OES_matrix_get */
+      {
+         const GLfloat *matrix = ctx->ModelviewMatrixStack.Top->m;
+         memcpy(params, matrix, 16 * sizeof(GLint));
+      }""",
+         None),
+
+       ( "GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES", GLint, [],
+         """
+      /* See GL_OES_matrix_get */
+      {
+         const GLfloat *matrix = ctx->ProjectionMatrixStack.Top->m;
+         memcpy(params, matrix, 16 * sizeof(GLint));
+      }""",
+         None),
+
+       ( "GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES", GLint, [],
+         """
+      /* See GL_OES_matrix_get */
+      {
+         const GLfloat *matrix =
+            ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top->m;
+         memcpy(params, matrix, 16 * sizeof(GLint));
+      }""",
+         None),
+
+        # OES_point_size_array
+       ("GL_POINT_SIZE_ARRAY_OES", GLboolean,
+        ["ctx->Array.ArrayObj->PointSize.Enabled"], "", None),
+       ("GL_POINT_SIZE_ARRAY_TYPE_OES", GLenum,
+      ["ctx->Array.ArrayObj->PointSize.Type"], "", None),
+       ("GL_POINT_SIZE_ARRAY_STRIDE_OES", GLint,
+        ["ctx->Array.ArrayObj->PointSize.Stride"], "", None),
+       ("GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES", GLint,
+        ["ctx->Array.ArrayObj->PointSize.BufferObj->Name"], "", None),
+
+       # GL_EXT_texture_filter_anisotropic
+       ( "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT", GLfloat,
+         ["ctx->Const.MaxTextureMaxAnisotropy"], "", ["EXT_texture_filter_anisotropic"]),
+
+]
+
+# Only present in ES 2.x:
+StateVars_es2 = [
+       # XXX These entries are not spec'ed for GLES 2, but are
+        #     needed for Mesa's GLSL:
+       ( "GL_MAX_LIGHTS", GLint, ["ctx->Const.MaxLights"], "", None ),
+       ( "GL_MAX_CLIP_PLANES", GLint, ["ctx->Const.MaxClipPlanes"], "", None ),
+        ( "GL_MAX_TEXTURE_COORDS_ARB", GLint, # == GL_MAX_TEXTURE_COORDS_NV
+          ["ctx->Const.MaxTextureCoordUnits"], "",
+          ["ARB_fragment_program", "NV_fragment_program"] ),
+       ( "GL_MAX_DRAW_BUFFERS_ARB", GLint,
+         ["ctx->Const.MaxDrawBuffers"], "", ["ARB_draw_buffers"] ),
+       ( "GL_BLEND_COLOR_EXT", GLfloatN,
+         [ "ctx->Color.BlendColor[0]",
+               "ctx->Color.BlendColor[1]",
+               "ctx->Color.BlendColor[2]",
+               "ctx->Color.BlendColor[3]"], "", None ),
+
+        # This is required for GLES2, but also needed for GLSL:
+        ( "GL_MAX_TEXTURE_IMAGE_UNITS_ARB", GLint, # == GL_MAX_TEXTURE_IMAGE_UNI
+          ["ctx->Const.MaxTextureImageUnits"], "",
+          ["ARB_fragment_program", "NV_fragment_program"] ),
+
+       ( "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB", GLint,
+         ["ctx->Const.MaxVertexTextureImageUnits"], "", ["ARB_vertex_shader"] ),
+       ( "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB", GLint,
+         ["MAX_COMBINED_TEXTURE_IMAGE_UNITS"], "", ["ARB_vertex_shader"] ),
+
+       # GL_ARB_shader_objects
+       # Actually, this token isn't part of GL_ARB_shader_objects, but is
+       # close enough for now.
+       ( "GL_CURRENT_PROGRAM", GLint,
+         ["ctx->Shader.CurrentProgram ? ctx->Shader.CurrentProgram->Name : 0"],
+         "", ["ARB_shader_objects"] ),
+
+       # OpenGL 2.0
+       ( "GL_STENCIL_BACK_FUNC", GLenum, ["ctx->Stencil.Function[1]"], "", None ),
+       ( "GL_STENCIL_BACK_VALUE_MASK", GLint, ["ctx->Stencil.ValueMask[1]"], "", None ),
+       ( "GL_STENCIL_BACK_WRITEMASK", GLint, ["ctx->Stencil.WriteMask[1]"], "", None ),
+       ( "GL_STENCIL_BACK_REF", GLint, ["ctx->Stencil.Ref[1]"], "", None ),
+       ( "GL_STENCIL_BACK_FAIL", GLenum, ["ctx->Stencil.FailFunc[1]"], "", None ),
+       ( "GL_STENCIL_BACK_PASS_DEPTH_FAIL", GLenum, ["ctx->Stencil.ZFailFunc[1]"], "", None ),
+       ( "GL_STENCIL_BACK_PASS_DEPTH_PASS", GLenum, ["ctx->Stencil.ZPassFunc[1]"], "", None ),
+
+       ( "GL_MAX_VERTEX_ATTRIBS_ARB", GLint,
+         ["ctx->Const.VertexProgram.MaxAttribs"], "", ["ARB_vertex_program"] ),
+
+        # OES_texture_3D 
+       ( "GL_TEXTURE_BINDING_3D", GLint,
+         ["ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentTex[TEXTURE_3D_INDEX]->Name"], "", None),
+       ( "GL_MAX_3D_TEXTURE_SIZE", GLint, ["1 << (ctx->Const.Max3DTextureLevels - 1)"], "", None),
+
+        # OES_standard_derivatives
+       ( "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB", GLenum,
+         ["ctx->Hint.FragmentShaderDerivative"], "", ["ARB_fragment_shader"] ),
+
+       # Unique to ES 2 (not in full GL)
+       ( "GL_MAX_FRAGMENT_UNIFORM_VECTORS", GLint,
+         ["ctx->Const.FragmentProgram.MaxUniformComponents / 4"], "", None),
+       ( "GL_MAX_VARYING_VECTORS", GLint,
+         ["ctx->Const.MaxVarying"], "", None),
+       ( "GL_MAX_VERTEX_UNIFORM_VECTORS", GLint,
+         ["ctx->Const.VertexProgram.MaxUniformComponents / 4"], "", None),
+       ( "GL_SHADER_COMPILER", GLint, ["1"], "", None),
+        # OES_get_program_binary
+       ( "GL_NUM_SHADER_BINARY_FORMATS", GLint, ["0"], "", None),
+       ( "GL_SHADER_BINARY_FORMATS", GLint, [], "", None),
+]
+
+
+
+def ConversionFunc(fromType, toType):
+       """Return the name of the macro to convert between two data types."""
+       if fromType == toType:
+               return ""
+       elif fromType == GLfloat and toType == GLint:
+               return "IROUND"
+       elif fromType == GLfloatN and toType == GLfloat:
+               return ""
+       elif fromType == GLint and toType == GLfloat: # but not GLfloatN!
+               return "(GLfloat)"
+       else:
+               if fromType == GLfloatN:
+                       fromType = GLfloat
+               fromStr = TypeStrings[fromType]
+               fromStr = string.upper(fromStr[2:])
+               toStr = TypeStrings[toType]
+               toStr = string.upper(toStr[2:])
+               return fromStr + "_TO_" + toStr
+
+
+def EmitGetFunction(stateVars, returnType):
+       """Emit the code to implement glGetBooleanv, glGetIntegerv or glGetFloatv."""
+       assert (returnType == GLboolean or
+                       returnType == GLint or
+                       returnType == GLfloat)
+
+       strType = TypeStrings[returnType]
+       # Capitalize first letter of return type
+       if returnType == GLint:
+               function = "_mesa_GetIntegerv"
+       elif returnType == GLboolean:
+               function = "_mesa_GetBooleanv"
+       elif returnType == GLfloat:
+               function = "_mesa_GetFloatv"
+       else:
+               abort()
+
+       print "void GLAPIENTRY"
+       print "%s( GLenum pname, %s *params )" % (function, strType)
+       print "{"
+       print "   GET_CURRENT_CONTEXT(ctx);"
+       print "   ASSERT_OUTSIDE_BEGIN_END(ctx);"
+       print ""
+       print "   if (!params)"
+       print "      return;"
+       print ""
+       print "   if (ctx->NewState)"
+       print "      _mesa_update_state(ctx);"
+       print ""
+       print "   switch (pname) {"
+
+       for (name, varType, state, optionalCode, extensions) in stateVars:
+               print "      case " + name + ":"
+               if extensions:
+                       if len(extensions) == 1:
+                               print ('         CHECK_EXT1(%s, "%s");' %
+                                          (extensions[0], function))
+                       elif len(extensions) == 2:
+                               print ('         CHECK_EXT2(%s, %s, "%s");' %
+                                          (extensions[0], extensions[1], function))
+                       elif len(extensions) == 3:
+                               print ('         CHECK_EXT3(%s, %s, %s, "%s");' %
+                                          (extensions[0], extensions[1], extensions[2], function))
+                       else:
+                               assert len(extensions) == 4
+                               print ('         CHECK_EXT4(%s, %s, %s, %s, "%s");' %
+                                          (extensions[0], extensions[1], extensions[2], extensions[3], function))
+               if optionalCode:
+                       print "         {"
+                       print "         " + optionalCode
+               conversion = ConversionFunc(varType, returnType)
+               n = len(state)
+               for i in range(n):
+                       if conversion:
+                               print "         params[%d] = %s(%s);" % (i, conversion, state[i])
+                       else:
+                               print "         params[%d] = %s;" % (i, state[i])
+               if optionalCode:
+                       print "         }"
+               print "         break;"
+
+       print "      default:"
+       print '         _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(pname=0x%%x)", pname);' % function
+       print "   }"
+       print "}"
+       print ""
+       return
+
+
+
+def EmitHeader():
+       """Print the get.c file header."""
+       print """
+/***
+ ***  NOTE!!!  DO NOT EDIT THIS FILE!!!  IT IS GENERATED BY get_gen.py
+ ***/
+
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/enable.h"
+#include "main/extensions.h"
+#include "main/fbobject.h"
+#include "main/get.h"
+#include "main/macros.h"
+#include "main/mtypes.h"
+#include "main/state.h"
+#include "main/texcompress.h"
+
+
+/* ES1 tokens that should be in gl.h but aren't */
+#define GL_MAX_ELEMENTS_INDICES             0x80E9
+#define GL_MAX_ELEMENTS_VERTICES            0x80E8
+
+
+/* ES2 special tokens */
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS     0x8DFD
+#define GL_MAX_VARYING_VECTORS              0x8DFC
+#define GL_MAX_VARYING_VECTORS              0x8DFC
+#define GL_MAX_VERTEX_UNIFORM_VECTORS       0x8DFB
+#define GL_SHADER_COMPILER                  0x8DFA
+#define GL_PLATFORM_BINARY                  0x8D63
+#define GL_SHADER_BINARY_FORMATS            0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS        0x8DF9
+
+
+#ifndef GL_OES_matrix_get
+#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES               0x898D
+#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES              0x898E
+#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES                 0x898F
+#endif
+
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_PALETTE4_RGB8_OES                                    0x8B90
+#define GL_PALETTE4_RGBA8_OES                                   0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES                                0x8B92
+#define GL_PALETTE4_RGBA4_OES                                   0x8B93
+#define GL_PALETTE4_RGB5_A1_OES                                 0x8B94
+#define GL_PALETTE8_RGB8_OES                                    0x8B95
+#define GL_PALETTE8_RGBA8_OES                                   0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES                                0x8B97
+#define GL_PALETTE8_RGBA4_OES                                   0x8B98
+#define GL_PALETTE8_RGB5_A1_OES                                 0x8B99
+#endif
+
+
+#define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE )
+
+#define INT_TO_BOOLEAN(I)     ( (I) ? GL_TRUE : GL_FALSE )
+
+#define BOOLEAN_TO_INT(B)     ( (GLint) (B) )
+#define BOOLEAN_TO_FLOAT(B)   ( (B) ? 1.0F : 0.0F )
+
+
+/*
+ * Check if named extension is enabled, if not generate error and return.
+ */
+#define CHECK_EXT1(EXT1, FUNC)                                         \\
+   if (!ctx->Extensions.EXT1) {                                        \\
+      _mesa_error(ctx, GL_INVALID_ENUM, FUNC "(0x%x)", (int) pname);  \\
+      return;                                                          \\
+   }
+
+/*
+ * Check if either of two extensions is enabled.
+ */
+#define CHECK_EXT2(EXT1, EXT2, FUNC)                                   \\
+   if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) {               \\
+      _mesa_error(ctx, GL_INVALID_ENUM, FUNC "(0x%x)", (int) pname);  \\
+      return;                                                          \\
+   }
+
+/*
+ * Check if either of three extensions is enabled.
+ */
+#define CHECK_EXT3(EXT1, EXT2, EXT3, FUNC)                             \\
+   if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2 &&               \\
+       !ctx->Extensions.EXT3) {                                        \\
+      _mesa_error(ctx, GL_INVALID_ENUM, FUNC "(0x%x)", (int) pname);  \\
+      return;                                                          \\
+   }
+
+/*
+ * Check if either of four extensions is enabled.
+ */
+#define CHECK_EXT4(EXT1, EXT2, EXT3, EXT4, FUNC)                       \\
+   if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2 &&               \\
+       !ctx->Extensions.EXT3 && !ctx->Extensions.EXT4) {               \\
+      _mesa_error(ctx, GL_INVALID_ENUM, FUNC "(0x%x)", (int) pname);  \\
+      return;                                                          \\
+   }
+
+
+
+/**
+ * List of compressed texture formats supported by ES.
+ */
+static GLenum compressed_formats[] = {
+   GL_PALETTE4_RGB8_OES,
+   GL_PALETTE4_RGBA8_OES,
+   GL_PALETTE4_R5_G6_B5_OES,
+   GL_PALETTE4_RGBA4_OES,
+   GL_PALETTE4_RGB5_A1_OES,
+   GL_PALETTE8_RGB8_OES,
+   GL_PALETTE8_RGBA8_OES,
+   GL_PALETTE8_R5_G6_B5_OES,
+   GL_PALETTE8_RGBA4_OES,
+   GL_PALETTE8_RGB5_A1_OES
+};
+
+#define ARRAY_SIZE(A)  (sizeof(A) / sizeof(A[0]))
+
+"""
+       return
+
+
+def EmitAll(stateVars):
+       EmitHeader()
+       EmitGetFunction(stateVars, GLboolean)
+       EmitGetFunction(stateVars, GLfloat)
+       EmitGetFunction(stateVars, GLint)
+
+
+def main(args):
+       # Determine whether to generate ES1 or ES2 queries
+       if len(args) > 1 and args[1] == "1":
+               API = 1
+       elif len(args) > 1 and args[1] == "2":
+               API = 2
+       else:
+               API = 1
+       #print "len args = %d  API = %d" % (len(args), API)
+
+       if API == 1:
+               vars = StateVars_common + StateVars_es1
+       else:
+               vars = StateVars_common + StateVars_es2
+
+       EmitAll(vars)
+
+
+main(sys.argv)
diff --git a/src/mesa/es/main/mfeatures_es1.h b/src/mesa/es/main/mfeatures_es1.h
new file mode 100644 (file)
index 0000000..9c65596
--- /dev/null
@@ -0,0 +1,115 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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.
+ * 
+ **************************************************************************/
+
+/**
+ * \file mfeatures.h
+ *
+ * The #defines in this file enable/disable Mesa features needed
+ * for OpenGL ES 1.1.
+ */
+
+
+#ifndef MFEATURES_ES1_H
+#define MFEATURES_ES1_H
+
+/* this file replaces main/mfeatures.h */
+#ifdef FEATURES_H
+#error "main/mfeatures.h was wrongly included"
+#endif
+#define FEATURES_H
+
+#define ASSERT_NO_FEATURE() ASSERT(0)
+
+/*
+ * Enable/disable features (blocks of code) by setting FEATURE_xyz to 0 or 1.
+ */
+#ifndef _HAVE_FULL_GL
+#define _HAVE_FULL_GL 1
+#endif
+
+#ifdef IN_DRI_DRIVER
+#define FEATURE_remap_table 1
+#else
+#define FEATURE_remap_table 0
+#endif
+
+#define FEATURE_accum 0
+#define FEATURE_arrayelt 0
+#define FEATURE_attrib 0
+#define FEATURE_beginend 0
+#define FEATURE_colortable 0
+#define FEATURE_convolve 0
+#define FEATURE_dispatch 1
+#define FEATURE_dlist 0
+#define FEATURE_draw_read_buffer 0
+#define FEATURE_drawpix 0
+#define FEATURE_eval 0
+#define FEATURE_feedback 0
+#define FEATURE_fixedpt 1
+#define FEATURE_histogram 0
+#define FEATURE_pixel 0
+#define FEATURE_point_size_array 1
+#define FEATURE_queryobj 0
+#define FEATURE_rastpos 0
+#define FEATURE_texgen 1
+#define FEATURE_texture_fxt1 0
+#define FEATURE_texture_s3tc 0
+#define FEATURE_userclip 1
+#define FEATURE_vertex_array_byte 1
+#define FEATURE_es2_glsl 0
+
+#define FEATURE_ARB_fragment_program  _HAVE_FULL_GL
+#define FEATURE_ARB_vertex_buffer_object  _HAVE_FULL_GL
+#define FEATURE_ARB_vertex_program  _HAVE_FULL_GL
+
+#define FEATURE_ARB_vertex_shader _HAVE_FULL_GL
+#define FEATURE_ARB_fragment_shader _HAVE_FULL_GL
+#define FEATURE_ARB_shader_objects (FEATURE_ARB_vertex_shader || FEATURE_ARB_fragment_shader)
+#define FEATURE_ARB_shading_language_100 FEATURE_ARB_shader_objects
+#define FEATURE_ARB_shading_language_120 FEATURE_ARB_shader_objects
+
+#define FEATURE_EXT_framebuffer_blit 0
+#define FEATURE_EXT_framebuffer_object _HAVE_FULL_GL
+#define FEATURE_EXT_pixel_buffer_object  _HAVE_FULL_GL
+#define FEATURE_EXT_texture_sRGB 0
+#define FEATURE_ATI_fragment_shader 0
+#define FEATURE_MESA_program_debug  _HAVE_FULL_GL
+#define FEATURE_NV_fence 0
+#define FEATURE_NV_fragment_program 0
+#define FEATURE_NV_vertex_program 0
+
+#define FEATURE_OES_framebuffer_object 1
+#define FEATURE_OES_mapbuffer 1
+
+#define FEATURE_extra_context_init 1
+
+/*@}*/
+
+
+
+
+#endif /* MFEATURES_ES1_H */
diff --git a/src/mesa/es/main/mfeatures_es2.h b/src/mesa/es/main/mfeatures_es2.h
new file mode 100644 (file)
index 0000000..6ed7b67
--- /dev/null
@@ -0,0 +1,115 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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.
+ * 
+ **************************************************************************/
+
+/**
+ * \file mfeatures.h
+ *
+ * The #defines in this file enable/disable Mesa features needed
+ * for OpenGL ES 2.0.
+ */
+
+
+#ifndef MFEATURES_ES2_H
+#define MFEATURES_ES2_H
+
+/* this file replaces main/mfeatures.h */
+#ifdef FEATURES_H
+#error "main/mfeatures.h was wrongly included"
+#endif
+#define FEATURES_H
+
+#define ASSERT_NO_FEATURE() ASSERT(0)
+
+/*
+ * Enable/disable features (blocks of code) by setting FEATURE_xyz to 0 or 1.
+ */
+#ifndef _HAVE_FULL_GL
+#define _HAVE_FULL_GL 1
+#endif
+
+#ifdef IN_DRI_DRIVER
+#define FEATURE_remap_table 1
+#else
+#define FEATURE_remap_table 0
+#endif
+
+#define FEATURE_accum 0
+#define FEATURE_arrayelt 0
+#define FEATURE_attrib 0
+#define FEATURE_beginend 0
+#define FEATURE_colortable 0
+#define FEATURE_convolve 0
+#define FEATURE_dispatch 1
+#define FEATURE_dlist 0
+#define FEATURE_draw_read_buffer 0
+#define FEATURE_drawpix 0
+#define FEATURE_eval 0
+#define FEATURE_feedback 0
+#define FEATURE_fixedpt 1
+#define FEATURE_histogram 0
+#define FEATURE_pixel 0
+#define FEATURE_point_size_array 1
+#define FEATURE_queryobj 0
+#define FEATURE_rastpos 0
+#define FEATURE_texgen 1
+#define FEATURE_texture_fxt1 0
+#define FEATURE_texture_s3tc 0
+#define FEATURE_userclip 1
+#define FEATURE_vertex_array_byte 1
+#define FEATURE_es2_glsl 1
+
+#define FEATURE_ARB_fragment_program  _HAVE_FULL_GL
+#define FEATURE_ARB_vertex_buffer_object  _HAVE_FULL_GL
+#define FEATURE_ARB_vertex_program  _HAVE_FULL_GL
+
+#define FEATURE_ARB_vertex_shader _HAVE_FULL_GL
+#define FEATURE_ARB_fragment_shader _HAVE_FULL_GL
+#define FEATURE_ARB_shader_objects (FEATURE_ARB_vertex_shader || FEATURE_ARB_fragment_shader)
+#define FEATURE_ARB_shading_language_100 FEATURE_ARB_shader_objects
+#define FEATURE_ARB_shading_language_120 FEATURE_ARB_shader_objects
+
+#define FEATURE_EXT_framebuffer_blit 0
+#define FEATURE_EXT_framebuffer_object _HAVE_FULL_GL
+#define FEATURE_EXT_pixel_buffer_object  _HAVE_FULL_GL
+#define FEATURE_EXT_texture_sRGB 0
+#define FEATURE_ATI_fragment_shader 0
+#define FEATURE_MESA_program_debug  _HAVE_FULL_GL
+#define FEATURE_NV_fence 0
+#define FEATURE_NV_fragment_program 0
+#define FEATURE_NV_vertex_program 0
+
+#define FEATURE_OES_framebuffer_object 1
+#define FEATURE_OES_mapbuffer 1
+
+#define FEATURE_extra_context_init 1
+
+/*@}*/
+
+
+
+
+#endif /* MFEATURES_ES2_H */
diff --git a/src/mesa/es/main/specials_es1.c b/src/mesa/es/main/specials_es1.c
new file mode 100644 (file)
index 0000000..84d339e
--- /dev/null
@@ -0,0 +1,186 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, 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, 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
+ * TUNGSTEN GRAPHICS 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 "main/mtypes.h"
+#include "main/context.h"
+#include "main/imports.h"
+#include "main/get.h"
+
+
+extern const GLubyte * GLAPIENTRY _es_GetString(GLenum name);
+
+
+static const GLubyte *
+compute_es_version(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   static const char es_1_0[] = "OpenGL ES-CM 1.0";
+   static const char es_1_1[] = "OpenGL ES-CM 1.1";
+   /* OpenGL ES 1.0 is derived from OpenGL 1.3 */
+   const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample &&
+                              ctx->Extensions.ARB_multitexture &&
+                              ctx->Extensions.ARB_texture_compression &&
+                              ctx->Extensions.EXT_texture_env_add &&
+                              ctx->Extensions.ARB_texture_env_combine &&
+                              ctx->Extensions.ARB_texture_env_dot3);
+   /* OpenGL ES 1.1 is derived from OpenGL 1.5 */
+   const GLboolean ver_1_1 = (ver_1_0 &&
+                              ctx->Extensions.EXT_point_parameters &&
+                              ctx->Extensions.SGIS_generate_mipmap &&
+                              ctx->Extensions.ARB_vertex_buffer_object);
+   if (ver_1_1)
+      return (const GLubyte *) es_1_1;
+
+   if (!ver_1_0)
+      _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
+   return (const GLubyte *) es_1_0;
+}
+
+
+static size_t
+append_extension(char **str, const char *ext)
+{
+   char *s = *str;
+   size_t len = strlen(ext);
+
+   if (s) {
+      memcpy(s, ext, len);
+      s[len++] = ' ';
+      s[len] = '\0';
+
+      *str += len;
+   }
+   else {
+      len++;
+   }
+
+   return len;
+}
+
+
+static size_t
+make_extension_string(const GLcontext *ctx, char *str)
+{
+   size_t len = 0;
+
+   /* Core additions */
+   len += append_extension(&str, "GL_OES_byte_coordinates");
+   len += append_extension(&str, "GL_OES_fixed_point");
+   len += append_extension(&str, "GL_OES_single_precision");
+   len += append_extension(&str, "GL_OES_matrix_get");
+
+   /* 1.1 required extensions */
+   len += append_extension(&str, "GL_OES_read_format");
+   len += append_extension(&str, "GL_OES_compressed_paletted_texture");
+   len += append_extension(&str, "GL_OES_point_size_array");
+   len += append_extension(&str, "GL_OES_point_sprite");
+
+   /* 1.1 deprecated extensions */
+   len += append_extension(&str, "GL_OES_query_matrix");
+
+   if (ctx->Extensions.EXT_blend_equation_separate)
+      len += append_extension(&str, "GL_OES_blend_equation_separate");
+   if (ctx->Extensions.EXT_blend_func_separate)
+      len += append_extension(&str, "GL_OES_blend_func_separate");
+   if (ctx->Extensions.EXT_blend_subtract)
+      len += append_extension(&str, "GL_OES_blend_subtract");
+
+   if (ctx->Extensions.EXT_stencil_wrap)
+      len += append_extension(&str, "GL_OES_stencil_wrap");
+
+   if (ctx->Extensions.ARB_texture_cube_map)
+      len += append_extension(&str, "GL_OES_texture_cube_map");
+   if (ctx->Extensions.ARB_texture_env_crossbar)
+      len += append_extension(&str, "GL_OES_texture_env_crossbar");
+   if (ctx->Extensions.ARB_texture_mirrored_repeat)
+      len += append_extension(&str, "GL_OES_texture_mirrored_repeat");
+
+   if (ctx->Extensions.ARB_framebuffer_object) {
+      len += append_extension(&str, "GL_OES_framebuffer_object");
+      len += append_extension(&str, "GL_OES_depth24");
+      len += append_extension(&str, "GL_OES_depth32");
+      len += append_extension(&str, "GL_OES_fbo_render_mipmap");
+      len += append_extension(&str, "GL_OES_rgb8_rgba8");
+      len += append_extension(&str, "GL_OES_stencil1");
+      len += append_extension(&str, "GL_OES_stencil4");
+      len += append_extension(&str, "GL_OES_stencil8");
+   }
+
+   if (ctx->Extensions.EXT_vertex_array)
+      len += append_extension(&str, "GL_OES_element_index_uint");
+   if (ctx->Extensions.ARB_vertex_buffer_object)
+      len += append_extension(&str, "GL_OES_mapbuffer");
+   if (ctx->Extensions.EXT_texture_filter_anisotropic)
+      len += append_extension(&str, "GL_EXT_texture_filter_anisotropic");
+
+   if (ctx->Extensions.ARB_texture_non_power_of_two)
+      len += append_extension(&str, "GL_ARB_texture_non_power_of_two");
+   if (ctx->Extensions.EXT_multi_draw_arrays)
+      len += append_extension(&str, "GL_EXT_multi_draw_arrays");
+
+   return len;
+}
+
+
+static const GLubyte *
+compute_es_extensions(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!ctx->Extensions.String) {
+      char *s;
+      unsigned int len;
+
+      len = make_extension_string(ctx, NULL);
+      s = (char *) _mesa_malloc(len + 1);
+      if (!s)
+         return NULL;
+      make_extension_string(ctx, s);
+      ctx->Extensions.String = (const GLubyte *) s;
+   }
+
+   return ctx->Extensions.String;
+}
+
+
+const GLubyte * GLAPIENTRY
+_es_GetString(GLenum name)
+{
+   switch (name) {
+   case GL_VERSION:
+      return compute_es_version();
+   case GL_EXTENSIONS:
+      return compute_es_extensions();
+   default:
+      return _mesa_GetString(name);
+   }
+}
+
+
+void
+_mesa_initialize_context_extra(GLcontext *ctx)
+{
+   /* nothing here */
+}
diff --git a/src/mesa/es/main/specials_es2.c b/src/mesa/es/main/specials_es2.c
new file mode 100644 (file)
index 0000000..ef8c581
--- /dev/null
@@ -0,0 +1,176 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, 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, 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
+ * TUNGSTEN GRAPHICS 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 "main/mtypes.h"
+#include "main/context.h"
+#include "main/imports.h"
+#include "main/get.h"
+
+
+const GLubyte * GLAPIENTRY _es_GetString(GLenum name);
+
+
+static const GLubyte *
+compute_es_version(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   static const char es_2_0[] = "OpenGL ES 2.0";
+   /* OpenGL ES 2.0 is derived from OpenGL 2.0 */
+   const GLboolean ver_2_0 = (ctx->Extensions.ARB_multisample &&
+                              ctx->Extensions.ARB_multitexture &&
+                              ctx->Extensions.ARB_texture_compression &&
+                              ctx->Extensions.ARB_texture_cube_map &&
+                              ctx->Extensions.ARB_texture_mirrored_repeat &&
+                              ctx->Extensions.EXT_blend_color &&
+                              ctx->Extensions.EXT_blend_func_separate &&
+                              ctx->Extensions.EXT_blend_minmax &&
+                              ctx->Extensions.EXT_blend_subtract &&
+                              ctx->Extensions.EXT_stencil_wrap &&
+                              ctx->Extensions.ARB_vertex_buffer_object &&
+                              ctx->Extensions.ARB_shader_objects &&
+                              ctx->Extensions.ARB_vertex_shader &&
+                              ctx->Extensions.ARB_fragment_shader &&
+                              ctx->Extensions.ARB_texture_non_power_of_two &&
+                              ctx->Extensions.EXT_blend_equation_separate);
+   if (!ver_2_0)
+      _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
+   return (const GLubyte *) es_2_0;
+}
+
+
+static size_t
+append_extension(char **str, const char *ext)
+{
+   char *s = *str;
+   size_t len = strlen(ext);
+
+   if (s) {
+      memcpy(s, ext, len);
+      s[len++] = ' ';
+      s[len] = '\0';
+
+      *str += len;
+   }
+   else {
+      len++;
+   }
+
+   return len;
+}
+
+
+static size_t
+make_extension_string(const GLcontext *ctx, char *str)
+{
+   size_t len = 0;
+
+   /* Core additions */
+   len += append_extension(&str, "GL_OES_single_precision");
+
+   /* Required extensions */
+   len += append_extension(&str, "GL_OES_compressed_paletted_texture");
+
+   if (ctx->Extensions.ARB_framebuffer_object) {
+      len += append_extension(&str, "GL_OES_framebuffer_object");
+      len += append_extension(&str, "GL_OES_depth24");
+      len += append_extension(&str, "GL_OES_depth32");
+      len += append_extension(&str, "GL_OES_fbo_render_mipmap");
+      len += append_extension(&str, "GL_OES_rgb8_rgba8");
+      len += append_extension(&str, "GL_OES_stencil1");
+      len += append_extension(&str, "GL_OES_stencil4");
+      len += append_extension(&str, "GL_OES_stencil8");
+   }
+
+   if (ctx->Extensions.EXT_vertex_array)
+      len += append_extension(&str, "GL_OES_element_index_uint");
+   if (ctx->Extensions.ARB_vertex_buffer_object)
+      len += append_extension(&str, "GL_OES_mapbuffer");
+
+   if (ctx->Extensions.EXT_texture3D)
+      len += append_extension(&str, "GL_OES_texture_3D");
+   if (ctx->Extensions.ARB_texture_non_power_of_two)
+      len += append_extension(&str, "GL_OES_texture_npot");
+   if (ctx->Extensions.EXT_texture_filter_anisotropic)
+      len += append_extension(&str, "GL_EXT_texture_filter_anisotropic");
+
+   len += append_extension(&str, "GL_EXT_texture_type_2_10_10_10_REV");
+   if (ctx->Extensions.ARB_depth_texture)
+      len += append_extension(&str, "GL_OES_depth_texture");
+   if (ctx->Extensions.EXT_packed_depth_stencil)
+      len += append_extension(&str, "GL_OES_packed_depth_stencil");
+   if (ctx->Extensions.ARB_fragment_shader)
+      len += append_extension(&str, "GL_OES_standard_derivatives");
+
+   if (ctx->Extensions.EXT_multi_draw_arrays)
+      len += append_extension(&str, "GL_EXT_multi_draw_arrays");
+
+   return len;
+}
+
+
+static const GLubyte *
+compute_es_extensions(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!ctx->Extensions.String) {
+      char *s;
+      unsigned int len;
+
+      len = make_extension_string(ctx, NULL);
+      s = (char *) _mesa_malloc(len + 1);
+      if (!s)
+         return NULL;
+      make_extension_string(ctx, s);
+      ctx->Extensions.String = (const GLubyte *) s;
+   }
+
+   return ctx->Extensions.String;
+}
+
+const GLubyte * GLAPIENTRY
+_es_GetString(GLenum name)
+{
+   switch (name) {
+   case GL_VERSION:
+      return compute_es_version();
+   case GL_SHADING_LANGUAGE_VERSION:
+      return (const GLubyte *) "OpenGL ES GLSL ES 1.0.16";
+   case GL_EXTENSIONS:
+      return compute_es_extensions();
+   default:
+      return _mesa_GetString(name);
+   }
+}
+
+
+void
+_mesa_initialize_context_extra(GLcontext *ctx)
+{
+   ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
+   ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
+
+   ctx->Point.PointSprite = GL_TRUE;  /* always on for ES 2.x */
+}
diff --git a/src/mesa/es/main/stubs.c b/src/mesa/es/main/stubs.c
new file mode 100644 (file)
index 0000000..e7b8bc7
--- /dev/null
@@ -0,0 +1,138 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, 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, 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
+ * TUNGSTEN GRAPHICS 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.
+ **************************************************************************/
+
+
+/**
+ * Temporary stubs for "missing" mesa functions.
+ */
+
+
+#include "main/mtypes.h"
+#include "main/imports.h"
+#include "vbo/vbo.h"
+
+#define NEED_IMPLEMENT() do { \
+      GET_CURRENT_CONTEXT(ctx); \
+      _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__); \
+   } while (0)
+
+#if FEATURE_accum
+/* This is a sanity check that to be sure we're using the correct mfeatures.h
+ * header.  We don't want to accidentally use the one from mainline Mesa.
+ */
+#error "The wrong mfeatures.h file is being included!"
+#endif
+
+
+/* silence compiler warnings */
+extern void GLAPIENTRY _vbo_Materialf(GLenum face, GLenum pname, GLfloat param);
+extern void GLAPIENTRY _mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+extern void GLAPIENTRY _mesa_ReleaseShaderCompiler(void);
+extern void GLAPIENTRY _mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLint length);
+extern void GLAPIENTRY _vbo_VertexAttrib1f(GLuint indx, GLfloat x);
+extern void GLAPIENTRY _vbo_VertexAttrib1fv(GLuint indx, const GLfloat* values);
+extern void GLAPIENTRY _vbo_VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+extern void GLAPIENTRY _vbo_VertexAttrib2fv(GLuint indx, const GLfloat* values);
+extern void GLAPIENTRY _vbo_VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+extern void GLAPIENTRY _vbo_VertexAttrib3fv(GLuint indx, const GLfloat* values);
+extern void GLAPIENTRY _vbo_VertexAttrib4fv(GLuint indx, const GLfloat* values);
+
+
+void GLAPIENTRY
+_vbo_Materialf(GLenum face, GLenum pname, GLfloat param)
+{
+   _vbo_Materialfv(face, pname, &param);
+}
+
+
+void GLAPIENTRY
+_mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype,
+                               GLint* range, GLint* precision)
+{
+   NEED_IMPLEMENT();
+}
+
+
+void GLAPIENTRY
+_mesa_ReleaseShaderCompiler(void)
+{
+   NEED_IMPLEMENT();
+}
+
+
+void GLAPIENTRY
+_mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat,
+                   const void* binary, GLint length)
+{
+   NEED_IMPLEMENT();
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib1f(GLuint indx, GLfloat x)
+{
+   _vbo_VertexAttrib4f(indx, x, 0.0, 0.0, 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib1fv(GLuint indx, const GLfloat* values)
+{
+   _vbo_VertexAttrib4f(indx, values[0], 0.0, 0.0, 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
+{
+   _vbo_VertexAttrib4f(indx, x, y, 0.0, 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib2fv(GLuint indx, const GLfloat* values)
+{
+   _vbo_VertexAttrib4f(indx, values[0], values[1], 0.0, 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+{
+   _vbo_VertexAttrib4f(indx, x, y, z, 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib3fv(GLuint indx, const GLfloat* values)
+{
+   _vbo_VertexAttrib4f(indx, values[0], values[1], values[2], 1.0f);
+}
+
+
+void GLAPIENTRY
+_vbo_VertexAttrib4fv(GLuint indx, const GLfloat* values)
+{
+   _vbo_VertexAttrib4f(indx, values[0], values[1], values[2], values[3]);
+}
diff --git a/src/mesa/es/sources.mak b/src/mesa/es/sources.mak
new file mode 100644 (file)
index 0000000..d12acaa
--- /dev/null
@@ -0,0 +1,164 @@
+include $(MESA)/sources.mak
+
+# LOCAL sources
+
+LOCAL_ES1_SOURCES :=                   \
+       main/api_exec_es1.c             \
+       main/get_es1.c                  \
+       main/specials_es1.c             \
+       main/drawtex.c                  \
+       main/es_cpaltex.c               \
+       main/es_fbo.c                   \
+       main/es_query_matrix.c          \
+       main/stubs.c                    \
+       glapi/glapi-es1/main/enums.c
+
+LOCAL_ES1_GALLIUM_SOURCES :=           \
+       $(LOCAL_ES1_SOURCES)
+
+# always use local version of GLAPI_ASM_SOURCES
+LOCAL_ES1_API_ASM := $(addprefix glapi/glapi-es1/, $(GLAPI_ASM_SOURCES))
+
+LOCAL_ES1_INCLUDES :=                  \
+       -I.                             \
+       -I./glapi/glapi-es1             \
+       -I./state_tracker               \
+       -I$(MESA)/state_tracker
+
+LOCAL_ES2_SOURCES :=                   \
+       main/api_exec_es2.c             \
+       main/get_es2.c                  \
+       main/specials_es2.c             \
+       main/es_cpaltex.c               \
+       main/es_fbo.c                   \
+       main/stubs.c                    \
+       glapi/glapi-es2/main/enums.c
+
+LOCAL_ES2_GALLIUM_SOURCES :=           \
+       $(LOCAL_ES2_SOURCES)
+
+LOCAL_ES2_API_ASM := $(subst es1,es2, $(LOCAL_ES1_API_ASM))
+LOCAL_ES2_INCLUDES := $(subst es1,es2, $(LOCAL_ES1_INCLUDES))
+
+# MESA sources
+
+MAIN_OMITTED :=                                \
+       main/api_exec.c                 \
+       main/dlopen.c                   \
+       main/enums.c                    \
+       main/get.c
+MAIN_SOURCES := $(filter-out $(MAIN_OMITTED), $(MAIN_SOURCES))
+
+VBO_OMITTED :=                         \
+       vbo/vbo_save.c                  \
+       vbo/vbo_save_api.c              \
+       vbo/vbo_save_draw.c             \
+       vbo/vbo_save_loopback.c
+VBO_SOURCES := $(filter-out $(VBO_OMITTED), $(VBO_SOURCES))
+
+STATETRACKER_OMITTED :=                                \
+       state_tracker/st_api.c                  \
+       state_tracker/st_cb_drawpixels.c        \
+       state_tracker/st_cb_feedback.c          \
+       state_tracker/st_cb_rasterpos.c         \
+       state_tracker/st_draw_feedback.c
+STATETRACKER_SOURCES := $(filter-out $(STATETRACKER_OMITTED), $(STATETRACKER_SOURCES))
+
+SHADER_OMITTED :=                      \
+       shader/atifragshader.c          \
+       shader/nvfragparse.c            \
+       shader/nvprogram.c              \
+       shader/nvvertparse.c
+SHADER_SOURCES := $(filter-out $(SHADER_OMITTED), $(SHADER_SOURCES))
+
+MESA_ES1_SOURCES :=                    \
+       $(MAIN_SOURCES)                 \
+       $(MATH_SOURCES)                 \
+       $(MATH_XFORM_SOURCES)           \
+       $(VBO_SOURCES)                  \
+       $(TNL_SOURCES)                  \
+       $(SHADER_SOURCES)               \
+       $(SWRAST_SOURCES)               \
+       $(SWRAST_SETUP_SOURCES)         \
+       $(COMMON_DRIVER_SOURCES)        \
+       $(ASM_C_SOURCES)                \
+       $(SLANG_SOURCES)
+
+MESA_ES1_GALLIUM_SOURCES :=            \
+       $(MAIN_SOURCES)                 \
+       $(MATH_SOURCES)                 \
+       $(VBO_SOURCES)                  \
+       $(STATETRACKER_SOURCES)         \
+       $(SHADER_SOURCES)               \
+       ppc/common_ppc.c                \
+       x86/common_x86.c                \
+       $(SLANG_SOURCES)
+
+MESA_ES1_API_SOURCES :=                        \
+       $(GLAPI_SOURCES)
+
+MESA_ES1_INCLUDES := $(INCLUDE_DIRS)
+
+# remove LOCAL sources from MESA sources
+MESA_ES1_SOURCES := $(filter-out $(LOCAL_ES1_SOURCES), $(MESA_ES1_SOURCES))
+MESA_ES1_GALLIUM_SOURCES := $(filter-out $(LOCAL_ES1_GALLIUM_SOURCES), $(MESA_ES1_GALLIUM_SOURCES))
+
+# right now es2 and es1 share MESA sources
+MESA_ES2_SOURCES := $(MESA_ES1_SOURCES)
+MESA_ES2_GALLIUM_SOURCES := $(MESA_ES1_GALLIUM_SOURCES)
+MESA_ES2_API_SOURCES := $(MESA_ES1_API_SOURCES)
+
+MESA_ES2_INCLUDES := $(MESA_ES1_INCLUDES)
+
+# asm is shared by any ES version and any library
+MESA_ES_ASM := $(MESA_ASM_SOURCES)
+
+# collect sources, adjust the pathes
+ES1_SOURCES := $(LOCAL_ES1_SOURCES) $(addprefix $(MESA)/,$(MESA_ES1_SOURCES))
+ES1_GALLIUM_SOURCES := $(LOCAL_ES1_GALLIUM_SOURCES) $(addprefix $(MESA)/,$(MESA_ES1_GALLIUM_SOURCES))
+ES1_API_SOURCES := $(addprefix $(MESA)/,$(MESA_ES1_API_SOURCES))
+
+ES2_SOURCES := $(LOCAL_ES2_SOURCES) $(addprefix $(MESA)/,$(MESA_ES2_SOURCES))
+ES2_GALLIUM_SOURCES := $(LOCAL_ES2_GALLIUM_SOURCES) $(addprefix $(MESA)/,$(MESA_ES2_GALLIUM_SOURCES))
+ES2_API_SOURCES := $(addprefix $(MESA)/,$(MESA_ES2_API_SOURCES))
+
+# collect includes
+ES1_INCLUDES := $(LOCAL_ES1_INCLUDES) $(MESA_ES1_INCLUDES)
+ES2_INCLUDES := $(LOCAL_ES2_INCLUDES) $(MESA_ES2_INCLUDES)
+
+# collect objects, including asm
+ES1_OBJECTS :=                                 \
+       $(LOCAL_ES1_SOURCES:.c=.o)              \
+       $(MESA_ES1_SOURCES:.c=.o)               \
+       $(MESA_ES_ASM:.S=.o)
+
+ES1_GALLIUM_OBJECTS :=                         \
+       $(LOCAL_ES1_GALLIUM_SOURCES:.c=.o)      \
+       $(MESA_ES1_GALLIUM_SOURCES:.c=.o)       \
+       $(MESA_ES_ASM:.S=.o)
+
+ES1_API_OBJECTS :=                             \
+       $(LOCAL_ES1_API_ASM:.S=.o)              \
+       $(MESA_ES1_API_SOURCES:.c=.o)
+
+ES2_OBJECTS :=                                 \
+       $(LOCAL_ES2_SOURCES:.c=.o)              \
+       $(MESA_ES2_SOURCES:.c=.o)               \
+       $(MESA_ES_ASM:.S=.o)
+
+ES2_GALLIUM_OBJECTS :=                         \
+       $(LOCAL_ES2_GALLIUM_SOURCES:.c=.o)      \
+       $(MESA_ES2_GALLIUM_SOURCES:.c=.o)       \
+       $(MESA_ES_ASM:.S=.o)
+
+ES2_API_OBJECTS :=                             \
+       $(LOCAL_ES2_API_ASM:.S=.o)              \
+       $(MESA_ES2_API_SOURCES:.c=.o)
+
+# collect sources for makedepend
+ES1_ALL_SOURCES := $(ES1_SOURCES) $(ES1_GALLIUM_SOURCES) $(ES1_API_SOURCES)
+ES2_ALL_SOURCES := $(ES2_SOURCES) $(ES2_GALLIUM_SOURCES) $(ES2_API_SOURCES)
+
+# sort to remove duplicates
+ES1_ALL_SOURCES := $(sort $(ES1_ALL_SOURCES))
+ES2_ALL_SOURCES := $(sort $(ES2_ALL_SOURCES))