diff --git a/opengl/libs/Android.mk b/opengl/libs/Android.mk
index c8041fc..f1afbb6 100644
--- a/opengl/libs/Android.mk
+++ b/opengl/libs/Android.mk
@@ -13,8 +13,8 @@
 	EGL/hooks.cpp 	       \
 	EGL/Loader.cpp 	       \
 #
-
-LOCAL_SHARED_LIBRARIES += libcutils libutils
+LOCAL_STATIC_LIBRARIES += libGLESv2_dbg libprotobuf-cpp-2.3.0-lite
+LOCAL_SHARED_LIBRARIES += libcutils libutils libstlport
 LOCAL_LDLIBS := -lpthread -ldl
 LOCAL_MODULE:= libEGL
 
@@ -164,3 +164,6 @@
 LOCAL_MODULE:= libETC1
 
 include $(BUILD_SHARED_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 747c829..55b5436 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -114,6 +114,8 @@
 
 Loader::~Loader()
 {
+    extern void StopDebugServer();
+    StopDebugServer();
 }
 
 const char* Loader::getTag(int dpy, int impl)
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index 3d5a4d1..e427504 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -296,9 +296,9 @@
 
 // ----------------------------------------------------------------------------
 
-static int gEGLTraceLevel;
+static int gEGLTraceLevel, gEGLDebugLevel;
 static int gEGLApplicationTraceLevel;
-extern EGLAPI gl_hooks_t gHooksTrace;
+extern EGLAPI gl_hooks_t gHooksTrace, gHooksDebug;
 
 static inline void setGlTraceThreadSpecific(gl_hooks_t const *value) {
     pthread_setspecific(gGLTraceKey, value);
@@ -314,12 +314,37 @@
     int propertyLevel = atoi(value);
     int applicationLevel = gEGLApplicationTraceLevel;
     gEGLTraceLevel = propertyLevel > applicationLevel ? propertyLevel : applicationLevel;
+    
+    property_get("debug.egl.debug_proc", value, "");
+    long pid = getpid();
+    char procPath[128] = {};
+    sprintf(procPath, "/proc/%ld/cmdline", pid);
+    FILE * file = fopen(procPath, "r");
+    if (file)
+    {
+        char cmdline[256] = {};
+        if (fgets(cmdline, sizeof(cmdline) - 1, file))
+        {
+            LOGD("\n*\n*\n* initEglTraceLevel cmdline='%s' \n*\n*", cmdline);
+            if (!strcmp(value, cmdline))
+                gEGLDebugLevel = 1;
+        }    
+        fclose(file);
+    }
+    
+    extern void StartDebugServer();
+    if (gEGLDebugLevel > 0)
+        StartDebugServer();
 }
 
 static void setGLHooksThreadSpecific(gl_hooks_t const *value) {
     if (gEGLTraceLevel > 0) {
         setGlTraceThreadSpecific(value);
         setGlThreadSpecific(&gHooksTrace);
+    } else if (gEGLDebugLevel > 0) {
+        setGlTraceThreadSpecific(value);
+        setGlThreadSpecific(&gHooksDebug);
+        LOGD("\n* setGLHooksThreadSpecific gHooksDebug");
     } else {
         setGlThreadSpecific(value);
     }
@@ -1597,7 +1622,7 @@
                     cnx->hooks[GLESv1_INDEX]->ext.extensions[slot] =
                     cnx->hooks[GLESv2_INDEX]->ext.extensions[slot] =
 #if EGL_TRACE
-                    gHooksTrace.ext.extensions[slot] =
+                    gHooksDebug.ext.extensions[slot] = gHooksTrace.ext.extensions[slot] =
 #endif
                             cnx->egl.eglGetProcAddress(procname);
                 }
diff --git a/opengl/libs/EGL/trace.cpp b/opengl/libs/EGL/trace.cpp
index d3e96ba..3a1ae21 100644
--- a/opengl/libs/EGL/trace.cpp
+++ b/opengl/libs/EGL/trace.cpp
@@ -325,7 +325,7 @@
 
 #define TRACE_GL(_type, _api, _args, _argList, ...)                       \
 static _type Tracing_ ## _api _args {                                     \
-    TraceGL(#_api, __VA_ARGS__);                                          \
+    TraceGL(#_api, __VA_ARGS__);                                        \
     gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
     return _c->_api _argList;                                             \
 }
@@ -333,11 +333,11 @@
 extern "C" {
 #include "../trace.in"
 }
+
 #undef TRACE_GL_VOID
 #undef TRACE_GL
 
 #define GL_ENTRY(_r, _api, ...) Tracing_ ## _api,
-
 EGLAPI gl_hooks_t gHooksTrace = {
     {
         #include "entries.in"
@@ -348,6 +348,48 @@
 };
 #undef GL_ENTRY
 
+
+#undef TRACE_GL_VOID
+#undef TRACE_GL
+
+// define the ES 1.0 Debug_gl* functions as Tracing_gl functions
+#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
+static void Debug_ ## _api _args {                                      \
+    TraceGL(#_api, __VA_ARGS__);                                          \
+    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
+    _c->_api _argList;                                                    \
+}
+
+#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
+static _type Debug_ ## _api _args {                                     \
+    TraceGL(#_api, __VA_ARGS__);                                        \
+    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
+    return _c->_api _argList;                                             \
+}
+
+extern "C" {
+#include "../debug.in"
+}
+
+#undef TRACE_GL_VOID
+#undef TRACE_GL
+
+// declare all Debug_gl* functions
+#define GL_ENTRY(_r, _api, ...) _r Debug_##_api ( __VA_ARGS__ );
+#include "../GLES2_dbg/include/glesv2_dbg.h"
+#undef GL_ENTRY
+
+#define GL_ENTRY(_r, _api, ...) Debug_ ## _api,
+EGLAPI gl_hooks_t gHooksDebug = {
+    {
+        #include "entries.in"
+    },
+    {
+        {0}
+    }
+};
+#undef GL_ENTRY
+
 // ----------------------------------------------------------------------------
 }; // namespace android
 // ----------------------------------------------------------------------------
diff --git a/opengl/libs/GLES2_dbg/Android.mk b/opengl/libs/GLES2_dbg/Android.mk
new file mode 100644
index 0000000..c919886
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/Android.mk
@@ -0,0 +1,46 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+    src/DebuggerMessage.pb.cpp \
+    src/api.cpp \
+    src/server.cpp \
+    src/shader.cpp \
+    src/texture.cpp
+
+LOCAL_C_INCLUDES :=	\
+    $(LOCAL_PATH) \
+    $(LOCAL_PATH)/../ \
+    external/stlport/stlport \
+    external/protobuf/src \
+    bionic
+
+LOCAL_SHARED_LIBRARIES := libstlport libcutils libutils
+LOCAL_LDLIBS := -lpthread
+
+#LOCAL_CFLAGS += -O0 -g -DDEBUG -UNDEBUG
+LOCAL_CFLAGS := -DGOOGLE_PROTOBUF_NO_RTTI
+
+ifeq ($(TARGET_ARCH),arm)
+	LOCAL_CFLAGS += -fstrict-aliasing
+endif
+
+ifeq ($(ARCH_ARM_HAVE_TLS_REGISTER),true)
+    LOCAL_CFLAGS += -DHAVE_ARM_TLS_REGISTER
+endif
+
+ifneq ($(TARGET_SIMULATOR),true)
+    # we need to access the private Bionic header <bionic_tls.h>
+    # on ARM platforms, we need to mirror the ARCH_ARM_HAVE_TLS_REGISTER
+    # behavior from the bionic Android.mk file
+    ifeq ($(TARGET_ARCH)-$(ARCH_ARM_HAVE_TLS_REGISTER),arm-true)
+        LOCAL_CFLAGS += -DHAVE_ARM_TLS_REGISTER
+    endif
+    LOCAL_C_INCLUDES += bionic/libc/private
+endif
+
+LOCAL_MODULE:= libGLESv2_dbg
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/opengl/libs/GLES2_dbg/generate_DebuggerMessage_proto.py b/opengl/libs/GLES2_dbg/generate_DebuggerMessage_proto.py
new file mode 100755
index 0000000..a803fae
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_DebuggerMessage_proto.py
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+
+def generate_DebuggerMessage(output,lines,i):
+	for line in lines:
+		if line.find("API_ENTRY(") >= 0:
+			line = line[line.find("(") + 1: line.find(")")] #extract GL function name
+			output.write("\t\t%s = %d;\n" % (line, i))
+			i += 1
+	return i
+
+
+if __name__ == "__main__":
+	output = open("DebuggerMessage.proto",'w')
+	output.write( """// do not edit; auto generated by generate_DebuggerMessage_proto.py
+package GLESv2Debugger;
+
+option optimize_for = LITE_RUNTIME;
+
+message Message
+{
+\trequired int32 context_id = 1; // GL context id
+\tenum Function
+\t{
+""")
+
+	i = 0;
+	
+	lines = open("gl2_api.in").readlines()
+	i = generate_DebuggerMessage(output, lines, i)
+	output.write("\t\t// end of GL functions\n")
+	
+	#lines = open("gl2ext_api.in").readlines()
+	#i = generate_DebuggerMessage(output, lines, i)
+	#output.write("\t\t// end of GL EXT functions\n")
+	
+	output.write("\t\tACK = %d;\n" % (i))
+	i += 1
+	
+	output.write("\t\tNEG = %d;\n" % (i))
+	i += 1
+	
+	output.write("\t\tCONTINUE = %d;\n" % (i))
+	i += 1
+	
+	output.write("\t\tSKIP = %d;\n" % (i))
+	i += 1
+	
+	output.write("""\t}
+\trequired Function function = 2 [default = NEG]; // type/function of message
+\trequired bool has_next_message = 3;
+\trequired bool expect_response = 4;
+\toptional int32 ret = 5; // return value from previous GL call
+\toptional int32 arg0 = 6; // args to GL call
+\toptional int32 arg1 = 7;
+\toptional int32 arg2 = 8;
+\toptional int32 arg3 = 9;
+\toptional int32 arg4 = 16;
+\toptional int32 arg5 = 17;
+\toptional int32 arg6 = 18;
+\toptional int32 arg7 = 19;
+\toptional int32 arg8 = 20;
+\toptional bytes data = 10; // variable length data used for GL call
+\toptional float time = 11; // timing of previous GL call (seconds)
+}
+""")
+
+	output.close()
+	
+	os.system("aprotoc --cpp_out=src --java_out=client/src DebuggerMessage.proto")
+	os.system(' mv -f "src/DebuggerMessage.pb.cc" "src/DebuggerMessage.pb.cpp" ')
diff --git a/opengl/libs/GLES2_dbg/generate_GLEnum_java.py b/opengl/libs/GLES2_dbg/generate_GLEnum_java.py
new file mode 100755
index 0000000..f927422
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_GLEnum_java.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+
+if __name__ == "__main__":
+	externs = []
+	lines = open("enums.in").readlines()
+	i = 0
+	print "// auto generated by generate_GLFunction_java.py"
+	print """package GLESv2Debugger;
+
+public enum GLEnum
+{"""
+	
+	index = 0
+	for line in lines:
+		value = line[line.find("(") + 1: line.find(",")]
+		name = line[line.find(",") + 1: line.find(")")]	
+		print "\t%s(%s)," % (name, value)
+
+	print """\t;
+
+\tpublic final int value;
+\tGLEnum(final int value)
+\t{
+\t\tthis.value = value;
+\t}
+
+\tprivate static final java.util.HashMap<Integer, GLEnum> reverseMap = new java.util.HashMap<Integer, GLEnum>();
+\tstatic 
+\t{
+\t\tfor (GLEnum e : GLEnum.values())
+\t\t\treverseMap.put(e.value, e);
+\t}
+
+\tpublic static GLEnum valueOf(final int value)
+\t{
+\t\treturn reverseMap.get(value);
+\t}
+}"""
+
+
diff --git a/opengl/libs/GLES2_dbg/generate_GLFunction_java.py b/opengl/libs/GLES2_dbg/generate_GLFunction_java.py
new file mode 100755
index 0000000..07bbf14
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_GLFunction_java.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+
+if __name__ == "__main__":
+	externs = []
+	lines = open("gl2_api.in").readlines()
+	i = 0
+	print "// auto generated by generate_GLFunction_java.py"
+	print """package GLESv2Debugger;
+
+public enum GLFunction
+{"""
+	
+	index = 0
+	for line in lines:
+		if line.find("API_ENTRY(") >= 0: # a function prototype
+			returnType = line[0: line.find(" API_ENTRY(")]
+			functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
+			print "\t%s(%d, DebuggerMessage.Message.Function.%s)," % (functionName, index, functionName)
+			index += 1
+	print """\t;
+
+\tpublic final int index;
+\tpublic final DebuggerMessage.Message.Function function;
+\tGLFunction(final int index, final DebuggerMessage.Message.Function function)
+\t{
+\t\tthis.index = index;
+\t\tthis.function = function;
+\t}
+}"""
+			
+
diff --git a/opengl/libs/GLES2_dbg/generate_MessageFormatter_java.py b/opengl/libs/GLES2_dbg/generate_MessageFormatter_java.py
new file mode 100755
index 0000000..81272e6
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_MessageFormatter_java.py
@@ -0,0 +1,239 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+
+def RemoveAnnotation(line):
+	if line.find(":") >= 0:
+		annotation = line[line.find(":"): line.find(" ", line.find(":"))]
+		return line.replace(annotation, "*")
+	else:
+		return line
+		
+if __name__ == "__main__":
+	externs = []
+	lines = open("gl2_api_annotated.in").readlines()
+	i = 0
+	print """// auto generated by generate_MessageFormatter_java.py"
+package GLESv2Debugger;
+
+public class MessageFormatter {
+
+\tstatic String FormatFloats(int count, byte [] data)
+\t{
+\t\tString ret = "[";
+\t\tfor (int i = 0; i < count; i++)
+\t\t{
+\t\t\tint bits = (data[i* 4 + 0] & 0xff) << 24;
+\t\t\tbits |= (data[i* 4 + 1] & 0xff) << 16;
+\t\t\tbits |= (data[i* 4 + 2] & 0xff) << 8;
+\t\t\tbits |= (data[i* 4 + 3] & 0xff) << 0;
+\t\t\tret += Float.intBitsToFloat(bits);
+\t\t\tif (i < count - 1)
+\t\t\t\tret += ", ";
+\t\t}
+\t\treturn ret + "]";
+\t}
+\t
+\tstatic String FormatInts(int count, byte [] data)
+\t{
+\t\tString ret = "[";
+\t\tfor (int i = 0; i < count; i++)
+\t\t{
+\t\t\tint bits = (data[i* 4 + 3] & 0xff) << 24;
+\t\t\tbits |= (data[i* 4 + 2] & 0xff) << 16;
+\t\t\tbits |= (data[i* 4 + 1] & 0xff) << 8;
+\t\t\tbits |= (data[i* 4 + 0] & 0xff) << 0;
+\t\t\tret += bits;
+\t\t\tif (i < count - 1)
+\t\t\t\tret += ", ";
+\t\t}
+\t\treturn ret + "]";
+\t}
+\t
+\tstatic String FormatUints(int count, byte [] data)
+\t{
+\t\tString ret = "[";
+\t\tfor (int i = 0; i < count; i++)
+\t\t{
+\t\t\tlong bits = (data[i* 4 + 3] & 0xff) << 24;
+\t\t\tbits |= (data[i* 4 + 2] & 0xff) << 16;
+\t\t\tbits |= (data[i* 4 + 1] & 0xff) << 8;
+\t\t\tbits |= (data[i* 4 + 0] & 0xff) << 0;
+\t\t\tret += bits;
+\t\t\tif (i < count - 1)
+\t\t\t\tret += ", ";
+\t\t}
+\t\treturn ret + "]";
+\t}
+\t
+\tstatic String FormatMatrix(int columns, int count, byte [] data)
+\t{
+\t\tString ret = "[";
+\t\tfor (int i = 0; i < count; i++)
+\t\t{
+\t\t\tint bits = (data[i* 4 + 0] & 0xff) << 24;
+\t\t\tbits |= (data[i* 4 + 1] & 0xff) << 16;
+\t\t\tbits |= (data[i* 4 + 2] & 0xff) << 8;
+\t\t\tbits |= (data[i* 4 + 3] & 0xff) << 0;
+\t\t\tret += Float.intBitsToFloat(bits);
+\t\t\tif (i % columns == columns - 1)
+\t\t\t\tret += '\\n';
+\t\t\telse if (i < count - 1)
+\t\t\t\tret += ", ";
+\t\t}
+\t\treturn ret + "]";
+\t}
+
+\tpublic static String Format(final DebuggerMessage.Message msg)
+\t{
+\t\tString str;
+\t\tswitch (msg.getFunction())
+\t\t{"""
+        	
+	for line in lines:
+		if line.find("API_ENTRY(") >= 0: # a function prototype
+			returnType = line[0: line.find(" API_ENTRY(")].replace("const ", "")
+			functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
+			parameterList = line[line.find(")(") + 2: line.find(") {")]
+			#	print "\t\tcase %s:" % (functionName)
+			#	print "\t\t\t//return MessageFormatterCustom.Format(msg);"
+			#	print "\t\t\tstr = msg.toString(); break;"
+			#	#extern = "%s Format_%s(%s);" % (returnType, functionName, parameterList)
+			#	extern = functionName
+			#	externs.append(extern)
+			#	continue
+			
+			parameters = parameterList.split(',')
+			paramIndex = 0
+			
+			formatString = "%s "
+			formatArgs = ""
+			if returnType != "void":
+				if returnType == "GLenum":
+					formatArgs += "GLEnum.valueOf(msg.getRet())"
+				elif returnType.find("*") >= 0:
+					formatArgs += '"0x" + Integer.toHexString(msg.getRet())'
+				else:
+					formatArgs += "msg.getRet()"
+			else:
+				formatArgs += '"void"'
+			
+			#formatString += "%s(" % (functionName)
+			formatString += "("
+			
+			if parameterList == "void":
+				parameters = []
+			
+			paramTypes = []
+			paramNames = []
+			paramAnnotations = []
+			
+			for parameter in parameters:
+				parameter = parameter.replace("const","")
+				parameter = parameter.strip()
+				paramType = parameter.split(' ')[0]
+				paramName = parameter.split(' ')[1]
+				annotation = ""
+				
+				formatString += paramName + "=%s"
+					
+				if parameter.find(":") >= 0:
+					assert paramIndex == len(parameters) - 1 # only last parameter should be annotated
+					inout = paramType.split(":")[2]
+					annotation = paramType.split(":")[1]
+					paramType = paramType.split(":")[0]
+					assert paramType.find("void") < 0
+					count = 1
+					countArg = ""
+					if annotation.find("*") >= 0:
+						count = int(annotation.split("*")[0])
+						countArg = annotation.split("*")[1]
+						assert countArg in paramNames
+					elif annotation in paramNames:
+						count = 1
+						countArg = annotation
+					elif annotation == "GLstring":
+						annotation = annotation
+					else:
+						count = int(annotation)
+					dataFormatter = ""
+					if paramType == "GLfloat":
+						dataFormatter = "FormatFloats"
+					elif paramType == "GLint":
+						dataFormatter = "FormatInts"
+					elif paramType == "GLuint":
+						dataFormatter = "FormatUints"
+					elif annotation == "GLstring":
+						assert paramType == "GLchar"
+					else:
+						assert 0
+					if functionName.find("Matrix") >= 0:
+						columns = int(functionName[functionName.find("fv") - 1: functionName.find("fv")])
+						assert columns * columns == count
+						assert countArg != ""
+						assert paramType == "GLfloat"
+						formatArgs += ", FormatMatrix(%d, %d * msg.getArg%d(), msg.getData().toByteArray())" % (columns, count, paramNames.index(countArg))
+					elif annotation == "GLstring":
+						formatArgs += ", msg.getData().toStringUtf8()"
+					elif countArg == "":
+						formatArgs += ", %s(%d, msg.getData().toByteArray())" % (dataFormatter, count)
+					else:
+						formatArgs += ", %s(%d * msg.getArg%d(), msg.getData().toByteArray())" % (dataFormatter, count, paramNames.index(countArg))
+				else:
+					#formatArgs += ', "%s"' % (paramName)
+					if paramType == "GLfloat" or paramType == "GLclampf":
+						formatArgs += ", Float.intBitsToFloat(msg.getArg%d())" % (paramIndex)
+					elif paramType == "GLenum": 
+						formatArgs += ", GLEnum.valueOf(msg.getArg%d())" % (paramIndex)
+					elif paramType.find("*") >= 0:
+						formatArgs += ', "0x" + Integer.toHexString(msg.getArg%d())' % (paramIndex)
+					else:
+						formatArgs += ", msg.getArg%d()" % (paramIndex)
+				if paramIndex < len(parameters) - 1:
+					formatString += ", "
+	 			paramTypes.append(paramType)
+				paramNames.append(paramName)
+				paramAnnotations.append(annotation)
+				paramIndex += 1  
+
+				
+	 		formatString += ")"
+	 		
+			print "\t\tcase %s:" % (functionName)
+			if line.find("*") >= 0 and (line.find("*") < line.find(":") or line.find("*") > line.rfind(":")):
+				sys.stderr.write(line)
+				print "\t\t\t// FIXME: this function uses pointers, debugger may send data in msg.data"
+			print '\t\t\tstr = String.format("%s", %s); break;' % (formatString, formatArgs)
+			
+
+	print """\t\tdefault:
+\t\t\tstr = msg.toString();
+\t\t}
+\t\treturn str;
+\t}
+}"""
+
+	print """/*
+package GLESv2Debugger;
+
+public class MessageFormatterCustom {
+
+\tpublic static String Format(final DebuggerMessage.Message msg) {
+\t\tString str;
+\t\tswitch (msg.getFunction()) {"""
+
+	for extern in externs:
+		print "\t\tcase %s" % (extern)
+		print "\t\t\t// TODO:"
+
+print """\t\tdefault:
+\t\t\tstr = msg.toString();
+\t\t}
+\t\treturn str;
+\t}
+}
+*/"""	
+		
+		
diff --git a/opengl/libs/GLES2_dbg/generate_api_cpp.py b/opengl/libs/GLES2_dbg/generate_api_cpp.py
new file mode 100755
index 0000000..7c0b39e
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_api_cpp.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+
+def RemoveAnnotation(line):
+	if line.find(":") >= 0:
+		annotation = line[line.find(":"): line.find(" ", line.find(":"))]
+		return line.replace(annotation, "*")
+	else:
+		return line
+	
+def generate_api(lines):
+	externs = []
+	i = 0
+	skipFunctions = ["glTexImage2D", "glTexSubImage2D", "glShaderSource"]
+	for line in lines:
+		if line.find("API_ENTRY(") >= 0: # a function prototype
+			returnType = line[0: line.find(" API_ENTRY(")]
+			functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
+			parameterList = line[line.find(")(") + 2: line.find(") {")]
+			
+			#if line.find("*") >= 0:
+			#	extern = "%s Debug_%s(%s);" % (returnType, functionName, parameterList)
+			#	externs.append(extern)
+			#	continue
+			
+			if functionName in skipFunctions:
+				sys.stderr.write("!\n! skipping function '%s'\n!\n" % (functionName))
+				continue
+				
+			parameters = parameterList.split(',')
+			paramIndex = 0
+			if line.find("*") >= 0 and (line.find("*") < line.find(":") or line.find("*") > line.rfind(":")):
+				extern = "%s Debug_%s(%s);" % (returnType, functionName, RemoveAnnotation(parameterList))
+				sys.stderr.write("%s should be hand written\n" % (extern))
+				print "// FIXME: this function has pointers, it should be hand written"
+				externs.append(extern)
+			print "%s Debug_%s(%s)\n{" % (returnType, functionName, RemoveAnnotation(parameterList))
+			
+			if returnType != "void":
+				print "\t%s ret = 0;" % (returnType)
+			print """\tgl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+\tGLESv2Debugger::Message msg, cmd;
+\tmsg.set_context_id(0);
+\tmsg.set_has_next_message(true);
+\tconst bool expectResponse = false;
+\tmsg.set_expect_response(expectResponse);"""
+			print "\tmsg.set_function(GLESv2Debugger::Message_Function_%s);" % (functionName)
+
+			if parameterList == "void":
+				parameters = []
+			
+			arguments = ""
+			 
+			paramTypes = []
+			paramNames = []
+			paramAnnotations = []
+			inout = ""
+			getData = ""
+			
+			for parameter in parameters:
+				parameter = parameter.replace("const", "")
+				parameter = parameter.strip()
+				paramType = parameter.split(' ')[0]
+				paramName = parameter.split(' ')[1]
+				annotation = ""
+				arguments += paramName
+				if parameter.find(":") >= 0:
+					assert paramIndex == len(parameters) - 1 # only last parameter should be annotated
+					sys.stderr.write("%s is annotated: %s \n" % (functionName, paramType))
+					inout = paramType.split(":")[2]
+					annotation = paramType.split(":")[1]
+					paramType = paramType.split(":")[0]
+					assert paramType.find("void") < 0
+					count = 1
+					countArg = ""
+					if annotation.find("*") >= 0:
+						count = int(annotation.split("*")[0])
+						countArg = annotation.split("*")[1]
+						assert countArg in paramNames
+					elif annotation in paramNames:
+						count = 1
+						countArg = annotation
+					elif annotation == "GLstring":
+						annotation = "strlen(%s)" % (paramName)
+					else:
+						count = int(annotation)
+			
+					print "\tmsg.set_arg%d(ToInt(%s));" % (paramIndex, paramName)
+					print "\tstd::string data;"
+					getData += "\t\t\tdata.reserve(%s * sizeof(%s));\n" % (annotation, paramType)
+					getData += "\t\t\tfor (unsigned i = 0; i < (%s); i++)\n" % (annotation)
+					getData += "\t\t\t\tdata.append((const char *)(%s + i), sizeof(*%s));\n" % (paramName, paramName)
+					getData += "\t\t\tmsg.set_data(data);"  
+				else:	 
+					if paramIndex < len(parameters) - 1:
+						arguments += ', '
+					if paramType == "GLfloat" or paramType == "GLclampf" or paramType.find("*") >= 0:
+						print "\tmsg.set_arg%d(ToInt(%s));" % (paramIndex, paramName)
+					else: 
+						print "\tmsg.set_arg%d(%s);" % (paramIndex, paramName)
+				paramTypes.append(paramType)
+				paramNames.append(paramName)
+				paramAnnotations.append(annotation)
+				paramIndex += 1
+			if line.find("*") >= 0 or line.find(":") >= 0:
+				print "\t// FIXME: check for pointer usage"
+			if inout in ["in", "inout"]:
+				print getData
+	 		print """\tSend(msg, cmd);
+\tif (!expectResponse)
+\t\tcmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+\twhile (true) {
+\t\tmsg.Clear();
+\t\tclock_t c0 = clock();
+\t\tswitch (cmd.function()) {
+\t\tcase GLESv2Debugger::Message_Function_CONTINUE:"""
+			if returnType == "void":
+				print "\t\t\t_c->%s(%s);" % (functionName, arguments)
+			
+			else:
+				print "\t\t\tret = _c->%s(%s);" % (functionName, arguments)
+				if returnType == "GLboolean":
+					print "\t\t\tmsg.set_ret(ret);"
+				else:
+					print "\t\t\tmsg.set_ret(ToInt(ret));"
+			print "\t\t\tmsg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);"
+			print "\t\t\tmsg.set_context_id(0);"
+			print "\t\t\tmsg.set_function(GLESv2Debugger::Message_Function_%s);" % (functionName)
+			print """\t\t\tmsg.set_has_next_message(false);
+\t\t\tmsg.set_expect_response(expectResponse);"""
+			if inout in ["out", "inout"]:
+				print getData
+			print """\t\t\tSend(msg, cmd);
+\t\t\tif (!expectResponse)
+\t\t\t\tcmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+\t\t\tbreak;
+\t\tcase GLESv2Debugger::Message_Function_SKIP:"""
+			if returnType == "void":
+				print "\t\t\treturn;"
+			else:
+				print "\t\t\tif (cmd.has_ret())"
+				if returnType == "GLboolean":
+					print "\t\t\t\tret = cmd.ret();"
+				else:
+					print "\t\t\t\tret = FromInt<%s>(cmd.ret());" % (returnType)
+				print "\t\t\treturn ret;"
+			print """\t\tdefault:
+\t\t\tASSERT(0); //GenerateCall(msg, cmd); 
+\t\t\tbreak;
+\t\t}
+\t}
+}
+"""
+			#break
+
+	print "// FIXME: the following functions should be written by hand"
+	for extern in externs:
+		print extern
+
+if __name__ == "__main__":
+	print "// auto generated by generate_api_cpp.py\n"
+	print '''#include  "src/header.h"\n'''
+	print "template<typename T> static int ToInt(const T & t) { STATIC_ASSERT(sizeof(T) == sizeof(int), bitcast); return (int &)t; }\n"
+	print "template<typename T> static T FromInt(const int & t) { STATIC_ASSERT(sizeof(T) == sizeof(int), bitcast); return (T &)t; }\n"
+	
+	lines = open("gl2_api_annotated.in").readlines()
+	generate_api(lines)
+	#lines = open("gl2ext_api.in").readlines()
+	#generate_api(lines)
+			
+
diff --git a/opengl/libs/GLES2_dbg/generate_debug_in.py b/opengl/libs/GLES2_dbg/generate_debug_in.py
new file mode 100755
index 0000000..830bcb9
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/generate_debug_in.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+
+def append_functions(functions, lines):
+	i = 0
+	for line in lines:
+		if line.find("API_ENTRY(") >= 0: # a function prototype
+			returnType = line[0: line.find(" API_ENTRY(")]
+			functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
+			parameterList = line[line.find(")(") + 2: line.find(") {")]
+			
+			functions.append(functionName)
+			#print functionName
+			continue
+				
+			parameters = parameterList.split(',')
+			paramIndex = 0
+			if line.find("*") >= 0:
+				print "// FIXME: this function has pointers, it should be hand written"
+				externs.append("%s Tracing_%s(%s);" % (returnType, functionName, parameterList))
+			print "%s Tracing_%s(%s)\n{" % (returnType, functionName, parameterList)
+			
+			if parameterList == "void":
+				parameters = []
+			
+			arguments = ""
+			 
+			for parameter in parameters:
+				parameter = parameter.replace("const", "")
+				parameter = parameter.strip()
+				paramType = parameter.split(' ')[0]
+				paramName = parameter.split(' ')[1]
+				
+				paramIndex += 1
+				
+	return functions
+	
+
+
+if __name__ == "__main__":
+	definedFunctions = []
+	lines = open("gl2_api.in").readlines()
+	definedFunctions = append_functions(definedFunctions, lines)
+	
+	output = open("debug.in", "w")
+	lines = open("trace.in").readlines()
+	output.write("// the following functions are not defined in GLESv2_dbg\n")
+	for line in lines:
+		functionName = ""
+		if line.find("TRACE_GL(") >= 0: # a function prototype
+			functionName = line.split(',')[1].strip()
+		elif line.find("TRACE_GL_VOID(") >= 0: # a function prototype
+			functionName = line[line.find("(") + 1: line.find(",")] #extract GL function name
+		else:
+			continue
+		if functionName in definedFunctions:
+			#print functionName
+			continue
+		else:
+			output.write(line)
+	
diff --git a/opengl/libs/GLES2_dbg/gl2_api_annotated.in b/opengl/libs/GLES2_dbg/gl2_api_annotated.in
new file mode 100644
index 0000000..2296570
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/gl2_api_annotated.in
@@ -0,0 +1,426 @@
+void API_ENTRY(glActiveTexture)(GLenum texture) {
+    CALL_GL_API(glActiveTexture, texture);
+}
+void API_ENTRY(glAttachShader)(GLuint program, GLuint shader) {
+    CALL_GL_API(glAttachShader, program, shader);
+}
+void API_ENTRY(glBindAttribLocation)(GLuint program, GLuint index, const GLchar:GLstring:in name) {
+    CALL_GL_API(glBindAttribLocation, program, index, name);
+}
+void API_ENTRY(glBindBuffer)(GLenum target, GLuint buffer) {
+    CALL_GL_API(glBindBuffer, target, buffer);
+}
+void API_ENTRY(glBindFramebuffer)(GLenum target, GLuint framebuffer) {
+    CALL_GL_API(glBindFramebuffer, target, framebuffer);
+}
+void API_ENTRY(glBindRenderbuffer)(GLenum target, GLuint renderbuffer) {
+    CALL_GL_API(glBindRenderbuffer, target, renderbuffer);
+}
+void API_ENTRY(glBindTexture)(GLenum target, GLuint texture) {
+    CALL_GL_API(glBindTexture, target, texture);
+}
+void API_ENTRY(glBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
+    CALL_GL_API(glBlendColor, red, green, blue, alpha);
+}
+void API_ENTRY(glBlendEquation)( GLenum mode ) {
+    CALL_GL_API(glBlendEquation, mode);
+}
+void API_ENTRY(glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha) {
+    CALL_GL_API(glBlendEquationSeparate, modeRGB, modeAlpha);
+}
+void API_ENTRY(glBlendFunc)(GLenum sfactor, GLenum dfactor) {
+    CALL_GL_API(glBlendFunc, sfactor, dfactor);
+}
+void API_ENTRY(glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
+    CALL_GL_API(glBlendFuncSeparate, srcRGB, dstRGB, srcAlpha, dstAlpha);
+}
+void API_ENTRY(glBufferData)(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) {
+    CALL_GL_API(glBufferData, target, size, data, usage);
+}
+void API_ENTRY(glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) {
+    CALL_GL_API(glBufferSubData, target, offset, size, data);
+}
+GLenum API_ENTRY(glCheckFramebufferStatus)(GLenum target) {
+    CALL_GL_API_RETURN(glCheckFramebufferStatus, target);
+}
+void API_ENTRY(glClear)(GLbitfield mask) {
+    CALL_GL_API(glClear, mask);
+}
+void API_ENTRY(glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
+    CALL_GL_API(glClearColor, red, green, blue, alpha);
+}
+void API_ENTRY(glClearDepthf)(GLclampf depth) {
+    CALL_GL_API(glClearDepthf, depth);
+}
+void API_ENTRY(glClearStencil)(GLint s) {
+    CALL_GL_API(glClearStencil, s);
+}
+void API_ENTRY(glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
+    CALL_GL_API(glColorMask, red, green, blue, alpha);
+}
+void API_ENTRY(glCompileShader)(GLuint shader) {
+    CALL_GL_API(glCompileShader, shader);
+}
+void API_ENTRY(glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data) {
+    CALL_GL_API(glCompressedTexImage2D, target, level, internalformat, width, height, border, imageSize, data);
+}
+void API_ENTRY(glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data) {
+    CALL_GL_API(glCompressedTexSubImage2D, target, level, xoffset, yoffset, width, height, format, imageSize, data);
+}
+void API_ENTRY(glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {
+    CALL_GL_API(glCopyTexImage2D, target, level, internalformat, x, y, width, height, border);
+}
+void API_ENTRY(glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
+    CALL_GL_API(glCopyTexSubImage2D, target, level, xoffset, yoffset, x, y, width, height);
+}
+GLuint API_ENTRY(glCreateProgram)(void) {
+    CALL_GL_API_RETURN(glCreateProgram);
+}
+GLuint API_ENTRY(glCreateShader)(GLenum type) {
+    CALL_GL_API_RETURN(glCreateShader, type);
+}
+void API_ENTRY(glCullFace)(GLenum mode) {
+    CALL_GL_API(glCullFace, mode);
+}
+void API_ENTRY(glDeleteBuffers)(GLsizei n, const GLuint:n:in buffers) {
+    CALL_GL_API(glDeleteBuffers, n, buffers);
+}
+void API_ENTRY(glDeleteFramebuffers)(GLsizei n, const GLuint:n:in framebuffers) {
+    CALL_GL_API(glDeleteFramebuffers, n, framebuffers);
+}
+void API_ENTRY(glDeleteProgram)(GLuint program) {
+    CALL_GL_API(glDeleteProgram, program);
+}
+void API_ENTRY(glDeleteRenderbuffers)(GLsizei n, const GLuint:n:in renderbuffers) {
+    CALL_GL_API(glDeleteRenderbuffers, n, renderbuffers);
+}
+void API_ENTRY(glDeleteShader)(GLuint shader) {
+    CALL_GL_API(glDeleteShader, shader);
+}
+void API_ENTRY(glDeleteTextures)(GLsizei n, const GLuint:n:in textures) {
+    CALL_GL_API(glDeleteTextures, n, textures);
+}
+void API_ENTRY(glDepthFunc)(GLenum func) {
+    CALL_GL_API(glDepthFunc, func);
+}
+void API_ENTRY(glDepthMask)(GLboolean flag) {
+    CALL_GL_API(glDepthMask, flag);
+}
+void API_ENTRY(glDepthRangef)(GLclampf zNear, GLclampf zFar) {
+    CALL_GL_API(glDepthRangef, zNear, zFar);
+}
+void API_ENTRY(glDetachShader)(GLuint program, GLuint shader) {
+    CALL_GL_API(glDetachShader, program, shader);
+}
+void API_ENTRY(glDisable)(GLenum cap) {
+    CALL_GL_API(glDisable, cap);
+}
+void API_ENTRY(glDisableVertexAttribArray)(GLuint index) {
+    CALL_GL_API(glDisableVertexAttribArray, index);
+}
+void API_ENTRY(glDrawArrays)(GLenum mode, GLint first, GLsizei count) {
+    CALL_GL_API(glDrawArrays, mode, first, count);
+}
+void API_ENTRY(glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) {
+    CALL_GL_API(glDrawElements, mode, count, type, indices);
+}
+void API_ENTRY(glEnable)(GLenum cap) {
+    CALL_GL_API(glEnable, cap);
+}
+void API_ENTRY(glEnableVertexAttribArray)(GLuint index) {
+    CALL_GL_API(glEnableVertexAttribArray, index);
+}
+void API_ENTRY(glFinish)(void) {
+    CALL_GL_API(glFinish);
+}
+void API_ENTRY(glFlush)(void) {
+    CALL_GL_API(glFlush);
+}
+void API_ENTRY(glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {
+    CALL_GL_API(glFramebufferRenderbuffer, target, attachment, renderbuffertarget, renderbuffer);
+}
+void API_ENTRY(glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
+    CALL_GL_API(glFramebufferTexture2D, target, attachment, textarget, texture, level);
+}
+void API_ENTRY(glFrontFace)(GLenum mode) {
+    CALL_GL_API(glFrontFace, mode);
+}
+void API_ENTRY(glGenBuffers)(GLsizei n, GLuint:n:out buffers) {
+    CALL_GL_API(glGenBuffers, n, buffers);
+}
+void API_ENTRY(glGenerateMipmap)(GLenum target) {
+    CALL_GL_API(glGenerateMipmap, target);
+}
+void API_ENTRY(glGenFramebuffers)(GLsizei n, GLuint:n:out framebuffers) {
+    CALL_GL_API(glGenFramebuffers, n, framebuffers);
+}
+void API_ENTRY(glGenRenderbuffers)(GLsizei n, GLuint:n:out renderbuffers) {
+    CALL_GL_API(glGenRenderbuffers, n, renderbuffers);
+}
+void API_ENTRY(glGenTextures)(GLsizei n, GLuint:n:out textures) {
+    CALL_GL_API(glGenTextures, n, textures);
+}
+void API_ENTRY(glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar:GLstring:in name) {
+    CALL_GL_API(glGetActiveAttrib, program, index, bufsize, length, size, type, name);
+}
+void API_ENTRY(glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar:GLstring:in name) {
+    CALL_GL_API(glGetActiveUniform, program, index, bufsize, length, size, type, name);
+}
+void API_ENTRY(glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
+    CALL_GL_API(glGetAttachedShaders, program, maxcount, count, shaders);
+}
+int API_ENTRY(glGetAttribLocation)(GLuint program, const GLchar:GLstring:in name) {
+    CALL_GL_API_RETURN(glGetAttribLocation, program, name);
+}
+void API_ENTRY(glGetBooleanv)(GLenum pname, GLboolean* params) {
+    CALL_GL_API(glGetBooleanv, pname, params);
+}
+void API_ENTRY(glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params) {
+    CALL_GL_API(glGetBufferParameteriv, target, pname, params);
+}
+GLenum API_ENTRY(glGetError)(void) {
+    CALL_GL_API_RETURN(glGetError);
+}
+void API_ENTRY(glGetFloatv)(GLenum pname, GLfloat* params) {
+    CALL_GL_API(glGetFloatv, pname, params);
+}
+void API_ENTRY(glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint* params) {
+    CALL_GL_API(glGetFramebufferAttachmentParameteriv, target, attachment, pname, params);
+}
+void API_ENTRY(glGetIntegerv)(GLenum pname, GLint* params) {
+    CALL_GL_API(glGetIntegerv, pname, params);
+}
+void API_ENTRY(glGetProgramiv)(GLuint program, GLenum pname, GLint:1:out params) {
+    CALL_GL_API(glGetProgramiv, program, pname, params);
+}
+void API_ENTRY(glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, GLchar:GLstring:out infolog) {
+    CALL_GL_API(glGetProgramInfoLog, program, bufsize, length, infolog);
+}
+void API_ENTRY(glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint* params) {
+    CALL_GL_API(glGetRenderbufferParameteriv, target, pname, params);
+}
+void API_ENTRY(glGetShaderiv)(GLuint shader, GLenum pname, GLint:1:out params) {
+    CALL_GL_API(glGetShaderiv, shader, pname, params);
+}
+void API_ENTRY(glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar:GLstring:out infolog) {
+    CALL_GL_API(glGetShaderInfoLog, shader, bufsize, length, infolog);
+}
+void API_ENTRY(glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) {
+    CALL_GL_API(glGetShaderPrecisionFormat, shadertype, precisiontype, range, precision);
+}
+void API_ENTRY(glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar:GLstring:out source) {
+    CALL_GL_API(glGetShaderSource, shader, bufsize, length, source);
+}
+const GLubyte* API_ENTRY(glGetString)(GLenum name) {
+    CALL_GL_API_RETURN(glGetString, name);
+}
+void API_ENTRY(glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params) {
+    CALL_GL_API(glGetTexParameterfv, target, pname, params);
+}
+void API_ENTRY(glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params) {
+    CALL_GL_API(glGetTexParameteriv, target, pname, params);
+}
+void API_ENTRY(glGetUniformfv)(GLuint program, GLint location, GLfloat* params) {
+    CALL_GL_API(glGetUniformfv, program, location, params);
+}
+void API_ENTRY(glGetUniformiv)(GLuint program, GLint location, GLint* params) {
+    CALL_GL_API(glGetUniformiv, program, location, params);
+}
+int API_ENTRY(glGetUniformLocation)(GLuint program, const GLchar:GLstring:in name) {
+    CALL_GL_API_RETURN(glGetUniformLocation, program, name);
+}
+void API_ENTRY(glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params) {
+    CALL_GL_API(glGetVertexAttribfv, index, pname, params);
+}
+void API_ENTRY(glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params) {
+    CALL_GL_API(glGetVertexAttribiv, index, pname, params);
+}
+void API_ENTRY(glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid** pointer) {
+    CALL_GL_API(glGetVertexAttribPointerv, index, pname, pointer);
+}
+void API_ENTRY(glHint)(GLenum target, GLenum mode) {
+    CALL_GL_API(glHint, target, mode);
+}
+GLboolean API_ENTRY(glIsBuffer)(GLuint buffer) {
+    CALL_GL_API_RETURN(glIsBuffer, buffer);
+}
+GLboolean API_ENTRY(glIsEnabled)(GLenum cap) {
+    CALL_GL_API_RETURN(glIsEnabled, cap);
+}
+GLboolean API_ENTRY(glIsFramebuffer)(GLuint framebuffer) {
+    CALL_GL_API_RETURN(glIsFramebuffer, framebuffer);
+}
+GLboolean API_ENTRY(glIsProgram)(GLuint program) {
+    CALL_GL_API_RETURN(glIsProgram, program);
+}
+GLboolean API_ENTRY(glIsRenderbuffer)(GLuint renderbuffer) {
+    CALL_GL_API_RETURN(glIsRenderbuffer, renderbuffer);
+}
+GLboolean API_ENTRY(glIsShader)(GLuint shader) {
+    CALL_GL_API_RETURN(glIsShader, shader);
+}
+GLboolean API_ENTRY(glIsTexture)(GLuint texture) {
+    CALL_GL_API_RETURN(glIsTexture, texture);
+}
+void API_ENTRY(glLineWidth)(GLfloat width) {
+    CALL_GL_API(glLineWidth, width);
+}
+void API_ENTRY(glLinkProgram)(GLuint program) {
+    CALL_GL_API(glLinkProgram, program);
+}
+void API_ENTRY(glPixelStorei)(GLenum pname, GLint param) {
+    CALL_GL_API(glPixelStorei, pname, param);
+}
+void API_ENTRY(glPolygonOffset)(GLfloat factor, GLfloat units) {
+    CALL_GL_API(glPolygonOffset, factor, units);
+}
+void API_ENTRY(glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) {
+    CALL_GL_API(glReadPixels, x, y, width, height, format, type, pixels);
+}
+void API_ENTRY(glReleaseShaderCompiler)(void) {
+    CALL_GL_API(glReleaseShaderCompiler);
+}
+void API_ENTRY(glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
+    CALL_GL_API(glRenderbufferStorage, target, internalformat, width, height);
+}
+void API_ENTRY(glSampleCoverage)(GLclampf value, GLboolean invert) {
+    CALL_GL_API(glSampleCoverage, value, invert);
+}
+void API_ENTRY(glScissor)(GLint x, GLint y, GLsizei width, GLsizei height) {
+    CALL_GL_API(glScissor, x, y, width, height);
+}
+void API_ENTRY(glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length) {
+    CALL_GL_API(glShaderBinary, n, shaders, binaryformat, binary, length);
+}
+void API_ENTRY(glShaderSource)(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) {
+    CALL_GL_API(glShaderSource, shader, count, string, length);
+}
+void API_ENTRY(glStencilFunc)(GLenum func, GLint ref, GLuint mask) {
+    CALL_GL_API(glStencilFunc, func, ref, mask);
+}
+void API_ENTRY(glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask) {
+    CALL_GL_API(glStencilFuncSeparate, face, func, ref, mask);
+}
+void API_ENTRY(glStencilMask)(GLuint mask) {
+    CALL_GL_API(glStencilMask, mask);
+}
+void API_ENTRY(glStencilMaskSeparate)(GLenum face, GLuint mask) {
+    CALL_GL_API(glStencilMaskSeparate, face, mask);
+}
+void API_ENTRY(glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass) {
+    CALL_GL_API(glStencilOp, fail, zfail, zpass);
+}
+void API_ENTRY(glStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) {
+    CALL_GL_API(glStencilOpSeparate, face, fail, zfail, zpass);
+}
+void API_ENTRY(glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels) {
+    CALL_GL_API(glTexImage2D, target, level, internalformat, width, height, border, format, type, pixels);
+}
+void API_ENTRY(glTexParameterf)(GLenum target, GLenum pname, GLfloat param) {
+    CALL_GL_API(glTexParameterf, target, pname, param);
+}
+void API_ENTRY(glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params) {
+    CALL_GL_API(glTexParameterfv, target, pname, params);
+}
+void API_ENTRY(glTexParameteri)(GLenum target, GLenum pname, GLint param) {
+    CALL_GL_API(glTexParameteri, target, pname, param);
+}
+void API_ENTRY(glTexParameteriv)(GLenum target, GLenum pname, const GLint* params) {
+    CALL_GL_API(glTexParameteriv, target, pname, params);
+}
+void API_ENTRY(glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels) {
+    CALL_GL_API(glTexSubImage2D, target, level, xoffset, yoffset, width, height, format, type, pixels);
+}
+void API_ENTRY(glUniform1f)(GLint location, GLfloat x) {
+    CALL_GL_API(glUniform1f, location, x);
+}
+void API_ENTRY(glUniform1fv)(GLint location, GLsizei count, const GLfloat:1*count:in v) {
+    CALL_GL_API(glUniform1fv, location, count, v);
+}
+void API_ENTRY(glUniform1i)(GLint location, GLint x) {
+    CALL_GL_API(glUniform1i, location, x);
+}
+void API_ENTRY(glUniform1iv)(GLint location, GLsizei count, const GLint:1*count:in v) {
+    CALL_GL_API(glUniform1iv, location, count, v);
+}
+void API_ENTRY(glUniform2f)(GLint location, GLfloat x, GLfloat y) {
+    CALL_GL_API(glUniform2f, location, x, y);
+}
+void API_ENTRY(glUniform2fv)(GLint location, GLsizei count, const GLfloat:2*count:in v) {
+    CALL_GL_API(glUniform2fv, location, count, v);
+}
+void API_ENTRY(glUniform2i)(GLint location, GLint x, GLint y) {
+    CALL_GL_API(glUniform2i, location, x, y);
+}
+void API_ENTRY(glUniform2iv)(GLint location, GLsizei count, const GLint:2*count:in v) {
+    CALL_GL_API(glUniform2iv, location, count, v);
+}
+void API_ENTRY(glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z) {
+    CALL_GL_API(glUniform3f, location, x, y, z);
+}
+void API_ENTRY(glUniform3fv)(GLint location, GLsizei count, const GLfloat:3*count:in v) {
+    CALL_GL_API(glUniform3fv, location, count, v);
+}
+void API_ENTRY(glUniform3i)(GLint location, GLint x, GLint y, GLint z) {
+    CALL_GL_API(glUniform3i, location, x, y, z);
+}
+void API_ENTRY(glUniform3iv)(GLint location, GLsizei count, const GLint:3*count:in v) {
+    CALL_GL_API(glUniform3iv, location, count, v);
+}
+void API_ENTRY(glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
+    CALL_GL_API(glUniform4f, location, x, y, z, w);
+}
+void API_ENTRY(glUniform4fv)(GLint location, GLsizei count, const GLfloat:4*count:in v) {
+    CALL_GL_API(glUniform4fv, location, count, v);
+}
+void API_ENTRY(glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w) {
+    CALL_GL_API(glUniform4i, location, x, y, z, w);
+}
+void API_ENTRY(glUniform4iv)(GLint location, GLsizei count, const GLint:4*count:in v) {
+    CALL_GL_API(glUniform4iv, location, count, v);
+}
+void API_ENTRY(glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat:4*count:in value) {
+    CALL_GL_API(glUniformMatrix2fv, location, count, transpose, value);
+}
+void API_ENTRY(glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat:9*count:in value) {
+    CALL_GL_API(glUniformMatrix3fv, location, count, transpose, value);
+}
+void API_ENTRY(glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat:16*count:in value) {
+    CALL_GL_API(glUniformMatrix4fv, location, count, transpose, value);
+}
+void API_ENTRY(glUseProgram)(GLuint program) {
+    CALL_GL_API(glUseProgram, program);
+}
+void API_ENTRY(glValidateProgram)(GLuint program) {
+    CALL_GL_API(glValidateProgram, program);
+}
+void API_ENTRY(glVertexAttrib1f)(GLuint indx, GLfloat x) {
+    CALL_GL_API(glVertexAttrib1f, indx, x);
+}
+void API_ENTRY(glVertexAttrib1fv)(GLuint indx, const GLfloat:1:in values) {
+    CALL_GL_API(glVertexAttrib1fv, indx, values);
+}
+void API_ENTRY(glVertexAttrib2f)(GLuint indx, GLfloat x, GLfloat y) {
+    CALL_GL_API(glVertexAttrib2f, indx, x, y);
+}
+void API_ENTRY(glVertexAttrib2fv)(GLuint indx, const GLfloat:2:in values) {
+    CALL_GL_API(glVertexAttrib2fv, indx, values);
+}
+void API_ENTRY(glVertexAttrib3f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z) {
+    CALL_GL_API(glVertexAttrib3f, indx, x, y, z);
+}
+void API_ENTRY(glVertexAttrib3fv)(GLuint indx, const GLfloat:3:in values) {
+    CALL_GL_API(glVertexAttrib3fv, indx, values);
+}
+void API_ENTRY(glVertexAttrib4f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
+    CALL_GL_API(glVertexAttrib4f, indx, x, y, z, w);
+}
+void API_ENTRY(glVertexAttrib4fv)(GLuint indx, const GLfloat:4:in values) {
+    CALL_GL_API(glVertexAttrib4fv, indx, values);
+}
+void API_ENTRY(glVertexAttribPointer)(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) {
+    CALL_GL_API(glVertexAttribPointer, indx, size, type, normalized, stride, ptr);
+}
+void API_ENTRY(glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) {
+    CALL_GL_API(glViewport, x, y, width, height);
+}
diff --git a/opengl/libs/GLES2_dbg/include/glesv2_dbg.h b/opengl/libs/GLES2_dbg/include/glesv2_dbg.h
new file mode 100644
index 0000000..2d70032
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/include/glesv2_dbg.h
@@ -0,0 +1,381 @@
+extern "C"
+{
+GL_ENTRY(void, glActiveTexture, GLenum texture)
+GL_ENTRY(void, glAlphaFunc, GLenum func, GLclampf ref)
+GL_ENTRY(void, glAlphaFuncx, GLenum func, GLclampx ref)
+GL_ENTRY(void, glAlphaFuncxOES, GLenum func, GLclampx ref)
+GL_ENTRY(void, glAttachShader, GLuint program, GLuint shader)
+GL_ENTRY(void, glBeginPerfMonitorAMD, GLuint monitor)
+GL_ENTRY(void, glBindAttribLocation, GLuint program, GLuint index, const GLchar* name)
+GL_ENTRY(void, glBindBuffer, GLenum target, GLuint buffer)
+GL_ENTRY(void, glBindFramebuffer, GLenum target, GLuint framebuffer)
+GL_ENTRY(void, glBindFramebufferOES, GLenum target, GLuint framebuffer)
+GL_ENTRY(void, glBindRenderbuffer, GLenum target, GLuint renderbuffer)
+GL_ENTRY(void, glBindRenderbufferOES, GLenum target, GLuint renderbuffer)
+GL_ENTRY(void, glBindTexture, GLenum target, GLuint texture)
+GL_ENTRY(void, glBindVertexArrayOES, GLuint array)
+GL_ENTRY(void, glBlendColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+GL_ENTRY(void, glBlendEquation,  GLenum mode )
+GL_ENTRY(void, glBlendEquationOES, GLenum mode)
+GL_ENTRY(void, glBlendEquationSeparate, GLenum modeRGB, GLenum modeAlpha)
+GL_ENTRY(void, glBlendEquationSeparateOES, GLenum modeRGB, GLenum modeAlpha)
+GL_ENTRY(void, glBlendFunc, GLenum sfactor, GLenum dfactor)
+GL_ENTRY(void, glBlendFuncSeparate, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+GL_ENTRY(void, glBlendFuncSeparateOES, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+GL_ENTRY(void, glBufferData, GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+GL_ENTRY(void, glBufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
+GL_ENTRY(GLenum, glCheckFramebufferStatus, GLenum target)
+GL_ENTRY(GLenum, glCheckFramebufferStatusOES, GLenum target)
+GL_ENTRY(void, glClear, GLbitfield mask)
+GL_ENTRY(void, glClearColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+GL_ENTRY(void, glClearColorx, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+GL_ENTRY(void, glClearColorxOES, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+GL_ENTRY(void, glClearDepthf, GLclampf depth)
+GL_ENTRY(void, glClearDepthfOES, GLclampf depth)
+GL_ENTRY(void, glClearDepthx, GLclampx depth)
+GL_ENTRY(void, glClearDepthxOES, GLclampx depth)
+GL_ENTRY(void, glClearStencil, GLint s)
+GL_ENTRY(void, glClientActiveTexture, GLenum texture)
+GL_ENTRY(void, glClipPlanef, GLenum plane, const GLfloat *equation)
+GL_ENTRY(void, glClipPlanefIMG, GLenum p, const GLfloat *eqn)
+GL_ENTRY(void, glClipPlanefOES, GLenum plane, const GLfloat *equation)
+GL_ENTRY(void, glClipPlanex, GLenum plane, const GLfixed *equation)
+GL_ENTRY(void, glClipPlanexIMG, GLenum p, const GLfixed *eqn)
+GL_ENTRY(void, glClipPlanexOES, GLenum plane, const GLfixed *equation)
+GL_ENTRY(void, glColor4f, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+GL_ENTRY(void, glColor4ub, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+GL_ENTRY(void, glColor4x, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+GL_ENTRY(void, glColor4xOES, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+GL_ENTRY(void, glColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+GL_ENTRY(void, glColorPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glCompileShader, GLuint shader)
+GL_ENTRY(void, glCompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
+GL_ENTRY(void, glCompressedTexImage3DOES, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
+GL_ENTRY(void, glCompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
+GL_ENTRY(void, glCompressedTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
+GL_ENTRY(void, glCopyTexImage2D, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+GL_ENTRY(void, glCopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glCopyTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glCoverageMaskNV, GLboolean mask)
+GL_ENTRY(void, glCoverageOperationNV, GLenum operation)
+GL_ENTRY(GLuint, glCreateProgram, void)
+GL_ENTRY(GLuint, glCreateShader, GLenum type)
+GL_ENTRY(void, glCullFace, GLenum mode)
+GL_ENTRY(void, glCurrentPaletteMatrixOES, GLuint matrixpaletteindex)
+GL_ENTRY(void, glDeleteBuffers, GLsizei n, const GLuint *buffers)
+GL_ENTRY(void, glDeleteFencesNV, GLsizei n, const GLuint *fences)
+GL_ENTRY(void, glDeleteFramebuffers, GLsizei n, const GLuint* framebuffers)
+GL_ENTRY(void, glDeleteFramebuffersOES, GLsizei n, const GLuint* framebuffers)
+GL_ENTRY(void, glDeletePerfMonitorsAMD, GLsizei n, GLuint *monitors)
+GL_ENTRY(void, glDeleteProgram, GLuint program)
+GL_ENTRY(void, glDeleteRenderbuffers, GLsizei n, const GLuint* renderbuffers)
+GL_ENTRY(void, glDeleteRenderbuffersOES, GLsizei n, const GLuint* renderbuffers)
+GL_ENTRY(void, glDeleteShader, GLuint shader)
+GL_ENTRY(void, glDeleteTextures, GLsizei n, const GLuint *textures)
+GL_ENTRY(void, glDeleteVertexArraysOES, GLsizei n, const GLuint *arrays)
+GL_ENTRY(void, glDepthFunc, GLenum func)
+GL_ENTRY(void, glDepthMask, GLboolean flag)
+GL_ENTRY(void, glDepthRangef, GLclampf zNear, GLclampf zFar)
+GL_ENTRY(void, glDepthRangefOES, GLclampf zNear, GLclampf zFar)
+GL_ENTRY(void, glDepthRangex, GLclampx zNear, GLclampx zFar)
+GL_ENTRY(void, glDepthRangexOES, GLclampx zNear, GLclampx zFar)
+GL_ENTRY(void, glDetachShader, GLuint program, GLuint shader)
+GL_ENTRY(void, glDisable, GLenum cap)
+GL_ENTRY(void, glDisableClientState, GLenum array)
+GL_ENTRY(void, glDisableDriverControlQCOM, GLuint driverControl)
+GL_ENTRY(void, glDisableVertexAttribArray, GLuint index)
+GL_ENTRY(void, glDiscardFramebufferEXT, GLenum target, GLsizei numAttachments, const GLenum *attachments)
+GL_ENTRY(void, glDrawArrays, GLenum mode, GLint first, GLsizei count)
+GL_ENTRY(void, glDrawElements, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
+GL_ENTRY(void, glDrawTexfOES, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
+GL_ENTRY(void, glDrawTexfvOES, const GLfloat *coords)
+GL_ENTRY(void, glDrawTexiOES, GLint x, GLint y, GLint z, GLint width, GLint height)
+GL_ENTRY(void, glDrawTexivOES, const GLint *coords)
+GL_ENTRY(void, glDrawTexsOES, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
+GL_ENTRY(void, glDrawTexsvOES, const GLshort *coords)
+GL_ENTRY(void, glDrawTexxOES, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
+GL_ENTRY(void, glDrawTexxvOES, const GLfixed *coords)
+GL_ENTRY(void, glEGLImageTargetRenderbufferStorageOES, GLenum target, GLeglImageOES image)
+GL_ENTRY(void, glEGLImageTargetTexture2DOES, GLenum target, GLeglImageOES image)
+GL_ENTRY(void, glEnable, GLenum cap)
+GL_ENTRY(void, glEnableClientState, GLenum array)
+GL_ENTRY(void, glEnableDriverControlQCOM, GLuint driverControl)
+GL_ENTRY(void, glEnableVertexAttribArray, GLuint index)
+GL_ENTRY(void, glEndPerfMonitorAMD, GLuint monitor)
+GL_ENTRY(void, glEndTilingQCOM, GLbitfield preserveMask)
+GL_ENTRY(void, glExtGetBufferPointervQCOM, GLenum target, GLvoid **params)
+GL_ENTRY(void, glExtGetBuffersQCOM, GLuint *buffers, GLint maxBuffers, GLint *numBuffers)
+GL_ENTRY(void, glExtGetFramebuffersQCOM, GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers)
+GL_ENTRY(void, glExtGetProgramBinarySourceQCOM, GLuint program, GLenum shadertype, GLchar *source, GLint *length)
+GL_ENTRY(void, glExtGetProgramsQCOM, GLuint *programs, GLint maxPrograms, GLint *numPrograms)
+GL_ENTRY(void, glExtGetRenderbuffersQCOM, GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers)
+GL_ENTRY(void, glExtGetShadersQCOM, GLuint *shaders, GLint maxShaders, GLint *numShaders)
+GL_ENTRY(void, glExtGetTexLevelParameterivQCOM, GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params)
+GL_ENTRY(void, glExtGetTexSubImageQCOM, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels)
+GL_ENTRY(void, glExtGetTexturesQCOM, GLuint *textures, GLint maxTextures, GLint *numTextures)
+GL_ENTRY(GLboolean, glExtIsProgramBinaryQCOM, GLuint program)
+GL_ENTRY(void, glExtTexObjectStateOverrideiQCOM, GLenum target, GLenum pname, GLint param)
+GL_ENTRY(void, glFinish, void)
+GL_ENTRY(void, glFinishFenceNV, GLuint fence)
+GL_ENTRY(void, glFlush, void)
+GL_ENTRY(void, glFogf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glFogfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glFogx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glFogxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glFogxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glFogxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glFramebufferRenderbuffer, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+GL_ENTRY(void, glFramebufferRenderbufferOES, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+GL_ENTRY(void, glFramebufferTexture2D, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+GL_ENTRY(void, glFramebufferTexture2DMultisampleIMG, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
+GL_ENTRY(void, glFramebufferTexture2DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+GL_ENTRY(void, glFramebufferTexture3DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+GL_ENTRY(void, glFrontFace, GLenum mode)
+GL_ENTRY(void, glFrustumf, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glFrustumfOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glFrustumx, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glFrustumxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glGenBuffers, GLsizei n, GLuint *buffers)
+GL_ENTRY(void, glGenFencesNV, GLsizei n, GLuint *fences)
+GL_ENTRY(void, glGenFramebuffers, GLsizei n, GLuint* framebuffers)
+GL_ENTRY(void, glGenFramebuffersOES, GLsizei n, GLuint* framebuffers)
+GL_ENTRY(void, glGenPerfMonitorsAMD, GLsizei n, GLuint *monitors)
+GL_ENTRY(void, glGenRenderbuffers, GLsizei n, GLuint* renderbuffers)
+GL_ENTRY(void, glGenRenderbuffersOES, GLsizei n, GLuint* renderbuffers)
+GL_ENTRY(void, glGenTextures, GLsizei n, GLuint *textures)
+GL_ENTRY(void, glGenVertexArraysOES, GLsizei n, GLuint *arrays)
+GL_ENTRY(void, glGenerateMipmap, GLenum target)
+GL_ENTRY(void, glGenerateMipmapOES, GLenum target)
+GL_ENTRY(void, glGetActiveAttrib, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+GL_ENTRY(void, glGetActiveUniform, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+GL_ENTRY(void, glGetAttachedShaders, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+GL_ENTRY(int, glGetAttribLocation, GLuint program, const GLchar* name)
+GL_ENTRY(void, glGetBooleanv, GLenum pname, GLboolean *params)
+GL_ENTRY(void, glGetBufferParameteriv, GLenum target, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetBufferPointervOES, GLenum target, GLenum pname, GLvoid ** params)
+GL_ENTRY(void, glGetClipPlanef, GLenum pname, GLfloat eqn[4])
+GL_ENTRY(void, glGetClipPlanefOES, GLenum pname, GLfloat eqn[4])
+GL_ENTRY(void, glGetClipPlanex, GLenum pname, GLfixed eqn[4])
+GL_ENTRY(void, glGetClipPlanexOES, GLenum pname, GLfixed eqn[4])
+GL_ENTRY(void, glGetDriverControlStringQCOM, GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString)
+GL_ENTRY(void, glGetDriverControlsQCOM, GLint *num, GLsizei size, GLuint *driverControls)
+GL_ENTRY(GLenum, glGetError, void)
+GL_ENTRY(void, glGetFenceivNV, GLuint fence, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetFixedv, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetFixedvOES, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetFloatv, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetFramebufferAttachmentParameteriv, GLenum target, GLenum attachment, GLenum pname, GLint* params)
+GL_ENTRY(void, glGetFramebufferAttachmentParameterivOES, GLenum target, GLenum attachment, GLenum pname, GLint* params)
+GL_ENTRY(void, glGetIntegerv, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetLightfv, GLenum light, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetLightxv, GLenum light, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetLightxvOES, GLenum light, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetMaterialfv, GLenum face, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetMaterialxv, GLenum face, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetMaterialxvOES, GLenum face, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetPerfMonitorCounterDataAMD, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten)
+GL_ENTRY(void, glGetPerfMonitorCounterInfoAMD, GLuint group, GLuint counter, GLenum pname, GLvoid *data)
+GL_ENTRY(void, glGetPerfMonitorCounterStringAMD, GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString)
+GL_ENTRY(void, glGetPerfMonitorCountersAMD, GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters)
+GL_ENTRY(void, glGetPerfMonitorGroupStringAMD, GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString)
+GL_ENTRY(void, glGetPerfMonitorGroupsAMD, GLint *numGroups, GLsizei groupsSize, GLuint *groups)
+GL_ENTRY(void, glGetPointerv, GLenum pname, GLvoid **params)
+GL_ENTRY(void, glGetProgramBinaryOES, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+GL_ENTRY(void, glGetProgramInfoLog, GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+GL_ENTRY(void, glGetProgramiv, GLuint program, GLenum pname, GLint* params)
+GL_ENTRY(void, glGetRenderbufferParameteriv, GLenum target, GLenum pname, GLint* params)
+GL_ENTRY(void, glGetRenderbufferParameterivOES, GLenum target, GLenum pname, GLint* params)
+GL_ENTRY(void, glGetShaderInfoLog, GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+GL_ENTRY(void, glGetShaderPrecisionFormat, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+GL_ENTRY(void, glGetShaderSource, GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
+GL_ENTRY(void, glGetShaderiv, GLuint shader, GLenum pname, GLint* params)
+GL_ENTRY(const GLubyte *, glGetString, GLenum name)
+GL_ENTRY(void, glGetTexEnvfv, GLenum env, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexEnviv, GLenum env, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexEnvxv, GLenum env, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexEnvxvOES, GLenum env, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexGenfvOES, GLenum coord, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexGenivOES, GLenum coord, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexGenxvOES, GLenum coord, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexParameterfv, GLenum target, GLenum pname, GLfloat *params)
+GL_ENTRY(void, glGetTexParameteriv, GLenum target, GLenum pname, GLint *params)
+GL_ENTRY(void, glGetTexParameterxv, GLenum target, GLenum pname, GLfixed *params)
+GL_ENTRY(void, glGetTexParameterxvOES, GLenum target, GLenum pname, GLfixed *params)
+GL_ENTRY(int, glGetUniformLocation, GLuint program, const GLchar* name)
+GL_ENTRY(void, glGetUniformfv, GLuint program, GLint location, GLfloat* params)
+GL_ENTRY(void, glGetUniformiv, GLuint program, GLint location, GLint* params)
+GL_ENTRY(void, glGetVertexAttribPointerv, GLuint index, GLenum pname, GLvoid** pointer)
+GL_ENTRY(void, glGetVertexAttribfv, GLuint index, GLenum pname, GLfloat* params)
+GL_ENTRY(void, glGetVertexAttribiv, GLuint index, GLenum pname, GLint* params)
+GL_ENTRY(void, glHint, GLenum target, GLenum mode)
+GL_ENTRY(GLboolean, glIsBuffer, GLuint buffer)
+GL_ENTRY(GLboolean, glIsEnabled, GLenum cap)
+GL_ENTRY(GLboolean, glIsFenceNV, GLuint fence)
+GL_ENTRY(GLboolean, glIsFramebuffer, GLuint framebuffer)
+GL_ENTRY(GLboolean, glIsFramebufferOES, GLuint framebuffer)
+GL_ENTRY(GLboolean, glIsProgram, GLuint program)
+GL_ENTRY(GLboolean, glIsRenderbuffer, GLuint renderbuffer)
+GL_ENTRY(GLboolean, glIsRenderbufferOES, GLuint renderbuffer)
+GL_ENTRY(GLboolean, glIsShader, GLuint shader)
+GL_ENTRY(GLboolean, glIsTexture, GLuint texture)
+GL_ENTRY(GLboolean, glIsVertexArrayOES, GLuint array)
+GL_ENTRY(void, glLightModelf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glLightModelfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glLightModelx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightModelxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightModelxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLightModelxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLightf, GLenum light, GLenum pname, GLfloat param)
+GL_ENTRY(void, glLightfv, GLenum light, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glLightx, GLenum light, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightxOES, GLenum light, GLenum pname, GLfixed param)
+GL_ENTRY(void, glLightxv, GLenum light, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLightxvOES, GLenum light, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glLineWidth, GLfloat width)
+GL_ENTRY(void, glLineWidthx, GLfixed width)
+GL_ENTRY(void, glLineWidthxOES, GLfixed width)
+GL_ENTRY(void, glLinkProgram, GLuint program)
+GL_ENTRY(void, glLoadIdentity, void)
+GL_ENTRY(void, glLoadMatrixf, const GLfloat *m)
+GL_ENTRY(void, glLoadMatrixx, const GLfixed *m)
+GL_ENTRY(void, glLoadMatrixxOES, const GLfixed *m)
+GL_ENTRY(void, glLoadPaletteFromModelViewMatrixOES, void)
+GL_ENTRY(void, glLogicOp, GLenum opcode)
+GL_ENTRY(void*, glMapBufferOES, GLenum target, GLenum access)
+GL_ENTRY(void, glMaterialf, GLenum face, GLenum pname, GLfloat param)
+GL_ENTRY(void, glMaterialfv, GLenum face, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glMaterialx, GLenum face, GLenum pname, GLfixed param)
+GL_ENTRY(void, glMaterialxOES, GLenum face, GLenum pname, GLfixed param)
+GL_ENTRY(void, glMaterialxv, GLenum face, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glMaterialxvOES, GLenum face, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glMatrixIndexPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glMatrixMode, GLenum mode)
+GL_ENTRY(void, glMultMatrixf, const GLfloat *m)
+GL_ENTRY(void, glMultMatrixx, const GLfixed *m)
+GL_ENTRY(void, glMultMatrixxOES, const GLfixed *m)
+GL_ENTRY(void, glMultiDrawArraysEXT, GLenum mode, GLint *first, GLsizei *count, GLsizei primcount)
+GL_ENTRY(void, glMultiDrawElementsEXT, GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount)
+GL_ENTRY(void, glMultiTexCoord4f, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+GL_ENTRY(void, glMultiTexCoord4x, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+GL_ENTRY(void, glMultiTexCoord4xOES, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+GL_ENTRY(void, glNormal3f, GLfloat nx, GLfloat ny, GLfloat nz)
+GL_ENTRY(void, glNormal3x, GLfixed nx, GLfixed ny, GLfixed nz)
+GL_ENTRY(void, glNormal3xOES, GLfixed nx, GLfixed ny, GLfixed nz)
+GL_ENTRY(void, glNormalPointer, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glOrthof, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glOrthofOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+GL_ENTRY(void, glOrthox, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glOrthoxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+GL_ENTRY(void, glPixelStorei, GLenum pname, GLint param)
+GL_ENTRY(void, glPointParameterf, GLenum pname, GLfloat param)
+GL_ENTRY(void, glPointParameterfv, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glPointParameterx, GLenum pname, GLfixed param)
+GL_ENTRY(void, glPointParameterxOES, GLenum pname, GLfixed param)
+GL_ENTRY(void, glPointParameterxv, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glPointParameterxvOES, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glPointSize, GLfloat size)
+GL_ENTRY(void, glPointSizePointerOES, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glPointSizex, GLfixed size)
+GL_ENTRY(void, glPointSizexOES, GLfixed size)
+GL_ENTRY(void, glPolygonOffset, GLfloat factor, GLfloat units)
+GL_ENTRY(void, glPolygonOffsetx, GLfixed factor, GLfixed units)
+GL_ENTRY(void, glPolygonOffsetxOES, GLfixed factor, GLfixed units)
+GL_ENTRY(void, glPopMatrix, void)
+GL_ENTRY(void, glProgramBinaryOES, GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length)
+GL_ENTRY(void, glPushMatrix, void)
+GL_ENTRY(GLbitfield, glQueryMatrixxOES, GLfixed mantissa[16], GLint exponent[16])
+GL_ENTRY(void, glReadPixels, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
+GL_ENTRY(void, glReleaseShaderCompiler, void)
+GL_ENTRY(void, glRenderbufferStorage, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+GL_ENTRY(void, glRenderbufferStorageMultisampleIMG, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+GL_ENTRY(void, glRenderbufferStorageOES, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+GL_ENTRY(void, glRotatef, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glRotatex, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glRotatexOES, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glSampleCoverage, GLclampf value, GLboolean invert)
+GL_ENTRY(void, glSampleCoveragex, GLclampx value, GLboolean invert)
+GL_ENTRY(void, glSampleCoveragexOES, GLclampx value, GLboolean invert)
+GL_ENTRY(void, glScalef, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glScalex, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glScalexOES, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glScissor, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glSelectPerfMonitorCountersAMD, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList)
+GL_ENTRY(void, glSetFenceNV, GLuint fence, GLenum condition)
+GL_ENTRY(void, glShadeModel, GLenum mode)
+GL_ENTRY(void, glShaderBinary, GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
+GL_ENTRY(void, glShaderSource, GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
+GL_ENTRY(void, glStartTilingQCOM, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask)
+GL_ENTRY(void, glStencilFunc, GLenum func, GLint ref, GLuint mask)
+GL_ENTRY(void, glStencilFuncSeparate, GLenum face, GLenum func, GLint ref, GLuint mask)
+GL_ENTRY(void, glStencilMask, GLuint mask)
+GL_ENTRY(void, glStencilMaskSeparate, GLenum face, GLuint mask)
+GL_ENTRY(void, glStencilOp, GLenum fail, GLenum zfail, GLenum zpass)
+GL_ENTRY(void, glStencilOpSeparate, GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+GL_ENTRY(GLboolean, glTestFenceNV, GLuint fence)
+GL_ENTRY(void, glTexCoordPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glTexEnvf, GLenum target, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexEnvfv, GLenum target, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTexEnvi, GLenum target, GLenum pname, GLint param)
+GL_ENTRY(void, glTexEnviv, GLenum target, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexEnvx, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexEnvxOES, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexEnvxv, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexEnvxvOES, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexGenfOES, GLenum coord, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexGenfvOES, GLenum coord, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTexGeniOES, GLenum coord, GLenum pname, GLint param)
+GL_ENTRY(void, glTexGenivOES, GLenum coord, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexGenxOES, GLenum coord, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexGenxvOES, GLenum coord, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexImage2D, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+GL_ENTRY(void, glTexImage3DOES, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
+GL_ENTRY(void, glTexParameterf, GLenum target, GLenum pname, GLfloat param)
+GL_ENTRY(void, glTexParameterfv, GLenum target, GLenum pname, const GLfloat *params)
+GL_ENTRY(void, glTexParameteri, GLenum target, GLenum pname, GLint param)
+GL_ENTRY(void, glTexParameteriv, GLenum target, GLenum pname, const GLint *params)
+GL_ENTRY(void, glTexParameterx, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexParameterxOES, GLenum target, GLenum pname, GLfixed param)
+GL_ENTRY(void, glTexParameterxv, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexParameterxvOES, GLenum target, GLenum pname, const GLfixed *params)
+GL_ENTRY(void, glTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
+GL_ENTRY(void, glTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
+GL_ENTRY(void, glTranslatef, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glTranslatex, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glTranslatexOES, GLfixed x, GLfixed y, GLfixed z)
+GL_ENTRY(void, glUniform1f, GLint location, GLfloat x)
+GL_ENTRY(void, glUniform1fv, GLint location, GLsizei count, const GLfloat* v)
+GL_ENTRY(void, glUniform1i, GLint location, GLint x)
+GL_ENTRY(void, glUniform1iv, GLint location, GLsizei count, const GLint* v)
+GL_ENTRY(void, glUniform2f, GLint location, GLfloat x, GLfloat y)
+GL_ENTRY(void, glUniform2fv, GLint location, GLsizei count, const GLfloat* v)
+GL_ENTRY(void, glUniform2i, GLint location, GLint x, GLint y)
+GL_ENTRY(void, glUniform2iv, GLint location, GLsizei count, const GLint* v)
+GL_ENTRY(void, glUniform3f, GLint location, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glUniform3fv, GLint location, GLsizei count, const GLfloat* v)
+GL_ENTRY(void, glUniform3i, GLint location, GLint x, GLint y, GLint z)
+GL_ENTRY(void, glUniform3iv, GLint location, GLsizei count, const GLint* v)
+GL_ENTRY(void, glUniform4f, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+GL_ENTRY(void, glUniform4fv, GLint location, GLsizei count, const GLfloat* v)
+GL_ENTRY(void, glUniform4i, GLint location, GLint x, GLint y, GLint z, GLint w)
+GL_ENTRY(void, glUniform4iv, GLint location, GLsizei count, const GLint* v)
+GL_ENTRY(void, glUniformMatrix2fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+GL_ENTRY(void, glUniformMatrix3fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+GL_ENTRY(void, glUniformMatrix4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+GL_ENTRY(GLboolean, glUnmapBufferOES, GLenum target)
+GL_ENTRY(void, glUseProgram, GLuint program)
+GL_ENTRY(void, glValidateProgram, GLuint program)
+GL_ENTRY(void, glVertexAttrib1f, GLuint indx, GLfloat x)
+GL_ENTRY(void, glVertexAttrib1fv, GLuint indx, const GLfloat* values)
+GL_ENTRY(void, glVertexAttrib2f, GLuint indx, GLfloat x, GLfloat y)
+GL_ENTRY(void, glVertexAttrib2fv, GLuint indx, const GLfloat* values)
+GL_ENTRY(void, glVertexAttrib3f, GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+GL_ENTRY(void, glVertexAttrib3fv, GLuint indx, const GLfloat* values)
+GL_ENTRY(void, glVertexAttrib4f, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+GL_ENTRY(void, glVertexAttrib4fv, GLuint indx, const GLfloat* values)
+GL_ENTRY(void, glVertexAttribPointer, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
+GL_ENTRY(void, glVertexPointer, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+GL_ENTRY(void, glViewport, GLint x, GLint y, GLsizei width, GLsizei height)
+GL_ENTRY(void, glWeightPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+
+
+}
diff --git a/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.cpp b/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.cpp
new file mode 100644
index 0000000..d9c8816
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.cpp
@@ -0,0 +1,1038 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
+#include "DebuggerMessage.pb.h"
+#include <google/protobuf/stubs/once.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/wire_format_lite_inl.h>
+// @@protoc_insertion_point(includes)
+
+namespace GLESv2Debugger {
+
+void protobuf_ShutdownFile_DebuggerMessage_2eproto() {
+  delete Message::default_instance_;
+}
+
+void protobuf_AddDesc_DebuggerMessage_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  Message::default_instance_ = new Message();
+  Message::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_DebuggerMessage_2eproto);
+}
+
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_DebuggerMessage_2eproto {
+  StaticDescriptorInitializer_DebuggerMessage_2eproto() {
+    protobuf_AddDesc_DebuggerMessage_2eproto();
+  }
+} static_descriptor_initializer_DebuggerMessage_2eproto_;
+
+
+// ===================================================================
+
+bool Message_Function_IsValid(int value) {
+  switch(value) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 15:
+    case 16:
+    case 17:
+    case 18:
+    case 19:
+    case 20:
+    case 21:
+    case 22:
+    case 23:
+    case 24:
+    case 25:
+    case 26:
+    case 27:
+    case 28:
+    case 29:
+    case 30:
+    case 31:
+    case 32:
+    case 33:
+    case 34:
+    case 35:
+    case 36:
+    case 37:
+    case 38:
+    case 39:
+    case 40:
+    case 41:
+    case 42:
+    case 43:
+    case 44:
+    case 45:
+    case 46:
+    case 47:
+    case 48:
+    case 49:
+    case 50:
+    case 51:
+    case 52:
+    case 53:
+    case 54:
+    case 55:
+    case 56:
+    case 57:
+    case 58:
+    case 59:
+    case 60:
+    case 61:
+    case 62:
+    case 63:
+    case 64:
+    case 65:
+    case 66:
+    case 67:
+    case 68:
+    case 69:
+    case 70:
+    case 71:
+    case 72:
+    case 73:
+    case 74:
+    case 75:
+    case 76:
+    case 77:
+    case 78:
+    case 79:
+    case 80:
+    case 81:
+    case 82:
+    case 83:
+    case 84:
+    case 85:
+    case 86:
+    case 87:
+    case 88:
+    case 89:
+    case 90:
+    case 91:
+    case 92:
+    case 93:
+    case 94:
+    case 95:
+    case 96:
+    case 97:
+    case 98:
+    case 99:
+    case 100:
+    case 101:
+    case 102:
+    case 103:
+    case 104:
+    case 105:
+    case 106:
+    case 107:
+    case 108:
+    case 109:
+    case 110:
+    case 111:
+    case 112:
+    case 113:
+    case 114:
+    case 115:
+    case 116:
+    case 117:
+    case 118:
+    case 119:
+    case 120:
+    case 121:
+    case 122:
+    case 123:
+    case 124:
+    case 125:
+    case 126:
+    case 127:
+    case 128:
+    case 129:
+    case 130:
+    case 131:
+    case 132:
+    case 133:
+    case 134:
+    case 135:
+    case 136:
+    case 137:
+    case 138:
+    case 139:
+    case 140:
+    case 141:
+    case 142:
+    case 143:
+    case 144:
+    case 145:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#ifndef _MSC_VER
+const Message_Function Message::glActiveTexture;
+const Message_Function Message::glAttachShader;
+const Message_Function Message::glBindAttribLocation;
+const Message_Function Message::glBindBuffer;
+const Message_Function Message::glBindFramebuffer;
+const Message_Function Message::glBindRenderbuffer;
+const Message_Function Message::glBindTexture;
+const Message_Function Message::glBlendColor;
+const Message_Function Message::glBlendEquation;
+const Message_Function Message::glBlendEquationSeparate;
+const Message_Function Message::glBlendFunc;
+const Message_Function Message::glBlendFuncSeparate;
+const Message_Function Message::glBufferData;
+const Message_Function Message::glBufferSubData;
+const Message_Function Message::glCheckFramebufferStatus;
+const Message_Function Message::glClear;
+const Message_Function Message::glClearColor;
+const Message_Function Message::glClearDepthf;
+const Message_Function Message::glClearStencil;
+const Message_Function Message::glColorMask;
+const Message_Function Message::glCompileShader;
+const Message_Function Message::glCompressedTexImage2D;
+const Message_Function Message::glCompressedTexSubImage2D;
+const Message_Function Message::glCopyTexImage2D;
+const Message_Function Message::glCopyTexSubImage2D;
+const Message_Function Message::glCreateProgram;
+const Message_Function Message::glCreateShader;
+const Message_Function Message::glCullFace;
+const Message_Function Message::glDeleteBuffers;
+const Message_Function Message::glDeleteFramebuffers;
+const Message_Function Message::glDeleteProgram;
+const Message_Function Message::glDeleteRenderbuffers;
+const Message_Function Message::glDeleteShader;
+const Message_Function Message::glDeleteTextures;
+const Message_Function Message::glDepthFunc;
+const Message_Function Message::glDepthMask;
+const Message_Function Message::glDepthRangef;
+const Message_Function Message::glDetachShader;
+const Message_Function Message::glDisable;
+const Message_Function Message::glDisableVertexAttribArray;
+const Message_Function Message::glDrawArrays;
+const Message_Function Message::glDrawElements;
+const Message_Function Message::glEnable;
+const Message_Function Message::glEnableVertexAttribArray;
+const Message_Function Message::glFinish;
+const Message_Function Message::glFlush;
+const Message_Function Message::glFramebufferRenderbuffer;
+const Message_Function Message::glFramebufferTexture2D;
+const Message_Function Message::glFrontFace;
+const Message_Function Message::glGenBuffers;
+const Message_Function Message::glGenerateMipmap;
+const Message_Function Message::glGenFramebuffers;
+const Message_Function Message::glGenRenderbuffers;
+const Message_Function Message::glGenTextures;
+const Message_Function Message::glGetActiveAttrib;
+const Message_Function Message::glGetActiveUniform;
+const Message_Function Message::glGetAttachedShaders;
+const Message_Function Message::glGetAttribLocation;
+const Message_Function Message::glGetBooleanv;
+const Message_Function Message::glGetBufferParameteriv;
+const Message_Function Message::glGetError;
+const Message_Function Message::glGetFloatv;
+const Message_Function Message::glGetFramebufferAttachmentParameteriv;
+const Message_Function Message::glGetIntegerv;
+const Message_Function Message::glGetProgramiv;
+const Message_Function Message::glGetProgramInfoLog;
+const Message_Function Message::glGetRenderbufferParameteriv;
+const Message_Function Message::glGetShaderiv;
+const Message_Function Message::glGetShaderInfoLog;
+const Message_Function Message::glGetShaderPrecisionFormat;
+const Message_Function Message::glGetShaderSource;
+const Message_Function Message::glGetString;
+const Message_Function Message::glGetTexParameterfv;
+const Message_Function Message::glGetTexParameteriv;
+const Message_Function Message::glGetUniformfv;
+const Message_Function Message::glGetUniformiv;
+const Message_Function Message::glGetUniformLocation;
+const Message_Function Message::glGetVertexAttribfv;
+const Message_Function Message::glGetVertexAttribiv;
+const Message_Function Message::glGetVertexAttribPointerv;
+const Message_Function Message::glHint;
+const Message_Function Message::glIsBuffer;
+const Message_Function Message::glIsEnabled;
+const Message_Function Message::glIsFramebuffer;
+const Message_Function Message::glIsProgram;
+const Message_Function Message::glIsRenderbuffer;
+const Message_Function Message::glIsShader;
+const Message_Function Message::glIsTexture;
+const Message_Function Message::glLineWidth;
+const Message_Function Message::glLinkProgram;
+const Message_Function Message::glPixelStorei;
+const Message_Function Message::glPolygonOffset;
+const Message_Function Message::glReadPixels;
+const Message_Function Message::glReleaseShaderCompiler;
+const Message_Function Message::glRenderbufferStorage;
+const Message_Function Message::glSampleCoverage;
+const Message_Function Message::glScissor;
+const Message_Function Message::glShaderBinary;
+const Message_Function Message::glShaderSource;
+const Message_Function Message::glStencilFunc;
+const Message_Function Message::glStencilFuncSeparate;
+const Message_Function Message::glStencilMask;
+const Message_Function Message::glStencilMaskSeparate;
+const Message_Function Message::glStencilOp;
+const Message_Function Message::glStencilOpSeparate;
+const Message_Function Message::glTexImage2D;
+const Message_Function Message::glTexParameterf;
+const Message_Function Message::glTexParameterfv;
+const Message_Function Message::glTexParameteri;
+const Message_Function Message::glTexParameteriv;
+const Message_Function Message::glTexSubImage2D;
+const Message_Function Message::glUniform1f;
+const Message_Function Message::glUniform1fv;
+const Message_Function Message::glUniform1i;
+const Message_Function Message::glUniform1iv;
+const Message_Function Message::glUniform2f;
+const Message_Function Message::glUniform2fv;
+const Message_Function Message::glUniform2i;
+const Message_Function Message::glUniform2iv;
+const Message_Function Message::glUniform3f;
+const Message_Function Message::glUniform3fv;
+const Message_Function Message::glUniform3i;
+const Message_Function Message::glUniform3iv;
+const Message_Function Message::glUniform4f;
+const Message_Function Message::glUniform4fv;
+const Message_Function Message::glUniform4i;
+const Message_Function Message::glUniform4iv;
+const Message_Function Message::glUniformMatrix2fv;
+const Message_Function Message::glUniformMatrix3fv;
+const Message_Function Message::glUniformMatrix4fv;
+const Message_Function Message::glUseProgram;
+const Message_Function Message::glValidateProgram;
+const Message_Function Message::glVertexAttrib1f;
+const Message_Function Message::glVertexAttrib1fv;
+const Message_Function Message::glVertexAttrib2f;
+const Message_Function Message::glVertexAttrib2fv;
+const Message_Function Message::glVertexAttrib3f;
+const Message_Function Message::glVertexAttrib3fv;
+const Message_Function Message::glVertexAttrib4f;
+const Message_Function Message::glVertexAttrib4fv;
+const Message_Function Message::glVertexAttribPointer;
+const Message_Function Message::glViewport;
+const Message_Function Message::ACK;
+const Message_Function Message::NEG;
+const Message_Function Message::CONTINUE;
+const Message_Function Message::SKIP;
+const Message_Function Message::Function_MIN;
+const Message_Function Message::Function_MAX;
+const int Message::Function_ARRAYSIZE;
+#endif  // _MSC_VER
+const ::std::string Message::_default_data_;
+#ifndef _MSC_VER
+const int Message::kContextIdFieldNumber;
+const int Message::kFunctionFieldNumber;
+const int Message::kHasNextMessageFieldNumber;
+const int Message::kExpectResponseFieldNumber;
+const int Message::kRetFieldNumber;
+const int Message::kArg0FieldNumber;
+const int Message::kArg1FieldNumber;
+const int Message::kArg2FieldNumber;
+const int Message::kArg3FieldNumber;
+const int Message::kArg4FieldNumber;
+const int Message::kArg5FieldNumber;
+const int Message::kArg6FieldNumber;
+const int Message::kArg7FieldNumber;
+const int Message::kArg8FieldNumber;
+const int Message::kDataFieldNumber;
+const int Message::kTimeFieldNumber;
+#endif  // !_MSC_VER
+
+Message::Message()
+  : ::google::protobuf::MessageLite() {
+  SharedCtor();
+}
+
+void Message::InitAsDefaultInstance() {
+}
+
+Message::Message(const Message& from)
+  : ::google::protobuf::MessageLite() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void Message::SharedCtor() {
+  _cached_size_ = 0;
+  context_id_ = 0;
+  function_ = 143;
+  has_next_message_ = false;
+  expect_response_ = false;
+  ret_ = 0;
+  arg0_ = 0;
+  arg1_ = 0;
+  arg2_ = 0;
+  arg3_ = 0;
+  arg4_ = 0;
+  arg5_ = 0;
+  arg6_ = 0;
+  arg7_ = 0;
+  arg8_ = 0;
+  data_ = const_cast< ::std::string*>(&_default_data_);
+  time_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+Message::~Message() {
+  SharedDtor();
+}
+
+void Message::SharedDtor() {
+  if (data_ != &_default_data_) {
+    delete data_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void Message::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const Message& Message::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_DebuggerMessage_2eproto();  return *default_instance_;
+}
+
+Message* Message::default_instance_ = NULL;
+
+Message* Message::New() const {
+  return new Message;
+}
+
+void Message::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    context_id_ = 0;
+    function_ = 143;
+    has_next_message_ = false;
+    expect_response_ = false;
+    ret_ = 0;
+    arg0_ = 0;
+    arg1_ = 0;
+    arg2_ = 0;
+  }
+  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    arg3_ = 0;
+    arg4_ = 0;
+    arg5_ = 0;
+    arg6_ = 0;
+    arg7_ = 0;
+    arg8_ = 0;
+    if (_has_bit(14)) {
+      if (data_ != &_default_data_) {
+        data_->clear();
+      }
+    }
+    time_ = 0;
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+bool Message::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required int32 context_id = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &context_id_)));
+          _set_bit(0);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_function;
+        break;
+      }
+      
+      // required .GLESv2Debugger.Message.Function function = 2 [default = NEG];
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_function:
+          int value;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          if (::GLESv2Debugger::Message_Function_IsValid(value)) {
+            set_function(static_cast< ::GLESv2Debugger::Message_Function >(value));
+          }
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(24)) goto parse_has_next_message;
+        break;
+      }
+      
+      // required bool has_next_message = 3;
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_has_next_message:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &has_next_message_)));
+          _set_bit(2);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(32)) goto parse_expect_response;
+        break;
+      }
+      
+      // required bool expect_response = 4;
+      case 4: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_expect_response:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &expect_response_)));
+          _set_bit(3);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(40)) goto parse_ret;
+        break;
+      }
+      
+      // optional int32 ret = 5;
+      case 5: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_ret:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &ret_)));
+          _set_bit(4);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(48)) goto parse_arg0;
+        break;
+      }
+      
+      // optional int32 arg0 = 6;
+      case 6: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg0:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg0_)));
+          _set_bit(5);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(56)) goto parse_arg1;
+        break;
+      }
+      
+      // optional int32 arg1 = 7;
+      case 7: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg1:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg1_)));
+          _set_bit(6);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(64)) goto parse_arg2;
+        break;
+      }
+      
+      // optional int32 arg2 = 8;
+      case 8: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg2:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg2_)));
+          _set_bit(7);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(72)) goto parse_arg3;
+        break;
+      }
+      
+      // optional int32 arg3 = 9;
+      case 9: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg3:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg3_)));
+          _set_bit(8);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(82)) goto parse_data;
+        break;
+      }
+      
+      // optional bytes data = 10;
+      case 10: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_data:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(
+                input, this->mutable_data()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(93)) goto parse_time;
+        break;
+      }
+      
+      // optional float time = 11;
+      case 11: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) {
+         parse_time:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
+                 input, &time_)));
+          _set_bit(15);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(128)) goto parse_arg4;
+        break;
+      }
+      
+      // optional int32 arg4 = 16;
+      case 16: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg4:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg4_)));
+          _set_bit(9);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(136)) goto parse_arg5;
+        break;
+      }
+      
+      // optional int32 arg5 = 17;
+      case 17: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg5:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg5_)));
+          _set_bit(10);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(144)) goto parse_arg6;
+        break;
+      }
+      
+      // optional int32 arg6 = 18;
+      case 18: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg6:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg6_)));
+          _set_bit(11);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(152)) goto parse_arg7;
+        break;
+      }
+      
+      // optional int32 arg7 = 19;
+      case 19: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg7:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg7_)));
+          _set_bit(12);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(160)) goto parse_arg8;
+        break;
+      }
+      
+      // optional int32 arg8 = 20;
+      case 20: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_arg8:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &arg8_)));
+          _set_bit(13);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void Message::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required int32 context_id = 1;
+  if (_has_bit(0)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->context_id(), output);
+  }
+  
+  // required .GLESv2Debugger.Message.Function function = 2 [default = NEG];
+  if (_has_bit(1)) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->function(), output);
+  }
+  
+  // required bool has_next_message = 3;
+  if (_has_bit(2)) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->has_next_message(), output);
+  }
+  
+  // required bool expect_response = 4;
+  if (_has_bit(3)) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->expect_response(), output);
+  }
+  
+  // optional int32 ret = 5;
+  if (_has_bit(4)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(5, this->ret(), output);
+  }
+  
+  // optional int32 arg0 = 6;
+  if (_has_bit(5)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(6, this->arg0(), output);
+  }
+  
+  // optional int32 arg1 = 7;
+  if (_has_bit(6)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(7, this->arg1(), output);
+  }
+  
+  // optional int32 arg2 = 8;
+  if (_has_bit(7)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(8, this->arg2(), output);
+  }
+  
+  // optional int32 arg3 = 9;
+  if (_has_bit(8)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(9, this->arg3(), output);
+  }
+  
+  // optional bytes data = 10;
+  if (_has_bit(14)) {
+    ::google::protobuf::internal::WireFormatLite::WriteBytes(
+      10, this->data(), output);
+  }
+  
+  // optional float time = 11;
+  if (_has_bit(15)) {
+    ::google::protobuf::internal::WireFormatLite::WriteFloat(11, this->time(), output);
+  }
+  
+  // optional int32 arg4 = 16;
+  if (_has_bit(9)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(16, this->arg4(), output);
+  }
+  
+  // optional int32 arg5 = 17;
+  if (_has_bit(10)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(17, this->arg5(), output);
+  }
+  
+  // optional int32 arg6 = 18;
+  if (_has_bit(11)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(18, this->arg6(), output);
+  }
+  
+  // optional int32 arg7 = 19;
+  if (_has_bit(12)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(19, this->arg7(), output);
+  }
+  
+  // optional int32 arg8 = 20;
+  if (_has_bit(13)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(20, this->arg8(), output);
+  }
+  
+}
+
+int Message::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required int32 context_id = 1;
+    if (has_context_id()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->context_id());
+    }
+    
+    // required .GLESv2Debugger.Message.Function function = 2 [default = NEG];
+    if (has_function()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::EnumSize(this->function());
+    }
+    
+    // required bool has_next_message = 3;
+    if (has_has_next_message()) {
+      total_size += 1 + 1;
+    }
+    
+    // required bool expect_response = 4;
+    if (has_expect_response()) {
+      total_size += 1 + 1;
+    }
+    
+    // optional int32 ret = 5;
+    if (has_ret()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->ret());
+    }
+    
+    // optional int32 arg0 = 6;
+    if (has_arg0()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg0());
+    }
+    
+    // optional int32 arg1 = 7;
+    if (has_arg1()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg1());
+    }
+    
+    // optional int32 arg2 = 8;
+    if (has_arg2()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg2());
+    }
+    
+  }
+  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    // optional int32 arg3 = 9;
+    if (has_arg3()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg3());
+    }
+    
+    // optional int32 arg4 = 16;
+    if (has_arg4()) {
+      total_size += 2 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg4());
+    }
+    
+    // optional int32 arg5 = 17;
+    if (has_arg5()) {
+      total_size += 2 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg5());
+    }
+    
+    // optional int32 arg6 = 18;
+    if (has_arg6()) {
+      total_size += 2 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg6());
+    }
+    
+    // optional int32 arg7 = 19;
+    if (has_arg7()) {
+      total_size += 2 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg7());
+    }
+    
+    // optional int32 arg8 = 20;
+    if (has_arg8()) {
+      total_size += 2 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->arg8());
+    }
+    
+    // optional bytes data = 10;
+    if (has_data()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::BytesSize(
+          this->data());
+    }
+    
+    // optional float time = 11;
+    if (has_time()) {
+      total_size += 1 + 4;
+    }
+    
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void Message::CheckTypeAndMergeFrom(
+    const ::google::protobuf::MessageLite& from) {
+  MergeFrom(*::google::protobuf::down_cast<const Message*>(&from));
+}
+
+void Message::MergeFrom(const Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from._has_bit(0)) {
+      set_context_id(from.context_id());
+    }
+    if (from._has_bit(1)) {
+      set_function(from.function());
+    }
+    if (from._has_bit(2)) {
+      set_has_next_message(from.has_next_message());
+    }
+    if (from._has_bit(3)) {
+      set_expect_response(from.expect_response());
+    }
+    if (from._has_bit(4)) {
+      set_ret(from.ret());
+    }
+    if (from._has_bit(5)) {
+      set_arg0(from.arg0());
+    }
+    if (from._has_bit(6)) {
+      set_arg1(from.arg1());
+    }
+    if (from._has_bit(7)) {
+      set_arg2(from.arg2());
+    }
+  }
+  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {
+    if (from._has_bit(8)) {
+      set_arg3(from.arg3());
+    }
+    if (from._has_bit(9)) {
+      set_arg4(from.arg4());
+    }
+    if (from._has_bit(10)) {
+      set_arg5(from.arg5());
+    }
+    if (from._has_bit(11)) {
+      set_arg6(from.arg6());
+    }
+    if (from._has_bit(12)) {
+      set_arg7(from.arg7());
+    }
+    if (from._has_bit(13)) {
+      set_arg8(from.arg8());
+    }
+    if (from._has_bit(14)) {
+      set_data(from.data());
+    }
+    if (from._has_bit(15)) {
+      set_time(from.time());
+    }
+  }
+}
+
+void Message::CopyFrom(const Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool Message::IsInitialized() const {
+  if ((_has_bits_[0] & 0x0000000f) != 0x0000000f) return false;
+  
+  return true;
+}
+
+void Message::Swap(Message* other) {
+  if (other != this) {
+    std::swap(context_id_, other->context_id_);
+    std::swap(function_, other->function_);
+    std::swap(has_next_message_, other->has_next_message_);
+    std::swap(expect_response_, other->expect_response_);
+    std::swap(ret_, other->ret_);
+    std::swap(arg0_, other->arg0_);
+    std::swap(arg1_, other->arg1_);
+    std::swap(arg2_, other->arg2_);
+    std::swap(arg3_, other->arg3_);
+    std::swap(arg4_, other->arg4_);
+    std::swap(arg5_, other->arg5_);
+    std::swap(arg6_, other->arg6_);
+    std::swap(arg7_, other->arg7_);
+    std::swap(arg8_, other->arg8_);
+    std::swap(data_, other->data_);
+    std::swap(time_, other->time_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::std::string Message::GetTypeName() const {
+  return "GLESv2Debugger.Message";
+}
+
+
+// @@protoc_insertion_point(namespace_scope)
+
+}  // namespace GLESv2Debugger
+
+// @@protoc_insertion_point(global_scope)
diff --git a/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.h b/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.h
new file mode 100644
index 0000000..e9b4142
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/DebuggerMessage.pb.h
@@ -0,0 +1,844 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: DebuggerMessage.proto
+
+#ifndef PROTOBUF_DebuggerMessage_2eproto__INCLUDED
+#define PROTOBUF_DebuggerMessage_2eproto__INCLUDED
+
+#include <string>
+
+#include <google/protobuf/stubs/common.h>
+
+#if GOOGLE_PROTOBUF_VERSION < 2003000
+#error This file was generated by a newer version of protoc which is
+#error incompatible with your Protocol Buffer headers.  Please update
+#error your headers.
+#endif
+#if 2003000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#error This file was generated by an older version of protoc which is
+#error incompatible with your Protocol Buffer headers.  Please
+#error regenerate this file with a newer version of protoc.
+#endif
+
+#include <google/protobuf/generated_message_util.h>
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
+// @@protoc_insertion_point(includes)
+
+namespace GLESv2Debugger {
+
+// Internal implementation detail -- do not call these.
+void  protobuf_AddDesc_DebuggerMessage_2eproto();
+void protobuf_AssignDesc_DebuggerMessage_2eproto();
+void protobuf_ShutdownFile_DebuggerMessage_2eproto();
+
+class Message;
+
+enum Message_Function {
+  Message_Function_glActiveTexture = 0,
+  Message_Function_glAttachShader = 1,
+  Message_Function_glBindAttribLocation = 2,
+  Message_Function_glBindBuffer = 3,
+  Message_Function_glBindFramebuffer = 4,
+  Message_Function_glBindRenderbuffer = 5,
+  Message_Function_glBindTexture = 6,
+  Message_Function_glBlendColor = 7,
+  Message_Function_glBlendEquation = 8,
+  Message_Function_glBlendEquationSeparate = 9,
+  Message_Function_glBlendFunc = 10,
+  Message_Function_glBlendFuncSeparate = 11,
+  Message_Function_glBufferData = 12,
+  Message_Function_glBufferSubData = 13,
+  Message_Function_glCheckFramebufferStatus = 14,
+  Message_Function_glClear = 15,
+  Message_Function_glClearColor = 16,
+  Message_Function_glClearDepthf = 17,
+  Message_Function_glClearStencil = 18,
+  Message_Function_glColorMask = 19,
+  Message_Function_glCompileShader = 20,
+  Message_Function_glCompressedTexImage2D = 21,
+  Message_Function_glCompressedTexSubImage2D = 22,
+  Message_Function_glCopyTexImage2D = 23,
+  Message_Function_glCopyTexSubImage2D = 24,
+  Message_Function_glCreateProgram = 25,
+  Message_Function_glCreateShader = 26,
+  Message_Function_glCullFace = 27,
+  Message_Function_glDeleteBuffers = 28,
+  Message_Function_glDeleteFramebuffers = 29,
+  Message_Function_glDeleteProgram = 30,
+  Message_Function_glDeleteRenderbuffers = 31,
+  Message_Function_glDeleteShader = 32,
+  Message_Function_glDeleteTextures = 33,
+  Message_Function_glDepthFunc = 34,
+  Message_Function_glDepthMask = 35,
+  Message_Function_glDepthRangef = 36,
+  Message_Function_glDetachShader = 37,
+  Message_Function_glDisable = 38,
+  Message_Function_glDisableVertexAttribArray = 39,
+  Message_Function_glDrawArrays = 40,
+  Message_Function_glDrawElements = 41,
+  Message_Function_glEnable = 42,
+  Message_Function_glEnableVertexAttribArray = 43,
+  Message_Function_glFinish = 44,
+  Message_Function_glFlush = 45,
+  Message_Function_glFramebufferRenderbuffer = 46,
+  Message_Function_glFramebufferTexture2D = 47,
+  Message_Function_glFrontFace = 48,
+  Message_Function_glGenBuffers = 49,
+  Message_Function_glGenerateMipmap = 50,
+  Message_Function_glGenFramebuffers = 51,
+  Message_Function_glGenRenderbuffers = 52,
+  Message_Function_glGenTextures = 53,
+  Message_Function_glGetActiveAttrib = 54,
+  Message_Function_glGetActiveUniform = 55,
+  Message_Function_glGetAttachedShaders = 56,
+  Message_Function_glGetAttribLocation = 57,
+  Message_Function_glGetBooleanv = 58,
+  Message_Function_glGetBufferParameteriv = 59,
+  Message_Function_glGetError = 60,
+  Message_Function_glGetFloatv = 61,
+  Message_Function_glGetFramebufferAttachmentParameteriv = 62,
+  Message_Function_glGetIntegerv = 63,
+  Message_Function_glGetProgramiv = 64,
+  Message_Function_glGetProgramInfoLog = 65,
+  Message_Function_glGetRenderbufferParameteriv = 66,
+  Message_Function_glGetShaderiv = 67,
+  Message_Function_glGetShaderInfoLog = 68,
+  Message_Function_glGetShaderPrecisionFormat = 69,
+  Message_Function_glGetShaderSource = 70,
+  Message_Function_glGetString = 71,
+  Message_Function_glGetTexParameterfv = 72,
+  Message_Function_glGetTexParameteriv = 73,
+  Message_Function_glGetUniformfv = 74,
+  Message_Function_glGetUniformiv = 75,
+  Message_Function_glGetUniformLocation = 76,
+  Message_Function_glGetVertexAttribfv = 77,
+  Message_Function_glGetVertexAttribiv = 78,
+  Message_Function_glGetVertexAttribPointerv = 79,
+  Message_Function_glHint = 80,
+  Message_Function_glIsBuffer = 81,
+  Message_Function_glIsEnabled = 82,
+  Message_Function_glIsFramebuffer = 83,
+  Message_Function_glIsProgram = 84,
+  Message_Function_glIsRenderbuffer = 85,
+  Message_Function_glIsShader = 86,
+  Message_Function_glIsTexture = 87,
+  Message_Function_glLineWidth = 88,
+  Message_Function_glLinkProgram = 89,
+  Message_Function_glPixelStorei = 90,
+  Message_Function_glPolygonOffset = 91,
+  Message_Function_glReadPixels = 92,
+  Message_Function_glReleaseShaderCompiler = 93,
+  Message_Function_glRenderbufferStorage = 94,
+  Message_Function_glSampleCoverage = 95,
+  Message_Function_glScissor = 96,
+  Message_Function_glShaderBinary = 97,
+  Message_Function_glShaderSource = 98,
+  Message_Function_glStencilFunc = 99,
+  Message_Function_glStencilFuncSeparate = 100,
+  Message_Function_glStencilMask = 101,
+  Message_Function_glStencilMaskSeparate = 102,
+  Message_Function_glStencilOp = 103,
+  Message_Function_glStencilOpSeparate = 104,
+  Message_Function_glTexImage2D = 105,
+  Message_Function_glTexParameterf = 106,
+  Message_Function_glTexParameterfv = 107,
+  Message_Function_glTexParameteri = 108,
+  Message_Function_glTexParameteriv = 109,
+  Message_Function_glTexSubImage2D = 110,
+  Message_Function_glUniform1f = 111,
+  Message_Function_glUniform1fv = 112,
+  Message_Function_glUniform1i = 113,
+  Message_Function_glUniform1iv = 114,
+  Message_Function_glUniform2f = 115,
+  Message_Function_glUniform2fv = 116,
+  Message_Function_glUniform2i = 117,
+  Message_Function_glUniform2iv = 118,
+  Message_Function_glUniform3f = 119,
+  Message_Function_glUniform3fv = 120,
+  Message_Function_glUniform3i = 121,
+  Message_Function_glUniform3iv = 122,
+  Message_Function_glUniform4f = 123,
+  Message_Function_glUniform4fv = 124,
+  Message_Function_glUniform4i = 125,
+  Message_Function_glUniform4iv = 126,
+  Message_Function_glUniformMatrix2fv = 127,
+  Message_Function_glUniformMatrix3fv = 128,
+  Message_Function_glUniformMatrix4fv = 129,
+  Message_Function_glUseProgram = 130,
+  Message_Function_glValidateProgram = 131,
+  Message_Function_glVertexAttrib1f = 132,
+  Message_Function_glVertexAttrib1fv = 133,
+  Message_Function_glVertexAttrib2f = 134,
+  Message_Function_glVertexAttrib2fv = 135,
+  Message_Function_glVertexAttrib3f = 136,
+  Message_Function_glVertexAttrib3fv = 137,
+  Message_Function_glVertexAttrib4f = 138,
+  Message_Function_glVertexAttrib4fv = 139,
+  Message_Function_glVertexAttribPointer = 140,
+  Message_Function_glViewport = 141,
+  Message_Function_ACK = 142,
+  Message_Function_NEG = 143,
+  Message_Function_CONTINUE = 144,
+  Message_Function_SKIP = 145
+};
+bool Message_Function_IsValid(int value);
+const Message_Function Message_Function_Function_MIN = Message_Function_glActiveTexture;
+const Message_Function Message_Function_Function_MAX = Message_Function_SKIP;
+const int Message_Function_Function_ARRAYSIZE = Message_Function_Function_MAX + 1;
+
+// ===================================================================
+
+class Message : public ::google::protobuf::MessageLite {
+ public:
+  Message();
+  virtual ~Message();
+  
+  Message(const Message& from);
+  
+  inline Message& operator=(const Message& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  static const Message& default_instance();
+  
+  void Swap(Message* other);
+  
+  // implements Message ----------------------------------------------
+  
+  Message* New() const;
+  void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
+  void CopyFrom(const Message& from);
+  void MergeFrom(const Message& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::std::string GetTypeName() const;
+  
+  // nested types ----------------------------------------------------
+  
+  typedef Message_Function Function;
+  static const Function glActiveTexture = Message_Function_glActiveTexture;
+  static const Function glAttachShader = Message_Function_glAttachShader;
+  static const Function glBindAttribLocation = Message_Function_glBindAttribLocation;
+  static const Function glBindBuffer = Message_Function_glBindBuffer;
+  static const Function glBindFramebuffer = Message_Function_glBindFramebuffer;
+  static const Function glBindRenderbuffer = Message_Function_glBindRenderbuffer;
+  static const Function glBindTexture = Message_Function_glBindTexture;
+  static const Function glBlendColor = Message_Function_glBlendColor;
+  static const Function glBlendEquation = Message_Function_glBlendEquation;
+  static const Function glBlendEquationSeparate = Message_Function_glBlendEquationSeparate;
+  static const Function glBlendFunc = Message_Function_glBlendFunc;
+  static const Function glBlendFuncSeparate = Message_Function_glBlendFuncSeparate;
+  static const Function glBufferData = Message_Function_glBufferData;
+  static const Function glBufferSubData = Message_Function_glBufferSubData;
+  static const Function glCheckFramebufferStatus = Message_Function_glCheckFramebufferStatus;
+  static const Function glClear = Message_Function_glClear;
+  static const Function glClearColor = Message_Function_glClearColor;
+  static const Function glClearDepthf = Message_Function_glClearDepthf;
+  static const Function glClearStencil = Message_Function_glClearStencil;
+  static const Function glColorMask = Message_Function_glColorMask;
+  static const Function glCompileShader = Message_Function_glCompileShader;
+  static const Function glCompressedTexImage2D = Message_Function_glCompressedTexImage2D;
+  static const Function glCompressedTexSubImage2D = Message_Function_glCompressedTexSubImage2D;
+  static const Function glCopyTexImage2D = Message_Function_glCopyTexImage2D;
+  static const Function glCopyTexSubImage2D = Message_Function_glCopyTexSubImage2D;
+  static const Function glCreateProgram = Message_Function_glCreateProgram;
+  static const Function glCreateShader = Message_Function_glCreateShader;
+  static const Function glCullFace = Message_Function_glCullFace;
+  static const Function glDeleteBuffers = Message_Function_glDeleteBuffers;
+  static const Function glDeleteFramebuffers = Message_Function_glDeleteFramebuffers;
+  static const Function glDeleteProgram = Message_Function_glDeleteProgram;
+  static const Function glDeleteRenderbuffers = Message_Function_glDeleteRenderbuffers;
+  static const Function glDeleteShader = Message_Function_glDeleteShader;
+  static const Function glDeleteTextures = Message_Function_glDeleteTextures;
+  static const Function glDepthFunc = Message_Function_glDepthFunc;
+  static const Function glDepthMask = Message_Function_glDepthMask;
+  static const Function glDepthRangef = Message_Function_glDepthRangef;
+  static const Function glDetachShader = Message_Function_glDetachShader;
+  static const Function glDisable = Message_Function_glDisable;
+  static const Function glDisableVertexAttribArray = Message_Function_glDisableVertexAttribArray;
+  static const Function glDrawArrays = Message_Function_glDrawArrays;
+  static const Function glDrawElements = Message_Function_glDrawElements;
+  static const Function glEnable = Message_Function_glEnable;
+  static const Function glEnableVertexAttribArray = Message_Function_glEnableVertexAttribArray;
+  static const Function glFinish = Message_Function_glFinish;
+  static const Function glFlush = Message_Function_glFlush;
+  static const Function glFramebufferRenderbuffer = Message_Function_glFramebufferRenderbuffer;
+  static const Function glFramebufferTexture2D = Message_Function_glFramebufferTexture2D;
+  static const Function glFrontFace = Message_Function_glFrontFace;
+  static const Function glGenBuffers = Message_Function_glGenBuffers;
+  static const Function glGenerateMipmap = Message_Function_glGenerateMipmap;
+  static const Function glGenFramebuffers = Message_Function_glGenFramebuffers;
+  static const Function glGenRenderbuffers = Message_Function_glGenRenderbuffers;
+  static const Function glGenTextures = Message_Function_glGenTextures;
+  static const Function glGetActiveAttrib = Message_Function_glGetActiveAttrib;
+  static const Function glGetActiveUniform = Message_Function_glGetActiveUniform;
+  static const Function glGetAttachedShaders = Message_Function_glGetAttachedShaders;
+  static const Function glGetAttribLocation = Message_Function_glGetAttribLocation;
+  static const Function glGetBooleanv = Message_Function_glGetBooleanv;
+  static const Function glGetBufferParameteriv = Message_Function_glGetBufferParameteriv;
+  static const Function glGetError = Message_Function_glGetError;
+  static const Function glGetFloatv = Message_Function_glGetFloatv;
+  static const Function glGetFramebufferAttachmentParameteriv = Message_Function_glGetFramebufferAttachmentParameteriv;
+  static const Function glGetIntegerv = Message_Function_glGetIntegerv;
+  static const Function glGetProgramiv = Message_Function_glGetProgramiv;
+  static const Function glGetProgramInfoLog = Message_Function_glGetProgramInfoLog;
+  static const Function glGetRenderbufferParameteriv = Message_Function_glGetRenderbufferParameteriv;
+  static const Function glGetShaderiv = Message_Function_glGetShaderiv;
+  static const Function glGetShaderInfoLog = Message_Function_glGetShaderInfoLog;
+  static const Function glGetShaderPrecisionFormat = Message_Function_glGetShaderPrecisionFormat;
+  static const Function glGetShaderSource = Message_Function_glGetShaderSource;
+  static const Function glGetString = Message_Function_glGetString;
+  static const Function glGetTexParameterfv = Message_Function_glGetTexParameterfv;
+  static const Function glGetTexParameteriv = Message_Function_glGetTexParameteriv;
+  static const Function glGetUniformfv = Message_Function_glGetUniformfv;
+  static const Function glGetUniformiv = Message_Function_glGetUniformiv;
+  static const Function glGetUniformLocation = Message_Function_glGetUniformLocation;
+  static const Function glGetVertexAttribfv = Message_Function_glGetVertexAttribfv;
+  static const Function glGetVertexAttribiv = Message_Function_glGetVertexAttribiv;
+  static const Function glGetVertexAttribPointerv = Message_Function_glGetVertexAttribPointerv;
+  static const Function glHint = Message_Function_glHint;
+  static const Function glIsBuffer = Message_Function_glIsBuffer;
+  static const Function glIsEnabled = Message_Function_glIsEnabled;
+  static const Function glIsFramebuffer = Message_Function_glIsFramebuffer;
+  static const Function glIsProgram = Message_Function_glIsProgram;
+  static const Function glIsRenderbuffer = Message_Function_glIsRenderbuffer;
+  static const Function glIsShader = Message_Function_glIsShader;
+  static const Function glIsTexture = Message_Function_glIsTexture;
+  static const Function glLineWidth = Message_Function_glLineWidth;
+  static const Function glLinkProgram = Message_Function_glLinkProgram;
+  static const Function glPixelStorei = Message_Function_glPixelStorei;
+  static const Function glPolygonOffset = Message_Function_glPolygonOffset;
+  static const Function glReadPixels = Message_Function_glReadPixels;
+  static const Function glReleaseShaderCompiler = Message_Function_glReleaseShaderCompiler;
+  static const Function glRenderbufferStorage = Message_Function_glRenderbufferStorage;
+  static const Function glSampleCoverage = Message_Function_glSampleCoverage;
+  static const Function glScissor = Message_Function_glScissor;
+  static const Function glShaderBinary = Message_Function_glShaderBinary;
+  static const Function glShaderSource = Message_Function_glShaderSource;
+  static const Function glStencilFunc = Message_Function_glStencilFunc;
+  static const Function glStencilFuncSeparate = Message_Function_glStencilFuncSeparate;
+  static const Function glStencilMask = Message_Function_glStencilMask;
+  static const Function glStencilMaskSeparate = Message_Function_glStencilMaskSeparate;
+  static const Function glStencilOp = Message_Function_glStencilOp;
+  static const Function glStencilOpSeparate = Message_Function_glStencilOpSeparate;
+  static const Function glTexImage2D = Message_Function_glTexImage2D;
+  static const Function glTexParameterf = Message_Function_glTexParameterf;
+  static const Function glTexParameterfv = Message_Function_glTexParameterfv;
+  static const Function glTexParameteri = Message_Function_glTexParameteri;
+  static const Function glTexParameteriv = Message_Function_glTexParameteriv;
+  static const Function glTexSubImage2D = Message_Function_glTexSubImage2D;
+  static const Function glUniform1f = Message_Function_glUniform1f;
+  static const Function glUniform1fv = Message_Function_glUniform1fv;
+  static const Function glUniform1i = Message_Function_glUniform1i;
+  static const Function glUniform1iv = Message_Function_glUniform1iv;
+  static const Function glUniform2f = Message_Function_glUniform2f;
+  static const Function glUniform2fv = Message_Function_glUniform2fv;
+  static const Function glUniform2i = Message_Function_glUniform2i;
+  static const Function glUniform2iv = Message_Function_glUniform2iv;
+  static const Function glUniform3f = Message_Function_glUniform3f;
+  static const Function glUniform3fv = Message_Function_glUniform3fv;
+  static const Function glUniform3i = Message_Function_glUniform3i;
+  static const Function glUniform3iv = Message_Function_glUniform3iv;
+  static const Function glUniform4f = Message_Function_glUniform4f;
+  static const Function glUniform4fv = Message_Function_glUniform4fv;
+  static const Function glUniform4i = Message_Function_glUniform4i;
+  static const Function glUniform4iv = Message_Function_glUniform4iv;
+  static const Function glUniformMatrix2fv = Message_Function_glUniformMatrix2fv;
+  static const Function glUniformMatrix3fv = Message_Function_glUniformMatrix3fv;
+  static const Function glUniformMatrix4fv = Message_Function_glUniformMatrix4fv;
+  static const Function glUseProgram = Message_Function_glUseProgram;
+  static const Function glValidateProgram = Message_Function_glValidateProgram;
+  static const Function glVertexAttrib1f = Message_Function_glVertexAttrib1f;
+  static const Function glVertexAttrib1fv = Message_Function_glVertexAttrib1fv;
+  static const Function glVertexAttrib2f = Message_Function_glVertexAttrib2f;
+  static const Function glVertexAttrib2fv = Message_Function_glVertexAttrib2fv;
+  static const Function glVertexAttrib3f = Message_Function_glVertexAttrib3f;
+  static const Function glVertexAttrib3fv = Message_Function_glVertexAttrib3fv;
+  static const Function glVertexAttrib4f = Message_Function_glVertexAttrib4f;
+  static const Function glVertexAttrib4fv = Message_Function_glVertexAttrib4fv;
+  static const Function glVertexAttribPointer = Message_Function_glVertexAttribPointer;
+  static const Function glViewport = Message_Function_glViewport;
+  static const Function ACK = Message_Function_ACK;
+  static const Function NEG = Message_Function_NEG;
+  static const Function CONTINUE = Message_Function_CONTINUE;
+  static const Function SKIP = Message_Function_SKIP;
+  static inline bool Function_IsValid(int value) {
+    return Message_Function_IsValid(value);
+  }
+  static const Function Function_MIN =
+    Message_Function_Function_MIN;
+  static const Function Function_MAX =
+    Message_Function_Function_MAX;
+  static const int Function_ARRAYSIZE =
+    Message_Function_Function_ARRAYSIZE;
+  
+  // accessors -------------------------------------------------------
+  
+  // required int32 context_id = 1;
+  inline bool has_context_id() const;
+  inline void clear_context_id();
+  static const int kContextIdFieldNumber = 1;
+  inline ::google::protobuf::int32 context_id() const;
+  inline void set_context_id(::google::protobuf::int32 value);
+  
+  // required .GLESv2Debugger.Message.Function function = 2 [default = NEG];
+  inline bool has_function() const;
+  inline void clear_function();
+  static const int kFunctionFieldNumber = 2;
+  inline ::GLESv2Debugger::Message_Function function() const;
+  inline void set_function(::GLESv2Debugger::Message_Function value);
+  
+  // required bool has_next_message = 3;
+  inline bool has_has_next_message() const;
+  inline void clear_has_next_message();
+  static const int kHasNextMessageFieldNumber = 3;
+  inline bool has_next_message() const;
+  inline void set_has_next_message(bool value);
+  
+  // required bool expect_response = 4;
+  inline bool has_expect_response() const;
+  inline void clear_expect_response();
+  static const int kExpectResponseFieldNumber = 4;
+  inline bool expect_response() const;
+  inline void set_expect_response(bool value);
+  
+  // optional int32 ret = 5;
+  inline bool has_ret() const;
+  inline void clear_ret();
+  static const int kRetFieldNumber = 5;
+  inline ::google::protobuf::int32 ret() const;
+  inline void set_ret(::google::protobuf::int32 value);
+  
+  // optional int32 arg0 = 6;
+  inline bool has_arg0() const;
+  inline void clear_arg0();
+  static const int kArg0FieldNumber = 6;
+  inline ::google::protobuf::int32 arg0() const;
+  inline void set_arg0(::google::protobuf::int32 value);
+  
+  // optional int32 arg1 = 7;
+  inline bool has_arg1() const;
+  inline void clear_arg1();
+  static const int kArg1FieldNumber = 7;
+  inline ::google::protobuf::int32 arg1() const;
+  inline void set_arg1(::google::protobuf::int32 value);
+  
+  // optional int32 arg2 = 8;
+  inline bool has_arg2() const;
+  inline void clear_arg2();
+  static const int kArg2FieldNumber = 8;
+  inline ::google::protobuf::int32 arg2() const;
+  inline void set_arg2(::google::protobuf::int32 value);
+  
+  // optional int32 arg3 = 9;
+  inline bool has_arg3() const;
+  inline void clear_arg3();
+  static const int kArg3FieldNumber = 9;
+  inline ::google::protobuf::int32 arg3() const;
+  inline void set_arg3(::google::protobuf::int32 value);
+  
+  // optional int32 arg4 = 16;
+  inline bool has_arg4() const;
+  inline void clear_arg4();
+  static const int kArg4FieldNumber = 16;
+  inline ::google::protobuf::int32 arg4() const;
+  inline void set_arg4(::google::protobuf::int32 value);
+  
+  // optional int32 arg5 = 17;
+  inline bool has_arg5() const;
+  inline void clear_arg5();
+  static const int kArg5FieldNumber = 17;
+  inline ::google::protobuf::int32 arg5() const;
+  inline void set_arg5(::google::protobuf::int32 value);
+  
+  // optional int32 arg6 = 18;
+  inline bool has_arg6() const;
+  inline void clear_arg6();
+  static const int kArg6FieldNumber = 18;
+  inline ::google::protobuf::int32 arg6() const;
+  inline void set_arg6(::google::protobuf::int32 value);
+  
+  // optional int32 arg7 = 19;
+  inline bool has_arg7() const;
+  inline void clear_arg7();
+  static const int kArg7FieldNumber = 19;
+  inline ::google::protobuf::int32 arg7() const;
+  inline void set_arg7(::google::protobuf::int32 value);
+  
+  // optional int32 arg8 = 20;
+  inline bool has_arg8() const;
+  inline void clear_arg8();
+  static const int kArg8FieldNumber = 20;
+  inline ::google::protobuf::int32 arg8() const;
+  inline void set_arg8(::google::protobuf::int32 value);
+  
+  // optional bytes data = 10;
+  inline bool has_data() const;
+  inline void clear_data();
+  static const int kDataFieldNumber = 10;
+  inline const ::std::string& data() const;
+  inline void set_data(const ::std::string& value);
+  inline void set_data(const char* value);
+  inline void set_data(const void* value, size_t size);
+  inline ::std::string* mutable_data();
+  
+  // optional float time = 11;
+  inline bool has_time() const;
+  inline void clear_time();
+  static const int kTimeFieldNumber = 11;
+  inline float time() const;
+  inline void set_time(float value);
+  
+  // @@protoc_insertion_point(class_scope:GLESv2Debugger.Message)
+ private:
+  mutable int _cached_size_;
+  
+  ::google::protobuf::int32 context_id_;
+  int function_;
+  bool has_next_message_;
+  bool expect_response_;
+  ::google::protobuf::int32 ret_;
+  ::google::protobuf::int32 arg0_;
+  ::google::protobuf::int32 arg1_;
+  ::google::protobuf::int32 arg2_;
+  ::google::protobuf::int32 arg3_;
+  ::google::protobuf::int32 arg4_;
+  ::google::protobuf::int32 arg5_;
+  ::google::protobuf::int32 arg6_;
+  ::google::protobuf::int32 arg7_;
+  ::google::protobuf::int32 arg8_;
+  ::std::string* data_;
+  static const ::std::string _default_data_;
+  float time_;
+  friend void  protobuf_AddDesc_DebuggerMessage_2eproto();
+  friend void protobuf_AssignDesc_DebuggerMessage_2eproto();
+  friend void protobuf_ShutdownFile_DebuggerMessage_2eproto();
+  
+  ::google::protobuf::uint32 _has_bits_[(16 + 31) / 32];
+  
+  // WHY DOES & HAVE LOWER PRECEDENCE THAN != !?
+  inline bool _has_bit(int index) const {
+    return (_has_bits_[index / 32] & (1u << (index % 32))) != 0;
+  }
+  inline void _set_bit(int index) {
+    _has_bits_[index / 32] |= (1u << (index % 32));
+  }
+  inline void _clear_bit(int index) {
+    _has_bits_[index / 32] &= ~(1u << (index % 32));
+  }
+  
+  void InitAsDefaultInstance();
+  static Message* default_instance_;
+};
+// ===================================================================
+
+
+// ===================================================================
+
+// Message
+
+// required int32 context_id = 1;
+inline bool Message::has_context_id() const {
+  return _has_bit(0);
+}
+inline void Message::clear_context_id() {
+  context_id_ = 0;
+  _clear_bit(0);
+}
+inline ::google::protobuf::int32 Message::context_id() const {
+  return context_id_;
+}
+inline void Message::set_context_id(::google::protobuf::int32 value) {
+  _set_bit(0);
+  context_id_ = value;
+}
+
+// required .GLESv2Debugger.Message.Function function = 2 [default = NEG];
+inline bool Message::has_function() const {
+  return _has_bit(1);
+}
+inline void Message::clear_function() {
+  function_ = 143;
+  _clear_bit(1);
+}
+inline ::GLESv2Debugger::Message_Function Message::function() const {
+  return static_cast< ::GLESv2Debugger::Message_Function >(function_);
+}
+inline void Message::set_function(::GLESv2Debugger::Message_Function value) {
+  GOOGLE_DCHECK(::GLESv2Debugger::Message_Function_IsValid(value));
+  _set_bit(1);
+  function_ = value;
+}
+
+// required bool has_next_message = 3;
+inline bool Message::has_has_next_message() const {
+  return _has_bit(2);
+}
+inline void Message::clear_has_next_message() {
+  has_next_message_ = false;
+  _clear_bit(2);
+}
+inline bool Message::has_next_message() const {
+  return has_next_message_;
+}
+inline void Message::set_has_next_message(bool value) {
+  _set_bit(2);
+  has_next_message_ = value;
+}
+
+// required bool expect_response = 4;
+inline bool Message::has_expect_response() const {
+  return _has_bit(3);
+}
+inline void Message::clear_expect_response() {
+  expect_response_ = false;
+  _clear_bit(3);
+}
+inline bool Message::expect_response() const {
+  return expect_response_;
+}
+inline void Message::set_expect_response(bool value) {
+  _set_bit(3);
+  expect_response_ = value;
+}
+
+// optional int32 ret = 5;
+inline bool Message::has_ret() const {
+  return _has_bit(4);
+}
+inline void Message::clear_ret() {
+  ret_ = 0;
+  _clear_bit(4);
+}
+inline ::google::protobuf::int32 Message::ret() const {
+  return ret_;
+}
+inline void Message::set_ret(::google::protobuf::int32 value) {
+  _set_bit(4);
+  ret_ = value;
+}
+
+// optional int32 arg0 = 6;
+inline bool Message::has_arg0() const {
+  return _has_bit(5);
+}
+inline void Message::clear_arg0() {
+  arg0_ = 0;
+  _clear_bit(5);
+}
+inline ::google::protobuf::int32 Message::arg0() const {
+  return arg0_;
+}
+inline void Message::set_arg0(::google::protobuf::int32 value) {
+  _set_bit(5);
+  arg0_ = value;
+}
+
+// optional int32 arg1 = 7;
+inline bool Message::has_arg1() const {
+  return _has_bit(6);
+}
+inline void Message::clear_arg1() {
+  arg1_ = 0;
+  _clear_bit(6);
+}
+inline ::google::protobuf::int32 Message::arg1() const {
+  return arg1_;
+}
+inline void Message::set_arg1(::google::protobuf::int32 value) {
+  _set_bit(6);
+  arg1_ = value;
+}
+
+// optional int32 arg2 = 8;
+inline bool Message::has_arg2() const {
+  return _has_bit(7);
+}
+inline void Message::clear_arg2() {
+  arg2_ = 0;
+  _clear_bit(7);
+}
+inline ::google::protobuf::int32 Message::arg2() const {
+  return arg2_;
+}
+inline void Message::set_arg2(::google::protobuf::int32 value) {
+  _set_bit(7);
+  arg2_ = value;
+}
+
+// optional int32 arg3 = 9;
+inline bool Message::has_arg3() const {
+  return _has_bit(8);
+}
+inline void Message::clear_arg3() {
+  arg3_ = 0;
+  _clear_bit(8);
+}
+inline ::google::protobuf::int32 Message::arg3() const {
+  return arg3_;
+}
+inline void Message::set_arg3(::google::protobuf::int32 value) {
+  _set_bit(8);
+  arg3_ = value;
+}
+
+// optional int32 arg4 = 16;
+inline bool Message::has_arg4() const {
+  return _has_bit(9);
+}
+inline void Message::clear_arg4() {
+  arg4_ = 0;
+  _clear_bit(9);
+}
+inline ::google::protobuf::int32 Message::arg4() const {
+  return arg4_;
+}
+inline void Message::set_arg4(::google::protobuf::int32 value) {
+  _set_bit(9);
+  arg4_ = value;
+}
+
+// optional int32 arg5 = 17;
+inline bool Message::has_arg5() const {
+  return _has_bit(10);
+}
+inline void Message::clear_arg5() {
+  arg5_ = 0;
+  _clear_bit(10);
+}
+inline ::google::protobuf::int32 Message::arg5() const {
+  return arg5_;
+}
+inline void Message::set_arg5(::google::protobuf::int32 value) {
+  _set_bit(10);
+  arg5_ = value;
+}
+
+// optional int32 arg6 = 18;
+inline bool Message::has_arg6() const {
+  return _has_bit(11);
+}
+inline void Message::clear_arg6() {
+  arg6_ = 0;
+  _clear_bit(11);
+}
+inline ::google::protobuf::int32 Message::arg6() const {
+  return arg6_;
+}
+inline void Message::set_arg6(::google::protobuf::int32 value) {
+  _set_bit(11);
+  arg6_ = value;
+}
+
+// optional int32 arg7 = 19;
+inline bool Message::has_arg7() const {
+  return _has_bit(12);
+}
+inline void Message::clear_arg7() {
+  arg7_ = 0;
+  _clear_bit(12);
+}
+inline ::google::protobuf::int32 Message::arg7() const {
+  return arg7_;
+}
+inline void Message::set_arg7(::google::protobuf::int32 value) {
+  _set_bit(12);
+  arg7_ = value;
+}
+
+// optional int32 arg8 = 20;
+inline bool Message::has_arg8() const {
+  return _has_bit(13);
+}
+inline void Message::clear_arg8() {
+  arg8_ = 0;
+  _clear_bit(13);
+}
+inline ::google::protobuf::int32 Message::arg8() const {
+  return arg8_;
+}
+inline void Message::set_arg8(::google::protobuf::int32 value) {
+  _set_bit(13);
+  arg8_ = value;
+}
+
+// optional bytes data = 10;
+inline bool Message::has_data() const {
+  return _has_bit(14);
+}
+inline void Message::clear_data() {
+  if (data_ != &_default_data_) {
+    data_->clear();
+  }
+  _clear_bit(14);
+}
+inline const ::std::string& Message::data() const {
+  return *data_;
+}
+inline void Message::set_data(const ::std::string& value) {
+  _set_bit(14);
+  if (data_ == &_default_data_) {
+    data_ = new ::std::string;
+  }
+  data_->assign(value);
+}
+inline void Message::set_data(const char* value) {
+  _set_bit(14);
+  if (data_ == &_default_data_) {
+    data_ = new ::std::string;
+  }
+  data_->assign(value);
+}
+inline void Message::set_data(const void* value, size_t size) {
+  _set_bit(14);
+  if (data_ == &_default_data_) {
+    data_ = new ::std::string;
+  }
+  data_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* Message::mutable_data() {
+  _set_bit(14);
+  if (data_ == &_default_data_) {
+    data_ = new ::std::string;
+  }
+  return data_;
+}
+
+// optional float time = 11;
+inline bool Message::has_time() const {
+  return _has_bit(15);
+}
+inline void Message::clear_time() {
+  time_ = 0;
+  _clear_bit(15);
+}
+inline float Message::time() const {
+  return time_;
+}
+inline void Message::set_time(float value) {
+  _set_bit(15);
+  time_ = value;
+}
+
+
+// @@protoc_insertion_point(namespace_scope)
+
+}  // namespace GLESv2Debugger
+
+// @@protoc_insertion_point(global_scope)
+
+#endif  // PROTOBUF_DebuggerMessage_2eproto__INCLUDED
diff --git a/opengl/libs/GLES2_dbg/src/api.cpp b/opengl/libs/GLES2_dbg/src/api.cpp
new file mode 100644
index 0000000..b2b8ec0
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/api.cpp
@@ -0,0 +1,5730 @@
+// auto generated by generate_api_cpp.py
+
+#include  "src/header.h"
+
+template<typename T> static int ToInt(const T & t) { STATIC_ASSERT(sizeof(T) == sizeof(int), bitcast); return (int &)t; }
+
+template<typename T> static T FromInt(const int & t) { STATIC_ASSERT(sizeof(T) == sizeof(int), bitcast); return (T &)t; }
+
+void Debug_glActiveTexture(GLenum texture)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glActiveTexture);
+	msg.set_arg0(texture);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glActiveTexture(texture);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glActiveTexture);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glAttachShader(GLuint program, GLuint shader)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glAttachShader);
+	msg.set_arg0(program);
+	msg.set_arg1(shader);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glAttachShader(program, shader);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glAttachShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBindAttribLocation);
+	msg.set_arg0(program);
+	msg.set_arg1(index);
+	msg.set_arg2(ToInt(name));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(strlen(name) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(name)); i++)
+				data.append((const char *)(name + i), sizeof(*name));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBindAttribLocation(program, index, name);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBindAttribLocation);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBindBuffer(GLenum target, GLuint buffer)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBindBuffer);
+	msg.set_arg0(target);
+	msg.set_arg1(buffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBindBuffer(target, buffer);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBindBuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBindFramebuffer);
+	msg.set_arg0(target);
+	msg.set_arg1(framebuffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBindFramebuffer(target, framebuffer);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBindFramebuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBindRenderbuffer);
+	msg.set_arg0(target);
+	msg.set_arg1(renderbuffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBindRenderbuffer(target, renderbuffer);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBindRenderbuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBindTexture(GLenum target, GLuint texture)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBindTexture);
+	msg.set_arg0(target);
+	msg.set_arg1(texture);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBindTexture(target, texture);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBindTexture);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBlendColor);
+	msg.set_arg0(ToInt(red));
+	msg.set_arg1(ToInt(green));
+	msg.set_arg2(ToInt(blue));
+	msg.set_arg3(ToInt(alpha));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBlendColor(red, green, blue, alpha);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBlendColor);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBlendEquation( GLenum mode )
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBlendEquation);
+	msg.set_arg0(mode);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBlendEquation(mode);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBlendEquation);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBlendEquationSeparate);
+	msg.set_arg0(modeRGB);
+	msg.set_arg1(modeAlpha);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBlendEquationSeparate(modeRGB, modeAlpha);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBlendEquationSeparate);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBlendFunc);
+	msg.set_arg0(sfactor);
+	msg.set_arg1(dfactor);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBlendFunc(sfactor, dfactor);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBlendFunc);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBlendFuncSeparate);
+	msg.set_arg0(srcRGB);
+	msg.set_arg1(dstRGB);
+	msg.set_arg2(srcAlpha);
+	msg.set_arg3(dstAlpha);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBlendFuncSeparate);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBufferData);
+	msg.set_arg0(target);
+	msg.set_arg1(size);
+	msg.set_arg2(ToInt(data));
+	msg.set_arg3(usage);
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBufferData(target, size, data, usage);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBufferData);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glBufferSubData);
+	msg.set_arg0(target);
+	msg.set_arg1(offset);
+	msg.set_arg2(size);
+	msg.set_arg3(ToInt(data));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glBufferSubData(target, offset, size, data);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glBufferSubData);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLenum Debug_glCheckFramebufferStatus(GLenum target)
+{
+	GLenum ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCheckFramebufferStatus);
+	msg.set_arg0(target);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glCheckFramebufferStatus(target);
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCheckFramebufferStatus);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<GLenum>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glClear(GLbitfield mask)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glClear);
+	msg.set_arg0(mask);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glClear(mask);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glClear);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glClearColor);
+	msg.set_arg0(ToInt(red));
+	msg.set_arg1(ToInt(green));
+	msg.set_arg2(ToInt(blue));
+	msg.set_arg3(ToInt(alpha));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glClearColor(red, green, blue, alpha);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glClearColor);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glClearDepthf(GLclampf depth)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glClearDepthf);
+	msg.set_arg0(ToInt(depth));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glClearDepthf(depth);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glClearDepthf);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glClearStencil(GLint s)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glClearStencil);
+	msg.set_arg0(s);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glClearStencil(s);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glClearStencil);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glColorMask);
+	msg.set_arg0(red);
+	msg.set_arg1(green);
+	msg.set_arg2(blue);
+	msg.set_arg3(alpha);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glColorMask(red, green, blue, alpha);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glColorMask);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glCompileShader(GLuint shader)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCompileShader);
+	msg.set_arg0(shader);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCompileShader(shader);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCompileShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCompressedTexImage2D);
+	msg.set_arg0(target);
+	msg.set_arg1(level);
+	msg.set_arg2(internalformat);
+	msg.set_arg3(width);
+	msg.set_arg4(height);
+	msg.set_arg5(border);
+	msg.set_arg6(imageSize);
+	msg.set_arg7(ToInt(data));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCompressedTexImage2D);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCompressedTexSubImage2D);
+	msg.set_arg0(target);
+	msg.set_arg1(level);
+	msg.set_arg2(xoffset);
+	msg.set_arg3(yoffset);
+	msg.set_arg4(width);
+	msg.set_arg5(height);
+	msg.set_arg6(format);
+	msg.set_arg7(imageSize);
+	msg.set_arg8(ToInt(data));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCompressedTexSubImage2D);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCopyTexImage2D);
+	msg.set_arg0(target);
+	msg.set_arg1(level);
+	msg.set_arg2(internalformat);
+	msg.set_arg3(x);
+	msg.set_arg4(y);
+	msg.set_arg5(width);
+	msg.set_arg6(height);
+	msg.set_arg7(border);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCopyTexImage2D);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCopyTexSubImage2D);
+	msg.set_arg0(target);
+	msg.set_arg1(level);
+	msg.set_arg2(xoffset);
+	msg.set_arg3(yoffset);
+	msg.set_arg4(x);
+	msg.set_arg5(y);
+	msg.set_arg6(width);
+	msg.set_arg7(height);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCopyTexSubImage2D);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLuint Debug_glCreateProgram(void)
+{
+	GLuint ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCreateProgram);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glCreateProgram();
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCreateProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<GLuint>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLuint Debug_glCreateShader(GLenum type)
+{
+	GLuint ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCreateShader);
+	msg.set_arg0(type);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glCreateShader(type);
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCreateShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<GLuint>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glCullFace(GLenum mode)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glCullFace);
+	msg.set_arg0(mode);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glCullFace(mode);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glCullFace);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteBuffers(GLsizei n, const GLuint* buffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteBuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(buffers));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(buffers + i), sizeof(*buffers));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteBuffers(n, buffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteBuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteFramebuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(framebuffers));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(framebuffers + i), sizeof(*framebuffers));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteFramebuffers(n, framebuffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteFramebuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteProgram(GLuint program)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteProgram);
+	msg.set_arg0(program);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteProgram(program);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteRenderbuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(renderbuffers));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(renderbuffers + i), sizeof(*renderbuffers));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteRenderbuffers(n, renderbuffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteRenderbuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteShader(GLuint shader)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteShader);
+	msg.set_arg0(shader);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteShader(shader);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDeleteTextures(GLsizei n, const GLuint* textures)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDeleteTextures);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(textures));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(textures + i), sizeof(*textures));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDeleteTextures(n, textures);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDeleteTextures);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDepthFunc(GLenum func)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDepthFunc);
+	msg.set_arg0(func);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDepthFunc(func);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDepthFunc);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDepthMask(GLboolean flag)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDepthMask);
+	msg.set_arg0(flag);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDepthMask(flag);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDepthMask);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDepthRangef(GLclampf zNear, GLclampf zFar)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDepthRangef);
+	msg.set_arg0(ToInt(zNear));
+	msg.set_arg1(ToInt(zFar));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDepthRangef(zNear, zFar);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDepthRangef);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDetachShader(GLuint program, GLuint shader)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDetachShader);
+	msg.set_arg0(program);
+	msg.set_arg1(shader);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDetachShader(program, shader);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDetachShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDisable(GLenum cap)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDisable);
+	msg.set_arg0(cap);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDisable(cap);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDisable);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDisableVertexAttribArray(GLuint index)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDisableVertexAttribArray);
+	msg.set_arg0(index);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDisableVertexAttribArray(index);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDisableVertexAttribArray);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDrawArrays);
+	msg.set_arg0(mode);
+	msg.set_arg1(first);
+	msg.set_arg2(count);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDrawArrays(mode, first, count);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDrawArrays);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glDrawElements);
+	msg.set_arg0(mode);
+	msg.set_arg1(count);
+	msg.set_arg2(type);
+	msg.set_arg3(ToInt(indices));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glDrawElements(mode, count, type, indices);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glDrawElements);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glEnable(GLenum cap)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glEnable);
+	msg.set_arg0(cap);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glEnable(cap);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glEnable);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glEnableVertexAttribArray(GLuint index)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glEnableVertexAttribArray);
+	msg.set_arg0(index);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glEnableVertexAttribArray(index);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glEnableVertexAttribArray);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glFinish(void)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glFinish);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glFinish();
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glFinish);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glFlush(void)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glFlush);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glFlush();
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glFlush);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glFramebufferRenderbuffer);
+	msg.set_arg0(target);
+	msg.set_arg1(attachment);
+	msg.set_arg2(renderbuffertarget);
+	msg.set_arg3(renderbuffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glFramebufferRenderbuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glFramebufferTexture2D);
+	msg.set_arg0(target);
+	msg.set_arg1(attachment);
+	msg.set_arg2(textarget);
+	msg.set_arg3(texture);
+	msg.set_arg4(level);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glFramebufferTexture2D(target, attachment, textarget, texture, level);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glFramebufferTexture2D);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glFrontFace(GLenum mode)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glFrontFace);
+	msg.set_arg0(mode);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glFrontFace(mode);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glFrontFace);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGenBuffers(GLsizei n, GLuint* buffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGenBuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(buffers));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGenBuffers(n, buffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGenBuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(buffers + i), sizeof(*buffers));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGenerateMipmap(GLenum target)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGenerateMipmap);
+	msg.set_arg0(target);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGenerateMipmap(target);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGenerateMipmap);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGenFramebuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(framebuffers));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGenFramebuffers(n, framebuffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGenFramebuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(framebuffers + i), sizeof(*framebuffers));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGenRenderbuffers);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(renderbuffers));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGenRenderbuffers(n, renderbuffers);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGenRenderbuffers);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(renderbuffers + i), sizeof(*renderbuffers));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGenTextures(GLsizei n, GLuint* textures)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGenTextures);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(textures));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGenTextures(n, textures);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGenTextures);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(n * sizeof(GLuint));
+			for (unsigned i = 0; i < (n); i++)
+				data.append((const char *)(textures + i), sizeof(*textures));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetActiveAttrib);
+	msg.set_arg0(program);
+	msg.set_arg1(index);
+	msg.set_arg2(bufsize);
+	msg.set_arg3(ToInt(length));
+	msg.set_arg4(ToInt(size));
+	msg.set_arg5(ToInt(type));
+	msg.set_arg6(ToInt(name));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(strlen(name) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(name)); i++)
+				data.append((const char *)(name + i), sizeof(*name));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetActiveAttrib(program, index, bufsize, length, size, type, name);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetActiveAttrib);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetActiveUniform);
+	msg.set_arg0(program);
+	msg.set_arg1(index);
+	msg.set_arg2(bufsize);
+	msg.set_arg3(ToInt(length));
+	msg.set_arg4(ToInt(size));
+	msg.set_arg5(ToInt(type));
+	msg.set_arg6(ToInt(name));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(strlen(name) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(name)); i++)
+				data.append((const char *)(name + i), sizeof(*name));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetActiveUniform(program, index, bufsize, length, size, type, name);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetActiveUniform);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetAttachedShaders);
+	msg.set_arg0(program);
+	msg.set_arg1(maxcount);
+	msg.set_arg2(ToInt(count));
+	msg.set_arg3(ToInt(shaders));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetAttachedShaders(program, maxcount, count, shaders);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetAttachedShaders);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+int Debug_glGetAttribLocation(GLuint program, const GLchar* name)
+{
+	int ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetAttribLocation);
+	msg.set_arg0(program);
+	msg.set_arg1(ToInt(name));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(strlen(name) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(name)); i++)
+				data.append((const char *)(name + i), sizeof(*name));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glGetAttribLocation(program, name);
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetAttribLocation);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<int>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetBooleanv(GLenum pname, GLboolean* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetBooleanv);
+	msg.set_arg0(pname);
+	msg.set_arg1(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetBooleanv(pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetBooleanv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetBufferParameteriv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetBufferParameteriv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetBufferParameteriv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLenum Debug_glGetError(void)
+{
+	GLenum ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetError);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glGetError();
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetError);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<GLenum>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetFloatv(GLenum pname, GLfloat* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetFloatv);
+	msg.set_arg0(pname);
+	msg.set_arg1(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetFloatv(pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetFloatv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetFramebufferAttachmentParameteriv);
+	msg.set_arg0(target);
+	msg.set_arg1(attachment);
+	msg.set_arg2(pname);
+	msg.set_arg3(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetFramebufferAttachmentParameteriv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetIntegerv(GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetIntegerv);
+	msg.set_arg0(pname);
+	msg.set_arg1(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetIntegerv(pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetIntegerv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetProgramiv);
+	msg.set_arg0(program);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetProgramiv(program, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetProgramiv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(1 * sizeof(GLint));
+			for (unsigned i = 0; i < (1); i++)
+				data.append((const char *)(params + i), sizeof(*params));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetProgramInfoLog);
+	msg.set_arg0(program);
+	msg.set_arg1(bufsize);
+	msg.set_arg2(ToInt(length));
+	msg.set_arg3(ToInt(infolog));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetProgramInfoLog(program, bufsize, length, infolog);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetProgramInfoLog);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(strlen(infolog) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(infolog)); i++)
+				data.append((const char *)(infolog + i), sizeof(*infolog));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetRenderbufferParameteriv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetRenderbufferParameteriv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetRenderbufferParameteriv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetShaderiv);
+	msg.set_arg0(shader);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetShaderiv(shader, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetShaderiv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(1 * sizeof(GLint));
+			for (unsigned i = 0; i < (1); i++)
+				data.append((const char *)(params + i), sizeof(*params));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetShaderInfoLog);
+	msg.set_arg0(shader);
+	msg.set_arg1(bufsize);
+	msg.set_arg2(ToInt(length));
+	msg.set_arg3(ToInt(infolog));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetShaderInfoLog(shader, bufsize, length, infolog);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetShaderInfoLog);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(strlen(infolog) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(infolog)); i++)
+				data.append((const char *)(infolog + i), sizeof(*infolog));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetShaderPrecisionFormat);
+	msg.set_arg0(shadertype);
+	msg.set_arg1(precisiontype);
+	msg.set_arg2(ToInt(range));
+	msg.set_arg3(ToInt(precision));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetShaderPrecisionFormat);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetShaderSource);
+	msg.set_arg0(shader);
+	msg.set_arg1(bufsize);
+	msg.set_arg2(ToInt(length));
+	msg.set_arg3(ToInt(source));
+	std::string data;
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetShaderSource(shader, bufsize, length, source);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetShaderSource);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			data.reserve(strlen(source) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(source)); i++)
+				data.append((const char *)(source + i), sizeof(*source));
+			msg.set_data(data);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+const GLubyte* Debug_glGetString(GLenum name)
+{
+	const GLubyte* ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetString);
+	msg.set_arg0(name);
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glGetString(name);
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetString);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<const GLubyte*>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetTexParameterfv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetTexParameterfv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetTexParameterfv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetTexParameteriv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetTexParameteriv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetTexParameteriv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetUniformfv);
+	msg.set_arg0(program);
+	msg.set_arg1(location);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetUniformfv(program, location, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetUniformfv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetUniformiv(GLuint program, GLint location, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetUniformiv);
+	msg.set_arg0(program);
+	msg.set_arg1(location);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetUniformiv(program, location, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetUniformiv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+int Debug_glGetUniformLocation(GLuint program, const GLchar* name)
+{
+	int ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetUniformLocation);
+	msg.set_arg0(program);
+	msg.set_arg1(ToInt(name));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(strlen(name) * sizeof(GLchar));
+			for (unsigned i = 0; i < (strlen(name)); i++)
+				data.append((const char *)(name + i), sizeof(*name));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glGetUniformLocation(program, name);
+			msg.set_ret(ToInt(ret));
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetUniformLocation);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = FromInt<int>(cmd.ret());
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribfv);
+	msg.set_arg0(index);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetVertexAttribfv(index, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribfv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribiv);
+	msg.set_arg0(index);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetVertexAttribiv(index, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribiv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribPointerv);
+	msg.set_arg0(index);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(pointer));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glGetVertexAttribPointerv(index, pname, pointer);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glGetVertexAttribPointerv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glHint(GLenum target, GLenum mode)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glHint);
+	msg.set_arg0(target);
+	msg.set_arg1(mode);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glHint(target, mode);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glHint);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsBuffer(GLuint buffer)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsBuffer);
+	msg.set_arg0(buffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsBuffer(buffer);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsBuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsEnabled(GLenum cap)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsEnabled);
+	msg.set_arg0(cap);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsEnabled(cap);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsEnabled);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsFramebuffer(GLuint framebuffer)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsFramebuffer);
+	msg.set_arg0(framebuffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsFramebuffer(framebuffer);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsFramebuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsProgram(GLuint program)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsProgram);
+	msg.set_arg0(program);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsProgram(program);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsRenderbuffer(GLuint renderbuffer)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsRenderbuffer);
+	msg.set_arg0(renderbuffer);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsRenderbuffer(renderbuffer);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsRenderbuffer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsShader(GLuint shader)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsShader);
+	msg.set_arg0(shader);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsShader(shader);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsShader);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+GLboolean Debug_glIsTexture(GLuint texture)
+{
+	GLboolean ret = 0;
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glIsTexture);
+	msg.set_arg0(texture);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			ret = _c->glIsTexture(texture);
+			msg.set_ret(ret);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glIsTexture);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			if (cmd.has_ret())
+				ret = cmd.ret();
+			return ret;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glLineWidth(GLfloat width)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glLineWidth);
+	msg.set_arg0(ToInt(width));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glLineWidth(width);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glLineWidth);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glLinkProgram(GLuint program)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glLinkProgram);
+	msg.set_arg0(program);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glLinkProgram(program);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glLinkProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glPixelStorei(GLenum pname, GLint param)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glPixelStorei);
+	msg.set_arg0(pname);
+	msg.set_arg1(param);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glPixelStorei(pname, param);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glPixelStorei);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glPolygonOffset(GLfloat factor, GLfloat units)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glPolygonOffset);
+	msg.set_arg0(ToInt(factor));
+	msg.set_arg1(ToInt(units));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glPolygonOffset(factor, units);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glPolygonOffset);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glReadPixels);
+	msg.set_arg0(x);
+	msg.set_arg1(y);
+	msg.set_arg2(width);
+	msg.set_arg3(height);
+	msg.set_arg4(format);
+	msg.set_arg5(type);
+	msg.set_arg6(ToInt(pixels));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glReadPixels(x, y, width, height, format, type, pixels);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glReadPixels);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glReleaseShaderCompiler(void)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glReleaseShaderCompiler);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glReleaseShaderCompiler();
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glReleaseShaderCompiler);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glRenderbufferStorage);
+	msg.set_arg0(target);
+	msg.set_arg1(internalformat);
+	msg.set_arg2(width);
+	msg.set_arg3(height);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glRenderbufferStorage(target, internalformat, width, height);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glRenderbufferStorage);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glSampleCoverage(GLclampf value, GLboolean invert)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glSampleCoverage);
+	msg.set_arg0(ToInt(value));
+	msg.set_arg1(invert);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glSampleCoverage(value, invert);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glSampleCoverage);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glScissor);
+	msg.set_arg0(x);
+	msg.set_arg1(y);
+	msg.set_arg2(width);
+	msg.set_arg3(height);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glScissor(x, y, width, height);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glScissor);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glShaderBinary);
+	msg.set_arg0(n);
+	msg.set_arg1(ToInt(shaders));
+	msg.set_arg2(binaryformat);
+	msg.set_arg3(ToInt(binary));
+	msg.set_arg4(length);
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glShaderBinary(n, shaders, binaryformat, binary, length);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glShaderBinary);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilFunc);
+	msg.set_arg0(func);
+	msg.set_arg1(ref);
+	msg.set_arg2(mask);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilFunc(func, ref, mask);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilFunc);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilFuncSeparate);
+	msg.set_arg0(face);
+	msg.set_arg1(func);
+	msg.set_arg2(ref);
+	msg.set_arg3(mask);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilFuncSeparate(face, func, ref, mask);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilFuncSeparate);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilMask(GLuint mask)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilMask);
+	msg.set_arg0(mask);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilMask(mask);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilMask);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilMaskSeparate);
+	msg.set_arg0(face);
+	msg.set_arg1(mask);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilMaskSeparate(face, mask);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilMaskSeparate);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilOp);
+	msg.set_arg0(fail);
+	msg.set_arg1(zfail);
+	msg.set_arg2(zpass);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilOp(fail, zfail, zpass);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilOp);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glStencilOpSeparate);
+	msg.set_arg0(face);
+	msg.set_arg1(fail);
+	msg.set_arg2(zfail);
+	msg.set_arg3(zpass);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glStencilOpSeparate(face, fail, zfail, zpass);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glStencilOpSeparate);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glTexParameterf);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(param));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glTexParameterf(target, pname, param);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glTexParameterf);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glTexParameterfv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glTexParameterfv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glTexParameterfv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glTexParameteri);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(param);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glTexParameteri(target, pname, param);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glTexParameteri);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glTexParameteriv);
+	msg.set_arg0(target);
+	msg.set_arg1(pname);
+	msg.set_arg2(ToInt(params));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glTexParameteriv(target, pname, params);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glTexParameteriv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform1f(GLint location, GLfloat x)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform1f);
+	msg.set_arg0(location);
+	msg.set_arg1(ToInt(x));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform1f(location, x);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform1f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform1fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(1*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (1*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform1fv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform1fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform1i(GLint location, GLint x)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform1i);
+	msg.set_arg0(location);
+	msg.set_arg1(x);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform1i(location, x);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform1i);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform1iv(GLint location, GLsizei count, const GLint* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform1iv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(1*count * sizeof(GLint));
+			for (unsigned i = 0; i < (1*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform1iv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform1iv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform2f(GLint location, GLfloat x, GLfloat y)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform2f);
+	msg.set_arg0(location);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform2f(location, x, y);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform2f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform2fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(2*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (2*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform2fv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform2fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform2i(GLint location, GLint x, GLint y)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform2i);
+	msg.set_arg0(location);
+	msg.set_arg1(x);
+	msg.set_arg2(y);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform2i(location, x, y);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform2i);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform2iv(GLint location, GLsizei count, const GLint* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform2iv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(2*count * sizeof(GLint));
+			for (unsigned i = 0; i < (2*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform2iv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform2iv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform3f);
+	msg.set_arg0(location);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	msg.set_arg3(ToInt(z));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform3f(location, x, y, z);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform3f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform3fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(3*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (3*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform3fv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform3fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform3i(GLint location, GLint x, GLint y, GLint z)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform3i);
+	msg.set_arg0(location);
+	msg.set_arg1(x);
+	msg.set_arg2(y);
+	msg.set_arg3(z);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform3i(location, x, y, z);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform3i);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform3iv(GLint location, GLsizei count, const GLint* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform3iv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(3*count * sizeof(GLint));
+			for (unsigned i = 0; i < (3*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform3iv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform3iv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform4f);
+	msg.set_arg0(location);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	msg.set_arg3(ToInt(z));
+	msg.set_arg4(ToInt(w));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform4f(location, x, y, z, w);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform4f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform4fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(4*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (4*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform4fv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform4fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform4i);
+	msg.set_arg0(location);
+	msg.set_arg1(x);
+	msg.set_arg2(y);
+	msg.set_arg3(z);
+	msg.set_arg4(w);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform4i(location, x, y, z, w);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform4i);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniform4iv(GLint location, GLsizei count, const GLint* v)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniform4iv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(ToInt(v));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(4*count * sizeof(GLint));
+			for (unsigned i = 0; i < (4*count); i++)
+				data.append((const char *)(v + i), sizeof(*v));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniform4iv(location, count, v);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniform4iv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix2fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(transpose);
+	msg.set_arg3(ToInt(value));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(4*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (4*count); i++)
+				data.append((const char *)(value + i), sizeof(*value));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniformMatrix2fv(location, count, transpose, value);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix2fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix3fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(transpose);
+	msg.set_arg3(ToInt(value));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(9*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (9*count); i++)
+				data.append((const char *)(value + i), sizeof(*value));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniformMatrix3fv(location, count, transpose, value);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix3fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix4fv);
+	msg.set_arg0(location);
+	msg.set_arg1(count);
+	msg.set_arg2(transpose);
+	msg.set_arg3(ToInt(value));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(16*count * sizeof(GLfloat));
+			for (unsigned i = 0; i < (16*count); i++)
+				data.append((const char *)(value + i), sizeof(*value));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUniformMatrix4fv(location, count, transpose, value);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUniformMatrix4fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glUseProgram(GLuint program)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glUseProgram);
+	msg.set_arg0(program);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glUseProgram(program);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glUseProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glValidateProgram(GLuint program)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glValidateProgram);
+	msg.set_arg0(program);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glValidateProgram(program);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glValidateProgram);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib1f(GLuint indx, GLfloat x)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib1f);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(x));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib1f(indx, x);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib1f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib1fv(GLuint indx, const GLfloat* values)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib1fv);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(values));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(1 * sizeof(GLfloat));
+			for (unsigned i = 0; i < (1); i++)
+				data.append((const char *)(values + i), sizeof(*values));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib1fv(indx, values);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib1fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib2f);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib2f(indx, x, y);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib2f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib2fv(GLuint indx, const GLfloat* values)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib2fv);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(values));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(2 * sizeof(GLfloat));
+			for (unsigned i = 0; i < (2); i++)
+				data.append((const char *)(values + i), sizeof(*values));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib2fv(indx, values);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib2fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib3f);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	msg.set_arg3(ToInt(z));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib3f(indx, x, y, z);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib3f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib3fv(GLuint indx, const GLfloat* values)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib3fv);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(values));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(3 * sizeof(GLfloat));
+			for (unsigned i = 0; i < (3); i++)
+				data.append((const char *)(values + i), sizeof(*values));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib3fv(indx, values);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib3fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib4f);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(x));
+	msg.set_arg2(ToInt(y));
+	msg.set_arg3(ToInt(z));
+	msg.set_arg4(ToInt(w));
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib4f(indx, x, y, z, w);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib4f);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glVertexAttrib4fv(GLuint indx, const GLfloat* values)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib4fv);
+	msg.set_arg0(indx);
+	msg.set_arg1(ToInt(values));
+	std::string data;
+	// FIXME: check for pointer usage
+			data.reserve(4 * sizeof(GLfloat));
+			for (unsigned i = 0; i < (4); i++)
+				data.append((const char *)(values + i), sizeof(*values));
+			msg.set_data(data);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttrib4fv(indx, values);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttrib4fv);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: this function has pointers, it should be hand written
+void Debug_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glVertexAttribPointer);
+	msg.set_arg0(indx);
+	msg.set_arg1(size);
+	msg.set_arg2(type);
+	msg.set_arg3(normalized);
+	msg.set_arg4(stride);
+	msg.set_arg5(ToInt(ptr));
+	// FIXME: check for pointer usage
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glVertexAttribPointer);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+void Debug_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+{
+	gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+	GLESv2Debugger::Message msg, cmd;
+	msg.set_context_id(0);
+	msg.set_has_next_message(true);
+	const bool expectResponse = false;
+	msg.set_expect_response(expectResponse);
+	msg.set_function(GLESv2Debugger::Message_Function_glViewport);
+	msg.set_arg0(x);
+	msg.set_arg1(y);
+	msg.set_arg2(width);
+	msg.set_arg3(height);
+	Send(msg, cmd);
+	if (!expectResponse)
+		cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+	while (true) {
+		msg.Clear();
+		clock_t c0 = clock();
+		switch (cmd.function()) {
+		case GLESv2Debugger::Message_Function_CONTINUE:
+			_c->glViewport(x, y, width, height);
+			msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+			msg.set_context_id(0);
+			msg.set_function(GLESv2Debugger::Message_Function_glViewport);
+			msg.set_has_next_message(false);
+			msg.set_expect_response(expectResponse);
+			Send(msg, cmd);
+			if (!expectResponse)
+				cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+			break;
+		case GLESv2Debugger::Message_Function_SKIP:
+			return;
+		default:
+			ASSERT(0); //GenerateCall(msg, cmd); 
+			break;
+		}
+	}
+}
+
+// FIXME: the following functions should be written by hand
+void Debug_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
+void Debug_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
+void Debug_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
+void Debug_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);
+void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
+void Debug_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+void Debug_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+void Debug_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+void Debug_glGetBooleanv(GLenum pname, GLboolean* params);
+void Debug_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
+void Debug_glGetFloatv(GLenum pname, GLfloat* params);
+void Debug_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+void Debug_glGetIntegerv(GLenum pname, GLint* params);
+void Debug_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+void Debug_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
+void Debug_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+void Debug_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+void Debug_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
+const GLubyte* Debug_glGetString(GLenum name);
+void Debug_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
+void Debug_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
+void Debug_glGetUniformfv(GLuint program, GLint location, GLfloat* params);
+void Debug_glGetUniformiv(GLuint program, GLint location, GLint* params);
+void Debug_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+void Debug_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
+void Debug_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer);
+void Debug_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
+void Debug_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
+void Debug_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
+void Debug_glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
+void Debug_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
diff --git a/opengl/libs/GLES2_dbg/src/header.h b/opengl/libs/GLES2_dbg/src/header.h
new file mode 100644
index 0000000..e1b194d
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/header.h
@@ -0,0 +1,65 @@
+/*
+ ** Copyright 2011, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <../../../libcore/include/StaticAssert.h>
+
+#define EGL_TRACE 1
+#include "hooks.h"
+
+#define GL_ENTRY(_r, _api, ...) _r Debug_##_api ( __VA_ARGS__ );
+#include "../include/glesv2_dbg.h"
+
+#include "DebuggerMessage.pb.h"
+
+using namespace android;
+
+#define API_ENTRY(_api) Debug_##_api
+
+#ifndef __location__
+#define __HIERALLOC_STRING_0__(s)   #s
+#define __HIERALLOC_STRING_1__(s)   __HIERALLOC_STRING_0__(s)
+#define __HIERALLOC_STRING_2__      __HIERALLOC_STRING_1__(__LINE__)
+#define __location__                __FILE__ ":" __HIERALLOC_STRING_2__
+#endif
+
+#define ASSERT(expr) if (!(expr)) { LOGD("\n*\n*\n* ASSERT FAILED: %s at %s \n*\n*", #expr, __location__); exit(1); }
+#undef assert
+#define assert(expr) ASSERT(expr)
+//#undef LOGD
+//#define LOGD(...)
+
+namespace android
+{
+extern int clientSock, serverSock;
+#define BUFFSIZE 256
+extern char sockBuff [BUFFSIZE];
+
+void Send(const GLESv2Debugger::Message & msg, GLESv2Debugger::Message & cmd);
+}; // namespace android {
diff --git a/opengl/libs/GLES2_dbg/src/server.cpp b/opengl/libs/GLES2_dbg/src/server.cpp
new file mode 100644
index 0000000..33f78e4
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/server.cpp
@@ -0,0 +1,158 @@
+/*
+ ** Copyright 2011, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+
+#include "header.h"
+
+namespace android
+{
+
+char sockBuff [BUFFSIZE];
+
+int serverSock = -1, clientSock = -1;
+
+void StopDebugServer();
+
+static void Die(const char * msg)
+{
+    LOGD("\n*\n*\n* GLESv2_dbg: Die: %s \n*\n*", msg);
+    StopDebugServer();
+    exit(1);
+}
+
+void StartDebugServer()
+{
+    LOGD("GLESv2_dbg: StartDebugServer");
+    if (serverSock >= 0)
+        return;
+
+    LOGD("GLESv2_dbg: StartDebugServer create socket");
+    struct sockaddr_in server = {}, client = {};
+
+    /* Create the TCP socket */
+    if ((serverSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
+        Die("Failed to create socket");
+    }
+    /* Construct the server sockaddr_in structure */
+    server.sin_family = AF_INET;                  /* Internet/IP */
+    server.sin_addr.s_addr = htonl(INADDR_ANY);   /* Incoming addr */
+    server.sin_port = htons(5039);       /* server port */
+
+    /* Bind the server socket */
+    socklen_t sizeofSockaddr_in = sizeof(sockaddr_in);
+    if (bind(serverSock, (struct sockaddr *) &server,
+             sizeof(server)) < 0) {
+        Die("Failed to bind the server socket");
+    }
+    /* Listen on the server socket */
+    if (listen(serverSock, 1) < 0) {
+        Die("Failed to listen on server socket");
+    }
+
+    LOGD("server started on %d \n", server.sin_port);
+
+
+    /* Wait for client connection */
+    if ((clientSock =
+                accept(serverSock, (struct sockaddr *) &client,
+                       &sizeofSockaddr_in)) < 0) {
+        Die("Failed to accept client connection");
+    }
+
+    LOGD("Client connected: %s\n", inet_ntoa(client.sin_addr));
+//    fcntl(clientSock, F_SETFL, O_NONBLOCK);
+
+    GLESv2Debugger::Message msg, cmd;
+    msg.set_context_id(0);
+    msg.set_function(GLESv2Debugger::Message_Function_ACK);
+    msg.set_has_next_message(false);
+    msg.set_expect_response(true);
+    Send(msg, cmd);
+}
+
+void StopDebugServer()
+{
+    LOGD("GLESv2_dbg: StopDebugServer");
+    if (clientSock > 0) {
+        close(clientSock);
+        clientSock = -1;
+    }
+    if (serverSock > 0) {
+        close(serverSock);
+        serverSock = -1;
+    }
+
+}
+
+void Send(const GLESv2Debugger::Message & msg, GLESv2Debugger::Message & cmd)
+{
+    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+    pthread_mutex_lock(&mutex); // TODO: this is just temporary
+
+    static std::string str;
+    const_cast<GLESv2Debugger::Message &>(msg).set_context_id(pthread_self());
+    msg.SerializeToString(&str);
+    unsigned len = str.length();
+    len = htonl(len);
+    int sent = -1;
+    sent = send(clientSock, (const char *)&len, sizeof(len), 0);
+    if (sent != sizeof(len)) {
+        LOGD("actual sent=%d expected=%d clientSock=%d", sent, sizeof(len), clientSock);
+        Die("Failed to send message length");
+    }
+    sent = send(clientSock, str.c_str(), str.length(), 0);
+    if (sent != str.length()) {
+        LOGD("actual sent=%d expected=%d clientSock=%d", sent, str.length(), clientSock);
+        Die("Failed to send message");
+    }
+
+    if (!msg.expect_response()) {
+        pthread_mutex_unlock(&mutex);
+        return;
+    }
+
+    int received = recv(clientSock, sockBuff, 4, MSG_WAITALL);
+    if (received < 0)
+        Die("Failed to receive response");
+    else if (4 != received) {
+        LOGD("received %dB: %.8X", received, *(unsigned *)sockBuff);
+        Die("Received length mismatch, expected 4");
+    }
+    len = ntohl(*(unsigned *)sockBuff);
+    static void * buffer = NULL;
+    static unsigned bufferSize = 0;
+    if (bufferSize < len) {
+        buffer = realloc(buffer, len);
+        ASSERT(buffer);
+        bufferSize = len;
+    }
+    received = recv(clientSock, buffer, len, MSG_WAITALL);
+    if (received < 0)
+        Die("Failed to receive response");
+    else if (len != received)
+        Die("Received length mismatch");
+    cmd.Clear();
+    cmd.ParseFromArray(buffer, len);
+
+    //LOGD("Message sent tid=%lu len=%d", pthread_self(), str.length());
+    pthread_mutex_unlock(&mutex);
+}
+
+}; // namespace android {
diff --git a/opengl/libs/GLES2_dbg/src/shader.cpp b/opengl/libs/GLES2_dbg/src/shader.cpp
new file mode 100644
index 0000000..c2b2557
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/shader.cpp
@@ -0,0 +1,66 @@
+/*
+ ** Copyright 2011, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include "header.h"
+
+void API_ENTRY(glShaderSource)(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
+{
+    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+    GLESv2Debugger::Message msg, cmd;
+    msg.set_context_id(0);
+    msg.set_has_next_message(true);
+    const bool expectResponse = false;
+    msg.set_expect_response(expectResponse);
+    msg.set_function(GLESv2Debugger::Message_Function_glShaderSource);
+    msg.set_arg0(shader);
+    msg.set_arg1(count);
+    msg.set_arg2((int)string);
+    msg.set_arg3((int)length);
+
+    std::string data;
+    for (unsigned i = 0; i < count; i++)
+        if (!length || length[i] < 0)
+            data.append(string[i]);
+        else
+            data.append(string[i], length[i]);
+    msg.set_data(data);
+
+    Send(msg, cmd);
+    if (!expectResponse)
+        cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+    while (true) {
+        msg.Clear();
+        clock_t c0 = clock();
+        switch (cmd.function()) {
+        case GLESv2Debugger::Message_Function_CONTINUE:
+            _c->glShaderSource(shader, count, string, length);
+            msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+            msg.set_context_id(0);
+            msg.set_function(GLESv2Debugger::Message_Function_glShaderSource);
+            msg.set_has_next_message(false);
+            msg.set_expect_response(expectResponse);
+            Send(msg, cmd);
+            if (!expectResponse)
+                cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+            break;
+        case GLESv2Debugger::Message_Function_SKIP:
+            return;
+        default:
+            ASSERT(0); //GenerateCall(msg, cmd);
+            break;
+        }
+    }
+}
diff --git a/opengl/libs/GLES2_dbg/src/texture.cpp b/opengl/libs/GLES2_dbg/src/texture.cpp
new file mode 100644
index 0000000..a149487
--- /dev/null
+++ b/opengl/libs/GLES2_dbg/src/texture.cpp
@@ -0,0 +1,300 @@
+/*
+ ** Copyright 2011, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include "header.h"
+
+static inline void GetFormatAndBytesPerPixel(const GLenum format, unsigned & bytesPerPixel)
+{
+    switch (format) {
+    case GL_ALPHA:
+        bytesPerPixel = 1;
+        break;
+    case GL_LUMINANCE:
+        bytesPerPixel = 1;
+        break;
+    case GL_LUMINANCE_ALPHA:
+        bytesPerPixel = 2;
+        break;
+    case GL_RGB:
+        bytesPerPixel = 3;
+        break;
+    case GL_RGBA:
+        bytesPerPixel = 4;
+        break;
+
+        // internal formats to avoid conversion
+    case GL_UNSIGNED_SHORT_5_6_5:
+        bytesPerPixel = 2;
+        break;
+    case GL_UNSIGNED_SHORT_4_4_4_4:
+        bytesPerPixel = 2;
+        break;
+    case GL_UNSIGNED_SHORT_5_5_5_1:
+        bytesPerPixel = 2;
+        break;
+    default:
+        assert(0);
+        return;
+    }
+}
+
+#define USE_RLE 0
+#if USE_RLE
+template<typename T>
+void * RLEEncode(const void * pixels, unsigned count, unsigned * encodedSize)
+{
+    // first is a byte indicating data size [1,2,4] bytes
+    // then an unsigned indicating decompressed size
+    // then a byte of header: MSB == 1 indicates run, else literal
+    // LSB7 is run or literal length (actual length - 1)
+
+    const T * data = (T *)pixels;
+    unsigned bufferSize = sizeof(T) * count / 2 + 8;
+    unsigned char * buffer = (unsigned char *)malloc(bufferSize);
+    buffer[0] = sizeof(T);
+    unsigned bufferWritten = 1; // number of bytes written
+    *(unsigned *)(buffer + bufferWritten) = count;
+    bufferWritten += sizeof(count);
+    while (count) {
+        unsigned char run = 1;
+        bool repeat = true;
+        for (run = 1; run < count; run++)
+            if (data[0] != data[run]) {
+                repeat = false;
+                break;
+            } else if (run > 127)
+                break;
+        if (!repeat) {
+            // find literal length
+            for (run = 1; run < count; run++)
+                if (data[run - 1] == data[run])
+                    break;
+                else if (run > 127)
+                    break;
+            unsigned bytesToWrite = 1 + sizeof(T) * run;
+            if (bufferWritten + bytesToWrite > bufferSize) {
+                bufferSize += sizeof(T) * run + 256;
+                buffer = (unsigned char *)realloc(buffer, bufferSize);
+            }
+            buffer[bufferWritten++] = run - 1;
+            for (unsigned i = 0; i < run; i++) {
+                *(T *)(buffer + bufferWritten) = *data;
+                bufferWritten += sizeof(T);
+                data++;
+            }
+            count -= run;
+        } else {
+            unsigned bytesToWrite = 1 + sizeof(T);
+            if (bufferWritten + bytesToWrite > bufferSize) {
+                bufferSize += 256;
+                buffer = (unsigned char *)realloc(buffer, bufferSize);
+            }
+            buffer[bufferWritten++] = (run - 1) | 0x80;
+            *(T *)(buffer + bufferWritten) = data[0];
+            bufferWritten += sizeof(T);
+            data += run;
+            count -= run;
+        }
+    }
+    if (encodedSize)
+        *encodedSize = bufferWritten;
+    return buffer;
+}
+
+void * RLEEncode(const void * pixels, const unsigned bytesPerPixel, const unsigned count, unsigned * encodedSize)
+{
+    switch (bytesPerPixel) {
+    case 4:
+        return RLEEncode<int>(pixels, count, encodedSize);
+    case 2:
+        return RLEEncode<short>(pixels, count, encodedSize);
+    case 1:
+        return RLEEncode<char>(pixels, count, encodedSize);
+    default:
+        assert(0);
+        return NULL;
+    }
+}
+#endif
+
+void API_ENTRY(glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width,
+                             GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)
+{
+//    LOGD("\n*\n* GLESv2_dbg: %s \n*", "glTexImage2D");
+    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+
+    GLESv2Debugger::Message msg, cmd;
+    msg.set_context_id(0);
+    msg.set_has_next_message(true);
+    const bool expectResponse = false;
+    msg.set_expect_response(expectResponse);
+    msg.set_function(GLESv2Debugger::Message_Function_glTexImage2D);
+
+    msg.set_arg0(target);
+    msg.set_arg1(level);
+    msg.set_arg2(internalformat);
+    msg.set_arg3(width);
+    msg.set_arg4(height);
+    msg.set_arg5(border);
+    msg.set_arg6(format);
+    msg.set_arg7(type);
+
+    if (pixels) {
+        assert(internalformat == format);
+        assert(0 == border);
+
+        GLenum newFormat = internalformat;
+        switch (type) {
+        case GL_UNSIGNED_BYTE:
+            break;
+        case GL_UNSIGNED_SHORT_5_6_5:
+        case GL_UNSIGNED_SHORT_4_4_4_4:
+        case GL_UNSIGNED_SHORT_5_5_5_1:
+            newFormat = type;
+            break;
+        default:
+            LOGD("GLESv2_dbg: glTexImage2D type=0x%.4X", type);
+            assert(0);
+        }
+        unsigned bytesPerPixel = 0;
+        GetFormatAndBytesPerPixel(newFormat, bytesPerPixel);
+        assert(0 < bytesPerPixel);
+
+//        LOGD("GLESv2_dbg: glTexImage2D width=%d height=%d level=%d bytesPerPixel=%d",
+//             width, height, level, bytesPerPixel);
+#if USE_RLE
+        unsigned encodedSize = 0;
+        void * data = RLEEncode(pixels, bytesPerPixel, width * height, &encodedSize);
+        msg.set_data(data, encodedSize);
+        free(data);
+        if (encodedSize > bytesPerPixel * width * height)
+            LOGD("GLESv2_dbg: glTexImage2D sending data encodedSize=%d size=%d", encodedSize, bytesPerPixel * width * height);
+#else
+        msg.set_data(pixels, bytesPerPixel * width * height);
+#endif
+    }
+    assert(msg.has_arg3());
+    Send(msg, cmd);
+    if (!expectResponse)
+        cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+
+    while (true) {
+        msg.Clear();
+        clock_t c0 = clock();
+        switch (cmd.function()) {
+        case GLESv2Debugger::Message_Function_CONTINUE:
+            _c->glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+            msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+            msg.set_context_id(0);
+            msg.set_function(GLESv2Debugger::Message_Function_glTexImage2D);
+            msg.set_has_next_message(false);
+            msg.set_expect_response(expectResponse);
+            assert(!msg.has_arg3());
+            Send(msg, cmd);
+            if (!expectResponse)
+                cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+            break;
+        case GLESv2Debugger::Message_Function_SKIP:
+            return;
+        default:
+            ASSERT(0); //GenerateCall(msg, cmd);
+            break;
+        }
+    }
+}
+
+void API_ENTRY(glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+                                    GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
+{
+//    LOGD("\n*\n* GLESv2_dbg: %s \n*", "glTexSubImage2D");
+    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;
+
+    GLESv2Debugger::Message msg, cmd;
+    msg.set_context_id(0);
+    msg.set_has_next_message(true);
+    const bool expectResponse = false;
+    msg.set_expect_response(expectResponse);
+    msg.set_function(GLESv2Debugger::Message_Function_glTexSubImage2D);
+
+    msg.set_arg0(target);
+    msg.set_arg1(level);
+    msg.set_arg2(xoffset);
+    msg.set_arg3(yoffset);
+    msg.set_arg4(width);
+    msg.set_arg5(height);
+    msg.set_arg6(format);
+    msg.set_arg7(type);
+
+    assert(pixels);
+    if (pixels) {
+        GLenum newFormat = format;
+        switch (type) {
+        case GL_UNSIGNED_BYTE:
+            break;
+        case GL_UNSIGNED_SHORT_5_6_5:
+        case GL_UNSIGNED_SHORT_4_4_4_4:
+        case GL_UNSIGNED_SHORT_5_5_5_1:
+            newFormat = type;
+            break;
+        default:
+            assert(0);
+        }
+        unsigned bytesPerPixel = 0;
+        GetFormatAndBytesPerPixel(newFormat, bytesPerPixel);
+        assert(0 < bytesPerPixel);
+
+//        LOGD("GLESv2_dbg: glTexSubImage2D width=%d height=%d level=%d bytesPerPixel=%d",
+//             width, height, level, bytesPerPixel);
+
+#if USE_RLE
+        unsigned encodedSize = 0;
+        void * data = RLEEncode(pixels, bytesPerPixel, width * height, &encodedSize);
+        msg.set_data(data, encodedSize);
+        free(data);
+        if (encodedSize > bytesPerPixel * width * height)
+            LOGD("GLESv2_dbg: glTexImage2D sending data encodedSize=%d size=%d", encodedSize, bytesPerPixel * width * height);
+#else
+        msg.set_data(pixels, bytesPerPixel * width * height);
+#endif
+    }
+
+    Send(msg, cmd);
+    if (!expectResponse)
+        cmd.set_function(GLESv2Debugger::Message_Function_CONTINUE);
+
+    while (true) {
+        msg.Clear();
+        clock_t c0 = clock();
+        switch (cmd.function()) {
+        case GLESv2Debugger::Message_Function_CONTINUE:
+            _c->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+            msg.set_time((float(clock()) - c0) / CLOCKS_PER_SEC);
+            msg.set_function(GLESv2Debugger::Message_Function_glTexImage2D);
+            msg.set_context_id(0);
+            msg.set_has_next_message(false);
+            msg.set_expect_response(expectResponse);
+            Send(msg, cmd);
+            if (!expectResponse)
+                cmd.set_function(GLESv2Debugger::Message_Function_SKIP);
+            break;
+        case GLESv2Debugger::Message_Function_SKIP:
+            return;
+        default:
+            ASSERT(0); //GenerateCall(msg, cmd);
+            break;
+        }
+    }
+}
diff --git a/opengl/libs/debug.in b/opengl/libs/debug.in
new file mode 100644
index 0000000..882b2da
--- /dev/null
+++ b/opengl/libs/debug.in
@@ -0,0 +1,235 @@
+// the following functions are not defined in GLESv2_dbg
+TRACE_GL_VOID(glAlphaFunc, (GLenum func, GLclampf ref), (func, ref), 2, "GLenum", func, "GLclampf", ref)
+TRACE_GL_VOID(glAlphaFuncx, (GLenum func, GLclampx ref), (func, ref), 2, "GLenum", func, "GLclampx", ref)
+TRACE_GL_VOID(glAlphaFuncxOES, (GLenum func, GLclampx ref), (func, ref), 2, "GLenum", func, "GLclampx", ref)
+TRACE_GL_VOID(glBeginPerfMonitorAMD, (GLuint monitor), (monitor), 1, "GLuint", monitor)
+TRACE_GL_VOID(glBindFramebufferOES, (GLenum target, GLuint framebuffer), (target, framebuffer), 2, "GLenum", target, "GLuint", framebuffer)
+TRACE_GL_VOID(glBindRenderbufferOES, (GLenum target, GLuint renderbuffer), (target, renderbuffer), 2, "GLenum", target, "GLuint", renderbuffer)
+TRACE_GL_VOID(glBindVertexArrayOES, (GLuint array), (array), 1, "GLuint", array)
+TRACE_GL_VOID(glBlendEquationOES, (GLenum mode), (mode), 1, "GLenum", mode)
+TRACE_GL_VOID(glBlendEquationSeparateOES, (GLenum modeRGB, GLenum modeAlpha), (modeRGB, modeAlpha), 2, "GLenum", modeRGB, "GLenum", modeAlpha)
+TRACE_GL_VOID(glBlendFuncSeparateOES, (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha), (srcRGB, dstRGB, srcAlpha, dstAlpha), 4, "GLenum", srcRGB, "GLenum", dstRGB, "GLenum", srcAlpha, "GLenum", dstAlpha)
+TRACE_GL(GLenum, glCheckFramebufferStatusOES, (GLenum target), (target), 1, "GLenum", target)
+TRACE_GL_VOID(glClearColorx, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha), (red, green, blue, alpha), 4, "GLclampx", red, "GLclampx", green, "GLclampx", blue, "GLclampx", alpha)
+TRACE_GL_VOID(glClearColorxOES, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha), (red, green, blue, alpha), 4, "GLclampx", red, "GLclampx", green, "GLclampx", blue, "GLclampx", alpha)
+TRACE_GL_VOID(glClearDepthfOES, (GLclampf depth), (depth), 1, "GLclampf", depth)
+TRACE_GL_VOID(glClearDepthx, (GLclampx depth), (depth), 1, "GLclampx", depth)
+TRACE_GL_VOID(glClearDepthxOES, (GLclampx depth), (depth), 1, "GLclampx", depth)
+TRACE_GL_VOID(glClientActiveTexture, (GLenum texture), (texture), 1, "GLenum", texture)
+TRACE_GL_VOID(glClipPlanef, (GLenum plane, const GLfloat *equation), (plane, equation), 2, "GLenum", plane, "const GLfloat *", equation)
+TRACE_GL_VOID(glClipPlanefIMG, (GLenum p, const GLfloat *eqn), (p, eqn), 2, "GLenum", p, "const GLfloat *", eqn)
+TRACE_GL_VOID(glClipPlanefOES, (GLenum plane, const GLfloat *equation), (plane, equation), 2, "GLenum", plane, "const GLfloat *", equation)
+TRACE_GL_VOID(glClipPlanex, (GLenum plane, const GLfixed *equation), (plane, equation), 2, "GLenum", plane, "const GLfixed *", equation)
+TRACE_GL_VOID(glClipPlanexIMG, (GLenum p, const GLfixed *eqn), (p, eqn), 2, "GLenum", p, "const GLfixed *", eqn)
+TRACE_GL_VOID(glClipPlanexOES, (GLenum plane, const GLfixed *equation), (plane, equation), 2, "GLenum", plane, "const GLfixed *", equation)
+TRACE_GL_VOID(glColor4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha), (red, green, blue, alpha), 4, "GLfloat", red, "GLfloat", green, "GLfloat", blue, "GLfloat", alpha)
+TRACE_GL_VOID(glColor4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha), (red, green, blue, alpha), 4, "GLubyte", red, "GLubyte", green, "GLubyte", blue, "GLubyte", alpha)
+TRACE_GL_VOID(glColor4x, (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha), (red, green, blue, alpha), 4, "GLfixed", red, "GLfixed", green, "GLfixed", blue, "GLfixed", alpha)
+TRACE_GL_VOID(glColor4xOES, (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha), (red, green, blue, alpha), 4, "GLfixed", red, "GLfixed", green, "GLfixed", blue, "GLfixed", alpha)
+TRACE_GL_VOID(glColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer), 4, "GLint", size, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glCompressedTexImage3DOES, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data), (target, level, internalformat, width, height, depth, border, imageSize, data), 9, "GLenum", target, "GLint", level, "GLenum", internalformat, "GLsizei", width, "GLsizei", height, "GLsizei", depth, "GLint", border, "GLsizei", imageSize, "const GLvoid*", data)
+TRACE_GL_VOID(glCompressedTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data), 11, "GLenum", target, "GLint", level, "GLint", xoffset, "GLint", yoffset, "GLint", zoffset, "GLsizei", width, "GLsizei", height, "GLsizei", depth, "GLenum", format, "GLsizei", imageSize, "const GLvoid*", data)
+TRACE_GL_VOID(glCopyTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height), (target, level, xoffset, yoffset, zoffset, x, y, width, height), 9, "GLenum", target, "GLint", level, "GLint", xoffset, "GLint", yoffset, "GLint", zoffset, "GLint", x, "GLint", y, "GLsizei", width, "GLsizei", height)
+TRACE_GL_VOID(glCoverageMaskNV, (GLboolean mask), (mask), 1, "GLboolean", mask)
+TRACE_GL_VOID(glCoverageOperationNV, (GLenum operation), (operation), 1, "GLenum", operation)
+TRACE_GL_VOID(glCurrentPaletteMatrixOES, (GLuint matrixpaletteindex), (matrixpaletteindex), 1, "GLuint", matrixpaletteindex)
+TRACE_GL_VOID(glDeleteFencesNV, (GLsizei n, const GLuint *fences), (n, fences), 2, "GLsizei", n, "const GLuint *", fences)
+TRACE_GL_VOID(glDeleteFramebuffersOES, (GLsizei n, const GLuint* framebuffers), (n, framebuffers), 2, "GLsizei", n, "const GLuint*", framebuffers)
+TRACE_GL_VOID(glDeletePerfMonitorsAMD, (GLsizei n, GLuint *monitors), (n, monitors), 2, "GLsizei", n, "GLuint *", monitors)
+TRACE_GL_VOID(glDeleteRenderbuffersOES, (GLsizei n, const GLuint* renderbuffers), (n, renderbuffers), 2, "GLsizei", n, "const GLuint*", renderbuffers)
+TRACE_GL_VOID(glDeleteVertexArraysOES, (GLsizei n, const GLuint *arrays), (n, arrays), 2, "GLsizei", n, "const GLuint *", arrays)
+TRACE_GL_VOID(glDepthRangefOES, (GLclampf zNear, GLclampf zFar), (zNear, zFar), 2, "GLclampf", zNear, "GLclampf", zFar)
+TRACE_GL_VOID(glDepthRangex, (GLclampx zNear, GLclampx zFar), (zNear, zFar), 2, "GLclampx", zNear, "GLclampx", zFar)
+TRACE_GL_VOID(glDepthRangexOES, (GLclampx zNear, GLclampx zFar), (zNear, zFar), 2, "GLclampx", zNear, "GLclampx", zFar)
+TRACE_GL_VOID(glDisableClientState, (GLenum array), (array), 1, "GLenum", array)
+TRACE_GL_VOID(glDisableDriverControlQCOM, (GLuint driverControl), (driverControl), 1, "GLuint", driverControl)
+TRACE_GL_VOID(glDiscardFramebufferEXT, (GLenum target, GLsizei numAttachments, const GLenum *attachments), (target, numAttachments, attachments), 3, "GLenum", target, "GLsizei", numAttachments, "const GLenum *", attachments)
+TRACE_GL_VOID(glDrawTexfOES, (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height), (x, y, z, width, height), 5, "GLfloat", x, "GLfloat", y, "GLfloat", z, "GLfloat", width, "GLfloat", height)
+TRACE_GL_VOID(glDrawTexfvOES, (const GLfloat *coords), (coords), 1, "const GLfloat *", coords)
+TRACE_GL_VOID(glDrawTexiOES, (GLint x, GLint y, GLint z, GLint width, GLint height), (x, y, z, width, height), 5, "GLint", x, "GLint", y, "GLint", z, "GLint", width, "GLint", height)
+TRACE_GL_VOID(glDrawTexivOES, (const GLint *coords), (coords), 1, "const GLint *", coords)
+TRACE_GL_VOID(glDrawTexsOES, (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height), (x, y, z, width, height), 5, "GLshort", x, "GLshort", y, "GLshort", z, "GLshort", width, "GLshort", height)
+TRACE_GL_VOID(glDrawTexsvOES, (const GLshort *coords), (coords), 1, "const GLshort *", coords)
+TRACE_GL_VOID(glDrawTexxOES, (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height), (x, y, z, width, height), 5, "GLfixed", x, "GLfixed", y, "GLfixed", z, "GLfixed", width, "GLfixed", height)
+TRACE_GL_VOID(glDrawTexxvOES, (const GLfixed *coords), (coords), 1, "const GLfixed *", coords)
+TRACE_GL_VOID(glEGLImageTargetRenderbufferStorageOES, (GLenum target, GLeglImageOES image), (target, image), 2, "GLenum", target, "GLeglImageOES", image)
+TRACE_GL_VOID(glEGLImageTargetTexture2DOES, (GLenum target, GLeglImageOES image), (target, image), 2, "GLenum", target, "GLeglImageOES", image)
+TRACE_GL_VOID(glEnableClientState, (GLenum array), (array), 1, "GLenum", array)
+TRACE_GL_VOID(glEnableDriverControlQCOM, (GLuint driverControl), (driverControl), 1, "GLuint", driverControl)
+TRACE_GL_VOID(glEndPerfMonitorAMD, (GLuint monitor), (monitor), 1, "GLuint", monitor)
+TRACE_GL_VOID(glEndTilingQCOM, (GLbitfield preserveMask), (preserveMask), 1, "GLbitfield", preserveMask)
+TRACE_GL_VOID(glExtGetBufferPointervQCOM, (GLenum target, GLvoid **params), (target, params), 2, "GLenum", target, "GLvoid **", params)
+TRACE_GL_VOID(glExtGetBuffersQCOM, (GLuint *buffers, GLint maxBuffers, GLint *numBuffers), (buffers, maxBuffers, numBuffers), 3, "GLuint *", buffers, "GLint", maxBuffers, "GLint *", numBuffers)
+TRACE_GL_VOID(glExtGetFramebuffersQCOM, (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers), (framebuffers, maxFramebuffers, numFramebuffers), 3, "GLuint *", framebuffers, "GLint", maxFramebuffers, "GLint *", numFramebuffers)
+TRACE_GL_VOID(glExtGetProgramBinarySourceQCOM, (GLuint program, GLenum shadertype, GLchar *source, GLint *length), (program, shadertype, source, length), 4, "GLuint", program, "GLenum", shadertype, "GLchar *", source, "GLint *", length)
+TRACE_GL_VOID(glExtGetProgramsQCOM, (GLuint *programs, GLint maxPrograms, GLint *numPrograms), (programs, maxPrograms, numPrograms), 3, "GLuint *", programs, "GLint", maxPrograms, "GLint *", numPrograms)
+TRACE_GL_VOID(glExtGetRenderbuffersQCOM, (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers), (renderbuffers, maxRenderbuffers, numRenderbuffers), 3, "GLuint *", renderbuffers, "GLint", maxRenderbuffers, "GLint *", numRenderbuffers)
+TRACE_GL_VOID(glExtGetShadersQCOM, (GLuint *shaders, GLint maxShaders, GLint *numShaders), (shaders, maxShaders, numShaders), 3, "GLuint *", shaders, "GLint", maxShaders, "GLint *", numShaders)
+TRACE_GL_VOID(glExtGetTexLevelParameterivQCOM, (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params), (texture, face, level, pname, params), 5, "GLuint", texture, "GLenum", face, "GLint", level, "GLenum", pname, "GLint *", params)
+TRACE_GL_VOID(glExtGetTexSubImageQCOM, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels), 11, "GLenum", target, "GLint", level, "GLint", xoffset, "GLint", yoffset, "GLint", zoffset, "GLsizei", width, "GLsizei", height, "GLsizei", depth, "GLenum", format, "GLenum", type, "GLvoid *", texels)
+TRACE_GL_VOID(glExtGetTexturesQCOM, (GLuint *textures, GLint maxTextures, GLint *numTextures), (textures, maxTextures, numTextures), 3, "GLuint *", textures, "GLint", maxTextures, "GLint *", numTextures)
+TRACE_GL(GLboolean, glExtIsProgramBinaryQCOM, (GLuint program), (program), 1, "GLuint", program)
+TRACE_GL_VOID(glExtTexObjectStateOverrideiQCOM, (GLenum target, GLenum pname, GLint param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLint", param)
+TRACE_GL_VOID(glFinishFenceNV, (GLuint fence), (fence), 1, "GLuint", fence)
+TRACE_GL_VOID(glFogf, (GLenum pname, GLfloat param), (pname, param), 2, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glFogfv, (GLenum pname, const GLfloat *params), (pname, params), 2, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glFogx, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glFogxOES, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glFogxv, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glFogxvOES, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glFramebufferRenderbufferOES, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer), (target, attachment, renderbuffertarget, renderbuffer), 4, "GLenum", target, "GLenum", attachment, "GLenum", renderbuffertarget, "GLuint", renderbuffer)
+TRACE_GL_VOID(glFramebufferTexture2DMultisampleIMG, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples), (target, attachment, textarget, texture, level, samples), 6, "GLenum", target, "GLenum", attachment, "GLenum", textarget, "GLuint", texture, "GLint", level, "GLsizei", samples)
+TRACE_GL_VOID(glFramebufferTexture2DOES, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level), (target, attachment, textarget, texture, level), 5, "GLenum", target, "GLenum", attachment, "GLenum", textarget, "GLuint", texture, "GLint", level)
+TRACE_GL_VOID(glFramebufferTexture3DOES, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset), (target, attachment, textarget, texture, level, zoffset), 6, "GLenum", target, "GLenum", attachment, "GLenum", textarget, "GLuint", texture, "GLint", level, "GLint", zoffset)
+TRACE_GL_VOID(glFrustumf, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfloat", left, "GLfloat", right, "GLfloat", bottom, "GLfloat", top, "GLfloat", zNear, "GLfloat", zFar)
+TRACE_GL_VOID(glFrustumfOES, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfloat", left, "GLfloat", right, "GLfloat", bottom, "GLfloat", top, "GLfloat", zNear, "GLfloat", zFar)
+TRACE_GL_VOID(glFrustumx, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfixed", left, "GLfixed", right, "GLfixed", bottom, "GLfixed", top, "GLfixed", zNear, "GLfixed", zFar)
+TRACE_GL_VOID(glFrustumxOES, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfixed", left, "GLfixed", right, "GLfixed", bottom, "GLfixed", top, "GLfixed", zNear, "GLfixed", zFar)
+TRACE_GL_VOID(glGenFencesNV, (GLsizei n, GLuint *fences), (n, fences), 2, "GLsizei", n, "GLuint *", fences)
+TRACE_GL_VOID(glGenFramebuffersOES, (GLsizei n, GLuint* framebuffers), (n, framebuffers), 2, "GLsizei", n, "GLuint*", framebuffers)
+TRACE_GL_VOID(glGenPerfMonitorsAMD, (GLsizei n, GLuint *monitors), (n, monitors), 2, "GLsizei", n, "GLuint *", monitors)
+TRACE_GL_VOID(glGenRenderbuffersOES, (GLsizei n, GLuint* renderbuffers), (n, renderbuffers), 2, "GLsizei", n, "GLuint*", renderbuffers)
+TRACE_GL_VOID(glGenVertexArraysOES, (GLsizei n, GLuint *arrays), (n, arrays), 2, "GLsizei", n, "GLuint *", arrays)
+TRACE_GL_VOID(glGenerateMipmapOES, (GLenum target), (target), 1, "GLenum", target)
+TRACE_GL_VOID(glGetBufferPointervOES, (GLenum target, GLenum pname, GLvoid ** params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "GLvoid **", params)
+TRACE_GL_VOID(glGetClipPlanef, (GLenum pname, GLfloat eqn[4]), (pname, eqn), 2, "GLenum", pname, "GLfloat", eqn)
+TRACE_GL_VOID(glGetClipPlanefOES, (GLenum pname, GLfloat eqn[4]), (pname, eqn), 2, "GLenum", pname, "GLfloat", eqn)
+TRACE_GL_VOID(glGetClipPlanex, (GLenum pname, GLfixed eqn[4]), (pname, eqn), 2, "GLenum", pname, "GLfixed", eqn)
+TRACE_GL_VOID(glGetClipPlanexOES, (GLenum pname, GLfixed eqn[4]), (pname, eqn), 2, "GLenum", pname, "GLfixed", eqn)
+TRACE_GL_VOID(glGetDriverControlStringQCOM, (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString), (driverControl, bufSize, length, driverControlString), 4, "GLuint", driverControl, "GLsizei", bufSize, "GLsizei *", length, "GLchar *", driverControlString)
+TRACE_GL_VOID(glGetDriverControlsQCOM, (GLint *num, GLsizei size, GLuint *driverControls), (num, size, driverControls), 3, "GLint *", num, "GLsizei", size, "GLuint *", driverControls)
+TRACE_GL_VOID(glGetFenceivNV, (GLuint fence, GLenum pname, GLint *params), (fence, pname, params), 3, "GLuint", fence, "GLenum", pname, "GLint *", params)
+TRACE_GL_VOID(glGetFixedv, (GLenum pname, GLfixed *params), (pname, params), 2, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetFixedvOES, (GLenum pname, GLfixed *params), (pname, params), 2, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetFramebufferAttachmentParameterivOES, (GLenum target, GLenum attachment, GLenum pname, GLint* params), (target, attachment, pname, params), 4, "GLenum", target, "GLenum", attachment, "GLenum", pname, "GLint*", params)
+TRACE_GL_VOID(glGetLightfv, (GLenum light, GLenum pname, GLfloat *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "GLfloat *", params)
+TRACE_GL_VOID(glGetLightxv, (GLenum light, GLenum pname, GLfixed *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetLightxvOES, (GLenum light, GLenum pname, GLfixed *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetMaterialfv, (GLenum face, GLenum pname, GLfloat *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "GLfloat *", params)
+TRACE_GL_VOID(glGetMaterialxv, (GLenum face, GLenum pname, GLfixed *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetMaterialxvOES, (GLenum face, GLenum pname, GLfixed *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetPerfMonitorCounterDataAMD, (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten), (monitor, pname, dataSize, data, bytesWritten), 5, "GLuint", monitor, "GLenum", pname, "GLsizei", dataSize, "GLuint *", data, "GLint *", bytesWritten)
+TRACE_GL_VOID(glGetPerfMonitorCounterInfoAMD, (GLuint group, GLuint counter, GLenum pname, GLvoid *data), (group, counter, pname, data), 4, "GLuint", group, "GLuint", counter, "GLenum", pname, "GLvoid *", data)
+TRACE_GL_VOID(glGetPerfMonitorCounterStringAMD, (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString), (group, counter, bufSize, length, counterString), 5, "GLuint", group, "GLuint", counter, "GLsizei", bufSize, "GLsizei *", length, "GLchar *", counterString)
+TRACE_GL_VOID(glGetPerfMonitorCountersAMD, (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters), (group, numCounters, maxActiveCounters, counterSize, counters), 5, "GLuint", group, "GLint *", numCounters, "GLint *", maxActiveCounters, "GLsizei", counterSize, "GLuint *", counters)
+TRACE_GL_VOID(glGetPerfMonitorGroupStringAMD, (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString), (group, bufSize, length, groupString), 4, "GLuint", group, "GLsizei", bufSize, "GLsizei *", length, "GLchar *", groupString)
+TRACE_GL_VOID(glGetPerfMonitorGroupsAMD, (GLint *numGroups, GLsizei groupsSize, GLuint *groups), (numGroups, groupsSize, groups), 3, "GLint *", numGroups, "GLsizei", groupsSize, "GLuint *", groups)
+TRACE_GL_VOID(glGetPointerv, (GLenum pname, GLvoid **params), (pname, params), 2, "GLenum", pname, "GLvoid **", params)
+TRACE_GL_VOID(glGetProgramBinaryOES, (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary), (program, bufSize, length, binaryFormat, binary), 5, "GLuint", program, "GLsizei", bufSize, "GLsizei *", length, "GLenum *", binaryFormat, "GLvoid *", binary)
+TRACE_GL_VOID(glGetRenderbufferParameterivOES, (GLenum target, GLenum pname, GLint* params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "GLint*", params)
+TRACE_GL_VOID(glGetTexEnvfv, (GLenum env, GLenum pname, GLfloat *params), (env, pname, params), 3, "GLenum", env, "GLenum", pname, "GLfloat *", params)
+TRACE_GL_VOID(glGetTexEnviv, (GLenum env, GLenum pname, GLint *params), (env, pname, params), 3, "GLenum", env, "GLenum", pname, "GLint *", params)
+TRACE_GL_VOID(glGetTexEnvxv, (GLenum env, GLenum pname, GLfixed *params), (env, pname, params), 3, "GLenum", env, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetTexEnvxvOES, (GLenum env, GLenum pname, GLfixed *params), (env, pname, params), 3, "GLenum", env, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetTexGenfvOES, (GLenum coord, GLenum pname, GLfloat *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "GLfloat *", params)
+TRACE_GL_VOID(glGetTexGenivOES, (GLenum coord, GLenum pname, GLint *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "GLint *", params)
+TRACE_GL_VOID(glGetTexGenxvOES, (GLenum coord, GLenum pname, GLfixed *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetTexParameterxv, (GLenum target, GLenum pname, GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "GLfixed *", params)
+TRACE_GL_VOID(glGetTexParameterxvOES, (GLenum target, GLenum pname, GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "GLfixed *", params)
+TRACE_GL(GLboolean, glIsFenceNV, (GLuint fence), (fence), 1, "GLuint", fence)
+TRACE_GL(GLboolean, glIsFramebufferOES, (GLuint framebuffer), (framebuffer), 1, "GLuint", framebuffer)
+TRACE_GL(GLboolean, glIsRenderbufferOES, (GLuint renderbuffer), (renderbuffer), 1, "GLuint", renderbuffer)
+TRACE_GL(GLboolean, glIsVertexArrayOES, (GLuint array), (array), 1, "GLuint", array)
+TRACE_GL_VOID(glLightModelf, (GLenum pname, GLfloat param), (pname, param), 2, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glLightModelfv, (GLenum pname, const GLfloat *params), (pname, params), 2, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glLightModelx, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glLightModelxOES, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glLightModelxv, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glLightModelxvOES, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glLightf, (GLenum light, GLenum pname, GLfloat param), (light, pname, param), 3, "GLenum", light, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glLightfv, (GLenum light, GLenum pname, const GLfloat *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glLightx, (GLenum light, GLenum pname, GLfixed param), (light, pname, param), 3, "GLenum", light, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glLightxOES, (GLenum light, GLenum pname, GLfixed param), (light, pname, param), 3, "GLenum", light, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glLightxv, (GLenum light, GLenum pname, const GLfixed *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glLightxvOES, (GLenum light, GLenum pname, const GLfixed *params), (light, pname, params), 3, "GLenum", light, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glLineWidthx, (GLfixed width), (width), 1, "GLfixed", width)
+TRACE_GL_VOID(glLineWidthxOES, (GLfixed width), (width), 1, "GLfixed", width)
+TRACE_GL_VOID(glLoadIdentity, (void), (), 0)
+TRACE_GL_VOID(glLoadMatrixf, (const GLfloat *m), (m), 1, "const GLfloat *", m)
+TRACE_GL_VOID(glLoadMatrixx, (const GLfixed *m), (m), 1, "const GLfixed *", m)
+TRACE_GL_VOID(glLoadMatrixxOES, (const GLfixed *m), (m), 1, "const GLfixed *", m)
+TRACE_GL_VOID(glLoadPaletteFromModelViewMatrixOES, (void), (), 0)
+TRACE_GL_VOID(glLogicOp, (GLenum opcode), (opcode), 1, "GLenum", opcode)
+TRACE_GL(void*, glMapBufferOES, (GLenum target, GLenum access), (target, access), 2, "GLenum", target, "GLenum", access)
+TRACE_GL_VOID(glMaterialf, (GLenum face, GLenum pname, GLfloat param), (face, pname, param), 3, "GLenum", face, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glMaterialfv, (GLenum face, GLenum pname, const GLfloat *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glMaterialx, (GLenum face, GLenum pname, GLfixed param), (face, pname, param), 3, "GLenum", face, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glMaterialxOES, (GLenum face, GLenum pname, GLfixed param), (face, pname, param), 3, "GLenum", face, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glMaterialxv, (GLenum face, GLenum pname, const GLfixed *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glMaterialxvOES, (GLenum face, GLenum pname, const GLfixed *params), (face, pname, params), 3, "GLenum", face, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glMatrixIndexPointerOES, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer), 4, "GLint", size, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glMatrixMode, (GLenum mode), (mode), 1, "GLenum", mode)
+TRACE_GL_VOID(glMultMatrixf, (const GLfloat *m), (m), 1, "const GLfloat *", m)
+TRACE_GL_VOID(glMultMatrixx, (const GLfixed *m), (m), 1, "const GLfixed *", m)
+TRACE_GL_VOID(glMultMatrixxOES, (const GLfixed *m), (m), 1, "const GLfixed *", m)
+TRACE_GL_VOID(glMultiDrawArraysEXT, (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount), (mode, first, count, primcount), 4, "GLenum", mode, "GLint *", first, "GLsizei *", count, "GLsizei", primcount)
+TRACE_GL_VOID(glMultiDrawElementsEXT, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount), (mode, count, type, indices, primcount), 5, "GLenum", mode, "const GLsizei *", count, "GLenum", type, "const GLvoid* *", indices, "GLsizei", primcount)
+TRACE_GL_VOID(glMultiTexCoord4f, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q), (target, s, t, r, q), 5, "GLenum", target, "GLfloat", s, "GLfloat", t, "GLfloat", r, "GLfloat", q)
+TRACE_GL_VOID(glMultiTexCoord4x, (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q), (target, s, t, r, q), 5, "GLenum", target, "GLfixed", s, "GLfixed", t, "GLfixed", r, "GLfixed", q)
+TRACE_GL_VOID(glMultiTexCoord4xOES, (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q), (target, s, t, r, q), 5, "GLenum", target, "GLfixed", s, "GLfixed", t, "GLfixed", r, "GLfixed", q)
+TRACE_GL_VOID(glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz), (nx, ny, nz), 3, "GLfloat", nx, "GLfloat", ny, "GLfloat", nz)
+TRACE_GL_VOID(glNormal3x, (GLfixed nx, GLfixed ny, GLfixed nz), (nx, ny, nz), 3, "GLfixed", nx, "GLfixed", ny, "GLfixed", nz)
+TRACE_GL_VOID(glNormal3xOES, (GLfixed nx, GLfixed ny, GLfixed nz), (nx, ny, nz), 3, "GLfixed", nx, "GLfixed", ny, "GLfixed", nz)
+TRACE_GL_VOID(glNormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer), (type, stride, pointer), 3, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glOrthof, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfloat", left, "GLfloat", right, "GLfloat", bottom, "GLfloat", top, "GLfloat", zNear, "GLfloat", zFar)
+TRACE_GL_VOID(glOrthofOES, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfloat", left, "GLfloat", right, "GLfloat", bottom, "GLfloat", top, "GLfloat", zNear, "GLfloat", zFar)
+TRACE_GL_VOID(glOrthox, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfixed", left, "GLfixed", right, "GLfixed", bottom, "GLfixed", top, "GLfixed", zNear, "GLfixed", zFar)
+TRACE_GL_VOID(glOrthoxOES, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar), 6, "GLfixed", left, "GLfixed", right, "GLfixed", bottom, "GLfixed", top, "GLfixed", zNear, "GLfixed", zFar)
+TRACE_GL_VOID(glPointParameterf, (GLenum pname, GLfloat param), (pname, param), 2, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glPointParameterfv, (GLenum pname, const GLfloat *params), (pname, params), 2, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glPointParameterx, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glPointParameterxOES, (GLenum pname, GLfixed param), (pname, param), 2, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glPointParameterxv, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glPointParameterxvOES, (GLenum pname, const GLfixed *params), (pname, params), 2, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glPointSize, (GLfloat size), (size), 1, "GLfloat", size)
+TRACE_GL_VOID(glPointSizePointerOES, (GLenum type, GLsizei stride, const GLvoid *pointer), (type, stride, pointer), 3, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glPointSizex, (GLfixed size), (size), 1, "GLfixed", size)
+TRACE_GL_VOID(glPointSizexOES, (GLfixed size), (size), 1, "GLfixed", size)
+TRACE_GL_VOID(glPolygonOffsetx, (GLfixed factor, GLfixed units), (factor, units), 2, "GLfixed", factor, "GLfixed", units)
+TRACE_GL_VOID(glPolygonOffsetxOES, (GLfixed factor, GLfixed units), (factor, units), 2, "GLfixed", factor, "GLfixed", units)
+TRACE_GL_VOID(glPopMatrix, (void), (), 0)
+TRACE_GL_VOID(glProgramBinaryOES, (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length), (program, binaryFormat, binary, length), 4, "GLuint", program, "GLenum", binaryFormat, "const GLvoid *", binary, "GLint", length)
+TRACE_GL_VOID(glPushMatrix, (void), (), 0)
+TRACE_GL(GLbitfield, glQueryMatrixxOES, (GLfixed mantissa[16], GLint exponent[16]), (mantissa, exponent), 2, "GLfixed", mantissa, "GLint", exponent)
+TRACE_GL_VOID(glRenderbufferStorageMultisampleIMG, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height), (target, samples, internalformat, width, height), 5, "GLenum", target, "GLsizei", samples, "GLenum", internalformat, "GLsizei", width, "GLsizei", height)
+TRACE_GL_VOID(glRenderbufferStorageOES, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height), (target, internalformat, width, height), 4, "GLenum", target, "GLenum", internalformat, "GLsizei", width, "GLsizei", height)
+TRACE_GL_VOID(glRotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z), (angle, x, y, z), 4, "GLfloat", angle, "GLfloat", x, "GLfloat", y, "GLfloat", z)
+TRACE_GL_VOID(glRotatex, (GLfixed angle, GLfixed x, GLfixed y, GLfixed z), (angle, x, y, z), 4, "GLfixed", angle, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL_VOID(glRotatexOES, (GLfixed angle, GLfixed x, GLfixed y, GLfixed z), (angle, x, y, z), 4, "GLfixed", angle, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL_VOID(glSampleCoveragex, (GLclampx value, GLboolean invert), (value, invert), 2, "GLclampx", value, "GLboolean", invert)
+TRACE_GL_VOID(glSampleCoveragexOES, (GLclampx value, GLboolean invert), (value, invert), 2, "GLclampx", value, "GLboolean", invert)
+TRACE_GL_VOID(glScalef, (GLfloat x, GLfloat y, GLfloat z), (x, y, z), 3, "GLfloat", x, "GLfloat", y, "GLfloat", z)
+TRACE_GL_VOID(glScalex, (GLfixed x, GLfixed y, GLfixed z), (x, y, z), 3, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL_VOID(glScalexOES, (GLfixed x, GLfixed y, GLfixed z), (x, y, z), 3, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL_VOID(glSelectPerfMonitorCountersAMD, (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList), (monitor, enable, group, numCounters, countersList), 5, "GLuint", monitor, "GLboolean", enable, "GLuint", group, "GLint", numCounters, "GLuint *", countersList)
+TRACE_GL_VOID(glSetFenceNV, (GLuint fence, GLenum condition), (fence, condition), 2, "GLuint", fence, "GLenum", condition)
+TRACE_GL_VOID(glShadeModel, (GLenum mode), (mode), 1, "GLenum", mode)
+TRACE_GL_VOID(glStartTilingQCOM, (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask), (x, y, width, height, preserveMask), 5, "GLuint", x, "GLuint", y, "GLuint", width, "GLuint", height, "GLbitfield", preserveMask)
+TRACE_GL(GLboolean, glTestFenceNV, (GLuint fence), (fence), 1, "GLuint", fence)
+TRACE_GL_VOID(glTexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer), 4, "GLint", size, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glTexEnvf, (GLenum target, GLenum pname, GLfloat param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glTexEnvfv, (GLenum target, GLenum pname, const GLfloat *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glTexEnvi, (GLenum target, GLenum pname, GLint param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLint", param)
+TRACE_GL_VOID(glTexEnviv, (GLenum target, GLenum pname, const GLint *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLint *", params)
+TRACE_GL_VOID(glTexEnvx, (GLenum target, GLenum pname, GLfixed param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glTexEnvxOES, (GLenum target, GLenum pname, GLfixed param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glTexEnvxv, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glTexEnvxvOES, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glTexGenfOES, (GLenum coord, GLenum pname, GLfloat param), (coord, pname, param), 3, "GLenum", coord, "GLenum", pname, "GLfloat", param)
+TRACE_GL_VOID(glTexGenfvOES, (GLenum coord, GLenum pname, const GLfloat *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "const GLfloat *", params)
+TRACE_GL_VOID(glTexGeniOES, (GLenum coord, GLenum pname, GLint param), (coord, pname, param), 3, "GLenum", coord, "GLenum", pname, "GLint", param)
+TRACE_GL_VOID(glTexGenivOES, (GLenum coord, GLenum pname, const GLint *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "const GLint *", params)
+TRACE_GL_VOID(glTexGenxOES, (GLenum coord, GLenum pname, GLfixed param), (coord, pname, param), 3, "GLenum", coord, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glTexGenxvOES, (GLenum coord, GLenum pname, const GLfixed *params), (coord, pname, params), 3, "GLenum", coord, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glTexImage3DOES, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels), (target, level, internalformat, width, height, depth, border, format, type, pixels), 10, "GLenum", target, "GLint", level, "GLenum", internalformat, "GLsizei", width, "GLsizei", height, "GLsizei", depth, "GLint", border, "GLenum", format, "GLenum", type, "const GLvoid*", pixels)
+TRACE_GL_VOID(glTexParameterx, (GLenum target, GLenum pname, GLfixed param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glTexParameterxOES, (GLenum target, GLenum pname, GLfixed param), (target, pname, param), 3, "GLenum", target, "GLenum", pname, "GLfixed", param)
+TRACE_GL_VOID(glTexParameterxv, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glTexParameterxvOES, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params), 3, "GLenum", target, "GLenum", pname, "const GLfixed *", params)
+TRACE_GL_VOID(glTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels), 11, "GLenum", target, "GLint", level, "GLint", xoffset, "GLint", yoffset, "GLint", zoffset, "GLsizei", width, "GLsizei", height, "GLsizei", depth, "GLenum", format, "GLenum", type, "const GLvoid*", pixels)
+TRACE_GL_VOID(glTranslatef, (GLfloat x, GLfloat y, GLfloat z), (x, y, z), 3, "GLfloat", x, "GLfloat", y, "GLfloat", z)
+TRACE_GL_VOID(glTranslatex, (GLfixed x, GLfixed y, GLfixed z), (x, y, z), 3, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL_VOID(glTranslatexOES, (GLfixed x, GLfixed y, GLfixed z), (x, y, z), 3, "GLfixed", x, "GLfixed", y, "GLfixed", z)
+TRACE_GL(GLboolean, glUnmapBufferOES, (GLenum target), (target), 1, "GLenum", target)
+TRACE_GL_VOID(glVertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer), 4, "GLint", size, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
+TRACE_GL_VOID(glWeightPointerOES, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer), 4, "GLint", size, "GLenum", type, "GLsizei", stride, "const GLvoid *", pointer)
