]> git.cworth.org Git - apitrace/commitdiff
Merge branch 'master' into noglut
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 9 Apr 2011 15:06:05 +0000 (16:06 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 9 Apr 2011 15:06:05 +0000 (16:06 +0100)
Conflicts:
CMakeLists.txt

31 files changed:
CMakeLists.txt
glapi.py
glretrace.py
glsize.hpp
glstate.py
gui/.gitignore
gui/CMakeLists.txt
gui/apicalldelegate.cpp
gui/apicalldelegate.h
gui/apitracecall.cpp
gui/apitracecall.h
gui/apitracefilter.cpp
gui/apitracefilter.h
gui/apitracemodel.cpp
gui/apitracemodel.h
gui/loaderthread.cpp
gui/mainwindow.cpp
gui/mainwindow.h
gui/qapitrace.qrc
gui/resources/glreference.tsv [new file with mode: 0644]
gui/retracer.cpp [new file with mode: 0644]
gui/retracer.h [new file with mode: 0644]
gui/settingsdialog.cpp [new file with mode: 0644]
gui/settingsdialog.h [new file with mode: 0644]
gui/ui/mainwindow.ui
gui/ui/retracerdialog.ui [new file with mode: 0644]
gui/ui/settings.ui [new file with mode: 0644]
gui/vertexdatainterpreter.cpp [new file with mode: 0644]
gui/vertexdatainterpreter.h [new file with mode: 0644]
json.hpp
trace_model.cpp

index f6802e39be791adb04b018a2155253f95c71087d..506325e0a8956ffb5d1388252f3ae0b6986ab900 100644 (file)
@@ -186,10 +186,6 @@ else ()
     )
 
     add_library (glxtrace SHARED glxtrace.cpp trace_write.cpp os_posix.cpp ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp)
-    set_target_properties (glxtrace PROPERTIES 
-        COMPILER_DEFINITIONS "-DRETRACE"
-        PREFIX ""
-    )
     target_link_libraries (glxtrace dl)
 endif ()
 
@@ -231,6 +227,12 @@ add_executable (glretrace
     ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
 )
 
+set_property (
+    TARGET glretrace
+    APPEND
+    PROPERTY COMPILE_DEFINITIONS "RETRACE"
+)
+
 target_link_libraries (glretrace
     trace
     ${OPENGL_gl_LIBRARY}
@@ -238,7 +240,5 @@ target_link_libraries (glretrace
 )
 
 if (QT4_FOUND AND QJSON_FOUND)
-    # Include the cmake file needed to use qt4
-    include( ${QT_USE_FILE} )
     add_subdirectory(gui)
 endif (QT4_FOUND AND QJSON_FOUND)
index 077785a0b32876ef78b390725806abb9a242187e..12e06120b5058c8360baa7ec526f5f2306cc497e 100644 (file)
--- a/glapi.py
+++ b/glapi.py
@@ -1003,9 +1003,9 @@ glapi.add_functions([
     GlFunction(Void, "glUniform2ivARB", [(GLlocationARB, "location"), (GLsizei, "count"), (Const(Array(GLint, "(2*count)")), "value")]),
     GlFunction(Void, "glUniform3ivARB", [(GLlocationARB, "location"), (GLsizei, "count"), (Const(Array(GLint, "(3*count)")), "value")]),
     GlFunction(Void, "glUniform4ivARB", [(GLlocationARB, "location"), (GLsizei, "count"), (Const(Array(GLint, "(4*count)")), "value")]),
-    GlFunction(Void, "glUniformMatrix2fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "2*2")), "value")]),
-    GlFunction(Void, "glUniformMatrix3fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "3*3")), "value")]),
-    GlFunction(Void, "glUniformMatrix4fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "4*4")), "value")]),
+    GlFunction(Void, "glUniformMatrix2fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "count*2*2")), "value")]),
+    GlFunction(Void, "glUniformMatrix3fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "count*3*3")), "value")]),
+    GlFunction(Void, "glUniformMatrix4fvARB", [(GLlocationARB, "location"), (GLsizei, "count"), (GLboolean, "transpose"), (Const(Array(GLfloat, "count*4*4")), "value")]),
     GlFunction(Void, "glGetObjectParameterfvARB", [(GLhandleARB, "obj"), (GLenum, "pname"), Out(OpaquePointer(GLfloat), "params")], sideeffects=False),
     GlFunction(Void, "glGetObjectParameterivARB", [(GLhandleARB, "obj"), (GLenum, "pname"), Out(OpaquePointer(GLint), "params")], sideeffects=False),
     GlFunction(Void, "glGetInfoLogARB", [(GLhandleARB, "obj"), (GLsizei, "maxLength"), Out(Pointer(GLsizei), "length"), Out(GLstringARB, "infoLog")], sideeffects=False),
index 312c9a32c5ea868bc242d5756576f8c05f53d248..450ce7dd19d215648daddaf860321013455f8989 100644 (file)
@@ -167,8 +167,6 @@ if __name__ == '__main__':
 #include <stdio.h>
 #include <iostream>
 
-#define RETRACE
-
 #include "glproc.hpp"
 #include "glstate.hpp"
 #include "glws.hpp"
@@ -428,10 +426,6 @@ int main(int argc, char **argv)
     __context = __ws->createContext(__visual);
     __ws->makeCurrent(__drawable, __context);
 
-    for (GLuint h = 0; h < 1024; ++h) {
-        __list_map[h] = h;
-    }
-
     for ( ; i < argc; ++i) {
         if (parser.open(argv[i])) {
             __startTime = OS::GetTime();
index 26d3e91868f3491785bb751970a0c50bf139d534..9fb02faa6ccdd49fb81566192abfc4e6267d5122 100644 (file)
@@ -89,7 +89,7 @@ __glArrayPointer_size(GLint size, GLenum type, GLsizei stride, GLsizei maxIndex)
 #define __glEdgeFlagPointer_size(stride, maxIndex) __glArrayPointer_size(1, GL_BOOL, stride, maxIndex)
 #define __glFogCoordPointer_size(type, stride, maxIndex) __glArrayPointer_size(1, type, stride, maxIndex)
 #define __glSecondaryColorPointer_size(size, type, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex)
-#define __glVertexAttribPointer_size(size, type, stride, normalized, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex)
+#define __glVertexAttribPointer_size(size, type, normalized, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex)
 
 static inline GLuint
 __glDrawArrays_maxindex(GLint first, GLsizei count)
@@ -1408,6 +1408,7 @@ __glTexImage3D_size(GLenum format, GLenum type, GLsizei width, GLsizei height, G
     case GL_BLUE:
     case GL_ALPHA:
     case GL_INTENSITY:
+    case GL_LUMINANCE:
     case GL_DEPTH_COMPONENT:
     case GL_STENCIL_INDEX:
         num_channels = 1;
@@ -1424,7 +1425,7 @@ __glTexImage3D_size(GLenum format, GLenum type, GLsizei width, GLsizei height, G
         num_channels = 4;
         break;
     default:
-        OS::DebugMessage("warning: %s: unexpected GLenum 0x%04X\n", __FUNCTION__, format);
+        OS::DebugMessage("warning: %s: unexpected format GLenum 0x%04X\n", __FUNCTION__, format);
         num_channels = 0;
         break;
     }
@@ -1466,7 +1467,7 @@ __glTexImage3D_size(GLenum format, GLenum type, GLsizei width, GLsizei height, G
         bits_per_pixel = 32;
         break;
     default:
-        OS::DebugMessage("warning: %s: unexpected GLenum 0x%04X\n", __FUNCTION__, type);
+        OS::DebugMessage("warning: %s: unexpected type GLenum 0x%04X\n", __FUNCTION__, type);
         bits_per_pixel = 0;
         break;
     }
index 538b808515ad1734317b7733ee9f1b8cd5b39687..d46cf607f066beddc2e3c3e64e6ad790222901d2 100644 (file)
@@ -36,7 +36,7 @@ E = GLenum
 F = Float
 D = Double
 P = OpaquePointer(Void)
-S = String
+S = CString
 
 # TODO: This table and the one on glenum.py should be unified
 parameters = [
@@ -320,18 +320,18 @@ parameters = [
     ("glGet",  I,      1,      "GL_MAP1_GRID_SEGMENTS"),       # 0x0DD1
     ("glGet",  F,      4,      "GL_MAP2_GRID_DOMAIN"), # 0x0DD2
     ("glGet",  I,      2,      "GL_MAP2_GRID_SEGMENTS"),       # 0x0DD3
-    ("glGet",  I,      1,      "GL_TEXTURE_1D"),       # 0x0DE0
-    ("glGet",  I,      1,      "GL_TEXTURE_2D"),       # 0x0DE1
+    ("glGet",  B,      1,      "GL_TEXTURE_1D"),       # 0x0DE0
+    ("glGet",  B,      1,      "GL_TEXTURE_2D"),       # 0x0DE1
     ("glGet",  P,      1,      "GL_FEEDBACK_BUFFER_POINTER"),  # 0x0DF0
     ("glGet",  I,      1,      "GL_FEEDBACK_BUFFER_SIZE"),     # 0x0DF1
-    ("glGet",  I,      1,      "GL_FEEDBACK_BUFFER_TYPE"),     # 0x0DF2
+    ("glGet",  E,      1,      "GL_FEEDBACK_BUFFER_TYPE"),     # 0x0DF2
     ("glGet",  P,      1,      "GL_SELECTION_BUFFER_POINTER"), # 0x0DF3
     ("glGet",  I,      1,      "GL_SELECTION_BUFFER_SIZE"),    # 0x0DF4
-    ("glGet",  X,      1,      "GL_TEXTURE_WIDTH"),    # 0x1000
-    ("glGet",  X,      1,      "GL_TEXTURE_HEIGHT"),   # 0x1001
-    ("glGet",  X,      1,      "GL_TEXTURE_INTERNAL_FORMAT"),  # 0x1003
+    ("glGetTexLevelParameter", X,      1,      "GL_TEXTURE_WIDTH"),    # 0x1000
+    ("glGetTexLevelParameter", X,      1,      "GL_TEXTURE_HEIGHT"),   # 0x1001
+    ("glGetTexLevelParameter", X,      1,      "GL_TEXTURE_INTERNAL_FORMAT"),  # 0x1003
     ("glGet",  X,      1,      "GL_TEXTURE_BORDER_COLOR"),     # 0x1004
-    ("glGet",  X,      1,      "GL_TEXTURE_BORDER"),   # 0x1005
+    ("glGetTexLevelParameter", X,      1,      "GL_TEXTURE_BORDER"),   # 0x1005
     ("glGet",  X,      1,      "GL_DONT_CARE"),        # 0x1100
     ("glGet",  X,      1,      "GL_FASTEST"),  # 0x1101
     ("glGet",  X,      1,      "GL_NICEST"),   # 0x1102
@@ -613,7 +613,7 @@ parameters = [
     ("glGet",  F,      1,      "GL_PACK_IMAGE_HEIGHT"),        # 0x806C
     ("glGet",  I,      1,      "GL_UNPACK_SKIP_IMAGES"),       # 0x806D
     ("glGet",  F,      1,      "GL_UNPACK_IMAGE_HEIGHT"),      # 0x806E
-    ("glGet",  I,      1,      "GL_TEXTURE_3D"),       # 0x806F
+    ("glGet",  B,      1,      "GL_TEXTURE_3D"),       # 0x806F
     ("glGet",  X,      1,      "GL_PROXY_TEXTURE_3D"), # 0x8070
     ("glGet",  X,      1,      "GL_TEXTURE_DEPTH"),    # 0x8071
     ("glGet",  X,      1,      "GL_TEXTURE_WRAP_R"),   # 0x8072
@@ -980,7 +980,7 @@ parameters = [
     ("glGet",  X,      1,      "GL_RESET_NOTIFICATION_STRATEGY_ARB"),  # 0x8256
     ("glGet",  X,      1,      "GL_PROGRAM_BINARY_RETRIEVABLE_HINT"),  # 0x8257
     ("glGet",  X,      1,      "GL_PROGRAM_SEPARABLE"),        # 0x8258
-    ("glGet",  X,      1,      "GL_ACTIVE_PROGRAM"),   # 0x8259
+    ("glGet",  I,      1,      "GL_ACTIVE_PROGRAM"),   # 0x8259
     ("glGet",  I,      1,      "GL_PROGRAM_PIPELINE_BINDING"), # 0x825A
     ("glGet",  X,      1,      "GL_MAX_VIEWPORTS"),    # 0x825B
     ("glGet",  X,      1,      "GL_VIEWPORT_SUBPIXEL_BITS"),   # 0x825C
@@ -1199,7 +1199,7 @@ parameters = [
     ("glGet",  X,      1,      "GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT"),  # 0x8510
     ("glGet",  X,      1,      "GL_NORMAL_MAP"),       # 0x8511
     ("glGet",  X,      1,      "GL_REFLECTION_MAP"),   # 0x8512
-    ("glGet",  X,      1,      "GL_TEXTURE_CUBE_MAP"), # 0x8513
+    ("glGet",  B,      1,      "GL_TEXTURE_CUBE_MAP"), # 0x8513
     ("glGet",  X,      1,      "GL_TEXTURE_BINDING_CUBE_MAP"), # 0x8514
     ("glGet",  X,      1,      "GL_TEXTURE_CUBE_MAP_POSITIVE_X"),      # 0x8515
     ("glGet",  X,      1,      "GL_TEXTURE_CUBE_MAP_NEGATIVE_X"),      # 0x8516
@@ -1847,8 +1847,8 @@ parameters = [
     ("glGet",  X,      1,      "GL_DEPTH_STENCIL_TO_RGBA_NV"), # 0x886E
     ("glGet",  X,      1,      "GL_DEPTH_STENCIL_TO_BGRA_NV"), # 0x886F
     ("glGet",  X,      1,      "GL_FRAGMENT_PROGRAM_NV"),      # 0x8870
-    ("glGet",  X,      1,      "GL_MAX_TEXTURE_COORDS"),       # 0x8871
-    ("glGet",  X,      1,      "GL_MAX_TEXTURE_IMAGE_UNITS"),  # 0x8872
+    ("glGet",  I,      1,      "GL_MAX_TEXTURE_COORDS"),       # 0x8871
+    ("glGet",  I,      1,      "GL_MAX_TEXTURE_IMAGE_UNITS"),  # 0x8872
     ("glGet",  I,      1,      "GL_FRAGMENT_PROGRAM_BINDING_NV"),      # 0x8873
     ("glGet",  X,      1,      "GL_PROGRAM_ERROR_STRING_ARB"), # 0x8874
     ("glGet",  X,      1,      "GL_PROGRAM_FORMAT_ASCII_ARB"), # 0x8875
@@ -2178,7 +2178,7 @@ parameters = [
     ("glGet",  I,      1,      "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"),   # 0x8B4C
     ("glGet",  I,      1,      "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"), # 0x8B4D
     ("glGet",  E,      1,      "GL_OBJECT_TYPE_ARB"),  # 0x8B4E
-    ("glGet",  E,      1,      "GL_SHADER_TYPE"),      # 0x8B4F
+    ("glGetShader",    E,      1,      "GL_SHADER_TYPE"),      # 0x8B4F
     ("glGet",  X,      1,      "GL_FLOAT_VEC2"),       # 0x8B50
     ("glGet",  X,      1,      "GL_FLOAT_VEC3"),       # 0x8B51
     ("glGet",  X,      1,      "GL_FLOAT_VEC4"),       # 0x8B52
@@ -2214,12 +2214,12 @@ parameters = [
     ("glGet",  X,      1,      "GL_ATTACHED_SHADERS"), # 0x8B85
     ("glGet",  X,      1,      "GL_ACTIVE_UNIFORMS"),  # 0x8B86
     ("glGet",  X,      1,      "GL_ACTIVE_UNIFORM_MAX_LENGTH"),        # 0x8B87
-    ("glGet",  X,      1,      "GL_SHADER_SOURCE_LENGTH"),     # 0x8B88
+    ("glGetShader",    I,      1,      "GL_SHADER_SOURCE_LENGTH"),     # 0x8B88
     ("glGet",  X,      1,      "GL_ACTIVE_ATTRIBUTES"),        # 0x8B89
     ("glGet",  X,      1,      "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"),      # 0x8B8A
     ("glGet",  X,      1,      "GL_FRAGMENT_SHADER_DERIVATIVE_HINT"),  # 0x8B8B
     ("glGet",  X,      1,      "GL_SHADING_LANGUAGE_VERSION"), # 0x8B8C
-    ("glGet",  X,      1,      "GL_CURRENT_PROGRAM"),  # 0x8B8D
+    ("glGet",  I,      1,      "GL_CURRENT_PROGRAM"),  # 0x8B8D
     ("glGet",  X,      1,      "GL_IMPLEMENTATION_COLOR_READ_TYPE"),   # 0x8B9A
     ("glGet",  X,      1,      "GL_IMPLEMENTATION_COLOR_READ_FORMAT"), # 0x8B9B
     ("glGet",  X,      1,      "GL_COUNTER_TYPE_AMD"), # 0x8BC0
@@ -2829,9 +2829,82 @@ parameters = [
     (None,     X,      1,      "GL_INVALID_INDEX"),    # 0xFFFFFFFFu
 ]
 
+texture_targets = [
+    ('GL_TEXTURE_1D', 'GL_TEXTURE_BINDING_1D'),
+    ('GL_TEXTURE_2D', 'GL_TEXTURE_BINDING_2D'),
+    ('GL_TEXTURE_3D', 'GL_TEXTURE_BINDING_3D'),
+    #(GL_TEXTURE_CUBE_MAP, 'GL_TEXTURE_BINDING_CUBE_MAP')
+]
+
+
+class GlGetter(Visitor):
+    '''Type visitor
+    Determine which glGet*v function that matches the specified type.'''
+
+    def __init__(self, prefix = 'glGet', long_suffix = True):
+        self.prefix = prefix
+        self.long_suffix = long_suffix
+
+        if prefix == 'glGet':
+            self.suffixes = {
+                'GLboolean': 'Booleanv',
+                'GLint': 'Intv',
+                'GLfloat': 'Floatv',
+                'GLdouble': 'Doublev',
+                'GLstring': 'String',
+            }
+        else:
+            self.suffixes = {
+                'GLint': 'iv',
+                'GLfloat': 'fv',
+                'GLdouble': 'Doublev',
+                'GLstring': 'String',
+            }
+
+
+    def visit_const(self, const):
+        return self.visit(const.type)
+
+    def visit_alias(self, alias):
+        if alias.expr == 'GLboolean':
+            if self.long_suffix:
+                return self.prefix + 'Booleanv', alias.expr
+            else:
+                return self.prefix + 'iv', 'GLint'
+        elif alias.expr == 'GLdouble':
+            if self.long_suffix:
+                return self.prefix + 'Doublev', alias.expr
+            else:
+                return self.prefix + 'dv', alias.expr
+        elif alias.expr == 'GLfloat':
+            if self.long_suffix:
+                return self.prefix + 'Floatv', alias.expr
+            else:
+                return self.prefix + 'fv', alias.expr
+        elif alias.expr in ('GLint', 'GLuint', 'GLsizei'):
+            if self.long_suffix:
+                return self.prefix + 'Integerv', 'GLint'
+            else:
+                return self.prefix + 'iv', 'GLint'
+        else:
+            print alias.expr
+            assert False
+    
+    def visit_enum(self, enum):
+        return self.visit(glapi.GLint)
+
+    def visit_bitmask(self, bitmask):
+        return self.visit(glapi.GLint)
 
-class ParamDumper(Visitor):
-    '''Dump an instance.'''
+    def visit_opaque(self, pointer):
+        return self.prefix + 'Pointerv', 'GLvoid *'
+
+
+class JsonWriter(Visitor):
+    '''Type visitor that will dump a value of the specified type through the
+    JSON writer.
+    
+    It expects a previously declared JSONWriter instance named "json".'''
 
     def visit_literal(self, literal, instance):
         if literal.format == 'Bool':
@@ -2846,7 +2919,10 @@ class ParamDumper(Visitor):
         print '    json.writeString((const char *)%s);' % instance
 
     def visit_enum(self, enum, instance):
-        raise NotImplementedError
+        if enum.expr == 'GLenum':
+            print '    writeEnum(json, %s);' % instance
+        else:
+            print '    json.writeNumber(%s);' % instance
 
     def visit_bitmask(self, bitmask, instance):
         raise NotImplementedError
@@ -2854,6 +2930,21 @@ class ParamDumper(Visitor):
     def visit_alias(self, alias, instance):
         self.visit(alias.type, instance)
 
+    def visit_opaque(self, opaque, instance):
+        print '    json.writeNumber((size_t)%s);' % instance
+
+    __index = 0
+
+    def visit_array(self, array, instance):
+        index = '__i%u' % JsonWriter.__index
+        JsonWriter.__index += 1
+        print '    json.beginArray();'
+        print '    for (unsigned %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index)
+        self.visit(array.type, '%s[%s]' % (instance, index))
+        print '    }'
+        print '    json.endArray();'
+
+
 
 class StateDumper:
 
@@ -2866,14 +2957,15 @@ class StateDumper:
         print
         print '#include "json.hpp"'
         print '#include "glimports.hpp"'
+        print '#include "glproc.hpp"'
         print '#include "glstate.hpp"'
         print
 
-        print 'static inline void'
+        print 'static void'
         print 'writeEnum(JSONWriter &json, GLenum pname)'
         print '{'
         print '    switch(pname) {'
-        for function, type, count, name in parameters:
+        for name in GLenum.values:
             print '    case %s:' % name
             print '        json.writeString("%s");' % name
             print '        break;'
@@ -2883,11 +2975,183 @@ class StateDumper:
         print '}'
         print
 
+        # shaders
+        print 'static void'
+        print 'writeShader(JSONWriter &json, GLuint shader)'
+        print '{'
+        print '    if (!shader) {'
+        print '        json.writeNull();'
+        print '        return;'
+        print '    }'
+        print
+        print '    json.beginObject();'
+        print '    GLint source_length = 0;'
+        print '    glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length);'
+        print '    json.beginMember("source");'
+        print '    if (source_length) {'
+        print '        GLchar *source = new GLchar[source_length];'
+        print '        GLsizei length = 0;'
+        print '        source[0] = 0;'
+        print '        glGetShaderSource(shader, source_length, &length, source);'
+        print '        json.writeString(source);'
+        print '        delete [] source;'
+        print '    } else {'
+        print '        json.writeNull();'
+        print '    }'
+        print '    json.endMember(); // source'
+        print '    json.endObject();'
+        print '}'
+        print
+
+        # programs
+        print 'static inline void'
+        print 'writeProgram(JSONWriter &json, GLuint program)'
+        print '{'
+        print '    if (!program) {'
+        print '        json.writeNull();'
+        print '        return;'
+        print '    }'
+        print
+        print '    json.beginObject();'
+        print '    json.beginMember("attached_shaders");'
+        print '    GLint attached_shaders = 0;'
+        print '    glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);'
+        print '    json.beginArray();'
+        print '    if (attached_shaders) {'
+        print '        GLuint *shaders = new GLuint[attached_shaders];'
+        print '        GLsizei count = 0;'
+        print '        glGetAttachedShaders(program, attached_shaders, &count, shaders);'
+        print '        for (GLsizei i = 0; i < count; ++ i) {'
+        print '           writeShader(json, shaders[i]);'
+        print '        }'
+        print '        delete [] shaders;'
+        print '    }'
+        print '    json.endArray();'
+        print '    json.endMember();'
+        print '    json.endObject();'
+        print '}'
+        print
+
+        # texture image
+        print '''
+static inline void
+writeTextureImage(JSONWriter &json, GLenum target, GLint level)
+{
+    GLint width = 0, height = 0;
+    glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);
+    glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);
+
+    if (!width || !height) {
+        json.writeNull();
+    } else {
+        json.beginObject();
+
+        // Tell the GUI this is no ordinary object, but an image
+        json.writeStringMember("__class__", "image");
+
+        json.writeNumberMember("__width__", width);
+        json.writeNumberMember("__height__", height);
+        json.writeNumberMember("__depth__", 1);
+
+        // Hardcoded for now, but we could chose types more adequate to the
+        // texture internal format
+        json.writeStringMember("__type__", "float");
+        json.writeNumberMember("__channels__", 4);
+        
+        float *pixels = new float[width*height*4];
+        
+        glGetTexImage(target, level, GL_RGBA, GL_FLOAT, pixels);
+
+        if (0) {
+            json.writeStringMember("__encoding__", "array");
+            json.beginMember("__data__");
+
+            json.beginArray();
+            for (GLint y = 0; y < height; ++y) {
+                json.beginArray();
+                for (GLint x = 0; x < width; ++x) {
+                    json.beginArray();
+                    for (GLint chan = 0; chan < 4; ++chan) {
+                        json.writeNumber(pixels[(y*width + x)*4 + chan]); 
+                    }
+                    json.endArray();
+                }
+                json.endArray();
+            }
+            json.endArray();
+            json.endMember(); // __data__
+        } else {
+            json.writeStringMember("__encoding__", "base64");
+            json.beginMember("__data__");
+            json.writeBase64(pixels, width * height * 4 * sizeof *pixels);
+            json.endMember(); // __data__
+        }
+
+        delete [] pixels;
+        json.endObject();
+    }
+}
+'''
+
+        # textures
+        print 'static inline void'
+        print 'writeTexture(JSONWriter &json, GLenum target, GLenum binding)'
+        print '{'
+        print '    GLint texture = 0;'
+        print '    glGetIntegerv(binding, &texture);'
+        print '    if (!glIsEnabled(target) && !texture) {'
+        print '        json.writeNull();'
+        print '        return;'
+        print '    }'
+        print
+        print '    json.beginObject();'
+        print
+        print '    json.beginMember("levels");'
+        print '    json.beginArray();'
+        print '    GLint level = 0;'
+        print '    do {'
+        print '        GLint width = 0, height = 0;'
+        print '        glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);'
+        print '        glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);'
+        print '        if (!width || !height) {'
+        print '            break;'
+        print '        }'
+        print '        json.beginObject();'
+        print
+        # FIXME: This is not the original texture name in the trace -- we need
+        # to do a reverse lookup of the texture mappings to find the original one
+        print '        json.beginMember("binding");'
+        print '        json.writeNumber(texture);'
+        print '        json.endMember();'
+        print
+        print '        json.beginMember("GL_TEXTURE_WIDTH");'
+        print '        json.writeNumber(width);'
+        print '        json.endMember();'
+        print
+        print '        json.beginMember("GL_TEXTURE_HEIGHT");'
+        print '        json.writeNumber(height);'
+        print '        json.endMember();'
+        print
+        print '        json.beginMember("image");'
+        print '        writeTextureImage(json, target, level);'
+        print '        json.endMember();'
+        print
+        print '        json.endObject();'
+        print '        ++level;'
+        print '    } while(true);'
+        print '    json.endArray();'
+        print '    json.endMember(); // levels'
+        print
+        print '    json.endObject();'
+        print '}'
+        print
+
         print 'void state_dump(std::ostream &os)'
         print '{'
         print '    JSONWriter json(os);'
         self.dump_parameters()
-
+        self.dump_current_program()
+        self.dump_textures()
         print '}'
         print
 
@@ -2911,31 +3175,24 @@ class StateDumper:
             elif type is B:
                 buf = 'bparams'
                 getter = 'glGetBooleanv'
-                writer = 'json.writeBool(%s)'
             elif type is I:
                 buf = 'iparams'
                 getter = 'glGetIntegerv'
-                writer = 'json.writeNumber(%s)'
             elif type is E:
                 buf = 'iparams'
                 getter = 'glGetIntegerv'
-                writer = 'writeEnum(json, %s)'
             elif type is F:
                 buf = 'fparams'
                 getter = 'glGetFloatv'
-                writer = 'json.writeNumber(%s)'
             elif type is D:
                 buf = 'dparams'
                 getter = 'glGetDoublev'
-                writer = 'json.writeNumber(%s)'
             elif type is P:
                 buf = 'pparams'
                 getter = 'glGetPointerv'
-                writer = 'json.writeNumber((size_t)%s)'
             elif type is S:
                 buf = 'sparams'
                 getter = 'glGetString'
-                writer = 'json.writeString((const char *)%s)'
             else:
                 raise NotImplementedError
             print '    memset(%s, 0, %u * sizeof *%s);' % (buf, count, buf)
@@ -2949,18 +3206,44 @@ class StateDumper:
             print '    } else {'
             print '        json.beginMember("%s");' % name
             if count == 1:
-                print '        %s;' % (writer % ( '%s[0]' % buf))
+                JsonWriter().visit(type, '%s[0]' % buf)
             else:
-                print '        json.beginArray();'
-                for i in range(count):
-                    print '        %s;' % (writer % ( '%s[%u]' % (buf, i)))
-                print '        json.endArray();'
+                JsonWriter().visit(Array(type, str(count)), buf)
             print '        json.endMember();'
             print '    }'
         print '    json.endObject();'
         print '    json.endMember(); // parameters'
         print
 
+    def dump_current_program(self):
+        print '    GLint current_program = 0;'
+        print '    glGetIntegerv(GL_CURRENT_PROGRAM, &current_program);'
+        print '    json.beginMember("current_program");'
+        print '    writeProgram(json, current_program);'
+        print '    json.endMember();'
+        print
+
+    def dump_textures(self):
+        print '    json.beginMember("textures");'
+        print '    json.beginArray();'
+        print '    GLint active_texture = GL_TEXTURE0;'
+        print '    glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);'
+        print '    GLint max_texture_coords = 0;'
+        print '    glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);'
+        print '    for (GLint unit = 0; unit < max_texture_coords; ++unit) {'
+        print '        glActiveTexture(GL_TEXTURE0 + unit);'
+        print '        json.beginObject();'
+        for target, binding in texture_targets:
+            print '        json.beginMember("%s");' % target
+            print '        writeTexture(json, %s, %s);' % (target, binding)
+            print '        json.endMember();'
+        print '        json.endObject();'
+        print '    }'
+        print '    glActiveTexture(active_texture);'
+        print '    json.endArray();'
+        print '    json.endMember(); // texture'
+        print
+
     def write_line(s):
         self.write('  '*self.level + s + '\n')
 
index 5d718f246bef30266fa47d95c00c5e41729cc82d..83220e2934243765aa31f2fcf4c3cb37e368722c 100644 (file)
@@ -2,3 +2,4 @@
 qapitrace
 qrc_qapitrace.cxx
 ui_mainwindow.h
+ui_settings.h
index 14e9e96fee97c3646a37a7f92483dd06c4fccfd5..7c54e26a060cac33d0f654dc9149e7e3616193ec 100644 (file)
@@ -1,3 +1,6 @@
+# Include the cmake file needed to use qt4
+include( ${QT_USE_FILE} )
+
 set(qapitrace_SRCS
    apitrace.cpp
    apicalldelegate.cpp
@@ -7,6 +10,9 @@ set(qapitrace_SRCS
    loaderthread.cpp
    mainwindow.cpp
    main.cpp
+   retracer.cpp
+   settingsdialog.cpp
+   vertexdatainterpreter.cpp
  )
 
 qt4_automoc(${qapitrace_SRCS})
@@ -14,7 +20,9 @@ qt4_automoc(${qapitrace_SRCS})
 qt4_add_resources(qapitrace_SRCS qapitrace.qrc)
 
 set(qapitrace_UIS
-   ui/mainwindow.ui)
+   ui/mainwindow.ui
+   ui/retracerdialog.ui
+   ui/settings.ui)
 
 QT4_WRAP_UI(qapitrace_UIS_H ${qapitrace_UIS})
 
index 5376c0dcdb3d266a5964ffafb230b0c252945ae0..4eb542be2171bce1c410da3397fb8eb7592356c1 100644 (file)
@@ -1,14 +1,17 @@
 #include "apicalldelegate.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
 
+#include <QApplication>
 #include <QDebug>
 #include <QPainter>
 #include <QStaticText>
 #include <QStyle>
 
 ApiCallDelegate::ApiCallDelegate(QWidget *parent)
-    : QStyledItemDelegate(parent)
+    : QStyledItemDelegate(parent),
+      m_stateEmblem(":/resources/dialog-information.png")
 {
 }
 
@@ -16,40 +19,42 @@ void ApiCallDelegate::paint(QPainter *painter,
                             const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
-        QStaticText text = call->staticText();
+    QVariant var = index.data(ApiTraceModel::EventRole);
+    ApiTraceEvent *event = var.value<ApiTraceEvent*>();
+
+    Q_ASSERT(index.column() == 0);
+
+    if (event) {
+        QPoint offset;
+        QStaticText text = event->staticText();
         //text.setTextWidth(option.rect.width());
-        QStyledItemDelegate::paint(painter, option, index);
-        painter->drawStaticText(option.rect.topLeft(), text);
-    } else {
-        ApiTraceFrame *frame = index.data().value<ApiTraceFrame*>();
-        if (frame) {
-            QStaticText text = frame->staticText();
-            //text.setTextWidth(option.rect.width());
-            QStyledItemDelegate::paint(painter, option, index);
-            painter->drawStaticText(option.rect.topLeft(), text);
-        } else {
-            QStyledItemDelegate::paint(painter, option, index);
+        //QStyledItemDelegate::paint(painter, option, index);
+        QStyle *style = QApplication::style();
+        style->drawControl(QStyle::CE_ItemViewItem, &option, painter, 0);
+        if (!event->state().isEmpty()) {
+            QPixmap px = m_stateEmblem.pixmap(option.rect.height(), option.rect.height());
+            painter->drawPixmap(option.rect.topLeft(), px);
+            offset = QPoint(option.rect.height() + 5, 0);
         }
+        painter->drawStaticText(option.rect.topLeft() + offset, text);
+    } else {
+        QStyledItemDelegate::paint(painter, option, index);
     }
 }
 
 QSize ApiCallDelegate::sizeHint(const QStyleOptionViewItem &option,
                                 const QModelIndex &index) const
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
-        QStaticText text = call->staticText();
+    ApiTraceEvent *event =
+        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+
+    Q_ASSERT(index.column() == 0);
+
+    if (event) {
+        QStaticText text = event->staticText();
         //text.setTextWidth(option.rect.width());
+        //qDebug()<<"text size = "<<text.size();
         return text.size().toSize();
-    } else {
-        ApiTraceFrame *frame = index.data().value<ApiTraceFrame*>();
-        if (frame) {
-            QStaticText text = frame->staticText();
-            //text.setTextWidth(option.rect.width());
-            return text.size().toSize();
-        }
     }
     return QStyledItemDelegate::sizeHint(option, index);
 }
index a29a1784d6dc6560f751e0dae8fba7f26c4bd96e..525ab8320ad6be475f1d1967b2197a43e6926dcb 100644 (file)
@@ -14,6 +14,9 @@ public:
                const QModelIndex &index) const;
     QSize sizeHint(const QStyleOptionViewItem &option,
                    const QModelIndex &index) const;
+
+private:
+    QIcon m_stateEmblem;
 };
 
 #endif
index a7685dcd6c333b93a457afb2e59d1a29d14a19a5..952d1062a4fad05983f3894026c5aef7c52fb322 100644 (file)
@@ -3,6 +3,7 @@
 #include "trace_model.hpp"
 
 #include <QDebug>
+#include <QObject>
 
 ApiPointer::ApiPointer(int val)
     : m_value(val)
@@ -22,6 +23,15 @@ QString apiVariantToString(const QVariant &variant)
     if (variant.userType() == QVariant::Double) {
         return QString::number(variant.toFloat());
     }
+    if (variant.userType() == QVariant::ByteArray) {
+        if (variant.toByteArray().size() < 1024) {
+            int bytes = variant.toByteArray().size();
+            return QObject::tr("[binary data, size = %1 bytes]").arg(bytes);
+        } else {
+            float kb = variant.toByteArray().size()/1024.;
+            return QObject::tr("[binary data, size = %1 kb]").arg(kb);
+        }
+    }
 
     if (variant.userType() < QVariant::UserType) {
         return variant.toString();
@@ -274,7 +284,19 @@ QString ApiTraceCall::toHtml() const
     if (!m_richText.isEmpty())
         return m_richText;
 
-    m_richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(name);
+    if (helpUrl.isEmpty()) {
+        m_richText = QString::fromLatin1(
+            "%1) <span style=\"font-weight:bold\">%2</span>(")
+                     .arg(index)
+                     .arg(name);
+    } else {
+        m_richText = QString::fromLatin1(
+            "%1) <span style=\"font-weight:bold\"><a href=\"%2\">%3</a></span>(")
+                      .arg(index)
+                      .arg(helpUrl.toString())
+                      .arg(name);
+    }
+
     for (int i = 0; i < argNames.count(); ++i) {
         m_richText += argNames[i];
         m_richText += QString::fromLatin1(" = ");
@@ -304,6 +326,11 @@ QString ApiTraceCall::filterText() const
     for (int i = 0; i < argNames.count(); ++i) {
         m_filterText += argNames[i];
         m_filterText += QString::fromLatin1(" = ");
+
+        if (argValues[i].type() == QVariant::ByteArray) {
+            m_hasBinaryData = true;
+            m_binaryDataIndex = i;
+        }
         m_filterText += apiVariantToString(argValues[i]);
         if (i < argNames.count() - 1)
             m_filterText += QString::fromLatin1(", ");
@@ -350,7 +377,9 @@ ApiTraceFrame::ApiTraceFrame()
 }
 
 ApiTraceCall::ApiTraceCall()
-    : ApiTraceEvent(ApiTraceEvent::Call)
+    : ApiTraceEvent(ApiTraceEvent::Call),
+      m_hasBinaryData(false),
+      m_binaryDataIndex(0)
 {
 }
 
@@ -377,3 +406,13 @@ void ApiTraceEvent::setState(const QVariantMap &state)
 {
     m_state = state;
 }
+
+bool ApiTraceCall::hasBinaryData() const
+{
+    return m_hasBinaryData;
+}
+
+int ApiTraceCall::binaryDataIndex() const
+{
+    return m_binaryDataIndex;
+}
index c69a484e392947b8147dd87406c12827b24a15de..c2fd98736331fbdecb0ab81c16fa05dee7f3f6c4 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <QStaticText>
 #include <QStringList>
+#include <QUrl>
 #include <QVariant>
 
 #include "trace_model.hpp"
@@ -138,15 +139,20 @@ public:
     QVariantList argValues;
     QVariant returnValue;
     ApiTraceFrame *parentFrame;
+    QUrl helpUrl;
 
     QString toHtml() const;
     QString filterText() const;
     QStaticText staticText() const;
     int numChildren() const;
+    bool hasBinaryData() const;
+    int binaryDataIndex() const;
 private:
     mutable QString m_richText;
     mutable QString m_filterText;
     mutable QStaticText m_staticText;
+    mutable bool m_hasBinaryData;
+    mutable int m_binaryDataIndex;
 };
 Q_DECLARE_METATYPE(ApiTraceCall*);
 
index 24c56bf58876591b518811a9f583988f9beb4082..98ee1db52dac6bb75106bf582e6cae3165596209 100644 (file)
@@ -1,11 +1,14 @@
 #include "apitracefilter.h"
 
 #include "apitracecall.h"
+#include "apitracemodel.h"
 
 #include <QDebug>
 
 ApiTraceFilter::ApiTraceFilter(QObject *parent)
-    : QSortFilterProxyModel()
+    : QSortFilterProxyModel(),
+      m_filters(ExtensionsFilter | ResolutionsFilter |
+                ErrorsQueryFilter | ExtraStateFilter)
 {
 }
 
@@ -13,30 +16,53 @@ bool ApiTraceFilter::filterAcceptsRow(int sourceRow,
                                       const QModelIndex &sourceParent) const
 {
     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
-    QVariant varientData = sourceModel()->data(index0);
-    ApiTraceCall *call = varientData.value<ApiTraceCall*>();
+    QVariant varientData = sourceModel()->data(index0, ApiTraceModel::EventRole);
+    ApiTraceEvent *event = varientData.value<ApiTraceEvent*>();
 
-    if (!call) {
-        ApiTraceFrame *frame = varientData.value<ApiTraceFrame*>();
-        return frame != 0;
+    Q_ASSERT(event);
+    if (!event)
+        return false;
+
+    //we don't filter frames
+    if (event->type() == ApiTraceEvent::Frame) {
+        return true;
     }
 
+    ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
     QString function = call->name;
 
     if (!m_text.isEmpty()) {
         return function.contains(m_text);
     }
 
-    //XXX make it configurable
-    if (function.contains(QLatin1String("glXGetProcAddress")))
-        return false;
-    if (function.contains(QLatin1String("wglGetProcAddress")))
-        return false;
+    if (m_filters & ResolutionsFilter) {
+        if (function.contains(QLatin1String("glXGetProcAddress")))
+            return false;
+        if (function.contains(QLatin1String("wglGetProcAddress")))
+            return false;
+    }
+
+    if (m_filters & ErrorsQueryFilter) {
+        if (function.contains(QLatin1String("glGetError")))
+            return false;
+    }
+
+    if (m_filters & ExtraStateFilter) {
+        if (function.contains(QLatin1String("glXGetCurrentDisplay")))
+            return false;
+    }
+
+    if (m_filters & ExtensionsFilter) {
+        if (function.contains(QLatin1String("glXGetClientString")))
+            return false;
+        if (function.contains(QLatin1String("glXQueryExtensionsString")))
+            return false;
+        QString fullText = call->filterText();
+        if (function.contains(QLatin1String("glGetString")) &&
+            fullText.contains(QLatin1String("GL_EXTENSIONS")))
+            return false;
+    }
 
-    QString fullText = call->filterText();
-    if (function.contains(QLatin1String("glGetString")) &&
-        fullText.contains(QLatin1String("GL_EXTENSIONS")))
-        return false;
 
     return true;
 }
@@ -50,4 +76,17 @@ void ApiTraceFilter::setFilterString(const QString &text)
     }
 }
 
+ApiTraceFilter::FilterOptions ApiTraceFilter::filterOptions() const
+{
+    return m_filters;
+}
+
+void ApiTraceFilter::setFilterOptions(ApiTraceFilter::FilterOptions opts)
+{
+    if (opts != m_filters) {
+        m_filters = opts;
+        invalidate();
+    }
+}
+
 #include "apitracefilter.moc"
index f2ad91bd09a5de152b2b092ddb7a636a67310693..fa59397f03e0d5203e0f2788e383a519aafe99fe 100644 (file)
@@ -6,16 +6,28 @@
 class ApiTraceFilter : public QSortFilterProxyModel
 {
     Q_OBJECT
-
+public:
+    enum FilterOption {
+        NullFilter        =  0,
+        ExtensionsFilter  = 1 << 0,
+        ResolutionsFilter = 1 << 1,
+        ErrorsQueryFilter = 1 << 2,
+        ExtraStateFilter  = 1 << 3,
+    };
+    Q_DECLARE_FLAGS(FilterOptions, FilterOption)
 public:
     ApiTraceFilter(QObject *parent = 0);
 
+    FilterOptions filterOptions() const;
+    void setFilterOptions(FilterOptions opts);
+
     void setFilterString(const QString &text);
 protected:
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
 
 private:
     QString m_text;
+    FilterOptions m_filters;
 };
 
 #endif
index c135bc15fac605d12a500dab081c3e0252b3bd2f..63e54cfe907720ec8ca942bf9fa3d66e258fde03 100644 (file)
@@ -5,6 +5,7 @@
 #include "trace_parser.hpp"
 
 #include <QDebug>
+#include <QImage>
 #include <QVariant>
 
 
@@ -24,25 +25,46 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const
     if (!index.isValid())
         return QVariant();
 
-    if (role != Qt::DisplayRole)
-        return QVariant();
-
-    //data only in the first column
     if (index.column() != 0)
         return QVariant();
 
     ApiTraceEvent *itm = item(index);
-    if (itm) {
-        if (itm->type() == ApiTraceEvent::Frame) {
-            ApiTraceFrame *frame =
-                static_cast<ApiTraceFrame *>(itm);
-            return QVariant::fromValue(frame);
-        } else if (itm->type() == ApiTraceEvent::Call) {
-            ApiTraceCall *call =
-                static_cast<ApiTraceCall *>(itm);
-            return QVariant::fromValue(call);
+    if (!itm) {
+        return QVariant();
+    }
+
+    switch (role) {
+    case Qt::DisplayRole:
+        return itm->staticText().text();
+    case Qt::DecorationRole:
+        return QImage();
+    case Qt::ToolTipRole: {
+        const QString stateText = tr("State info available.");
+        if (itm->type() == ApiTraceEvent::Call) {
+            ApiTraceCall *call = static_cast<ApiTraceCall*>(itm);
+            if (call->state().isEmpty())
+                return QString::fromLatin1("%1)&nbsp;<b>%2</b>")
+                    .arg(call->index)
+                    .arg(call->name);
+            else
+                return QString::fromLatin1("%1)&nbsp;<b>%2</b><br/>%3")
+                    .arg(call->index)
+                    .arg(call->name)
+                    .arg(stateText);
+        } else {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(itm);
+            QString text = frame->staticText().text();
+            if (frame->state().isEmpty())
+                return QString::fromLatin1("<b>%1</b>").arg(text);
+            else
+                return QString::fromLatin1("<b>%1</b><br/>%2")
+                    .arg(text)
+                    .arg(stateText);
         }
     }
+    case ApiTraceModel::EventRole:
+        return QVariant::fromValue(itm);
+    }
 
     return QVariant();
 }
@@ -61,7 +83,9 @@ QVariant ApiTraceModel::headerData(int section, Qt::Orientation orientation,
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
         switch (section) {
         case 0:
-            return tr("Event");
+            return tr("Events");
+        case 1:
+            return tr("Flags");
         default:
             //fall through
             break;
@@ -77,13 +101,13 @@ QModelIndex ApiTraceModel::index(int row, int column,
     if (parent.isValid() && parent.column() != 0)
         return QModelIndex();
 
-    if (parent.isValid()) {
-        QVariant data = parent.data();
-        ApiTraceFrame *frame = data.value<ApiTraceFrame*>();
-        if (!frame) {
-            qDebug()<<"got a valid parent but it's not a frame "<<data;
+    ApiTraceEvent *event = item(parent);
+    if (event) {
+        if (event->type() != ApiTraceEvent::Frame) {
+            qDebug()<<"got a valid parent but it's not a frame "<<event->type();
             return QModelIndex();
         }
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
         ApiTraceCall *call = frame->calls.value(row);
         if (call)
             return createIndex(row, column, call);
@@ -102,10 +126,11 @@ QModelIndex ApiTraceModel::index(int row, int column,
 bool ApiTraceModel::hasChildren(const QModelIndex &parent) const
 {
     if (parent.isValid()) {
-        ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
-        if (frame)
+        ApiTraceEvent *event = item(parent);
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
             return !frame->calls.isEmpty();
-        else
+        else
             return false;
     } else {
         return (rowCount() > 0);
@@ -117,8 +142,9 @@ QModelIndex ApiTraceModel::parent(const QModelIndex &index) const
     if (!index.isValid())
         return QModelIndex();
 
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
+    ApiTraceEvent *event = item(index);
+    if (event && event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
         Q_ASSERT(call->parentFrame);
         return createIndex(call->parentFrame->number,
                            0, call->parentFrame);
@@ -131,11 +157,11 @@ int ApiTraceModel::rowCount(const QModelIndex &parent) const
     if (!parent.isValid())
         return m_trace->numFrames();
 
-    ApiTraceCall *call = parent.data().value<ApiTraceCall*>();
-    if (call)
+    ApiTraceEvent *event = item(parent);
+    if (!event || event->type() == ApiTraceEvent::Call)
         return 0;
 
-    ApiTraceFrame *frame = parent.data().value<ApiTraceFrame*>();
+    ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
     if (frame)
         return frame->calls.count();
 
@@ -147,7 +173,6 @@ int ApiTraceModel::columnCount(const QModelIndex &parent) const
     return 1;
 }
 
-
 bool ApiTraceModel::insertRows(int position, int rows,
                                const QModelIndex &parent)
 {
@@ -195,7 +220,7 @@ void ApiTraceModel::invalidateFrames()
 void ApiTraceModel::appendFrames(int oldCount, int numAdded)
 {
     beginInsertRows(QModelIndex(), oldCount,
-                    oldCount + numAdded);
+                    oldCount + numAdded - 1);
     endInsertRows();
 }
 
@@ -206,4 +231,24 @@ ApiTraceEvent * ApiTraceModel::item(const QModelIndex &index) const
     return static_cast<ApiTraceEvent*>(index.internalPointer());
 }
 
+void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event)
+{
+    if (!event)
+        return;
+
+    if (event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+        ApiTraceFrame *frame = call->parentFrame;
+        int row = frame->calls.indexOf(call);
+        QModelIndex index = createIndex(row, 0, call);
+        emit dataChanged(index, index);
+    } else if (event->type() == ApiTraceEvent::Frame) {
+        ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
+        const QList<ApiTraceFrame*> frames = m_trace->frames();
+        int row = frames.indexOf(frame);
+        QModelIndex index = createIndex(row, 0, frame);
+        emit dataChanged(index, index);
+    }
+}
+
 #include "apitracemodel.moc"
index d9ac9dd858905f58370fa5e8879956b6a08417d4..cf901591c9fc6053f88e336c23be1fff35b6aaf1 100644 (file)
@@ -13,12 +13,17 @@ class ApiTraceEvent;
 class ApiTraceModel : public QAbstractItemModel
 {
     Q_OBJECT
+public:
+    enum Roles {
+        EventRole = Qt::UserRole + 1
+    };
 public:
     ApiTraceModel(QObject *parent = 0);
     ~ApiTraceModel();
 
     void setApiTrace(ApiTrace *trace);
     const ApiTrace *apiTrace() const;
+    void stateSetOnEvent(ApiTraceEvent *event);
 
 public:
     /* QAbstractItemModel { */
index 207c2a5def9f2eecd0f4e071fece2e7baab3d9e2..37898a490ceb49a53dab23edee628087df38ca51 100644 (file)
@@ -2,10 +2,17 @@
 
 #include "trace_parser.hpp"
 
+#include <QFile>
+#include <QHash>
+#include <QUrl>
+
+#include <QDebug>
+
 #define FRAMES_TO_CACHE 100
 
 static ApiTraceCall *
-apiCallFromTraceCall(const Trace::Call *call)
+apiCallFromTraceCall(const Trace::Call *call,
+                     const QHash<QString, QUrl> &helpHash)
 {
     ApiTraceCall *apiCall = new ApiTraceCall();
     apiCall->name = QString::fromStdString(call->sig->name);
@@ -27,6 +34,10 @@ apiCallFromTraceCall(const Trace::Call *call)
         apiCall->argValues += argVisitor.variant();
     }
 
+    apiCall->helpUrl = helpHash.value(apiCall->name);
+
+    //force generation of the internal state
+    apiCall->filterText();
     return apiCall;
 }
 
@@ -41,6 +52,26 @@ void LoaderThread::run()
     QList<ApiTraceFrame*> frames;
     ApiTraceFrame *currentFrame = 0;
     int frameCount = 0;
+
+    QHash<QString, QUrl> helpHash;
+
+
+    QFile file(":/resources/glreference.tsv");
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+        QString line;
+        while (!file.atEnd()) {
+            line = file.readLine();
+            QString function = line.section('\t', 0, 0).trimmed();
+            QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
+            //qDebug()<<"function = "<<function<<", url = "<<url.toString();
+            helpHash.insert(function, url);
+        }
+    } else {
+        qWarning() << "Couldn't open reference file "
+                   << file.fileName();
+    }
+    file.close();
+
     Trace::Parser p;
     if (p.open(m_fileName.toLatin1().constData())) {
         Trace::Call *call;
@@ -53,7 +84,7 @@ void LoaderThread::run()
                 ++frameCount;
             }
             ApiTraceCall *apiCall =
-                apiCallFromTraceCall(call);
+                apiCallFromTraceCall(call, helpHash);
             apiCall->parentFrame = currentFrame;
             currentFrame->calls.append(apiCall);
             if (ApiTrace::isCallAFrameMarker(apiCall,
index 12d46efa78403f2c8202df13d4c1500f368d06f7..0065309eca7c4170d240959b123bd8e0a059c4b9 100644 (file)
@@ -5,27 +5,31 @@
 #include "apicalldelegate.h"
 #include "apitracemodel.h"
 #include "apitracefilter.h"
+#include "retracer.h"
+#include "settingsdialog.h"
+#include "ui_retracerdialog.h"
+#include "vertexdatainterpreter.h"
 
 #include <qjson/parser.h>
 
 #include <QAction>
 #include <QDebug>
+#include <QDesktopServices>
 #include <QDir>
 #include <QFileDialog>
 #include <QLineEdit>
 #include <QMessageBox>
-#include <QProcess>
 #include <QProgressBar>
 #include <QToolBar>
+#include <QUrl>
+#include <QWebPage>
 #include <QWebView>
 
 
 MainWindow::MainWindow()
     : QMainWindow(),
-      m_replayProcess(0),
       m_selectedEvent(0),
       m_stateEvent(0),
-      m_findingState(false),
       m_jsonParser(new QJson::Parser())
 {
     m_ui.setupUi(this);
@@ -37,14 +41,43 @@ MainWindow::MainWindow()
     connect(m_trace, SIGNAL(finishedLoadingTrace()),
             this, SLOT(finishedLoadingTrace()));
 
+    m_retracer = new Retracer(this);
+    connect(m_retracer, SIGNAL(finished(const QByteArray&)),
+            this, SLOT(replayFinished(const QByteArray&)));
+    connect(m_retracer, SIGNAL(error(const QString&)),
+            this, SLOT(replayError(const QString&)));
+
+    m_vdataInterpreter = new VertexDataInterpreter(this);
+    m_vdataInterpreter->setListWidget(m_ui.vertexDataListWidget);
+    m_vdataInterpreter->setStride(
+        m_ui.vertexStrideSB->value());
+    m_vdataInterpreter->setComponents(
+        m_ui.vertexComponentsSB->value());
+    m_vdataInterpreter->setStartingOffset(
+        m_ui.startingOffsetSB->value());
+    m_vdataInterpreter->setTypeFromString(
+        m_ui.vertexTypeCB->currentText());
+
+    connect(m_ui.vertexInterpretButton, SIGNAL(clicked()),
+            m_vdataInterpreter, SLOT(interpretData()));
+    connect(m_ui.vertexTypeCB, SIGNAL(currentIndexChanged(const QString&)),
+            m_vdataInterpreter, SLOT(setTypeFromString(const QString&)));
+    connect(m_ui.vertexStrideSB, SIGNAL(valueChanged(int)),
+            m_vdataInterpreter, SLOT(setStride(int)));
+    connect(m_ui.vertexComponentsSB, SIGNAL(valueChanged(int)),
+            m_vdataInterpreter, SLOT(setComponents(int)));
+    connect(m_ui.startingOffsetSB, SIGNAL(valueChanged(int)),
+            m_vdataInterpreter, SLOT(setStartingOffset(int)));
+
     m_model = new ApiTraceModel();
     m_model->setApiTrace(m_trace);
     m_proxyModel = new ApiTraceFilter();
     m_proxyModel->setSourceModel(m_model);
     m_ui.callView->setModel(m_proxyModel);
     m_ui.callView->setItemDelegate(new ApiCallDelegate);
-    for (int column = 0; column < m_model->columnCount(); ++column)
-        m_ui.callView->resizeColumnToContents(column);
+    m_ui.callView->resizeColumnToContents(0);
+    m_ui.callView->header()->swapSections(0, 1);
+    m_ui.callView->setColumnWidth(1, 42);
 
     QToolBar *toolBar = addToolBar(tr("Navigation"));
     m_filterEdit = new QLineEdit(toolBar);
@@ -56,7 +89,11 @@ MainWindow::MainWindow()
     m_progressBar->hide();
 
     m_ui.detailsDock->hide();
+    m_ui.vertexDataDock->hide();
     m_ui.stateDock->hide();
+    setDockOptions(dockOptions() | QMainWindow::ForceTabbedDocks);
+
+    tabifyDockWidget(m_ui.stateDock, m_ui.vertexDataDock);
 
     connect(m_ui.actionOpen, SIGNAL(triggered()),
             this, SLOT(openTrace()));
@@ -69,11 +106,18 @@ MainWindow::MainWindow()
             this, SLOT(replayStop()));
     connect(m_ui.actionLookupState, SIGNAL(triggered()),
             this, SLOT(lookupState()));
+       connect(m_ui.actionOptions, SIGNAL(triggered()),
+            this, SLOT(showSettings()));
 
     connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
             this, SLOT(callItemSelected(const QModelIndex &)));
     connect(m_filterEdit, SIGNAL(returnPressed()),
             this, SLOT(filterTrace()));
+
+    m_ui.detailsWebView->page()->setLinkDelegationPolicy(
+        QWebPage::DelegateExternalLinks);
+    connect(m_ui.detailsWebView, SIGNAL(linkClicked(const QUrl&)),
+            this, SLOT(openHelp(const QUrl&)));
 }
 
 void MainWindow::openTrace()
@@ -105,14 +149,43 @@ void MainWindow::loadTrace(const QString &fileName)
 
 void MainWindow::callItemSelected(const QModelIndex &index)
 {
-    ApiTraceCall *call = index.data().value<ApiTraceCall*>();
-    if (call) {
+    ApiTraceEvent *event =
+        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+
+    if (event && event->type() == ApiTraceEvent::Call) {
+        ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
         m_ui.detailsWebView->setHtml(call->toHtml());
         m_ui.detailsDock->show();
+        if (call->hasBinaryData()) {
+            QByteArray data =
+                call->argValues[call->binaryDataIndex()].toByteArray();
+            m_vdataInterpreter->setData(data);
+
+            for (int i = 0; i < call->argNames.count(); ++i) {
+                QString name = call->argNames[i];
+                if (name == QLatin1String("stride")) {
+                    int stride = call->argValues[i].toInt();
+                    m_ui.vertexStrideSB->setValue(stride);
+                } else if (name == QLatin1String("size")) {
+                    int components = call->argValues[i].toInt();
+                    m_ui.vertexComponentsSB->setValue(components);
+                } else if (name == QLatin1String("type")) {
+                    QString val = call->argValues[i].toString();
+                    int textIndex = m_ui.vertexTypeCB->findText(val);
+                    if (textIndex >= 0)
+                        m_ui.vertexTypeCB->setCurrentIndex(textIndex);
+                }
+            }
+        }
+        m_ui.vertexDataDock->setVisible(call->hasBinaryData());
         m_selectedEvent = call;
     } else {
-        m_selectedEvent = index.data().value<ApiTraceFrame*>();
+        if (event && event->type() == ApiTraceEvent::Frame) {
+            m_selectedEvent = static_cast<ApiTraceFrame*>(event);
+        } else
+            m_selectedEvent = 0;
         m_ui.detailsDock->hide();
+        m_ui.vertexDataDock->hide();
     }
     if (m_selectedEvent && !m_selectedEvent->state().isEmpty()) {
         fillStateForFrame();
@@ -127,18 +200,30 @@ void MainWindow::filterTrace()
 
 void MainWindow::replayStart()
 {
-    replayTrace(false);
+    QDialog dlg;
+    Ui_RetracerDialog dlgUi;
+    dlgUi.setupUi(&dlg);
+
+    dlgUi.doubleBufferingCB->setChecked(
+        m_retracer->isDoubleBuffered());
+    dlgUi.benchmarkCB->setChecked(
+        m_retracer->isBenchmarking());
+
+    if (dlg.exec() == QDialog::Accepted) {
+        m_retracer->setDoubleBuffered(
+            dlgUi.doubleBufferingCB->isChecked());
+        m_retracer->setBenchmarking(
+            dlgUi.benchmarkCB->isChecked());
+        replayTrace(false);
+    }
 }
 
 void MainWindow::replayStop()
 {
-    if (m_replayProcess) {
-        m_replayProcess->kill();
-
-        m_ui.actionStop->setEnabled(false);
-        m_ui.actionReplay->setEnabled(true);
-        m_ui.actionLookupState->setEnabled(true);
-    }
+    m_retracer->terminate();
+    m_ui.actionStop->setEnabled(false);
+    m_ui.actionReplay->setEnabled(true);
+    m_ui.actionLookupState->setEnabled(true);
 }
 
 void MainWindow::newTraceFile(const QString &fileName)
@@ -149,27 +234,23 @@ void MainWindow::newTraceFile(const QString &fileName)
     if (m_traceFileName.isEmpty()) {
         m_ui.actionReplay->setEnabled(false);
         m_ui.actionLookupState->setEnabled(false);
+        setWindowTitle(tr("QApiTrace"));
     } else {
+        QFileInfo info(fileName);
         m_ui.actionReplay->setEnabled(true);
         m_ui.actionLookupState->setEnabled(true);
+        setWindowTitle(
+            tr("QApiTrace - %1").arg(info.fileName()));
     }
 }
 
-void MainWindow::replayFinished()
+void MainWindow::replayFinished(const QByteArray &output)
 {
     m_ui.actionStop->setEnabled(false);
     m_ui.actionReplay->setEnabled(true);
     m_ui.actionLookupState->setEnabled(true);
 
-    QByteArray output = m_replayProcess->readAllStandardOutput();
-
-#if 0
-    qDebug()<<"Process finished = ";
-    qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
-    qDebug()<<"\tout = "<<output;
-#endif
-
-    if (m_findingState) {
+    if (m_retracer->captureState()) {
         bool ok = false;
         QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
         parseState(parsedJson[QLatin1String("parameters")].toMap());
@@ -177,23 +258,17 @@ void MainWindow::replayFinished()
         statusBar()->showMessage(output);
     }
     m_stateEvent = 0;
-    m_findingState = false;
 }
 
-void MainWindow::replayError(QProcess::ProcessError err)
+void MainWindow::replayError(const QString &message)
 {
     m_ui.actionStop->setEnabled(false);
     m_ui.actionReplay->setEnabled(true);
     m_ui.actionLookupState->setEnabled(true);
-    m_findingState = false;
     m_stateEvent = 0;
 
-    qDebug()<<"Process error = "<<err;
-    qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
-    qDebug()<<"\tout = "<<m_replayProcess->readAllStandardOutput();
     QMessageBox::warning(
-        this, tr("Replay Failed"),
-        tr("Couldn't execute the replay file '%1'").arg(m_traceFileName));
+        this, tr("Replay Failed"), message);
 }
 
 void MainWindow::startedLoadingTrace()
@@ -218,33 +293,12 @@ void MainWindow::finishedLoadingTrace()
 
 void MainWindow::replayTrace(bool dumpState)
 {
-    if (!m_replayProcess) {
-#ifdef Q_OS_WIN
-        QString format = QLatin1String("%1;");
-#else
-        QString format = QLatin1String("%1:");
-#endif
-        QString buildPath = format.arg(BUILD_DIR);
-        QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
-        env.insert("PATH", buildPath + env.value("PATH"));
-
-        qputenv("PATH", env.value("PATH").toLatin1());
-
-        m_replayProcess = new QProcess(this);
-        m_replayProcess->setProcessEnvironment(env);
-
-        connect(m_replayProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
-                this, SLOT(replayFinished()));
-        connect(m_replayProcess, SIGNAL(error(QProcess::ProcessError)),
-                this, SLOT(replayError(QProcess::ProcessError)));
-    }
-
     if (m_traceFileName.isEmpty())
         return;
 
-    QStringList arguments;
-    if (dumpState &&
-        m_selectedEvent) {
+    m_retracer->setFileName(m_traceFileName);
+    m_retracer->setCaptureState(dumpState);
+    if (m_retracer->captureState() && m_selectedEvent) {
         int index = 0;
         if (m_selectedEvent->type() == ApiTraceEvent::Call) {
             index = static_cast<ApiTraceCall*>(m_selectedEvent)->index;
@@ -260,13 +314,9 @@ void MainWindow::replayTrace(bool dumpState)
             qDebug()<<"Unknown event type";
             return;
         }
-        arguments << QLatin1String("-D");
-        arguments << QString::number(index);
+        m_retracer->setCaptureAtCallNumber(index);
     }
-    arguments << m_traceFileName;
-
-    m_replayProcess->start(QLatin1String("glretrace"),
-                           arguments);
+    m_retracer->start();
 
     m_ui.actionStop->setEnabled(true);
 }
@@ -280,7 +330,6 @@ void MainWindow::lookupState()
         return;
     }
     m_stateEvent = m_selectedEvent;
-    m_findingState = true;
     replayTrace(true);
 }
 
@@ -294,6 +343,7 @@ void MainWindow::parseState(const QVariantMap &params)
     QVariantMap::const_iterator itr;
 
     m_stateEvent->setState(params);
+    m_model->stateSetOnEvent(m_stateEvent);
     if (m_selectedEvent == m_stateEvent) {
         fillStateForFrame();
     } else {
@@ -350,4 +400,19 @@ void MainWindow::fillStateForFrame()
     m_ui.stateDock->show();
 }
 
+void MainWindow::showSettings()
+{
+    SettingsDialog dialog;
+    dialog.setFilterOptions(m_proxyModel->filterOptions());
+
+    if (dialog.exec() == QDialog::Accepted) {
+        m_proxyModel->setFilterOptions(dialog.filterOptions());
+    }
+}
+
+void MainWindow::openHelp(const QUrl &url)
+{
+    QDesktopServices::openUrl(url);
+}
+
 #include "mainwindow.moc"
index 0f8e2151b8bc28f763f1aba53f75e3ebbd7e510b..47f3328710974eab72e1e47c4a83d8c3dd7fcff7 100644 (file)
@@ -13,8 +13,10 @@ class ApiTraceFrame;
 class ApiTraceModel;
 class QLineEdit;
 class QModelIndex;
-class QProcess;
 class QProgressBar;
+class QUrl;
+class Retracer;
+class VertexDataInterpreter;
 
 namespace QJson {
     class Parser;
@@ -36,11 +38,13 @@ private slots:
     void filterTrace();
     void replayStart();
     void replayStop();
-    void replayFinished();
-    void replayError(QProcess::ProcessError err);
+    void replayFinished(const QByteArray &output);
+    void replayError(const QString &msg);
     void startedLoadingTrace();
     void finishedLoadingTrace();
     void lookupState();
+    void showSettings();
+    void openHelp(const QUrl &url);
 
 private:
     void newTraceFile(const QString &fileName);
@@ -55,8 +59,6 @@ private:
     ApiTraceFilter *m_proxyModel;
     QLineEdit *m_filterEdit;
 
-    QProcess *m_replayProcess;
-
     QProgressBar *m_progressBar;
 
     QString m_traceFileName;
@@ -64,9 +66,12 @@ private:
     ApiTraceEvent *m_selectedEvent;
 
     ApiTraceEvent *m_stateEvent;
-    bool m_findingState;
 
     QJson::Parser *m_jsonParser;
+
+    Retracer *m_retracer;
+
+    VertexDataInterpreter *m_vdataInterpreter;
 };
 
 
index ea3f168e19649ff52197d56928697d613576d02b..6623f1fe1cf49a737c81922093f5eab09bb51d6a 100644 (file)
@@ -6,5 +6,6 @@
     <file>resources/media-playback-start.png</file>
     <file>resources/media-playback-stop.png</file>
     <file>resources/media-record.png</file>
+    <file>resources/glreference.tsv</file>
 </qresource>
 </RCC>
diff --git a/gui/resources/glreference.tsv b/gui/resources/glreference.tsv
new file mode 100644 (file)
index 0000000..816c99f
--- /dev/null
@@ -0,0 +1,1464 @@
+glAccum        http://www.opengl.org/sdk/docs/man/xhtml/glAccum.xml
+glActiveShaderProgram  http://www.opengl.org/sdk/docs/man4/xhtml/glActiveShaderProgram.xml
+glActiveTexture        http://www.opengl.org/sdk/docs/man/xhtml/glActiveTexture.xml
+glActiveTexture        http://www.opengl.org/sdk/docs/man3/xhtml/glActiveTexture.xml
+glActiveTexture        http://www.opengl.org/sdk/docs/man4/xhtml/glActiveTexture.xml
+glAlphaFunc    http://www.opengl.org/sdk/docs/man/xhtml/glAlphaFunc.xml
+glAreTexturesResident  http://www.opengl.org/sdk/docs/man/xhtml/glAreTexturesResident.xml
+glArrayElement http://www.opengl.org/sdk/docs/man/xhtml/glArrayElement.xml
+glAttachShader http://www.opengl.org/sdk/docs/man/xhtml/glAttachShader.xml
+glAttachShader http://www.opengl.org/sdk/docs/man3/xhtml/glAttachShader.xml
+glAttachShader http://www.opengl.org/sdk/docs/man4/xhtml/glAttachShader.xml
+glBegin        http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml
+glBeginConditionalRender       http://www.opengl.org/sdk/docs/man3/xhtml/glBeginConditionalRender.xml
+glBeginConditionalRender       http://www.opengl.org/sdk/docs/man4/xhtml/glBeginConditionalRender.xml
+glBeginQuery   http://www.opengl.org/sdk/docs/man/xhtml/glBeginQuery.xml
+glBeginQuery   http://www.opengl.org/sdk/docs/man3/xhtml/glBeginQuery.xml
+glBeginQuery   http://www.opengl.org/sdk/docs/man4/xhtml/glBeginQuery.xml
+glBeginQueryIndexed    http://www.opengl.org/sdk/docs/man4/xhtml/glBeginQueryIndexed.xml
+glBeginTransformFeedback       http://www.opengl.org/sdk/docs/man3/xhtml/glBeginTransformFeedback.xml
+glBeginTransformFeedback       http://www.opengl.org/sdk/docs/man4/xhtml/glBeginTransformFeedback.xml
+glBindAttribLocation   http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml
+glBindAttribLocation   http://www.opengl.org/sdk/docs/man3/xhtml/glBindAttribLocation.xml
+glBindAttribLocation   http://www.opengl.org/sdk/docs/man4/xhtml/glBindAttribLocation.xml
+glBindBuffer   http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml
+glBindBuffer   http://www.opengl.org/sdk/docs/man3/xhtml/glBindBuffer.xml
+glBindBuffer   http://www.opengl.org/sdk/docs/man4/xhtml/glBindBuffer.xml
+glBindBufferBase       http://www.opengl.org/sdk/docs/man3/xhtml/glBindBufferBase.xml
+glBindBufferBase       http://www.opengl.org/sdk/docs/man4/xhtml/glBindBufferBase.xml
+glBindBufferRange      http://www.opengl.org/sdk/docs/man3/xhtml/glBindBufferRange.xml
+glBindBufferRange      http://www.opengl.org/sdk/docs/man4/xhtml/glBindBufferRange.xml
+glBindFragDataLocation http://www.opengl.org/sdk/docs/man3/xhtml/glBindFragDataLocation.xml
+glBindFragDataLocation http://www.opengl.org/sdk/docs/man4/xhtml/glBindFragDataLocation.xml
+glBindFragDataLocationIndexed  http://www.opengl.org/sdk/docs/man3/xhtml/glBindFragDataLocationIndexed.xml
+glBindFragDataLocationIndexed  http://www.opengl.org/sdk/docs/man4/xhtml/glBindFragDataLocationIndexed.xml
+glBindFramebuffer      http://www.opengl.org/sdk/docs/man3/xhtml/glBindFramebuffer.xml
+glBindFramebuffer      http://www.opengl.org/sdk/docs/man4/xhtml/glBindFramebuffer.xml
+glBindProgramPipeline  http://www.opengl.org/sdk/docs/man4/xhtml/glBindProgramPipeline.xml
+glBindRenderbuffer     http://www.opengl.org/sdk/docs/man3/xhtml/glBindRenderbuffer.xml
+glBindRenderbuffer     http://www.opengl.org/sdk/docs/man4/xhtml/glBindRenderbuffer.xml
+glBindSampler  http://www.opengl.org/sdk/docs/man3/xhtml/glBindSampler.xml
+glBindSampler  http://www.opengl.org/sdk/docs/man4/xhtml/glBindSampler.xml
+glBindTexture  http://www.opengl.org/sdk/docs/man/xhtml/glBindTexture.xml
+glBindTexture  http://www.opengl.org/sdk/docs/man3/xhtml/glBindTexture.xml
+glBindTexture  http://www.opengl.org/sdk/docs/man4/xhtml/glBindTexture.xml
+glBindTransformFeedback        http://www.opengl.org/sdk/docs/man4/xhtml/glBindTransformFeedback.xml
+glBindVertexArray      http://www.opengl.org/sdk/docs/man3/xhtml/glBindVertexArray.xml
+glBindVertexArray      http://www.opengl.org/sdk/docs/man4/xhtml/glBindVertexArray.xml
+glBitmap       http://www.opengl.org/sdk/docs/man/xhtml/glBitmap.xml
+glBlendColor   http://www.opengl.org/sdk/docs/man/xhtml/glBlendColor.xml
+glBlendColor   http://www.opengl.org/sdk/docs/man3/xhtml/glBlendColor.xml
+glBlendColor   http://www.opengl.org/sdk/docs/man4/xhtml/glBlendColor.xml
+glBlendEquation        http://www.opengl.org/sdk/docs/man/xhtml/glBlendEquation.xml
+glBlendEquation        http://www.opengl.org/sdk/docs/man3/xhtml/glBlendEquation.xml
+glBlendEquation        http://www.opengl.org/sdk/docs/man4/xhtml/glBlendEquation.xml
+glBlendEquationSeparate        http://www.opengl.org/sdk/docs/man/xhtml/glBlendEquationSeparate.xml
+glBlendEquationSeparate        http://www.opengl.org/sdk/docs/man3/xhtml/glBlendEquationSeparate.xml
+glBlendEquationSeparate        http://www.opengl.org/sdk/docs/man4/xhtml/glBlendEquationSeparate.xml
+glBlendEquationSeparatei       http://www.opengl.org/sdk/docs/man4/xhtml/glBlendEquationSeparate.xml
+glBlendEquationi       http://www.opengl.org/sdk/docs/man4/xhtml/glBlendEquation.xml
+glBlendFunc    http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml
+glBlendFunc    http://www.opengl.org/sdk/docs/man3/xhtml/glBlendFunc.xml
+glBlendFunc    http://www.opengl.org/sdk/docs/man4/xhtml/glBlendFunc.xml
+glBlendFuncSeparate    http://www.opengl.org/sdk/docs/man/xhtml/glBlendFuncSeparate.xml
+glBlendFuncSeparate    http://www.opengl.org/sdk/docs/man3/xhtml/glBlendFuncSeparate.xml
+glBlendFuncSeparate    http://www.opengl.org/sdk/docs/man4/xhtml/glBlendFuncSeparate.xml
+glBlendFuncSeparatei   http://www.opengl.org/sdk/docs/man4/xhtml/glBlendFuncSeparate.xml
+glBlendFunci   http://www.opengl.org/sdk/docs/man4/xhtml/glBlendFunc.xml
+glBlitFramebuffer      http://www.opengl.org/sdk/docs/man3/xhtml/glBlitFramebuffer.xml
+glBlitFramebuffer      http://www.opengl.org/sdk/docs/man4/xhtml/glBlitFramebuffer.xml
+glBufferData   http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
+glBufferData   http://www.opengl.org/sdk/docs/man3/xhtml/glBufferData.xml
+glBufferData   http://www.opengl.org/sdk/docs/man4/xhtml/glBufferData.xml
+glBufferSubData        http://www.opengl.org/sdk/docs/man/xhtml/glBufferSubData.xml
+glBufferSubData        http://www.opengl.org/sdk/docs/man3/xhtml/glBufferSubData.xml
+glBufferSubData        http://www.opengl.org/sdk/docs/man4/xhtml/glBufferSubData.xml
+glCallList     http://www.opengl.org/sdk/docs/man/xhtml/glCallList.xml
+glCallLists    http://www.opengl.org/sdk/docs/man/xhtml/glCallLists.xml
+glCheckFramebufferStatus       http://www.opengl.org/sdk/docs/man3/xhtml/glCheckFramebufferStatus.xml
+glCheckFramebufferStatus       http://www.opengl.org/sdk/docs/man4/xhtml/glCheckFramebufferStatus.xml
+glClampColor   http://www.opengl.org/sdk/docs/man3/xhtml/glClampColor.xml
+glClampColor   http://www.opengl.org/sdk/docs/man4/xhtml/glClampColor.xml
+glClear        http://www.opengl.org/sdk/docs/man/xhtml/glClear.xml
+glClear        http://www.opengl.org/sdk/docs/man3/xhtml/glClear.xml
+glClear        http://www.opengl.org/sdk/docs/man4/xhtml/glClear.xml
+glClearAccum   http://www.opengl.org/sdk/docs/man/xhtml/glClearAccum.xml
+glClearBufferfi        http://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml
+glClearBufferfi        http://www.opengl.org/sdk/docs/man4/xhtml/glClearBuffer.xml
+glClearBufferfv        http://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml
+glClearBufferfv        http://www.opengl.org/sdk/docs/man4/xhtml/glClearBuffer.xml
+glClearBufferiv        http://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml
+glClearBufferiv        http://www.opengl.org/sdk/docs/man4/xhtml/glClearBuffer.xml
+glClearBufferuiv       http://www.opengl.org/sdk/docs/man3/xhtml/glClearBuffer.xml
+glClearBufferuiv       http://www.opengl.org/sdk/docs/man4/xhtml/glClearBuffer.xml
+glClearColor   http://www.opengl.org/sdk/docs/man/xhtml/glClearColor.xml
+glClearColor   http://www.opengl.org/sdk/docs/man3/xhtml/glClearColor.xml
+glClearColor   http://www.opengl.org/sdk/docs/man4/xhtml/glClearColor.xml
+glClearDepth   http://www.opengl.org/sdk/docs/man/xhtml/glClearDepth.xml
+glClearDepth   http://www.opengl.org/sdk/docs/man3/xhtml/glClearDepth.xml
+glClearDepth   http://www.opengl.org/sdk/docs/man4/xhtml/glClearDepth.xml
+glClearDepthf  http://www.opengl.org/sdk/docs/man4/xhtml/glClearDepth.xml
+glClearIndex   http://www.opengl.org/sdk/docs/man/xhtml/glClearIndex.xml
+glClearStencil http://www.opengl.org/sdk/docs/man/xhtml/glClearStencil.xml
+glClearStencil http://www.opengl.org/sdk/docs/man3/xhtml/glClearStencil.xml
+glClearStencil http://www.opengl.org/sdk/docs/man4/xhtml/glClearStencil.xml
+glClientActiveTexture  http://www.opengl.org/sdk/docs/man/xhtml/glClientActiveTexture.xml
+glClientWaitSync       http://www.opengl.org/sdk/docs/man3/xhtml/glClientWaitSync.xml
+glClientWaitSync       http://www.opengl.org/sdk/docs/man4/xhtml/glClientWaitSync.xml
+glClipPlane    http://www.opengl.org/sdk/docs/man/xhtml/glClipPlane.xml
+glColor3b      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3bv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3d      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3dv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3f      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3fv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3i      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3iv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3s      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3sv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3ub     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3ubv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3ui     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3uiv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3us     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor3usv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4b      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4bv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4d      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4dv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4f      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4fv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4i      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4iv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4s      http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4sv     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4ub     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4ubv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4ui     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4uiv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4us     http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColor4usv    http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml
+glColorMask    http://www.opengl.org/sdk/docs/man/xhtml/glColorMask.xml
+glColorMask    http://www.opengl.org/sdk/docs/man3/xhtml/glColorMask.xml
+glColorMask    http://www.opengl.org/sdk/docs/man4/xhtml/glColorMask.xml
+glColorMaski   http://www.opengl.org/sdk/docs/man4/xhtml/glColorMask.xml
+glColorMaterial        http://www.opengl.org/sdk/docs/man/xhtml/glColorMaterial.xml
+glColorPointer http://www.opengl.org/sdk/docs/man/xhtml/glColorPointer.xml
+glColorSubTable        http://www.opengl.org/sdk/docs/man/xhtml/glColorSubTable.xml
+glColorTable   http://www.opengl.org/sdk/docs/man/xhtml/glColorTable.xml
+glColorTableParameterfv        http://www.opengl.org/sdk/docs/man/xhtml/glColorTableParameter.xml
+glColorTableParameteriv        http://www.opengl.org/sdk/docs/man/xhtml/glColorTableParameter.xml
+glCompileShader        http://www.opengl.org/sdk/docs/man/xhtml/glCompileShader.xml
+glCompileShader        http://www.opengl.org/sdk/docs/man3/xhtml/glCompileShader.xml
+glCompileShader        http://www.opengl.org/sdk/docs/man4/xhtml/glCompileShader.xml
+glCompressedTexImage1D http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage1D.xml
+glCompressedTexImage1D http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexImage1D.xml
+glCompressedTexImage1D http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexImage1D.xml
+glCompressedTexImage2D http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage2D.xml
+glCompressedTexImage2D http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexImage2D.xml
+glCompressedTexImage2D http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexImage2D.xml
+glCompressedTexImage3D http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage3D.xml
+glCompressedTexImage3D http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexImage3D.xml
+glCompressedTexImage3D http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexImage3D.xml
+glCompressedTexSubImage1D      http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexSubImage1D.xml
+glCompressedTexSubImage1D      http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexSubImage1D.xml
+glCompressedTexSubImage1D      http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexSubImage1D.xml
+glCompressedTexSubImage2D      http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexSubImage2D.xml
+glCompressedTexSubImage2D      http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexSubImage2D.xml
+glCompressedTexSubImage2D      http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexSubImage2D.xml
+glCompressedTexSubImage3D      http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexSubImage3D.xml
+glCompressedTexSubImage3D      http://www.opengl.org/sdk/docs/man3/xhtml/glCompressedTexSubImage3D.xml
+glCompressedTexSubImage3D      http://www.opengl.org/sdk/docs/man4/xhtml/glCompressedTexSubImage3D.xml
+glConvolutionFilter1D  http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionFilter1D.xml
+glConvolutionFilter2D  http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionFilter2D.xml
+glConvolutionParameterf        http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionParameter.xml
+glConvolutionParameterfv       http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionParameter.xml
+glConvolutionParameteri        http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionParameter.xml
+glConvolutionParameteriv       http://www.opengl.org/sdk/docs/man/xhtml/glConvolutionParameter.xml
+glCopyBufferSubData    http://www.opengl.org/sdk/docs/man3/xhtml/glCopyBufferSubData.xml
+glCopyBufferSubData    http://www.opengl.org/sdk/docs/man4/xhtml/glCopyBufferSubData.xml
+glCopyColorSubTable    http://www.opengl.org/sdk/docs/man/xhtml/glCopyColorSubTable.xml
+glCopyColorTable       http://www.opengl.org/sdk/docs/man/xhtml/glCopyColorTable.xml
+glCopyConvolutionFilter1D      http://www.opengl.org/sdk/docs/man/xhtml/glCopyConvolutionFilter1D.xml
+glCopyConvolutionFilter2D      http://www.opengl.org/sdk/docs/man/xhtml/glCopyConvolutionFilter2D.xml
+glCopyPixels   http://www.opengl.org/sdk/docs/man/xhtml/glCopyPixels.xml
+glCopyTexImage1D       http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage1D.xml
+glCopyTexImage1D       http://www.opengl.org/sdk/docs/man3/xhtml/glCopyTexImage1D.xml
+glCopyTexImage1D       http://www.opengl.org/sdk/docs/man4/xhtml/glCopyTexImage1D.xml
+glCopyTexImage2D       http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml
+glCopyTexImage2D       http://www.opengl.org/sdk/docs/man3/xhtml/glCopyTexImage2D.xml
+glCopyTexImage2D       http://www.opengl.org/sdk/docs/man4/xhtml/glCopyTexImage2D.xml
+glCopyTexSubImage1D    http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage1D.xml
+glCopyTexSubImage1D    http://www.opengl.org/sdk/docs/man3/xhtml/glCopyTexSubImage1D.xml
+glCopyTexSubImage1D    http://www.opengl.org/sdk/docs/man4/xhtml/glCopyTexSubImage1D.xml
+glCopyTexSubImage2D    http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml
+glCopyTexSubImage2D    http://www.opengl.org/sdk/docs/man3/xhtml/glCopyTexSubImage2D.xml
+glCopyTexSubImage2D    http://www.opengl.org/sdk/docs/man4/xhtml/glCopyTexSubImage2D.xml
+glCopyTexSubImage3D    http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage3D.xml
+glCopyTexSubImage3D    http://www.opengl.org/sdk/docs/man3/xhtml/glCopyTexSubImage3D.xml
+glCopyTexSubImage3D    http://www.opengl.org/sdk/docs/man4/xhtml/glCopyTexSubImage3D.xml
+glCreateProgram        http://www.opengl.org/sdk/docs/man/xhtml/glCreateProgram.xml
+glCreateProgram        http://www.opengl.org/sdk/docs/man3/xhtml/glCreateProgram.xml
+glCreateProgram        http://www.opengl.org/sdk/docs/man4/xhtml/glCreateProgram.xml
+glCreateShader http://www.opengl.org/sdk/docs/man/xhtml/glCreateShader.xml
+glCreateShader http://www.opengl.org/sdk/docs/man3/xhtml/glCreateShader.xml
+glCreateShader http://www.opengl.org/sdk/docs/man4/xhtml/glCreateShader.xml
+glCreateShaderProgramv http://www.opengl.org/sdk/docs/man4/xhtml/glCreateShaderProgram.xml
+glCullFace     http://www.opengl.org/sdk/docs/man/xhtml/glCullFace.xml
+glCullFace     http://www.opengl.org/sdk/docs/man3/xhtml/glCullFace.xml
+glCullFace     http://www.opengl.org/sdk/docs/man4/xhtml/glCullFace.xml
+glDeleteBuffers        http://www.opengl.org/sdk/docs/man/xhtml/glDeleteBuffers.xml
+glDeleteBuffers        http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteBuffers.xml
+glDeleteBuffers        http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteBuffers.xml
+glDeleteFramebuffers   http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteFramebuffers.xml
+glDeleteFramebuffers   http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteFramebuffers.xml
+glDeleteLists  http://www.opengl.org/sdk/docs/man/xhtml/glDeleteLists.xml
+glDeleteProgram        http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml
+glDeleteProgram        http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteProgram.xml
+glDeleteProgram        http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteProgram.xml
+glDeleteProgramPipelines       http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteProgramPipelines.xml
+glDeleteQueries        http://www.opengl.org/sdk/docs/man/xhtml/glDeleteQueries.xml
+glDeleteQueries        http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteQueries.xml
+glDeleteQueries        http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteQueries.xml
+glDeleteRenderbuffers  http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteRenderbuffers.xml
+glDeleteRenderbuffers  http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteRenderbuffers.xml
+glDeleteSamplers       http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteSamplers.xml
+glDeleteSamplers       http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteSamplers.xml
+glDeleteShader http://www.opengl.org/sdk/docs/man/xhtml/glDeleteShader.xml
+glDeleteShader http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteShader.xml
+glDeleteShader http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteShader.xml
+glDeleteSync   http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteSync.xml
+glDeleteSync   http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteSync.xml
+glDeleteTextures       http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml
+glDeleteTextures       http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteTextures.xml
+glDeleteTextures       http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteTextures.xml
+glDeleteTransformFeedbacks     http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteTransformFeedbacks.xml
+glDeleteVertexArrays   http://www.opengl.org/sdk/docs/man3/xhtml/glDeleteVertexArrays.xml
+glDeleteVertexArrays   http://www.opengl.org/sdk/docs/man4/xhtml/glDeleteVertexArrays.xml
+glDepthFunc    http://www.opengl.org/sdk/docs/man/xhtml/glDepthFunc.xml
+glDepthFunc    http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml
+glDepthFunc    http://www.opengl.org/sdk/docs/man4/xhtml/glDepthFunc.xml
+glDepthMask    http://www.opengl.org/sdk/docs/man/xhtml/glDepthMask.xml
+glDepthMask    http://www.opengl.org/sdk/docs/man3/xhtml/glDepthMask.xml
+glDepthMask    http://www.opengl.org/sdk/docs/man4/xhtml/glDepthMask.xml
+glDepthRange   http://www.opengl.org/sdk/docs/man/xhtml/glDepthRange.xml
+glDepthRange   http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml
+glDepthRange   http://www.opengl.org/sdk/docs/man4/xhtml/glDepthRange.xml
+glDepthRangeArrayv     http://www.opengl.org/sdk/docs/man4/xhtml/glDepthRangeArray.xml
+glDepthRangeIndexed    http://www.opengl.org/sdk/docs/man4/xhtml/glDepthRangeIndexed.xml
+glDepthRangef  http://www.opengl.org/sdk/docs/man4/xhtml/glDepthRange.xml
+glDetachShader http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml
+glDetachShader http://www.opengl.org/sdk/docs/man3/xhtml/glDetachShader.xml
+glDetachShader http://www.opengl.org/sdk/docs/man4/xhtml/glDetachShader.xml
+glDisable      http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml
+glDisable      http://www.opengl.org/sdk/docs/man3/xhtml/glEnable.xml
+glDisable      http://www.opengl.org/sdk/docs/man4/xhtml/glEnable.xml
+glDisableClientState   http://www.opengl.org/sdk/docs/man/xhtml/glEnableClientState.xml
+glDisableVertexAttribArray     http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
+glDisableVertexAttribArray     http://www.opengl.org/sdk/docs/man3/xhtml/glEnableVertexAttribArray.xml
+glDisableVertexAttribArray     http://www.opengl.org/sdk/docs/man4/xhtml/glEnableVertexAttribArray.xml
+glDisablei     http://www.opengl.org/sdk/docs/man3/xhtml/glEnable.xml
+glDisablei     http://www.opengl.org/sdk/docs/man4/xhtml/glEnable.xml
+glDrawArrays   http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml
+glDrawArrays   http://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml
+glDrawArrays   http://www.opengl.org/sdk/docs/man4/xhtml/glDrawArrays.xml
+glDrawArraysIndirect   http://www.opengl.org/sdk/docs/man4/xhtml/glDrawArraysIndirect.xml
+glDrawArraysInstanced  http://www.opengl.org/sdk/docs/man3/xhtml/glDrawArraysInstanced.xml
+glDrawArraysInstanced  http://www.opengl.org/sdk/docs/man4/xhtml/glDrawArraysInstanced.xml
+glDrawBuffer   http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffer.xml
+glDrawBuffer   http://www.opengl.org/sdk/docs/man3/xhtml/glDrawBuffer.xml
+glDrawBuffer   http://www.opengl.org/sdk/docs/man4/xhtml/glDrawBuffer.xml
+glDrawBuffers  http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffers.xml
+glDrawBuffers  http://www.opengl.org/sdk/docs/man3/xhtml/glDrawBuffers.xml
+glDrawBuffers  http://www.opengl.org/sdk/docs/man4/xhtml/glDrawBuffers.xml
+glDrawElements http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml
+glDrawElements http://www.opengl.org/sdk/docs/man3/xhtml/glDrawElements.xml
+glDrawElements http://www.opengl.org/sdk/docs/man4/xhtml/glDrawElements.xml
+glDrawElementsBaseVertex       http://www.opengl.org/sdk/docs/man3/xhtml/glDrawElementsBaseVertex.xml
+glDrawElementsBaseVertex       http://www.opengl.org/sdk/docs/man4/xhtml/glDrawElementsBaseVertex.xml
+glDrawElementsIndirect http://www.opengl.org/sdk/docs/man4/xhtml/glDrawElementsIndirect.xml
+glDrawElementsInstanced        http://www.opengl.org/sdk/docs/man3/xhtml/glDrawElementsInstanced.xml
+glDrawElementsInstanced        http://www.opengl.org/sdk/docs/man4/xhtml/glDrawElementsInstanced.xml
+glDrawElementsInstancedBaseVertex      http://www.opengl.org/sdk/docs/man3/xhtml/glDrawElementsInstancedBaseVertex.xml
+glDrawElementsInstancedBaseVertex      http://www.opengl.org/sdk/docs/man4/xhtml/glDrawElementsInstancedBaseVertex.xml
+glDrawPixels   http://www.opengl.org/sdk/docs/man/xhtml/glDrawPixels.xml
+glDrawRangeElements    http://www.opengl.org/sdk/docs/man/xhtml/glDrawRangeElements.xml
+glDrawRangeElements    http://www.opengl.org/sdk/docs/man3/xhtml/glDrawRangeElements.xml
+glDrawRangeElements    http://www.opengl.org/sdk/docs/man4/xhtml/glDrawRangeElements.xml
+glDrawRangeElementsBaseVertex  http://www.opengl.org/sdk/docs/man3/xhtml/glDrawRangeElementsBaseVertex.xml
+glDrawRangeElementsBaseVertex  http://www.opengl.org/sdk/docs/man4/xhtml/glDrawRangeElementsBaseVertex.xml
+glDrawTransformFeedback        http://www.opengl.org/sdk/docs/man4/xhtml/glDrawTransformFeedback.xml
+glDrawTransformFeedbackStream  http://www.opengl.org/sdk/docs/man4/xhtml/glDrawTransformFeedbackStream.xml
+glEdgeFlag     http://www.opengl.org/sdk/docs/man/xhtml/glEdgeFlag.xml
+glEdgeFlagPointer      http://www.opengl.org/sdk/docs/man/xhtml/glEdgeFlagPointer.xml
+glEdgeFlagv    http://www.opengl.org/sdk/docs/man/xhtml/glEdgeFlag.xml
+glEnable       http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml
+glEnable       http://www.opengl.org/sdk/docs/man3/xhtml/glEnable.xml
+glEnable       http://www.opengl.org/sdk/docs/man4/xhtml/glEnable.xml
+glEnableClientState    http://www.opengl.org/sdk/docs/man/xhtml/glEnableClientState.xml
+glEnableVertexAttribArray      http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
+glEnableVertexAttribArray      http://www.opengl.org/sdk/docs/man3/xhtml/glEnableVertexAttribArray.xml
+glEnableVertexAttribArray      http://www.opengl.org/sdk/docs/man4/xhtml/glEnableVertexAttribArray.xml
+glEnablei      http://www.opengl.org/sdk/docs/man3/xhtml/glEnable.xml
+glEnablei      http://www.opengl.org/sdk/docs/man4/xhtml/glEnable.xml
+glEnd  http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml
+glEndConditionalRender http://www.opengl.org/sdk/docs/man3/xhtml/glBeginConditionalRender.xml
+glEndConditionalRender http://www.opengl.org/sdk/docs/man4/xhtml/glBeginConditionalRender.xml
+glEndList      http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml
+glEndQuery     http://www.opengl.org/sdk/docs/man/xhtml/glBeginQuery.xml
+glEndQuery     http://www.opengl.org/sdk/docs/man3/xhtml/glBeginQuery.xml
+glEndQuery     http://www.opengl.org/sdk/docs/man4/xhtml/glBeginQuery.xml
+glEndQueryIndexed      http://www.opengl.org/sdk/docs/man4/xhtml/glBeginQueryIndexed.xml
+glEndTransformFeedback http://www.opengl.org/sdk/docs/man3/xhtml/glBeginTransformFeedback.xml
+glEndTransformFeedback http://www.opengl.org/sdk/docs/man4/xhtml/glBeginTransformFeedback.xml
+glEvalCoord1d  http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord1dv http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord1f  http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord1fv http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord2d  http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord2dv http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord2f  http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalCoord2fv http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml
+glEvalMesh1    http://www.opengl.org/sdk/docs/man/xhtml/glEvalMesh.xml
+glEvalMesh2    http://www.opengl.org/sdk/docs/man/xhtml/glEvalMesh.xml
+glEvalPoint1   http://www.opengl.org/sdk/docs/man/xhtml/glEvalPoint.xml
+glEvalPoint2   http://www.opengl.org/sdk/docs/man/xhtml/glEvalPoint.xml
+glFeedbackBuffer       http://www.opengl.org/sdk/docs/man/xhtml/glFeedbackBuffer.xml
+glFenceSync    http://www.opengl.org/sdk/docs/man3/xhtml/glFenceSync.xml
+glFenceSync    http://www.opengl.org/sdk/docs/man4/xhtml/glFenceSync.xml
+glFinish       http://www.opengl.org/sdk/docs/man/xhtml/glFinish.xml
+glFinish       http://www.opengl.org/sdk/docs/man3/xhtml/glFinish.xml
+glFinish       http://www.opengl.org/sdk/docs/man4/xhtml/glFinish.xml
+glFlush        http://www.opengl.org/sdk/docs/man/xhtml/glFlush.xml
+glFlush        http://www.opengl.org/sdk/docs/man3/xhtml/glFlush.xml
+glFlush        http://www.opengl.org/sdk/docs/man4/xhtml/glFlush.xml
+glFlushMappedBufferRange       http://www.opengl.org/sdk/docs/man3/xhtml/glFlushMappedBufferRange.xml
+glFlushMappedBufferRange       http://www.opengl.org/sdk/docs/man4/xhtml/glFlushMappedBufferRange.xml
+glFogCoordPointer      http://www.opengl.org/sdk/docs/man/xhtml/glFogCoordPointer.xml
+glFogCoordd    http://www.opengl.org/sdk/docs/man/xhtml/glFogCoord.xml
+glFogCoorddv   http://www.opengl.org/sdk/docs/man/xhtml/glFogCoord.xml
+glFogCoordf    http://www.opengl.org/sdk/docs/man/xhtml/glFogCoord.xml
+glFogCoordfv   http://www.opengl.org/sdk/docs/man/xhtml/glFogCoord.xml
+glFogf http://www.opengl.org/sdk/docs/man/xhtml/glFog.xml
+glFogfv        http://www.opengl.org/sdk/docs/man/xhtml/glFog.xml
+glFogi http://www.opengl.org/sdk/docs/man/xhtml/glFog.xml
+glFogiv        http://www.opengl.org/sdk/docs/man/xhtml/glFog.xml
+glFramebufferRenderbuffer      http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferRenderbuffer.xml
+glFramebufferRenderbuffer      http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferRenderbuffer.xml
+glFramebufferTexture   http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferTexture.xml
+glFramebufferTexture   http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferTexture.xml
+glFramebufferTexture1D http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferTexture.xml
+glFramebufferTexture1D http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferTexture.xml
+glFramebufferTexture2D http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferTexture.xml
+glFramebufferTexture2D http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferTexture.xml
+glFramebufferTexture3D http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferTexture.xml
+glFramebufferTexture3D http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferTexture.xml
+glFramebufferTextureLayer      http://www.opengl.org/sdk/docs/man3/xhtml/glFramebufferTextureLayer.xml
+glFramebufferTextureLayer      http://www.opengl.org/sdk/docs/man4/xhtml/glFramebufferTextureLayer.xml
+glFrontFace    http://www.opengl.org/sdk/docs/man/xhtml/glFrontFace.xml
+glFrontFace    http://www.opengl.org/sdk/docs/man3/xhtml/glFrontFace.xml
+glFrontFace    http://www.opengl.org/sdk/docs/man4/xhtml/glFrontFace.xml
+glFrustum      http://www.opengl.org/sdk/docs/man/xhtml/glFrustum.xml
+glGenBuffers   http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml
+glGenBuffers   http://www.opengl.org/sdk/docs/man3/xhtml/glGenBuffers.xml
+glGenBuffers   http://www.opengl.org/sdk/docs/man4/xhtml/glGenBuffers.xml
+glGenFramebuffers      http://www.opengl.org/sdk/docs/man3/xhtml/glGenFramebuffers.xml
+glGenFramebuffers      http://www.opengl.org/sdk/docs/man4/xhtml/glGenFramebuffers.xml
+glGenLists     http://www.opengl.org/sdk/docs/man/xhtml/glGenLists.xml
+glGenProgramPipelines  http://www.opengl.org/sdk/docs/man4/xhtml/glGenProgramPipelines.xml
+glGenQueries   http://www.opengl.org/sdk/docs/man/xhtml/glGenQueries.xml
+glGenQueries   http://www.opengl.org/sdk/docs/man3/xhtml/glGenQueries.xml
+glGenQueries   http://www.opengl.org/sdk/docs/man4/xhtml/glGenQueries.xml
+glGenRenderbuffers     http://www.opengl.org/sdk/docs/man3/xhtml/glGenRenderbuffers.xml
+glGenRenderbuffers     http://www.opengl.org/sdk/docs/man4/xhtml/glGenRenderbuffers.xml
+glGenSamplers  http://www.opengl.org/sdk/docs/man3/xhtml/glGenSamplers.xml
+glGenSamplers  http://www.opengl.org/sdk/docs/man4/xhtml/glGenSamplers.xml
+glGenTextures  http://www.opengl.org/sdk/docs/man/xhtml/glGenTextures.xml
+glGenTextures  http://www.opengl.org/sdk/docs/man3/xhtml/glGenTextures.xml
+glGenTextures  http://www.opengl.org/sdk/docs/man4/xhtml/glGenTextures.xml
+glGenTransformFeedbacks        http://www.opengl.org/sdk/docs/man4/xhtml/glGenTransformFeedbacks.xml
+glGenVertexArrays      http://www.opengl.org/sdk/docs/man3/xhtml/glGenVertexArrays.xml
+glGenVertexArrays      http://www.opengl.org/sdk/docs/man4/xhtml/glGenVertexArrays.xml
+glGenerateMipmap       http://www.opengl.org/sdk/docs/man3/xhtml/glGenerateMipmap.xml
+glGenerateMipmap       http://www.opengl.org/sdk/docs/man4/xhtml/glGenerateMipmap.xml
+glGetActiveAttrib      http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveAttrib.xml
+glGetActiveAttrib      http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveAttrib.xml
+glGetActiveAttrib      http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveAttrib.xml
+glGetActiveSubroutineName      http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveSubroutineName.xml
+glGetActiveSubroutineUniformName       http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveSubroutineUniformName.xml
+glGetActiveSubroutineUniformiv http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveSubroutineUniform.xml
+glGetActiveUniform     http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniform.xml
+glGetActiveUniform     http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveUniform.xml
+glGetActiveUniform     http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveUniform.xml
+glGetActiveUniformBlockName    http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveUniformBlockName.xml
+glGetActiveUniformBlockName    http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveUniformBlockName.xml
+glGetActiveUniformBlockiv      http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveUniformBlock.xml
+glGetActiveUniformBlockiv      http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveUniformBlock.xml
+glGetActiveUniformName http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveUniformName.xml
+glGetActiveUniformName http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveUniformName.xml
+glGetActiveUniformsiv  http://www.opengl.org/sdk/docs/man3/xhtml/glGetActiveUniformsiv.xml
+glGetActiveUniformsiv  http://www.opengl.org/sdk/docs/man4/xhtml/glGetActiveUniformsiv.xml
+glGetAttachedShaders   http://www.opengl.org/sdk/docs/man/xhtml/glGetAttachedShaders.xml
+glGetAttachedShaders   http://www.opengl.org/sdk/docs/man3/xhtml/glGetAttachedShaders.xml
+glGetAttachedShaders   http://www.opengl.org/sdk/docs/man4/xhtml/glGetAttachedShaders.xml
+glGetAttribLocation    http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
+glGetAttribLocation    http://www.opengl.org/sdk/docs/man3/xhtml/glGetAttribLocation.xml
+glGetAttribLocation    http://www.opengl.org/sdk/docs/man4/xhtml/glGetAttribLocation.xml
+glGetBooleani_v        http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetBooleani_v        http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetBooleanv  http://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
+glGetBooleanv  http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetBooleanv  http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetBufferParameteriv http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferParameteriv.xml
+glGetBufferParameteriv http://www.opengl.org/sdk/docs/man3/xhtml/glGetBufferParameter.xml
+glGetBufferParameteriv http://www.opengl.org/sdk/docs/man4/xhtml/glGetBufferParameter.xml
+glGetBufferPointerv    http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferPointerv.xml
+glGetBufferPointerv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetBufferPointerv.xml
+glGetBufferPointerv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetBufferPointerv.xml
+glGetBufferSubData     http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferSubData.xml
+glGetBufferSubData     http://www.opengl.org/sdk/docs/man3/xhtml/glGetBufferSubData.xml
+glGetBufferSubData     http://www.opengl.org/sdk/docs/man4/xhtml/glGetBufferSubData.xml
+glGetClipPlane http://www.opengl.org/sdk/docs/man/xhtml/glGetClipPlane.xml
+glGetColorTable        http://www.opengl.org/sdk/docs/man/xhtml/glGetColorTable.xml
+glGetColorTableParameterfv     http://www.opengl.org/sdk/docs/man/xhtml/glGetColorTableParameter.xml
+glGetColorTableParameteriv     http://www.opengl.org/sdk/docs/man/xhtml/glGetColorTableParameter.xml
+glGetCompressedTexImage        http://www.opengl.org/sdk/docs/man/xhtml/glGetCompressedTexImage.xml
+glGetCompressedTexImage        http://www.opengl.org/sdk/docs/man3/xhtml/glGetCompressedTexImage.xml
+glGetCompressedTexImage        http://www.opengl.org/sdk/docs/man4/xhtml/glGetCompressedTexImage.xml
+glGetConvolutionFilter http://www.opengl.org/sdk/docs/man/xhtml/glGetConvolutionFilter.xml
+glGetConvolutionParameterfv    http://www.opengl.org/sdk/docs/man/xhtml/glGetConvolutionParameter.xml
+glGetConvolutionParameteriv    http://www.opengl.org/sdk/docs/man/xhtml/glGetConvolutionParameter.xml
+glGetDoublev   http://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
+glGetDoublev   http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetDoublev   http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetError     http://www.opengl.org/sdk/docs/man/xhtml/glGetError.xml
+glGetError     http://www.opengl.org/sdk/docs/man3/xhtml/glGetError.xml
+glGetError     http://www.opengl.org/sdk/docs/man4/xhtml/glGetError.xml
+glGetFloatv    http://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
+glGetFloatv    http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetFloatv    http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetFragDataIndex     http://www.opengl.org/sdk/docs/man3/xhtml/glGetFragDataIndex.xml
+glGetFragDataIndex     http://www.opengl.org/sdk/docs/man4/xhtml/glGetFragDataIndex.xml
+glGetFragDataLocation  http://www.opengl.org/sdk/docs/man3/xhtml/glGetFragDataLocation.xml
+glGetFragDataLocation  http://www.opengl.org/sdk/docs/man4/xhtml/glGetFragDataLocation.xml
+glGetFramebufferAttachmentParameter    http://www.opengl.org/sdk/docs/man3/xhtml/glGetFramebufferAttachmentParameter.xml
+glGetFramebufferAttachmentParameter    http://www.opengl.org/sdk/docs/man4/xhtml/glGetFramebufferAttachmentParameter.xml
+glGetHistogram http://www.opengl.org/sdk/docs/man/xhtml/glGetHistogram.xml
+glGetHistogramParameterfv      http://www.opengl.org/sdk/docs/man/xhtml/glGetHistogramParameter.xml
+glGetHistogramParameteriv      http://www.opengl.org/sdk/docs/man/xhtml/glGetHistogramParameter.xml
+glGetInteger64i_v      http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetInteger64i_v      http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetInteger64v        http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetInteger64v        http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetIntegeri_v        http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetIntegeri_v        http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetIntegerv  http://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
+glGetIntegerv  http://www.opengl.org/sdk/docs/man3/xhtml/glGet.xml
+glGetIntegerv  http://www.opengl.org/sdk/docs/man4/xhtml/glGet.xml
+glGetLightfv   http://www.opengl.org/sdk/docs/man/xhtml/glGetLight.xml
+glGetLightiv   http://www.opengl.org/sdk/docs/man/xhtml/glGetLight.xml
+glGetMapdv     http://www.opengl.org/sdk/docs/man/xhtml/glGetMap.xml
+glGetMapfv     http://www.opengl.org/sdk/docs/man/xhtml/glGetMap.xml
+glGetMapiv     http://www.opengl.org/sdk/docs/man/xhtml/glGetMap.xml
+glGetMaterialfv        http://www.opengl.org/sdk/docs/man/xhtml/glGetMaterial.xml
+glGetMaterialiv        http://www.opengl.org/sdk/docs/man/xhtml/glGetMaterial.xml
+glGetMinmax    http://www.opengl.org/sdk/docs/man/xhtml/glGetMinmax.xml
+glGetMinmaxParameterfv http://www.opengl.org/sdk/docs/man/xhtml/glGetMinmaxParameter.xml
+glGetMinmaxParameteriv http://www.opengl.org/sdk/docs/man/xhtml/glGetMinmaxParameter.xml
+glGetMultisamplefv     http://www.opengl.org/sdk/docs/man3/xhtml/glGetMultisample.xml
+glGetMultisamplefv     http://www.opengl.org/sdk/docs/man4/xhtml/glGetMultisample.xml
+glGetPixelMapfv        http://www.opengl.org/sdk/docs/man/xhtml/glGetPixelMap.xml
+glGetPixelMapuiv       http://www.opengl.org/sdk/docs/man/xhtml/glGetPixelMap.xml
+glGetPixelMapusv       http://www.opengl.org/sdk/docs/man/xhtml/glGetPixelMap.xml
+glGetPointerv  http://www.opengl.org/sdk/docs/man/xhtml/glGetPointerv.xml
+glGetPolygonStipple    http://www.opengl.org/sdk/docs/man/xhtml/glGetPolygonStipple.xml
+glGetProgramBinary     http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgramBinary.xml
+glGetProgramInfoLog    http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramInfoLog.xml
+glGetProgramInfoLog    http://www.opengl.org/sdk/docs/man3/xhtml/glGetProgramInfoLog.xml
+glGetProgramInfoLog    http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgramInfoLog.xml
+glGetProgramPipelineInfoLog    http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgramPipelineInfoLog.xml
+glGetProgramPipelineiv http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgramPipeline.xml
+glGetProgramStageiv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgramStage.xml
+glGetProgramiv http://www.opengl.org/sdk/docs/man/xhtml/glGetProgram.xml
+glGetProgramiv http://www.opengl.org/sdk/docs/man3/xhtml/glGetProgram.xml
+glGetProgramiv http://www.opengl.org/sdk/docs/man4/xhtml/glGetProgram.xml
+glGetQueryIndexediv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryIndexed.xml
+glGetQueryObjecti64v   http://www.opengl.org/sdk/docs/man3/xhtml/glGetQueryObject.xml
+glGetQueryObjecti64v   http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryObject.xml
+glGetQueryObjectiv     http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryObject.xml
+glGetQueryObjectiv     http://www.opengl.org/sdk/docs/man3/xhtml/glGetQueryObject.xml
+glGetQueryObjectiv     http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryObject.xml
+glGetQueryObjectui64v  http://www.opengl.org/sdk/docs/man3/xhtml/glGetQueryObject.xml
+glGetQueryObjectui64v  http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryObject.xml
+glGetQueryObjectuiv    http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryObject.xml
+glGetQueryObjectuiv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetQueryObject.xml
+glGetQueryObjectuiv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryObject.xml
+glGetQueryiv   http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryiv.xml
+glGetQueryiv   http://www.opengl.org/sdk/docs/man3/xhtml/glGetQueryiv.xml
+glGetQueryiv   http://www.opengl.org/sdk/docs/man4/xhtml/glGetQueryiv.xml
+glGetRenderbufferParameteriv   http://www.opengl.org/sdk/docs/man3/xhtml/glGetRenderbufferParameter.xml
+glGetRenderbufferParameteriv   http://www.opengl.org/sdk/docs/man4/xhtml/glGetRenderbufferParameter.xml
+glGetSamplerParameterfv        http://www.opengl.org/sdk/docs/man3/xhtml/glGetSamplerParameter.xml
+glGetSamplerParameterfv        http://www.opengl.org/sdk/docs/man4/xhtml/glGetSamplerParameter.xml
+glGetSamplerParameteriv        http://www.opengl.org/sdk/docs/man3/xhtml/glGetSamplerParameter.xml
+glGetSamplerParameteriv        http://www.opengl.org/sdk/docs/man4/xhtml/glGetSamplerParameter.xml
+glGetSeparableFilter   http://www.opengl.org/sdk/docs/man/xhtml/glGetSeparableFilter.xml
+glGetShaderInfoLog     http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderInfoLog.xml
+glGetShaderInfoLog     http://www.opengl.org/sdk/docs/man3/xhtml/glGetShaderInfoLog.xml
+glGetShaderInfoLog     http://www.opengl.org/sdk/docs/man4/xhtml/glGetShaderInfoLog.xml
+glGetShaderPrecisionFormat     http://www.opengl.org/sdk/docs/man4/xhtml/glGetShaderPrecisionFormat.xml
+glGetShaderSource      http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderSource.xml
+glGetShaderSource      http://www.opengl.org/sdk/docs/man3/xhtml/glGetShaderSource.xml
+glGetShaderSource      http://www.opengl.org/sdk/docs/man4/xhtml/glGetShaderSource.xml
+glGetShaderiv  http://www.opengl.org/sdk/docs/man/xhtml/glGetShader.xml
+glGetShaderiv  http://www.opengl.org/sdk/docs/man3/xhtml/glGetShader.xml
+glGetShaderiv  http://www.opengl.org/sdk/docs/man4/xhtml/glGetShader.xml
+glGetString    http://www.opengl.org/sdk/docs/man/xhtml/glGetString.xml
+glGetString    http://www.opengl.org/sdk/docs/man3/xhtml/glGetString.xml
+glGetString    http://www.opengl.org/sdk/docs/man4/xhtml/glGetString.xml
+glGetStringi   http://www.opengl.org/sdk/docs/man3/xhtml/glGetString.xml
+glGetStringi   http://www.opengl.org/sdk/docs/man4/xhtml/glGetString.xml
+glGetSubroutineIndex   http://www.opengl.org/sdk/docs/man4/xhtml/glGetSubroutineIndex.xml
+glGetSubroutineUniformLocation http://www.opengl.org/sdk/docs/man4/xhtml/glGetSubroutineUniformLocation.xml
+glGetSynciv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetSync.xml
+glGetSynciv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetSync.xml
+glGetTexEnvfv  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexEnv.xml
+glGetTexEnviv  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexEnv.xml
+glGetTexGendv  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexGen.xml
+glGetTexGenfv  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexGen.xml
+glGetTexGeniv  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexGen.xml
+glGetTexImage  http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml
+glGetTexImage  http://www.opengl.org/sdk/docs/man3/xhtml/glGetTexImage.xml
+glGetTexImage  http://www.opengl.org/sdk/docs/man4/xhtml/glGetTexImage.xml
+glGetTexLevelParameterfv       http://www.opengl.org/sdk/docs/man/xhtml/glGetTexLevelParameter.xml
+glGetTexLevelParameterfv       http://www.opengl.org/sdk/docs/man3/xhtml/glGetTexLevelParameter.xml
+glGetTexLevelParameterfv       http://www.opengl.org/sdk/docs/man4/xhtml/glGetTexLevelParameter.xml
+glGetTexLevelParameteriv       http://www.opengl.org/sdk/docs/man/xhtml/glGetTexLevelParameter.xml
+glGetTexLevelParameteriv       http://www.opengl.org/sdk/docs/man3/xhtml/glGetTexLevelParameter.xml
+glGetTexLevelParameteriv       http://www.opengl.org/sdk/docs/man4/xhtml/glGetTexLevelParameter.xml
+glGetTexParameterfv    http://www.opengl.org/sdk/docs/man/xhtml/glGetTexParameter.xml
+glGetTexParameterfv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetTexParameter.xml
+glGetTexParameterfv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetTexParameter.xml
+glGetTexParameteriv    http://www.opengl.org/sdk/docs/man/xhtml/glGetTexParameter.xml
+glGetTexParameteriv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetTexParameter.xml
+glGetTexParameteriv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetTexParameter.xml
+glGetTransformFeedbackVarying  http://www.opengl.org/sdk/docs/man3/xhtml/glGetTransformFeedbackVarying.xml
+glGetTransformFeedbackVarying  http://www.opengl.org/sdk/docs/man4/xhtml/glGetTransformFeedbackVarying.xml
+glGetUniformBlockIndex http://www.opengl.org/sdk/docs/man3/xhtml/glGetUniformBlockIndex.xml
+glGetUniformBlockIndex http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniformBlockIndex.xml
+glGetUniformIndices    http://www.opengl.org/sdk/docs/man3/xhtml/glGetUniformIndices.xml
+glGetUniformIndices    http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniformIndices.xml
+glGetUniformLocation   http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml
+glGetUniformLocation   http://www.opengl.org/sdk/docs/man3/xhtml/glGetUniformLocation.xml
+glGetUniformLocation   http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniformLocation.xml
+glGetUniformSubroutineuiv      http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniformSubroutine.xml
+glGetUniformfv http://www.opengl.org/sdk/docs/man/xhtml/glGetUniform.xml
+glGetUniformfv http://www.opengl.org/sdk/docs/man3/xhtml/glGetUniform.xml
+glGetUniformfv http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniform.xml
+glGetUniformiv http://www.opengl.org/sdk/docs/man/xhtml/glGetUniform.xml
+glGetUniformiv http://www.opengl.org/sdk/docs/man3/xhtml/glGetUniform.xml
+glGetUniformiv http://www.opengl.org/sdk/docs/man4/xhtml/glGetUniform.xml
+glGetVertexAttribIiv   http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribIiv   http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribIuiv  http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribIuiv  http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribLdv   http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribPointerv      http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttribPointerv.xml
+glGetVertexAttribPointerv      http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttribPointerv.xml
+glGetVertexAttribPointerv      http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttribPointerv.xml
+glGetVertexAttribdv    http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribdv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribdv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribfv    http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribfv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribfv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribiv    http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribiv    http://www.opengl.org/sdk/docs/man3/xhtml/glGetVertexAttrib.xml
+glGetVertexAttribiv    http://www.opengl.org/sdk/docs/man4/xhtml/glGetVertexAttrib.xml
+glHint http://www.opengl.org/sdk/docs/man/xhtml/glHint.xml
+glHint http://www.opengl.org/sdk/docs/man3/xhtml/glHint.xml
+glHint http://www.opengl.org/sdk/docs/man4/xhtml/glHint.xml
+glHistogram    http://www.opengl.org/sdk/docs/man/xhtml/glHistogram.xml
+glIndexMask    http://www.opengl.org/sdk/docs/man/xhtml/glIndexMask.xml
+glIndexPointer http://www.opengl.org/sdk/docs/man/xhtml/glIndexPointer.xml
+glIndexd       http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexdv      http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexf       http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexfv      http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexi       http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexiv      http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexs       http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexsv      http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexub      http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glIndexubv     http://www.opengl.org/sdk/docs/man/xhtml/glIndex.xml
+glInitNames    http://www.opengl.org/sdk/docs/man/xhtml/glInitNames.xml
+glInterleavedArrays    http://www.opengl.org/sdk/docs/man/xhtml/glInterleavedArrays.xml
+glIsBuffer     http://www.opengl.org/sdk/docs/man/xhtml/glIsBuffer.xml
+glIsBuffer     http://www.opengl.org/sdk/docs/man3/xhtml/glIsBuffer.xml
+glIsBuffer     http://www.opengl.org/sdk/docs/man4/xhtml/glIsBuffer.xml
+glIsEnabled    http://www.opengl.org/sdk/docs/man/xhtml/glIsEnabled.xml
+glIsEnabled    http://www.opengl.org/sdk/docs/man3/xhtml/glIsEnabled.xml
+glIsEnabled    http://www.opengl.org/sdk/docs/man4/xhtml/glIsEnabled.xml
+glIsFramebuffer        http://www.opengl.org/sdk/docs/man3/xhtml/glIsFramebuffer.xml
+glIsFramebuffer        http://www.opengl.org/sdk/docs/man4/xhtml/glIsFramebuffer.xml
+glIsList       http://www.opengl.org/sdk/docs/man/xhtml/glIsList.xml
+glIsProgram    http://www.opengl.org/sdk/docs/man/xhtml/glIsProgram.xml
+glIsProgram    http://www.opengl.org/sdk/docs/man3/xhtml/glIsProgram.xml
+glIsProgram    http://www.opengl.org/sdk/docs/man4/xhtml/glIsProgram.xml
+glIsProgramPipeline    http://www.opengl.org/sdk/docs/man4/xhtml/glIsProgramPipeline.xml
+glIsQuery      http://www.opengl.org/sdk/docs/man/xhtml/glIsQuery.xml
+glIsQuery      http://www.opengl.org/sdk/docs/man3/xhtml/glIsQuery.xml
+glIsQuery      http://www.opengl.org/sdk/docs/man4/xhtml/glIsQuery.xml
+glIsRenderbuffer       http://www.opengl.org/sdk/docs/man3/xhtml/glIsRenderbuffer.xml
+glIsRenderbuffer       http://www.opengl.org/sdk/docs/man4/xhtml/glIsRenderbuffer.xml
+glIsSampler    http://www.opengl.org/sdk/docs/man3/xhtml/glIsSampler.xml
+glIsSampler    http://www.opengl.org/sdk/docs/man4/xhtml/glIsSampler.xml
+glIsShader     http://www.opengl.org/sdk/docs/man/xhtml/glIsShader.xml
+glIsShader     http://www.opengl.org/sdk/docs/man3/xhtml/glIsShader.xml
+glIsShader     http://www.opengl.org/sdk/docs/man4/xhtml/glIsShader.xml
+glIsSync       http://www.opengl.org/sdk/docs/man3/xhtml/glIsSync.xml
+glIsSync       http://www.opengl.org/sdk/docs/man4/xhtml/glIsSync.xml
+glIsTexture    http://www.opengl.org/sdk/docs/man/xhtml/glIsTexture.xml
+glIsTexture    http://www.opengl.org/sdk/docs/man3/xhtml/glIsTexture.xml
+glIsTexture    http://www.opengl.org/sdk/docs/man4/xhtml/glIsTexture.xml
+glIsTransformFeedback  http://www.opengl.org/sdk/docs/man4/xhtml/glIsTransformFeedback.xml
+glIsVertexArray        http://www.opengl.org/sdk/docs/man3/xhtml/glIsVertexArray.xml
+glIsVertexArray        http://www.opengl.org/sdk/docs/man4/xhtml/glIsVertexArray.xml
+glLightModelf  http://www.opengl.org/sdk/docs/man/xhtml/glLightModel.xml
+glLightModelfv http://www.opengl.org/sdk/docs/man/xhtml/glLightModel.xml
+glLightModeli  http://www.opengl.org/sdk/docs/man/xhtml/glLightModel.xml
+glLightModeliv http://www.opengl.org/sdk/docs/man/xhtml/glLightModel.xml
+glLightf       http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
+glLightfv      http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
+glLighti       http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
+glLightiv      http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
+glLineStipple  http://www.opengl.org/sdk/docs/man/xhtml/glLineStipple.xml
+glLineWidth    http://www.opengl.org/sdk/docs/man/xhtml/glLineWidth.xml
+glLineWidth    http://www.opengl.org/sdk/docs/man3/xhtml/glLineWidth.xml
+glLineWidth    http://www.opengl.org/sdk/docs/man4/xhtml/glLineWidth.xml
+glLinkProgram  http://www.opengl.org/sdk/docs/man/xhtml/glLinkProgram.xml
+glLinkProgram  http://www.opengl.org/sdk/docs/man3/xhtml/glLinkProgram.xml
+glLinkProgram  http://www.opengl.org/sdk/docs/man4/xhtml/glLinkProgram.xml
+glListBase     http://www.opengl.org/sdk/docs/man/xhtml/glListBase.xml
+glLoadIdentity http://www.opengl.org/sdk/docs/man/xhtml/glLoadIdentity.xml
+glLoadMatrixd  http://www.opengl.org/sdk/docs/man/xhtml/glLoadMatrix.xml
+glLoadMatrixf  http://www.opengl.org/sdk/docs/man/xhtml/glLoadMatrix.xml
+glLoadName     http://www.opengl.org/sdk/docs/man/xhtml/glLoadName.xml
+glLoadTransposeMatrixd http://www.opengl.org/sdk/docs/man/xhtml/glLoadTransposeMatrix.xml
+glLoadTransposeMatrixf http://www.opengl.org/sdk/docs/man/xhtml/glLoadTransposeMatrix.xml
+glLogicOp      http://www.opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
+glLogicOp      http://www.opengl.org/sdk/docs/man3/xhtml/glLogicOp.xml
+glLogicOp      http://www.opengl.org/sdk/docs/man4/xhtml/glLogicOp.xml
+glMap1d        http://www.opengl.org/sdk/docs/man/xhtml/glMap1.xml
+glMap1f        http://www.opengl.org/sdk/docs/man/xhtml/glMap1.xml
+glMap2d        http://www.opengl.org/sdk/docs/man/xhtml/glMap2.xml
+glMap2f        http://www.opengl.org/sdk/docs/man/xhtml/glMap2.xml
+glMapBuffer    http://www.opengl.org/sdk/docs/man/xhtml/glMapBuffer.xml
+glMapBuffer    http://www.opengl.org/sdk/docs/man3/xhtml/glMapBuffer.xml
+glMapBuffer    http://www.opengl.org/sdk/docs/man4/xhtml/glMapBuffer.xml
+glMapBufferRange       http://www.opengl.org/sdk/docs/man3/xhtml/glMapBufferRange.xml
+glMapBufferRange       http://www.opengl.org/sdk/docs/man4/xhtml/glMapBufferRange.xml
+glMapGrid1d    http://www.opengl.org/sdk/docs/man/xhtml/glMapGrid.xml
+glMapGrid1f    http://www.opengl.org/sdk/docs/man/xhtml/glMapGrid.xml
+glMapGrid2d    http://www.opengl.org/sdk/docs/man/xhtml/glMapGrid.xml
+glMapGrid2f    http://www.opengl.org/sdk/docs/man/xhtml/glMapGrid.xml
+glMaterialf    http://www.opengl.org/sdk/docs/man/xhtml/glMaterial.xml
+glMaterialfv   http://www.opengl.org/sdk/docs/man/xhtml/glMaterial.xml
+glMateriali    http://www.opengl.org/sdk/docs/man/xhtml/glMaterial.xml
+glMaterialiv   http://www.opengl.org/sdk/docs/man/xhtml/glMaterial.xml
+glMatrixMode   http://www.opengl.org/sdk/docs/man/xhtml/glMatrixMode.xml
+glMinSampleShading     http://www.opengl.org/sdk/docs/man4/xhtml/glMinSampleShading.xml
+glMinmax       http://www.opengl.org/sdk/docs/man/xhtml/glMinmax.xml
+glMultMatrixd  http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xml
+glMultMatrixf  http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xml
+glMultTransposeMatrixd http://www.opengl.org/sdk/docs/man/xhtml/glMultTransposeMatrix.xml
+glMultTransposeMatrixf http://www.opengl.org/sdk/docs/man/xhtml/glMultTransposeMatrix.xml
+glMultiDrawArrays      http://www.opengl.org/sdk/docs/man/xhtml/glMultiDrawArrays.xml
+glMultiDrawArrays      http://www.opengl.org/sdk/docs/man3/xhtml/glMultiDrawArrays.xml
+glMultiDrawArrays      http://www.opengl.org/sdk/docs/man4/xhtml/glMultiDrawArrays.xml
+glMultiDrawElements    http://www.opengl.org/sdk/docs/man/xhtml/glMultiDrawElements.xml
+glMultiDrawElements    http://www.opengl.org/sdk/docs/man3/xhtml/glMultiDrawElements.xml
+glMultiDrawElements    http://www.opengl.org/sdk/docs/man4/xhtml/glMultiDrawElements.xml
+glMultiDrawElementsBaseVertex  http://www.opengl.org/sdk/docs/man3/xhtml/glMultiDrawElementsBaseVertex.xml
+glMultiDrawElementsBaseVertex  http://www.opengl.org/sdk/docs/man4/xhtml/glMultiDrawElementsBaseVertex.xml
+glMultiTexCoord1d      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1dv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1f      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1fv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1i      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1iv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1s      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord1sv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2d      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2dv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2f      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2fv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2i      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2iv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2s      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord2sv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3d      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3dv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3f      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3fv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3i      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3iv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3s      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord3sv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4d      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4dv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4f      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4fv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4i      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4iv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4s      http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glMultiTexCoord4sv     http://www.opengl.org/sdk/docs/man/xhtml/glMultiTexCoord.xml
+glNewList      http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml
+glNormal3b     http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3bv    http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3d     http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3dv    http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3f     http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3fv    http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3i     http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3iv    http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3s     http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormal3sv    http://www.opengl.org/sdk/docs/man/xhtml/glNormal.xml
+glNormalPointer        http://www.opengl.org/sdk/docs/man/xhtml/glNormalPointer.xml
+glOrtho        http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml
+glPassThrough  http://www.opengl.org/sdk/docs/man/xhtml/glPassThrough.xml
+glPatchParameterfv     http://www.opengl.org/sdk/docs/man4/xhtml/glPatchParameter.xml
+glPatchParameteri      http://www.opengl.org/sdk/docs/man4/xhtml/glPatchParameter.xml
+glPauseTransformFeedback       http://www.opengl.org/sdk/docs/man4/xhtml/glPauseTransformFeedback.xml
+glPixelMapfv   http://www.opengl.org/sdk/docs/man/xhtml/glPixelMap.xml
+glPixelMapuiv  http://www.opengl.org/sdk/docs/man/xhtml/glPixelMap.xml
+glPixelMapusv  http://www.opengl.org/sdk/docs/man/xhtml/glPixelMap.xml
+glPixelStoref  http://www.opengl.org/sdk/docs/man/xhtml/glPixelStore.xml
+glPixelStoref  http://www.opengl.org/sdk/docs/man3/xhtml/glPixelStore.xml
+glPixelStoref  http://www.opengl.org/sdk/docs/man4/xhtml/glPixelStore.xml
+glPixelStorei  http://www.opengl.org/sdk/docs/man/xhtml/glPixelStore.xml
+glPixelStorei  http://www.opengl.org/sdk/docs/man3/xhtml/glPixelStore.xml
+glPixelStorei  http://www.opengl.org/sdk/docs/man4/xhtml/glPixelStore.xml
+glPixelTransferf       http://www.opengl.org/sdk/docs/man/xhtml/glPixelTransfer.xml
+glPixelTransferi       http://www.opengl.org/sdk/docs/man/xhtml/glPixelTransfer.xml
+glPixelZoom    http://www.opengl.org/sdk/docs/man/xhtml/glPixelZoom.xml
+glPointParameterf      http://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml
+glPointParameterf      http://www.opengl.org/sdk/docs/man3/xhtml/glPointParameter.xml
+glPointParameterf      http://www.opengl.org/sdk/docs/man4/xhtml/glPointParameter.xml
+glPointParameterfv     http://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml
+glPointParameterfv     http://www.opengl.org/sdk/docs/man3/xhtml/glPointParameter.xml
+glPointParameterfv     http://www.opengl.org/sdk/docs/man4/xhtml/glPointParameter.xml
+glPointParameteri      http://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml
+glPointParameteri      http://www.opengl.org/sdk/docs/man3/xhtml/glPointParameter.xml
+glPointParameteri      http://www.opengl.org/sdk/docs/man4/xhtml/glPointParameter.xml
+glPointParameteriv     http://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml
+glPointParameteriv     http://www.opengl.org/sdk/docs/man3/xhtml/glPointParameter.xml
+glPointParameteriv     http://www.opengl.org/sdk/docs/man4/xhtml/glPointParameter.xml
+glPointSize    http://www.opengl.org/sdk/docs/man/xhtml/glPointSize.xml
+glPointSize    http://www.opengl.org/sdk/docs/man3/xhtml/glPointSize.xml
+glPointSize    http://www.opengl.org/sdk/docs/man4/xhtml/glPointSize.xml
+glPolygonMode  http://www.opengl.org/sdk/docs/man/xhtml/glPolygonMode.xml
+glPolygonMode  http://www.opengl.org/sdk/docs/man3/xhtml/glPolygonMode.xml
+glPolygonMode  http://www.opengl.org/sdk/docs/man4/xhtml/glPolygonMode.xml
+glPolygonOffset        http://www.opengl.org/sdk/docs/man/xhtml/glPolygonOffset.xml
+glPolygonOffset        http://www.opengl.org/sdk/docs/man3/xhtml/glPolygonOffset.xml
+glPolygonOffset        http://www.opengl.org/sdk/docs/man4/xhtml/glPolygonOffset.xml
+glPolygonStipple       http://www.opengl.org/sdk/docs/man/xhtml/glPolygonStipple.xml
+glPopAttrib    http://www.opengl.org/sdk/docs/man/xhtml/glPushAttrib.xml
+glPopClientAttrib      http://www.opengl.org/sdk/docs/man/xhtml/glPushClientAttrib.xml
+glPopMatrix    http://www.opengl.org/sdk/docs/man/xhtml/glPushMatrix.xml
+glPopName      http://www.opengl.org/sdk/docs/man/xhtml/glPushName.xml
+glPrimitiveRestartIndex        http://www.opengl.org/sdk/docs/man3/xhtml/glPrimitiveRestartIndex.xml
+glPrimitiveRestartIndex        http://www.opengl.org/sdk/docs/man4/xhtml/glPrimitiveRestartIndex.xml
+glPrioritizeTextures   http://www.opengl.org/sdk/docs/man/xhtml/glPrioritizeTextures.xml
+glProgramBinary        http://www.opengl.org/sdk/docs/man4/xhtml/glProgramBinary.xml
+glProgramParameteri    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramParameter.xml
+glProgramUniform1f     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform1fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform1i     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform1iv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform1ui    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform1uiv   http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2f     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2i     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2iv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2ui    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform2uiv   http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3f     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3i     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3iv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3ui    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform3uiv   http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4f     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4i     http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4iv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4ui    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniform4uiv   http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix2fv      http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix2x3fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix2x4fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix3fv      http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix3x2fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix3x4fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix4fv      http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix4x2fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProgramUniformMatrix4x3fv    http://www.opengl.org/sdk/docs/man4/xhtml/glProgramUniform.xml
+glProvokingVertex      http://www.opengl.org/sdk/docs/man3/xhtml/glProvokingVertex.xml
+glProvokingVertex      http://www.opengl.org/sdk/docs/man4/xhtml/glProvokingVertex.xml
+glPushAttrib   http://www.opengl.org/sdk/docs/man/xhtml/glPushAttrib.xml
+glPushClientAttrib     http://www.opengl.org/sdk/docs/man/xhtml/glPushClientAttrib.xml
+glPushMatrix   http://www.opengl.org/sdk/docs/man/xhtml/glPushMatrix.xml
+glPushName     http://www.opengl.org/sdk/docs/man/xhtml/glPushName.xml
+glQueryCounter http://www.opengl.org/sdk/docs/man3/xhtml/glQueryCounter.xml
+glQueryCounter http://www.opengl.org/sdk/docs/man4/xhtml/glQueryCounter.xml
+glRasterPos2d  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2dv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2f  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2fv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2i  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2iv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2s  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos2sv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3d  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3dv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3f  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3fv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3i  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3iv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3s  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos3sv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4d  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4dv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4f  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4fv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4i  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4iv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4s  http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glRasterPos4sv http://www.opengl.org/sdk/docs/man/xhtml/glRasterPos.xml
+glReadBuffer   http://www.opengl.org/sdk/docs/man/xhtml/glReadBuffer.xml
+glReadBuffer   http://www.opengl.org/sdk/docs/man3/xhtml/glReadBuffer.xml
+glReadBuffer   http://www.opengl.org/sdk/docs/man4/xhtml/glReadBuffer.xml
+glReadPixels   http://www.opengl.org/sdk/docs/man/xhtml/glReadPixels.xml
+glReadPixels   http://www.opengl.org/sdk/docs/man3/xhtml/glReadPixels.xml
+glReadPixels   http://www.opengl.org/sdk/docs/man4/xhtml/glReadPixels.xml
+glRectd        http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRectdv       http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRectf        http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRectfv       http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRecti        http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRectiv       http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRects        http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glRectsv       http://www.opengl.org/sdk/docs/man/xhtml/glRect.xml
+glReleaseShaderCompiler        http://www.opengl.org/sdk/docs/man4/xhtml/glReleaseShaderCompiler.xml
+glRenderMode   http://www.opengl.org/sdk/docs/man/xhtml/glRenderMode.xml
+glRenderbufferStorage  http://www.opengl.org/sdk/docs/man3/xhtml/glRenderbufferStorage.xml
+glRenderbufferStorage  http://www.opengl.org/sdk/docs/man4/xhtml/glRenderbufferStorage.xml
+glRenderbufferStorageMultisample       http://www.opengl.org/sdk/docs/man3/xhtml/glRenderbufferStorageMultisample.xml
+glRenderbufferStorageMultisample       http://www.opengl.org/sdk/docs/man4/xhtml/glRenderbufferStorageMultisample.xml
+glResetHistogram       http://www.opengl.org/sdk/docs/man/xhtml/glResetHistogram.xml
+glResetMinmax  http://www.opengl.org/sdk/docs/man/xhtml/glResetMinmax.xml
+glResumeTransformFeedback      http://www.opengl.org/sdk/docs/man4/xhtml/glResumeTransformFeedback.xml
+glRotated      http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
+glRotatef      http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
+glSampleCoverage       http://www.opengl.org/sdk/docs/man/xhtml/glSampleCoverage.xml
+glSampleCoverage       http://www.opengl.org/sdk/docs/man3/xhtml/glSampleCoverage.xml
+glSampleCoverage       http://www.opengl.org/sdk/docs/man4/xhtml/glSampleCoverage.xml
+glSampleMaski  http://www.opengl.org/sdk/docs/man3/xhtml/glSampleMaski.xml
+glSampleMaski  http://www.opengl.org/sdk/docs/man4/xhtml/glSampleMaski.xml
+glSamplerParameterf    http://www.opengl.org/sdk/docs/man3/xhtml/glSamplerParameter.xml
+glSamplerParameterf    http://www.opengl.org/sdk/docs/man4/xhtml/glSamplerParameter.xml
+glSamplerParameterfv   http://www.opengl.org/sdk/docs/man3/xhtml/glSamplerParameter.xml
+glSamplerParameterfv   http://www.opengl.org/sdk/docs/man4/xhtml/glSamplerParameter.xml
+glSamplerParameteri    http://www.opengl.org/sdk/docs/man3/xhtml/glSamplerParameter.xml
+glSamplerParameteri    http://www.opengl.org/sdk/docs/man4/xhtml/glSamplerParameter.xml
+glSamplerParameteriv   http://www.opengl.org/sdk/docs/man3/xhtml/glSamplerParameter.xml
+glSamplerParameteriv   http://www.opengl.org/sdk/docs/man4/xhtml/glSamplerParameter.xml
+glScaled       http://www.opengl.org/sdk/docs/man/xhtml/glScale.xml
+glScalef       http://www.opengl.org/sdk/docs/man/xhtml/glScale.xml
+glScissor      http://www.opengl.org/sdk/docs/man/xhtml/glScissor.xml
+glScissor      http://www.opengl.org/sdk/docs/man3/xhtml/glScissor.xml
+glScissor      http://www.opengl.org/sdk/docs/man4/xhtml/glScissor.xml
+glScissorArrayv        http://www.opengl.org/sdk/docs/man4/xhtml/glScissorArray.xml
+glScissorIndexed       http://www.opengl.org/sdk/docs/man4/xhtml/glScissorIndexed.xml
+glScissorIndexedv      http://www.opengl.org/sdk/docs/man4/xhtml/glScissorIndexed.xml
+glSecondaryColor3b     http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3bv    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3d     http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3dv    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3f     http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3fv    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3i     http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3iv    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3s     http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3sv    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3ub    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3ubv   http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3ui    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3uiv   http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3us    http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColor3usv   http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml
+glSecondaryColorPointer        http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColorPointer.xml
+glSelectBuffer http://www.opengl.org/sdk/docs/man/xhtml/glSelectBuffer.xml
+glSeparableFilter2D    http://www.opengl.org/sdk/docs/man/xhtml/glSeparableFilter2D.xml
+glShadeModel   http://www.opengl.org/sdk/docs/man/xhtml/glShadeModel.xml
+glShaderBinary http://www.opengl.org/sdk/docs/man4/xhtml/glShaderBinary.xml
+glShaderSource http://www.opengl.org/sdk/docs/man/xhtml/glShaderSource.xml
+glShaderSource http://www.opengl.org/sdk/docs/man3/xhtml/glShaderSource.xml
+glShaderSource http://www.opengl.org/sdk/docs/man4/xhtml/glShaderSource.xml
+glStencilFunc  http://www.opengl.org/sdk/docs/man/xhtml/glStencilFunc.xml
+glStencilFunc  http://www.opengl.org/sdk/docs/man3/xhtml/glStencilFunc.xml
+glStencilFunc  http://www.opengl.org/sdk/docs/man4/xhtml/glStencilFunc.xml
+glStencilFuncSeparate  http://www.opengl.org/sdk/docs/man/xhtml/glStencilFuncSeparate.xml
+glStencilFuncSeparate  http://www.opengl.org/sdk/docs/man3/xhtml/glStencilFuncSeparate.xml
+glStencilFuncSeparate  http://www.opengl.org/sdk/docs/man4/xhtml/glStencilFuncSeparate.xml
+glStencilMask  http://www.opengl.org/sdk/docs/man/xhtml/glStencilMask.xml
+glStencilMask  http://www.opengl.org/sdk/docs/man3/xhtml/glStencilMask.xml
+glStencilMask  http://www.opengl.org/sdk/docs/man4/xhtml/glStencilMask.xml
+glStencilMaskSeparate  http://www.opengl.org/sdk/docs/man/xhtml/glStencilMaskSeparate.xml
+glStencilMaskSeparate  http://www.opengl.org/sdk/docs/man3/xhtml/glStencilMaskSeparate.xml
+glStencilMaskSeparate  http://www.opengl.org/sdk/docs/man4/xhtml/glStencilMaskSeparate.xml
+glStencilOp    http://www.opengl.org/sdk/docs/man/xhtml/glStencilOp.xml
+glStencilOp    http://www.opengl.org/sdk/docs/man3/xhtml/glStencilOp.xml
+glStencilOp    http://www.opengl.org/sdk/docs/man4/xhtml/glStencilOp.xml
+glStencilOpSeparate    http://www.opengl.org/sdk/docs/man/xhtml/glStencilOpSeparate.xml
+glStencilOpSeparate    http://www.opengl.org/sdk/docs/man3/xhtml/glStencilOpSeparate.xml
+glStencilOpSeparate    http://www.opengl.org/sdk/docs/man4/xhtml/glStencilOpSeparate.xml
+glTexBuffer    http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml
+glTexBuffer    http://www.opengl.org/sdk/docs/man4/xhtml/glTexBuffer.xml
+glTexCoord1d   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1dv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1f   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1fv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1i   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1iv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1s   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord1sv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2d   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2dv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2f   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2fv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2i   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2iv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2s   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord2sv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3d   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3dv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3f   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3fv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3i   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3iv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3s   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord3sv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4d   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4dv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4f   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4fv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4i   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4iv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4s   http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoord4sv  http://www.opengl.org/sdk/docs/man/xhtml/glTexCoord.xml
+glTexCoordPointer      http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml
+glTexEnvf      http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml
+glTexEnvfv     http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml
+glTexEnvi      http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml
+glTexEnviv     http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml
+glTexGend      http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexGendv     http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexGenf      http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexGenfv     http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexGeni      http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexGeniv     http://www.opengl.org/sdk/docs/man/xhtml/glTexGen.xml
+glTexImage1D   http://www.opengl.org/sdk/docs/man/xhtml/glTexImage1D.xml
+glTexImage1D   http://www.opengl.org/sdk/docs/man3/xhtml/glTexImage1D.xml
+glTexImage1D   http://www.opengl.org/sdk/docs/man4/xhtml/glTexImage1D.xml
+glTexImage2D   http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
+glTexImage2D   http://www.opengl.org/sdk/docs/man3/xhtml/glTexImage2D.xml
+glTexImage2D   http://www.opengl.org/sdk/docs/man4/xhtml/glTexImage2D.xml
+glTexImage2DMultisample        http://www.opengl.org/sdk/docs/man3/xhtml/glTexImage2DMultisample.xml
+glTexImage2DMultisample        http://www.opengl.org/sdk/docs/man4/xhtml/glTexImage2DMultisample.xml
+glTexImage3D   http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3D.xml
+glTexImage3D   http://www.opengl.org/sdk/docs/man3/xhtml/glTexImage3D.xml
+glTexImage3D   http://www.opengl.org/sdk/docs/man4/xhtml/glTexImage3D.xml
+glTexImage3DMultisample        http://www.opengl.org/sdk/docs/man3/xhtml/glTexImage3DMultisample.xml
+glTexImage3DMultisample        http://www.opengl.org/sdk/docs/man4/xhtml/glTexImage3DMultisample.xml
+glTexParameterIiv      http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameterIiv      http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexParameterIuiv     http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameterIuiv     http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexParameterf        http://www.opengl.org/sdk/docs/man/xhtml/glTexParameter.xml
+glTexParameterf        http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameterf        http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexParameterfv       http://www.opengl.org/sdk/docs/man/xhtml/glTexParameter.xml
+glTexParameterfv       http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameterfv       http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexParameteri        http://www.opengl.org/sdk/docs/man/xhtml/glTexParameter.xml
+glTexParameteri        http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameteri        http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexParameteriv       http://www.opengl.org/sdk/docs/man/xhtml/glTexParameter.xml
+glTexParameteriv       http://www.opengl.org/sdk/docs/man3/xhtml/glTexParameter.xml
+glTexParameteriv       http://www.opengl.org/sdk/docs/man4/xhtml/glTexParameter.xml
+glTexSubImage1D        http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage1D.xml
+glTexSubImage1D        http://www.opengl.org/sdk/docs/man3/xhtml/glTexSubImage1D.xml
+glTexSubImage1D        http://www.opengl.org/sdk/docs/man4/xhtml/glTexSubImage1D.xml
+glTexSubImage2D        http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml
+glTexSubImage2D        http://www.opengl.org/sdk/docs/man3/xhtml/glTexSubImage2D.xml
+glTexSubImage2D        http://www.opengl.org/sdk/docs/man4/xhtml/glTexSubImage2D.xml
+glTexSubImage3D        http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage3D.xml
+glTexSubImage3D        http://www.opengl.org/sdk/docs/man3/xhtml/glTexSubImage3D.xml
+glTexSubImage3D        http://www.opengl.org/sdk/docs/man4/xhtml/glTexSubImage3D.xml
+glTransformFeedbackVaryings    http://www.opengl.org/sdk/docs/man3/xhtml/glTransformFeedbackVaryings.xml
+glTransformFeedbackVaryings    http://www.opengl.org/sdk/docs/man4/xhtml/glTransformFeedbackVaryings.xml
+glTranslated   http://www.opengl.org/sdk/docs/man/xhtml/glTranslate.xml
+glTranslatef   http://www.opengl.org/sdk/docs/man/xhtml/glTranslate.xml
+glUniform1f    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform1f    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1f    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform1fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform1fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform1i    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform1i    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1i    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform1iv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform1iv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1iv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform1ui   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1ui   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform1uiv  http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform1uiv  http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2f    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform2f    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2f    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform2fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2i    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform2i    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2i    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2iv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform2iv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2iv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2ui   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2ui   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform2uiv  http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform2uiv  http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3f    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform3f    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3f    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform3fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3i    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform3i    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3i    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3iv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform3iv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3iv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3ui   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3ui   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform3uiv  http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform3uiv  http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4f    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform4f    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4f    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform4fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4i    http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform4i    http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4i    http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4iv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniform4iv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4iv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4ui   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4ui   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniform4uiv  http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniform4uiv  http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformBlockBinding  http://www.opengl.org/sdk/docs/man3/xhtml/glUniformBlockBinding.xml
+glUniformBlockBinding  http://www.opengl.org/sdk/docs/man4/xhtml/glUniformBlockBinding.xml
+glUniformMatrix2fv     http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix2fv     http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix2fv     http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix2x3fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix2x3fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix2x3fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix2x4fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix2x4fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix2x4fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix3fv     http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix3fv     http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix3fv     http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix3x2fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix3x2fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix3x2fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix3x4fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix3x4fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix3x4fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix4fv     http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix4fv     http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix4fv     http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix4x2fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix4x2fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix4x2fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformMatrix4x3fv   http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml
+glUniformMatrix4x3fv   http://www.opengl.org/sdk/docs/man3/xhtml/glUniform.xml
+glUniformMatrix4x3fv   http://www.opengl.org/sdk/docs/man4/xhtml/glUniform.xml
+glUniformSubroutinesuiv        http://www.opengl.org/sdk/docs/man4/xhtml/glUniformSubroutines.xml
+glUnmapBuffer  http://www.opengl.org/sdk/docs/man/xhtml/glMapBuffer.xml
+glUnmapBuffer  http://www.opengl.org/sdk/docs/man3/xhtml/glMapBuffer.xml
+glUnmapBuffer  http://www.opengl.org/sdk/docs/man4/xhtml/glMapBuffer.xml
+glUseProgram   http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml
+glUseProgram   http://www.opengl.org/sdk/docs/man3/xhtml/glUseProgram.xml
+glUseProgram   http://www.opengl.org/sdk/docs/man4/xhtml/glUseProgram.xml
+glUseProgramStages     http://www.opengl.org/sdk/docs/man4/xhtml/glUseProgramStages.xml
+glValidateProgram      http://www.opengl.org/sdk/docs/man/xhtml/glValidateProgram.xml
+glValidateProgram      http://www.opengl.org/sdk/docs/man3/xhtml/glValidateProgram.xml
+glValidateProgram      http://www.opengl.org/sdk/docs/man4/xhtml/glValidateProgram.xml
+glValidateProgramPipeline      http://www.opengl.org/sdk/docs/man4/xhtml/glValidateProgramPipeline.xml
+glVertex2d     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2dv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2f     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2fv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2i     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2iv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2s     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex2sv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3d     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3dv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3f     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3fv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3i     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3iv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3s     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex3sv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4d     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4dv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4f     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4fv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4i     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4iv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4s     http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertex4sv    http://www.opengl.org/sdk/docs/man/xhtml/glVertex.xml
+glVertexAttrib1d       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1d       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1d       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib1dv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1dv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1dv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib1f       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1f       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1f       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib1fv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1fv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1fv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib1s       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1s       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1s       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib1sv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib1sv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib1sv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2d       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2d       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2d       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2dv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2dv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2dv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2f       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2f       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2f       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2fv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2fv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2fv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2s       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2s       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2s       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib2sv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib2sv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib2sv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3d       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3d       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3d       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3dv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3dv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3dv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3f       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3f       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3f       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3fv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3fv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3fv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3s       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3s       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3s       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib3sv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib3sv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib3sv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nbv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nbv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nbv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Niv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Niv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Niv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nsv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nsv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nsv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nub     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nub     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nub     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nubv    http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nubv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nubv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nuiv    http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nuiv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nuiv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nusv    http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nusv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4Nusv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4bv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4bv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4bv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4d       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4d       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4d       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4dv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4dv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4dv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4f       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4f       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4f       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4fv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4fv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4fv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4iv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4iv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4iv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4s       http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4s       http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4s       http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4sv      http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4sv      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4sv      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4ubv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4ubv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4ubv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4uiv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4uiv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4uiv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttrib4usv     http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml
+glVertexAttrib4usv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttrib4usv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribDivisor  http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttribDivisor.xml
+glVertexAttribDivisor  http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttribDivisor.xml
+glVertexAttribI1i      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI1i      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI1iv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI1iv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI1ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI1ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI1uiv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI1uiv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI2i      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI2i      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI2iv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI2iv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI2ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI2ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI2uiv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI2uiv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI3i      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI3i      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI3iv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI3iv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI3ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI3ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI3uiv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI3uiv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4bv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4bv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4i      http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4i      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4iv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4iv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4sv     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4sv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4ubv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4ubv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4uiv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4uiv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribI4usv    http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribI4usv    http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribIPointer http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttribPointer.xml
+glVertexAttribIPointer http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttribPointer.xml
+glVertexAttribL1d      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL1dv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL2d      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL2dv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL3d      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL3dv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL4d      http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribL4dv     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribLPointer http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttribPointer.xml
+glVertexAttribP1ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribP1ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribP2ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribP2ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribP3ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribP3ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribP4ui     http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttrib.xml
+glVertexAttribP4ui     http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttrib.xml
+glVertexAttribPointer  http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml
+glVertexAttribPointer  http://www.opengl.org/sdk/docs/man3/xhtml/glVertexAttribPointer.xml
+glVertexAttribPointer  http://www.opengl.org/sdk/docs/man4/xhtml/glVertexAttribPointer.xml
+glVertexPointer        http://www.opengl.org/sdk/docs/man/xhtml/glVertexPointer.xml
+glViewport     http://www.opengl.org/sdk/docs/man/xhtml/glViewport.xml
+glViewport     http://www.opengl.org/sdk/docs/man3/xhtml/glViewport.xml
+glViewport     http://www.opengl.org/sdk/docs/man4/xhtml/glViewport.xml
+glViewportArrayv       http://www.opengl.org/sdk/docs/man4/xhtml/glViewportArray.xml
+glViewportIndexedf     http://www.opengl.org/sdk/docs/man4/xhtml/glViewportIndexed.xml
+glViewportIndexedfv    http://www.opengl.org/sdk/docs/man4/xhtml/glViewportIndexed.xml
+glWaitSync     http://www.opengl.org/sdk/docs/man3/xhtml/glWaitSync.xml
+glWaitSync     http://www.opengl.org/sdk/docs/man4/xhtml/glWaitSync.xml
+glWindowPos2d  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2dv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2f  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2fv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2i  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2iv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2s  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos2sv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3d  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3dv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3f  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3fv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3i  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3iv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3s  http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glWindowPos3sv http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml
+glXChooseFBConfig      http://www.opengl.org/sdk/docs/man/xhtml/glXChooseFBConfig.xml
+glXChooseVisual        http://www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xml
+glXCopyContext http://www.opengl.org/sdk/docs/man/xhtml/glXCopyContext.xml
+glXCreateContext       http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xml
+glXCreateGLXPixmap     http://www.opengl.org/sdk/docs/man/xhtml/glXCreateGLXPixmap.xml
+glXCreateNewContext    http://www.opengl.org/sdk/docs/man/xhtml/glXCreateNewContext.xml
+glXCreatePbuffer       http://www.opengl.org/sdk/docs/man/xhtml/glXCreatePbuffer.xml
+glXCreatePixmap        http://www.opengl.org/sdk/docs/man/xhtml/glXCreatePixmap.xml
+glXCreateWindow        http://www.opengl.org/sdk/docs/man/xhtml/glXCreateWindow.xml
+glXDestroyContext      http://www.opengl.org/sdk/docs/man/xhtml/glXDestroyContext.xml
+glXDestroyGLXPixmap    http://www.opengl.org/sdk/docs/man/xhtml/glXDestroyGLXPixmap.xml
+glXDestroyPbuffer      http://www.opengl.org/sdk/docs/man/xhtml/glXDestroyPbuffer.xml
+glXDestroyPixmap       http://www.opengl.org/sdk/docs/man/xhtml/glXDestroyPixmap.xml
+glXDestroyWindow       http://www.opengl.org/sdk/docs/man/xhtml/glXDestroyWindow.xml
+glXFreeContextEXT      http://www.opengl.org/sdk/docs/man/xhtml/glXFreeContextEXT.xml
+glXGetClientString     http://www.opengl.org/sdk/docs/man/xhtml/glXGetClientString.xml
+glXGetConfig   http://www.opengl.org/sdk/docs/man/xhtml/glXGetConfig.xml
+glXGetContextIDEXT     http://www.opengl.org/sdk/docs/man/xhtml/glXGetContextIDEXT.xml
+glXGetCurrentContext   http://www.opengl.org/sdk/docs/man/xhtml/glXGetCurrentContext.xml
+glXGetCurrentDisplay   http://www.opengl.org/sdk/docs/man/xhtml/glXGetCurrentDisplay.xml
+glXGetCurrentDrawable  http://www.opengl.org/sdk/docs/man/xhtml/glXGetCurrentDrawable.xml
+glXGetCurrentReadDrawable      http://www.opengl.org/sdk/docs/man/xhtml/glXGetCurrentReadDrawable.xml
+glXGetFBConfigAttrib   http://www.opengl.org/sdk/docs/man/xhtml/glXGetFBConfigAttrib.xml
+glXGetFBConfigs        http://www.opengl.org/sdk/docs/man/xhtml/glXGetFBConfigs.xml
+glXGetProcAddress      http://www.opengl.org/sdk/docs/man/xhtml/glXGetProcAddress.xml
+glXGetSelectedEvent    http://www.opengl.org/sdk/docs/man/xhtml/glXGetSelectedEvent.xml
+glXGetVisualFromFBConfig       http://www.opengl.org/sdk/docs/man/xhtml/glXGetVisualFromFBConfig.xml
+glXImportContextEXT    http://www.opengl.org/sdk/docs/man/xhtml/glXImportContextEXT.xml
+glXIsDirect    http://www.opengl.org/sdk/docs/man/xhtml/glXIsDirect.xml
+glXMakeContextCurrent  http://www.opengl.org/sdk/docs/man/xhtml/glXMakeContextCurrent.xml
+glXMakeCurrent http://www.opengl.org/sdk/docs/man/xhtml/glXMakeCurrent.xml
+glXQueryContext        http://www.opengl.org/sdk/docs/man/xhtml/glXQueryContext.xml
+glXQueryContextInfoEXT http://www.opengl.org/sdk/docs/man/xhtml/glXQueryContextInfoEXT.xml
+glXQueryDrawable       http://www.opengl.org/sdk/docs/man/xhtml/glXQueryDrawable.xml
+glXQueryExtension      http://www.opengl.org/sdk/docs/man/xhtml/glXQueryExtension.xml
+glXQueryExtensionsString       http://www.opengl.org/sdk/docs/man/xhtml/glXQueryExtensionsString.xml
+glXQueryServerString   http://www.opengl.org/sdk/docs/man/xhtml/glXQueryServerString.xml
+glXQueryVersion        http://www.opengl.org/sdk/docs/man/xhtml/glXQueryVersion.xml
+glXSelectEvent http://www.opengl.org/sdk/docs/man/xhtml/glXSelectEvent.xml
+glXSwapBuffers http://www.opengl.org/sdk/docs/man/xhtml/glXSwapBuffers.xml
+glXUseXFont    http://www.opengl.org/sdk/docs/man/xhtml/glXUseXFont.xml
+glXWaitGL      http://www.opengl.org/sdk/docs/man/xhtml/glXWaitGL.xml
+glXWaitX       http://www.opengl.org/sdk/docs/man/xhtml/glXWaitX.xml
+gluBeginCurve  http://www.opengl.org/sdk/docs/man/xhtml/gluBeginCurve.xml
+gluBeginPolygon        http://www.opengl.org/sdk/docs/man/xhtml/gluBeginPolygon.xml
+gluBeginSurface        http://www.opengl.org/sdk/docs/man/xhtml/gluBeginSurface.xml
+gluBeginTrim   http://www.opengl.org/sdk/docs/man/xhtml/gluBeginTrim.xml
+gluBuild1DMipmapLevels http://www.opengl.org/sdk/docs/man/xhtml/gluBuild1DMipmapLevels.xml
+gluBuild1DMipmaps      http://www.opengl.org/sdk/docs/man/xhtml/gluBuild1DMipmaps.xml
+gluBuild2DMipmapLevels http://www.opengl.org/sdk/docs/man/xhtml/gluBuild2DMipmapLevels.xml
+gluBuild2DMipmaps      http://www.opengl.org/sdk/docs/man/xhtml/gluBuild2DMipmaps.xml
+gluBuild3DMipmapLevels http://www.opengl.org/sdk/docs/man/xhtml/gluBuild3DMipmapLevels.xml
+gluBuild3DMipmaps      http://www.opengl.org/sdk/docs/man/xhtml/gluBuild3DMipmaps.xml
+gluCheckExtension      http://www.opengl.org/sdk/docs/man/xhtml/gluCheckExtension.xml
+gluCylinder    http://www.opengl.org/sdk/docs/man/xhtml/gluCylinder.xml
+gluDeleteNurbsRenderer http://www.opengl.org/sdk/docs/man/xhtml/gluDeleteNurbsRenderer.xml
+gluDeleteQuadric       http://www.opengl.org/sdk/docs/man/xhtml/gluDeleteQuadric.xml
+gluDeleteTess  http://www.opengl.org/sdk/docs/man/xhtml/gluDeleteTess.xml
+gluDisk        http://www.opengl.org/sdk/docs/man/xhtml/gluDisk.xml
+gluEndCurve    http://www.opengl.org/sdk/docs/man/xhtml/gluBeginCurve.xml
+gluEndPolygon  http://www.opengl.org/sdk/docs/man/xhtml/gluBeginPolygon.xml
+gluEndSurface  http://www.opengl.org/sdk/docs/man/xhtml/gluBeginSurface.xml
+gluEndTrim     http://www.opengl.org/sdk/docs/man/xhtml/gluBeginTrim.xml
+gluErrorString http://www.opengl.org/sdk/docs/man/xhtml/gluErrorString.xml
+gluGetNurbsProperty    http://www.opengl.org/sdk/docs/man/xhtml/gluGetNurbsProperty.xml
+gluGetString   http://www.opengl.org/sdk/docs/man/xhtml/gluGetString.xml
+gluGetTessProperty     http://www.opengl.org/sdk/docs/man/xhtml/gluGetTessProperty.xml
+gluLoadSamplingMatrices        http://www.opengl.org/sdk/docs/man/xhtml/gluLoadSamplingMatrices.xml
+gluLookAt      http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml
+gluNewNurbsRenderer    http://www.opengl.org/sdk/docs/man/xhtml/gluNewNurbsRenderer.xml
+gluNewQuadric  http://www.opengl.org/sdk/docs/man/xhtml/gluNewQuadric.xml
+gluNewTess     http://www.opengl.org/sdk/docs/man/xhtml/gluNewTess.xml
+gluNextContour http://www.opengl.org/sdk/docs/man/xhtml/gluNextContour.xml
+gluNurbsCallback       http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsCallback.xml
+gluNurbsCallbackData   http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsCallbackData.xml
+gluNurbsCallbackDataEXT        http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsCallbackDataEXT.xml
+gluNurbsCurve  http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsCurve.xml
+gluNurbsProperty       http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsProperty.xml
+gluNurbsSurface        http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsSurface.xml
+gluOrtho2D     http://www.opengl.org/sdk/docs/man/xhtml/gluOrtho2D.xml
+gluPartialDisk http://www.opengl.org/sdk/docs/man/xhtml/gluPartialDisk.xml
+gluPerspective http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml
+gluPickMatrix  http://www.opengl.org/sdk/docs/man/xhtml/gluPickMatrix.xml
+gluProject     http://www.opengl.org/sdk/docs/man/xhtml/gluProject.xml
+gluPwlCurve    http://www.opengl.org/sdk/docs/man/xhtml/gluPwlCurve.xml
+gluQuadricCallback     http://www.opengl.org/sdk/docs/man/xhtml/gluQuadricCallback.xml
+gluQuadricDrawStyle    http://www.opengl.org/sdk/docs/man/xhtml/gluQuadricDrawStyle.xml
+gluQuadricNormals      http://www.opengl.org/sdk/docs/man/xhtml/gluQuadricNormals.xml
+gluQuadricOrientation  http://www.opengl.org/sdk/docs/man/xhtml/gluQuadricOrientation.xml
+gluQuadricTexture      http://www.opengl.org/sdk/docs/man/xhtml/gluQuadricTexture.xml
+gluScaleImage  http://www.opengl.org/sdk/docs/man/xhtml/gluScaleImage.xml
+gluSphere      http://www.opengl.org/sdk/docs/man/xhtml/gluSphere.xml
+gluTessBeginContour    http://www.opengl.org/sdk/docs/man/xhtml/gluTessBeginContour.xml
+gluTessBeginPolygon    http://www.opengl.org/sdk/docs/man/xhtml/gluTessBeginPolygon.xml
+gluTessCallback        http://www.opengl.org/sdk/docs/man/xhtml/gluTessCallback.xml
+gluTessEndContour      http://www.opengl.org/sdk/docs/man/xhtml/gluTessBeginContour.xml
+gluTessEndPolygon      http://www.opengl.org/sdk/docs/man/xhtml/gluTessEndPolygon.xml
+gluTessNormal  http://www.opengl.org/sdk/docs/man/xhtml/gluTessNormal.xml
+gluTessProperty        http://www.opengl.org/sdk/docs/man/xhtml/gluTessProperty.xml
+gluTessVertex  http://www.opengl.org/sdk/docs/man/xhtml/gluTessVertex.xml
+gluUnProject   http://www.opengl.org/sdk/docs/man/xhtml/gluUnProject.xml
+gluUnProject4  http://www.opengl.org/sdk/docs/man/xhtml/gluUnProject4.xml
+wglChoosePixelFormat   http://msdn.microsoft.com/en-us/library/dd318284.aspx
+wglCopyContext http://msdn.microsoft.com/en-us/library/dd374378.aspx
+wglCreateContext       http://msdn.microsoft.com/en-us/library/dd374379.aspx
+wglCreateLayerContext  http://msdn.microsoft.com/en-us/library/dd374380.aspx
+wglDeleteContext       http://msdn.microsoft.com/en-us/library/dd374381.aspx
+wglDescribeLayerPlane  http://msdn.microsoft.com/en-us/library/dd374382.aspx
+wglDescribePixelFormat http://msdn.microsoft.com/en-us/library/dd318302.aspx
+wglGetCurrentContext   http://msdn.microsoft.com/en-us/library/dd374383.aspx
+wglGetCurrentDC        http://msdn.microsoft.com/en-us/library/dd374384.aspx
+wglGetLayerPaletteEntries      http://msdn.microsoft.com/en-us/library/dd374385.aspx
+wglGetPixelFormat      http://msdn.microsoft.com/en-us/library/dd318349.aspx
+wglGetProcAddress      http://msdn.microsoft.com/en-us/library/dd374386.aspx
+wglMakeCurrent http://msdn.microsoft.com/en-us/library/dd374387.aspx
+wglRealizeLayerPalette http://msdn.microsoft.com/en-us/library/dd374388.aspx
+wglSetLayerPaletteEntries      http://msdn.microsoft.com/en-us/library/dd374389.aspx
+wglSetPixelFormat      http://msdn.microsoft.com/en-us/library/dd369049.aspx
+wglShareLists  http://msdn.microsoft.com/en-us/library/dd374390.aspx
+wglSwapBuffers http://msdn.microsoft.com/en-us/library/dd369060.aspx
+wglSwapLayerBuffers    http://msdn.microsoft.com/en-us/library/dd374391.aspx
+wglUseFontBitmaps      http://msdn.microsoft.com/en-us/library/dd374392.aspx
+wglUseFontOutlines     http://msdn.microsoft.com/en-us/library/dd374393.aspx
diff --git a/gui/retracer.cpp b/gui/retracer.cpp
new file mode 100644 (file)
index 0000000..b9d74b6
--- /dev/null
@@ -0,0 +1,136 @@
+#include "retracer.h"
+
+#include <QDebug>
+
+Retracer::Retracer(QObject *parent)
+    : QObject(parent),
+      m_benchmarking(true),
+      m_doubleBuffered(true),
+      m_captureState(false),
+      m_captureCall(0),
+      m_process(0)
+{
+}
+
+QString Retracer::fileName() const
+{
+    return m_fileName;
+}
+
+void Retracer::setFileName(const QString &name)
+{
+    m_fileName = name;
+}
+
+bool Retracer::isBenchmarking() const
+{
+    return m_benchmarking;
+}
+
+void Retracer::setBenchmarking(bool bench)
+{
+    m_benchmarking = bench;
+}
+
+bool Retracer::isDoubleBuffered() const
+{
+    return m_doubleBuffered;
+}
+
+void Retracer::setDoubleBuffered(bool db)
+{
+    m_doubleBuffered = db;
+}
+
+void Retracer::start()
+{
+    if (!m_process) {
+#ifdef Q_OS_WIN
+        QString format = QLatin1String("%1;");
+#else
+        QString format = QLatin1String("%1:");
+#endif
+        QString buildPath = format.arg(BUILD_DIR);
+        QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+        env.insert("PATH", buildPath + env.value("PATH"));
+
+        qputenv("PATH", env.value("PATH").toLatin1());
+
+        m_process = new QProcess(this);
+        m_process->setProcessEnvironment(env);
+
+        connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
+                this, SLOT(replayFinished()));
+        connect(m_process, SIGNAL(error(QProcess::ProcessError)),
+                this, SLOT(replayError(QProcess::ProcessError)));
+    }
+
+    QStringList arguments;
+
+    if (m_captureState) {
+        arguments << QLatin1String("-D");
+        arguments << QString::number(m_captureCall);
+    } else {
+        if (m_benchmarking) {
+            arguments << QLatin1String("-b");
+        }
+        if (m_doubleBuffered) {
+            arguments << QLatin1String("-db");
+        }
+    }
+
+    arguments << m_fileName;
+
+    m_process->start(QLatin1String("glretrace"), arguments);
+}
+
+void Retracer::terminate()
+{
+    if (m_process) {
+        m_process->terminate();
+    }
+}
+
+void Retracer::setCaptureAtCallNumber(qlonglong num)
+{
+    m_captureCall = num;
+}
+
+qlonglong Retracer::captureAtCallNumber() const
+{
+    return m_captureCall;
+}
+
+bool Retracer::captureState() const
+{
+    return m_captureState;
+}
+
+void Retracer::setCaptureState(bool enable)
+{
+    m_captureState = enable;
+}
+
+void Retracer::replayFinished()
+{
+    QByteArray output = m_process->readAllStandardOutput();
+
+#if 0
+    qDebug()<<"Process finished = ";
+    qDebug()<<"\terr = "<<m_process->readAllStandardError();
+    qDebug()<<"\tout = "<<output;
+#endif
+    emit finished(output);
+}
+
+void Retracer::replayError(QProcess::ProcessError err)
+{
+    qDebug()<<"Process error = "<<err;
+    qDebug()<<"\terr = "<<m_process->readAllStandardError();
+    qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
+
+    emit error(
+        tr("Couldn't execute the replay file '%1'").arg(m_fileName));
+}
+
+#include "retracer.moc"
diff --git a/gui/retracer.h b/gui/retracer.h
new file mode 100644 (file)
index 0000000..37502e4
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef RETRACER_H
+#define RETRACER_H
+
+#include <QObject>
+#include <QProcess>
+
+class Retracer : public QObject
+{
+    Q_OBJECT
+public:
+    Retracer(QObject *parent=0);
+
+    QString fileName() const;
+    void setFileName(const QString &name);
+
+    bool isBenchmarking() const;
+    void setBenchmarking(bool bench);
+
+    bool isDoubleBuffered() const;
+    void setDoubleBuffered(bool db);
+
+    void setCaptureAtCallNumber(qlonglong num);
+    qlonglong captureAtCallNumber() const;
+
+    bool captureState() const;
+    void setCaptureState(bool enable);
+
+public slots:
+    void start();
+    void terminate();
+
+signals:
+    void finished(const QByteArray &output);
+    void error(const QString &msg);
+
+private slots:
+    void replayFinished();
+    void replayError(QProcess::ProcessError err);
+private:
+    QString m_fileName;
+    bool m_benchmarking;
+    bool m_doubleBuffered;
+    bool m_captureState;
+    qlonglong m_captureCall;
+
+    QProcess *m_process;
+};
+
+#endif
diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp
new file mode 100644 (file)
index 0000000..eab63dd
--- /dev/null
@@ -0,0 +1,37 @@
+#include "settingsdialog.h"
+
+SettingsDialog::SettingsDialog(QWidget *parent)
+    : QDialog(parent)
+{
+    setupUi(this);
+}
+
+void SettingsDialog::accept()
+{
+    m_filterOptions = ApiTraceFilter::NullFilter;
+    if (extensionsBox->isChecked())
+        m_filterOptions |= ApiTraceFilter::ExtensionsFilter;
+    if (functionsBox->isChecked())
+        m_filterOptions |= ApiTraceFilter::ResolutionsFilter;
+    if (errorsBox->isChecked())
+        m_filterOptions |= ApiTraceFilter::ErrorsQueryFilter;
+    if (statesBox->isChecked())
+        m_filterOptions |= ApiTraceFilter::ExtraStateFilter;
+    QDialog::accept();
+}
+
+void SettingsDialog::setFilterOptions(ApiTraceFilter::FilterOptions opts)
+{
+    m_filterOptions = opts;
+    extensionsBox->setChecked(m_filterOptions & ApiTraceFilter::ExtensionsFilter);
+    functionsBox->setChecked(m_filterOptions & ApiTraceFilter::ResolutionsFilter);
+    errorsBox->setChecked(m_filterOptions & ApiTraceFilter::ErrorsQueryFilter);
+    statesBox->setChecked(m_filterOptions & ApiTraceFilter::ExtraStateFilter);
+}
+
+ApiTraceFilter::FilterOptions SettingsDialog::filterOptions() const
+{
+    return m_filterOptions;
+}
+
+#include "settingsdialog.moc"
diff --git a/gui/settingsdialog.h b/gui/settingsdialog.h
new file mode 100644 (file)
index 0000000..6c82b40
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "apitracefilter.h"
+#include "ui_settings.h"
+#include <QDialog>
+
+
+class SettingsDialog : public QDialog, public Ui_Settings
+{
+    Q_OBJECT
+public:
+    SettingsDialog(QWidget *parent = 0);
+    void accept();
+
+    void setFilterOptions(ApiTraceFilter::FilterOptions opts);
+    ApiTraceFilter::FilterOptions filterOptions() const;
+
+private:
+    ApiTraceFilter::FilterOptions m_filterOptions;
+};
+
+#endif
index d4bea826cf4fbc6bad3ddd6dc4a505f92c3cf6ef..7d39a16820bc72ccab7edc733b5d74dc3bce3837 100644 (file)
@@ -6,13 +6,22 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>760</width>
-    <height>422</height>
+    <width>787</width>
+    <height>758</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>ApiTrace</string>
   </property>
+  <property name="documentMode">
+   <bool>false</bool>
+  </property>
+  <property name="dockNestingEnabled">
+   <bool>false</bool>
+  </property>
+  <property name="dockOptions">
+   <set>QMainWindow::AnimatedDocks|QMainWindow::ForceTabbedDocks</set>
+  </property>
   <widget class="QWidget" name="centralwidget">
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
@@ -35,7 +44,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>760</width>
+     <width>787</width>
      <height>21</height>
     </rect>
    </property>
@@ -54,6 +63,8 @@
     <addaction name="actionReplay"/>
     <addaction name="actionStop"/>
     <addaction name="actionLookupState"/>
+    <addaction name="separator"/>
+    <addaction name="actionOptions"/>
    </widget>
    <addaction name="menuFile"/>
    <addaction name="menu_Trace"/>
    </widget>
   </widget>
   <widget class="QDockWidget" name="stateDock">
+   <property name="features">
+    <set>QDockWidget::AllDockWidgetFeatures</set>
+   </property>
    <property name="windowTitle">
     <string>Current State</string>
    </property>
     </layout>
    </widget>
   </widget>
+  <widget class="QDockWidget" name="vertexDataDock">
+   <property name="allowedAreas">
+    <set>Qt::AllDockWidgetAreas</set>
+   </property>
+   <property name="windowTitle">
+    <string>Vertex Data</string>
+   </property>
+   <attribute name="dockWidgetArea">
+    <number>2</number>
+   </attribute>
+   <widget class="QWidget" name="dockWidgetContents_3">
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <layout class="QFormLayout" name="formLayout">
+       <property name="fieldGrowthPolicy">
+        <enum>QFormLayout::ExpandingFieldsGrow</enum>
+       </property>
+       <item row="0" column="0">
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Type</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1">
+        <widget class="QComboBox" name="vertexTypeCB">
+         <property name="currentIndex">
+          <number>6</number>
+         </property>
+         <item>
+          <property name="text">
+           <string>GL_BYTE</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_UNSIGNED_BYTE</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_SHORT</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_UNSIGNED_SHORT</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_INT</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_UNSIGNED_INT</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_FLOAT</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>GL_DOUBLE</string>
+          </property>
+         </item>
+        </widget>
+       </item>
+       <item row="1" column="0">
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Stride</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QSpinBox" name="vertexStrideSB">
+         <property name="maximum">
+          <number>1000</number>
+         </property>
+         <property name="value">
+          <number>8</number>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="0">
+        <widget class="QLabel" name="label_4">
+         <property name="text">
+          <string>Components</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="1">
+        <widget class="QSpinBox" name="vertexComponentsSB">
+         <property name="minimum">
+          <number>1</number>
+         </property>
+         <property name="maximum">
+          <number>256</number>
+         </property>
+         <property name="value">
+          <number>4</number>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="0">
+        <widget class="QLabel" name="label_3">
+         <property name="text">
+          <string>Starting Offset</string>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="1">
+        <widget class="QSpinBox" name="startingOffsetSB"/>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_3">
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="vertexInterpretButton">
+         <property name="text">
+          <string>Interpret</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QListWidget" name="vertexDataListWidget"/>
+     </item>
+    </layout>
+   </widget>
+  </widget>
   <action name="actionExit">
    <property name="text">
     <string>Exit</string>
     <string>Lookup State</string>
    </property>
   </action>
+  <action name="actionOptions">
+   <property name="text">
+    <string>Options</string>
+   </property>
+  </action>
+  <zorder>stateDock</zorder>
+  <zorder>vertexDataDock</zorder>
  </widget>
  <customwidgets>
   <customwidget>
diff --git a/gui/ui/retracerdialog.ui b/gui/ui/retracerdialog.ui
new file mode 100644 (file)
index 0000000..31fef7f
--- /dev/null
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RetracerDialog</class>
+ <widget class="QDialog" name="RetracerDialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>286</width>
+    <height>94</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Retracer Configuration</string>
+  </property>
+  <property name="whatsThis">
+   <string>Allows setting options on the retracing process.</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="doubleBufferingCB">
+       <property name="text">
+        <string>Use double buffering</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_4">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>48</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>68</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="benchmarkCB">
+       <property name="text">
+        <string>Benchmark</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_3">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>78</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>RetracerDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>RetracerDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/gui/ui/settings.ui b/gui/ui/settings.ui
new file mode 100644 (file)
index 0000000..1e84070
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Settings</class>
+ <widget class="QDialog" name="Settings">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>316</width>
+    <height>128</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>QApiTrace Settings</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Filtered Events</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="extensionsBox">
+        <property name="text">
+         <string>Extension queries</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QCheckBox" name="functionsBox">
+        <property name="text">
+         <string>Function resolution</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QCheckBox" name="errorsBox">
+        <property name="text">
+         <string>Error queries</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QCheckBox" name="statesBox">
+        <property name="text">
+         <string>Extra state queries</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Settings</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Settings</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/gui/vertexdatainterpreter.cpp b/gui/vertexdatainterpreter.cpp
new file mode 100644 (file)
index 0000000..c5cdd45
--- /dev/null
@@ -0,0 +1,238 @@
+#include "vertexdatainterpreter.h"
+
+#include <QListWidget>
+#include <QStringList>
+
+#include <QDebug>
+
+#include <GL/gl.h>
+
+#include <qmath.h>
+
+static int
+sizeForType(int glType)
+{
+    switch(glType) {
+    case GL_FLOAT:
+        return sizeof(GLfloat);
+    case GL_UNSIGNED_BYTE:
+        return sizeof(GLubyte);
+    case GL_BYTE:
+        return sizeof(GLbyte);
+    case GL_SHORT:
+        return sizeof(GLshort);
+    case GL_UNSIGNED_SHORT:
+        return sizeof(GLushort);
+    case GL_INT:
+        return sizeof(GLint);
+    case GL_UNSIGNED_INT:
+        return sizeof(GLuint);
+    case GL_DOUBLE:
+        return sizeof(GLdouble);
+    default:
+        return sizeof(GLint);
+    }
+}
+
+template <typename T>
+static QStringList
+convertData(const QByteArray &dataArray,
+            int type,
+            int stride,
+            int numComponents,
+            int startingOffset)
+{
+    QStringList strings;
+
+    int dataSize = dataArray.size() - startingOffset;
+    const char *data = dataArray.constData() + startingOffset;
+    int typeSize = sizeForType(type);
+    int elementSize = numComponents * typeSize;
+
+    if (!stride)
+        stride = elementSize;
+
+    int numElements = dataSize / stride;
+
+    if ((numElements % numComponents) != 0) {
+        int temp = qFloor(dataSize / (float)stride);
+        int fullElemSize = temp * stride;
+        if (fullElemSize + numComponents * typeSize <= dataSize) {
+            /* num full elements plus the part of the buffer in which we fit */
+            numElements = temp + 1;
+        } else {
+            numElements = temp;
+        }
+    }
+
+#if 0
+    qDebug() << "numElements = "<<numElements;
+    qDebug() << "elementSize = "<<elementSize;
+    qDebug() << "stride = "<<stride;
+    qDebug() << "numComponents = "<<numComponents;
+    qDebug() << "typeSize = "<<typeSize;
+#endif
+
+
+    for (int i = 0; i < numElements; ++i) {
+        QString vectorString = QString::fromLatin1("%1) [").arg(i);
+        for (int j = 0; j < numComponents; ++j) {
+            int offset = i*stride + j*typeSize;
+            const T *elementPtr =
+                (const T*)(data + offset);
+            T elem = *elementPtr;
+            vectorString += QString::number(elem);
+            if ((j + 1) < numComponents)
+                vectorString += QLatin1String(", ");
+        }
+        vectorString += "]";
+        strings += vectorString;
+    }
+
+    return strings;
+}
+
+
+VertexDataInterpreter::VertexDataInterpreter(QObject *parent)
+    : QObject(parent),
+      m_listWidget(0),
+      m_type(GL_FLOAT),
+      m_stride(16),
+      m_components(4),
+      m_startingOffset(0)
+{
+}
+
+void VertexDataInterpreter::setData(const QByteArray &data)
+{
+    m_data = data;
+    if (m_listWidget)
+        m_listWidget->clear();
+}
+
+QByteArray VertexDataInterpreter::data() const
+{
+    return m_data;
+}
+
+void VertexDataInterpreter::setType(int type)
+{
+    m_type = type;
+}
+
+int VertexDataInterpreter::type() const
+{
+    return m_type;
+}
+
+void VertexDataInterpreter::setStride(int stride)
+{
+    m_stride = stride;
+}
+
+int VertexDataInterpreter::stride() const
+{
+    return m_stride;
+}
+
+void VertexDataInterpreter::setComponents(int num)
+{
+    m_components = num;
+}
+
+int VertexDataInterpreter::components() const
+{
+    return m_components;
+}
+
+void VertexDataInterpreter::setListWidget(QListWidget *listWidget)
+{
+    m_listWidget = listWidget;
+}
+
+void VertexDataInterpreter::interpretData()
+{
+    if (!m_listWidget)
+        return;
+
+    m_listWidget->clear();
+
+    if (m_data.isEmpty() || !m_components)
+        return;
+
+    QStringList lst;
+    switch(m_type) {
+    case GL_FLOAT:
+        lst = convertData<float>(m_data, m_type, m_stride, m_components,
+                                 m_startingOffset);
+        break;
+    case GL_UNSIGNED_BYTE:
+        lst = convertData<quint8>(m_data, m_type, m_stride, m_components,
+                                  m_startingOffset);
+        break;
+    case GL_BYTE:
+        lst = convertData<qint8>(m_data, m_type, m_stride, m_components,
+                                 m_startingOffset);
+        break;
+    case GL_SHORT:
+        lst = convertData<qint16>(m_data, m_type, m_stride, m_components,
+                                  m_startingOffset);
+        break;
+    case GL_UNSIGNED_SHORT:
+        lst = convertData<quint16>(m_data, m_type, m_stride, m_components,
+                                   m_startingOffset);
+        break;
+    case GL_INT:
+        lst = convertData<unsigned int>(m_data, m_type, m_stride, m_components,
+                                        m_startingOffset);
+        break;
+    case GL_UNSIGNED_INT:
+        lst = convertData<int>(m_data, m_type, m_stride, m_components,
+                               m_startingOffset);
+        break;
+    case GL_DOUBLE:
+        lst = convertData<double>(m_data, m_type, m_stride, m_components,
+                                  m_startingOffset);
+        break;
+    default:
+        qDebug()<<"unkown gltype = "<<m_type;
+    }
+    //qDebug()<<"list is "<<lst;
+    m_listWidget->addItems(lst);
+}
+
+
+void VertexDataInterpreter::setTypeFromString(const QString &str)
+{
+    if (str == QLatin1String("GL_FLOAT")) {
+        setType(GL_FLOAT);
+    } else if (str == QLatin1String("GL_INT")) {
+        setType(GL_INT);
+    } else if (str == QLatin1String("GL_UNSIGNED_INT")) {
+        setType(GL_UNSIGNED_INT);
+    } else if (str == QLatin1String("GL_SHORT")) {
+        setType(GL_SHORT);
+    } else if (str == QLatin1String("GL_UNSIGNED_SHORT")) {
+        setType(GL_UNSIGNED_SHORT);
+    } else if (str == QLatin1String("GL_BYTE")) {
+        setType(GL_BYTE);
+    } else if (str == QLatin1String("GL_UNSIGNED_BYTE")) {
+        setType(GL_UNSIGNED_BYTE);
+    } else if (str == QLatin1String("GL_DOUBLE")) {
+        setType(GL_DOUBLE);
+    } else {
+        qDebug()<<"unknown vertex data type";
+    }
+}
+
+int VertexDataInterpreter::startingOffset() const
+{
+    return m_startingOffset;
+}
+
+void VertexDataInterpreter::setStartingOffset(int offset)
+{
+    m_startingOffset = offset;
+}
+
+#include "vertexdatainterpreter.moc"
diff --git a/gui/vertexdatainterpreter.h b/gui/vertexdatainterpreter.h
new file mode 100644 (file)
index 0000000..7a46e3e
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef VERTEXDATAINTERPRETER_H
+#define VERTEXDATAINTERPRETER_H
+
+#include <QObject>
+
+class QListWidget;
+
+class VertexDataInterpreter : public QObject
+{
+    Q_OBJECT
+public:
+    VertexDataInterpreter(QObject *parent=0);
+
+    QByteArray data() const;
+
+    int type() const;
+    int stride() const;
+    int components() const;
+    int startingOffset() const;
+
+    void setListWidget(QListWidget *listWidget);
+
+public slots:
+    void interpretData();
+
+    void setData(const QByteArray &data);
+    void setTypeFromString(const QString &str);
+    void setStride(int stride);
+    void setComponents(int num);
+    void setType(int type);
+    void setStartingOffset(int offset);
+
+private:
+    QListWidget *m_listWidget;
+    QByteArray m_data;
+    int m_type;
+    int m_stride;
+    int m_components;
+    int m_startingOffset;
+};
+
+#endif
index 0bfbabf1175000d8962cc22c1869a318c7c69163..ee2a9e03b76286646e5dbdabcb0e388890951ac2 100644 (file)
--- a/json.hpp
+++ b/json.hpp
 
 #include <assert.h>
 #include <stddef.h>
+#include <wchar.h>
 
 #include <ostream>
+#include <iomanip>
 
 
 class JSONWriter
@@ -43,6 +45,7 @@ private:
 
     int level;
     bool value;
+    char space;
 
     void newline(void) {
         os << "\n";
@@ -53,38 +56,147 @@ private:
     void separator(void) {
         if (value) {
             os << ",";
+            switch (space) {
+            case '\0':
+                break;
+            case '\n':
+                newline();
+                break;
+            default:
+                os << space;
+                break;
+            }
+        } else {
+            if (space == '\n') {
+                newline();
+            }
         }
     }
 
-    void escapeString(const char *str) {
-        const unsigned char *p = (const unsigned char *)str;
+    void escapeAsciiString(const char *str) {
         os << "\"";
+
+        const unsigned char *src = (const unsigned char *)str;
         unsigned char c;
-        while ((c = *p++) != 0) {
-            if (c == '\"')
-                os << "\\\"";
-            else if (c == '\\')
-                os << "\\\\";
-            else if (c >= 0x20 && c <= 0x7e)
-                os << c;
-            else if (c == '\t')
-                os << "\\t";
-            else if (c == '\r')
-                os << "\\r";
-            else if (c == '\n')
-                os << "&#10;";
-            else {
-                unsigned octal0 = c & 0x7;
-                unsigned octal1 = (c >> 3) & 0x7;
-                unsigned octal2 = (c >> 3) & 0x7;
-                os << "\\";
-                if (octal2)
-                    os << octal2;
-                if (octal1)
-                    os << octal1;
-                os << octal0;
+        while ((c = *src++)) {
+            if ((c == '\"') ||
+                (c == '\\')) {
+                // escape character
+                os << '\\' << (unsigned char)c;
+            } else if ((c >= 0x20 && c <= 0x7e) ||
+                        c == '\t' ||
+                        c == '\r' ||
+                        c == '\n') {
+                // pass-through character
+                os << (unsigned char)c;
+            } else {
+                assert(0);
+                os << "?";
+            }
+        }
+
+        os << "\"";
+    }
+
+    void escapeUnicodeString(const char *str) {
+        os << "\"";
+
+        const char *locale = setlocale(LC_CTYPE, "");
+        const char *src = str;
+        mbstate_t state;
+
+        memset(&state, 0, sizeof state);
+
+        do {
+            // Convert characters one at a time in order to recover from
+            // conversion errors
+            wchar_t c;
+            size_t written = mbsrtowcs(&c, &src, 1, &state);
+            if (written == 0) {
+                // completed
+                break;
+            } if (written == (size_t)-1) {
+                // conversion error -- skip 
+                os << "?";
+                do {
+                    ++src;
+                } while (*src & 0x80);
+            } else if ((c == '\"') ||
+                       (c == '\\')) {
+                // escape character
+                os << '\\' << (unsigned char)c;
+            } else if ((c >= 0x20 && c <= 0x7e) ||
+                        c == '\t' ||
+                        c == '\r' ||
+                        c == '\n') {
+                // pass-through character
+                os << (unsigned char)c;
+            } else {
+                // unicode
+                os << "\\u" << std::setfill('0') << std::hex << std::setw(4) << (unsigned)c;
+                os << std::dec;
+            }
+        } while (src);
+
+        setlocale(LC_CTYPE, locale);
+
+        os << "\"";
+    }
+
+    void encodeBase64String(const unsigned char *bytes, size_t size) {
+        const char *table64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+        unsigned char c0, c1, c2, c3;
+        char buf[4];
+        unsigned written;
+
+        os << "\"";
+
+        written = 0;
+        while (size >= 3) {
+            c0 = bytes[0] >> 2;
+            c1 = ((bytes[0] & 0x03) << 4) | ((bytes[1] & 0xf0) >> 4);
+            c2 = ((bytes[1] & 0x0f) << 2) | ((bytes[2] & 0xc0) >> 6);
+            c3 = bytes[2] & 0x3f;
+
+            buf[0] = table64[c0];
+            buf[1] = table64[c1];
+            buf[2] = table64[c2];
+            buf[3] = table64[c3];
+
+            os.write(buf, 4);
+
+            bytes += 3;
+            size -= 3;
+            ++written;
+
+            if (written >= 76/4 && size) {
+                os << "\n";
+                written = 0;
+            }
+        }
+
+        if (size > 0) {
+            c0 = bytes[0] >> 2;
+            c1 = ((bytes[0] & 0x03) << 4);
+            buf[2] = '=';
+            buf[3] = '=';
+            
+            if (size > 1) {
+                c1 |= ((bytes[1] & 0xf0) >> 4);
+                c2 = ((bytes[1] & 0x0f) << 2);
+                if (size > 2) {
+                    c2 |= ((bytes[2] & 0xc0) >> 6);
+                    c3 = bytes[2] & 0x3f;
+                    buf[3] = table64[c3];
+                }
+                buf[2] = table64[c2];
             }
+            buf[1] = table64[c1];
+            buf[0] = table64[c0];
+
+            os.write(buf, 4);
         }
+
         os << "\"";
     }
 
@@ -92,7 +204,8 @@ public:
     JSONWriter(std::ostream &_os) : 
         os(_os), 
         level(0),
-        value(false)
+        value(false),
+        space(0)
     {
         beginObject();
     }
@@ -103,6 +216,7 @@ public:
     }
 
     inline void beginObject() {
+        separator();
         os << "{";
         ++level;
         value = false;
@@ -114,12 +228,14 @@ public:
             newline();
         os << "}";
         value = true;
+        space = '\n';
     }
 
     inline void beginMember(const char * name) {
+        space = 0;
         separator();
         newline();
-        escapeString(name);
+        escapeAsciiString(name);
         os << ": ";
         value = false;
     }
@@ -127,42 +243,80 @@ public:
     inline void endMember(void) {
         assert(value);
         value = true;
+        space = 0;
     }
 
     inline void beginArray() {
         separator();
         os << "[";
+        ++level;
         value = false;
+        space = 0;
     }
 
     inline void endArray(void) {
+        --level;
+        if (space == '\n') {
+            newline();
+        }
         os << "]";
         value = true;
+        space = '\n';
     }
 
     inline void writeString(const char *s) {
         separator();
-        escapeString(s);
+        escapeUnicodeString(s);
+        value = true;
+        space = ' ';
+    }
+
+    inline void writeBase64(const void *bytes, size_t size) {
+        separator();
+        encodeBase64String((const unsigned char *)bytes, size);
         value = true;
+        space = ' ';
     }
 
     inline void writeNull(void) {
         separator();
         os << "null";
         value = true;
+        space = ' ';
     }
 
     inline void writeBool(bool b) {
         separator();
         os << (b ? "true" : "false");
         value = true;
+        space = ' ';
     }
 
     template<class T>
-    void writeNumber(T n) {
+    inline void writeNumber(T n) {
         separator();
-        os << n;
+        os << std::dec << n;
         value = true;
+        space = ' ';
+    }
+    
+    inline void writeStringMember(const char *name, const char *s) {
+        beginMember(name);
+        writeString(s);
+        endMember();
+    }
+
+    inline void writeBoolMember(const char *name, bool b) {
+        beginMember(name);
+        writeBool(b);
+        endMember();
+    }
+
+    template<class T>
+    inline void writeNumberMember(const char *name, T n) {
+        beginMember(name);
+        writeNumber(n);
+        endMember();
     }
 };
 
index 7f2ef440f701bcbe00040a47abe4d2ead9f8eead..c74aaaeee998d3c6afdf51543cd1ab8652e0886f 100644 (file)
@@ -77,7 +77,7 @@ Pointer::operator bool(void) const { return value != 0; }
 
 
 // signed integer cast
-Value  ::operator signed long long (void) const { assert(0); return NULL; }
+Value  ::operator signed long long (void) const { assert(0); return 0; }
 Null   ::operator signed long long (void) const { return 0; }
 Bool   ::operator signed long long (void) const { return static_cast<signed long long>(value); }
 SInt   ::operator signed long long (void) const { return value; }
@@ -87,7 +87,7 @@ Enum   ::operator signed long long (void) const { return static_cast<signed long
 
 
 // unsigned integer cast
-Value  ::operator unsigned long long (void) const { assert(0); return NULL; }
+Value  ::operator unsigned long long (void) const { assert(0); return 0; }
 Null   ::operator unsigned long long (void) const { return 0; }
 Bool   ::operator unsigned long long (void) const { return static_cast<unsigned long long>(value); }
 SInt   ::operator unsigned long long (void) const { assert(value >= 0); return static_cast<signed long long>(value); }
@@ -97,7 +97,7 @@ Enum   ::operator unsigned long long (void) const { return static_cast<unsigned
 
 
 // floating point cast
-Value  ::operator double (void) const { assert(0); return NULL; }
+Value  ::operator double (void) const { assert(0); return 0; }
 Null   ::operator double (void) const { return 0; }
 Bool   ::operator double (void) const { return static_cast<double>(value); }
 SInt   ::operator double (void) const { return static_cast<double>(value); }
@@ -196,7 +196,35 @@ public:
     }
 
     void visit(String *node) {
-        os << literal << '"' << node->value << '"' << normal;
+        os << literal << "\"";
+        for (std::string::const_iterator it = node->value.begin(); it != node->value.end(); ++it) {
+            unsigned char c = (unsigned char) *it;
+            if (c == '\"')
+                os << "\\\"";
+            else if (c == '\\')
+                os << "\\\\";
+            else if (c >= 0x20 && c <= 0x7e)
+                os << c;
+            else if (c == '\t') {
+                os << "\t";
+            } else if (c == '\r') {
+                // Ignore carriage-return
+            } else if (c == '\n') {
+                // Reset formatting so that it looks correct with 'less -R'
+                os << normal << '\n' << literal;
+            } else {
+                unsigned octal0 = c & 0x7;
+                unsigned octal1 = (c >> 3) & 0x7;
+                unsigned octal2 = (c >> 3) & 0x7;
+                os << "\\";
+                if (octal2)
+                    os << octal2;
+                if (octal1)
+                    os << octal1;
+                os << octal0;
+            }
+        }
+        os << "\"" << normal;
     }
 
     void visit(Enum *node) {