[evas_gl_thread] Refactoring evas gl thread 59/139659/5
authorJoogab Yun <joogab.yun@samsung.com>
Wed, 19 Jul 2017 10:45:45 +0000 (19:45 +0900)
committerjoogab yun <joogab.yun@samsung.com>
Tue, 25 Jul 2017 04:13:35 +0000 (04:13 +0000)
1. combine the gl and evgl threads together
   : export EVAS_GL_RENDER_THREAD=1
2. Changed the pushing method of thread commands

    Now user can allocate a command buffer first, then enqueue it.
    It will be free automatically after callback is called.

    GL_TH_ST(command) *buf;
    void *thcmd_ref;
    buf = evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL,
                                    sizeof(GL_TH_ST(command)),
                                    &thcmd_ref);
    buf->xxx = xxxx; // Setup content
    evas_gl_thread_cmd_enqueue(thcmd_ref
                               GL_TH_CB(command),
                               EVAS_GL_THREAD_MODE_FINISH);
3. Refactoring Thread functions of EGL/GLX to the new form
4. Replace GL_TH and EVGL_TH to the new form
5. Refactoring EvasGL macro to attach thread funcs
6. Replace dlopen'ed symbols (glsym_XXX)
7. Replace functional threading codes to the new form
8. Enable direct rendering when evas gl thread is On

Change-Id: Ie88edd77f670b59ac5fae8ce9c34753c2bd36009

48 files changed:
src/Makefile_Evas.am
src/lib/evas/common/evas_thread_render.c
src/lib/evas/include/evas_common_private.h
src/modules/evas/engines/gl_common/evas_gl_3d.c
src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c
src/modules/evas/engines/gl_common/evas_gl_3d_shader.c
src/modules/evas/engines/gl_common/evas_gl_api.c
src/modules/evas/engines/gl_common/evas_gl_api_def.h
src/modules/evas/engines/gl_common/evas_gl_api_ext.c
src/modules/evas/engines/gl_common/evas_gl_api_ext.h
src/modules/evas/engines/gl_common/evas_gl_api_ext_def.h
src/modules/evas/engines/gl_common/evas_gl_api_gles1.c
src/modules/evas/engines/gl_common/evas_gl_api_gles1_def.h [new file with mode: 0644]
src/modules/evas/engines/gl_common/evas_gl_api_gles3_def.h
src/modules/evas/engines/gl_common/evas_gl_common.h
src/modules/evas/engines/gl_common/evas_gl_context.c
src/modules/evas/engines/gl_common/evas_gl_core.c
src/modules/evas/engines/gl_common/evas_gl_core_private.h
src/modules/evas/engines/gl_common/evas_gl_file_cache.c
src/modules/evas/engines/gl_common/evas_gl_line.c
src/modules/evas/engines/gl_common/evas_gl_shader.c
src/modules/evas/engines/gl_common/evas_gl_texture.c
src/modules/evas/engines/gl_common/evas_gl_thread.c
src/modules/evas/engines/gl_common/evas_gl_thread.h
src/modules/evas/engines/gl_common/evas_gl_thread_egl.c
src/modules/evas/engines/gl_common/evas_gl_thread_egl.h
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.c [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.h [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.c [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.h [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.c [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.h [deleted file]
src/modules/evas/engines/gl_common/evas_gl_thread_gl.c
src/modules/evas/engines/gl_common/evas_gl_thread_gl.h
src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c
src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.h
src/modules/evas/engines/gl_common/evas_gl_thread_gl_link_generated.c
src/modules/evas/engines/gl_common/evas_gl_thread_gl_link_generated.h
src/modules/evas/engines/gl_common/evas_gl_thread_glx.c
src/modules/evas/engines/gl_common/evas_gl_thread_glx.h
src/modules/evas/engines/gl_generic/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.c
src/modules/evas/engines/gl_x11/evas_x_main.c
src/modules/evas/engines/wayland_egl/evas_engine.c
src/modules/evas/engines/wayland_egl/evas_engine.h [changed mode: 0755->0644]
src/modules/evas/engines/wayland_egl/evas_wl_main.c
src/utils/evas/generate_gl_thread_api.py [changed mode: 0755->0644]
src/utils/evas/gl_api_def.txt

index 5b82581..b495c4c 100644 (file)
@@ -798,7 +798,10 @@ modules_evas_engines_gl_generic_module_la_CFLAGS = \
 -DEVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC \
 -I$(top_builddir)/src/lib/efl \
 -I$(top_srcdir)/src/lib/evas/include \
+-I$(top_builddir)/src/lib/evas/include \
 -I$(top_srcdir)/src/lib/evas/cserve2 \
+-I$(top_srcdir)/src/lib/evas/filters \
+-I$(top_builddir)/src/lib/evas/canvas \
 -I$(top_srcdir)/src/modules/evas/engines/gl_common \
 -I$(top_builddir)/src/modules/evas/engines/gl_generic \
 @evas_engine_gl_common_cflags@ \
@@ -920,7 +923,8 @@ GL_X11_SOURCES = \
 $(GL_COMMON_THREAD_SOURCES) \
 modules/evas/engines/gl_x11/evas_engine.c \
 modules/evas/engines/gl_x11/evas_x_main.c \
-modules/evas/engines/gl_x11/evas_engine.h
+modules/evas/engines/gl_x11/evas_engine.h \
+modules/evas/engines/gl_x11/Evas_Engine_GL_X11.h
 if EVAS_STATIC_BUILD_GL_X11
 lib_evas_libevas_la_SOURCES += $(GL_X11_SOURCES)
 lib_evas_libevas_la_CPPFLAGS += \
@@ -1140,7 +1144,8 @@ WAYLAND_EGL_SOURCES = \
 $(GL_COMMON_THREAD_SOURCES) \
 modules/evas/engines/wayland_egl/evas_engine.c \
 modules/evas/engines/wayland_egl/evas_wl_main.c \
-modules/evas/engines/wayland_egl/evas_engine.h
+modules/evas/engines/wayland_egl/evas_engine.h \
+modules/evas/engines/wayland_common/Evas_Engine_Wayland.h
 if EVAS_STATIC_BUILD_WAYLAND_EGL
 lib_evas_libevas_la_SOURCES += $(WAYLAND_EGL_SOURCES)
 lib_evas_libevas_la_CPPFLAGS += @evas_engine_wayland_egl_cflags@
index 1f473cc..1bb43a9 100644 (file)
@@ -24,12 +24,53 @@ static int evas_threads_gl_init_count = 0;
 
 static Evas_Thread evas_thread_software;
 static Evas_Thread evas_thread_gl;
-static Evas_Thread evas_thread_evgl;
+//static Evas_Thread evas_thread_evgl;
 
 #define SHUTDOWN_TIMEOUT_RESET (0)
 #define SHUTDOWN_TIMEOUT_CHECK (1)
 #define SHUTDOWN_TIMEOUT (3000)
 
+struct fence_stuff {
+   Eina_Lock lock;
+   Eina_Condition cond;
+};
+
+static void
+_evas_thread_queue_fence(void *data)
+{
+   struct fence_stuff *f;
+
+   f = data;
+
+   eina_lock_take(&f->lock);
+   eina_condition_signal(&f->cond);
+   eina_lock_release(&f->lock);
+}
+
+EAPI void
+evas_thread_queue_wait(void)
+{
+   struct fence_stuff f;
+
+   /* No shortcuts here - if the thread queue looks empty it could just mean
+    * it's being processed.  Need a round trip.
+    */
+   if (!eina_lock_new(&f.lock)) return;
+   if (!eina_condition_new(&f.cond, &f.lock))
+     {
+        eina_lock_free(&f.lock);
+        return;
+     }
+
+   eina_lock_take(&f.lock);
+   evas_thread_queue_flush(_evas_thread_queue_fence, &f);
+   eina_condition_wait(&f.cond);
+   eina_lock_release(&f.lock);
+
+   eina_lock_free(&f.lock);
+   eina_condition_free(&f.cond);
+}
+
 static Eina_Bool
 _shutdown_timeout(double *time, int mode, int timeout_ms)
 {
@@ -43,35 +84,24 @@ _shutdown_timeout(double *time, int mode, int timeout_ms)
 }
 
 static void
-evas_thread_queue_append(Evas_Thread *ev_thread, Evas_Thread_Command_Cb cb, void *data, Eina_Bool do_flush EINA_UNUSED, Eina_Bool need_finish, Eina_Bool do_finish)
+evas_thread_queue_append(Evas_Thread *ev_thread, Evas_Thread_Command *cmd, Eina_Bool do_flush EINA_UNUSED, Eina_Bool need_finish, Eina_Bool do_finish)
 {
-  Evas_Thread_Command *cmd;
-  void *ref;
-
-  cmd = eina_thread_queue_send(ev_thread->thread_queue_command, sizeof(Evas_Thread_Command), &ref);
-
-
-  if (cmd)
+   if (!cmd)
     {
-      cmd->cb = cb;
-      cmd->data = data;
+        ERR("Command is not passed. Do not call this function directly.");
+        return;
+     }
 
         if (need_finish)
         cmd->finish = EINA_TRUE;
       else
         cmd->finish = EINA_FALSE;
 
-      eina_thread_queue_send_done(ev_thread->thread_queue_command, ref);
-    }
-  else
-    {
-      ERR("Out of memory allocating thread command.");
-      return;
-    }
+   eina_thread_queue_send_done(ev_thread->thread_queue_command, cmd->thq_ref);
 
   if (do_finish)
     {
-      while(EINA_TRUE)
+        while (EINA_TRUE)
         {
           void *finish_ref;
           Evas_Thread_Finish_Reply *rep;
@@ -90,38 +120,110 @@ evas_thread_queue_append(Evas_Thread *ev_thread, Evas_Thread_Command_Cb cb, void
 EAPI void
 evas_thread_cmd_enqueue(Evas_Thread_Command_Cb cb, void *data)
 {
-   evas_thread_queue_append(&evas_thread_software, cb, data, EINA_FALSE, EINA_FALSE, EINA_FALSE);
+   Evas_Thread_Command *cmd;
+   void *thq_ref;
+
+   cmd = eina_thread_queue_send(evas_thread_software.thread_queue_command, sizeof(Evas_Thread_Command), &thq_ref);
+   if (cmd)
+     {
+        cmd->thq_ref = thq_ref;
+        cmd->data = data;
+        cmd->cb = cb;
+        evas_thread_queue_append(&evas_thread_software, cmd, EINA_FALSE, EINA_FALSE, EINA_FALSE);
+     }
+   else
+     {
+        ERR("Out of memory allocating thread command.");
+     }
 }
 
 EAPI void
 evas_thread_queue_flush(Evas_Thread_Command_Cb cb, void *data)
 {
-   evas_thread_queue_append(&evas_thread_software, cb, data, EINA_TRUE, EINA_FALSE, EINA_FALSE);
+   Evas_Thread_Command *cmd;
+   void *thq_ref;
+
+   cmd = eina_thread_queue_send(evas_thread_software.thread_queue_command, sizeof(Evas_Thread_Command), &thq_ref);
+   if (cmd)
+     {
+        cmd->thq_ref = thq_ref;
+        cmd->data = data;
+        cmd->cb = cb;
+        evas_thread_queue_append(&evas_thread_software, cmd, EINA_TRUE, EINA_FALSE, EINA_FALSE);
+     }
+   else
+     {
+        ERR("Out of memory allocating thread command.");
+     }
 }
 
-EAPI void
-evas_gl_thread_cmd_enqueue(int thread_type, Evas_Thread_Command_Cb cb, void *data, int thread_mode)
+EAPI void *
+evas_gl_thread_cmd_create(int thread_type, int length, void **ref)
 {
   Evas_Thread *ev_thread = NULL;
+   Evas_Thread_Command *cmd;
+   void *thq_ref;
 
   if (thread_type == EVAS_GL_THREAD_TYPE_GL)
     ev_thread = &evas_thread_gl;
   else if (thread_type == EVAS_GL_THREAD_TYPE_EVGL)
-    ev_thread = &evas_thread_evgl;
+    ev_thread = &evas_thread_gl;
   else
     {
       ERR("GL thread type is invalid");
       goto out;
     }
 
+   cmd = eina_thread_queue_send(ev_thread->thread_queue_command, sizeof(Evas_Thread_Command) + length, &thq_ref);
+   if (cmd)
+     {
+        cmd->thq_ref = thq_ref;
+        cmd->thread_type = thread_type;
+        cmd->data = (char *)cmd + sizeof(Evas_Thread_Command);
+        *ref = cmd;
+
+        return cmd->data;
+     }
+   else
+     {
+        ERR("Out of memory allocating thread command.");
+     }
+out:
+   return NULL;
+}
+
+EAPI void
+evas_gl_thread_cmd_enqueue(void *ref, Evas_Thread_Command_Cb cb, int thread_mode)
+{
+   Evas_Thread *ev_thread = NULL;
+   Evas_Thread_Command *cmd = ref;
+
+   if (!cmd)
+     {
+        ERR("Command is not passed. Do not call this function directly.");
+        goto out;
+     }
+
+   cmd->cb = cb;
+
+   if (cmd->thread_type == EVAS_GL_THREAD_TYPE_GL)
+      ev_thread = &evas_thread_gl;
+   else if (cmd->thread_type == EVAS_GL_THREAD_TYPE_EVGL)
+      ev_thread = &evas_thread_gl;
+   else
+     {
+        ERR("GL thread type is invalid");
+        goto out;
+     }
+
   if (thread_mode == EVAS_GL_THREAD_MODE_ENQUEUE)
-     evas_thread_queue_append(ev_thread, cb, data, EINA_FALSE, EINA_FALSE, EINA_FALSE);
+      evas_thread_queue_append(ev_thread, cmd, EINA_FALSE, EINA_FALSE, EINA_FALSE);
   else if (thread_mode == EVAS_GL_THREAD_MODE_FLUSH)
-     evas_thread_queue_append(ev_thread, cb, data, EINA_TRUE, EINA_FALSE, EINA_FALSE);
+      evas_thread_queue_append(ev_thread, cmd, EINA_TRUE, EINA_FALSE, EINA_FALSE);
   else if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     evas_thread_queue_append(ev_thread, cb, data, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+      evas_thread_queue_append(ev_thread, cmd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
   else if (thread_mode == EVAS_GL_THREAD_MODE_ASYNC_FINISH)
-     evas_thread_queue_append(ev_thread, cb, data, EINA_TRUE, EINA_TRUE, EINA_FALSE);
+      evas_thread_queue_append(ev_thread, cmd, EINA_TRUE, EINA_TRUE, EINA_FALSE);
   else
     {
       ERR("GL thread mode is invalid");
@@ -140,7 +242,7 @@ evas_gl_thread_cmd_wait(int thread_type, void *data, Eina_Bool *finished_ptr)
    if (thread_type == EVAS_GL_THREAD_TYPE_GL)
       ev_thread = &evas_thread_gl;
    else if (thread_type == EVAS_GL_THREAD_TYPE_EVGL)
-      ev_thread = &evas_thread_evgl;
+      ev_thread = &evas_thread_gl;
    else
      {
         ERR("GL thread type is invalid");
@@ -157,8 +259,6 @@ evas_gl_thread_cmd_wait(int thread_type, void *data, Eina_Bool *finished_ptr)
           {
              eina_thread_queue_wait_done(ev_thread->thread_queue_finish, finish_ref);
              return;
-
-
           }
         eina_thread_queue_wait_done(ev_thread->thread_queue_finish, finish_ref);
      }
@@ -175,7 +275,7 @@ evas_gl_thread_get(int thread_type)
   if (thread_type == EVAS_GL_THREAD_TYPE_GL)
     ev_thread = &evas_thread_gl;
   else if (thread_type == EVAS_GL_THREAD_TYPE_EVGL)
-    ev_thread = &evas_thread_evgl;
+    ev_thread = &evas_thread_gl;
   else
     {
       ERR("GL thread type is invalid");
@@ -188,6 +288,7 @@ out:
   return (Eina_Thread)NULL;
 }
 
+
 static void*
 evas_thread_worker_func(void *data, Eina_Thread thread EINA_UNUSED)
 {
@@ -219,7 +320,6 @@ evas_thread_worker_func(void *data, Eina_Thread thread EINA_UNUSED)
               rep->data = cmd->data;
               eina_thread_queue_send_done(ev_thread->thread_queue_finish, finish_ref);
             }
-
         }
       else
         {
@@ -231,7 +331,6 @@ evas_thread_worker_func(void *data, Eina_Thread thread EINA_UNUSED)
 
 out:
   ev_thread->exited = 1;
-
   return NULL;
 }
 
@@ -276,6 +375,7 @@ fail_on_thread_queue_command_creation:
   ev_thread->exited = 1;
   return EINA_FALSE;
 }
+
 static void
 evas_thread_shutdown(Evas_Thread *ev_thread)
 {
@@ -307,7 +407,6 @@ evas_thread_shutdown(Evas_Thread *ev_thread)
     }
 
   eina_thread_join(ev_thread->worker);
-
 timeout_shutdown:
   eina_thread_queue_free(ev_thread->thread_queue_command);
   eina_thread_queue_free(ev_thread->thread_queue_finish);
@@ -326,7 +425,7 @@ evas_threads_sw_init(void)
       goto fail_on_eina_thread_init;
     }
 
-  if (!evas_thread_init(&evas_thread_software, "Evas-thread-wk-sw"))
+  if (!evas_thread_init(&evas_thread_software, "Evas-sw-thread-wk"))
     goto fail_on_software_thread_init;
   return evas_threads_sw_init_count;
 
@@ -348,14 +447,14 @@ evas_threads_gl_init(void)
       goto fail_on_eina_thread_init;
     }
 
-  if (!evas_thread_init(&evas_thread_gl, "Evas-thread-wk-gl"))
+  if (!evas_thread_init(&evas_thread_gl, "Evas-gl-thread-wk"))
     goto fail_on_gl_thread_init;
-  if (!evas_thread_init(&evas_thread_evgl, "Evas-thread-wk-evgl"))
-    goto fail_on_evgl_thread_init;
+//  if (!evas_thread_init(&evas_thread_evgl, "Evas-evgl-thread-wk"))
+//    goto fail_on_evgl_thread_init;
   return evas_threads_gl_init_count;
 
-fail_on_evgl_thread_init:
-  evas_thread_shutdown(&evas_thread_gl);
+//fail_on_evgl_thread_init:
+//  evas_thread_shutdown(&evas_thread_gl);
 fail_on_gl_thread_init:
   eina_threads_shutdown();
 fail_on_eina_thread_init:
@@ -393,10 +492,9 @@ evas_threads_gl_shutdown(void)
   if (--evas_threads_gl_init_count)
     return evas_threads_gl_init_count;
 
-  evas_thread_shutdown(&evas_thread_evgl);
+//  evas_thread_shutdown(&evas_thread_evgl);
   evas_thread_shutdown(&evas_thread_gl);
 
-
   eina_threads_shutdown();
 
   return 0;
index 30c9f87..38f87b1 100644 (file)
@@ -476,9 +476,11 @@ typedef struct _Evas_Thread_Command Evas_Thread_Command;
 struct _Evas_Thread_Command
 {
    Eina_Thread_Queue_Msg thq_head;
+   int thread_type;
    Evas_Thread_Command_Cb cb;
    void *data;
    Eina_Bool finish;
+   void *thq_ref;
 };
 
 /*****************************************************************************/
@@ -1304,6 +1306,8 @@ Tilebuf_Rect *evas_common_regionbuf_rects_get (Regionbuf *rb);
 
 void              evas_font_dir_cache_free(void);
 
+EAPI void         evas_thread_queue_wait(void);
+
 EAPI int          evas_async_events_process_blocking(void);
 void             evas_render_rendering_wait(Evas_Public_Data *evas);
 void              evas_all_sync(void);
@@ -1323,7 +1327,8 @@ EAPI int          evas_threads_sw_shutdown(void);
 EAPI int          evas_threads_gl_shutdown(void);
 EAPI void         evas_thread_cmd_enqueue(Evas_Thread_Command_Cb cb, void *data);
 EAPI void         evas_thread_queue_flush(Evas_Thread_Command_Cb cb, void *data);
-EAPI void         evas_gl_thread_cmd_enqueue(int thread_type, Evas_Thread_Command_Cb cb, void *data, int thread_mode);
+EAPI void        *evas_gl_thread_cmd_create(int thread_type, int length, void **ref);
+EAPI void         evas_gl_thread_cmd_enqueue(void *ref, Evas_Thread_Command_Cb cb, int thread_mode);
 EAPI void         evas_gl_thread_cmd_wait(int thread_type, void *data, Eina_Bool *finished_ptr);
 EAPI Eina_Thread  evas_gl_thread_get(int thread_type);
 
index 959987e..73fcf84 100644 (file)
@@ -23,15 +23,15 @@ e3d_texture_param_update(E3D_Texture *texture)
 {
    if (texture->wrap_dirty)
      {
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t);
         texture->wrap_dirty = EINA_FALSE;
      }
 
    if (texture->filter_dirty)
      {
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->filter_min);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->filter_mag);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->filter_min);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->filter_mag);
         texture->filter_dirty = EINA_FALSE;
      }
 }
@@ -268,6 +268,27 @@ e3d_texture_filter_get(const E3D_Texture *texture,
      *mag = _to_e3d_texture_filter(texture->filter_mag);
 }
 
+static void
+_gen_texture_2d(GLuint *texture, GLenum wrap_type, GLfloat filter_type)
+{
+   GL_TH(glGenTextures, 1, texture);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, *texture);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_type);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_type);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter_type);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter_type);
+}
+
+static void
+_gen_depth_stencil_buffer(GLuint *buffer, GLenum format, GLenum attach,
+                          int size_w, int size_h)
+{
+   GL_TH(glGenRenderbuffers, 1, buffer);
+   GL_TH(glBindRenderbuffer, GL_RENDERBUFFER, *buffer);
+   GL_TH(glRenderbufferStorage, GL_RENDERBUFFER, format, size_w, size_h);
+   GL_TH(glFramebufferRenderbuffer, GL_FRAMEBUFFER, attach, GL_RENDERBUFFER, *buffer);
+}
+
 E3D_Drawable *
 e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_format)
 {
@@ -278,59 +299,33 @@ e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_fo
    GLuint         stencil_buf = 0;
    Eina_Bool      depth_stencil = EINA_FALSE;
 
-   glGenTextures_thread_cmd(1, &tex);
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
+   _gen_texture_2d(&tex, GL_CLAMP_TO_EDGE, GL_NEAREST);
    if (alpha)
-     glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+     GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    else
-     glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-
-   glGenTextures_thread_cmd(1, &texDepth);
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, texDepth);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
-   glGenFramebuffers_thread_cmd(1, &color_pick_fb_id);
-   glGenTextures_thread_cmd(1, &texcolorpick);
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, texcolorpick);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-#ifndef GL_GLES
-   glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_R16, w, h, 0, GL_RED, GL_UNSIGNED_SHORT, 0);
-#else
-   glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-#endif
+     GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+
+   _gen_texture_2d(&texDepth, GL_CLAMP_TO_EDGE, GL_NEAREST);
+   GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 
-   glGenFramebuffers_thread_cmd(1, &fbo);
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, fbo);
-   glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
+   GL_TH(glGenFramebuffers, 1, &color_pick_fb_id);
+   _gen_texture_2d(&texcolorpick, GL_CLAMP_TO_EDGE, GL_NEAREST);
+   GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+
+   GL_TH(glGenFramebuffers, 1, &fbo);
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, fbo);
+   GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
 
 #ifdef GL_GLES
    if (depth_format == GL_DEPTH_STENCIL_OES)
      {
-        glGenTextures_thread_cmd(1, &depth_stencil_buf);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, depth_stencil_buf);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
-        glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h, 0,
+        _gen_texture_2d(&depth_stencil_buf, GL_CLAMP_TO_EDGE, GL_NEAREST);
+        GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h, 0,
                                 GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
 
-        glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+        GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                                           GL_TEXTURE_2D, depth_stencil_buf, 0);
-        glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+        GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
                                           GL_TEXTURE_2D, depth_stencil_buf, 0);
 
         depth_stencil = EINA_TRUE;
@@ -338,35 +333,19 @@ e3d_drawable_new(int w, int h, int alpha, GLenum depth_format, GLenum stencil_fo
 #else
    if (depth_format == GL_DEPTH24_STENCIL8)
      {
-        glGenRenderbuffers_thread_cmd(1, &depth_stencil_buf);
-        glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, depth_stencil_buf);
-        glRenderbufferStorage_thread_cmd(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
-        glFramebufferRenderbuffer_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
-                                             GL_RENDERBUFFER, depth_stencil_buf);
-
+        _gen_depth_stencil_buffer(&depth_stencil_buf, GL_DEPTH24_STENCIL8,
+                                  GL_DEPTH_STENCIL_ATTACHMENT, w, h);
         depth_stencil = EINA_TRUE;
      }
 #endif
 
    if ((!depth_stencil) && (depth_format))
-     {
-        glGenRenderbuffers_thread_cmd(1, &depth_buf);
-        glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, depth_buf);
-        glRenderbufferStorage_thread_cmd(GL_RENDERBUFFER, depth_format, w, h);
-        glFramebufferRenderbuffer_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                             GL_RENDERBUFFER, depth_buf);
-     }
+     _gen_depth_stencil_buffer(&depth_buf, depth_format, GL_DEPTH_ATTACHMENT, w, h);
 
    if ((!depth_stencil) && (stencil_format))
-     {
-        glGenRenderbuffers_thread_cmd(1, &stencil_buf);
-        glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, stencil_buf);
-        glRenderbufferStorage_thread_cmd(GL_RENDERBUFFER, stencil_format, w, h);
-        glFramebufferRenderbuffer_thread_cmd(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
-                                             GL_RENDERBUFFER, stencil_buf);
-     }
+     _gen_depth_stencil_buffer(&stencil_buf, stencil_format, GL_STENCIL_ATTACHMENT, w, h);
 
-   if (glCheckFramebufferStatus_thread_cmd(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+   if (GL_TH(glCheckFramebufferStatus, GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
      goto error;
 
    drawable = (E3D_Drawable *)calloc(1, sizeof(E3D_Drawable));
@@ -399,31 +378,31 @@ error:
    ERR("Drawable creation failed.");
 
    if (tex)
-     glDeleteTextures_thread_cmd(1, &tex);
+     GL_TH(glDeleteTextures, 1, &tex);
    if (texcolorpick)
-     glDeleteTextures_thread_cmd(1, &texcolorpick);
+     GL_TH(glDeleteTextures, 1, &texcolorpick);
    if (texDepth)
-     glDeleteTextures_thread_cmd(1, &texDepth);
+     GL_TH(glDeleteTextures, 1, &texDepth);
 
    if (fbo)
-     glDeleteFramebuffers_thread_cmd(1, &fbo);
+     GL_TH(glDeleteFramebuffers, 1, &fbo);
    if (color_pick_fb_id)
-     glDeleteFramebuffers_thread_cmd(1, &color_pick_fb_id);
+     GL_TH(glDeleteFramebuffers, 1, &color_pick_fb_id);
 
    if (depth_stencil_buf)
      {
 #ifdef GL_GLES
-        glDeleteTextures_thread_cmd(1, &depth_stencil_buf);
+        GL_TH(glDeleteTextures, 1, &depth_stencil_buf);
 #else
-        glDeleteRenderbuffers_thread_cmd(1, &depth_stencil_buf);
+        GL_TH(glDeleteRenderbuffers, 1, &depth_stencil_buf);
 #endif
      }
 
    if (depth_buf)
-     glDeleteRenderbuffers_thread_cmd(1, &depth_buf);
+     GL_TH(glDeleteRenderbuffers, 1, &depth_buf);
 
    if (stencil_buf)
-     glDeleteRenderbuffers_thread_cmd(1, &stencil_buf);
+     GL_TH(glDeleteRenderbuffers, 1, &stencil_buf);
 
 
    return NULL;
@@ -436,25 +415,25 @@ e3d_drawable_free(E3D_Drawable *drawable)
      return;
 
    if (drawable->tex)
-     glDeleteTextures_thread_cmd(1, &drawable->tex);
+     GL_TH(glDeleteTextures, 1, &drawable->tex);
 
    if (drawable->fbo)
-     glDeleteFramebuffers_thread_cmd(1, &drawable->fbo);
+     GL_TH(glDeleteFramebuffers, 1, &drawable->fbo);
 
    if (drawable->depth_stencil_buf)
      {
 #ifdef GL_GLES
-        glDeleteTextures_thread_cmd(1, &drawable->depth_stencil_buf);
+        GL_TH(glDeleteTextures, 1, &drawable->depth_stencil_buf);
 #else
-        glDeleteRenderbuffers_thread_cmd(1, &drawable->depth_stencil_buf);
+        GL_TH(glDeleteRenderbuffers, 1, &drawable->depth_stencil_buf);
 #endif
      }
 
    if (drawable->depth_buf)
-     glDeleteRenderbuffers_thread_cmd(1, &drawable->depth_buf);
+     GL_TH(glDeleteRenderbuffers, 1, &drawable->depth_buf);
 
    if (drawable->stencil_buf)
-     glDeleteRenderbuffers_thread_cmd(1, &drawable->stencil_buf);
+     GL_TH(glDeleteRenderbuffers, 1, &drawable->stencil_buf);
 
    free(drawable);
 }
@@ -1128,7 +1107,7 @@ _mesh_draw_data_build(E3D_Draw_Data *data,
      }
 
    int num;
-   glGetIntegerv_thread_cmd(GL_MAX_TEXTURE_IMAGE_UNITS, &num);
+   GL_TH(glGetIntegerv, GL_MAX_TEXTURE_IMAGE_UNITS, &num);
    data->smap_sampler = num - 1;
 
    if (data->texture_count >= num)
@@ -1164,10 +1143,10 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer,
    Evas_Color      c = {1.0, 1.0, 1.0, 1.0};
    Evas_Mat4 matrix_vp;
 
-   glEnable_thread_cmd(GL_POLYGON_OFFSET_FILL);
-   glPolygonOffset_thread_cmd(data->depth_offset, data->depth_constant);
+   GL_TH(glEnable, GL_POLYGON_OFFSET_FILL);
+   GL_TH(glPolygonOffset, data->depth_offset, data->depth_constant);
 
-   glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+   GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                                      drawable->texDepth, 0);
 
    e3d_renderer_target_set(renderer, drawable);
@@ -1202,10 +1181,10 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer,
           }
      }
 
-     glDisable_thread_cmd(GL_POLYGON_OFFSET_FILL);
+   GL_TH(glDisable, GL_POLYGON_OFFSET_FILL);
 
-     glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                                       drawable->tex, 0);
+        GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                      drawable->tex, 0);
 }
 
 void
@@ -1299,16 +1278,16 @@ e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *rende
    Eina_List *repeat_node = NULL;
    Evas_Color c = {0.0, 0.0, 0.0, 0.0}, *unic_color = NULL;
 
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, drawable->color_pick_fb_id);
-   glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, drawable->color_pick_fb_id);
+   GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                      GL_TEXTURE_2D, drawable->texcolorpick, 0);
 #ifdef GL_GLES
-   glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, drawable->depth_stencil_buf);
-   glFramebufferTexture2D_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+   GL_TH(glBindRenderbuffer, GL_RENDERBUFFER, drawable->depth_stencil_buf);
+   GL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                                      GL_TEXTURE_2D, drawable->depth_stencil_buf, 0);
 #else
-   glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, drawable->depth_stencil_buf);
-   glFramebufferRenderbuffer_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+   GL_TH(glBindRenderbuffer, GL_RENDERBUFFER, drawable->depth_stencil_buf);
+   GL_TH(glFramebufferRenderbuffer, GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
                                         GL_RENDERBUFFER, drawable->depth_stencil_buf);
 #endif
 
@@ -1367,7 +1346,7 @@ e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *rende
 
    eina_iterator_free(itmn);
    eina_list_free(repeat_node);
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, drawable->fbo);
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, drawable->fbo);
    return EINA_TRUE;
 }
 
@@ -1377,20 +1356,15 @@ e3d_drawable_texture_pixel_color_get(GLuint tex EINA_UNUSED, int x, int y,
 {
    E3D_Drawable *d = (E3D_Drawable *)drawable;
 
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, d->color_pick_fb_id);
-#ifndef GL_GLES
-   GLuint pixel = 0;
-   glReadPixels_thread_cmd(x, y, 1, 1, GL_RED, GL_UNSIGNED_SHORT, &pixel);
-   color->r = (double)pixel / USHRT_MAX;
-#else
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, d->color_pick_fb_id);
+
    GLubyte pixel[4] = {0, 0, 0, 0};
-   glReadPixels_thread_cmd(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
+   GL_TH(glReadPixels, x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
    color->r = (double)pixel[0] / 255;
    color->g = (double)pixel[1] / 255;
    color->b = (double)pixel[2] / 255;
-#endif
 
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, d->fbo);
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, d->fbo);
 }
 
 #undef RENDER_MESH_NODE_ITERATE_BEGIN
index a6a27b2..eadbd95 100644 (file)
@@ -116,7 +116,7 @@ _renderer_vertex_attrib_array_enable(E3D_Renderer *renderer, int index)
    if (renderer->vertex_attrib_enable[index])
      return;
 
-   glEnableVertexAttribArray_thread_cmd(index);
+   GL_TH(glEnableVertexAttribArray, index);
    renderer->vertex_attrib_enable[index] = EINA_TRUE;
 }
 
@@ -126,7 +126,7 @@ _renderer_vertex_attrib_array_disable(E3D_Renderer *renderer, int index)
    if (!renderer->vertex_attrib_enable[index])
      return;
 
-   glDisableVertexAttribArray_thread_cmd(index);
+   GL_TH(glDisableVertexAttribArray, index);
    renderer->vertex_attrib_enable[index] = EINA_FALSE;
 }
 
@@ -134,7 +134,7 @@ static inline void
 _renderer_vertex_attrib_pointer_set(E3D_Renderer *renderer EINA_UNUSED, int index,
                                     const Evas_Canvas3D_Vertex_Buffer *buffer)
 {
-   glVertexAttribPointer_thread_cmd(index, buffer->element_count, GL_FLOAT,
+   GL_TH(glVertexAttribPointer, index, buffer->element_count, GL_FLOAT,
                                     GL_FALSE, buffer->stride, buffer->data);
 }
 
@@ -145,9 +145,9 @@ _renderer_elements_draw(E3D_Renderer *renderer EINA_UNUSED, Evas_Canvas3D_Vertex
    GLenum mode = _gl_assembly_get(assembly);
 
    if (format == EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_BYTE)
-     glDrawElements_thread_cmd(mode, count, GL_UNSIGNED_BYTE, indices);
+     GL_TH(glDrawElements, mode, count, GL_UNSIGNED_BYTE, indices);
    else if (format == EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_SHORT)
-     glDrawElements_thread_cmd(mode, count, GL_UNSIGNED_SHORT, indices);
+     GL_TH(glDrawElements, mode, count, GL_UNSIGNED_SHORT, indices);
 }
 
 static inline void
@@ -156,7 +156,7 @@ _renderer_array_draw(E3D_Renderer *renderer EINA_UNUSED,
 {
    GLenum mode = _gl_assembly_get(assembly);
 
-   glDrawArrays_thread_cmd(mode, 0, count);
+   GL_TH(glDrawArrays, mode, 0, count);
 }
 
 static inline void
@@ -166,7 +166,7 @@ _renderer_program_use(E3D_Renderer *renderer ,E3D_Program *program)
 
    if (renderer->program != prog)
      {
-        glUseProgram_thread_cmd(prog);
+        GL_TH(glUseProgram, prog);
         renderer->program = prog;
      }
 }
@@ -182,8 +182,8 @@ _renderer_texture_bind(E3D_Renderer *renderer, E3D_Draw_Data *data)
           {
              if (renderer->textures[data->materials[i].sampler0] != data->materials[i].tex0)
                {
-                  glActiveTexture_thread_cmd(GL_TEXTURE0 + data->materials[i].sampler0);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, data->materials[i].tex0->tex);
+                  GL_TH(glActiveTexture, GL_TEXTURE0 + data->materials[i].sampler0);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, data->materials[i].tex0->tex);
                   e3d_texture_param_update(data->materials[i].tex0);
 
                   renderer->textures[data->materials[i].sampler0] = data->materials[i].tex0;
@@ -194,8 +194,8 @@ _renderer_texture_bind(E3D_Renderer *renderer, E3D_Draw_Data *data)
           {
              if (renderer->textures[data->materials[i].sampler1] != data->materials[i].tex1)
                {
-                  glActiveTexture_thread_cmd(GL_TEXTURE0 + data->materials[i].sampler1);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, data->materials[i].tex1->tex);
+                  GL_TH(glActiveTexture, GL_TEXTURE0 + data->materials[i].sampler1);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, data->materials[i].tex1->tex);
                   e3d_texture_param_update(data->materials[i].tex1);
 
                   renderer->textures[data->materials[i].sampler1] = data->materials[i].tex1;
@@ -204,8 +204,8 @@ _renderer_texture_bind(E3D_Renderer *renderer, E3D_Draw_Data *data)
      }
    if ((data->flags & E3D_SHADER_FLAG_SHADOWED) && (renderer->smap_sampler != data->smap_sampler))
      {
-        glActiveTexture_thread_cmd(GL_TEXTURE0 + data->smap_sampler);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, renderer->texDepth);
+        GL_TH(glActiveTexture, GL_TEXTURE0 + data->smap_sampler);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, renderer->texDepth);
         renderer->smap_sampler = data->smap_sampler;
      }
 }
@@ -217,12 +217,12 @@ _renderer_depth_test_enable(E3D_Renderer *renderer, Eina_Bool enable)
      {
         if (enable)
           {
-             glEnable_thread_cmd(GL_DEPTH_TEST);
+             GL_TH(glEnable, GL_DEPTH_TEST);
              /* Use default depth func. */
           }
         else
           {
-             glDisable_thread_cmd(GL_DEPTH_TEST);
+             GL_TH(glDisable, GL_DEPTH_TEST);
           }
 
         renderer->depth_test_enable = enable;
@@ -265,8 +265,8 @@ e3d_renderer_target_set(E3D_Renderer *renderer, E3D_Drawable *target)
    if (renderer->fbo == target->fbo)
      return;
 
-   glBindFramebuffer_thread_cmd(GL_FRAMEBUFFER, target->fbo);
-   glViewport_thread_cmd(0, 0, target->w, target->h);
+   GL_TH(glBindFramebuffer, GL_FRAMEBUFFER, target->fbo);
+   GL_TH(glViewport, 0, 0, target->w, target->h);
    renderer->fbo = target->fbo;
    renderer->texDepth = target->texDepth;
 }
@@ -274,8 +274,8 @@ e3d_renderer_target_set(E3D_Renderer *renderer, E3D_Drawable *target)
 void
 e3d_renderer_clear(E3D_Renderer *renderer EINA_UNUSED, const Evas_Color *color)
 {
-   glClearColor_thread_cmd(color->r, color->g, color->b, color->a);
-   glClear_thread_cmd(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+   GL_TH(glClearColor, color->r, color->g, color->b, color->a);
+   GL_TH(glClear, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
 void
@@ -345,20 +345,19 @@ e3d_renderer_draw(E3D_Renderer *renderer, E3D_Draw_Data *data)
 
    if (data->blending)
      {
-        glEnable_thread_cmd(GL_BLEND);
-        glBlendFunc_thread_cmd(_gl_blend_func_get(data->blend_sfactor),
-                               _gl_blend_func_get(data->blend_dfactor));
+        GL_TH(glEnable, GL_BLEND);
+        GL_TH(glBlendFunc, _gl_blend_func_get(data->blend_sfactor), _gl_blend_func_get(data->blend_dfactor));
      }
-   else glDisable_thread_cmd(GL_BLEND);
+   else GL_TH(glDisable, GL_BLEND);
 
 #ifndef GL_GLES
    if (data->alpha_test_enabled)
      {
-        glEnable_thread_cmd(GL_ALPHA_TEST);
-        glAlphaFunc_thread_cmd(_gl_comparison_func_get(data->alpha_comparison),
+        GL_TH(glEnable, GL_ALPHA_TEST);
+        GL_TH(glAlphaFunc, _gl_comparison_func_get(data->alpha_comparison),
                                (GLclampf)data->alpha_ref_value);
      }
-   else glDisable_thread_cmd(GL_ALPHA_TEST);
+   else GL_TH(glDisable, GL_ALPHA_TEST);
 #endif
 
    if (data->indices)
@@ -375,5 +374,5 @@ e3d_renderer_draw(E3D_Renderer *renderer, E3D_Draw_Data *data)
 void
 e3d_renderer_flush(E3D_Renderer *renderer EINA_UNUSED)
 {
-   glFlush_thread_cmd();
+   GL_TH(glFlush);
 }
index f85a761..567eb9a 100644 (file)
@@ -190,11 +190,11 @@ void _shader_flags_add(E3D_Shader_String *shader, E3D_Shader_Flag flags)
 static inline Eina_Bool
 _shader_compile(GLuint shader, const char *src)
 {
-   GLint ok;
+   GLint ok = 0;
 
-   glShaderSource_thread_cmd(shader, 1, &src, NULL);
-   glCompileShader_thread_cmd(shader);
-   glGetShaderiv_thread_cmd(shader, GL_COMPILE_STATUS, &ok);
+   GL_TH(glShaderSource, shader, 1, &src, NULL);
+   GL_TH(glCompileShader, shader);
+   GL_TH(glGetShaderiv, shader, GL_COMPILE_STATUS, &ok);
 
    if (!ok)
      {
@@ -202,10 +202,11 @@ _shader_compile(GLuint shader, const char *src)
         GLint     len;
         GLsizei   info_len;
 
-        glGetShaderiv_thread_cmd(shader, GL_INFO_LOG_LENGTH, &len);
+        GL_TH(glGetShaderiv, shader, GL_INFO_LOG_LENGTH, &len);
         log_str = (GLchar *)malloc(len);
-        glGetShaderInfoLog_thread_cmd(shader, len, &info_len, log_str);
-        ERR("Shader compilation failed.\n%s", log_str);
+        GL_TH(glGetShaderInfoLog, shader, len, &info_len, log_str);
+        ERR("Shader compilation failed: %s", log_str);
+        DBG("Shader source was:\n%s", src);
         free(log_str);
 
         return EINA_FALSE;
@@ -220,44 +221,44 @@ _program_vertex_attrib_bind(E3D_Program *program)
    GLint index = 0;
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_POSITION)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aPosition0");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aPosition0");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_POSITION_BLEND)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aPosition1");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aPosition1");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_NORMAL)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aNormal0");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aNormal0");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_NORMAL_BLEND)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aNormal1");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aNormal1");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_TANGENT)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aTangent0");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aTangent0");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_TANGENT_BLEND)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aTangent1");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aTangent1");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_COLOR)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aColor0");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aColor0");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_COLOR_BLEND)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aColor1");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aColor1");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aTexCoord0");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aTexCoord0");
 
    if (program->flags & E3D_SHADER_FLAG_VERTEX_TEXCOORD_BLEND)
-     glBindAttribLocation_thread_cmd(program->prog, index++, "aTexCoord1");
+     GL_TH(glBindAttribLocation, program->prog, index++, "aTexCoord1");
 }
 
 static inline Eina_Bool
 _program_build(E3D_Program *program, const char *vert_src, const char *frag_src)
 {
-   GLint ok;
+   GLint ok = 0;
 
    /* Create OpenGL vertex & fragment shader object. */
-   program->vert = glCreateShader_thread_cmd(GL_VERTEX_SHADER);
-   program->frag = glCreateShader_thread_cmd(GL_FRAGMENT_SHADER);
+   program->vert = GL_TH(glCreateShader, GL_VERTEX_SHADER);
+   program->frag = GL_TH(glCreateShader, GL_FRAGMENT_SHADER);
 
    /* Commpile vertex shader. */
    if (!_shader_compile(program->vert, vert_src))
@@ -274,28 +275,28 @@ _program_build(E3D_Program *program, const char *vert_src, const char *frag_src)
      }
 
    /* Create OpenGL program object. */
-   program->prog = glCreateProgram_thread_cmd();
+   program->prog = GL_TH(glCreateProgram);
 
    /* Attach shaders. */
-   glAttachShader_thread_cmd(program->prog, program->vert);
-   glAttachShader_thread_cmd(program->prog, program->frag);
+   GL_TH(glAttachShader, program->prog, program->vert);
+   GL_TH(glAttachShader, program->prog, program->frag);
 
    _program_vertex_attrib_bind(program);
    /* Link program. */
-   glLinkProgram_thread_cmd(program->prog);
+   GL_TH(glLinkProgram, program->prog);
 
    /* Check link status. */
-   glGetProgramiv_thread_cmd(program->prog, GL_LINK_STATUS, &ok);
+   GL_TH(glGetProgramiv, program->prog, GL_LINK_STATUS, &ok);
 
    if (!ok)
      {
         GLchar   *log_str;
-        GLint     len;
+        GLint     len = 0;
         GLsizei   info_len;
 
-        glGetProgramiv_thread_cmd(program->prog, GL_INFO_LOG_LENGTH, &len);
+        GL_TH(glGetProgramiv, program->prog, GL_INFO_LOG_LENGTH, &len);
         log_str = (GLchar *)malloc(len);
-        glGetProgramInfoLog_thread_cmd(program->prog, len, &info_len, log_str);
+        GL_TH(glGetProgramInfoLog, program->prog, len, &info_len, log_str);
         ERR("Shader link failed.\n%s", log_str);
         free(log_str);
         return EINA_FALSE;
@@ -370,8 +371,7 @@ _program_uniform_init(E3D_Program *program)
    int i;
    for (i = 0; i < E3D_UNIFORM_COUNT; i++)
      {
-        program->uniform_locations[i] = glGetUniformLocation_thread_cmd(program->prog,
-                                                                                       uniform_names[i]);
+        program->uniform_locations[i] = GL_TH(glGetUniformLocation, program->prog, uniform_names[i]);
      }
 }
 
@@ -384,7 +384,7 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
         float   m[9];                                                          \
         for(int i = 0 ; i < 9 ; i++)                                           \
           m[i] = data->materials[attrib].tex##tn->trans.m[i];                  \
-        glUniformMatrix3fv_thread_cmd(loc, 1, EINA_FALSE, &m[0]);              \
+        GL_TH(glUniformMatrix3fv, loc, 1, EINA_FALSE, &m[0]);                  \
      }
 
    switch (u)
@@ -393,89 +393,89 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
          float   m[16];
          for(int i = 0 ; i <16 ; i++)
             m[i] = data->matrix_mvp.m[i];
-         glUniformMatrix4fv_thread_cmd(loc, 1, EINA_FALSE, &m[0]);
+         GL_TH(glUniformMatrix4fv, loc, 1, EINA_FALSE, &m[0]);
          break;
       }
       case E3D_UNIFORM_MATRIX_MV: {
          float   m[16];
          for(int i = 0 ; i <16 ; i++)
             m[i] = data->matrix_mv.m[i];
-         glUniformMatrix4fv_thread_cmd(loc, 1, EINA_FALSE, &m[0]);
+         GL_TH(glUniformMatrix4fv, loc, 1, EINA_FALSE, &m[0]);
          break;
       }
       case E3D_UNIFORM_MATRIX_NORMAL: {
          float   m[9];
          for(int i = 0 ; i <9 ; i++)
             m[i] = data->matrix_normal.m[i];
-         glUniformMatrix3fv_thread_cmd(loc, 1, EINA_FALSE, &m[0]);
+         GL_TH(glUniformMatrix3fv, loc, 1, EINA_FALSE, &m[0]);
          break;
       }
       case E3D_UNIFORM_MATRIX_LIGHT: {
          float   m[16];
          for(int i = 0 ; i <16 ; i++)
             m[i] = data->matrix_light.m[i];
-         glUniformMatrix4fv_thread_cmd(loc, 1, EINA_FALSE, &m[0]);
+         GL_TH(glUniformMatrix4fv, loc, 1, EINA_FALSE, &m[0]);
          break;
       }
       case E3D_UNIFORM_POSITION_WEIGHT:
-         glUniform1f_thread_cmd(loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].weight);
+         GL_TH(glUniform1f, loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].weight);
          break;
       case E3D_UNIFORM_NORMAL_WEIGHT:
-         glUniform1f_thread_cmd(loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL].weight);
+         GL_TH(glUniform1f, loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL].weight);
          break;
       case E3D_UNIFORM_TANGENT_WEIGHT:
-         glUniform1f_thread_cmd(loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TANGENT].weight);
+         GL_TH(glUniform1f, loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TANGENT].weight);
          break;
       case E3D_UNIFORM_COLOR_WEIGHT:
-         glUniform1f_thread_cmd(loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_COLOR].weight);
+         GL_TH(glUniform1f, loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_COLOR].weight);
          break;
       case E3D_UNIFORM_TEXCOORD_WEIGHT:
-         glUniform1f_thread_cmd(loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD].weight);
+         GL_TH(glUniform1f, loc, data->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD].weight);
          break;
       case E3D_UNIFORM_TEXTURE_WEIGHT_AMBIENT:
-         glUniform1f_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].texture_weight);
+         GL_TH(glUniform1f, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].texture_weight);
          break;
       case E3D_UNIFORM_TEXTURE_WEIGHT_DIFFUSE:
-         glUniform1f_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].texture_weight);
+         GL_TH(glUniform1f, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].texture_weight);
          break;
       case E3D_UNIFORM_TEXTURE_WEIGHT_SPECULAR:
-         glUniform1f_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].texture_weight);
+         GL_TH(glUniform1f, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].texture_weight);
          break;
       case E3D_UNIFORM_TEXTURE_WEIGHT_EMISSION:
-         glUniform1f_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].texture_weight);
+         GL_TH(glUniform1f, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].texture_weight);
          break;
       case E3D_UNIFORM_TEXTURE_WEIGHT_NORMAL:
-         glUniform1f_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].texture_weight);
+         GL_TH(glUniform1f, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].texture_weight);
          break;
       case E3D_UNIFORM_TEXTURE_AMBIENT0:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].sampler0);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].sampler0);
          break;
       case E3D_UNIFORM_TEXTURE_DIFFUSE0:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].sampler0);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].sampler0);
          break;
       case E3D_UNIFORM_TEXTURE_SPECULAR0:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].sampler0);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].sampler0);
          break;
       case E3D_UNIFORM_TEXTURE_EMISSION0:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].sampler0);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].sampler0);
          break;
       case E3D_UNIFORM_TEXTURE_NORMAL0:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].sampler0);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].sampler0);
          break;
       case E3D_UNIFORM_TEXTURE_AMBIENT1:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].sampler1);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].sampler1);
          break;
       case E3D_UNIFORM_TEXTURE_DIFFUSE1:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].sampler1);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].sampler1);
          break;
       case E3D_UNIFORM_TEXTURE_SPECULAR1:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].sampler1);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].sampler1);
          break;
       case E3D_UNIFORM_TEXTURE_EMISSION1:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].sampler1);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].sampler1);
          break;
       case E3D_UNIFORM_TEXTURE_NORMAL1:
-         glUniform1i_thread_cmd(loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].sampler1);
+         GL_TH(glUniform1i, loc, data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL].sampler1);
          break;
       case E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_AMBIENT0: {
          SET_TEX_COORD_TRANSFORM_MATRIX(EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT, 0)
@@ -518,101 +518,101 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data)
          break;
       }
       case E3D_UNIFORM_SHADOWMAP:
-         glUniform1i_thread_cmd(loc, data->smap_sampler);
+         GL_TH(glUniform1i, loc, data->smap_sampler);
          break;
       case E3D_UNIFORM_SHADOWS_PCF_STEP:
-         glUniform1f_thread_cmd(loc, data->pcf_step);
+         GL_TH(glUniform1f, loc, data->pcf_step);
          break;
       case E3D_UNIFORM_SHADOWS_PCF_SIZE:
-         glUniform1f_thread_cmd(loc, data->pcf_size);
+         GL_TH(glUniform1f, loc, data->pcf_size);
          break;
       case E3D_UNIFORM_SHADOWS_CONSTANT_BIAS:
-         glUniform1f_thread_cmd(loc, data->constant_bias);
+         GL_TH(glUniform1f, loc, data->constant_bias);
          break;
       case E3D_UNIFORM_LIGHT_POSITION:
-         glUniform4f_thread_cmd(loc, data->light.position.x, data->light.position.y,
+         GL_TH(glUniform4f, loc, data->light.position.x, data->light.position.y,
                                 data->light.position.z, data->light.position.w);
          break;
       case E3D_UNIFORM_LIGHT_SPOT_DIR:
-         glUniform3f_thread_cmd(loc, data->light.spot_dir.x, data->light.spot_dir.y, data->light.spot_dir.z);
+         GL_TH(glUniform3f, loc, data->light.spot_dir.x, data->light.spot_dir.y, data->light.spot_dir.z);
          break;
       case E3D_UNIFORM_LIGHT_SPOT_EXP:
-         glUniform1f_thread_cmd(loc, data->light.spot_exp);
+         GL_TH(glUniform1f, loc, data->light.spot_exp);
          break;
       case E3D_UNIFORM_LIGHT_SPOT_CUTOFF_COS:
-         glUniform1f_thread_cmd(loc, data->light.spot_cutoff_cos);
+         GL_TH(glUniform1f, loc, data->light.spot_cutoff_cos);
          break;
       case E3D_UNIFORM_LIGHT_ATTENUATION:
-         glUniform3f_thread_cmd(loc, data->light.atten.x, data->light.atten.y, data->light.atten.z);
+         GL_TH(glUniform3f, loc, data->light.atten.x, data->light.atten.y, data->light.atten.z);
          break;
       case E3D_UNIFORM_LIGHT_AMBIENT:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->light.ambient.r, data->light.ambient.g,
                                 data->light.ambient.b, data->light.ambient.a);
          break;
       case E3D_UNIFORM_LIGHT_DIFFUSE:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->light.diffuse.r, data->light.diffuse.g,
                                 data->light.diffuse.b, data->light.diffuse.a);
          break;
       case E3D_UNIFORM_LIGHT_SPECULAR:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->light.specular.r, data->light.specular.g,
                                 data->light.specular.b, data->light.specular.a);
          break;
       case E3D_UNIFORM_MATERIAL_AMBIENT:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].color.r,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].color.g,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].color.b,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT].color.a);
          break;
       case E3D_UNIFORM_MATERIAL_DIFFUSE:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].color.r,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].color.g,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].color.b,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE].color.a);
          break;
       case E3D_UNIFORM_MATERIAL_SPECULAR:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].color.r,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].color.g,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].color.b,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR].color.a);
          break;
       case E3D_UNIFORM_MATERIAL_EMISSION:
-         glUniform4f_thread_cmd(loc,
+         GL_TH(glUniform4f, loc,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].color.r,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].color.g,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].color.b,
                                 data->materials[EVAS_CANVAS3D_MATERIAL_ATTRIB_EMISSION].color.a);
          break;
       case E3D_UNIFORM_MATERIAL_SHININESS:
-         glUniform1f_thread_cmd(loc, data->shininess);
+         GL_TH(glUniform1f, loc, data->shininess);
          break;
       case E3D_UNIFORM_FOG_FACTOR:
-         glUniform1f_thread_cmd(loc, data->fog_color.a);
+         GL_TH(glUniform1f, loc, data->fog_color.a);
          break;
       case E3D_UNIFORM_FOG_COLOR:
-         glUniform4f_thread_cmd(loc, data->fog_color.r, data->fog_color.g, data->fog_color.b, 1);
+         GL_TH(glUniform4f, loc, data->fog_color.r, data->fog_color.g, data->fog_color.b, 1);
          break;
 #ifndef GL_GLES
       case E3D_UNIFORM_COLOR_PICK:
-         glUniform1f_thread_cmd(loc, data->color_pick_key);
+         GL_TH(glUniform1f,loc, data->color_pick_key);
          break;
 #else
       case E3D_UNIFORM_COLOR_PICK:
-         glUniform4f_thread_cmd(loc, data->color_pick_key.r, data->color_pick_key.g,
+         GL_TH(glUniform4f, loc, data->color_pick_key.r, data->color_pick_key.g,
                                 data->color_pick_key.b, 1.0);
          break;
 #endif
       case E3D_UNIFORM_ALPHATEST_COMPARISON:
-         glUniform1i_thread_cmd(loc,
+         GL_TH(glUniform1i, loc,
                     (data->alpha_comparison ? data->alpha_comparison : EVAS_CANVAS3D_COMPARISON_GREATER));
          break;
       case E3D_UNIFORM_ALPHATEST_REFVALUE:
-         glUniform1f_thread_cmd(loc, (data->alpha_ref_value ? data->alpha_ref_value : 0.0));
+         GL_TH(glUniform1f, loc, (data->alpha_ref_value ? data->alpha_ref_value : 0.0));
          break;
       default:
          ERR("Invalid uniform ID.");
@@ -651,9 +651,9 @@ e3d_program_new(Evas_Canvas3D_Shade_Mode mode, E3D_Shader_Flag flags)
         return NULL;
      }
 
-   program->prog = glCreateProgram_thread_cmd();
-   program->vert = glCreateShader_thread_cmd(GL_VERTEX_SHADER);
-   program->frag = glCreateShader_thread_cmd(GL_FRAGMENT_SHADER);
+   program->prog = GL_TH(glCreateProgram);
+   program->vert = GL_TH(glCreateShader, GL_VERTEX_SHADER);
+   program->frag = GL_TH(glCreateShader, GL_FRAGMENT_SHADER);
    program->mode = mode;
    program->flags = flags;
 
@@ -675,13 +675,13 @@ e3d_program_new(Evas_Canvas3D_Shade_Mode mode, E3D_Shader_Flag flags)
 
 error:
    if (program->prog)
-     glDeleteProgram_thread_cmd(program->prog);
+     GL_TH(glDeleteProgram, program->prog);
 
    if (program->vert)
-     glDeleteShader_thread_cmd(program->vert);
+     GL_TH(glDeleteShader, program->vert);
 
    if (program->frag)
-     glDeleteShader_thread_cmd(program->frag);
+     GL_TH(glDeleteShader, program->frag);
 
    _shader_string_fini(&vert);
    _shader_string_fini(&frag);
@@ -694,9 +694,9 @@ error:
 void
 e3d_program_free(E3D_Program *program)
 {
-   glDeleteProgram_thread_cmd(program->prog);
-   glDeleteShader_thread_cmd(program->vert);
-   glDeleteShader_thread_cmd(program->frag);
+   GL_TH(glDeleteProgram, program->prog);
+   GL_TH(glDeleteShader, program->vert);
+   GL_TH(glDeleteShader, program->frag);
    free(program);
 }
 
index 4a927c7..518974f 100644 (file)
@@ -20,7 +20,7 @@
 #define SET_GL_ERROR(gl_error_type) \
     if (ctx->gl_error == GL_NO_ERROR) \
       { \
-         ctx->gl_error = glGetError(); \
+         ctx->gl_error = EVGL_TH(glGetError); \
          if (ctx->gl_error == GL_NO_ERROR) ctx->gl_error = gl_error_type; \
       }
 
@@ -97,9 +97,9 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
              if (_evgl_direct_enabled())
                {
                    if (ctx->map_tex)
-                      glBindFramebuffer(target, ctx->current_fbo);
+                      EVGL_TH(glBindFramebuffer, target, ctx->current_fbo);
                    else
-                      glBindFramebuffer(target, 0);
+                      EVGL_TH(glBindFramebuffer, target, 0);
 
                   if (rsc->direct.partial.enabled)
                     {
@@ -112,7 +112,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                }
              else
                {
-                  glBindFramebuffer(target, ctx->surface_fbo);
+                  EVGL_TH(glBindFramebuffer, target, ctx->surface_fbo);
                }
              ctx->current_fbo = 0;
           }
@@ -127,7 +127,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                     }
                }
 
-             glBindFramebuffer(target, framebuffer);
+             EVGL_TH(glBindFramebuffer, target, framebuffer);
 
              // Save this for restore when doing make current
              ctx->current_fbo = framebuffer;
@@ -141,7 +141,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                {
                   if (_evgl_direct_enabled())
                     {
-                       glBindFramebuffer(target, 0);
+                       EVGL_TH(glBindFramebuffer, target, 0);
 
                        if (rsc->direct.partial.enabled)
                          {
@@ -154,7 +154,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                     }
                   else
                     {
-                       glBindFramebuffer(target, ctx->surface_fbo);
+                       EVGL_TH(glBindFramebuffer, target, ctx->surface_fbo);
                     }
                   ctx->current_draw_fbo = 0;
 
@@ -172,7 +172,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                          }
                     }
 
-                  glBindFramebuffer(target, framebuffer);
+                  EVGL_TH(glBindFramebuffer, target, framebuffer);
 
                   // Save this for restore when doing make current
                   ctx->current_draw_fbo = framebuffer;
@@ -187,17 +187,17 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
                {
                  if (_evgl_direct_enabled())
                    {
-                      glBindFramebuffer(target, 0);
+                      EVGL_TH(glBindFramebuffer, target, 0);
                    }
                  else
                    {
-                      glBindFramebuffer(target, ctx->surface_fbo);
+                      EVGL_TH(glBindFramebuffer, target, ctx->surface_fbo);
                    }
                  ctx->current_read_fbo = 0;
                }
              else
                {
-                 glBindFramebuffer(target, framebuffer);
+                 EVGL_TH(glBindFramebuffer, target, framebuffer);
 
                  // Save this for restore when doing make current
                  ctx->current_read_fbo = framebuffer;
@@ -205,7 +205,7 @@ _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
           }
         else
           {
-             glBindFramebuffer(target, framebuffer);
+             EVGL_TH(glBindFramebuffer, target, framebuffer);
           }
      }
 }
@@ -214,9 +214,9 @@ void
 _evgl_glClearDepthf(GLclampf depth)
 {
 #ifdef GL_GLES
-   glClearDepthf(depth);
+   EVGL_TH(glClearDepthf, depth);
 #else
-   glClearDepth(depth);
+   EVGL_TH_CALL(glClearDepthf, glClearDepth, depth);
 #endif
 }
 
@@ -235,7 +235,7 @@ _evgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
 
    if (!framebuffers)
      {
-        glDeleteFramebuffers(n, framebuffers);
+        EVGL_TH(glDeleteFramebuffers, n, framebuffers);
         return;
      }
 
@@ -247,7 +247,7 @@ _evgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
                {
                   if (framebuffers[i] == ctx->current_fbo)
                     {
-                       glBindFramebuffer(GL_FRAMEBUFFER, ctx->surface_fbo);
+                       EVGL_TH(glBindFramebuffer, GL_FRAMEBUFFER, ctx->surface_fbo);
                        ctx->current_fbo = 0;
                        break;
                     }
@@ -259,29 +259,29 @@ _evgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
                {
                   if (framebuffers[i] == ctx->current_draw_fbo)
                     {
-                       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ctx->surface_fbo);
+                       EVGL_TH(glBindFramebuffer, GL_DRAW_FRAMEBUFFER, ctx->surface_fbo);
                        ctx->current_draw_fbo = 0;
                     }
 
                   if (framebuffers[i] == ctx->current_read_fbo)
                     {
-                       glBindFramebuffer(GL_READ_FRAMEBUFFER, ctx->surface_fbo);
+                       EVGL_TH(glBindFramebuffer, GL_READ_FRAMEBUFFER, ctx->surface_fbo);
                        ctx->current_read_fbo = 0;
                     }
                }
           }
      }
 
-   glDeleteFramebuffers(n, framebuffers);
+   EVGL_TH(glDeleteFramebuffers, n, framebuffers);
 }
 
 void
 _evgl_glDepthRangef(GLclampf zNear, GLclampf zFar)
 {
 #ifdef GL_GLES
-   glDepthRangef(zNear, zFar);
+   EVGL_TH(glDepthRangef, zNear, zFar);
 #else
-   glDepthRange(zNear, zFar);
+   EVGL_TH_CALL(glDepthRangef, glDepthRange, zNear, zFar);
 #endif
 }
 
@@ -303,13 +303,13 @@ _evgl_glGetError(void)
 
         //reset error state to GL_NO_ERROR. (EvasGL & Native GL)
         ctx->gl_error = GL_NO_ERROR;
-        glGetError();
+        EVGL_TH(glGetError);
 
         return ret;
      }
    else
      {
-        return glGetError();
+        return EVGL_TH(glGetError);
      }
 }
 
@@ -317,7 +317,7 @@ void
 _evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
 {
 #ifdef GL_GLES
-   glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+   EVGL_TH(glGetShaderPrecisionFormat, shadertype, precisiontype, range, precision);
 #else
    if (range)
      {
@@ -337,7 +337,7 @@ void
 _evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
 {
 #ifdef GL_GLES
-   glShaderBinary(n, shaders, binaryformat, binary, length);
+   EVGL_TH(glShaderBinary, n, shaders, binaryformat, binary, length);
 #else
    // FIXME: need to dlsym/getprocaddress for this
    ERR("Binary Shader is not supported here yet.");
@@ -353,7 +353,7 @@ void
 _evgl_glReleaseShaderCompiler(void)
 {
 #ifdef GL_GLES
-   glReleaseShaderCompiler();
+   EVGL_TH(glReleaseShaderCompiler);
 #else
 #endif
 }
@@ -506,7 +506,7 @@ _evgl_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
         rsc->clear_color.g = green;
         rsc->clear_color.b = blue;
      }
-   glClearColor(red, green, blue, alpha);
+   EVGL_TH(glClearColor, red, green, blue, alpha);
 }
 
 static void
@@ -568,7 +568,7 @@ _evgl_glClear(GLbitfield mask)
 
              if ((!ctx->direct_scissor))
                {
-                  glEnable(GL_SCISSOR_TEST);
+                  EVGL_TH(glEnable, GL_SCISSOR_TEST);
                   ctx->direct_scissor = 1;
                }
 
@@ -585,7 +585,7 @@ _evgl_glClear(GLbitfield mask)
                                          oc, nc, cc);
 
                   RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-                  glScissor(nc[0], nc[1], nc[2], nc[3]);
+                  EVGL_TH(glScissor, nc[0], nc[1], nc[2], nc[3]);
                   ctx->direct_scissor = 0;
                }
              else
@@ -598,10 +598,10 @@ _evgl_glClear(GLbitfield mask)
                                          rsc->direct.clip.x, rsc->direct.clip.y,
                                          rsc->direct.clip.w, rsc->direct.clip.h,
                                          oc, nc, cc);
-                  glScissor(cc[0], cc[1], cc[2], cc[3]);
+                  EVGL_TH(glScissor, cc[0], cc[1], cc[2], cc[3]);
                }
 
-             glClear(mask);
+             EVGL_TH(glClear, mask);
 
              // TODO/FIXME: Restore previous client-side scissors.
           }
@@ -609,22 +609,22 @@ _evgl_glClear(GLbitfield mask)
           {
              if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
                {
-                  glDisable(GL_SCISSOR_TEST);
+                  EVGL_TH(glDisable, GL_SCISSOR_TEST);
                   ctx->direct_scissor = 0;
                }
 
-             glClear(mask);
+             EVGL_TH(glClear, mask);
           }
      }
    else
      {
         if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
           {
-             glDisable(GL_SCISSOR_TEST);
+             EVGL_TH(glDisable, GL_SCISSOR_TEST);
              ctx->direct_scissor = 0;
           }
 
-        glClear(mask);
+        EVGL_TH(glClear, mask);
      }
 }
 
@@ -662,7 +662,7 @@ _evgl_glEnable(GLenum cap)
                                                    rsc->direct.clip.x, rsc->direct.clip.y,
                                                    rsc->direct.clip.w, rsc->direct.clip.h,
                                                    oc, nc, cc);
-                            glScissor(cc[0], cc[1], cc[2], cc[3]);
+                            EVGL_TH(glScissor, cc[0], cc[1], cc[2], cc[3]);
                          }
                        else
                          {
@@ -675,7 +675,7 @@ _evgl_glEnable(GLenum cap)
                                                    rsc->direct.clip.x, rsc->direct.clip.y,
                                                    rsc->direct.clip.w, rsc->direct.clip.h,
                                                    oc, nc, cc);
-                            glScissor(nc[0], nc[1], nc[2], nc[3]);
+                            EVGL_TH(glScissor, nc[0], nc[1], nc[2], nc[3]);
                          }
                        ctx->direct_scissor = 1;
                     }
@@ -685,23 +685,23 @@ _evgl_glEnable(GLenum cap)
                   // Bound to an FBO, reset scissors to user data
                   if (ctx->scissor_updated)
                     {
-                       glScissor(ctx->scissor_coord[0], ctx->scissor_coord[1],
+                       EVGL_TH(glScissor, ctx->scissor_coord[0], ctx->scissor_coord[1],
                                  ctx->scissor_coord[2], ctx->scissor_coord[3]);
                     }
                   else if (ctx->direct_scissor)
                     {
                        // Back to the default scissors (here: max texture size)
-                       glScissor(0, 0, evgl_engine->caps[caps_idx].max_w, evgl_engine->caps[caps_idx].max_h);
+                       EVGL_TH(glScissor, 0, 0, evgl_engine->caps[caps_idx].max_w, evgl_engine->caps[caps_idx].max_h);
                     }
                   ctx->direct_scissor = 0;
                }
 
-             glEnable(GL_SCISSOR_TEST);
+             EVGL_TH(glEnable, GL_SCISSOR_TEST);
              return;
           }
      }
 
-   glEnable(cap);
+   EVGL_TH(glEnable, cap);
 }
 
 static void
@@ -736,23 +736,23 @@ _evgl_glDisable(GLenum cap)
                                               oc, nc, cc);
 
                        RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-                       glScissor(nc[0], nc[1], nc[2], nc[3]);
+                       EVGL_TH(glScissor, nc[0], nc[1], nc[2], nc[3]);
 
                        ctx->direct_scissor = 1;
-                       glEnable(GL_SCISSOR_TEST);
+                       EVGL_TH(glEnable, GL_SCISSOR_TEST);
                     }
                }
              else
                {
                   // Bound to an FBO, disable scissors for real
                   ctx->direct_scissor = 0;
-                  glDisable(GL_SCISSOR_TEST);
+                  EVGL_TH(glDisable, GL_SCISSOR_TEST);
                }
              return;
           }
      }
 
-   glDisable(cap);
+   EVGL_TH(glDisable, cap);
 }
 
 #ifndef __APPLE__
@@ -923,7 +923,7 @@ _evgl_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget,
            }
       }
 
-   glFramebufferTexture2D(target, attachment, textarget, texture, level);
+   EVGL_TH(glFramebufferTexture2D, target, attachment, textarget, texture, level);
 }
 
 static void
@@ -982,7 +982,7 @@ _evgl_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderb
            }
       }
 
-   glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+   EVGL_TH(glFramebufferRenderbuffer, target, attachment, renderbuffertarget, renderbuffer);
 }
 
 void
@@ -1119,7 +1119,7 @@ _evgl_glGetFloatv(GLenum pname, GLfloat* params)
                {
                   if (ctx->current_read_fbo == 0)
                     {
-                       glGetFloatv(pname, params);
+                       EVGL_TH(glGetFloatv, pname, params);
                        if (*params == GL_COLOR_ATTACHMENT0)
                          {
                             *params = (GLfloat)GL_BACK;
@@ -1135,7 +1135,7 @@ _evgl_glGetFloatv(GLenum pname, GLfloat* params)
           }
      }
 
-   glGetFloatv(pname, params);
+   EVGL_TH(glGetFloatv, pname, params);
 }
 
 void
@@ -1167,7 +1167,7 @@ _evgl_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GL
                {
                   if (ctx->current_draw_fbo == 0 && attachment == GL_BACK)
                     {
-                       glGetFramebufferAttachmentParameteriv(target, GL_COLOR_ATTACHMENT0, pname, params);
+                       EVGL_TH(glGetFramebufferAttachmentParameteriv, target, GL_COLOR_ATTACHMENT0, pname, params);
                        return;
                     }
                }
@@ -1175,14 +1175,14 @@ _evgl_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GL
                {
                   if (ctx->current_read_fbo == 0 && attachment == GL_BACK)
                     {
-                       glGetFramebufferAttachmentParameteriv(target, GL_COLOR_ATTACHMENT0, pname, params);
+                       EVGL_TH(glGetFramebufferAttachmentParameteriv, target, GL_COLOR_ATTACHMENT0, pname, params);
                        return;
                     }
                }
           }
      }
 
-   glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+   EVGL_TH(glGetFramebufferAttachmentParameteriv, target, attachment, pname, params);
 }
 
 #ifndef __APPLE__
@@ -1369,7 +1369,7 @@ _evgl_glGetIntegerv(GLenum pname, GLint* params)
                {
                   if (ctx->current_read_fbo == 0)
                     {
-                       glGetIntegerv(pname, params);
+                       EVGL_TH(glGetIntegerv, pname, params);
 
                        if (*params == GL_COLOR_ATTACHMENT0)
                          {
@@ -1386,7 +1386,7 @@ _evgl_glGetIntegerv(GLenum pname, GLint* params)
           }
      }
 
-   glGetIntegerv(pname, params);
+   EVGL_TH(glGetIntegerv, pname, params);
 }
 
 static const GLubyte *
@@ -1436,7 +1436,7 @@ _evgl_glGetString(GLenum name)
         break;
 
       case GL_SHADING_LANGUAGE_VERSION:
-        ret = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
+        ret = (const char *) EVGL_TH(glGetString, GL_SHADING_LANGUAGE_VERSION);
         if (!ret) return NULL;
 #ifdef GL_GLES
         return (const GLubyte *) ret;
@@ -1448,7 +1448,7 @@ _evgl_glGetString(GLenum name)
 #endif
 
       case GL_VERSION:
-        ret = (const char *) glGetString(GL_VERSION);
+        ret = (const char *) EVGL_TH(glGetString, GL_VERSION);
         if (!ret) return NULL;
 #ifdef GL_GLES
         if ((ret[10] != '2') && (ret[10] != '3'))
@@ -1476,7 +1476,7 @@ _evgl_glGetString(GLenum name)
         break;
      }
 
-   return glGetString(name);
+   return EVGL_TH(glGetString, name);
 }
 
 static const GLubyte *
@@ -1552,16 +1552,16 @@ _evgl_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum forma
                                     rsc->direct.clip.x, rsc->direct.clip.y,
                                     rsc->direct.clip.w, rsc->direct.clip.h,
                                     oc, nc, cc);
-             glReadPixels(nc[0], nc[1], nc[2], nc[3], format, type, pixels);
+             EVGL_TH(glReadPixels, nc[0], nc[1], nc[2], nc[3], format, type, pixels);
           }
         else
           {
-             glReadPixels(x, y, width, height, format, type, pixels);
+             EVGL_TH(glReadPixels, x, y, width, height, format, type, pixels);
           }
      }
    else
      {
-        glReadPixels(x, y, width, height, format, type, pixels);
+        EVGL_TH(glReadPixels, x, y, width, height, format, type, pixels);
      }
 }
 
@@ -1600,7 +1600,7 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
              // Direct rendering to canvas
              if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
                {
-                  glDisable(GL_SCISSOR_TEST);
+                  EVGL_TH(glDisable, GL_SCISSOR_TEST);
                }
 
              compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
@@ -1619,7 +1619,7 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
              ctx->scissor_coord[3] = height;
 
              RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-             glScissor(nc[0], nc[1], nc[2], nc[3]);
+             EVGL_TH(glScissor, nc[0], nc[1], nc[2], nc[3]);
 
              ctx->direct_scissor = 0;
 
@@ -1631,11 +1631,11 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
              // Bound to an FBO, use these new scissors
              if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
                {
-                  glDisable(GL_SCISSOR_TEST);
+                  EVGL_TH(glDisable, GL_SCISSOR_TEST);
                   ctx->direct_scissor = 0;
                }
 
-             glScissor(x, y, width, height);
+             EVGL_TH(glScissor, x, y, width, height);
 
              // Why did we set this flag to 0???
              //ctx->scissor_updated = 0;
@@ -1645,11 +1645,11 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
      {
         if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
           {
-             glDisable(GL_SCISSOR_TEST);
+             EVGL_TH(glDisable, GL_SCISSOR_TEST);
              ctx->direct_scissor = 0;
           }
 
-        glScissor(x, y, width, height);
+        EVGL_TH(glScissor, x, y, width, height);
      }
 }
 
@@ -1687,7 +1687,7 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
           {
              if ((!ctx->direct_scissor))
                {
-                  glEnable(GL_SCISSOR_TEST);
+                  EVGL_TH(glEnable, GL_SCISSOR_TEST);
                   ctx->direct_scissor = 1;
                }
 
@@ -1705,7 +1705,7 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
                                          oc, nc, cc);
 
                   RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-                  glScissor(nc[0], nc[1], nc[2], nc[3]);
+                  EVGL_TH(glScissor, nc[0], nc[1], nc[2], nc[3]);
 
                   ctx->direct_scissor = 0;
 
@@ -1718,7 +1718,7 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
                                          rsc->direct.clip.x, rsc->direct.clip.y,
                                          rsc->direct.clip.w, rsc->direct.clip.h,
                                          oc, nc, cc);
-                  glViewport(nc[0], nc[1], nc[2], nc[3]);
+                  EVGL_TH(glViewport, nc[0], nc[1], nc[2], nc[3]);
                }
              else
                {
@@ -1731,9 +1731,9 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
                                          rsc->direct.clip.x, rsc->direct.clip.y,
                                          rsc->direct.clip.w, rsc->direct.clip.h,
                                          oc, nc, cc);
-                  glScissor(cc[0], cc[1], cc[2], cc[3]);
+                  EVGL_TH(glScissor, cc[0], cc[1], cc[2], cc[3]);
 
-                  glViewport(nc[0], nc[1], nc[2], nc[3]);
+                  EVGL_TH(glViewport, nc[0], nc[1], nc[2], nc[3]);
                }
 
              ctx->viewport_direct[0] = nc[0];
@@ -1753,22 +1753,22 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
           {
              if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
                {
-                  glDisable(GL_SCISSOR_TEST);
+                  EVGL_TH(glDisable, GL_SCISSOR_TEST);
                   ctx->direct_scissor = 0;
                }
 
-             glViewport(x, y, width, height);
+             EVGL_TH(glViewport, x, y, width, height);
           }
      }
    else
      {
         if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
           {
-             glDisable(GL_SCISSOR_TEST);
+             EVGL_TH(glDisable, GL_SCISSOR_TEST);
              ctx->direct_scissor = 0;
           }
 
-        glViewport(x, y, width, height);
+        EVGL_TH(glViewport, x, y, width, height);
      }
 }
 
@@ -1871,30 +1871,31 @@ _evgl_glReadBuffer(GLenum src)
       }
 }
 
+
 //-------------------------------------------------------------//
 // Open GLES 2.0 APIs
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2) \
-static ret evgl_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret evgl_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
-   return _evgl_##name param2; \
+   return _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, param1, param2) \
-static void evgl_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void evgl_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
-   _evgl_##name param2; \
+   _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN(ret, name, param1, param2) \
-static ret evgl_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret evgl_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
-   return name param2; \
+   return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, name, __VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN_VOID(name, param1, param2) \
-static void evgl_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void evgl_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
-   name param2; \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, name, __VA_ARGS__)); \
 }
 
 #include "evas_gl_api_def.h"
@@ -1907,33 +1908,34 @@ static void evgl_##name param1 { \
 
 //-------------------------------------------------------------//
 // Open GLES 2.0 APIs DEBUG
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2) \
-static ret _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
-   ret _a = _evgl_##name param2; \
+   ret _a = _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
    EVGLD_FUNC_END(); \
    return _a; \
 }
 
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, param1, param2) \
-static void _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
-   _evgl_##name param2; \
+   _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
    EVGLD_FUNC_END(); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN(ret, name, param1, param2) \
-static ret _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
-   ret _a = name param2; \
+   ret _a; \
+   _a = EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, name, __VA_ARGS__)); \
    EVGLD_FUNC_END(); \
    return _a; \
 }
 
-#define _EVASGL_FUNCTION_BEGIN_VOID(name, param1, param2) \
-static void _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
-   name param2; \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, name, __VA_ARGS__)); \
    EVGLD_FUNC_END(); \
 }
 
@@ -1947,32 +1949,32 @@ static void _evgld_##name param1 { \
 
 //-------------------------------------------------------------//
 // Open GLES 3.0 APIs
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2) \
-static ret evgl_gles3_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret evgl_gles3_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
    if (!_gles3_api.name) return (ret)0; \
-   return _evgl_##name param2; \
+   return _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, param1, param2) \
-static void evgl_gles3_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void evgl_gles3_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
    if (!_gles3_api.name) return; \
-   _evgl_##name param2; \
+   _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN(ret, name, param1, param2) \
-static ret evgl_gles3_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret evgl_gles3_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
    if (!_gles3_api.name) return (ret)0; \
-   return _gles3_api.name param2; \
+   return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles3_api.name, __VA_ARGS__)); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN_VOID(name, param1, param2) \
-static void evgl_gles3_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void evgl_gles3_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGL_FUNC_BEGIN(); \
    if (!_gles3_api.name) return; \
-   _gles3_api.name param2; \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles3_api.name, __VA_ARGS__)); \
 }
 
 #include "evas_gl_api_gles3_def.h"
@@ -1985,37 +1987,38 @@ static void evgl_gles3_##name param1 { \
 
 //-------------------------------------------------------------//
 // Open GLES 3.0 APIs DEBUG
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2) \
-static ret _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
    if (!_gles3_api.name) return (ret)0; \
-   ret _a = _evgl_##name param2; \
+   ret _a = _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
    EVGLD_FUNC_END(); \
    return _a; \
 }
 
-#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, param1, param2) \
-static void _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
    if (!_gles3_api.name) return; \
-   _evgl_##name param2; \
+   _evgl_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
    EVGLD_FUNC_END(); \
 }
 
-#define _EVASGL_FUNCTION_BEGIN(ret, name, param1, param2) \
-static ret _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
    if (!_gles3_api.name) return (ret)0; \
-   ret _a = _gles3_api.name param2; \
+   ret _a; \
+   _a = EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles3_api.name, __VA_ARGS__)); \
    EVGLD_FUNC_END(); \
    return _a; \
 }
 
-#define _EVASGL_FUNCTION_BEGIN_VOID(name, param1, param2) \
-static void _evgld_##name param1 { \
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void _evgld_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
    EVGLD_FUNC_BEGIN(); \
    if (!_gles3_api.name) return; \
-   _gles3_api.name param2; \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles3_api.name, __VA_ARGS__)); \
    EVGLD_FUNC_END(); \
 }
 
@@ -2251,10 +2254,10 @@ _evgld_glShaderSource(GLuint shader, GLsizei count, const char* const* string, c
    EVGLD_FUNC_BEGIN();
 
 #ifdef GL_GLES
-   glShaderSource(shader, count, string, length);
+   EVGL_TH(glShaderSource, shader, count, string, length);
    goto finish;
 #else
-   //GET_EXT_PTR(void, glShaderSource, (int, int, char **, void *));
+   //GET_EXT_PTR(void, EVGL_TH(glShaderSource), (int, int, char **, void *));
    int size = count;
    int i;
    int acc_length = 0;
@@ -2280,7 +2283,7 @@ _evgld_glShaderSource(GLuint shader, GLsizei count, const char* const* string, c
    if (!tab_prog_new || !tab_length_new)
       ERR("Error allocating memory for shader string manipulation.");
 
-   glShaderSource(shader, count, tab_prog_new, tab_length_new);
+   EVGL_TH(glShaderSource, shader, count, tab_prog_new, tab_length_new);
 
    for (i = 0; i < count; i++)
       free(tab_prog_new[i]);
@@ -2296,20 +2299,13 @@ finish:
 #endif
 
 //-------------------------------------------------------------//
-#define EVAS_API_OVERRIDE_THREAD_CMD(func, api, prefix) \
-   (api)->func = func##_evgl_api_thread_cmd; \
-   orig_evgl_api_##func = prefix##func
-
-#define EVAS_API_OVERRIDE_DIRECT_THREAD_CMD(func, api, prefix) \
-   (api)->func = func##_evgl_thread_cmd;
-
 
 static void
 _normal_gles2_api_get(Evas_GL_API *funcs)
 {
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(f) EVAS_API_OVERRIDE_THREAD_CMD(f, funcs, evgl_)
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs, evgl_)
    // GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
@@ -2461,7 +2457,7 @@ static void
 _direct_scissor_off_api_get(Evas_GL_API *funcs)
 {
 
-#define ORD(f) EVAS_API_OVERRIDE_DIRECT_THREAD_CMD(f, funcs,)
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs,)
    // For Direct Rendering
    ORD(glClear);
    ORD(glClearColor);
@@ -2480,7 +2476,7 @@ _debug_gles2_api_get(Evas_GL_API *funcs)
 {
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(f) EVAS_API_OVERRIDE_THREAD_CMD(f, funcs, _evgld_)
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgld_)
    // GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
@@ -2646,7 +2642,7 @@ _normal_gles3_api_get(Evas_GL_API *funcs, int minor_version)
    if (!funcs) return;
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(f) EVAS_API_OVERRIDE_THREAD_CMD(f, funcs, evgl_)
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs, evgl_)
    // GLES 3.0 APIs that are same as GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
@@ -2794,10 +2790,114 @@ _normal_gles3_api_get(Evas_GL_API *funcs, int minor_version)
 #undef ORD
 
 // GLES 3.0 NEW APIs
-#define ORD(name) EVAS_API_OVERRIDE_THREAD_CMD(name, funcs, evgl_gles3_)
-   switch (minor_version)
+#define ORD(name) EVAS_API_OVERRIDE(name, funcs, evgl_gles3_)
+        ORD(glBeginQuery);
+        ORD(glBeginTransformFeedback);
+        ORD(glBindBufferBase);
+        ORD(glBindBufferRange);
+        ORD(glBindSampler);
+        ORD(glBindTransformFeedback);
+        ORD(glBindVertexArray);
+        ORD(glBlitFramebuffer);
+        ORD(glClearBufferfi);
+        ORD(glClearBufferfv);
+        ORD(glClearBufferiv);
+        ORD(glClearBufferuiv);
+        ORD(glClientWaitSync);
+        ORD(glCompressedTexImage3D);
+        ORD(glCompressedTexSubImage3D);
+        ORD(glCopyBufferSubData);
+        ORD(glCopyTexSubImage3D);
+        ORD(glDeleteQueries);
+        ORD(glDeleteSamplers);
+        ORD(glDeleteSync);
+        ORD(glDeleteTransformFeedbacks);
+        ORD(glDeleteVertexArrays);
+        ORD(glDrawArraysInstanced);
+        ORD(glDrawBuffers);
+        ORD(glDrawElementsInstanced);
+        ORD(glDrawRangeElements);
+        ORD(glEndQuery);
+        ORD(glEndTransformFeedback);
+        ORD(glFenceSync);
+        ORD(glFlushMappedBufferRange);
+        ORD(glFramebufferTextureLayer);
+        ORD(glGenQueries);
+        ORD(glGenSamplers);
+        ORD(glGenTransformFeedbacks);
+        ORD(glGenVertexArrays);
+        ORD(glGetActiveUniformBlockiv);
+        ORD(glGetActiveUniformBlockName);
+        ORD(glGetActiveUniformsiv);
+        ORD(glGetBufferParameteri64v);
+        ORD(glGetBufferPointerv);
+        ORD(glGetFragDataLocation);
+        ORD(glGetInteger64i_v);
+        ORD(glGetInteger64v);
+        ORD(glGetIntegeri_v);
+        ORD(glGetInternalformativ);
+        ORD(glGetProgramBinary);
+        ORD(glGetQueryiv);
+        ORD(glGetQueryObjectuiv);
+        ORD(glGetSamplerParameterfv);
+        ORD(glGetSamplerParameteriv);
+        ORD(glGetStringi);
+        ORD(glGetSynciv);
+        ORD(glGetTransformFeedbackVarying);
+        ORD(glGetUniformBlockIndex);
+        ORD(glGetUniformIndices);
+        ORD(glGetUniformuiv);
+        ORD(glGetVertexAttribIiv);
+        ORD(glGetVertexAttribIuiv);
+        ORD(glInvalidateFramebuffer);
+        ORD(glInvalidateSubFramebuffer);
+        ORD(glIsQuery);
+        ORD(glIsSampler);
+        ORD(glIsSync);
+        ORD(glIsTransformFeedback);
+        ORD(glIsVertexArray);
+        ORD(glMapBufferRange);
+        ORD(glPauseTransformFeedback);
+        ORD(glProgramBinary);
+        ORD(glProgramParameteri);
+        ORD(glReadBuffer);
+        ORD(glRenderbufferStorageMultisample);
+        ORD(glResumeTransformFeedback);
+        ORD(glSamplerParameterf);
+        ORD(glSamplerParameterfv);
+        ORD(glSamplerParameteri);
+        ORD(glSamplerParameteriv);
+        ORD(glTexImage3D);
+        ORD(glTexStorage2D);
+        ORD(glTexStorage3D);
+        ORD(glTexSubImage3D);
+        ORD(glTransformFeedbackVaryings);
+        ORD(glUniform1ui);
+        ORD(glUniform1uiv);
+        ORD(glUniform2ui);
+        ORD(glUniform2uiv);
+        ORD(glUniform3ui);
+        ORD(glUniform3uiv);
+        ORD(glUniform4ui);
+        ORD(glUniform4uiv);
+        ORD(glUniformBlockBinding);
+        ORD(glUniformMatrix2x3fv);
+        ORD(glUniformMatrix3x2fv);
+        ORD(glUniformMatrix2x4fv);
+        ORD(glUniformMatrix4x2fv);
+        ORD(glUniformMatrix3x4fv);
+        ORD(glUniformMatrix4x3fv);
+        ORD(glUnmapBuffer);
+        ORD(glVertexAttribDivisor);
+        ORD(glVertexAttribI4i);
+        ORD(glVertexAttribI4iv);
+        ORD(glVertexAttribI4ui);
+        ORD(glVertexAttribI4uiv);
+        ORD(glVertexAttribIPointer);
+        ORD(glWaitSync);
+   if (minor_version > 1)
      {
-      case 2:
+        //GLES 3.2
         ORD(glBlendBarrier);
         ORD(glCopyImageSubData);
         ORD(glDebugMessageControl);
@@ -2842,7 +2942,11 @@ _normal_gles3_api_get(Evas_GL_API *funcs, int minor_version)
         ORD(glTexBuffer);
         ORD(glTexBufferRange);
         ORD(glTexStorage3DMultisample);
-      case 1:
+}
+
+   if (minor_version > 0)
+     {
+        //GLES 3.1
         ORD(glDispatchCompute);
         ORD(glDispatchComputeIndirect);
         ORD(glDrawArraysIndirect);
@@ -2913,111 +3017,6 @@ _normal_gles3_api_get(Evas_GL_API *funcs, int minor_version)
         ORD(glVertexAttribIFormat);
         ORD(glVertexAttribBinding);
         ORD(glVertexBindingDivisor);
-      case 0:
-        ORD(glBeginQuery);
-        ORD(glBeginTransformFeedback);
-        ORD(glBindBufferBase);
-        ORD(glBindBufferRange);
-        ORD(glBindSampler);
-        ORD(glBindTransformFeedback);
-        ORD(glBindVertexArray);
-        ORD(glBlitFramebuffer);
-        ORD(glClearBufferfi);
-        ORD(glClearBufferfv);
-        ORD(glClearBufferiv);
-        ORD(glClearBufferuiv);
-        ORD(glClientWaitSync);
-        ORD(glCompressedTexImage3D);
-        ORD(glCompressedTexSubImage3D);
-        ORD(glCopyBufferSubData);
-        ORD(glCopyTexSubImage3D);
-        ORD(glDeleteQueries);
-        ORD(glDeleteSamplers);
-        ORD(glDeleteSync);
-        ORD(glDeleteTransformFeedbacks);
-        ORD(glDeleteVertexArrays);
-        ORD(glDrawArraysInstanced);
-        ORD(glDrawBuffers);
-        ORD(glDrawElementsInstanced);
-        ORD(glDrawRangeElements);
-        ORD(glEndQuery);
-        ORD(glEndTransformFeedback);
-        ORD(glFenceSync);
-        ORD(glFlushMappedBufferRange);
-        ORD(glFramebufferTextureLayer);
-        ORD(glGenQueries);
-        ORD(glGenSamplers);
-        ORD(glGenTransformFeedbacks);
-        ORD(glGenVertexArrays);
-        ORD(glGetActiveUniformBlockiv);
-        ORD(glGetActiveUniformBlockName);
-        ORD(glGetActiveUniformsiv);
-        ORD(glGetBufferParameteri64v);
-        ORD(glGetBufferPointerv);
-        ORD(glGetFragDataLocation);
-        ORD(glGetInteger64i_v);
-        ORD(glGetInteger64v);
-        ORD(glGetIntegeri_v);
-        ORD(glGetInternalformativ);
-        ORD(glGetProgramBinary);
-        ORD(glGetQueryiv);
-        ORD(glGetQueryObjectuiv);
-        ORD(glGetSamplerParameterfv);
-        ORD(glGetSamplerParameteriv);
-        ORD(glGetStringi);
-        ORD(glGetSynciv);
-        ORD(glGetTransformFeedbackVarying);
-        ORD(glGetUniformBlockIndex);
-        ORD(glGetUniformIndices);
-        ORD(glGetUniformuiv);
-        ORD(glGetVertexAttribIiv);
-        ORD(glGetVertexAttribIuiv);
-        ORD(glInvalidateFramebuffer);
-        ORD(glInvalidateSubFramebuffer);
-        ORD(glIsQuery);
-        ORD(glIsSampler);
-        ORD(glIsSync);
-        ORD(glIsTransformFeedback);
-        ORD(glIsVertexArray);
-        ORD(glMapBufferRange);
-        ORD(glPauseTransformFeedback);
-        ORD(glProgramBinary);
-        ORD(glProgramParameteri);
-        ORD(glReadBuffer);
-        ORD(glRenderbufferStorageMultisample);
-        ORD(glResumeTransformFeedback);
-        ORD(glSamplerParameterf);
-        ORD(glSamplerParameterfv);
-        ORD(glSamplerParameteri);
-        ORD(glSamplerParameteriv);
-        ORD(glTexImage3D);
-        ORD(glTexStorage2D);
-        ORD(glTexStorage3D);
-        ORD(glTexSubImage3D);
-        ORD(glTransformFeedbackVaryings);
-        ORD(glUniform1ui);
-        ORD(glUniform1uiv);
-        ORD(glUniform2ui);
-        ORD(glUniform2uiv);
-        ORD(glUniform3ui);
-        ORD(glUniform3uiv);
-        ORD(glUniform4ui);
-        ORD(glUniform4uiv);
-        ORD(glUniformBlockBinding);
-        ORD(glUniformMatrix2x3fv);
-        ORD(glUniformMatrix3x2fv);
-        ORD(glUniformMatrix2x4fv);
-        ORD(glUniformMatrix4x2fv);
-        ORD(glUniformMatrix3x4fv);
-        ORD(glUniformMatrix4x3fv);
-        ORD(glUnmapBuffer);
-        ORD(glVertexAttribDivisor);
-        ORD(glVertexAttribI4i);
-        ORD(glVertexAttribI4iv);
-        ORD(glVertexAttribI4ui);
-        ORD(glVertexAttribI4uiv);
-        ORD(glVertexAttribIPointer);
-        ORD(glWaitSync);
      }
 
 #undef ORD
@@ -3029,7 +3028,7 @@ _debug_gles3_api_get(Evas_GL_API *funcs, int minor_version)
    if (!funcs) return;
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(f) EVAS_API_OVERRIDE_THREAD_CMD(f, funcs, _evgld_)
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgld_)
    // GLES 3.0 APIs that are same as GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
@@ -3175,9 +3174,115 @@ _debug_gles3_api_get(Evas_GL_API *funcs, int minor_version)
    ORD(glBindFramebuffer);
    ORD(glBindRenderbuffer);
 
-   switch (minor_version)
+   // GLES 3.0 new APIs
+        ORD(glBeginQuery);
+        ORD(glBeginTransformFeedback);
+        ORD(glBindBufferBase);
+        ORD(glBindBufferRange);
+        ORD(glBindSampler);
+        ORD(glBindTransformFeedback);
+        ORD(glBindVertexArray);
+        ORD(glBlitFramebuffer);
+        ORD(glClearBufferfi);
+        ORD(glClearBufferfv);
+        ORD(glClearBufferiv);
+        ORD(glClearBufferuiv);
+        ORD(glClientWaitSync);
+        ORD(glCompressedTexImage3D);
+        ORD(glCompressedTexSubImage3D);
+        ORD(glCopyBufferSubData);
+        ORD(glCopyTexSubImage3D);
+        ORD(glDeleteQueries);
+        ORD(glDeleteSamplers);
+        ORD(glDeleteSync);
+        ORD(glDeleteTransformFeedbacks);
+        ORD(glDeleteVertexArrays);
+        ORD(glDrawArraysInstanced);
+        ORD(glDrawBuffers);
+        ORD(glDrawElementsInstanced);
+        ORD(glDrawRangeElements);
+        ORD(glEndQuery);
+        ORD(glEndTransformFeedback);
+        ORD(glFenceSync);
+        ORD(glFlushMappedBufferRange);
+        ORD(glFramebufferTextureLayer);
+        ORD(glGenQueries);
+        ORD(glGenSamplers);
+        ORD(glGenTransformFeedbacks);
+        ORD(glGenVertexArrays);
+        ORD(glGetActiveUniformBlockiv);
+        ORD(glGetActiveUniformBlockName);
+        ORD(glGetActiveUniformsiv);
+        ORD(glGetBufferParameteri64v);
+        ORD(glGetBufferPointerv);
+        ORD(glGetFragDataLocation);
+        ORD(glGetInteger64i_v);
+        ORD(glGetInteger64v);
+        ORD(glGetIntegeri_v);
+        ORD(glGetInternalformativ);
+        ORD(glGetProgramBinary);
+        ORD(glGetQueryiv);
+        ORD(glGetQueryObjectuiv);
+        ORD(glGetSamplerParameterfv);
+        ORD(glGetSamplerParameteriv);
+        ORD(glGetStringi);
+        ORD(glGetSynciv);
+        ORD(glGetTransformFeedbackVarying);
+        ORD(glGetUniformBlockIndex);
+        ORD(glGetUniformIndices);
+        ORD(glGetUniformuiv);
+        ORD(glGetVertexAttribIiv);
+        ORD(glGetVertexAttribIuiv);
+        ORD(glInvalidateFramebuffer);
+        ORD(glInvalidateSubFramebuffer);
+        ORD(glIsQuery);
+        ORD(glIsSampler);
+        ORD(glIsSync);
+        ORD(glIsTransformFeedback);
+        ORD(glIsVertexArray);
+        ORD(glMapBufferRange);
+        ORD(glPauseTransformFeedback);
+        ORD(glProgramBinary);
+        ORD(glProgramParameteri);
+        ORD(glReadBuffer);
+        ORD(glRenderbufferStorageMultisample);
+        ORD(glResumeTransformFeedback);
+        ORD(glSamplerParameterf);
+        ORD(glSamplerParameterfv);
+        ORD(glSamplerParameteri);
+        ORD(glSamplerParameteriv);
+        ORD(glTexImage3D);
+        ORD(glTexStorage2D);
+        ORD(glTexStorage3D);
+        ORD(glTexSubImage3D);
+        ORD(glTransformFeedbackVaryings);
+        ORD(glUniform1ui);
+        ORD(glUniform1uiv);
+        ORD(glUniform2ui);
+        ORD(glUniform2uiv);
+        ORD(glUniform3ui);
+        ORD(glUniform3uiv);
+        ORD(glUniform4ui);
+        ORD(glUniform4uiv);
+        ORD(glUniformBlockBinding);
+        ORD(glUniformMatrix2x3fv);
+        ORD(glUniformMatrix3x2fv);
+        ORD(glUniformMatrix2x4fv);
+        ORD(glUniformMatrix4x2fv);
+        ORD(glUniformMatrix3x4fv);
+        ORD(glUniformMatrix4x3fv);
+        ORD(glUnmapBuffer);
+        ORD(glVertexAttribDivisor);
+        ORD(glVertexAttribI4i);
+        ORD(glVertexAttribI4iv);
+        ORD(glVertexAttribI4ui);
+        ORD(glVertexAttribI4uiv);
+        ORD(glVertexAttribIPointer);
+        ORD(glWaitSync);
+
+   if (minor_version > 1)
      {
-      case 2:
+        //GLES 3.2
         ORD(glBlendBarrier);
         ORD(glCopyImageSubData);
         ORD(glDebugMessageControl);
@@ -3222,7 +3327,10 @@ _debug_gles3_api_get(Evas_GL_API *funcs, int minor_version)
         ORD(glTexBuffer);
         ORD(glTexBufferRange);
         ORD(glTexStorage3DMultisample);
-      case 1:
+}
+   if (minor_version > 0)
+     {
+        //GLES 3.1
         ORD(glDispatchCompute);
         ORD(glDispatchComputeIndirect);
         ORD(glDrawArraysIndirect);
@@ -3293,7 +3401,32 @@ _debug_gles3_api_get(Evas_GL_API *funcs, int minor_version)
         ORD(glVertexAttribIFormat);
         ORD(glVertexAttribBinding);
         ORD(glVertexBindingDivisor);
-      case 0:
+     }
+
+#undef ORD
+}
+
+
+static Eina_Bool
+_evgl_load_gles3_apis(void *dl_handle, Evas_GL_API *funcs, int minor_version,
+                      void *(*get_proc_address)(const char *))
+{
+   if (!dl_handle) return EINA_FALSE;
+   Eina_Bool ret_value = EINA_FALSE;
+
+#define ORD(name) do { \
+   funcs->name = dlsym(dl_handle, #name); \
+   if (!funcs->name && get_proc_address) \
+     funcs->name = get_proc_address(#name); \
+   if (!funcs->name) { \
+        WRN("%s symbol not found", #name); \
+        return ret_value; \
+     } } while (0)
+
+   // Used to update extensions
+   ORD(glGetString);
+
+   // GLES 3.0 new APIs
         ORD(glBeginQuery);
         ORD(glBeginTransformFeedback);
         ORD(glBindBufferBase);
@@ -3398,31 +3531,12 @@ _debug_gles3_api_get(Evas_GL_API *funcs, int minor_version)
         ORD(glVertexAttribI4uiv);
         ORD(glVertexAttribIPointer);
         ORD(glWaitSync);
-     }
-
-#undef ORD
-}
-
-
-static Eina_Bool
-_evgl_load_gles3_apis(void *dl_handle, Evas_GL_API *funcs, int minor_version)
-{
-   if (!dl_handle) return EINA_FALSE;
-
-#define ORD(name) \
-   funcs->name = dlsym(dl_handle, #name); \
-   if (!funcs->name) \
-     { \
-        WRN("%s symbol not found", #name); \
-        return EINA_FALSE; \
-     }
-
-   // Used to update extensions
-   ORD(glGetString);
-
-   switch (minor_version)
+   if (minor_version > 1)
      {
-      case 2:
+        // OpenGL ES 3.0 is supported, return true even if 3.1 isn't there
+        ret_value = EINA_TRUE;
+
+        // OpenGL ES 3.2
         ORD(glBlendBarrier);
         ORD(glCopyImageSubData);
         ORD(glDebugMessageControl);
@@ -3467,7 +3581,13 @@ _evgl_load_gles3_apis(void *dl_handle, Evas_GL_API *funcs, int minor_version)
         ORD(glTexBuffer);
         ORD(glTexBufferRange);
         ORD(glTexStorage3DMultisample);
-      case 1:
+      }
+   if (minor_version > 0)
+     {
+        // OpenGL ES 3.0 is supported, return true even if 3.1 isn't there
+        ret_value = EINA_TRUE;
+
+        // OpenGL ES 3.1
         ORD(glDispatchCompute);
         ORD(glDispatchComputeIndirect);
         ORD(glDrawArraysIndirect);
@@ -3538,121 +3658,16 @@ _evgl_load_gles3_apis(void *dl_handle, Evas_GL_API *funcs, int minor_version)
         ORD(glVertexAttribIFormat);
         ORD(glVertexAttribBinding);
         ORD(glVertexBindingDivisor);
-      case 0:
-        ORD(glBeginQuery);
-        ORD(glBeginTransformFeedback);
-        ORD(glBindBufferBase);
-        ORD(glBindBufferRange);
-        ORD(glBindSampler);
-        ORD(glBindTransformFeedback);
-        ORD(glBindVertexArray);
-        ORD(glBlitFramebuffer);
-        ORD(glClearBufferfi);
-        ORD(glClearBufferfv);
-        ORD(glClearBufferiv);
-        ORD(glClearBufferuiv);
-        ORD(glClientWaitSync);
-        ORD(glCompressedTexImage3D);
-        ORD(glCompressedTexSubImage3D);
-        ORD(glCopyBufferSubData);
-        ORD(glCopyTexSubImage3D);
-        ORD(glDeleteQueries);
-        ORD(glDeleteSamplers);
-        ORD(glDeleteSync);
-        ORD(glDeleteTransformFeedbacks);
-        ORD(glDeleteVertexArrays);
-        ORD(glDrawArraysInstanced);
-        ORD(glDrawBuffers);
-        ORD(glDrawElementsInstanced);
-        ORD(glDrawRangeElements);
-        ORD(glEndQuery);
-        ORD(glEndTransformFeedback);
-        ORD(glFenceSync);
-        ORD(glFlushMappedBufferRange);
-        ORD(glFramebufferTextureLayer);
-        ORD(glGenQueries);
-        ORD(glGenSamplers);
-        ORD(glGenTransformFeedbacks);
-        ORD(glGenVertexArrays);
-        ORD(glGetActiveUniformBlockiv);
-        ORD(glGetActiveUniformBlockName);
-        ORD(glGetActiveUniformsiv);
-        ORD(glGetBufferParameteri64v);
-        ORD(glGetBufferPointerv);
-        ORD(glGetFragDataLocation);
-        ORD(glGetInteger64i_v);
-        ORD(glGetInteger64v);
-        ORD(glGetIntegeri_v);
-        ORD(glGetInternalformativ);
-        ORD(glGetProgramBinary);
-        ORD(glGetQueryiv);
-        ORD(glGetQueryObjectuiv);
-        ORD(glGetSamplerParameterfv);
-        ORD(glGetSamplerParameteriv);
-        ORD(glGetStringi);
-        ORD(glGetSynciv);
-        ORD(glGetTransformFeedbackVarying);
-        ORD(glGetUniformBlockIndex);
-        ORD(glGetUniformIndices);
-        ORD(glGetUniformuiv);
-        ORD(glGetVertexAttribIiv);
-        ORD(glGetVertexAttribIuiv);
-        ORD(glInvalidateFramebuffer);
-        ORD(glInvalidateSubFramebuffer);
-        ORD(glIsQuery);
-        ORD(glIsSampler);
-        ORD(glIsSync);
-        ORD(glIsTransformFeedback);
-        ORD(glIsVertexArray);
-        ORD(glMapBufferRange);
-        ORD(glPauseTransformFeedback);
-        ORD(glProgramBinary);
-        ORD(glProgramParameteri);
-        ORD(glReadBuffer);
-        ORD(glRenderbufferStorageMultisample);
-        ORD(glResumeTransformFeedback);
-        ORD(glSamplerParameterf);
-        ORD(glSamplerParameterfv);
-        ORD(glSamplerParameteri);
-        ORD(glSamplerParameteriv);
-        ORD(glTexImage3D);
-        ORD(glTexStorage2D);
-        ORD(glTexStorage3D);
-        ORD(glTexSubImage3D);
-        ORD(glTransformFeedbackVaryings);
-        ORD(glUniform1ui);
-        ORD(glUniform1uiv);
-        ORD(glUniform2ui);
-        ORD(glUniform2uiv);
-        ORD(glUniform3ui);
-        ORD(glUniform3uiv);
-        ORD(glUniform4ui);
-        ORD(glUniform4uiv);
-        ORD(glUniformBlockBinding);
-        ORD(glUniformMatrix2x3fv);
-        ORD(glUniformMatrix3x2fv);
-        ORD(glUniformMatrix2x4fv);
-        ORD(glUniformMatrix4x2fv);
-        ORD(glUniformMatrix3x4fv);
-        ORD(glUniformMatrix4x3fv);
-        ORD(glUnmapBuffer);
-        ORD(glVertexAttribDivisor);
-        ORD(glVertexAttribI4i);
-        ORD(glVertexAttribI4iv);
-        ORD(glVertexAttribI4ui);
-        ORD(glVertexAttribI4uiv);
-        ORD(glVertexAttribIPointer);
-        ORD(glWaitSync);
      }
-
 #undef ORD
+
    return EINA_TRUE;
 }
 
 
 
 static Eina_Bool
-_evgl_gles3_api_init(int minor_version)
+_evgl_gles3_api_init(int minor_version, void *(*get_proc_address)(const char *))
 {
    static Eina_Bool _initialized = EINA_FALSE;
    if (_initialized) return EINA_TRUE;
@@ -3684,7 +3699,7 @@ _evgl_gles3_api_init(int minor_version)
         return EINA_FALSE;
      }
 
-   if (!_evgl_load_gles3_apis(_gles3_handle, &_gles3_api, minor_version))
+   if (!_evgl_load_gles3_apis(_gles3_handle, &_gles3_api, minor_version, get_proc_address))
      {
         return EINA_FALSE;
      }
@@ -3693,11 +3708,16 @@ _evgl_gles3_api_init(int minor_version)
    return EINA_TRUE;
 }
 
-
 void
-_evgl_api_gles3_get(Evas_GL_API *funcs, Eina_Bool debug)
+_evgl_api_gles3_get(Evas_GL_API *funcs, void *(*get_proc_address)(const char *),
+                    Eina_Bool debug)
 {
-   const char *ret = (const char *) glGetString_evgl_thread_cmd(GL_VERSION);
+   const char *ret = (const char *) EVGL_TH(glGetString, GL_VERSION);
+   if (!ret)
+     {
+       ERR("glGetString is NULL");
+       return;
+     }
    int minor_version =  ret[12] - '0';
 
    if (minor_version > 9 || minor_version < 0)
@@ -3706,8 +3726,8 @@ _evgl_api_gles3_get(Evas_GL_API *funcs, Eina_Bool debug)
         return;
      }
 
-   if (!_evgl_gles3_api_init(minor_version))
-      return;
+   if (!_evgl_gles3_api_init(minor_version, get_proc_address))
+        return;
 
    if (debug)
      _debug_gles3_api_get(funcs, minor_version);
index 662fbac..bf8f82f 100644 (file)
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glBindFramebuffer, (GLenum target, GLuint framebuffer), (target, framebuffer))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClearDepthf, (GLclampf depth), (depth))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDepthRangef, (GLclampf zNear, GLclampf zFar), (zNear, zFar))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetShaderPrecisionFormat, (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision), (shadertype, precisiontype, range, precision))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glShaderBinary, (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length), (n, shaders, binaryformat, binary, length))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReleaseShaderCompiler, (void), ())
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClearColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red, green, blue, alpha))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClear, (GLbitfield mask), (mask))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glEnable, (GLenum cap), (cap))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDisable, (GLenum cap), (cap))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetIntegerv, (GLenum pname, GLint* params), (pname, params))
-_EVASGL_FUNCTION_PRIVATE_BEGIN(const GLubyte *, glGetString, (GLenum name), (name))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels), (x, y, width, height, format, type, pixels))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glScissor, (GLint x, GLint y, GLsizei width, GLsizei height), (x, y, width, height))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glViewport, (GLint x, GLint y, GLsizei width, GLsizei height), (x, y, width, height))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDeleteFramebuffers, (GLsizei n, const GLuint* framebuffers), (n, framebuffers))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferRenderbuffer, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer), (target, attachment, renderbuffertarget, renderbuffer))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferTexture2D, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level), (target, attachment, textarget, texture, level))
-_EVASGL_FUNCTION_PRIVATE_BEGIN(GLenum, glGetError, (void), ())
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFloatv, (GLenum pname, GLfloat* params), (pname, params))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFramebufferAttachmentParameteriv, (GLenum target, GLenum attachment, GLenum pname, GLint* params), (target, attachment, pname, params))
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glBindFramebuffer, GLenum, target, GLuint, framebuffer )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClearDepthf, GLclampf, depth )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDepthRangef, GLclampf, zNear, GLclampf, zFar )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetShaderPrecisionFormat, GLenum, shadertype, GLenum, precisiontype, GLint*, range, GLint*, precision )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glShaderBinary, GLsizei, n, const GLuint*, shaders, GLenum, binaryformat, const void*, binary, GLsizei, length )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReleaseShaderCompiler)
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClearColor, GLclampf, red, GLclampf, green, GLclampf, blue, GLclampf, alpha )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClear, GLbitfield, mask )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glEnable, GLenum, cap )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDisable, GLenum, cap )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetIntegerv, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_PRIVATE_BEGIN(const GLubyte *, glGetString, GLenum, name )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReadPixels, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, void*, pixels )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glScissor, GLint, xoffset, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glViewport, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDeleteFramebuffers, GLsizei, n, const GLuint*, framebuffers )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferRenderbuffer, GLenum, target, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferTexture2D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level )
+_EVASGL_FUNCTION_PRIVATE_BEGIN(GLenum, glGetError )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFloatv, GLenum, pname, GLfloat*, params )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFramebufferAttachmentParameteriv, GLenum, target, GLenum, attachment, GLenum, pname, GLint*, params )
 
-_EVASGL_FUNCTION_BEGIN_VOID( glActiveTexture, (GLenum texture), (texture))
-_EVASGL_FUNCTION_BEGIN_VOID( glAttachShader, (GLuint program, GLuint shader), (program, shader))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindAttribLocation, (GLuint program, GLuint index, const char* name), (program, index, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindBuffer, (GLenum target, GLuint buffer), (target, buffer))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindRenderbuffer, (GLenum target, GLuint renderbuffer), (target, renderbuffer))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindTexture, (GLenum target, GLuint texture), (target, texture))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red, green, blue, alpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquation, ( GLenum mode ), (mode))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationSeparate, (GLenum modeRGB, GLenum modeAlpha), (modeRGB, modeAlpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendFunc, (GLenum sfactor, GLenum dfactor), (sfactor, dfactor))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendFuncSeparate, (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha), (srcRGB, dstRGB, srcAlpha, dstAlpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glBufferData, (GLenum target, GLsizeiptr size, const void* data, GLenum usage), (target, size, data, usage))
-_EVASGL_FUNCTION_BEGIN_VOID( glBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, const void* data), (target, offset, size, data))
-_EVASGL_FUNCTION_BEGIN(GLenum, glCheckFramebufferStatus, (GLenum target), (target))
-_EVASGL_FUNCTION_BEGIN_VOID( glClearStencil, (GLint s), (s))
-_EVASGL_FUNCTION_BEGIN_VOID( glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha), (red, green, blue, alpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glCompileShader, (GLuint shader), (shader))
-_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data), (target, level, internalformat, width, height, border, imageSize, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data), (target, level, xoffset, yoffset, width, height, format, imageSize, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border), (target, level, internalformat, x, y, width, height, border))
-_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height), (target, level, xoffset, yoffset, x, y, width, height))
-_EVASGL_FUNCTION_BEGIN(GLuint, glCreateProgram, (void), ())
-_EVASGL_FUNCTION_BEGIN(GLuint, glCreateShader, (GLenum type), (type))
-_EVASGL_FUNCTION_BEGIN_VOID( glCullFace, (GLenum mode), (mode))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteBuffers, (GLsizei n, const GLuint* buffers), (n, buffers))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteProgram, (GLuint program), (program))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteRenderbuffers, (GLsizei n, const GLuint* renderbuffers), (n, renderbuffers))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteShader, (GLuint shader), (shader))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteTextures, (GLsizei n, const GLuint* textures), (n, textures))
-_EVASGL_FUNCTION_BEGIN_VOID( glDepthFunc, (GLenum func), (func))
-_EVASGL_FUNCTION_BEGIN_VOID( glDepthMask, (GLboolean flag), (flag))
-_EVASGL_FUNCTION_BEGIN_VOID( glDetachShader, (GLuint program, GLuint shader), (program, shader))
-_EVASGL_FUNCTION_BEGIN_VOID( glDisableVertexAttribArray, (GLuint index), (index))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawArrays, (GLenum mode, GLint first, GLsizei count), (mode, first, count))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawElements, (GLenum mode, GLsizei count, GLenum type, const void* indices), (mode, count, type, indices))
-_EVASGL_FUNCTION_BEGIN_VOID( glEnableVertexAttribArray, (GLuint index), (index))
-_EVASGL_FUNCTION_BEGIN_VOID( glFinish, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glFlush, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glFrontFace, (GLenum mode), (mode))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenBuffers, (GLsizei n, GLuint* buffers), (n, buffers))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenerateMipmap, (GLenum target), (target))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenFramebuffers, (GLsizei n, GLuint* framebuffers), (n, framebuffers))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenRenderbuffers, (GLsizei n, GLuint* renderbuffers), (n, renderbuffers))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenTextures, (GLsizei n, GLuint* textures), (n, textures))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveAttrib, (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name), (program, index, bufsize, length, size, type, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniform, (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name), (program, index, bufsize, length, size, type, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetAttachedShaders, (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders), (program, maxcount, count, shaders))
-_EVASGL_FUNCTION_BEGIN(int, glGetAttribLocation, (GLuint program, const char* name), (program, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetBooleanv, (GLenum pname, GLboolean* params), (pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferParameteriv, (GLenum target, GLenum pname, GLint* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramiv, (GLuint program, GLenum pname, GLint* params), (program, pname,  params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramInfoLog, (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog), (program, bufsize, length, infolog))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetRenderbufferParameteriv, (GLenum target, GLenum pname, GLint* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderiv, (GLuint shader, GLenum pname, GLint* params), (shader, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderInfoLog, (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog), (shader, bufsize, length, infolog))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderSource, (GLuint shader, GLsizei bufsize, GLsizei* length, char* source), (shader, bufsize, length, source))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterfv, (GLenum target, GLenum pname, GLfloat* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameteriv, (GLenum target, GLenum pname, GLint* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformfv, (GLuint program, GLint location, GLfloat* params), (program, location, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformiv, (GLuint program, GLint location, GLint* params), (program, location, params))
-_EVASGL_FUNCTION_BEGIN(int, glGetUniformLocation, (GLuint program, const char* name), (program, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribfv, (GLuint index, GLenum pname, GLfloat* params), (index, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribiv, (GLuint index, GLenum pname, GLint* params), (index, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribPointerv, (GLuint index, GLenum pname, void** pointer), (index, pname, pointer))
-_EVASGL_FUNCTION_BEGIN_VOID( glHint, (GLenum target, GLenum mode), (target, mode))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsBuffer, (GLuint buffer), (buffer))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsEnabled, (GLenum cap), (cap))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsFramebuffer, (GLuint framebuffer), (framebuffer))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsProgram, (GLuint program), (program))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsRenderbuffer, (GLuint renderbuffer), (renderbuffer))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsShader, (GLuint shader), (shader))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsTexture, (GLuint texture), (texture))
-_EVASGL_FUNCTION_BEGIN_VOID( glLineWidth, (GLfloat width), (width))
-_EVASGL_FUNCTION_BEGIN_VOID( glLinkProgram, (GLuint program), (program))
-_EVASGL_FUNCTION_BEGIN_VOID( glPixelStorei, (GLenum pname, GLint param), (pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glPolygonOffset, (GLfloat factor, GLfloat units), (factor, units))
-_EVASGL_FUNCTION_BEGIN_VOID( glRenderbufferStorage, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height), (target, internalformat, width, height))
-_EVASGL_FUNCTION_BEGIN_VOID( glSampleCoverage, (GLclampf value, GLboolean invert), (value, invert))
-_EVASGL_FUNCTION_BEGIN_VOID( glShaderSource, (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length), (shader, count, string, length))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilFunc, (GLenum func, GLint ref, GLuint mask), (func, ref, mask))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilFuncSeparate, (GLenum face, GLenum func, GLint ref, GLuint mask), (face, func, ref, mask))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilMask, (GLuint mask), (mask))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilMaskSeparate, (GLenum face, GLuint mask), (face, mask))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass), (fail, zfail, zpass))
-_EVASGL_FUNCTION_BEGIN_VOID( glStencilOpSeparate, (GLenum face, GLenum fail, GLenum zfail, GLenum zpass), (face, fail, zfail, zpass))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels), (target, level, internalformat, width, height, border, format, type, pixels))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterf, (GLenum target, GLenum pname, GLfloat param), (target, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterfv, (GLenum target, GLenum pname, const GLfloat* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteri, (GLenum target, GLenum pname, GLint param), (target, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteriv, (GLenum target, GLenum pname, const GLint* params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels), (target, level, xoffset, yoffset, width, height, format, type, pixels))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1f, (GLint location, GLfloat x), (location, x))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1fv, (GLint location, GLsizei count, const GLfloat* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1i, (GLint location, GLint x), (location, x))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1iv, (GLint location, GLsizei count, const GLint* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2f, (GLint location, GLfloat x, GLfloat y), (location, x, y))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2fv, (GLint location, GLsizei count, const GLfloat* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2i, (GLint location, GLint x, GLint y), (location, x, y))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2iv, (GLint location, GLsizei count, const GLint* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3f, (GLint location, GLfloat x, GLfloat y, GLfloat z), (location, x, y, z))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3fv, (GLint location, GLsizei count, const GLfloat* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3i, (GLint location, GLint x, GLint y, GLint z), (location, x, y, z))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3iv, (GLint location, GLsizei count, const GLint* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4f, (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w), (location, x, y, z, w))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4fv, (GLint location, GLsizei count, const GLfloat* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4i, (GLint location, GLint x, GLint y, GLint z, GLint w), (location, x, y, z, w))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4iv, (GLint location, GLsizei count, const GLint* v), (location, count, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUseProgram, (GLuint program), (program))
-_EVASGL_FUNCTION_BEGIN_VOID( glValidateProgram, (GLuint program), (program))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib1f, (GLuint indx, GLfloat x), (indx, x))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib1fv, (GLuint indx, const GLfloat* values), (indx, values))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib2f, (GLuint indx, GLfloat x, GLfloat y), (indx, x, y))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib2fv, (GLuint indx, const GLfloat* values), (indx, values))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib3f, (GLuint indx, GLfloat x, GLfloat y, GLfloat z), (indx, x, y, z))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib3fv, (GLuint indx, const GLfloat* values), (indx, values))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib4f, (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w), (indx, x, y, z, w))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib4fv, (GLuint indx, const GLfloat* values), (indx, values))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribPointer, (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr), (indx, size, type, normalized, stride, ptr))
+_EVASGL_FUNCTION_BEGIN_VOID( glActiveTexture, GLenum, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glAttachShader, GLuint, program, GLuint, shader )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindAttribLocation, GLuint, program, GLuint, index, const char*, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindBuffer, GLenum, target, GLuint, buffer )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindRenderbuffer, GLenum, target, GLuint, renderbuffer )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindTexture, GLenum, target, GLuint, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendColor, GLclampf, red, GLclampf, green, GLclampf, blue, GLclampf, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquation,  GLenum, mode  )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationSeparate, GLenum, modeRGB, GLenum, modeAlpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendFunc, GLenum, sfactor, GLenum, dfactor )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendFuncSeparate, GLenum, srcRGB, GLenum, dstRGB, GLenum, srcAlpha, GLenum, dstAlpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glBufferData, GLenum, target, GLsizeiptr, size, const void*, data, GLenum, usage )
+_EVASGL_FUNCTION_BEGIN_VOID( glBufferSubData, GLenum, target, GLintptr, offset, GLsizeiptr, size, const void*, data )
+_EVASGL_FUNCTION_BEGIN(GLenum, glCheckFramebufferStatus, GLenum, target )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearStencil, GLint, s )
+_EVASGL_FUNCTION_BEGIN_VOID( glColorMask, GLboolean, red, GLboolean, green, GLboolean, blue, GLboolean, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompileShader, GLuint, shader )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexImage2D, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLsizei, imageSize, const void*, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLsizei, imageSize, const void*, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexImage2D, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLint, border )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN(GLuint, glCreateProgram )
+_EVASGL_FUNCTION_BEGIN(GLuint, glCreateShader, GLenum, type )
+_EVASGL_FUNCTION_BEGIN_VOID( glCullFace, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteBuffers, GLsizei, n, const GLuint*, buffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteProgram, GLuint, program )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteRenderbuffers, GLsizei, n, const GLuint*, renderbuffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteShader, GLuint, shader )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteTextures, GLsizei, n, const GLuint*, textures )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthFunc, GLenum, func )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthMask, GLboolean, flag )
+_EVASGL_FUNCTION_BEGIN_VOID( glDetachShader, GLuint, program, GLuint, shader )
+_EVASGL_FUNCTION_BEGIN_VOID( glDisableVertexAttribArray, GLuint, index )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawArrays, GLenum, mode, GLint, first, GLsizei, count )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElements, GLenum, mode, GLsizei, count, GLenum, type, const void*, indices )
+_EVASGL_FUNCTION_BEGIN_VOID( glEnableVertexAttribArray, GLuint, index )
+_EVASGL_FUNCTION_BEGIN_VOID( glFinish )
+_EVASGL_FUNCTION_BEGIN_VOID( glFlush )
+_EVASGL_FUNCTION_BEGIN_VOID( glFrontFace, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenBuffers, GLsizei, n, GLuint*, buffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenerateMipmap, GLenum, target )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenFramebuffers, GLsizei, n, GLuint*, framebuffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenRenderbuffers, GLsizei, n, GLuint*, renderbuffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenTextures, GLsizei, n, GLuint*, textures )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveAttrib, GLuint, program, GLuint, index, GLsizei, bufsize, GLsizei*, length, GLint*, size, GLenum*, type, char*, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniform, GLuint, program, GLuint, index, GLsizei, bufsize, GLsizei*, length, GLint*, size, GLenum*, type, char*, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetAttachedShaders, GLuint, program, GLsizei, maxcount, GLsizei*, count, GLuint*, shaders )
+_EVASGL_FUNCTION_BEGIN(int, glGetAttribLocation, GLuint, program, const char*, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBooleanv, GLenum, pname, GLboolean*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferParameteriv, GLenum, target, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramiv, GLuint, program, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramInfoLog, GLuint, program, GLsizei, bufsize, GLsizei*, length, char*, infolog )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetRenderbufferParameteriv, GLenum, target, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderiv, GLuint, shader, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderInfoLog, GLuint, shader, GLsizei, bufsize, GLsizei*, length, char*, infolog )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetShaderSource, GLuint, shader, GLsizei, bufsize, GLsizei*, length, char*, source )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterfv, GLenum, target, GLenum, pname, GLfloat*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameteriv, GLenum, target, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformfv, GLuint, program, GLint, location, GLfloat*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformiv, GLuint, program, GLint, location, GLint*, params )
+_EVASGL_FUNCTION_BEGIN(int, glGetUniformLocation, GLuint, program, const char*, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribfv, GLuint, index, GLenum, pname, GLfloat*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribiv, GLuint, index, GLenum, pname, GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribPointerv, GLuint, index, GLenum, pname, void**, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glHint, GLenum, target, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsBuffer, GLuint, buffer )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsEnabled, GLenum, cap )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsFramebuffer, GLuint, framebuffer )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsProgram, GLuint, program )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsRenderbuffer, GLuint, renderbuffer )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsShader, GLuint, shader )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsTexture, GLuint, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glLineWidth, GLfloat, width )
+_EVASGL_FUNCTION_BEGIN_VOID( glLinkProgram, GLuint, program )
+_EVASGL_FUNCTION_BEGIN_VOID( glPixelStorei, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glPolygonOffset, GLfloat, factor, GLfloat, units )
+_EVASGL_FUNCTION_BEGIN_VOID( glRenderbufferStorage, GLenum, target, GLenum, internalformat, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN_VOID( glSampleCoverage, GLclampf, value, GLboolean, invert )
+_EVASGL_FUNCTION_BEGIN_VOID( glShaderSource, GLuint, shader, GLsizei, count, const GLchar* const*, string, const GLint*, length )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilFunc, GLenum, func, GLint, ref, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilFuncSeparate, GLenum, face, GLenum, func, GLint, ref, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilMask, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilMaskSeparate, GLenum, face, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilOp, GLenum, fail, GLenum, zfail, GLenum, zpass )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilOpSeparate, GLenum, face, GLenum, fail, GLenum, zfail, GLenum, zpass )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexImage2D, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLenum, format, GLenum, type, const void*, pixels )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterf, GLenum, target, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterfv, GLenum, target, GLenum, pname, const GLfloat*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteri, GLenum, target, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteriv, GLenum, target, GLenum, pname, const GLint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, const void*, pixels )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1f, GLint, location, GLfloat, x )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1fv, GLint, location, GLsizei, count, const GLfloat*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1i, GLint, location, GLint, x )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1iv, GLint, location, GLsizei, count, const GLint*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2f, GLint, location, GLfloat, x, GLfloat, y )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2fv, GLint, location, GLsizei, count, const GLfloat*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2i, GLint, location, GLint, x, GLint, y )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2iv, GLint, location, GLsizei, count, const GLint*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3f, GLint, location, GLfloat, x, GLfloat, y, GLfloat, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3fv, GLint, location, GLsizei, count, const GLfloat*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3i, GLint, location, GLint, x, GLint, y, GLint, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3iv, GLint, location, GLsizei, count, const GLint*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4f, GLint, location, GLfloat, x, GLfloat, y, GLfloat, z, GLfloat, w )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4fv, GLint, location, GLsizei, count, const GLfloat*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4i, GLint, location, GLint, x, GLint, y, GLint, z, GLint, w )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4iv, GLint, location, GLsizei, count, const GLint*, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat*, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat*, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat*, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUseProgram, GLuint, program )
+_EVASGL_FUNCTION_BEGIN_VOID( glValidateProgram, GLuint, program )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib1f, GLuint, indx, GLfloat, x )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib1fv, GLuint, indx, const GLfloat*, values )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib2f, GLuint, indx, GLfloat, x, GLfloat, y )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib2fv, GLuint, indx, const GLfloat*, values )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib3f, GLuint, indx, GLfloat, x, GLfloat, y, GLfloat, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib3fv, GLuint, indx, const GLfloat*, values )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib4f, GLuint, indx, GLfloat, x, GLfloat, y, GLfloat, z, GLfloat, w )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttrib4fv, GLuint, indx, const GLfloat*, values )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribPointer, GLuint, indx, GLint, size, GLenum, type, GLboolean, normalized, GLsizei, stride, const void*, ptr )
index 43f50c0..97ea449 100644 (file)
@@ -46,22 +46,16 @@ struct wl_resource;
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-   ret (*egl_ext_sym_##name) param1 = NULL; \
-   ret (*gl_ext_sym_##name) param1 = NULL; \
-   ret (*gles1_ext_sym_##name) param1 = NULL; \
-   ret (*gles3_ext_sym_##name) param1 = NULL;
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-   ret (*egl_ext_sym_##name) param1 = NULL; \
-   ret (*gl_ext_sym_##name) param1 = NULL; \
-   ret (*gles1_ext_sym_##name) param1 = NULL; \
-   ret (*gles3_ext_sym_##name) param1 = NULL;
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
+   ret (*egl_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)) = NULL; \
+   ret (*gl_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)) = NULL; \
+   ret (*gles1_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)) = NULL; \
+   ret (*gles3_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)) = NULL;
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
@@ -73,13 +67,11 @@ struct wl_resource;
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -100,14 +92,12 @@ struct wl_resource;
    int _gles1_ext_support_func_##name = 0; \
    int _gles3_ext_support_func_##name = 0;
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
@@ -121,13 +111,11 @@ struct wl_resource;
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 
 #define EVGL_FUNC_BEGIN() if (UNLIKELY(_need_context_restore)) _context_restore()
@@ -209,10 +197,11 @@ _evgl_eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx,
         *a = EGL_NONE;
      }
 
-   eglimg = EXT_FUNC_EGL(eglCreateImage)(dpy, ctx, target, buffer, attribs);
+   eglimg = EVGL_TH_CALL(eglCreateImage, EXT_FUNC_EGL(eglCreateImage), dpy, ctx, target, buffer, attribs);
    if (!eglimg) return NULL;
 
    img = calloc(1, sizeof(EvasGLImage_EGL));
+   if (!img) return NULL;
    img->dpy = dpy;
    img->img = eglimg;
    return img;
@@ -233,7 +222,7 @@ _evgl_evasglCreateImage(int target, void* buffer, const int *attrib_list)
    /* EGL_NO_CONTEXT will always fail for TEXTURE_2D */
    if (target == EVAS_GL_TEXTURE_2D)
      {
-        ctx = eglGetCurrentContext();
+        ctx = EVGL_TH(eglGetCurrentContext);
         DBG("Creating EGL image based on the current context: %p", ctx);
      }
 
@@ -270,7 +259,7 @@ _evgl_evasglDestroyImage(EvasGLImage image)
         return;
      }
 
-   EXT_FUNC_EGL(eglDestroyImage)(img->dpy, img->img);
+   EVGL_TH_CALL(eglDestroyImage, EXT_FUNC_EGL(eglDestroyImage), img->dpy, img->img);
    free(img);
 }
 
@@ -303,11 +292,11 @@ _evgl_glEvasGLImageTargetTexture2D(GLenum target, EvasGLImage image)
   if (!img)
     {
        ERR("EvasGLImage is NULL");
-       EXT_FUNC(glEGLImageTargetTexture2DOES)(target, NULL);
+       EVGL_TH_CALL(glEGLImageTargetTexture2DOES, EXT_FUNC(glEGLImageTargetTexture2DOES), target, NULL);
        return;
     }
 
-   EXT_FUNC(glEGLImageTargetTexture2DOES)(target, img->img);
+   EVGL_TH_CALL(glEGLImageTargetTexture2DOES, EXT_FUNC(glEGLImageTargetTexture2DOES), target, img->img);
 }
 
 static void
@@ -339,11 +328,11 @@ _evgl_glEvasGLImageTargetRenderbufferStorage(GLenum target, EvasGLImage image)
   if (!img)
     {
        ERR("EvasGLImage is NULL");
-       EXT_FUNC(glEGLImageTargetRenderbufferStorageOES)(target, NULL);
+       EVGL_TH_CALL(glEGLImageTargetRenderbufferStorageOES, EXT_FUNC(glEGLImageTargetRenderbufferStorageOES), target, NULL);
        return;
     }
 
-   EXT_FUNC(glEGLImageTargetRenderbufferStorageOES)(target, img->img);
+   EVGL_TH_CALL(glEGLImageTargetRenderbufferStorageOES, EXT_FUNC(glEGLImageTargetRenderbufferStorageOES), target, img->img);
 }
 
 static EvasGLSync
@@ -352,7 +341,7 @@ _evgl_evasglCreateSync(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return NULL;
-   return EXT_FUNC_EGL(eglCreateSyncKHR)(dpy, type, attrib_list);
+   return EVGL_TH_CALL(eglCreateSyncKHR, EXT_FUNC_EGL(eglCreateSyncKHR), dpy, type, attrib_list);
 }
 
 static Eina_Bool
@@ -360,7 +349,7 @@ _evgl_evasglDestroySync(Evas_GL *evas_gl, EvasGLSync sync)
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglDestroySyncKHR)(dpy, sync);
+   return EVGL_TH_CALL(eglDestroySyncKHR, EXT_FUNC_EGL(eglDestroySyncKHR), dpy, sync);
 }
 
 static int
@@ -369,7 +358,7 @@ _evgl_evasglClientWaitSync(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglClientWaitSyncKHR)(dpy, sync, flags, timeout);
+   return EVGL_TH_CALL(eglClientWaitSyncKHR, EXT_FUNC_EGL(eglClientWaitSyncKHR), dpy, sync, flags, timeout);
 }
 
 static Eina_Bool
@@ -378,7 +367,7 @@ _evgl_evasglSignalSync(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglSignalSyncKHR)(dpy, sync, mode);
+   return EVGL_TH_CALL(eglSignalSyncKHR, EXT_FUNC_EGL(eglSignalSyncKHR), dpy, sync, mode);
 }
 
 static Eina_Bool
@@ -387,7 +376,7 @@ _evgl_evasglGetSyncAttrib(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglGetSyncAttribKHR)(dpy, sync, attribute, value);
+   return EVGL_TH_CALL(eglGetSyncAttribKHR, EXT_FUNC_EGL(eglGetSyncAttribKHR), dpy, sync, attribute, value);
 }
 
 static int
@@ -396,7 +385,7 @@ _evgl_evasglWaitSync(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglWaitSyncKHR)(dpy, sync, flags);
+   return EVGL_TH_CALL(eglWaitSyncKHR, EXT_FUNC_EGL(eglWaitSyncKHR), dpy, sync, flags);
 }
 
 static Eina_Bool
@@ -405,7 +394,7 @@ _evgl_evasglBindWaylandDisplay(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglBindWaylandDisplayWL)(dpy, wl_display);
+   return EVGL_TH_CALL(eglBindWaylandDisplayWL, EXT_FUNC_EGL(eglBindWaylandDisplayWL), dpy, wl_display);
 }
 
 static Eina_Bool
@@ -414,7 +403,7 @@ _evgl_evasglUnbindWaylandDisplay(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglUnbindWaylandDisplayWL)(dpy, wl_display);
+   return EVGL_TH_CALL(eglUnbindWaylandDisplayWL, EXT_FUNC_EGL(eglUnbindWaylandDisplayWL), dpy, wl_display);
 }
 
 static Eina_Bool
@@ -423,7 +412,7 @@ _evgl_evasglQueryWaylandBuffer(Evas_GL *evas_gl,
 {
    EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
    if (!dpy) return EINA_FALSE;
-   return EXT_FUNC_EGL(eglQueryWaylandBufferWL)(dpy, buffer, attribute, value);
+   return EVGL_TH_CALL(eglQueryWaylandBufferWL, EXT_FUNC_EGL(eglQueryWaylandBufferWL), dpy, buffer, attribute, value);
 }
 
 #else
@@ -485,12 +474,12 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
                att[i] = GL_STENCIL_ATTACHMENT;
              i++;
           }
-        EXT_FUNC(glDiscardFramebuffer)(target, numAttachments, att);
+        EVGL_TH_CALL(glDiscardFramebufferEXT, EXT_FUNC(glDiscardFramebuffer), target, numAttachments, att);
         free(att);
      }
    else
      {
-        EXT_FUNC(glDiscardFramebuffer)(target, numAttachments, attachments);
+        EVGL_TH_CALL(glDiscardFramebufferEXT, EXT_FUNC(glDiscardFramebuffer), target, numAttachments, attachments);
      }
 }
 
@@ -502,19 +491,15 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-    static ret evgl_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC(name) param2; }
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-    static ret evgl_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC(name) param2; }
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
+    static ret evgl_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { EVGL_FUNC_BEGIN(); return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, EXT_FUNC(name), __VA_ARGS__)); }
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
@@ -526,16 +511,13 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
 //1.1 ext bodies
 #define _EVASGL_EXT_CHECK_SUPPORT(name)
@@ -545,19 +527,15 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-    static ret evgl_gles1_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC_GLES1(name) param2; }
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-    static ret evgl_gles1_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC_GLES1(name) param2; }
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
+    static ret evgl_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { EVGL_FUNC_BEGIN(); return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, EXT_FUNC_GLES1(name), __VA_ARGS__)); }
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
@@ -569,16 +547,13 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
 //3.X ext bodies
 #define _EVASGL_EXT_CHECK_SUPPORT(name)
@@ -588,19 +563,15 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-    static ret evgl_gles3_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC_GLES3(name) param2; }
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-    static ret evgl_gles3_##name param1 { EVGL_FUNC_BEGIN(); return EXT_FUNC_GLES3(name) param2; }
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
+    static ret evgl_gles3_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { EVGL_FUNC_BEGIN(); return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, EXT_FUNC_GLES3(name), __VA_ARGS__)); }
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
@@ -612,16 +583,13 @@ _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenu
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
 //  0: not initialized,
 //  1: GLESv2 initialized,
@@ -681,22 +649,16 @@ evgl_api_egl_ext_init(void *getproc, const char *glueexts)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname) \
    if (_EVASGL_EXT_CHECK_SUPPORT(deskname)) *ext_support = 1;
 
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
      { \
-        ret (**drvfunc)param1 = &egl_ext_sym_##name; \
+        ret (**drvfunc)(_EVASGL_PARAM_PROTO(__VA_ARGS__)) = &egl_ext_sym_##name; \
         if (*ext_support == 1) \
           {
 
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-     { \
-        ret (**drvfunc)param1 = &egl_ext_sym_##name; \
-        if (*ext_support == 1) \
-          {
 #define _EVASGL_EXT_FUNCTION_END() \
           } \
         if ((*drvfunc) == NULL) _EVASGL_EXT_DISCARD_SUPPORT(); \
      }
-
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name) \
@@ -712,14 +674,6 @@ evgl_api_egl_ext_init(void *getproc, const char *glueexts)
      } \
    else evgl_safe_extension_add(name, NULL);
 
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name) \
-   if ((*drvfunc) == NULL) \
-     { \
-        *drvfunc = GETPROCADDR(name); \
-        evgl_safe_extension_add(name, (void *) (*drvfunc)); \
-     } \
-   else evgl_safe_extension_add(name, NULL);
-
 #ifdef _EVASGL_EXT_FUNCTION_WHITELIST
 # undef _EVASGL_EXT_FUNCTION_WHITELIST
 #endif
@@ -741,13 +695,11 @@ evgl_api_egl_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
 #undef GETPROCADDR
    /////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -778,14 +730,12 @@ evgl_api_egl_ext_init(void *getproc, const char *glueexts)
      if (_curext_supported && _egl_ext_support_func_##name) \
        _EVASGL_EXT_DRVNAME_PRINT(#name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #define _EVASGL_EXT_ENABLE_GL_GLES 0
 #define _EVASGL_EXT_ENABLE_EGL 1
@@ -803,13 +753,11 @@ evgl_api_egl_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    if (_egl_ext_string) free(_egl_ext_string);
@@ -843,7 +791,7 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
 #endif
 
    // GLES Extensions
-   glexts = (const char*)glGetString_evgl_thread_cmd(GL_EXTENSIONS);
+   glexts = (const char*)EVGL_TH(glGetString, GL_EXTENSIONS);
    if (!glexts)
      {
         ERR("glGetString returned NULL! Something is very wrong...");
@@ -881,18 +829,9 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname) \
    if (_EVASGL_EXT_CHECK_SUPPORT(deskname)) *ext_support = 1;
 
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-     { \
-        ret (**drvfunc)param1 = &gl_ext_sym_##name; \
-        ret (**origfunc)param1 = &orig_evgl_api_##name; \
-        ret (*threadfunc)param1 = &name##_evgl_api_thread_cmd; \
-        origfunc = origfunc; threadfunc = threadfunc; \
-        if (*ext_support == 1) \
-          {
-
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
      { \
-        ret (**drvfunc)param1 = &gl_ext_sym_##name; \
+        ret (**drvfunc)(_EVASGL_PARAM_PROTO(__VA_ARGS__)) = &gl_ext_sym_##name; \
         if (*ext_support == 1) \
           {
 
@@ -911,19 +850,6 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
    if ((*drvfunc) == NULL) \
      { \
         *drvfunc = GETPROCADDR(name); \
-       if (*drvfunc) \
-       { \
-          *origfunc = *drvfunc; \
-          *drvfunc = *threadfunc; \
-       } \
-        evgl_safe_extension_add(name, (void *) (*drvfunc)); \
-     } \
-   else evgl_safe_extension_add(name, NULL);
-
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name) \
-   if ((*drvfunc) == NULL) \
-     { \
-        *drvfunc = GETPROCADDR(name); \
         evgl_safe_extension_add(name, (void *) (*drvfunc)); \
      } \
    else evgl_safe_extension_add(name, NULL);
@@ -949,13 +875,11 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
 #undef GETPROCADDR
    /////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -987,14 +911,12 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
      if (_curext_supported && _gl_ext_support_func_##name) \
        _EVASGL_EXT_DRVNAME_PRINT(#name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 #define _EVASGL_EXT_ENABLE_GL_GLES 1
 #define _EVASGL_EXT_ENABLE_EGL 1
 
@@ -1011,13 +933,11 @@ _evgl_api_gles2_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    if (_gl_ext_string) free(_gl_ext_string);
@@ -1043,7 +963,6 @@ evgl_api_gles2_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
              return;
           }
      }
-
 #define ORD(f) EVAS_API_OVERRIDE(f, gl_funcs, evgl_)
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1059,19 +978,15 @@ evgl_api_gles2_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-   ORD(name);
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
    ORD(name);
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #undef _EVASGL_EXT_WHITELIST_ONLY
 #define _EVASGL_EXT_WHITELIST_ONLY 0
@@ -1092,16 +1007,13 @@ evgl_api_gles2_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 #undef ORD
 
@@ -1113,9 +1025,7 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
    const char *glexts;
    fp_getproc gp = (fp_getproc)getproc;
    int _curext_supported = 0;
-   /*
    Evas_GL_API *gles1_funcs;
-   */
    Eina_Strbuf *sb = eina_strbuf_new();
    Eina_Strbuf *sboff = eina_strbuf_new();
 
@@ -1153,7 +1063,6 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
      }
 #endif
 
-   /*
    gles1_funcs = _evgl_api_gles1_internal_get();
    if (!gles1_funcs || !gles1_funcs->glGetString)
      {
@@ -1161,9 +1070,7 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
         goto error;
      }
 
-   glexts = (const char *) gles1_funcs->glGetString(GL_EXTENSIONS);
-   */
-   glexts = (const char *) glGetString_evgl_thread_cmd(GL_EXTENSIONS);
+   glexts = (const char *) EVGL_TH_CALL(glGetString, gles1_funcs->glGetString, GL_EXTENSIONS);
    if (!glexts)
      {
         ERR("GLESv1:glGetString(GL_EXTENSIONS) returned NULL!");
@@ -1200,18 +1107,9 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname) \
    if (_EVASGL_EXT_CHECK_SUPPORT(deskname)) *ext_support = 1;
 
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-     { \
-        ret (**drvfunc)param1 = &gles1_ext_sym_##name; \
-        ret (**origfunc)param1 = &orig_evgl_api_##name; \
-        ret (*threadfunc)param1 = &name##_evgl_api_thread_cmd; \
-        origfunc = origfunc; threadfunc = threadfunc; \
-        if (*ext_support == 1) \
-          {
-
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
      { \
-        ret (**drvfunc)param1 = &gles1_ext_sym_##name; \
+        ret (**drvfunc)(_EVASGL_PARAM_PROTO(__VA_ARGS__)) = &gles1_ext_sym_##name; \
         if (*ext_support == 1) \
           {
 
@@ -1219,7 +1117,6 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
           } \
         if ((*drvfunc) == NULL) _EVASGL_EXT_DISCARD_SUPPORT(); \
      }
-
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN() \
    if (EINA_FALSE) \
      {
@@ -1232,19 +1129,6 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
    if ((*drvfunc) == NULL) \
      { \
         *drvfunc = GETPROCADDR(name); \
-       if (*drvfunc) \
-       { \
-          *origfunc = *drvfunc; \
-          *drvfunc = *threadfunc; \
-       } \
-        evgl_safe_extension_add(name, (void *) (*drvfunc)); \
-     } \
-   else evgl_safe_extension_add(name, NULL);
-
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name) \
-   if ((*drvfunc) == NULL) \
-     { \
-        *drvfunc = GETPROCADDR(name); \
         evgl_safe_extension_add(name, (void *) (*drvfunc)); \
      } \
    else evgl_safe_extension_add(name, NULL);
@@ -1273,13 +1157,11 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 #undef GETPROCADDR
 
 #define _EVASGL_EXT_BEGIN(name) \
@@ -1311,14 +1193,12 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
    if (_curext_supported && _gles1_ext_support_func_##name) \
       _EVASGL_EXT_DRVNAME_PRINT(#name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 #define _EVASGL_EXT_ENABLE_GL_GLES 1
 #define _EVASGL_EXT_ENABLE_EGL 1
 
@@ -1335,13 +1215,11 @@ _evgl_api_gles1_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
    if (_gles1_ext_string) free(_gles1_ext_string);
    if (_gles1_ext_string_official) free(_gles1_ext_string_official);
@@ -1390,19 +1268,15 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-   ORD(name);
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
    ORD(name);
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #undef _EVASGL_EXT_WHITELIST_ONLY
 #define _EVASGL_EXT_WHITELIST_ONLY 0
@@ -1421,16 +1295,13 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 #undef ORD
 
@@ -1442,9 +1313,7 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
    const char *glexts;
    fp_getproc gp = (fp_getproc)getproc;
    int _curext_supported = 0;
-   /*
    Evas_GL_API *gles3_funcs;
-   */
    Eina_Strbuf *sb = eina_strbuf_new();
    Eina_Strbuf *sboff = eina_strbuf_new();
 
@@ -1483,7 +1352,6 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
 #endif
 
    _gles3_ext_plist = eina_array_new(1);
-   /*
    gles3_funcs = _evgl_api_gles3_internal_get();
    if (!gles3_funcs || !gles3_funcs->glGetString)
      {
@@ -1491,9 +1359,7 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
         goto error;
      }
 
-   glexts = (const char *) gles3_funcs->glGetString(GL_EXTENSIONS);
-   */
-   glexts = (const char *) glGetString_evgl_thread_cmd(GL_EXTENSIONS);
+   glexts = (const char *) EVGL_TH_CALL(glGetString, gles3_funcs->glGetString, GL_EXTENSIONS);
    if (!glexts)
      {
         ERR("GLESv3:glGetString(GL_EXTENSIONS) returned NULL!");
@@ -1530,18 +1396,9 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname) \
    if (_EVASGL_EXT_CHECK_SUPPORT(deskname)) *ext_support = 1;
 
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-     { \
-        ret (**drvfunc)param1 = &gles3_ext_sym_##name; \
-        ret (**origfunc)param1 = &orig_evgl_api_##name; \
-        ret (*threadfunc)param1 = &name##_evgl_api_thread_cmd; \
-        origfunc = origfunc; threadfunc = threadfunc; \
-        if (*ext_support == 1) \
-          {
-
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
      { \
-        ret (**drvfunc)param1 = &gles3_ext_sym_##name; \
+        ret (**drvfunc)(_EVASGL_PARAM_PROTO(__VA_ARGS__)) = &gles3_ext_sym_##name; \
         if (*ext_support == 1) \
           {
 
@@ -1549,7 +1406,6 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
           } \
         if ((*drvfunc) == NULL) _EVASGL_EXT_DISCARD_SUPPORT(); \
      }
-
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name) \
@@ -1559,19 +1415,6 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
    if ((*drvfunc) == NULL) \
      { \
         *drvfunc = GETPROCADDR(name); \
-       if (*drvfunc) \
-       { \
-          *origfunc = *drvfunc; \
-          *drvfunc = *threadfunc; \
-       } \
-        evgl_safe_extension_add(name, (void *) (*drvfunc)); \
-     } \
-   else evgl_safe_extension_add(name, NULL);
-
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name) \
-   if ((*drvfunc) == NULL) \
-     { \
-        *drvfunc = GETPROCADDR(name); \
         evgl_safe_extension_add(name, (void *) (*drvfunc)); \
      } \
    else evgl_safe_extension_add(name, NULL);
@@ -1598,13 +1441,11 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 #undef GETPROCADDR
 
 #define _EVASGL_EXT_BEGIN(name) \
@@ -1639,14 +1480,12 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
    if (_curext_supported && _gles3_ext_support_func_##name) \
       _EVASGL_EXT_DRVNAME_PRINT(#name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #define _EVASGL_EXT_ENABLE_GL_GLES 1
 #define _EVASGL_EXT_ENABLE_EGL 1
@@ -1664,13 +1503,11 @@ _evgl_api_gles3_ext_init(void *getproc, const char *glueexts)
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 
    if (_gles3_ext_string) free(_gles3_ext_string);
    if (_gles3_ext_string_official) free(_gles3_ext_string_official);
@@ -1719,19 +1556,15 @@ evgl_api_gles3_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-   ORD(name);
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
    ORD(name);
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #undef _EVASGL_EXT_WHITELIST_ONLY
 #define _EVASGL_EXT_WHITELIST_ONLY 0
@@ -1751,16 +1584,13 @@ evgl_api_gles3_ext_get(Evas_GL_API *gl_funcs, void *getproc, const char *glueext
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 #undef ORD
 
index 700560b..4dcdb64 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "evas_gl_core_private.h"
 
+
 #ifdef GL_GLES
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) \
-   extern ret (*egl_ext_sym_##name) param1; \
-   extern ret (*gl_ext_sym_##name) param1; \
-   extern ret (*gles1_ext_sym_##name) param1; \
-   extern ret (*gles3_ext_sym_##name) param1;
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) \
-   extern ret (*egl_ext_sym_##name) param1; \
-   extern ret (*gl_ext_sym_##name) param1; \
-   extern ret (*gles1_ext_sym_##name) param1; \
-   extern ret (*gles3_ext_sym_##name) param1;
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) \
+   extern ret (*egl_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)); \
+   extern ret (*gl_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)); \
+   extern ret (*gles1_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__)); \
+   extern ret (*gles3_ext_sym_##name) (_EVASGL_PARAM_PROTO(__VA_ARGS__));
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 #define EXT_FUNC_EGL(fname) egl_ext_sym_##fname
 #define EXT_FUNC(fname) gl_ext_sym_##fname
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...)
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
 #define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #include "evas_gl_api_ext_def.h"
 
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_DESKTOP
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
 #undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
-#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 #define EXTENSION_SUPPORT_EGL(name) (_egl_ext_support_##name == 1)
 #define EXTENSION_SUPPORT(name) (_gl_ext_support_##name == 1)
index d94bf21..f9a151e 100644 (file)
 
 // These functions will be exported to 'EVAS extension function'.
 // The functions of this block must correspond with the functions list in Evas_GL.h.
-// Begin of the extension function block (ret : return value, name : function name, param1 : parameters with bracket, param2 : parameters without type)
-#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2) ret (*name) param1;
-#define _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2) ret (*name) param1;
+// Begin of the extension function block (ret : return value, name : function name, ... : parameters)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ...) ret (*name) (_EVASGL_PARAM_PROTO__VA_ARGS__);
 // End of the extension function block
 #define _EVASGL_EXT_FUNCTION_END()
-// End of the extension function block
 
 // These functions will not be exported. Only be used in engines privately.
-// Begin of the extension function block (ret : return value, name : function name, param1 : parameters with bracket, param2 : parameters without type)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2)
+// Begin of the extension function block (ret : return value, name : function name, ... : parameters)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...)
 // End of the extension function block
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
@@ -44,7 +41,6 @@
 
 // Driver extension functions that need no wrapping
 #define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
-#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH(name)
 
 #endif
 //////////////////////////////////////////////////////////////////////////////////////////////////
@@ -55,7 +51,7 @@
 #endif
 
 #ifndef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param1, param2) _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param1, param2)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, ...) _EVASGL_EXT_FUNCTION_BEGIN(ret, name, ##__VA_ARGS__)
 #define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_DEFINED
 #endif
 
 #define _EVASGL_EXT_FUNCTION_PRIVATE_END_DEFINED
 #endif
 
-#ifndef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(ret, name, param1, param2) _EVASGL_EXT_FUNCTION_BEGIN_NOTH(ret, name, param1, param2)
-#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH_DEFINED
-#endif
-
 #ifndef _EVASGL_EXT_WHITELIST_ONLY
 # define _EVASGL_EXT_WHITELIST_ONLY 1
 #endif
 _EVASGL_EXT_BEGIN(get_program_binary)
        _EVASGL_EXT_DRVNAME(GL_OES_get_program_binary)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetProgramBinaryOES, (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary), (program, bufSize, length, binaryFormat, binary))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetProgramBinaryOES, GLuint, program, GLsizei, bufSize, GLsizei *, length, GLenum *, binaryFormat, void *, binary)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetProgramBinaryOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glProgramBinaryOES, (GLuint program, GLenum binaryFormat, const void *binary, GLint length), (program, binaryFormat, binary, length))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glProgramBinaryOES, GLuint, program, GLenum, binaryFormat, const void *, binary, GLint, length)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glProgramBinaryOES")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -104,13 +95,13 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(mapbuffer)
        _EVASGL_EXT_DRVNAME(GL_OES_mapbuffer)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void *, glMapBufferOES, (GLenum target, GLenum access), (target, access))
+       _EVASGL_EXT_FUNCTION_BEGIN(void *, glMapBufferOES, GLenum, target, GLenum, access)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMapBufferOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glUnmapBufferOES, (GLenum target), (target))
+       _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glUnmapBufferOES, GLenum, target)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glUnmapBufferOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetBufferPointervOES, (GLenum target, GLenum pname, void** params), (target, pname, params))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetBufferPointervOES, GLenum, target, GLenum, pname, void**, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetBufferPointervOES")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -118,22 +109,22 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(texture_3D)
        _EVASGL_EXT_DRVNAME(GL_OES_texture_3D)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glTexImage3DOES, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels), (target, level, internalformat, width, height, depth, border, format, type, pixels))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glTexImage3DOES, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLenum, format, GLenum, type, const void*, pixels)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexImage3DOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glTexSubImage3DOES, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, const void*, pixels)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexSubImage3DOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(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))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glCopyTexSubImage3DOES, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCopyTexSubImage3DOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glCompressedTexImage3DOES, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data), (target, level, internalformat, width, height, depth, border, imageSize, data))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glCompressedTexImage3DOES, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLsizei, imageSize, const void*, data)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCompressedTexImage3DOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glCompressedTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glCompressedTexSubImage3DOES, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLsizei, imageSize, const void*, data)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCompressedTexSubImage3DOES")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture3DOES, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset), (target, attachment, textarget, texture, level, zoffset))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture3DOES, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLint, zoffset)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferTexture3DOES")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -142,37 +133,37 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(AMD_performance_monitor)
        _EVASGL_EXT_DRVNAME(GL_AMD_performance_monitor)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorGroupsAMD, (GLint* numGroups, GLsizei groupsSize, GLuint* groups), (numGroups, groupsSize, groups))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorGroupsAMD, GLint*, numGroups, GLsizei, groupsSize, GLuint*, groups)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorGroupsAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCountersAMD, (GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters), (group, numCounters, maxActiveCounters, counterSize, counters))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCountersAMD, GLuint, group, GLint*, numCounters, GLint*, maxActiveCounters, GLsizei, counterSize, GLuint*, counters)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorCountersAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorGroupStringAMD, (GLuint group, GLsizei bufSize, GLsizei* length, char* groupString), (group, bufSize, length, groupString))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorGroupStringAMD, GLuint, group, GLsizei, bufSize, GLsizei*, length, char*, groupString)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorGroupStringAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterStringAMD, (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString), (group, counter, bufSize, length, counterString))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterStringAMD, GLuint, group, GLuint, counter, GLsizei, bufSize, GLsizei*, length, char*, counterString)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorCounterStringAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterInfoAMD, (GLuint group, GLuint counter, GLenum pname, void* data), (group, counter, pname, data))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterInfoAMD, GLuint, group, GLuint, counter, GLenum, pname, void*, data)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorCounterInfoAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGenPerfMonitorsAMD, (GLsizei n, GLuint* monitors), (n, monitors))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGenPerfMonitorsAMD, GLsizei, n, GLuint*, monitors)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenPerfMonitorsAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glDeletePerfMonitorsAMD, (GLsizei n, GLuint* monitors), (n, monitors))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glDeletePerfMonitorsAMD, GLsizei, n, GLuint*, monitors)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeletePerfMonitorsAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glSelectPerfMonitorCountersAMD, (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList), (monitor, enable, group, numCounters, countersList))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glSelectPerfMonitorCountersAMD, GLuint, monitor, GLboolean, enable, GLuint, group, GLint, numCounters, GLuint*, countersList)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glSelectPerfMonitorCountersAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glBeginPerfMonitorAMD, (GLuint monitor), (monitor))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glBeginPerfMonitorAMD, GLuint, monitor)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBeginPerfMonitorAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glEndPerfMonitorAMD, (GLuint monitor), (monitor))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glEndPerfMonitorAMD, GLuint, monitor)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glEndPerfMonitorAMD")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterDataAMD, (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten), (monitor, pname, dataSize, data, bytesWritten))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetPerfMonitorCounterDataAMD, GLuint, monitor, GLenum, pname, GLsizei, dataSize, GLuint*, data, GLint*, bytesWritten)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetPerfMonitorCounterDataAMD")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -181,11 +172,11 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(discard_framebuffer)
        _EVASGL_EXT_DRVNAME(GL_EXT_discard_framebuffer)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glDiscardFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum* attachments), (target, numAttachments, attachments))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glDiscardFramebuffer, GLenum, target, GLsizei, numAttachments, const GLenum*, attachments)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDiscardFramebufferEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glDiscardFramebufferEXT, (GLenum target, GLsizei numAttachments, const GLenum* attachments), (target, numAttachments, attachments))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glDiscardFramebufferEXT, GLenum, target, GLsizei, numAttachments, const GLenum*, attachments)
                 _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_glDiscardFramebufferEXT)
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -195,10 +186,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(multi_draw_arrays)
        _EVASGL_EXT_DRVNAME(GL_EXT_multi_draw_arrays)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiDrawArraysEXT, (GLenum mode, GLint* first, GLsizei* count, GLsizei primcount), (mode, first, count, primcount))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiDrawArraysEXT, GLenum, mode, GLint*, first, GLsizei*, count, GLsizei, primcount)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMultiDrawArraysEXT")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiDrawElementsEXT, (GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount), (mode, count, type, indices, primcount))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiDrawElementsEXT, GLenum, mode, const GLsizei*, count, GLenum, type, const GLvoid**, indices, GLsizei, primcount)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMultiDrawElementsEXT")
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMultiDrawElementsARB")
        _EVASGL_EXT_FUNCTION_END()
@@ -208,25 +199,25 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(NV_fence)
        _EVASGL_EXT_DRVNAME(GL_NV_fence)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteFencesNV, (GLsizei n, const GLuint* fences), (n, fences))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteFencesNV, GLsizei, n, const GLuint*, fences)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeleteFencesNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGenFencesNV, (GLsizei n, GLuint* fences), (n, fences))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGenFencesNV, GLsizei, n, GLuint*, fences)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenFencesNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glIsFenceNV, (GLuint fence), (fence))
+       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glIsFenceNV, GLuint, fence)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glIsFenceNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glTestFenceNV, (GLuint fence), (fence))
+       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glTestFenceNV, GLuint, fence)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTestFenceNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFenceivNV, (GLuint fence, GLenum pname, GLint* params), (fence, pname, params))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFenceivNV, GLuint, fence, GLenum, pname, GLint*, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetFenceivNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glFinishFenceNV, (GLuint fence), (fence))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glFinishFenceNV, GLuint, fence)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFinishFenceNV")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glSetFenceNV, (GLuint fence, GLenum condition), (fence, condition))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glSetFenceNV, GLuint, fence, GLenum, condition)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glSetFenceNV")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -235,16 +226,16 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(QCOM_driver_control)
        _EVASGL_EXT_DRVNAME(GL_QCOM_driver_control)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetDriverControlsQCOM, (GLint* num, GLsizei size, GLuint* driverControls), (num, size, driverControls))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetDriverControlsQCOM, GLint*, num, GLsizei, size, GLuint*, driverControls)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetDriverControlsQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetDriverControlStringQCOM, (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString), (driverControl, bufSize, length, driverControlString))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glGetDriverControlStringQCOM, GLuint, driverControl, GLsizei, bufSize, GLsizei *, length, GLchar *, driverControlString)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetDriverControlStringQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glEnableDriverControlQCOM, (GLuint driverControl), (driverControl))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glEnableDriverControlQCOM, GLuint, driverControl)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glEnableDriverControlQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glDisableDriverControlQCOM, (GLuint driverControl), (driverControl))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glDisableDriverControlQCOM, GLuint, driverControl)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDisableDriverControlQCOM")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -253,28 +244,28 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(QCOM_extended_get)
        _EVASGL_EXT_DRVNAME(GL_QCOM_extended_get)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexturesQCOM, (GLuint* textures, GLint maxTextures, GLint* numTextures), (textures, maxTextures, numTextures))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexturesQCOM, GLuint*, textures, GLint, maxTextures, GLint*, numTextures)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetTexturesQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetBuffersQCOM, (GLuint* buffers, GLint maxBuffers, GLint* numBuffers), (buffers, maxBuffers, numBuffers))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetBuffersQCOM, GLuint*, buffers, GLint, maxBuffers, GLint*, numBuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetBuffersQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetRenderbuffersQCOM, (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers), (renderbuffers, maxRenderbuffers, numRenderbuffers))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetRenderbuffersQCOM, GLuint*, renderbuffers, GLint, maxRenderbuffers, GLint*, numRenderbuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetRenderbuffersQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetFramebuffersQCOM, (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers), (framebuffers, maxFramebuffers, numFramebuffers))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetFramebuffersQCOM, GLuint*, framebuffers, GLint, maxFramebuffers, GLint*, numFramebuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetFramebuffersQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexLevelParameterivQCOM, (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params), (texture, face, level, pname, params))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexLevelParameterivQCOM, GLuint, texture, GLenum, face, GLint, level, GLenum, pname, GLint*, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetTexLevelParameterivQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtTexObjectStateOverrideiQCOM, (GLenum target, GLenum pname, GLint param), (target, pname, param))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtTexObjectStateOverrideiQCOM, GLenum, target, GLenum, pname, GLint, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtTexObjectStateOverrideiQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexSubImageQCOM, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetTexSubImageQCOM, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, void*, texels)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetTexSubImageQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetBufferPointervQCOM, (GLenum target, void** params), (target, params))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetBufferPointervQCOM, GLenum, target, void**, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetBufferPointervQCOM")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -283,16 +274,16 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(QCOM_extended_get2)
        _EVASGL_EXT_DRVNAME(GL_QCOM_extended_get2)
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetShadersQCOM, (GLuint* shaders, GLint maxShaders, GLint* numShaders), (shaders, maxShaders, numShaders))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetShadersQCOM, GLuint*, shaders, GLint, maxShaders, GLint*, numShaders)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetShadersQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetProgramsQCOM, (GLuint* programs, GLint maxPrograms, GLint* numPrograms), (programs, maxPrograms, numPrograms))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetProgramsQCOM, GLuint*, programs, GLint, maxPrograms, GLint*, numPrograms)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetProgramsQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glExtIsProgramBinaryQCOM, (GLuint program), (program))
+       _EVASGL_EXT_FUNCTION_BEGIN(unsigned char, glExtIsProgramBinaryQCOM, GLuint, program)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtIsProgramBinaryQCOM")
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetProgramBinarySourceQCOM, (GLuint program, GLenum shadertype, char* source, GLint* length), (program, shadertype, source, length))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glExtGetProgramBinarySourceQCOM, GLuint, program, GLenum, shadertype, char*, source, GLint*, length)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glExtGetProgramBinarySourceQCOM")
        _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -305,10 +296,10 @@ _EVASGL_EXT_BEGIN(EXT_multisampled_render_to_texture)
        _EVASGL_EXT_DRVNAME(GL_EXT_multisampled_render_to_texture)
 
         /* GLES 1.x extension */
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageMultisampleEXT, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height), (target, samples, internalformat, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageMultisampleEXT, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRenderbufferStorageMultisampleEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture2DMultisampleEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples), (target, attachment, textarget, texture, level, samples))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture2DMultisampleEXT, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLsizei, samples)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferTexture2DMultisampleEXT")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -317,11 +308,11 @@ _EVASGL_EXT_BEGIN(multisampled_render_to_texture)
        _EVASGL_EXT_DRVNAME_PRIVATE(GL_IMG_multisampled_render_to_texture)
        _EVASGL_EXT_DRVNAME_PRIVATE(GL_EXT_multisampled_render_to_texture)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glRenderbufferStorageMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height), (target, samples, internalformat, width, height))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glRenderbufferStorageMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRenderbufferStorageMultisampleIMG")
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRenderbufferStorageMultisampleEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glFramebufferTexture2DMultisample, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples), (target, attachment, textarget, texture, level, samples))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glFramebufferTexture2DMultisample, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLsizei, samples)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferTexture2DMultisampleIMG")
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferTexture2DMultisampleEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
@@ -490,7 +481,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(blend_equation_separate)
         _EVASGL_EXT_DRVNAME(GL_OES_blend_equation_separate)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendEquationSeparateOES, (GLenum modeRGB, GLenum modeAlpha), (modeRGB, modeAlpha))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendEquationSeparateOES, GLenum, modeRGB, GLenum, modeAlpha)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBlendEquationSeparateOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -499,7 +490,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(blend_func_separate)
         _EVASGL_EXT_DRVNAME(GL_OES_blend_func_separate)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendFuncSeparateOES, (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha), (srcRGB, dstRGB, srcAlpha, dstAlpha))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendFuncSeparateOES, GLenum, srcRGB, GLenum, dstRGB, GLenum, srcAlpha, GLenum, dstAlpha)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBlendFuncSeparateOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -508,7 +499,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(blend_subtract)
         _EVASGL_EXT_DRVNAME(GL_OES_blend_subtract)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendEquationOES, (GLenum mode), (mode))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBlendEquationOES, GLenum,  mode)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBlendEquationOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -522,28 +513,28 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(draw_texture)
         _EVASGL_EXT_DRVNAME(GL_OES_draw_texture)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexsOES, (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height), (x, y, z, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexsOES, GLshort, x, GLshort, y, GLshort, z, GLshort, width, GLshort, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexsOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexiOES, (GLint x, GLint y, GLint z, GLint width, GLint height), (x, y, z, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexiOES, GLint, x, GLint, y, GLint, z, GLint, width, GLint, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexiOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexxOES, (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height), (x, y, z, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexxOES, GLfixed, x, GLfixed, y, GLfixed, z, GLfixed, width, GLfixed, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexsvOES, (const GLshort *coords), (coords))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexsvOES, const GLshort *, coords)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexsvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexivOES, (const GLint *coords), (coords))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexivOES, const GLint *, coords)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexivOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexxvOES, (const GLfixed *coords), (coords))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexxvOES, const GLfixed *, coords)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexfOES, (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height), (x, y, z, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexfOES, GLfloat, x, GLfloat, y, GLfloat, z, GLfloat, width, GLfloat, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexfOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexfvOES, (const GLfloat *coords), (coords))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDrawTexfvOES, const GLfloat *, coords)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDrawTexfvOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -557,121 +548,121 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(fixed_point)
         _EVASGL_EXT_DRVNAME(GL_OES_fixed_point)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glAlphaFuncxOES, (GLenum func, GLclampx ref), (func, ref))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glAlphaFuncxOES, GLenum, func, GLclampx, ref)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glAlphaFuncxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearColorxOES, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha), (red, green, blue, alpha))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearColorxOES, GLclampx, red, GLclampx, green, GLclampx, blue, GLclampx, alpha)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClearColorxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearDepthxOES, (GLclampx depth), (depth))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearDepthxOES, GLclampx, depth)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClearDepthxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanexOES, (GLenum plane, const GLfixed *equation), (plane, equation))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanexOES, GLenum, plane, const GLfixed *, equation)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClipPlanexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glColor4xOES, (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha), (red, green, blue, alpha))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glColor4xOES, GLfixed, red, GLfixed, green, GLfixed, blue, GLfixed, alpha)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glColor4xOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDepthRangexOES, (GLclampx zNear, GLclampx zFar), (zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDepthRangexOES, GLclampx, zNear, GLclampx, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDepthRangexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFogxOES, (GLenum pname, GLfixed param), (pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFogxOES, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFogxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFogxvOES, (GLenum pname, const GLfixed *params), (pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFogxvOES, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFogxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFrustumxOES, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFrustumxOES, GLfixed, left, GLfixed, right, GLfixed, bottom, GLfixed, top, GLfixed, zNear, GLfixed, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFrustumxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetClipPlanexOES, (GLenum pname, GLfixed eqn[4]), (pname, eqn))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetClipPlanexOES, GLenum, pname, GLfixed *, eqn)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetClipPlanexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFixedvOES, (GLenum pname, GLfixed *params), (pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFixedvOES, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetFixedvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetLightxvOES, (GLenum light, GLenum pname, GLfixed *params), (light, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetLightxvOES, GLenum, light, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetLightxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetMaterialxvOES, (GLenum face, GLenum pname, GLfixed *params), (face, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetMaterialxvOES, GLenum, face, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetMaterialxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexEnvxvOES, (GLenum env, GLenum pname, GLfixed *params), (env, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexEnvxvOES, GLenum, env, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetTexEnvxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexParameterxvOES, (GLenum target, GLenum pname, GLfixed *params), (target, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexParameterxvOES, GLenum, target, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetTexParameterxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightModelxOES, (GLenum pname, GLfixed param), (pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightModelxOES, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLightModelxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightModelxvOES, (GLenum pname, const GLfixed *params), (pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightModelxvOES, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLightModelxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightxOES, (GLenum light, GLenum pname, GLfixed param), (light, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightxOES, GLenum, light, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLightxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightxvOES, (GLenum light, GLenum pname, const GLfixed *params), (light, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLightxvOES, GLenum, light, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLightxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLineWidthxOES, (GLfixed width), (width))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLineWidthxOES, GLfixed, width)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLineWidthxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLoadMatrixxOES, (const GLfixed *m), (m))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLoadMatrixxOES, const GLfixed *, m)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLoadMatrixxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glMaterialxOES, (GLenum face, GLenum pname, GLfixed param), (face, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glMaterialxOES, GLenum, face, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMaterialxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glMaterialxvOES, (GLenum face, GLenum pname, const GLfixed *params), (face, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glMaterialxvOES, GLenum, face, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMaterialxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glMultMatrixxOES, (const GLfixed *m), (m))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glMultMatrixxOES, const GLfixed *, m)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMultMatrixxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiTexCoord4xOES, (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q), (target, s, t, r, q))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glMultiTexCoord4xOES, GLenum, target, GLfixed, s, GLfixed, t, GLfixed, r, GLfixed, q)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMultiTexCoord4xOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glNormal3xOES, (GLfixed nx, GLfixed ny, GLfixed nz), (nx, ny, nz))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glNormal3xOES, GLfixed, nx, GLfixed, ny, GLfixed, nz)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glNormal3xOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glOrthoxOES, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar), (left, right, bottom, top, zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glOrthoxOES, GLfixed, left, GLfixed, right, GLfixed, bottom, GLfixed, top, GLfixed, zNear, GLfixed, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glOrthoxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointParameterxOES, (GLenum pname, GLfixed param), (pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointParameterxOES, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glPointParameterxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointParameterxvOES, (GLenum pname, const GLfixed *params), (pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointParameterxvOES, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glPointParameterxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointSizexOES, (GLfixed size), (size))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glPointSizexOES, GLfixed, size)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glPointSizexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glPolygonOffsetxOES, (GLfixed factor, GLfixed units), (factor, units))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glPolygonOffsetxOES, GLfixed, factor, GLfixed, units)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glPolygonOffsetxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glRotatexOES, (GLfixed angle, GLfixed x, GLfixed y, GLfixed z), (angle, x, y, z))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glRotatexOES, GLfixed, angle, GLfixed, x, GLfixed, y, GLfixed, z)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRotatexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glSampleCoveragexOES, (GLclampx value, GLboolean invert), (value, invert))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glSampleCoveragexOES, GLclampx, value, GLboolean, invert)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glSampleCoveragexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glScalexOES, (GLfixed x, GLfixed y, GLfixed z), (x, y, z))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glScalexOES, GLfixed, x, GLfixed, y, GLfixed, z)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glScalexOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexEnvxOES, (GLenum target, GLenum pname, GLfixed param), (target, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexEnvxOES, GLenum, target, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexEnvxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexEnvxvOES, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexEnvxvOES, GLenum, target, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexEnvxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexParameterxOES, (GLenum target, GLenum pname, GLfixed param), (target, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexParameterxOES, GLenum, target, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexParameterxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexParameterxvOES, (GLenum target, GLenum pname, const GLfixed *params), (target, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexParameterxvOES, GLenum, target, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexParameterxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTranslatexOES, (GLfixed x, GLfixed y, GLfixed z), (x, y, z))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTranslatexOES, GLfixed, x, GLfixed, y, GLfixed, z)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTranslatexOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -681,49 +672,49 @@ _EVASGL_EXT_BEGIN(framebuffer_object)
         _EVASGL_EXT_DRVNAME(GL_OES_framebuffer_object)
         _EVASGL_EXT_DRVNAME(GL_ARB_framebuffer_object)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsRenderbufferOES, (GLuint renderbuffer), (renderbuffer))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsRenderbufferOES, GLuint, renderbuffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glIsRenderbufferOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindRenderbufferOES, (GLenum target, GLuint renderbuffer), (target, renderbuffer))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindRenderbufferOES, GLenum, target, GLuint, renderbuffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBindRenderbufferOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteRenderbuffersOES, (GLsizei n, const GLuint* renderbuffers), (n, renderbuffers))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteRenderbuffersOES, GLsizei, n, const GLuint*, renderbuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeleteRenderbuffersOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenRenderbuffersOES, (GLsizei n, GLuint* renderbuffers), (n, renderbuffers))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenRenderbuffersOES, GLsizei, n, GLuint*, renderbuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenRenderbuffersOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageOES, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height), (target, internalformat, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageOES, GLenum, target, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRenderbufferStorageOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetRenderbufferParameterivOES, (GLenum target, GLenum pname, GLint* params), (target, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetRenderbufferParameterivOES, GLenum, target, GLenum, pname, GLint*, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetRenderbufferParameterivOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsFramebufferOES, (GLuint framebuffer), (framebuffer))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsFramebufferOES, GLuint, framebuffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glIsFramebufferOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindFramebufferOES, (GLenum target, GLuint framebuffer), (target, framebuffer))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindFramebufferOES, GLenum, target, GLuint, framebuffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBindFramebufferOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteFramebuffersOES, (GLsizei n, const GLuint* framebuffers), (n, framebuffers))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteFramebuffersOES, GLsizei, n, const GLuint*, framebuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeleteFramebuffersOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenFramebuffersOES, (GLsizei n, GLuint* framebuffers), (n, framebuffers))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenFramebuffersOES, GLsizei, n, GLuint*, framebuffers)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenFramebuffersOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glCheckFramebufferStatusOES, (GLenum target), (target))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glCheckFramebufferStatusOES, GLenum, target)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCheckFramebufferStatusOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferRenderbufferOES, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer), (target, attachment, renderbuffertarget, renderbuffer))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferRenderbufferOES, GLenum, target, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferRenderbufferOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture2DOES, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level), (target, attachment, textarget, texture, level))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFramebufferTexture2DOES, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFramebufferTexture2DOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFramebufferAttachmentParameterivOES, (GLenum target, GLenum attachment, GLenum pname, GLint* params), (target, attachment, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetFramebufferAttachmentParameterivOES, GLenum, target, GLenum, attachment, GLenum, pname, GLint*, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetFramebufferAttachmentParameterivOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenerateMipmapOES, (GLenum target), (target))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenerateMipmapOES, GLenum, target)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenerateMipmapOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -736,16 +727,16 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(matrix_palette)
         _EVASGL_EXT_DRVNAME(GL_OES_matrix_palette)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glCurrentPaletteMatrixOES, (GLuint matrixpaletteindex), (matrixpaletteindex))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glCurrentPaletteMatrixOES, GLuint, matrixpaletteindex)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCurrentPaletteMatrixOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glLoadPaletteFromModelViewMatrixOES, (void), ())
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glLoadPaletteFromModelViewMatrixOES)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glLoadPaletteFromModelViewMatrixOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glMatrixIndexPointerOES, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glMatrixIndexPointerOES, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMatrixIndexPointerOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glWeightPointerOES, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (size, type, stride, pointer))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glWeightPointerOES, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glWeightPointerOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -758,7 +749,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(query_matrix)
         _EVASGL_EXT_DRVNAME(GL_OES_query_matrix)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(GLbitfield, glQueryMatrixxOES, (GLfixed mantissa[16], GLint exponent[16]), (mantissa, exponent))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLbitfield, glQueryMatrixxOES, GLfixed *, mantissa, GLint *, exponent)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glQueryMatrixxOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -767,22 +758,22 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(single_precision)
         _EVASGL_EXT_DRVNAME(GL_OES_single_precision)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDepthRangefOES, (GLclampf zNear, GLclampf zFar), (zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDepthRangefOES, GLclampf, zNear, GLclampf, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDepthRangefOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFrustumfOES, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFrustumfOES, GLfloat, left, GLfloat, right, GLfloat, bottom, GLfloat, top, GLfloat, zNear, GLfloat, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFrustumfOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glOrthofOES, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar), (left, right, bottom, top, zNear, zFar))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glOrthofOES, GLfloat, left, GLfloat, right, GLfloat, bottom, GLfloat, top, GLfloat, zNear, GLfloat, zFar)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glOrthofOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanefOES, (GLenum plane, const GLfloat *equation), (plane, equation))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanefOES, GLenum, plane, const GLfloat *, equation)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClipPlanefOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetClipPlanefOES, (GLenum pname, GLfloat eqn[4]), (pname, eqn))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetClipPlanefOES, GLenum, pname, GLfloat *, eqn)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetClipPlanefOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearDepthfOES, (GLclampf depth), (depth))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClearDepthfOES, GLclampf, depth)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClearDepthfOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -801,31 +792,31 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(texture_cube_map)
         _EVASGL_EXT_DRVNAME(GL_OES_texture_cube_map)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenfOES, (GLenum coord, GLenum pname, GLfloat param), (coord, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenfOES, GLenum, coord, GLenum, pname, GLfloat, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGenfOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenfvOES, (GLenum coord, GLenum pname, const GLfloat *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenfvOES, GLenum, coord, GLenum, pname, const GLfloat *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGenfvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGeniOES, (GLenum coord, GLenum pname, GLint param), (coord, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGeniOES, GLenum, coord, GLenum, pname, GLint, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGeniOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenivOES, (GLenum coord, GLenum pname, const GLint *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenivOES, GLenum, coord, GLenum, pname, const GLint *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGenivOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenxOES, (GLenum coord, GLenum pname, GLfixed param), (coord, pname, param))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenxOES, GLenum, coord, GLenum, pname, GLfixed, param)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGenxOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenxvOES, (GLenum coord, GLenum pname, const GLfixed *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexGenxvOES, GLenum, coord, GLenum, pname, const GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexGenxvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenfvOES, (GLenum coord, GLenum pname, GLfloat *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenfvOES, GLenum, coord, GLenum, pname, GLfloat *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetTexGenfvOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenivOES, (GLenum coord, GLenum pname, GLint *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenivOES, GLenum, coord, GLenum, pname, GLint *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetTexGenivOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenxvOES, (GLenum coord, GLenum pname, GLfixed *params), (coord, pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetTexGenxvOES, GLenum, coord, GLenum, pname, GLfixed *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetTexGenxvOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -843,16 +834,16 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(vertex_array_object)
         _EVASGL_EXT_DRVNAME(GL_OES_vertex_array_object)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindVertexArrayOES, (GLuint array), (array))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glBindVertexArrayOES, GLuint, array)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glBindVertexArrayOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteVertexArraysOES, (GLsizei n, const GLuint *arrays), (n, arrays))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteVertexArraysOES, GLsizei, n, const GLuint *, arrays)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeleteVertexArraysOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenVertexArraysOES, (GLsizei n, GLuint *arrays), (n, arrays))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGenVertexArraysOES, GLsizei, n, GLuint *, arrays)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGenVertexArraysOES")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsVertexArrayOES, (GLuint array), (array))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsVertexArrayOES, GLuint, array)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glIsVertexArrayOES")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -861,7 +852,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(APPLE_copy_texture_levels)
         _EVASGL_EXT_DRVNAME(GL_APPLE_copy_texture_levels)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glCopyTextureLevelsAPPLE, (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount), (destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glCopyTextureLevelsAPPLE, GLuint, destinationTexture, GLuint, sourceTexture, GLint, sourceBaseLevel, GLsizei, sourceLevelCount)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glCopyTextureLevelsAPPLE")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -869,10 +860,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(APPLE_framebuffer_multisample)
         _EVASGL_EXT_DRVNAME(GL_APPLE_framebuffer_multisample)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageMultisampleAPPLE, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height), (target, samples, internalformat, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glRenderbufferStorageMultisampleAPPLE, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glRenderbufferStorageMultisampleAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glResolveMultisampleFramebufferAPPLE, (void), ())
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glResolveMultisampleFramebufferAPPLE)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glResolveMultisampleFramebufferAPPLE")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -880,25 +871,25 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(APPLE_sync)
         _EVASGL_EXT_DRVNAME(GL_APPLE_sync)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(GLsync, glFenceSyncAPPLE, (GLenum condition, GLbitfield flags), (condition, flags))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLsync, glFenceSyncAPPLE, GLenum, condition, GLbitfield, flags)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFenceSyncAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsSyncAPPLE, (GLsync sync), (sync))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLboolean, glIsSyncAPPLE, GLsync, sync)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glIsSyncAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteSyncAPPLE, (GLsync sync), (sync))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glDeleteSyncAPPLE, GLsync, sync)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glDeleteSyncAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glClientWaitSyncAPPLE, (GLsync sync, GLbitfield flags, GLuint64 timeout), (sync, flags, timeout))
+        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glClientWaitSyncAPPLE, GLsync, sync, GLbitfield, flags, uint64_t, timeout)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClientWaitSyncAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glWaitSyncAPPLE, (GLsync sync, GLbitfield flags, GLuint64 timeout), (sync, flags, timeout))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glWaitSyncAPPLE, GLsync, sync, GLbitfield, flags, uint64_t, timeout)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glWaitSyncAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetInteger64vAPPLE, (GLenum pname, GLint64 *params), (pname, params))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetInteger64vAPPLE, GLenum, pname, int64_t *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetInteger64vAPPLE")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetSyncivAPPLE, (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values), (sync, pname, bufSize, length, values))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glGetSyncivAPPLE, GLsync, sync, GLenum, pname, GLsizei, bufSize, GLsizei *, length, GLint *, values)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetSyncivAPPLE")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -925,10 +916,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(map_buffer_range)
         _EVASGL_EXT_DRVNAME(GL_EXT_map_buffer_range)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void *, glMapBufferRangeEXT, (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access), (target, offset, length, access))
+        _EVASGL_EXT_FUNCTION_BEGIN(void *, glMapBufferRangeEXT, GLenum, target, GLintptr, offset, GLsizeiptr, length, GLbitfield, access)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glMapBufferRangeEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glFlushMappedBufferRangeEXT, (GLenum target, GLintptr offset, GLsizeiptr length), (target, offset, length))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glFlushMappedBufferRangeEXT, GLenum, target, GLintptr, offset, GLsizeiptr, length)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glFlushMappedBufferRangeEXT")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -936,17 +927,17 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(robustness)
         _EVASGL_EXT_DRVNAME(GL_EXT_robustness)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glGetGraphicsResetStatusEXT, (void), ())
+        _EVASGL_EXT_FUNCTION_BEGIN(GLenum, glGetGraphicsResetStatusEXT)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetGraphicsResetStatusEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glReadnPixelsEXT, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data), (x, y, width, height, format, type, bufSize, data))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glReadnPixelsEXT, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, GLsizei, bufSize, void *, data)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glReadnPixelsEXT")
         _EVASGL_EXT_FUNCTION_END()
         _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
-           _EVASGL_EXT_FUNCTION_BEGIN(void, glGetnUniformfvEXT, (GLuint program, GLint location, GLsizei bufSize, float *params), (program, location, bufSize, params))
+           _EVASGL_EXT_FUNCTION_BEGIN(void, glGetnUniformfvEXT, GLuint, program, GLint, location, GLsizei, bufSize, float *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetnUniformfvEXT")
            _EVASGL_EXT_FUNCTION_END()
-           _EVASGL_EXT_FUNCTION_BEGIN(void, glGetnUniformivEXT, (GLuint program, GLint location, GLsizei bufSize, GLint *params), (program, location, bufSize, params))
+           _EVASGL_EXT_FUNCTION_BEGIN(void, glGetnUniformivEXT, GLuint, program, GLint, location, GLsizei, bufSize, GLint *, params)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glGetnUniformivEXT")
            _EVASGL_EXT_FUNCTION_END()
         _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
@@ -967,22 +958,22 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(texture_storage)
         _EVASGL_EXT_DRVNAME(GL_EXT_texture_storage)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage1DEXT, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width), (target, levels, internalformat, width))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage1DEXT, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexStorage1DEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage2DEXT, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height), (target, levels, internalformat, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage2DEXT, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexStorage2DEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage3DEXT, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth), (target, levels, internalformat, width, height, depth))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTexStorage3DEXT, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTexStorage3DEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage1DEXT, (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width), (texture, target, levels, internalformat, width))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage1DEXT, GLuint, texture, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTextureStorage1DEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage2DEXT, (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height), (texture, target, levels, internalformat, width, height))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage2DEXT, GLuint, texture, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTextureStorage2DEXT")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage3DEXT, (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth), (texture, target, levels, internalformat, width, height, depth))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glTextureStorage3DEXT, GLuint, texture, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glTextureStorage3DEXT")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -995,10 +986,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(IMG_user_clip_plane)
         _EVASGL_EXT_DRVNAME(GL_IMG_user_clip_plane)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanefIMG, (GLenum p, const GLfloat *eqn), (p, eqn))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanefIMG, GLenum, p, const GLfloat *, eqn)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClipPlanefIMG")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanexIMG, (GLenum p, const GLfixed *eqn), (p, eqn))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glClipPlanexIMG, GLenum, p, const GLfixed *, eqn)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glClipPlanexIMG")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -1006,10 +997,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(QCOM_tiled_rendering)
         _EVASGL_EXT_DRVNAME(GL_QCOM_tiled_rendering)
 
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glStartTilingQCOM, (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask), (x, y, width, height, preserveMask))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glStartTilingQCOM, GLuint, x, GLuint, y, GLuint, width, GLuint, height, GLbitfield, preserveMask)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glStartTilingQCOM")
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN(void, glEndTilingQCOM, (GLbitfield preserveMask), (preserveMask))
+        _EVASGL_EXT_FUNCTION_BEGIN(void, glEndTilingQCOM, GLbitfield, preserveMask)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glEndTilingQCOM")
         _EVASGL_EXT_FUNCTION_END()
 _EVASGL_EXT_END()
@@ -1047,17 +1038,17 @@ _EVASGL_EXT_BEGIN(GL_OES_EGL_image)
 
        _EVASGL_EXT_DRVNAME(GL_OES_EGL_image)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glEGLImageTargetTexture2DOES, (GLenum target, GLeglImageOES image), (target, image))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glEGLImageTargetTexture2DOES, GLenum, target, GLeglImageOES, image)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glEGLImageTargetTexture2DOES")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glEGLImageTargetRenderbufferStorageOES, (GLenum target, GLeglImageOES image), (target, image))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glEGLImageTargetRenderbufferStorageOES, GLenum, target, GLeglImageOES, image)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glEGLImageTargetRenderbufferStorageOES")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glEvasGLImageTargetTexture2DOES, (GLenum target, EvasGLImage image), (target, image))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glEvasGLImageTargetTexture2DOES, GLenum, target, EvasGLImage, image)
                _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_glEvasGLImageTargetTexture2D)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN(void, glEvasGLImageTargetRenderbufferStorageOES, (GLenum target, EvasGLImage image), (target, image))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, glEvasGLImageTargetRenderbufferStorageOES, GLenum, target, EvasGLImage, image)
                _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_glEvasGLImageTargetRenderbufferStorage)
        _EVASGL_EXT_FUNCTION_END()
 
@@ -1394,20 +1385,20 @@ _EVASGL_EXT_BEGIN(EGL_KHR_image_base)
 
        _EVASGL_EXT_DRVNAME(EGL_KHR_image_base)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(void *, eglCreateImage, (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e), (a, b, c, d, e))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglCreateImageKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void *, eglCreateImage, EGLDisplay, a, EGLContext, b, EGLenum, c, EGLClientBuffer, d, const int *, e)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglCreateImageKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(void, eglDestroyImage, (EGLDisplay a, void *b), (a, b))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglDestroyImageKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, eglDestroyImage, EGLDisplay, a, void *, b)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglDestroyImageKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-    _EVASGL_EXT_FUNCTION_BEGIN_NOTH(EvasGLImage, evasglCreateImage, (int target, void* buffer, const int *attrib_list), (target, buffer, attrib_list))
+    _EVASGL_EXT_FUNCTION_BEGIN(EvasGLImage, evasglCreateImage, int, target, void *, buffer, const int *, attrib_list)
         _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglCreateImage)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(void, evasglDestroyImage, (EvasGLImage image), (image))
+       _EVASGL_EXT_FUNCTION_BEGIN(void, evasglDestroyImage, EvasGLImage, image)
         _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglDestroyImage)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(EvasGLImage, evasglCreateImageForContext, (Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list), (evas_gl, ctx, target, buffer, attrib_list))
+       _EVASGL_EXT_FUNCTION_BEGIN(EvasGLImage, evasglCreateImageForContext, Evas_GL *, evas_gl, Evas_GL_Context *, ctx, int, target, void *, buffer, const int *, attrib_list)
                _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglCreateImageForContext)
        _EVASGL_EXT_FUNCTION_END()
 
@@ -1505,29 +1496,29 @@ _EVASGL_EXT_BEGIN(EGL_KHR_fence_sync)
         _EVASGL_EXT_DRVNAME_PRIVATE(GL_OES_EGL_sync)
         _EVASGL_EXT_DRVNAME_PRIVATE(VG_KHR_EGL_sync)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(void *, eglCreateSyncKHR, (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list), (dpy, type, attrib_list))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglCreateSyncKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void *, eglCreateSyncKHR, EGLDisplay, dpy, EGLenum, type, const EGLint *, attrib_list)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglCreateSyncKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglDestroySyncKHR, (EGLDisplay dpy, EGLSyncKHR sync), (dpy, sync))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglDestroySyncKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglDestroySyncKHR, EGLDisplay, dpy, EGLSyncKHR, sync)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglDestroySyncKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLint, eglClientWaitSyncKHR, (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout), (dpy, sync, flags, timeout))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglClientWaitSyncKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLint, eglClientWaitSyncKHR, EGLDisplay, dpy, EGLSyncKHR, sync, EGLint, flags, EGLTimeKHR, timeout)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglClientWaitSyncKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglGetSyncAttribKHR, (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value), (dpy, sync, attribute, value))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglGetSyncAttribKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglGetSyncAttribKHR, EGLDisplay, dpy, EGLSyncKHR, sync, EGLint, attribute, EGLint *, value)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglGetSyncAttribKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(EvasGLSync, evasglCreateSync, (Evas_GL *evas_gl, unsigned int type, const int *attrib_list), (evas_gl, type, attrib_list))
+       _EVASGL_EXT_FUNCTION_BEGIN(EvasGLSync, evasglCreateSync, Evas_GL *, evas_gl, unsigned int, type, const int *, attrib_list)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglCreateSync)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglDestroySync, (Evas_GL *evas_gl, EvasGLSync sync), (evas_gl, sync))
+       _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglDestroySync, Evas_GL *, evas_gl, EvasGLSync, sync)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglDestroySync)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(int, evasglClientWaitSync, (Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout), (evas_gl, sync, flags, timeout))
+       _EVASGL_EXT_FUNCTION_BEGIN(int, evasglClientWaitSync, Evas_GL *, evas_gl, EvasGLSync, sync, int, flags, EvasGLTime, timeout)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglClientWaitSync)
        _EVASGL_EXT_FUNCTION_END()
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglGetSyncAttrib, (Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value), (evas_gl, sync, attribute, value))
+       _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglGetSyncAttrib, Evas_GL *, evas_gl, EvasGLSync, sync, int, attribute, int *, value)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglGetSyncAttrib)
        _EVASGL_EXT_FUNCTION_END()
 
@@ -1537,11 +1528,11 @@ _EVASGL_EXT_BEGIN(EGL_KHR_reusable_sync)
 
        _EVASGL_EXT_DRVNAME(EGL_KHR_reusable_sync)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglSignalSyncKHR, (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode), (dpy, sync, mode))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglSignalSyncKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglSignalSyncKHR, EGLDisplay, dpy, EGLSyncKHR, sync, EGLenum, mode)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglSignalSyncKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglSignalSync, (Evas_GL *evas_gl, EvasGLSync sync, unsigned mode), (evas_gl, sync, mode))
+       _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglSignalSync, Evas_GL *, evas_gl, EvasGLSync, sync, unsigned, mode)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglSignalSync)
        _EVASGL_EXT_FUNCTION_END()
 
@@ -1551,11 +1542,11 @@ _EVASGL_EXT_BEGIN(EGL_KHR_wait_sync)
 
        _EVASGL_EXT_DRVNAME(EGL_KHR_wait_sync)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLint, eglWaitSyncKHR, (EGLDisplay dpy, EGLSyncKHR sync, int flags), (dpy, sync, flags))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglWaitSyncKHR")
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLint, eglWaitSyncKHR, EGLDisplay, dpy, EGLSyncKHR, sync, int, flags)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglWaitSyncKHR")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-       _EVASGL_EXT_FUNCTION_BEGIN_NOTH(int, evasglWaitSync, (Evas_GL *evas_gl, EvasGLSync sync, int flags), (evas_gl, sync, flags))
+       _EVASGL_EXT_FUNCTION_BEGIN(int, evasglWaitSync, Evas_GL *, evas_gl, EvasGLSync, sync, int, flags)
             _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglWaitSync)
        _EVASGL_EXT_FUNCTION_END()
 
@@ -1565,23 +1556,23 @@ _EVASGL_EXT_BEGIN(EGL_WL_bind_wayland_display)
 
         _EVASGL_EXT_DRVNAME(EGL_WL_bind_wayland_display)
 
-        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglBindWaylandDisplayWL, (EGLDisplay dpy, void *display), (dpy, display))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglBindWaylandDisplayWL")
+        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglBindWaylandDisplayWL, EGLDisplay, dpy, void *, display)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglBindWaylandDisplayWL")
         _EVASGL_EXT_FUNCTION_PRIVATE_END()
-        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglUnbindWaylandDisplayWL, (EGLDisplay dpy, void *display), (dpy, display))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglUnbindWaylandDisplayWL")
+        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglUnbindWaylandDisplayWL, EGLDisplay, dpy, void *, display)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglUnbindWaylandDisplayWL")
         _EVASGL_EXT_FUNCTION_PRIVATE_END()
-        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH(EGLBoolean, eglQueryWaylandBufferWL, (EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value), (dpy, buffer, attribute, value))
-                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR_NOTH("eglQueryWaylandBufferWL")
+        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(EGLBoolean, eglQueryWaylandBufferWL, EGLDisplay, dpy, void *, buffer, EGLint, attribute, EGLint *, value)
+                _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("eglQueryWaylandBufferWL")
         _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
-        _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglBindWaylandDisplay, (Evas_GL *evas_gl, void *wl_display), (evas_gl, wl_display))
+        _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglBindWaylandDisplay, Evas_GL *, evas_gl, void *, wl_display)
                 _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglBindWaylandDisplay)
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglUnbindWaylandDisplay, (Evas_GL *evas_gl, void *wl_display), (evas_gl, wl_display))
+        _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglUnbindWaylandDisplay, Evas_GL *, evas_gl, void *, wl_display)
                 _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglUnbindWaylandDisplay)
         _EVASGL_EXT_FUNCTION_END()
-        _EVASGL_EXT_FUNCTION_BEGIN_NOTH(Eina_Bool, evasglQueryWaylandBuffer, (Evas_GL *evas_gl, void *buffer, int attribute, int *value), (evas_gl, buffer, attribute, value))
+        _EVASGL_EXT_FUNCTION_BEGIN(Eina_Bool, evasglQueryWaylandBuffer, Evas_GL *, evas_gl, void *, buffer, int, attribute, int *, value)
                 _EVASGL_EXT_FUNCTION_DRVFUNC(_evgl_evasglQueryWaylandBuffer)
         _EVASGL_EXT_FUNCTION_END()
 
@@ -1619,7 +1610,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(GLX_EXT_swap_control)
        _EVASGL_EXT_DRVNAME(GLX_EXT_swap_control)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXSwapIntervalEXT, (Display *dpy, GLXDrawable drawable, int interval))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXSwapIntervalEXT, Display *dpy, GLXDrawable, drawable, int, interval)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXSwapIntervalEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 _EVASGL_EXT_END()
@@ -1627,7 +1618,7 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(GLX_SGI_swap_control)
        _EVASGL_EXT_DRVNAME(GLX_SGI_swap_control)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXSwapIntervalSGI, (int interval))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXSwapIntervalSGI, int interval)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXSwapIntervalSGI")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 _EVASGL_EXT_END()
@@ -1635,10 +1626,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(GLX_SGI_video_sync)
        _EVASGL_EXT_DRVNAME(GLX_SGI_video_sync)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXGetVideoSyncSGI, (uint *count))
+        _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXGetVideoSyncSGI, uint32_t *count)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXGetVideoSyncSGI")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXWaitVideoSyncSGI, (int divisor, int remainder, unsigned int *count))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(int, glXWaitVideoSyncSGI, int, divisor, int, remainder, unsigned, int *, count)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXWaitVideoSyncSGI")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
@@ -1647,10 +1638,10 @@ _EVASGL_EXT_END()
 _EVASGL_EXT_BEGIN(GLX_EXT_texture_from_pixmap)
        _EVASGL_EXT_DRVNAME(GLX_EXT_texture_from_pixmap)
 
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXBindTexImageEXT, (Display *display, GLXDrawable drawable, int buffer, const int *attrib_list))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXBindTexImageEXT, Display *display, GLXDrawable, drawable, int, buffer, const int *attrib_list)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXBindTexImageEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
-       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXReleaseTexImageEXT, (Display *display, GLXDrawable drawable, int buffer))
+       _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(void, glXReleaseTexImageEXT, Display *display, GLXDrawable, drawable, int, buffer)
                 _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR("glXReleaseTexImageEXT")
        _EVASGL_EXT_FUNCTION_PRIVATE_END()
 
@@ -1686,11 +1677,6 @@ _EVASGL_EXT_END()
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END_DEFINED
 #endif
 
-#ifdef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH_DEFINED
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH_DEFINED
-#endif
-
 #ifdef _EVASGL_EXT_DRVNAME_PRIVATE_DEFINED
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_DRVNAME_PRIVATE_DEFINED
@@ -1704,10 +1690,8 @@ _EVASGL_EXT_END()
 #undef _EVASGL_EXT_DRVNAME
 #undef _EVASGL_EXT_DRVNAME_PRIVATE
 #undef _EVASGL_EXT_FUNCTION_BEGIN
-#undef _EVASGL_EXT_FUNCTION_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_END
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
-#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN_NOTH
 #undef _EVASGL_EXT_FUNCTION_PRIVATE_END
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #endif
index c40f5df..0629982 100644 (file)
@@ -1,5 +1,6 @@
 #define GL_ERRORS_NODEF 1
 #include "evas_gl_core_private.h"
+#include "evas_gl_api_ext.h"
 
 #ifndef _WIN32
 # include <dlfcn.h>
@@ -67,15 +68,6 @@ void _func_begin_debug(const char *api)
 
 
 static void
-_evgl_gles1_glAlphaFunc(GLenum func, GLclampf ref)
-{
-   if (!_gles1_api.glAlphaFunc)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glAlphaFunc(func, ref);
-}
-
-static void
 _evgl_gles1_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
    EVGL_Resource *rsc;
@@ -97,506 +89,110 @@ _evgl_gles1_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf a
         rsc->clear_color.b = blue;
      }
    EVGL_FUNC_BEGIN();
-   _gles1_api.glClearColor(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glClearDepthf(GLclampf depth)
-{
-   if (!_gles1_api.glClearDepthf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClearDepthf(depth);
-}
-
-static void
-_evgl_gles1_glClipPlanef(GLenum plane, const GLfloat *equation)
-{
-   if (!_gles1_api.glClipPlanef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClipPlanef(plane, equation);
-}
-
-static void
-_evgl_gles1_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-   if (!_gles1_api.glColor4f)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glColor4f(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glDepthRangef(GLclampf zNear, GLclampf zFar)
-{
-   if (!_gles1_api.glDepthRangef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDepthRangef(zNear, zFar);
-}
-
-static void
-_evgl_gles1_glFogf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glFogf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFogf(pname, param);
-}
-
-static void
-_evgl_gles1_glFogfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glFogfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFogfv(pname, params);
-}
-
-static void
-_evgl_gles1_glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!_gles1_api.glFrustumf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFrustumf(left, right, bottom, top, zNear, zFar);
-}
-
-static void
-_evgl_gles1_glGetClipPlanef(GLenum pname, GLfloat eqn[4])
-{
-   if (!_gles1_api.glGetClipPlanef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetClipPlanef(pname, eqn);
-}
-
-static void
-_evgl_gles1_glGetFloatv(GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetFloatv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetFloatv(pname, params);
-}
-
-static void
-_evgl_gles1_glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetLightfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetLightfv(light, pname, params);
-}
-
-static void
-_evgl_gles1_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetMaterialfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetMaterialfv(face, pname, params);
-}
-
-static void
-_evgl_gles1_glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetTexEnvfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexEnvfv(env, pname, params);
-}
-
-static void
-_evgl_gles1_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetTexParameterfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexParameterfv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glLightModelf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glLightModelf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightModelf(pname, param);
-}
-
-static void
-_evgl_gles1_glLightModelfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glLightModelfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightModelfv(pname, params);
+   EVGL_TH_CALL(glClearColor, _gles1_api.glClearColor, red, green, blue, alpha);
 }
 
 static void
-_evgl_gles1_glLightf(GLenum light, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glLightf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightf(light, pname, param);
-}
-
-static void
-_evgl_gles1_glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glLightfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightfv(light, pname, params);
-}
-
-static void
-_evgl_gles1_glLineWidth(GLfloat width)
-{
-   if (!_gles1_api.glLineWidth)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLineWidth(width);
-}
-
-static void
-_evgl_gles1_glLoadMatrixf(const GLfloat *m)
+_evgl_gles1_glClear(GLbitfield mask)
 {
-   if (!_gles1_api.glLoadMatrixf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLoadMatrixf(m);
-}
+   EVGL_Resource *rsc;
+   EVGL_Context *ctx;
+   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
+   int cc[4] = {0,0,0,0};
 
-static void
-_evgl_gles1_glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glMaterialf)
+   if (!_gles1_api.glClear)
      return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMaterialf(face, pname, param);
-}
 
-static void
-_evgl_gles1_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glMaterialfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMaterialfv(face, pname, params);
-}
+   if (!(rsc=_evgl_tls_resource_get()))
+     {
+        ERR("Unable to execute GL command. Error retrieving tls");
+        return;
+     }
 
-static void
-_evgl_gles1_glMultMatrixf(const GLfloat *m)
-{
-   if (!_gles1_api.glMultMatrixf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMultMatrixf(m);
-}
+   if (!rsc->current_eng)
+     {
+        ERR("Unable to retrive Current Engine");
+        return;
+     }
 
-static void
-_evgl_gles1_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-   if (!_gles1_api.glMultiTexCoord4f)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMultiTexCoord4f(target, s, t, r, q);
-}
+   ctx = rsc->current_ctx;
+   if (!ctx)
+     {
+        ERR("Unable to retrive Current Context");
+        return;
+     }
 
-static void
-_evgl_gles1_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
-   if (!_gles1_api.glNormal3f)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glNormal3f(nx, ny, nz);
-}
+   if (ctx->version != EVAS_GL_GLES_1_X)
+     {
+        ERR("Invalid context version %d", (int) ctx->version);
+        return;
+     }
 
-static void
-_evgl_gles1_glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!_gles1_api.glOrthof)
-     return;
    EVGL_FUNC_BEGIN();
-   _gles1_api.glOrthof(left, right, bottom, top, zNear, zFar);
-}
+   if (_evgl_direct_enabled())
+     {
+        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
+          {
+             /* Skip glClear() if clearing with transparent color
+              * Note: There will be side effects if the object itself is not
+              * marked as having an alpha channel!
+              */
+             if (ctx->current_sfc->alpha && (mask & GL_COLOR_BUFFER_BIT))
+               {
+                  if ((rsc->clear_color.a == 0) &&
+                      (rsc->clear_color.r == 0) &&
+                      (rsc->clear_color.g == 0) &&
+                      (rsc->clear_color.b == 0))
+                    {
+                       // Skip clear color as we don't want to write black
+                       mask &= ~GL_COLOR_BUFFER_BIT;
+                    }
+                  else if (rsc->clear_color.a != 1.0)
+                    {
+                       // TODO: Draw a rectangle? This will never be the perfect solution though.
+                       WRN("glClear() used with a semi-transparent color and direct rendering. "
+                           "This will erase the previous contents of the evas!");
+                    }
+                  if (!mask) return;
+               }
 
-static void
-_evgl_gles1_glPointParameterf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glPointParameterf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointParameterf(pname, param);
-}
+             if ((!ctx->direct_scissor))
+               {
+                  EVGL_TH_CALL(glEnable, _gles1_api.glEnable, GL_SCISSOR_TEST);
+                  ctx->direct_scissor = 1;
+               }
 
-static void
-_evgl_gles1_glPointParameterfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glPointParameterfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointParameterfv(pname, params);
-}
+             if ((ctx->scissor_updated) && (ctx->scissor_enabled))
+               {
+                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                         rsc->direct.rot, 1,
+                                         ctx->scissor_coord[0], ctx->scissor_coord[1],
+                                         ctx->scissor_coord[2], ctx->scissor_coord[3],
+                                         rsc->direct.img.x, rsc->direct.img.y,
+                                         rsc->direct.img.w, rsc->direct.img.h,
+                                         rsc->direct.clip.x, rsc->direct.clip.y,
+                                         rsc->direct.clip.w, rsc->direct.clip.h,
+                                         oc, nc, cc);
 
-static void
-_evgl_gles1_glPointSize(GLfloat size)
-{
-   if (!_gles1_api.glPointSize)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointSize(size);
-}
+                  RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
+                  EVGL_TH_CALL(glScissor, _gles1_api.glScissor, nc[0], nc[1], nc[2], nc[3]);
+                  ctx->direct_scissor = 0;
+               }
+             else
+               {
+                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                         rsc->direct.rot, 0,
+                                         0, 0, 0, 0,
+                                         rsc->direct.img.x, rsc->direct.img.y,
+                                         rsc->direct.img.w, rsc->direct.img.h,
+                                         rsc->direct.clip.x, rsc->direct.clip.y,
+                                         rsc->direct.clip.w, rsc->direct.clip.h,
+                                         oc, nc, cc);
 
-static void
-_evgl_gles1_glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glPointSizePointerOES)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointSizePointerOES(type, stride, pointer);
-}
+                  EVGL_TH_CALL(glScissor, _gles1_api.glScissor, cc[0], cc[1], cc[2], cc[3]);
+               }
 
-static void
-_evgl_gles1_glPolygonOffset(GLfloat factor, GLfloat units)
-{
-   if (!_gles1_api.glPolygonOffset)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPolygonOffset(factor, units);
-}
-
-static void
-_evgl_gles1_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glRotatef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glRotatef(angle, x, y, z);
-}
-
-static void
-_evgl_gles1_glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glScalef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glScalef(x, y, z);
-}
-
-static void
-_evgl_gles1_glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glTexEnvf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnvf(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glTexEnvfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnvfv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glTexParameterf)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameterf(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glTexParameterfv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameterfv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glTranslatef)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTranslatef(x, y, z);
-}
-
-static void
-_evgl_gles1_glActiveTexture(GLenum texture)
-{
-   if (!_gles1_api.glActiveTexture)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glActiveTexture(texture);
-}
-
-static void
-_evgl_gles1_glAlphaFuncx(GLenum func, GLclampx ref)
-{
-   if (!_gles1_api.glAlphaFuncx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glAlphaFuncx(func, ref);
-}
-
-static void
-_evgl_gles1_glBindBuffer(GLenum target, GLuint buffer)
-{
-   if (!_gles1_api.glBindBuffer)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glBindBuffer(target, buffer);
-}
-
-static void
-_evgl_gles1_glBindTexture(GLenum target, GLuint texture)
-{
-   if (!_gles1_api.glBindTexture)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glBindTexture(target, texture);
-}
-
-static void
-_evgl_gles1_glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
-   if (!_gles1_api.glBlendFunc)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glBlendFunc(sfactor, dfactor);
-}
-
-static void
-_evgl_gles1_glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
-   if (!_gles1_api.glBufferData)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glBufferData(target, size, data, usage);
-}
-
-static void
-_evgl_gles1_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
-   if (!_gles1_api.glBufferSubData)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glBufferSubData(target, offset, size, data);
-}
-
-static void
-_evgl_gles1_glClear(GLbitfield mask)
-{
-   EVGL_Resource *rsc;
-   EVGL_Context *ctx;
-   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
-   int cc[4] = {0,0,0,0};
-
-   if (!_gles1_api.glClear)
-     return;
-
-   if (!(rsc=_evgl_tls_resource_get()))
-     {
-        ERR("Unable to execute GL command. Error retrieving tls");
-        return;
-     }
-
-   if (!rsc->current_eng)
-     {
-        ERR("Unable to retrive Current Engine");
-        return;
-     }
-
-   ctx = rsc->current_ctx;
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   EVGL_FUNC_BEGIN();
-   if (_evgl_direct_enabled())
-     {
-        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
-          {
-             /* Skip glClear() if clearing with transparent color
-              * Note: There will be side effects if the object itself is not
-              * marked as having an alpha channel!
-              */
-             if (ctx->current_sfc->alpha && (mask & GL_COLOR_BUFFER_BIT))
-               {
-                  if ((rsc->clear_color.a == 0) &&
-                      (rsc->clear_color.r == 0) &&
-                      (rsc->clear_color.g == 0) &&
-                      (rsc->clear_color.b == 0))
-                    {
-                       // Skip clear color as we don't want to write black
-                       mask &= ~GL_COLOR_BUFFER_BIT;
-                    }
-                  else if (rsc->clear_color.a != 1.0)
-                    {
-                       // TODO: Draw a rectangle? This will never be the perfect solution though.
-                       WRN("glClear() used with a semi-transparent color and direct rendering. "
-                           "This will erase the previous contents of the evas!");
-                    }
-                  if (!mask) return;
-               }
-
-             if ((!ctx->direct_scissor))
-               {
-                  _gles1_api.glEnable(GL_SCISSOR_TEST);
-                  ctx->direct_scissor = 1;
-               }
-
-             if ((ctx->scissor_updated) && (ctx->scissor_enabled))
-               {
-                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                         rsc->direct.rot, 1,
-                                         ctx->scissor_coord[0], ctx->scissor_coord[1],
-                                         ctx->scissor_coord[2], ctx->scissor_coord[3],
-                                         rsc->direct.img.x, rsc->direct.img.y,
-                                         rsc->direct.img.w, rsc->direct.img.h,
-                                         rsc->direct.clip.x, rsc->direct.clip.y,
-                                         rsc->direct.clip.w, rsc->direct.clip.h,
-                                         oc, nc, cc);
-
-                  RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-                  _gles1_api.glScissor(nc[0], nc[1], nc[2], nc[3]);
-                  ctx->direct_scissor = 0;
-               }
-             else
-               {
-                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                         rsc->direct.rot, 0,
-                                         0, 0, 0, 0,
-                                         rsc->direct.img.x, rsc->direct.img.y,
-                                         rsc->direct.img.w, rsc->direct.img.h,
-                                         rsc->direct.clip.x, rsc->direct.clip.y,
-                                         rsc->direct.clip.w, rsc->direct.clip.h,
-                                         oc, nc, cc);
-
-                  _gles1_api.glScissor(cc[0], cc[1], cc[2], cc[3]);
-               }
-
-             _gles1_api.glClear(mask);
+             EVGL_TH_CALL(glClear, _gles1_api.glClear, mask);
 
              // TODO/FIXME: Restore previous client-side scissors.
           }
@@ -604,3220 +200,586 @@ _evgl_gles1_glClear(GLbitfield mask)
           {
              if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
                {
-                  _gles1_api.glDisable(GL_SCISSOR_TEST);
-                  ctx->direct_scissor = 0;
-               }
-
-             _gles1_api.glClear(mask);
-          }
-     }
-   else
-     {
-        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-          {
-             _gles1_api.glDisable(GL_SCISSOR_TEST);
-             ctx->direct_scissor = 0;
-          }
-
-        _gles1_api.glClear(mask);
-     }
-}
-
-static void
-_evgl_gles1_glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
-{
-   if (!_gles1_api.glClearColorx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClearColorx(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glClearDepthx(GLclampx depth)
-{
-   if (!_gles1_api.glClearDepthx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClearDepthx(depth);
-}
-
-static void
-_evgl_gles1_glClearStencil(GLint s)
-{
-   if (!_gles1_api.glClearStencil)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClearStencil(s);
-}
-
-static void
-_evgl_gles1_glClientActiveTexture(GLenum texture)
-{
-   if (!_gles1_api.glClientActiveTexture)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClientActiveTexture(texture);
-}
-
-static void
-_evgl_gles1_glClipPlanex(GLenum plane, const GLfixed *equation)
-{
-   if (!_gles1_api.glClipPlanex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glClipPlanex(plane, equation);
-}
-
-static void
-_evgl_gles1_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
-   if (!_gles1_api.glColor4ub)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glColor4ub(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
-{
-   if (!_gles1_api.glColor4x)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glColor4x(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
-   if (!_gles1_api.glColorMask)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glColorMask(red, green, blue, alpha);
-}
-
-static void
-_evgl_gles1_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glColorPointer)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glColorPointer(size, type, stride, pointer);
-}
-
-static void
-_evgl_gles1_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
-   if (!_gles1_api.glCompressedTexImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-}
-
-static void
-_evgl_gles1_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
-   if (!_gles1_api.glCompressedTexSubImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-}
-
-static void
-_evgl_gles1_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
-   if (!_gles1_api.glCopyTexImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-}
-
-static void
-_evgl_gles1_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!_gles1_api.glCopyTexSubImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-}
-
-static void
-_evgl_gles1_glCullFace(GLenum mode)
-{
-   if (!_gles1_api.glCullFace)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glCullFace(mode);
-}
-
-static void
-_evgl_gles1_glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
-   if (!_gles1_api.glDeleteBuffers)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDeleteBuffers(n, buffers);
-}
-
-static void
-_evgl_gles1_glDeleteTextures(GLsizei n, const GLuint *textures)
-{
-   if (!_gles1_api.glDeleteTextures)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDeleteTextures(n, textures);
-}
-
-static void
-_evgl_gles1_glDepthFunc(GLenum func)
-{
-   if (!_gles1_api.glDepthFunc)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDepthFunc(func);
-}
-
-static void
-_evgl_gles1_glDepthMask(GLboolean flag)
-{
-   if (!_gles1_api.glDepthMask)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDepthMask(flag);
-}
-
-static void
-_evgl_gles1_glDepthRangex(GLclampx zNear, GLclampx zFar)
-{
-   if (!_gles1_api.glDepthRangex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDepthRangex(zNear, zFar);
-}
-
-static void
-_evgl_gles1_glDisable(GLenum cap)
-{
-   EVGL_Context *ctx;
-
-   if (!_gles1_api.glDisable)
-     return;
-
-   ctx = evas_gl_common_current_context_get();
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   if (cap == GL_SCISSOR_TEST)
-      ctx->scissor_enabled = 0;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDisable(cap);
-}
-
-static void
-_evgl_gles1_glDisableClientState(GLenum array)
-{
-   if (!_gles1_api.glDisableClientState)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDisableClientState(array);
-}
-
-static void
-_evgl_gles1_glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
-   if (!_gles1_api.glDrawArrays)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDrawArrays(mode, first, count);
-}
-
-static void
-_evgl_gles1_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
-   if (!_gles1_api.glDrawElements)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glDrawElements(mode, count, type, indices);
-}
-
-static void
-_evgl_gles1_glEnable(GLenum cap)
-{
-   EVGL_Context *ctx;
-
-   if (!_gles1_api.glEnable)
-     return;
-
-   ctx = evas_gl_common_current_context_get();
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   if (cap == GL_SCISSOR_TEST)
-      ctx->scissor_enabled = 1;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glEnable(cap);
-}
-
-static void
-_evgl_gles1_glEnableClientState(GLenum array)
-{
-   if (!_gles1_api.glEnableClientState)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glEnableClientState(array);
-}
-
-static void
-_evgl_gles1_glFinish(void)
-{
-   if (!_gles1_api.glFinish)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFinish();
-}
-
-static void
-_evgl_gles1_glFlush(void)
-{
-   if (!_gles1_api.glFlush)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFlush();
-}
-
-static void
-_evgl_gles1_glFogx(GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glFogx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFogx(pname, param);
-}
-
-static void
-_evgl_gles1_glFogxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glFogxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFogxv(pname, params);
-}
-
-static void
-_evgl_gles1_glFrontFace(GLenum mode)
-{
-   if (!_gles1_api.glFrontFace)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFrontFace(mode);
-}
-
-static void
-_evgl_gles1_glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!_gles1_api.glFrustumx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glFrustumx(left, right, bottom, top, zNear, zFar);
-}
-
-static void
-_evgl_gles1_glGetBooleanv(GLenum pname, GLboolean *params)
-{
-   if (!_gles1_api.glGetBooleanv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetBooleanv(pname, params);
-}
-
-static void
-_evgl_gles1_glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetBufferParameteriv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetBufferParameteriv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glGetClipPlanex(GLenum pname, GLfixed eqn[4])
-{
-   if (!_gles1_api.glGetClipPlanex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetClipPlanex(pname, eqn);
-}
-
-static void
-_evgl_gles1_glGenBuffers(GLsizei n, GLuint *buffers)
-{
-   if (!_gles1_api.glGenBuffers)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGenBuffers(n, buffers);
-}
-
-static void
-_evgl_gles1_glGenTextures(GLsizei n, GLuint *textures)
-{
-   if (!_gles1_api.glGenTextures)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGenTextures(n, textures);
-}
-
-static GLenum
-_evgl_gles1_glGetError(void)
-{
-   GLenum ret;
-   if (!_gles1_api.glGetError)
-     return EVAS_GL_NOT_INITIALIZED;
-   EVGL_FUNC_BEGIN();
-   ret = _gles1_api.glGetError();
-   return ret;
-}
-
-static void
-_evgl_gles1_glGetFixedv(GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetFixedv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetFixedv(pname, params);
-}
-
-static void
-_evgl_gles1_glGetIntegerv(GLenum pname, GLint *params)
-{
-   EVGL_Resource *rsc;
-   EVGL_Context *ctx;
-
-   if (!_gles1_api.glGetIntegerv)
-     return;
-
-   if (_evgl_direct_enabled())
-     {
-        if (!params)
-          {
-             ERR("Inavlid Parameter");
-             return;
-          }
-
-        if (!(rsc=_evgl_tls_resource_get()))
-          {
-             ERR("Unable to execute GL command. Error retrieving tls");
-             return;
-          }
-
-        ctx = rsc->current_ctx;
-        if (!ctx)
-          {
-             ERR("Unable to retrive Current Context");
-             return;
-          }
-
-        if (ctx->version != EVAS_GL_GLES_1_X)
-          {
-             ERR("Invalid context version %d", (int) ctx->version);
-             return;
-          }
-
-        // Only need to handle it if it's directly rendering to the window
-        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
-          {
-             if (pname == GL_SCISSOR_BOX)
-               {
-                  if (ctx->scissor_updated)
-                    {
-                       memcpy(params, ctx->scissor_coord, sizeof(int)*4);
-                       return;
-                    }
-               }
-             /*!!! Temporary Fixes to avoid Webkit issue
-             if (pname == GL_VIEWPORT)
-               {
-                  if (ctx->viewport_updated)
-                    {
-                       memcpy(params, ctx->viewport_coord, sizeof(int)*4);
-                       return;
-                    }
-               }
-               */
-
-             // If it hasn't been initialized yet, return img object size
-             if (pname == GL_SCISSOR_BOX) //|| (pname == GL_VIEWPORT))
-               {
-                  params[0] = 0;
-                  params[1] = 0;
-                  params[2] = (GLint)rsc->direct.img.w;
-                  params[3] = (GLint)rsc->direct.img.h;
-                  return;
-               }
-          }
-     }
-
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetIntegerv(pname, params);
-}
-
-static void
-_evgl_gles1_glGetLightxv(GLenum light, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetLightxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetLightxv(light, pname, params);
-}
-
-static void
-_evgl_gles1_glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetMaterialxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetMaterialxv(face, pname, params);
-}
-
-static void
-_evgl_gles1_glGetPointerv(GLenum pname, GLvoid **params)
-{
-   if (!_gles1_api.glGetPointerv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetPointerv(pname, params);
-}
-
-static const GLubyte *
-_evgl_gles1_glGetString(GLenum name)
-{
-   static char _version[128] = {0};
-   EVGL_Resource *rsc;
-   const GLubyte *ret;
-
-   if (!_gles1_api.glGetString)
-     return NULL;
-
-   if ((!(rsc = _evgl_tls_resource_get())) || !rsc->current_ctx)
-     {
-        ERR("Current context is NULL, not calling glGetString");
-        // This sets evas_gl_error_get instead of glGetError...
-        evas_gl_common_error_set(NULL, EVAS_GL_BAD_CONTEXT);
-        return NULL;
-     }
-
-   if (rsc->current_ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) rsc->current_ctx->version);
-        evas_gl_common_error_set(NULL, EVAS_GL_BAD_MATCH);
-        return NULL;
-     }
-
-   switch (name)
-     {
-      case GL_VENDOR:
-      case GL_RENDERER:
-      case GL_SHADING_LANGUAGE_VERSION:
-        break;
-      case GL_VERSION:
-        ret = glGetString(GL_VERSION);
-        if (!ret) return NULL;
-#ifdef GL_GLES
-        if (ret[13] != (GLubyte) '1')
-          {
-             // We try not to remove the vendor fluff
-             snprintf(_version, sizeof(_version), "OpenGL ES-CM 1.1 Evas GL (%s)", ((char *) ret) + 10);
-             _version[sizeof(_version) - 1] = '\0';
-             return (const GLubyte *) _version;
-          }
-        return ret;
-#else
-        // Desktop GL, we still keep the official name
-        snprintf(_version, sizeof(_version), "OpenGL ES-CM 1.1 Evas GL (%s)", (char *) ret);
-        _version[sizeof(_version) - 1] = '\0';
-        return (const GLubyte *) _version;
-#endif
-
-      case GL_EXTENSIONS:
-        return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, EVAS_GL_GLES_1_X);
-
-      default:
-        WRN("Unknown string requested: %x", (unsigned int) name);
-        break;
-     }
-
-   EVGL_FUNC_BEGIN();
-   return _gles1_api.glGetString(name);
-}
-
-static void
-_evgl_gles1_glGetTexEnviv(GLenum env, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetTexEnviv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexEnviv(env, pname, params);
-}
-
-static void
-_evgl_gles1_glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetTexEnvxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexEnvxv(env, pname, params);
-}
-
-static void
-_evgl_gles1_glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetTexParameteriv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexParameteriv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetTexParameterxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glGetTexParameterxv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glHint(GLenum target, GLenum mode)
-{
-   if (!_gles1_api.glHint)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glHint(target, mode);
-}
-
-static GLboolean
-_evgl_gles1_glIsBuffer(GLuint buffer)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsBuffer)
-     return EINA_FALSE;
-   EVGL_FUNC_BEGIN();
-   ret = _gles1_api.glIsBuffer(buffer);
-   return ret;
-}
-
-static GLboolean
-_evgl_gles1_glIsEnabled(GLenum cap)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsEnabled)
-     return EINA_FALSE;
-   EVGL_FUNC_BEGIN();
-   ret = _gles1_api.glIsEnabled(cap);
-   return ret;
-}
-
-static GLboolean
-_evgl_gles1_glIsTexture(GLuint texture)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsTexture)
-     return EINA_FALSE;
-   EVGL_FUNC_BEGIN();
-   ret = _gles1_api.glIsTexture(texture);
-   return ret;
-}
-
-static void
-_evgl_gles1_glLightModelx(GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glLightModelx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightModelx(pname, param);
-}
-
-static void
-_evgl_gles1_glLightModelxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glLightModelxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightModelxv(pname, params);
-}
-
-static void
-_evgl_gles1_glLightx(GLenum light, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glLightx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightx(light, pname, param);
-}
-
-static void
-_evgl_gles1_glLightxv(GLenum light, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glLightxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLightxv(light, pname, params);
-}
-
-static void
-_evgl_gles1_glLineWidthx(GLfixed width)
-{
-   if (!_gles1_api.glLineWidthx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLineWidthx(width);
-}
-
-static void
-_evgl_gles1_glLoadIdentity(void)
-{
-   if (!_gles1_api.glLoadIdentity)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLoadIdentity();
-}
-
-static void
-_evgl_gles1_glLoadMatrixx(const GLfixed *m)
-{
-   if (!_gles1_api.glLoadMatrixx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLoadMatrixx(m);
-}
-
-static void
-_evgl_gles1_glLogicOp(GLenum opcode)
-{
-   if (!_gles1_api.glLogicOp)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glLogicOp(opcode);
-}
-
-static void
-_evgl_gles1_glMaterialx(GLenum face, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glMaterialx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMaterialx(face, pname, param);
-}
-
-static void
-_evgl_gles1_glMaterialxv(GLenum face, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glMaterialxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMaterialxv(face, pname, params);
-}
-
-static void
-_evgl_gles1_glMatrixMode(GLenum mode)
-{
-   if (!_gles1_api.glMatrixMode)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMatrixMode(mode);
-}
-
-static void
-_evgl_gles1_glMultMatrixx(const GLfixed *m)
-{
-   if (!_gles1_api.glMultMatrixx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMultMatrixx(m);
-}
-
-static void
-_evgl_gles1_glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
-{
-   if (!_gles1_api.glMultiTexCoord4x)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glMultiTexCoord4x(target, s, t, r, q);
-}
-
-static void
-_evgl_gles1_glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz)
-{
-   if (!_gles1_api.glNormal3x)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glNormal3x(nx, ny, nz);
-}
-
-static void
-_evgl_gles1_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glNormalPointer)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glNormalPointer(type, stride, pointer);
-}
-
-static void
-_evgl_gles1_glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!_gles1_api.glOrthox)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glOrthox(left, right, bottom, top, zNear, zFar);
-}
-
-static void
-_evgl_gles1_glPixelStorei(GLenum pname, GLint param)
-{
-   if (!_gles1_api.glPixelStorei)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPixelStorei(pname, param);
-}
-
-static void
-_evgl_gles1_glPointParameterx(GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glPointParameterx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointParameterx(pname, param);
-}
-
-static void
-_evgl_gles1_glPointParameterxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glPointParameterxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointParameterxv(pname, params);
-}
-
-static void
-_evgl_gles1_glPointSizex(GLfixed size)
-{
-   if (!_gles1_api.glPointSizex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPointSizex(size);
-}
-
-static void
-_evgl_gles1_glPolygonOffsetx(GLfixed factor, GLfixed units)
-{
-   if (!_gles1_api.glPolygonOffsetx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPolygonOffsetx(factor, units);
-}
-
-static void
-_evgl_gles1_glPopMatrix(void)
-{
-   if (!_gles1_api.glPopMatrix)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPopMatrix();
-}
-
-static void
-_evgl_gles1_glPushMatrix(void)
-{
-   if (!_gles1_api.glPushMatrix)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glPushMatrix();
-}
-
-static void
-_evgl_gles1_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
-   EVGL_Resource *rsc;
-   EVGL_Context *ctx;
-   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
-   int cc[4] = {0,0,0,0};
-
-   if (!_gles1_api.glReadPixels)
-     return;
-
-   if (!(rsc=_evgl_tls_resource_get()))
-     {
-        ERR("Unable to execute GL command. Error retrieving tls");
-        return;
-     }
-
-   if (!rsc->current_eng)
-     {
-        ERR("Unable to retrive Current Engine");
-        return;
-     }
-
-   ctx = rsc->current_ctx;
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   EVGL_FUNC_BEGIN();
-   if (_evgl_direct_enabled())
-     {
-        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
-          {
-             compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                    rsc->direct.rot, 1,
-                                    x, y, width, height,
-                                    rsc->direct.img.x, rsc->direct.img.y,
-                                    rsc->direct.img.w, rsc->direct.img.h,
-                                    rsc->direct.clip.x, rsc->direct.clip.y,
-                                    rsc->direct.clip.w, rsc->direct.clip.h,
-                                    oc, nc, cc);
-             _gles1_api.glReadPixels(nc[0], nc[1], nc[2], nc[3], format, type, pixels);
-          }
-        else
-          {
-             _gles1_api.glReadPixels(x, y, width, height, format, type, pixels);
-          }
-     }
-   else
-     {
-        _gles1_api.glReadPixels(x, y, width, height, format, type, pixels);
-     }
-}
-
-static void
-_evgl_gles1_glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glRotatex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glRotatex(angle, x, y, z);
-}
-
-static void
-_evgl_gles1_glSampleCoverage(GLclampf value, GLboolean invert)
-{
-   if (!_gles1_api.glSampleCoverage)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glSampleCoverage(value, invert);
-}
-
-static void
-_evgl_gles1_glSampleCoveragex(GLclampx value, GLboolean invert)
-{
-   if (!_gles1_api.glSampleCoveragex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glSampleCoveragex(value, invert);
-}
-
-static void
-_evgl_gles1_glScalex(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glScalex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glScalex(x, y, z);
-}
-
-static void
-_evgl_gles1_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   EVGL_Resource *rsc;
-   EVGL_Context *ctx;
-   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
-   int cc[4] = {0,0,0,0};
-
-   if (!_gles1_api.glScissor)
-     return;
-
-   if (!(rsc=_evgl_tls_resource_get()))
-     {
-        ERR("Unable to execute GL command. Error retrieving tls");
-        return;
-     }
-
-   if (!rsc->current_eng)
-     {
-        ERR("Unable to retrive Current Engine");
-        return;
-     }
-
-   ctx = rsc->current_ctx;
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   if (_evgl_direct_enabled())
-     {
-        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
-          {
-             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-               {
-                  _gles1_api.glDisable(GL_SCISSOR_TEST);
-               }
-
-             compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                    rsc->direct.rot, 1,
-                                    x, y, width, height,
-                                    rsc->direct.img.x, rsc->direct.img.y,
-                                    rsc->direct.img.w, rsc->direct.img.h,
-                                    rsc->direct.clip.x, rsc->direct.clip.y,
-                                    rsc->direct.clip.w, rsc->direct.clip.h,
-                                    oc, nc, cc);
-
-             // Keep a copy of the original coordinates
-             ctx->scissor_coord[0] = x;
-             ctx->scissor_coord[1] = y;
-             ctx->scissor_coord[2] = width;
-             ctx->scissor_coord[3] = height;
-
-             RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-             _gles1_api.glScissor(nc[0], nc[1], nc[2], nc[3]);
-
-             ctx->direct_scissor = 0;
-
-             // Check....!!!!
-             ctx->scissor_updated = 1;
-          }
-        else
-          {
-             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-               {
-                  _gles1_api.glDisable(GL_SCISSOR_TEST);
-                  ctx->direct_scissor = 0;
-               }
-
-             _gles1_api.glScissor(x, y, width, height);
-
-             ctx->scissor_updated = 0;
-          }
-     }
-   else
-     {
-        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-          {
-             _gles1_api.glDisable(GL_SCISSOR_TEST);
-             ctx->direct_scissor = 0;
-          }
-
-        _gles1_api.glScissor(x, y, width, height);
-     }
-}
-
-static void
-_evgl_gles1_glShadeModel(GLenum mode)
-{
-   if (!_gles1_api.glShadeModel)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glShadeModel(mode);
-}
-
-static void
-_evgl_gles1_glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
-   if (!_gles1_api.glStencilFunc)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glStencilFunc(func, ref, mask);
-}
-
-static void
-_evgl_gles1_glStencilMask(GLuint mask)
-{
-   if (!_gles1_api.glStencilMask)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glStencilMask(mask);
-}
-
-static void
-_evgl_gles1_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
-   if (!_gles1_api.glStencilOp)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glStencilOp(fail, zfail, zpass);
-}
-
-static void
-_evgl_gles1_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glTexCoordPointer)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexCoordPointer(size, type, stride, pointer);
-}
-
-static void
-_evgl_gles1_glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
-   if (!_gles1_api.glTexEnvi)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnvi(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexEnvx(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glTexEnvx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnvx(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!_gles1_api.glTexEnviv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnviv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glTexEnvxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexEnvxv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
-   if (!_gles1_api.glTexImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-}
-
-static void
-_evgl_gles1_glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
-   if (!_gles1_api.glTexParameteri)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameteri(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexParameterx(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glTexParameterx)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameterx(target, pname, param);
-}
-
-static void
-_evgl_gles1_glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!_gles1_api.glTexParameteriv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameteriv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glTexParameterxv)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexParameterxv(target, pname, params);
-}
-
-static void
-_evgl_gles1_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
-   if (!_gles1_api.glTexSubImage2D)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-}
-
-static void
-_evgl_gles1_glTranslatex(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glTranslatex)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glTranslatex(x, y, z);
-}
-
-static void
-_evgl_gles1_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glVertexPointer)
-     return;
-   EVGL_FUNC_BEGIN();
-   _gles1_api.glVertexPointer(size, type, stride, pointer);
-}
-
-static void
-_evgl_gles1_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   EVGL_Resource *rsc;
-   EVGL_Context *ctx;
-   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
-   int cc[4] = {0,0,0,0};
-
-   if (!_gles1_api.glViewport)
-     return;
-
-   if (!(rsc=_evgl_tls_resource_get()))
-     {
-        ERR("Unable to execute GL command. Error retrieving tls");
-        return;
-     }
-
-   if (!rsc->current_eng)
-     {
-        ERR("Unable to retrive Current Engine");
-        return;
-     }
-
-   ctx = rsc->current_ctx;
-   if (!ctx)
-     {
-        ERR("Unable to retrive Current Context");
-        return;
-     }
-
-   if (ctx->version != EVAS_GL_GLES_1_X)
-     {
-        ERR("Invalid context version %d", (int) ctx->version);
-        return;
-     }
-
-   EVGL_FUNC_BEGIN();
-   if (_evgl_direct_enabled())
-     {
-        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
-          {
-             if ((!ctx->direct_scissor))
-               {
-                  _gles1_api.glEnable(GL_SCISSOR_TEST);
-                  ctx->direct_scissor = 1;
-               }
-
-             if ((ctx->scissor_updated) && (ctx->scissor_enabled))
-               {
-                  // Recompute the scissor coordinates
-                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                         rsc->direct.rot, 1,
-                                         ctx->scissor_coord[0], ctx->scissor_coord[1],
-                                         ctx->scissor_coord[2], ctx->scissor_coord[3],
-                                         rsc->direct.img.x, rsc->direct.img.y,
-                                         rsc->direct.img.w, rsc->direct.img.h,
-                                         rsc->direct.clip.x, rsc->direct.clip.y,
-                                         rsc->direct.clip.w, rsc->direct.clip.h,
-                                         oc, nc, cc);
-
-                  RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
-                  _gles1_api.glScissor(nc[0], nc[1], nc[2], nc[3]);
-
-                  ctx->direct_scissor = 0;
-
-                  // Compute the viewport coordinate
-                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                         rsc->direct.rot, 0,
-                                         x, y, width, height,
-                                         rsc->direct.img.x, rsc->direct.img.y,
-                                         rsc->direct.img.w, rsc->direct.img.h,
-                                         rsc->direct.clip.x, rsc->direct.clip.y,
-                                         rsc->direct.clip.w, rsc->direct.clip.h,
-                                         oc, nc, cc);
-                  _gles1_api.glViewport(nc[0], nc[1], nc[2], nc[3]);
-               }
-             else
-               {
-
-                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
-                                         rsc->direct.rot, 0,
-                                         x, y, width, height,
-                                         rsc->direct.img.x, rsc->direct.img.y,
-                                         rsc->direct.img.w, rsc->direct.img.h,
-                                         rsc->direct.clip.x, rsc->direct.clip.y,
-                                         rsc->direct.clip.w, rsc->direct.clip.h,
-                                         oc, nc, cc);
-                  _gles1_api.glScissor(cc[0], cc[1], cc[2], cc[3]);
-
-                  _gles1_api.glViewport(nc[0], nc[1], nc[2], nc[3]);
-               }
-
-             ctx->viewport_direct[0] = nc[0];
-             ctx->viewport_direct[1] = nc[1];
-             ctx->viewport_direct[2] = nc[2];
-             ctx->viewport_direct[3] = nc[3];
-
-             // Keep a copy of the original coordinates
-             ctx->viewport_coord[0] = x;
-             ctx->viewport_coord[1] = y;
-             ctx->viewport_coord[2] = width;
-             ctx->viewport_coord[3] = height;
-
-             ctx->viewport_updated   = 1;
-          }
-        else
-          {
-             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-               {
-                  _gles1_api.glDisable(GL_SCISSOR_TEST);
-                  ctx->direct_scissor = 0;
-               }
-
-             _gles1_api.glViewport(x, y, width, height);
-          }
-     }
-   else
-     {
-        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-          {
-             _gles1_api.glDisable(GL_SCISSOR_TEST);
-             ctx->direct_scissor = 0;
-          }
-
-        _gles1_api.glViewport(x, y, width, height);
-     }
-}
-
-static void
-_evgld_gles1_glAlphaFunc(GLenum func, GLclampf ref)
-{
-   if (!_gles1_api.glAlphaFunc)
-     {
-        ERR("Can not call glAlphaFunc() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glAlphaFunc(func, ref);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
-   if (!_gles1_api.glClearColor)
-     {
-        ERR("Can not call glClearColor() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClearColor(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClearDepthf(GLclampf depth)
-{
-   if (!_gles1_api.glClearDepthf)
-     {
-        ERR("Can not call glClearDepthf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClearDepthf(depth);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClipPlanef(GLenum plane, const GLfloat *equation)
-{
-   if (!_gles1_api.glClipPlanef)
-     {
-        ERR("Can not call glClipPlanef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClipPlanef(plane, equation);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-   if (!_gles1_api.glColor4f)
-     {
-        ERR("Can not call glColor4f() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glColor4f(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDepthRangef(GLclampf zNear, GLclampf zFar)
-{
-   if (!_gles1_api.glDepthRangef)
-     {
-        ERR("Can not call glDepthRangef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDepthRangef(zNear, zFar);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFogf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glFogf)
-     {
-        ERR("Can not call glFogf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFogf(pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFogfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glFogfv)
-     {
-        ERR("Can not call glFogfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFogfv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!_gles1_api.glFrustumf)
-     {
-        ERR("Can not call glFrustumf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFrustumf(left, right, bottom, top, zNear, zFar);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetClipPlanef(GLenum pname, GLfloat eqn[4])
-{
-   if (!_gles1_api.glGetClipPlanef)
-     {
-        ERR("Can not call glGetClipPlanef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetClipPlanef(pname, eqn);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetFloatv(GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetFloatv)
-     {
-        ERR("Can not call glGetFloatv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetFloatv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetLightfv(GLenum light, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetLightfv)
-     {
-        ERR("Can not call glGetLightfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetLightfv(light, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetMaterialfv)
-     {
-        ERR("Can not call glGetMaterialfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetMaterialfv(face, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetTexEnvfv)
-     {
-        ERR("Can not call glGetTexEnvfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexEnvfv(env, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
-{
-   if (!_gles1_api.glGetTexParameterfv)
-     {
-        ERR("Can not call glGetTexParameterfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexParameterfv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightModelf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glLightModelf)
-     {
-        ERR("Can not call glLightModelf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightModelf(pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightModelfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glLightModelfv)
-     {
-        ERR("Can not call glLightModelfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightModelfv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightf(GLenum light, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glLightf)
-     {
-        ERR("Can not call glLightf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightf(light, pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightfv(GLenum light, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glLightfv)
-     {
-        ERR("Can not call glLightfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightfv(light, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLineWidth(GLfloat width)
-{
-   if (!_gles1_api.glLineWidth)
-     {
-        ERR("Can not call glLineWidth() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLineWidth(width);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLoadMatrixf(const GLfloat *m)
-{
-   if (!_gles1_api.glLoadMatrixf)
-     {
-        ERR("Can not call glLoadMatrixf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLoadMatrixf(m);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glMaterialf(GLenum face, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glMaterialf)
-     {
-        ERR("Can not call glMaterialf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMaterialf(face, pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glMaterialfv)
-     {
-        ERR("Can not call glMaterialfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMaterialfv(face, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glMultMatrixf(const GLfloat *m)
-{
-   if (!_gles1_api.glMultMatrixf)
-     {
-        ERR("Can not call glMultMatrixf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMultMatrixf(m);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-   if (!_gles1_api.glMultiTexCoord4f)
-     {
-        ERR("Can not call glMultiTexCoord4f() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMultiTexCoord4f(target, s, t, r, q);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
-{
-   if (!_gles1_api.glNormal3f)
-     {
-        ERR("Can not call glNormal3f() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glNormal3f(nx, ny, nz);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!_gles1_api.glOrthof)
-     {
-        ERR("Can not call glOrthof() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glOrthof(left, right, bottom, top, zNear, zFar);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glPointParameterf(GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glPointParameterf)
-     {
-        ERR("Can not call glPointParameterf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointParameterf(pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glPointParameterfv(GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glPointParameterfv)
-     {
-        ERR("Can not call glPointParameterfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointParameterfv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glPointSize(GLfloat size)
-{
-   if (!_gles1_api.glPointSize)
-     {
-        ERR("Can not call glPointSize() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointSize(size);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glPointSizePointerOES)
-     {
-        ERR("Can not call glPointSizePointerOES() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointSizePointerOES(type, stride, pointer);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glPolygonOffset(GLfloat factor, GLfloat units)
-{
-   if (!_gles1_api.glPolygonOffset)
-     {
-        ERR("Can not call glPolygonOffset() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPolygonOffset(factor, units);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glRotatef)
-     {
-        ERR("Can not call glRotatef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glRotatef(angle, x, y, z);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glScalef(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glScalef)
-     {
-        ERR("Can not call glScalef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glScalef(x, y, z);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glTexEnvf(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glTexEnvf)
-     {
-        ERR("Can not call glTexEnvf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnvf(target, pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glTexEnvfv)
-     {
-        ERR("Can not call glTexEnvfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnvfv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!_gles1_api.glTexParameterf)
-     {
-        ERR("Can not call glTexParameterf() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameterf(target, pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!_gles1_api.glTexParameterfv)
-     {
-        ERR("Can not call glTexParameterfv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameterfv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glTranslatef(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!_gles1_api.glTranslatef)
-     {
-        ERR("Can not call glTranslatef() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTranslatef(x, y, z);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glActiveTexture(GLenum texture)
-{
-   if (!_gles1_api.glActiveTexture)
-     {
-        ERR("Can not call glActiveTexture() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glActiveTexture(texture);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glAlphaFuncx(GLenum func, GLclampx ref)
-{
-   if (!_gles1_api.glAlphaFuncx)
-     {
-        ERR("Can not call glAlphaFuncx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glAlphaFuncx(func, ref);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glBindBuffer(GLenum target, GLuint buffer)
-{
-   if (!_gles1_api.glBindBuffer)
-     {
-        ERR("Can not call glBindBuffer() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glBindBuffer(target, buffer);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glBindTexture(GLenum target, GLuint texture)
-{
-   if (!_gles1_api.glBindTexture)
-     {
-        ERR("Can not call glBindTexture() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glBindTexture(target, texture);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glBlendFunc(GLenum sfactor, GLenum dfactor)
-{
-   if (!_gles1_api.glBlendFunc)
-     {
-        ERR("Can not call glBlendFunc() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glBlendFunc(sfactor, dfactor);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
-{
-   if (!_gles1_api.glBufferData)
-     {
-        ERR("Can not call glBufferData() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glBufferData(target, size, data, usage);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
-{
-   if (!_gles1_api.glBufferSubData)
-     {
-        ERR("Can not call glBufferSubData() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glBufferSubData(target, offset, size, data);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClear(GLbitfield mask)
-{
-   if (!_gles1_api.glClear)
-     {
-        ERR("Can not call glClear() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClear(mask);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
-{
-   if (!_gles1_api.glClearColorx)
-     {
-        ERR("Can not call glClearColorx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClearColorx(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClearDepthx(GLclampx depth)
-{
-   if (!_gles1_api.glClearDepthx)
-     {
-        ERR("Can not call glClearDepthx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClearDepthx(depth);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClearStencil(GLint s)
-{
-   if (!_gles1_api.glClearStencil)
-     {
-        ERR("Can not call glClearStencil() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClearStencil(s);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClientActiveTexture(GLenum texture)
-{
-   if (!_gles1_api.glClientActiveTexture)
-     {
-        ERR("Can not call glClientActiveTexture() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClientActiveTexture(texture);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glClipPlanex(GLenum plane, const GLfixed *equation)
-{
-   if (!_gles1_api.glClipPlanex)
-     {
-        ERR("Can not call glClipPlanex() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glClipPlanex(plane, equation);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
-   if (!_gles1_api.glColor4ub)
-     {
-        ERR("Can not call glColor4ub() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glColor4ub(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
-{
-   if (!_gles1_api.glColor4x)
-     {
-        ERR("Can not call glColor4x() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glColor4x(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
-   if (!_gles1_api.glColorMask)
-     {
-        ERR("Can not call glColorMask() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glColorMask(red, green, blue, alpha);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glColorPointer)
-     {
-        ERR("Can not call glColorPointer() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glColorPointer(size, type, stride, pointer);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
-{
-   if (!_gles1_api.glCompressedTexImage2D)
-     {
-        ERR("Can not call glCompressedTexImage2D() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
-{
-   if (!_gles1_api.glCompressedTexSubImage2D)
-     {
-        ERR("Can not call glCompressedTexSubImage2D() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
-   if (!_gles1_api.glCopyTexImage2D)
-     {
-        ERR("Can not call glCopyTexImage2D() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!_gles1_api.glCopyTexSubImage2D)
-     {
-        ERR("Can not call glCopyTexSubImage2D() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glCullFace(GLenum mode)
-{
-   if (!_gles1_api.glCullFace)
-     {
-        ERR("Can not call glCullFace() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glCullFace(mode);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
-   if (!_gles1_api.glDeleteBuffers)
-     {
-        ERR("Can not call glDeleteBuffers() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDeleteBuffers(n, buffers);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDeleteTextures(GLsizei n, const GLuint *textures)
-{
-   if (!_gles1_api.glDeleteTextures)
-     {
-        ERR("Can not call glDeleteTextures() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDeleteTextures(n, textures);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDepthFunc(GLenum func)
-{
-   if (!_gles1_api.glDepthFunc)
-     {
-        ERR("Can not call glDepthFunc() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDepthFunc(func);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDepthMask(GLboolean flag)
-{
-   if (!_gles1_api.glDepthMask)
-     {
-        ERR("Can not call glDepthMask() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDepthMask(flag);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDepthRangex(GLclampx zNear, GLclampx zFar)
-{
-   if (!_gles1_api.glDepthRangex)
-     {
-        ERR("Can not call glDepthRangex() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDepthRangex(zNear, zFar);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDisable(GLenum cap)
-{
-   if (!_gles1_api.glDisable)
-     {
-        ERR("Can not call glDisable() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDisable(cap);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDisableClientState(GLenum array)
-{
-   if (!_gles1_api.glDisableClientState)
-     {
-        ERR("Can not call glDisableClientState() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDisableClientState(array);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDrawArrays(GLenum mode, GLint first, GLsizei count)
-{
-   if (!_gles1_api.glDrawArrays)
-     {
-        ERR("Can not call glDrawArrays() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDrawArrays(mode, first, count);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
-{
-   if (!_gles1_api.glDrawElements)
-     {
-        ERR("Can not call glDrawElements() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glDrawElements(mode, count, type, indices);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glEnable(GLenum cap)
-{
-   if (!_gles1_api.glEnable)
-     {
-        ERR("Can not call glEnable() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glEnable(cap);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glEnableClientState(GLenum array)
-{
-   if (!_gles1_api.glEnableClientState)
-     {
-        ERR("Can not call glEnableClientState() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glEnableClientState(array);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFinish(void)
-{
-   if (!_gles1_api.glFinish)
-     {
-        ERR("Can not call glFinish() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFinish();
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFlush(void)
-{
-   if (!_gles1_api.glFlush)
-     {
-        ERR("Can not call glFlush() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFlush();
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFogx(GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glFogx)
-     {
-        ERR("Can not call glFogx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFogx(pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFogxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glFogxv)
-     {
-        ERR("Can not call glFogxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFogxv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFrontFace(GLenum mode)
-{
-   if (!_gles1_api.glFrontFace)
-     {
-        ERR("Can not call glFrontFace() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFrontFace(mode);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!_gles1_api.glFrustumx)
-     {
-        ERR("Can not call glFrustumx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glFrustumx(left, right, bottom, top, zNear, zFar);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetBooleanv(GLenum pname, GLboolean *params)
-{
-   if (!_gles1_api.glGetBooleanv)
-     {
-        ERR("Can not call glGetBooleanv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetBooleanv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetBufferParameteriv)
-     {
-        ERR("Can not call glGetBufferParameteriv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetBufferParameteriv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetClipPlanex(GLenum pname, GLfixed eqn[4])
-{
-   if (!_gles1_api.glGetClipPlanex)
-     {
-        ERR("Can not call glGetClipPlanex() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetClipPlanex(pname, eqn);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGenBuffers(GLsizei n, GLuint *buffers)
-{
-   if (!_gles1_api.glGenBuffers)
-     {
-        ERR("Can not call glGenBuffers() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGenBuffers(n, buffers);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGenTextures(GLsizei n, GLuint *textures)
-{
-   if (!_gles1_api.glGenTextures)
-     {
-        ERR("Can not call glGenTextures() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGenTextures(n, textures);
-   EVGLD_FUNC_END();
-}
-
-static GLenum
-_evgld_gles1_glGetError(void)
-{
-   GLenum ret;
-   if (!_gles1_api.glGetError)
-     {
-        ERR("Can not call glGetError() in this context!");
-        return EVAS_GL_NOT_INITIALIZED;
-     }
-   EVGLD_FUNC_BEGIN();
-   ret = _evgl_gles1_glGetError();
-   EVGLD_FUNC_END();
-   return ret;
-}
-
-static void
-_evgld_gles1_glGetFixedv(GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetFixedv)
-     {
-        ERR("Can not call glGetFixedv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetFixedv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetIntegerv(GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetIntegerv)
-     {
-        ERR("Can not call glGetIntegerv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetIntegerv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetLightxv(GLenum light, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetLightxv)
-     {
-        ERR("Can not call glGetLightxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetLightxv(light, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetMaterialxv)
-     {
-        ERR("Can not call glGetMaterialxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetMaterialxv(face, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetPointerv(GLenum pname, GLvoid **params)
-{
-   if (!_gles1_api.glGetPointerv)
-     {
-        ERR("Can not call glGetPointerv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetPointerv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static const GLubyte *
-_evgld_gles1_glGetString(GLenum name)
-{
-   const GLubyte * ret;
-   if (!_gles1_api.glGetString)
-     {
-        ERR("Can not call glGetString() in this context!");
-        return NULL;
-     }
-   EVGLD_FUNC_BEGIN();
-   ret = _evgl_gles1_glGetString(name);
-   EVGLD_FUNC_END();
-   return ret;
-}
-
-static void
-_evgld_gles1_glGetTexEnviv(GLenum env, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetTexEnviv)
-     {
-        ERR("Can not call glGetTexEnviv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexEnviv(env, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetTexEnvxv)
-     {
-        ERR("Can not call glGetTexEnvxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexEnvxv(env, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-   if (!_gles1_api.glGetTexParameteriv)
-     {
-        ERR("Can not call glGetTexParameteriv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexParameteriv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)
-{
-   if (!_gles1_api.glGetTexParameterxv)
-     {
-        ERR("Can not call glGetTexParameterxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glGetTexParameterxv(target, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glHint(GLenum target, GLenum mode)
-{
-   if (!_gles1_api.glHint)
-     {
-        ERR("Can not call glHint() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glHint(target, mode);
-   EVGLD_FUNC_END();
-}
-
-static GLboolean
-_evgld_gles1_glIsBuffer(GLuint buffer)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsBuffer)
-     {
-        ERR("Can not call glIsBuffer() in this context!");
-        return EINA_FALSE;
-     }
-   EVGLD_FUNC_BEGIN();
-   ret = _evgl_gles1_glIsBuffer(buffer);
-   EVGLD_FUNC_END();
-   return ret;
-}
-
-static GLboolean
-_evgld_gles1_glIsEnabled(GLenum cap)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsEnabled)
-     {
-        ERR("Can not call glIsEnabled() in this context!");
-        return EINA_FALSE;
-     }
-   EVGLD_FUNC_BEGIN();
-   ret = _evgl_gles1_glIsEnabled(cap);
-   EVGLD_FUNC_END();
-   return ret;
-}
-
-static GLboolean
-_evgld_gles1_glIsTexture(GLuint texture)
-{
-   GLboolean ret;
-   if (!_gles1_api.glIsTexture)
-     {
-        ERR("Can not call glIsTexture() in this context!");
-        return EINA_FALSE;
-     }
-   EVGLD_FUNC_BEGIN();
-   ret = _evgl_gles1_glIsTexture(texture);
-   EVGLD_FUNC_END();
-   return ret;
-}
-
-static void
-_evgld_gles1_glLightModelx(GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glLightModelx)
-     {
-        ERR("Can not call glLightModelx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightModelx(pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightModelxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glLightModelxv)
-     {
-        ERR("Can not call glLightModelxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightModelxv(pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightx(GLenum light, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glLightx)
-     {
-        ERR("Can not call glLightx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightx(light, pname, param);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLightxv(GLenum light, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glLightxv)
-     {
-        ERR("Can not call glLightxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLightxv(light, pname, params);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLineWidthx(GLfixed width)
-{
-   if (!_gles1_api.glLineWidthx)
-     {
-        ERR("Can not call glLineWidthx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLineWidthx(width);
-   EVGLD_FUNC_END();
-}
+                  EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+                  ctx->direct_scissor = 0;
+               }
 
-static void
-_evgld_gles1_glLoadIdentity(void)
-{
-   if (!_gles1_api.glLoadIdentity)
-     {
-        ERR("Can not call glLoadIdentity() in this context!");
-        return;
+             EVGL_TH_CALL(glClear, _gles1_api.glClear, mask);
+          }
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLoadIdentity();
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glLoadMatrixx(const GLfixed *m)
-{
-   if (!_gles1_api.glLoadMatrixx)
+   else
      {
-        ERR("Can not call glLoadMatrixx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLoadMatrixx(m);
-   EVGLD_FUNC_END();
-}
+        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+          {
+             EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+             ctx->direct_scissor = 0;
+          }
 
-static void
-_evgld_gles1_glLogicOp(GLenum opcode)
-{
-   if (!_gles1_api.glLogicOp)
-     {
-        ERR("Can not call glLogicOp() in this context!");
-        return;
+        EVGL_TH_CALL(glClear, _gles1_api.glClear, mask);
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glLogicOp(opcode);
-   EVGLD_FUNC_END();
 }
 
 static void
-_evgld_gles1_glMaterialx(GLenum face, GLenum pname, GLfixed param)
+_evgl_gles1_glDisable(GLenum cap)
 {
-   if (!_gles1_api.glMaterialx)
-     {
-        ERR("Can not call glMaterialx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMaterialx(face, pname, param);
-   EVGLD_FUNC_END();
-}
+   EVGL_Context *ctx;
 
-static void
-_evgld_gles1_glMaterialxv(GLenum face, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glMaterialxv)
-     {
-        ERR("Can not call glMaterialxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMaterialxv(face, pname, params);
-   EVGLD_FUNC_END();
-}
+   if (!_gles1_api.glDisable)
+     return;
 
-static void
-_evgld_gles1_glMatrixMode(GLenum mode)
-{
-   if (!_gles1_api.glMatrixMode)
+   ctx = evas_gl_common_current_context_get();
+   if (!ctx)
      {
-        ERR("Can not call glMatrixMode() in this context!");
+        ERR("Unable to retrive Current Context");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMatrixMode(mode);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glMultMatrixx(const GLfixed *m)
-{
-   if (!_gles1_api.glMultMatrixx)
+   if (ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glMultMatrixx() in this context!");
+        ERR("Invalid context version %d", (int) ctx->version);
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMultMatrixx(m);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
-{
-   if (!_gles1_api.glMultiTexCoord4x)
-     {
-        ERR("Can not call glMultiTexCoord4x() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glMultiTexCoord4x(target, s, t, r, q);
-   EVGLD_FUNC_END();
+   if (cap == GL_SCISSOR_TEST)
+      ctx->scissor_enabled = 0;
+   EVGL_FUNC_BEGIN();
+   EVGL_TH_CALL(glDisable, _gles1_api.glDisable, cap);
 }
 
 static void
-_evgld_gles1_glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz)
+_evgl_gles1_glEnable(GLenum cap)
 {
-   if (!_gles1_api.glNormal3x)
+   EVGL_Context *ctx;
+
+   if (!_gles1_api.glEnable)
+     return;
+
+   ctx = evas_gl_common_current_context_get();
+   if (!ctx)
      {
-        ERR("Can not call glNormal3x() in this context!");
+        ERR("Unable to retrive Current Context");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glNormal3x(nx, ny, nz);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glNormalPointer)
+   if (ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glNormalPointer() in this context!");
+        ERR("Invalid context version %d", (int) ctx->version);
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glNormalPointer(type, stride, pointer);
-   EVGLD_FUNC_END();
+
+   if (cap == GL_SCISSOR_TEST)
+      ctx->scissor_enabled = 1;
+   EVGL_FUNC_BEGIN();
+   EVGL_TH_CALL(glEnable, _gles1_api.glEnable, cap);
 }
 
-static void
-_evgld_gles1_glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+static GLenum
+_evgl_gles1_glGetError(void)
 {
-   if (!_gles1_api.glOrthox)
-     {
-        ERR("Can not call glOrthox() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glOrthox(left, right, bottom, top, zNear, zFar);
-   EVGLD_FUNC_END();
+   GLenum ret;
+   if (!_gles1_api.glGetError)
+     return EVAS_GL_NOT_INITIALIZED;
+   EVGL_FUNC_BEGIN();
+   ret = EVGL_TH_CALL(glGetError, _gles1_api.glGetError);
+   return ret;
 }
 
 static void
-_evgld_gles1_glPixelStorei(GLenum pname, GLint param)
+_evgl_gles1_glGetIntegerv(GLenum pname, GLint *params)
 {
-   if (!_gles1_api.glPixelStorei)
+   EVGL_Resource *rsc;
+   EVGL_Context *ctx;
+
+   if (!_gles1_api.glGetIntegerv)
+     return;
+
+   if (_evgl_direct_enabled())
      {
-        ERR("Can not call glPixelStorei() in this context!");
-        return;
+        if (!params)
+          {
+             ERR("Inavlid Parameter");
+             return;
+          }
+
+        if (!(rsc=_evgl_tls_resource_get()))
+          {
+             ERR("Unable to execute GL command. Error retrieving tls");
+             return;
+          }
+
+        ctx = rsc->current_ctx;
+        if (!ctx)
+          {
+             ERR("Unable to retrive Current Context");
+             return;
+          }
+
+        if (ctx->version != EVAS_GL_GLES_1_X)
+          {
+             ERR("Invalid context version %d", (int) ctx->version);
+             return;
+          }
+
+        // Only need to handle it if it's directly rendering to the window
+        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
+          {
+             if (pname == GL_SCISSOR_BOX)
+               {
+                  if (ctx->scissor_updated)
+                    {
+                       memcpy(params, ctx->scissor_coord, sizeof(int)*4);
+                       return;
+                    }
+               }
+             /*!!! Temporary Fixes to avoid Webkit issue
+             if (pname == GL_VIEWPORT)
+               {
+                  if (ctx->viewport_updated)
+                    {
+                       memcpy(params, ctx->viewport_coord, sizeof(int)*4);
+                       return;
+                    }
+               }
+               */
+
+             // If it hasn't been initialized yet, return img object size
+             if (pname == GL_SCISSOR_BOX) //|| (pname == GL_VIEWPORT))
+               {
+                  params[0] = 0;
+                  params[1] = 0;
+                  params[2] = (GLint)rsc->direct.img.w;
+                  params[3] = (GLint)rsc->direct.img.h;
+                  return;
+               }
+          }
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPixelStorei(pname, param);
-   EVGLD_FUNC_END();
+
+   EVGL_FUNC_BEGIN();
+   EVGL_TH_CALL(glGetIntegerv, _gles1_api.glGetIntegerv, pname, params);
 }
 
-static void
-_evgld_gles1_glPointParameterx(GLenum pname, GLfixed param)
+static const GLubyte *
+_evgl_gles1_glGetString(GLenum name)
 {
-   if (!_gles1_api.glPointParameterx)
+   static char _version[128] = {0};
+   EVGL_Resource *rsc;
+   const GLubyte *ret;
+
+   if (!_gles1_api.glGetString)
+     return NULL;
+
+   if ((!(rsc = _evgl_tls_resource_get())) || !rsc->current_ctx)
      {
-        ERR("Can not call glPointParameterx() in this context!");
-        return;
+        ERR("Current context is NULL, not calling glGetString");
+        // This sets evas_gl_error_get instead of glGetError...
+        evas_gl_common_error_set(NULL, EVAS_GL_BAD_CONTEXT);
+        return NULL;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointParameterx(pname, param);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glPointParameterxv(GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glPointParameterxv)
+   if (rsc->current_ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glPointParameterxv() in this context!");
-        return;
+        ERR("Invalid context version %d", (int) rsc->current_ctx->version);
+        evas_gl_common_error_set(NULL, EVAS_GL_BAD_MATCH);
+        return NULL;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointParameterxv(pname, params);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glPointSizex(GLfixed size)
-{
-   if (!_gles1_api.glPointSizex)
+   switch (name)
      {
-        ERR("Can not call glPointSizex() in this context!");
-        return;
+      case GL_VENDOR:
+      case GL_RENDERER:
+      case GL_SHADING_LANGUAGE_VERSION:
+        break;
+      case GL_VERSION:
+        ret = EVGL_TH_CALL(glGetString, glGetString, GL_VERSION);
+        if (!ret) return NULL;
+#ifdef GL_GLES
+        if (ret[13] != (GLubyte) '1')
+          {
+             // We try not to remove the vendor fluff
+             snprintf(_version, sizeof(_version), "OpenGL ES-CM 1.1 Evas GL (%s)", ((char *) ret) + 10);
+             _version[sizeof(_version) - 1] = '\0';
+             return (const GLubyte *) _version;
+          }
+        return ret;
+#else
+        // Desktop GL, we still keep the official name
+        snprintf(_version, sizeof(_version), "OpenGL ES-CM 1.1 Evas GL (%s)", (char *) ret);
+        _version[sizeof(_version) - 1] = '\0';
+        return (const GLubyte *) _version;
+#endif
+
+      case GL_EXTENSIONS:
+        return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, EVAS_GL_GLES_1_X);
+
+      default:
+        WRN("Unknown string requested: %x", (unsigned int) name);
+        break;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPointSizex(size);
-   EVGLD_FUNC_END();
+
+   EVGL_FUNC_BEGIN();
+   return EVGL_TH_CALL(glGetString, _gles1_api.glGetString, name);
 }
 
 static void
-_evgld_gles1_glPolygonOffsetx(GLfixed factor, GLfixed units)
+_evgl_gles1_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
 {
-   if (!_gles1_api.glPolygonOffsetx)
+   EVGL_Resource *rsc;
+   EVGL_Context *ctx;
+   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
+   int cc[4] = {0,0,0,0};
+
+   if (!_gles1_api.glReadPixels)
+     return;
+
+   if (!(rsc=_evgl_tls_resource_get()))
      {
-        ERR("Can not call glPolygonOffsetx() in this context!");
+        ERR("Unable to execute GL command. Error retrieving tls");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPolygonOffsetx(factor, units);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glPopMatrix(void)
-{
-   if (!_gles1_api.glPopMatrix)
+   if (!rsc->current_eng)
      {
-        ERR("Can not call glPopMatrix() in this context!");
+        ERR("Unable to retrive Current Engine");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPopMatrix();
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glPushMatrix(void)
-{
-   if (!_gles1_api.glPushMatrix)
+   ctx = rsc->current_ctx;
+   if (!ctx)
      {
-        ERR("Can not call glPushMatrix() in this context!");
+        ERR("Unable to retrive Current Context");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glPushMatrix();
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
-{
-   if (!_gles1_api.glReadPixels)
+   if (ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glReadPixels() in this context!");
+        ERR("Invalid context version %d", (int) ctx->version);
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glReadPixels(x, y, width, height, format, type, pixels);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glRotatex)
+   EVGL_FUNC_BEGIN();
+   if (_evgl_direct_enabled())
      {
-        ERR("Can not call glRotatex() in this context!");
-        return;
+        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
+          {
+             compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                    rsc->direct.rot, 1,
+                                    x, y, width, height,
+                                    rsc->direct.img.x, rsc->direct.img.y,
+                                    rsc->direct.img.w, rsc->direct.img.h,
+                                    rsc->direct.clip.x, rsc->direct.clip.y,
+                                    rsc->direct.clip.w, rsc->direct.clip.h,
+                                    oc, nc, cc);
+             EVGL_TH_CALL(glReadPixels, _gles1_api.glReadPixels, nc[0], nc[1], nc[2], nc[3], format, type, pixels);
+          }
+        else
+          {
+             EVGL_TH_CALL(glReadPixels, _gles1_api.glReadPixels, x, y, width, height, format, type, pixels);
+          }
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glRotatex(angle, x, y, z);
-   EVGLD_FUNC_END();
-}
-
-static void
-_evgld_gles1_glSampleCoverage(GLclampf value, GLboolean invert)
-{
-   if (!_gles1_api.glSampleCoverage)
+   else
      {
-        ERR("Can not call glSampleCoverage() in this context!");
-        return;
+        EVGL_TH_CALL(glReadPixels, _gles1_api.glReadPixels, x, y, width, height, format, type, pixels);
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glSampleCoverage(value, invert);
-   EVGLD_FUNC_END();
 }
 
 static void
-_evgld_gles1_glSampleCoveragex(GLclampx value, GLboolean invert)
+_evgl_gles1_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
 {
-   if (!_gles1_api.glSampleCoveragex)
-     {
-        ERR("Can not call glSampleCoveragex() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glSampleCoveragex(value, invert);
-   EVGLD_FUNC_END();
-}
+   EVGL_Resource *rsc;
+   EVGL_Context *ctx;
+   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
+   int cc[4] = {0,0,0,0};
 
-static void
-_evgld_gles1_glScalex(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glScalex)
+   if (!_gles1_api.glScissor)
+     return;
+
+   if (!(rsc=_evgl_tls_resource_get()))
      {
-        ERR("Can not call glScalex() in this context!");
+        ERR("Unable to execute GL command. Error retrieving tls");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glScalex(x, y, z);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!_gles1_api.glScissor)
+   if (!rsc->current_eng)
      {
-        ERR("Can not call glScissor() in this context!");
+        ERR("Unable to retrive Current Engine");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glScissor(x, y, width, height);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glShadeModel(GLenum mode)
-{
-   if (!_gles1_api.glShadeModel)
+   ctx = rsc->current_ctx;
+   if (!ctx)
      {
-        ERR("Can not call glShadeModel() in this context!");
+        ERR("Unable to retrive Current Context");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glShadeModel(mode);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glStencilFunc(GLenum func, GLint ref, GLuint mask)
-{
-   if (!_gles1_api.glStencilFunc)
+   if (ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glStencilFunc() in this context!");
+        ERR("Invalid context version %d", (int) ctx->version);
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glStencilFunc(func, ref, mask);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glStencilMask(GLuint mask)
-{
-   if (!_gles1_api.glStencilMask)
+   if (_evgl_direct_enabled())
      {
-        ERR("Can not call glStencilMask() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glStencilMask(mask);
-   EVGLD_FUNC_END();
-}
+        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
+          {
+             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+               {
+                  EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+               }
 
-static void
-_evgld_gles1_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
-{
-   if (!_gles1_api.glStencilOp)
+             compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                    rsc->direct.rot, 1,
+                                    x, y, width, height,
+                                    rsc->direct.img.x, rsc->direct.img.y,
+                                    rsc->direct.img.w, rsc->direct.img.h,
+                                    rsc->direct.clip.x, rsc->direct.clip.y,
+                                    rsc->direct.clip.w, rsc->direct.clip.h,
+                                    oc, nc, cc);
+
+             // Keep a copy of the original coordinates
+             ctx->scissor_coord[0] = x;
+             ctx->scissor_coord[1] = y;
+             ctx->scissor_coord[2] = width;
+             ctx->scissor_coord[3] = height;
+
+             RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
+             EVGL_TH_CALL(glScissor, _gles1_api.glScissor, nc[0], nc[1], nc[2], nc[3]);
+
+             ctx->direct_scissor = 0;
+
+             // Check....!!!!
+             ctx->scissor_updated = 1;
+          }
+        else
+          {
+             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+               {
+                  EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+                  ctx->direct_scissor = 0;
+               }
+
+             EVGL_TH_CALL(glScissor, _gles1_api.glScissor, x, y, width, height);
+
+             ctx->scissor_updated = 0;
+          }
+     }
+   else
      {
-        ERR("Can not call glStencilOp() in this context!");
-        return;
+        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+          {
+             EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+             ctx->direct_scissor = 0;
+          }
+
+        EVGL_TH_CALL(glScissor, _gles1_api.glScissor, x, y, width, height);
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glStencilOp(fail, zfail, zpass);
-   EVGLD_FUNC_END();
 }
 
 static void
-_evgld_gles1_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+_evgl_gles1_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
 {
-   if (!_gles1_api.glTexCoordPointer)
+   EVGL_Resource *rsc;
+   EVGL_Context *ctx;
+   int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0};
+   int cc[4] = {0,0,0,0};
+
+   if (!_gles1_api.glViewport)
+     return;
+
+   if (!(rsc=_evgl_tls_resource_get()))
      {
-        ERR("Can not call glTexCoordPointer() in this context!");
+        ERR("Unable to execute GL command. Error retrieving tls");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexCoordPointer(size, type, stride, pointer);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glTexEnvi(GLenum target, GLenum pname, GLint param)
-{
-   if (!_gles1_api.glTexEnvi)
+   if (!rsc->current_eng)
      {
-        ERR("Can not call glTexEnvi() in this context!");
+        ERR("Unable to retrive Current Engine");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnvi(target, pname, param);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glTexEnvx(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glTexEnvx)
+   ctx = rsc->current_ctx;
+   if (!ctx)
      {
-        ERR("Can not call glTexEnvx() in this context!");
+        ERR("Unable to retrive Current Context");
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnvx(target, pname, param);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glTexEnviv(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!_gles1_api.glTexEnviv)
+   if (ctx->version != EVAS_GL_GLES_1_X)
      {
-        ERR("Can not call glTexEnviv() in this context!");
+        ERR("Invalid context version %d", (int) ctx->version);
         return;
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnviv(target, pname, params);
-   EVGLD_FUNC_END();
-}
 
-static void
-_evgld_gles1_glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glTexEnvxv)
+   EVGL_FUNC_BEGIN();
+   if (_evgl_direct_enabled())
      {
-        ERR("Can not call glTexEnvxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexEnvxv(target, pname, params);
-   EVGLD_FUNC_END();
-}
+        if (!(rsc->current_ctx->current_fbo) || rsc->current_ctx->map_tex)
+          {
+             if ((!ctx->direct_scissor))
+               {
+                  EVGL_TH_CALL(glEnable, _gles1_api.glEnable, GL_SCISSOR_TEST);
+                  ctx->direct_scissor = 1;
+               }
 
-static void
-_evgld_gles1_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
-{
-   if (!_gles1_api.glTexImage2D)
+             if ((ctx->scissor_updated) && (ctx->scissor_enabled))
+               {
+                  // Recompute the scissor coordinates
+                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                         rsc->direct.rot, 1,
+                                         ctx->scissor_coord[0], ctx->scissor_coord[1],
+                                         ctx->scissor_coord[2], ctx->scissor_coord[3],
+                                         rsc->direct.img.x, rsc->direct.img.y,
+                                         rsc->direct.img.w, rsc->direct.img.h,
+                                         rsc->direct.clip.x, rsc->direct.clip.y,
+                                         rsc->direct.clip.w, rsc->direct.clip.h,
+                                         oc, nc, cc);
+
+                  RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
+                  EVGL_TH_CALL(glScissor, _gles1_api.glScissor, nc[0], nc[1], nc[2], nc[3]);
+
+                  ctx->direct_scissor = 0;
+
+                  // Compute the viewport coordinate
+                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                         rsc->direct.rot, 0,
+                                         x, y, width, height,
+                                         rsc->direct.img.x, rsc->direct.img.y,
+                                         rsc->direct.img.w, rsc->direct.img.h,
+                                         rsc->direct.clip.x, rsc->direct.clip.y,
+                                         rsc->direct.clip.w, rsc->direct.clip.h,
+                                         oc, nc, cc);
+                  EVGL_TH_CALL(glViewport, _gles1_api.glViewport, nc[0], nc[1], nc[2], nc[3]);
+               }
+             else
+               {
+
+                  compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
+                                         rsc->direct.rot, 0,
+                                         x, y, width, height,
+                                         rsc->direct.img.x, rsc->direct.img.y,
+                                         rsc->direct.img.w, rsc->direct.img.h,
+                                         rsc->direct.clip.x, rsc->direct.clip.y,
+                                         rsc->direct.clip.w, rsc->direct.clip.h,
+                                         oc, nc, cc);
+                  EVGL_TH_CALL(glScissor, _gles1_api.glScissor, cc[0], cc[1], cc[2], cc[3]);
+
+                  EVGL_TH_CALL(glViewport, _gles1_api.glViewport, nc[0], nc[1], nc[2], nc[3]);
+               }
+
+             ctx->viewport_direct[0] = nc[0];
+             ctx->viewport_direct[1] = nc[1];
+             ctx->viewport_direct[2] = nc[2];
+             ctx->viewport_direct[3] = nc[3];
+
+             // Keep a copy of the original coordinates
+             ctx->viewport_coord[0] = x;
+             ctx->viewport_coord[1] = y;
+             ctx->viewport_coord[2] = width;
+             ctx->viewport_coord[3] = height;
+
+             ctx->viewport_updated   = 1;
+          }
+        else
+          {
+             if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+               {
+                  EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+                  ctx->direct_scissor = 0;
+               }
+
+             EVGL_TH_CALL(glViewport, _gles1_api.glViewport, x, y, width, height);
+          }
+     }
+   else
      {
-        ERR("Can not call glTexImage2D() in this context!");
-        return;
+        if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
+          {
+             EVGL_TH_CALL(glDisable, _gles1_api.glDisable, GL_SCISSOR_TEST);
+             ctx->direct_scissor = 0;
+          }
+
+        EVGL_TH_CALL(glViewport, _gles1_api.glViewport, x, y, width, height);
      }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-   EVGLD_FUNC_END();
 }
 
-static void
-_evgld_gles1_glTexParameteri(GLenum target, GLenum pname, GLint param)
-{
-   if (!_gles1_api.glTexParameteri)
-     {
-        ERR("Can not call glTexParameteri() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameteri(target, pname, param);
-   EVGLD_FUNC_END();
+//-------------------------------------------------------------//
+// Open GLES 1.0 APIs
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret evgl_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   if (!_gles1_api.name) return (ret)0; \
+   EVGL_FUNC_BEGIN(); \
+   return _gles1_api.name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-static void
-_evgld_gles1_glTexParameterx(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!_gles1_api.glTexParameterx)
-     {
-        ERR("Can not call glTexParameterx() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameterx(target, pname, param);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void evgl_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   if (!_gles1_api.name) return; \
+   EVGL_FUNC_BEGIN(); \
+   _gles1_api.name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
 }
 
-static void
-_evgld_gles1_glTexParameteriv(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!_gles1_api.glTexParameteriv)
-     {
-        ERR("Can not call glTexParameteriv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameteriv(target, pname, params);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret evgl_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   if (!_gles1_api.name) return (ret)0; \
+   EVGL_FUNC_BEGIN(); \
+   return EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles1_api.name, __VA_ARGS__)); \
 }
 
-static void
-_evgld_gles1_glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!_gles1_api.glTexParameterxv)
-     {
-        ERR("Can not call glTexParameterxv() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexParameterxv(target, pname, params);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void evgl_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   if (!_gles1_api.name) return; \
+   EVGL_FUNC_BEGIN(); \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles1_api.name, __VA_ARGS__)); \
 }
 
-static void
-_evgld_gles1_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
-{
-   if (!_gles1_api.glTexSubImage2D)
-     {
-        ERR("Can not call glTexSubImage2D() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-   EVGLD_FUNC_END();
+#include "evas_gl_api_gles1_def.h"
+
+#undef _EVASGL_FUNCTION_PRIVATE_BEGIN
+#undef _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID
+#undef _EVASGL_FUNCTION_BEGIN
+#undef _EVASGL_FUNCTION_BEGIN_VOID
+
+
+//-------------------------------------------------------------//
+// Open GLES 1.0 APIs DEBUG
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN(ret, name, ...) \
+static ret _evgld_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   EVGLD_FUNC_BEGIN(); \
+   ret _a = _evgl_gles1_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
+   EVGLD_FUNC_END(); \
+   return _a; \
 }
 
-static void
-_evgld_gles1_glTranslatex(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!_gles1_api.glTranslatex)
-     {
-        ERR("Can not call glTranslatex() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glTranslatex(x, y, z);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID(name, ...) \
+static void _evgld_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   EVGLD_FUNC_BEGIN(); \
+   _evgl_gles1_##name (_EVASGL_PARAM_NAME(__VA_ARGS__)); \
+   EVGLD_FUNC_END(); \
 }
 
-static void
-_evgld_gles1_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!_gles1_api.glVertexPointer)
-     {
-        ERR("Can not call glVertexPointer() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glVertexPointer(size, type, stride, pointer);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_BEGIN(ret, name, ...) \
+static ret _evgld_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   EVGLD_FUNC_BEGIN(); \
+   ret _a; \
+   _a = EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles1_api.name, __VA_ARGS__)); \
+   EVGLD_FUNC_END(); \
+   return _a; \
 }
 
-static void
-_evgld_gles1_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!_gles1_api.glViewport)
-     {
-        ERR("Can not call glViewport() in this context!");
-        return;
-     }
-   EVGLD_FUNC_BEGIN();
-   _evgl_gles1_glViewport(x, y, width, height);
-   EVGLD_FUNC_END();
+#define _EVASGL_FUNCTION_BEGIN_VOID(name, ...) \
+static void _evgld_gles1_##name (_EVASGL_PARAM_PROTO(__VA_ARGS__)) { \
+   EVGLD_FUNC_BEGIN(); \
+   EVGL_TH_CALL(name, _EVASGL_PARAM_NAME(void, _gles1_api.name, __VA_ARGS__)); \
+   EVGLD_FUNC_END(); \
 }
 
+#include "evas_gl_api_gles1_def.h"
+
+#undef _EVASGL_FUNCTION_PRIVATE_BEGIN
+#undef _EVASGL_FUNCTION_PRIVATE_BEGIN_VOID
+#undef _EVASGL_FUNCTION_BEGIN
+#undef _EVASGL_FUNCTION_BEGIN_VOID
 
 
 static void
@@ -4011,17 +973,13 @@ _evgl_gles1_api_init(void)
    return EINA_TRUE;
 }
 
-#define EVAS_API_OVERRIDE_THREAD_CMD(func, api, prefix) \
-   (api)->func = func##_evgl_api_thread_cmd; \
-   orig_evgl_api_##func = prefix##func
-
 static void
 _debug_gles1_api_get(Evas_GL_API *funcs)
 {
    if (!funcs) return;
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(name) EVAS_API_OVERRIDE_THREAD_CMD(name, funcs, _evgld_gles1_)
+#define ORD(name) EVAS_API_OVERRIDE(name, funcs, _evgld_gles1_)
    /* Available only in Common profile */
    ORD(glAlphaFunc);
    ORD(glClearColor);
@@ -4178,7 +1136,7 @@ _normal_gles1_api_get(Evas_GL_API *funcs)
    if (!funcs) return;
    funcs->version = EVAS_GL_API_VERSION;
 
-#define ORD(name) EVAS_API_OVERRIDE_THREAD_CMD(name, funcs, _evgl_gles1_)
+#define ORD(name) EVAS_API_OVERRIDE(name, funcs, evgl_gles1_)
    /* Available only in Common profile */
    ORD(glAlphaFunc);
    ORD(glClearColor);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_api_gles1_def.h b/src/modules/evas/engines/gl_common/evas_gl_api_gles1_def.h
new file mode 100644 (file)
index 0000000..3790e6d
--- /dev/null
@@ -0,0 +1,145 @@
+_EVASGL_FUNCTION_BEGIN_VOID( glAlphaFunc, GLenum, func, GLclampf, ref )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearDepthf, GLclampf, depth )
+_EVASGL_FUNCTION_BEGIN_VOID( glClipPlanef, GLenum, plane, const GLfloat *, equation )
+_EVASGL_FUNCTION_BEGIN_VOID( glColor4f, GLfloat, red, GLfloat, green, GLfloat, blue, GLfloat, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthRangef, GLclampf, zNear, GLclampf, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glFogf, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glFogfv, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glFrustumf, GLfloat, left, GLfloat, right, GLfloat, bottom, GLfloat, top, GLfloat, zNear, GLfloat, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetClipPlanef, GLenum, pname, GLfloat *, eqn)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetFloatv, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetLightfv, GLenum, light, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetMaterialfv, GLenum, face, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexEnvfv, GLenum, env, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterfv, GLenum, target, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightModelf, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightModelfv, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightf, GLenum, light, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightfv, GLenum, light, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glLineWidth, GLfloat, width )
+_EVASGL_FUNCTION_BEGIN_VOID( glLoadMatrixf, const GLfloat *, m )
+_EVASGL_FUNCTION_BEGIN_VOID( glMaterialf, GLenum, face, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glMaterialfv, GLenum, face, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glMultMatrixf, const GLfloat *, m )
+_EVASGL_FUNCTION_BEGIN_VOID( glMultiTexCoord4f, GLenum, target, GLfloat, s, GLfloat, t, GLfloat, r, GLfloat, q )
+_EVASGL_FUNCTION_BEGIN_VOID( glNormal3f, GLfloat, nx, GLfloat, ny, GLfloat, nz )
+_EVASGL_FUNCTION_BEGIN_VOID( glOrthof, GLfloat, left, GLfloat, right, GLfloat, bottom, GLfloat, top, GLfloat, zNear, GLfloat, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointParameterf, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointParameterfv, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointSize, GLfloat, size )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointSizePointerOES, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glPolygonOffset, GLfloat, factor, GLfloat, units )
+_EVASGL_FUNCTION_BEGIN_VOID( glRotatef, GLfloat, angle, GLfloat, x, GLfloat, y, GLfloat, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glScalef, GLfloat, x, GLfloat, y, GLfloat, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnvf, GLenum, target, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnvfv, GLenum, target, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterf, GLenum, target, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterfv, GLenum, target, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTranslatef, GLfloat, x, GLfloat, y, GLfloat, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glActiveTexture, GLenum, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glAlphaFuncx, GLenum, func, GLclampx, ref )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindBuffer, GLenum, target, GLuint, buffer )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindTexture, GLenum, target, GLuint, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendFunc, GLenum, sfactor, GLenum, dfactor )
+_EVASGL_FUNCTION_BEGIN_VOID( glBufferData, GLenum, target, GLsizeiptr, size, const GLvoid *, data, GLenum, usage )
+_EVASGL_FUNCTION_BEGIN_VOID( glBufferSubData, GLenum, target, GLintptr, offset, GLsizeiptr, size, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearColorx, GLclampx, red, GLclampx, green, GLclampx, blue, GLclampx, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearDepthx, GLclampx, depth )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearStencil, GLint, s )
+_EVASGL_FUNCTION_BEGIN_VOID( glClientActiveTexture, GLenum, texture )
+_EVASGL_FUNCTION_BEGIN_VOID( glClipPlanex, GLenum, plane, const GLfixed *, equation )
+_EVASGL_FUNCTION_BEGIN_VOID( glColor4ub, GLubyte, red, GLubyte, green, GLubyte, blue, GLubyte, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glColor4x, GLfixed, red, GLfixed, green, GLfixed, blue, GLfixed, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glColorMask, GLboolean, red, GLboolean, green, GLboolean, blue, GLboolean, alpha )
+_EVASGL_FUNCTION_BEGIN_VOID( glColorPointer, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexImage2D, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLsizei, imageSize, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLsizei, imageSize, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexImage2D, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLint, border )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN_VOID( glCullFace, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteBuffers, GLsizei, n, const GLuint *, buffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteTextures, GLsizei, n, const GLuint *, textures )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthFunc, GLenum, func )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthMask, GLboolean, flag )
+_EVASGL_FUNCTION_BEGIN_VOID( glDepthRangex, GLclampx, zNear, GLclampx, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glDisableClientState, GLenum, array )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawArrays, GLenum, mode, GLint, first, GLsizei, count )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElements, GLenum, mode, GLsizei, count, GLenum, type, const GLvoid *, indices )
+_EVASGL_FUNCTION_BEGIN_VOID( glEnableClientState, GLenum, array )
+_EVASGL_FUNCTION_BEGIN_VOID( glFinish )
+_EVASGL_FUNCTION_BEGIN_VOID( glFlush )
+_EVASGL_FUNCTION_BEGIN_VOID( glFogx, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glFogxv, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glFrontFace, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glFrustumx, GLfixed, left, GLfixed, right, GLfixed, bottom, GLfixed, top, GLfixed, zNear, GLfixed, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBooleanv, GLenum, pname, GLboolean *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferParameteriv, GLenum, target, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetClipPlanex, GLenum, pname, GLfixed *, eqn)
+_EVASGL_FUNCTION_BEGIN_VOID( glGenBuffers, GLsizei, n, GLuint *, buffers )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenTextures, GLsizei, n, GLuint *, textures )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetFixedv, GLenum, pname, GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetLightxv, GLenum, light, GLenum, pname, GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetMaterialxv, GLenum, face, GLenum, pname, GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetPointerv, GLenum, pname, GLvoid **, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexEnviv, GLenum, env, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexEnvxv, GLenum, env, GLenum, pname, GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameteriv, GLenum, target, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterxv, GLenum, target, GLenum, pname, GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glHint, GLenum, target, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightModelx, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightModelxv, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightx, GLenum, light, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glLightxv, GLenum, light, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glLineWidthx, GLfixed, width )
+_EVASGL_FUNCTION_BEGIN_VOID( glLoadIdentity )
+_EVASGL_FUNCTION_BEGIN_VOID( glLoadMatrixx, const GLfixed *, m )
+_EVASGL_FUNCTION_BEGIN_VOID( glLogicOp, GLenum, opcode )
+_EVASGL_FUNCTION_BEGIN_VOID( glMaterialx, GLenum, face, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glMaterialxv, GLenum, face, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glMatrixMode, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glMultMatrixx, const GLfixed *, m )
+_EVASGL_FUNCTION_BEGIN_VOID( glMultiTexCoord4x, GLenum, target, GLfixed, s, GLfixed, t, GLfixed, r, GLfixed, q )
+_EVASGL_FUNCTION_BEGIN_VOID( glNormal3x, GLfixed, nx, GLfixed, ny, GLfixed, nz )
+_EVASGL_FUNCTION_BEGIN_VOID( glNormalPointer, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glOrthox, GLfixed, left, GLfixed, right, GLfixed, bottom, GLfixed, top, GLfixed, zNear, GLfixed, zFar )
+_EVASGL_FUNCTION_BEGIN_VOID( glPixelStorei, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointParameterx, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointParameterxv, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glPointSizex, GLfixed, size )
+_EVASGL_FUNCTION_BEGIN_VOID( glPolygonOffsetx, GLfixed, factor, GLfixed, units )
+_EVASGL_FUNCTION_BEGIN_VOID( glPopMatrix )
+_EVASGL_FUNCTION_BEGIN_VOID( glPushMatrix )
+_EVASGL_FUNCTION_BEGIN_VOID( glRotatex, GLfixed, angle, GLfixed, x, GLfixed, y, GLfixed, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glSampleCoverage, GLclampf, value, GLboolean, invert )
+_EVASGL_FUNCTION_BEGIN_VOID( glSampleCoveragex, GLclampx, value, GLboolean, invert )
+_EVASGL_FUNCTION_BEGIN_VOID( glScalex, GLfixed, x, GLfixed, y, GLfixed, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glShadeModel, GLenum, mode )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilFunc, GLenum, func, GLint, ref, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilMask, GLuint, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glStencilOp, GLenum, fail, GLenum, zfail, GLenum, zpass )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexCoordPointer, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnvi, GLenum, target, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnvx, GLenum, target, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnviv, GLenum, target, GLenum, pname, const GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexEnvxv, GLenum, target, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexImage2D, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLenum, format, GLenum, type, const GLvoid *, pixels )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteri, GLenum, target, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterx, GLenum, target, GLenum, pname, GLfixed, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameteriv, GLenum, target, GLenum, pname, const GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterxv, GLenum, target, GLenum, pname, const GLfixed *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexSubImage2D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, const GLvoid *, pixels )
+_EVASGL_FUNCTION_BEGIN_VOID( glTranslatex, GLfixed, x, GLfixed, y, GLfixed, z )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexPointer, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClearColor, GLclampf, red, GLclampf, green, GLclampf, blue, GLclampf, alpha )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glClear, GLbitfield, mask )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDisable, GLenum, cap )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glEnable, GLenum, cap )
+_EVASGL_FUNCTION_PRIVATE_BEGIN( GLenum, glGetError, void )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetIntegerv, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_PRIVATE_BEGIN( const GLubyte *, glGetString, GLenum, name )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReadPixels, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, GLvoid *, pixels )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glScissor, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glViewport, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN( GLboolean, glIsBuffer, GLuint, buffer )
+_EVASGL_FUNCTION_BEGIN( GLboolean, glIsEnabled, GLenum, cap )
+_EVASGL_FUNCTION_BEGIN( GLboolean, glIsTexture, GLuint, texture )
index 9789544..075da31 100644 (file)
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDrawBuffers, (GLsizei n, const GLenum *bufs), (n, bufs))
-_EVASGL_FUNCTION_PRIVATE_BEGIN(const GLubyte *, glGetStringi, (GLenum name, GLuint index), (name, index))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReadBuffer, (GLenum src), (src))
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glDrawBuffers, GLsizei, n, const GLenum *, bufs )
+_EVASGL_FUNCTION_PRIVATE_BEGIN(const GLubyte *, glGetStringi, GLenum, name, GLuint, index )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glReadBuffer, GLenum, src )
 //GLES 3.1
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferParameteri, (GLenum target, GLenum pname, GLint param), (target, pname, param))
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFramebufferParameteriv, (GLenum target, GLenum pname, GLint *params), (target, pname, params))
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferParameteri, GLenum, target, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glGetFramebufferParameteriv, GLenum, target, GLenum, pname, GLint *, params )
 //GLES 3.2
-_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferTexture, (GLenum target, GLenum attachment, GLuint texture, GLint level), (target, attachment, texture, level))
+_EVASGL_FUNCTION_PRIVATE_BEGIN_VOID( glFramebufferTexture, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level)
 
-_EVASGL_FUNCTION_BEGIN_VOID( glBeginQuery, (GLenum target, GLuint id), (target, id))
-_EVASGL_FUNCTION_BEGIN_VOID( glBeginTransformFeedback, (GLenum primitiveMode), (primitiveMode))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindBufferBase, (GLenum target, GLuint index, GLuint buffer), (target, index, buffer))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindBufferRange, (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size), (target, index, buffer, offset, size))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindSampler, (GLuint unit, GLuint sampler), (unit, sampler))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindTransformFeedback, (GLenum target, GLuint id), (target, id))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindVertexArray, (GLuint array), (array))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlitFramebuffer, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter), (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter))
-_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferfi, (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil), (buffer, drawBuffer, depth, stencil))
-_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferfv, (GLenum buffer, GLint drawBuffer, const GLfloat * value), (buffer, drawBuffer, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferiv, (GLenum buffer, GLint drawBuffer, const GLint * value), (buffer, drawBuffer, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferuiv, (GLenum buffer, GLint drawBuffer, const GLuint * value), (buffer, drawBuffer, value))
-_EVASGL_FUNCTION_BEGIN(GLenum, glClientWaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout), (sync, flags, timeout))
-_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexImage3D, (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))
-_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexSubImage3D, (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))
-_EVASGL_FUNCTION_BEGIN_VOID( glCopyBufferSubData, (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size), (readtarget, writetarget, readoffset, writeoffset, size))
-_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexSubImage3D, (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))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteQueries, (GLsizei n, const GLuint * ids), (n, ids))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteSamplers, (GLsizei n, const GLuint * samplers), (n, samplers))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteSync, (GLsync sync), (sync))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteTransformFeedbacks, (GLsizei n, const GLuint *ids), (n, ids))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteVertexArrays, (GLsizei n, const GLuint *arrays), (n, arrays))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawArraysInstanced, (GLenum mode, GLint first, GLsizei count, GLsizei primcount), (mode, first, count, primcount))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsInstanced, (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount), (mode, count, type, indices, primcount))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawRangeElements, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices), (mode, start, end, count, type, indices))
-_EVASGL_FUNCTION_BEGIN_VOID( glEndQuery, (GLenum target), (target))
-_EVASGL_FUNCTION_BEGIN_VOID( glEndTransformFeedback, (void), ())
-_EVASGL_FUNCTION_BEGIN(GLsync, glFenceSync, (GLenum condition, GLbitfield flags), (condition, flags))
-_EVASGL_FUNCTION_BEGIN(GLsync, glFlushMappedBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length), (target, offset, length))
-_EVASGL_FUNCTION_BEGIN_VOID( glFramebufferTextureLayer, (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer), (target, attachment, texture, level, layer))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenQueries, (GLsizei n, GLuint * ids), (n, ids))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenSamplers, (GLsizei n, GLuint *samplers), (n, samplers))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenTransformFeedbacks, (GLsizei n, GLuint *ids), (n, ids))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenVertexArrays, (GLsizei n, GLuint *arrays), (n, arrays))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformBlockiv, (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params), (program, uniformBlockIndex, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformBlockName, (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName), (program, uniformBlockIndex, bufSize, length, uniformBlockName))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformsiv, (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params), (program, uniformCount, uniformIndices, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferParameteri64v, (GLenum target, GLenum value, GLint64 * data), (target, value, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferPointerv, (GLenum target, GLenum pname, GLvoid ** params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN(GLint, glGetFragDataLocation, (GLuint program, const char * name), (program,  name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetInteger64i_v, (GLenum target, GLuint index, GLint64 * data), (target, index, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetInteger64v, (GLenum pname, GLint64 * data), (pname, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetIntegeri_v, (GLenum target, GLuint index, GLint * data), (target, index, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetInternalformativ, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params), (target, internalformat, pname, bufSize, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramBinary, (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary), (program, bufsize, length, binaryFormat, binary))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetQueryiv, (GLenum target, GLenum pname, GLint * params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetQueryObjectuiv, (GLuint id, GLenum pname, GLuint * params), (id, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterfv, (GLuint sampler, GLenum pname, GLfloat * params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameteriv, (GLuint sampler, GLenum pname, GLint * params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetSynciv, (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values), (sync, pname, bufSize, length, values))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTransformFeedbackVarying, (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name), (program, index, bufSize, length, size, type, name))
-_EVASGL_FUNCTION_BEGIN(GLuint, glGetUniformBlockIndex, (GLuint program, const GLchar *uniformBlockName), (program, uniformBlockName))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformIndices, (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices), (program, uniformCount, uniformNames, uniformIndices))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformuiv, (GLuint program, GLint location, GLuint* params), (program, location, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribIiv, (GLuint index, GLenum pname, GLint *params), (index, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribIuiv, (GLuint index, GLenum pname, GLuint *params), (index, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glInvalidateFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments), (target, numAttachments, attachments))
-_EVASGL_FUNCTION_BEGIN_VOID( glInvalidateSubFramebuffer, (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height), (target, numAttachments, attachments, x, y, width, height))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsQuery, (GLuint id), (id))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsSampler, (GLuint id), (id))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsSync, (GLsync sync), (sync))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsTransformFeedback, (GLuint id), (id))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsVertexArray, (GLuint array), (array))
-_EVASGL_FUNCTION_BEGIN(void *, glMapBufferRange, (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access), (target, offset, length, access))
-_EVASGL_FUNCTION_BEGIN_VOID( glPauseTransformFeedback, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramBinary, (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length), (program, binaryFormat, binary, length))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramParameteri, (GLuint program, GLenum pname, GLint value), (program, pname, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glRenderbufferStorageMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height), (target, samples, internalformat, width, height))
-_EVASGL_FUNCTION_BEGIN_VOID( glResumeTransformFeedback, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterf, (GLuint sampler, GLenum pname, GLfloat param), (sampler, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterfv, (GLuint sampler, GLenum pname, const GLfloat * params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameteri, (GLuint sampler, GLenum pname, GLint param), (sampler, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameteriv, (GLuint sampler, GLenum pname, const GLint * params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexImage3D, (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data), (target, level, internalFormat, width, height, depth, border, format, type, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage2D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height), (target, levels, internalformat, width, height))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage3D, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth), (target, levels, internalformat, width, height, depth))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glTransformFeedbackVaryings, (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode), (program, count, varyings, bufferMode))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1ui, (GLint location, GLuint v0), (location, v0))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform1uiv, (GLint location, GLsizei count, const GLuint *value), (location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2ui, (GLint location, GLuint v0, GLuint v1), (location, v0, v1))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform2uiv, (GLint location, GLsizei count, const GLuint *value), (location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3ui, (GLint location, GLuint v0, GLuint v1, GLuint v2), (location, v0, v1, v2))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform3uiv, (GLint location, GLsizei count, const GLuint *value), (location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4ui, (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3), (location, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniform4uiv, (GLint location, GLsizei count, const GLuint *value), (location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformBlockBinding, (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding), (program, uniformBlockIndex, uniformBlockBinding))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glUnmapBuffer, (GLenum target), (target))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribDivisor, (GLuint index, GLuint divisor), (index, divisor))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4i, (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3), (index, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4iv, (GLuint index, const GLint *v), (index, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4ui, (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3), (index, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4uiv, (GLuint index, const GLuint *v), (index, v))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribIPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer), (index, size, type, stride, pointer))
-_EVASGL_FUNCTION_BEGIN_VOID( glWaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout), (sync, flags, timeout))
+_EVASGL_FUNCTION_BEGIN_VOID( glBeginQuery, GLenum, target, GLuint, id )
+_EVASGL_FUNCTION_BEGIN_VOID( glBeginTransformFeedback, GLenum, primitiveMode )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindBufferBase, GLenum, target, GLuint, index, GLuint, buffer )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindBufferRange, GLenum, target, GLuint, index, GLuint, buffer, GLintptr, offset, GLsizeiptr, size )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindSampler, GLuint, unit, GLuint, sampler )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindTransformFeedback, GLenum, target, GLuint, id )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindVertexArray, GLuint, array )
+_EVASGL_FUNCTION_BEGIN_VOID( glBlitFramebuffer, GLint, srcX0, GLint, srcY0, GLint, srcX1, GLint, srcY1, GLint, dstX0, GLint, dstY0, GLint, dstX1, GLint, dstY1, GLbitfield, mask, GLenum, filter )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferfi, GLenum, buffer, GLint, drawBuffer, GLfloat, depth, GLint, stencil )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferfv, GLenum, buffer, GLint, drawBuffer, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferiv, GLenum, buffer, GLint, drawBuffer, const GLint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glClearBufferuiv, GLenum, buffer, GLint, drawBuffer, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN(GLenum, glClientWaitSync, GLsync, sync, GLbitfield, flags, uint64_t, timeout )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexImage3D, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLsizei, imageSize, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCompressedTexSubImage3D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLsizei, imageSize, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyBufferSubData, GLenum, readtarget, GLenum, writetarget, GLintptr, readoffset, GLintptr, writeoffset, GLsizeiptr, size )
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyTexSubImage3D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteQueries, GLsizei, n, const GLuint *, ids )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteSamplers, GLsizei, n, const GLuint *, samplers )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteSync, GLsync, sync )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteTransformFeedbacks, GLsizei, n, const GLuint *, ids )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteVertexArrays, GLsizei, n, const GLuint *, arrays )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawArraysInstanced, GLenum, mode, GLint, first, GLsizei, count, GLsizei, primcount )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsInstanced, GLenum, mode, GLsizei, count, GLenum, type, const void *, indices, GLsizei, primcount )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawRangeElements, GLenum, mode, GLuint, start, GLuint, end, GLsizei, count, GLenum, type, const GLvoid *, indices )
+_EVASGL_FUNCTION_BEGIN_VOID( glEndQuery, GLenum, target )
+_EVASGL_FUNCTION_BEGIN_VOID( glEndTransformFeedback )
+_EVASGL_FUNCTION_BEGIN(GLsync, glFenceSync, GLenum, condition, GLbitfield, flags )
+_EVASGL_FUNCTION_BEGIN(GLsync, glFlushMappedBufferRange, GLenum, target, GLintptr, offset, GLsizeiptr, length )
+_EVASGL_FUNCTION_BEGIN_VOID( glFramebufferTextureLayer, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenQueries, GLsizei, n, GLuint *, ids )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenSamplers, GLsizei, n, GLuint *, samplers )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenTransformFeedbacks, GLsizei, n, GLuint *, ids )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenVertexArrays, GLsizei, n, GLuint *, arrays )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformBlockiv, GLuint, program, GLuint, uniformBlockIndex, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformBlockName, GLuint, program, GLuint, uniformBlockIndex, GLsizei, bufSize, GLsizei *, length, GLchar *, uniformBlockName )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetActiveUniformsiv, GLuint, program, GLsizei, uniformCount, const GLuint *, uniformIndices, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferParameteri64v, GLenum, target, GLenum, value, int64_t *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBufferPointerv, GLenum, target, GLenum, pname, GLvoid **, params )
+_EVASGL_FUNCTION_BEGIN(GLint, glGetFragDataLocation, GLuint, program, const char *, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetInteger64i_v, GLenum, target, GLuint, index, int64_t *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetInteger64v, GLenum, pname, int64_t *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetIntegeri_v, GLenum, target, GLuint, index, GLint *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetInternalformativ, GLenum, target, GLenum, internalformat, GLenum, pname, GLsizei, bufSize, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramBinary, GLuint, program, GLsizei, bufsize, GLsizei *, length, GLenum *, binaryFormat, void *, binary )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetQueryiv, GLenum, target, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetQueryObjectuiv, GLuint, id, GLenum, pname, GLuint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterfv, GLuint, sampler, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameteriv, GLuint, sampler, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetSynciv, GLsync, sync, GLenum, pname, GLsizei, bufSize, GLsizei *, length, GLint *, values )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTransformFeedbackVarying, GLuint, program, GLuint, index, GLsizei, bufSize, GLsizei *, length, GLsizei *, size, GLenum *, type, char *, name )
+_EVASGL_FUNCTION_BEGIN(GLuint, glGetUniformBlockIndex, GLuint, program, const GLchar *, uniformBlockName )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformIndices, GLuint, program, GLsizei, uniformCount, const GLchar *const*, uniformNames, GLuint *, uniformIndices )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetUniformuiv, GLuint, program, GLint, location, GLuint*, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribIiv, GLuint, index, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetVertexAttribIuiv, GLuint, index, GLenum, pname, GLuint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glInvalidateFramebuffer, GLenum, target, GLsizei, numAttachments, const GLenum *, attachments )
+_EVASGL_FUNCTION_BEGIN_VOID( glInvalidateSubFramebuffer, GLenum, target, GLsizei, numAttachments, const GLenum *, attachments, GLint, x, GLint, y, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsQuery, GLuint, id )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsSampler, GLuint, id )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsSync, GLsync, sync )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsTransformFeedback, GLuint, id )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsVertexArray, GLuint, array )
+_EVASGL_FUNCTION_BEGIN(void *, glMapBufferRange, GLenum, target, GLintptr, offset, GLsizeiptr, length, GLbitfield, access )
+_EVASGL_FUNCTION_BEGIN_VOID( glPauseTransformFeedback )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramBinary, GLuint, program, GLenum, binaryFormat, const void *, binary, GLsizei, length )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramParameteri, GLuint, program, GLenum, pname, GLint, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glRenderbufferStorageMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN_VOID( glResumeTransformFeedback )
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterf, GLuint, sampler, GLenum, pname, GLfloat, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterfv, GLuint, sampler, GLenum, pname, const GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameteri, GLuint, sampler, GLenum, pname, GLint, param )
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameteriv, GLuint, sampler, GLenum, pname, const GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexImage3D, GLenum, target, GLint, level, GLint, internalFormat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLenum, format, GLenum, type, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage2D, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage3D, GLenum, target, GLsizei, levels, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexSubImage3D, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, const GLvoid *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glTransformFeedbackVaryings, GLuint, program, GLsizei, count, const GLchar *const*, varyings, GLenum, bufferMode )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1ui, GLint, location, GLuint, v0 )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform1uiv, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2ui, GLint, location, GLuint, v0, GLuint, v1 )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform2uiv, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3ui, GLint, location, GLuint, v0, GLuint, v1, GLuint, v2 )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform3uiv, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4ui, GLint, location, GLuint, v0, GLuint, v1, GLuint, v2, GLuint, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniform4uiv, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformBlockBinding, GLuint, program, GLuint, uniformBlockIndex, GLuint, uniformBlockBinding )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2x3fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3x2fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix2x4fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4x2fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix3x4fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glUniformMatrix4x3fv, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glUnmapBuffer, GLenum, target )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribDivisor, GLuint, index, GLuint, divisor )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4i, GLuint, index, GLint, v0, GLint, v1, GLint, v2, GLint, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4iv, GLuint, index, const GLint *, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4ui, GLuint, index, GLuint, v0, GLuint, v1, GLuint, v2, GLuint, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribI4uiv, GLuint, index, const GLuint *, v )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribIPointer, GLuint, index, GLint, size, GLenum, type, GLsizei, stride, const GLvoid *, pointer )
+_EVASGL_FUNCTION_BEGIN_VOID( glWaitSync, GLsync, sync, GLbitfield, flags, uint64_t, timeout )
 
 
 //GLES 3.1
-_EVASGL_FUNCTION_BEGIN_VOID( glDispatchCompute, (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z), (num_groups_x, num_groups_y, num_groups_z))
-_EVASGL_FUNCTION_BEGIN_VOID( glDispatchComputeIndirect, (GLintptr indirect), (indirect))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawArraysIndirect, (GLenum mode, const void *indirect), (mode, indirect))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsIndirect, (GLenum mode, GLenum type, const void *indirect), (mode, type, indirect))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramInterfaceiv, (GLuint program, GLenum programInterface, GLenum pname, GLint *params), (program, programInterface, pname, params))
-_EVASGL_FUNCTION_BEGIN(GLuint, glGetProgramResourceIndex, (GLuint program, GLenum programInterface, const GLchar *name), (program, programInterface, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramResourceName, (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name), (program, programInterface, index, bufSize, length, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramResourceiv, (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params), (program, programInterface, index, propCount, props, bufSize, length, params))
-_EVASGL_FUNCTION_BEGIN(GLint, glGetProgramResourceLocation, (GLuint program, GLenum programInterface, const GLchar *name), (program, programInterface, name))
-_EVASGL_FUNCTION_BEGIN_VOID( glUseProgramStages, (GLuint pipeline, GLbitfield stages, GLuint program), (pipeline, stages, program))
-_EVASGL_FUNCTION_BEGIN_VOID( glActiveShaderProgram, (GLuint pipeline, GLuint program), (pipeline, program))
-_EVASGL_FUNCTION_BEGIN(GLuint, glCreateShaderProgramv, (GLenum type, GLsizei count, const GLchar *const*strings), (type, count, strings))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindProgramPipeline, (GLuint pipeline), (pipeline))
-_EVASGL_FUNCTION_BEGIN_VOID( glDeleteProgramPipelines, (GLsizei n, const GLuint *pipelines), (n, pipelines))
-_EVASGL_FUNCTION_BEGIN_VOID( glGenProgramPipelines, (GLsizei n, GLuint *pipelines), (n, pipelines))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsProgramPipeline, (GLuint pipeline), (pipeline))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramPipelineiv, (GLuint pipeline, GLenum pname, GLint *params), (pipeline, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1i, (GLuint program, GLint location, GLint v0), (program, location, v0))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2i, (GLuint program, GLint location, GLint v0, GLint v1), (program, location, v0, v1))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2), (program, location, v0, v1, v2))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4i, (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3), (program, location, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1ui, (GLuint program, GLint location, GLuint v0), (program, location, v0))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2ui, (GLuint program, GLint location, GLuint v0, GLuint v1), (program, location, v0, v1))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2), (program, location, v0, v1, v2))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4ui, (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3), (program, location, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1f, (GLuint program, GLint location, GLfloat v0), (program, location, v0))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2f, (GLuint program, GLint location, GLfloat v0, GLfloat v1) ,(program, location, v0, v1))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2), (program, location, v0, v1, v2))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4f, (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3), (program, location, v0, v1, v2, v3))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1iv, (GLuint program, GLint location, GLsizei count, const GLint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2iv, (GLuint program, GLint location, GLsizei count, const GLint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3iv, (GLuint program, GLint location, GLsizei count, const GLint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4iv, (GLuint program, GLint location, GLsizei count, const GLint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4uiv, (GLuint program, GLint location, GLsizei count, const GLuint *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4fv, (GLuint program, GLint location, GLsizei count, const GLfloat *value), (program, location, count, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4x2fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3x4fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4x3fv, (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value), (program, location, count, transpose, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glValidateProgramPipeline, (GLuint pipeline), (pipeline))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramPipelineInfoLog, (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog), (pipeline, bufSize, length, infoLog))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindImageTexture, (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format), (unit, texture, level, layered, layer, access, format))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetBooleani_v, (GLenum target, GLuint index, GLboolean *data), (target, index, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glMemoryBarrier, (GLbitfield barriers), (barriers))
-_EVASGL_FUNCTION_BEGIN_VOID( glMemoryBarrierByRegion, (GLbitfield barriers), (barriers))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage2DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations), (target, samples, internalformat, width, height, fixedsamplelocations))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetMultisamplefv, (GLenum pname, GLuint index, GLfloat *val), (pname, index, val))
-_EVASGL_FUNCTION_BEGIN_VOID( glSampleMaski, (GLuint maskNumber, GLbitfield mask), (maskNumber, mask))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params), (target, level, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params), (target, level, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glBindVertexBuffer, (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride), (bindingindex, buffer, offset, stride))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribFormat, (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset), (attribindex, size, type, normalized, relativeoffset))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribIFormat, (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset), (attribindex, size, type, relativeoffset))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribBinding, (GLuint attribindex, GLuint bindingindex), (attribindex, bindingindex))
-_EVASGL_FUNCTION_BEGIN_VOID( glVertexBindingDivisor, (GLuint bindingindex, GLuint divisor), (bindingindex, divisor))
+_EVASGL_FUNCTION_BEGIN_VOID( glDispatchCompute, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z )
+_EVASGL_FUNCTION_BEGIN_VOID( glDispatchComputeIndirect, GLintptr, indirect )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawArraysIndirect, GLenum, mode, const void *, indirect )
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsIndirect, GLenum, mode, GLenum, type, const void *, indirect )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramInterfaceiv, GLuint, program, GLenum, programInterface, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN(GLuint, glGetProgramResourceIndex, GLuint, program, GLenum, programInterface, const GLchar *, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramResourceName, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, bufSize, GLsizei *, length, GLchar *, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramResourceiv, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, propCount, const GLenum *, props, GLsizei, bufSize, GLsizei *, length, GLint *, params )
+_EVASGL_FUNCTION_BEGIN(GLint, glGetProgramResourceLocation, GLuint, program, GLenum, programInterface, const GLchar *, name )
+_EVASGL_FUNCTION_BEGIN_VOID( glUseProgramStages, GLuint, pipeline, GLbitfield, stages, GLuint, program )
+_EVASGL_FUNCTION_BEGIN_VOID( glActiveShaderProgram, GLuint, pipeline, GLuint, program )
+_EVASGL_FUNCTION_BEGIN(GLuint, glCreateShaderProgramv, GLenum, type, GLsizei, count, const GLchar *const*, strings )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindProgramPipeline, GLuint, pipeline )
+_EVASGL_FUNCTION_BEGIN_VOID( glDeleteProgramPipelines, GLsizei, n, const GLuint *, pipelines )
+_EVASGL_FUNCTION_BEGIN_VOID( glGenProgramPipelines, GLsizei, n, GLuint *, pipelines )
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsProgramPipeline, GLuint, pipeline )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramPipelineiv, GLuint, pipeline, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1i, GLuint, program, GLint, location, GLint, v0 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2i, GLuint, program, GLint, location, GLint, v0, GLint, v1 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3i, GLuint, program, GLint, location, GLint, v0, GLint, v1, GLint, v2 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4i, GLuint, program, GLint, location, GLint, v0, GLint, v1, GLint, v2, GLint, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1ui, GLuint, program, GLint, location, GLuint, v0 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2ui, GLuint, program, GLint, location, GLuint, v0, GLuint, v1 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3ui, GLuint, program, GLint, location, GLuint, v0, GLuint, v1, GLuint, v2 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4ui, GLuint, program, GLint, location, GLuint, v0, GLuint, v1, GLuint, v2, GLuint, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1f, GLuint, program, GLint, location, GLfloat, v0 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2f, GLuint, program, GLint, location, GLfloat, v0, GLfloat, v1 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3f, GLuint, program, GLint, location, GLfloat, v0, GLfloat, v1, GLfloat, v2 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4f, GLuint, program, GLint, location, GLfloat, v0, GLfloat, v1, GLfloat, v2, GLfloat, v3 )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1iv, GLuint, program, GLint, location, GLsizei, count, const GLint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2iv, GLuint, program, GLint, location, GLsizei, count, const GLint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3iv, GLuint, program, GLint, location, GLsizei, count, const GLint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4iv, GLuint, program, GLint, location, GLsizei, count, const GLint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1uiv, GLuint, program, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2uiv, GLuint, program, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3uiv, GLuint, program, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4uiv, GLuint, program, GLint, location, GLsizei, count, const GLuint *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform1fv, GLuint, program, GLint, location, GLsizei, count, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform2fv, GLuint, program, GLint, location, GLsizei, count, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform3fv, GLuint, program, GLint, location, GLsizei, count, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniform4fv, GLuint, program, GLint, location, GLsizei, count, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2x3fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3x2fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix2x4fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4x2fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix3x4fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glProgramUniformMatrix4x3fv, GLuint, program, GLint, location, GLsizei, count, GLboolean, transpose, const GLfloat *, value )
+_EVASGL_FUNCTION_BEGIN_VOID( glValidateProgramPipeline, GLuint, pipeline )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetProgramPipelineInfoLog, GLuint, pipeline, GLsizei, bufSize, GLsizei *, length, GLchar *, infoLog )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindImageTexture, GLuint, unit, GLuint, texture, GLint, level, GLboolean, layered, GLint, layer, GLenum, access, GLenum, format )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetBooleani_v, GLenum, target, GLuint, index, GLboolean *, data )
+_EVASGL_FUNCTION_BEGIN_VOID( glMemoryBarrier, GLbitfield, barriers )
+_EVASGL_FUNCTION_BEGIN_VOID( glMemoryBarrierByRegion, GLbitfield, barriers )
+_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage2DMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height, GLboolean, fixedsamplelocations )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetMultisamplefv, GLenum, pname, GLuint, index, GLfloat *, val )
+_EVASGL_FUNCTION_BEGIN_VOID( glSampleMaski, GLuint, maskNumber, GLbitfield, mask )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexLevelParameteriv, GLenum, target, GLint, level, GLenum, pname, GLint *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexLevelParameterfv, GLenum, target, GLint, level, GLenum, pname, GLfloat *, params )
+_EVASGL_FUNCTION_BEGIN_VOID( glBindVertexBuffer, GLuint, bindingindex, GLuint, buffer, GLintptr, offset, GLsizei, stride )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribFormat, GLuint, attribindex, GLint, size, GLenum, type, GLboolean, normalized, GLuint, relativeoffset )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribIFormat, GLuint, attribindex, GLint, size, GLenum, type, GLuint, relativeoffset )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexAttribBinding, GLuint, attribindex, GLuint, bindingindex )
+_EVASGL_FUNCTION_BEGIN_VOID( glVertexBindingDivisor, GLuint, bindingindex, GLuint, divisor )
+
 
 //GLES 3.2
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendBarrier, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glCopyImageSubData, (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth), (srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth))
-_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageControl, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled), (source, type, severity, count, ids, enabled))
-_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageInsert, (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf), (source, type, id, severity, length, buf))
-_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageCallback, (void (*callback)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam), const void *userParam), (callback, userParam))
-_EVASGL_FUNCTION_BEGIN (GLuint, glGetDebugMessageLog, (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog), (count, bufSize, sources, types, ids, severities, lengths, messageLog))
-_EVASGL_FUNCTION_BEGIN_VOID( glPushDebugGroup, (GLenum source, GLuint id, GLsizei length, const GLchar *message),(source, id, length, message))
-_EVASGL_FUNCTION_BEGIN_VOID( glPopDebugGroup, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glObjectLabel, (GLenum identifier, GLuint name, GLsizei length, const GLchar *label),(identifier, name, length, label))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetObjectLabel, (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label), (identifier, name, bufSize, length, label))
-_EVASGL_FUNCTION_BEGIN_VOID( glObjectPtrLabel, (const void *ptr, GLsizei length, const GLchar *label), (ptr, length, label))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetObjectPtrLabel, (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label), (ptr, bufSize, length, label))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetPointerv, (GLenum pname, void **params), (pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glEnablei, (GLenum target, GLuint index), (target, index))
-_EVASGL_FUNCTION_BEGIN_VOID( glDisablei, (GLenum target, GLuint index), (target, index))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationi, (GLuint buf, GLenum mode), (buf, mode))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationSeparatei, (GLuint buf, GLenum modeRGB, GLenum modeAlpha), (buf, modeRGB, modeAlpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendFunci, (GLuint buf, GLenum src, GLenum dst), (buf, src, dst))
-_EVASGL_FUNCTION_BEGIN_VOID( glBlendFuncSeparatei, (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha), (buf, srcRGB, dstRGB, srcAlpha, dstAlpha))
-_EVASGL_FUNCTION_BEGIN_VOID( glColorMaski, (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a), (index, r, g, b, a))
-_EVASGL_FUNCTION_BEGIN(GLboolean, glIsEnabledi, (GLenum target, GLuint index), (target, index))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsBaseVertex, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex), (mode, count, type, indices, basevertex))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawRangeElementsBaseVertex, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex), (mode, start, end, count, type, indices, basevertex))
-_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsInstancedBaseVertex, (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex), (mode, count, type, indices, instancecount, basevertex))
-_EVASGL_FUNCTION_BEGIN_VOID( glPrimitiveBoundingBox, (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW), (minX, minY, minZ, minW, maxX, maxY, maxZ, maxW))
-_EVASGL_FUNCTION_BEGIN(GLenum, glGetGraphicsResetStatus, (void), ())
-_EVASGL_FUNCTION_BEGIN_VOID( glReadnPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data), (x, y, width, height, format, type, bufSize, data))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformfv, (GLuint program, GLint location, GLsizei bufSize, GLfloat *params), (program, location, bufSize, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformiv, (GLuint program, GLint location, GLsizei bufSize, GLint *params), (program, location, bufSize, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformuiv, (GLuint program, GLint location, GLsizei bufSize, GLuint *params), (program, location, bufSize, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glMinSampleShading, (GLfloat value), (value))
-_EVASGL_FUNCTION_BEGIN_VOID( glPatchParameteri, (GLenum pname, GLint value), (pname, value))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterIiv, (GLenum target, GLenum pname, const GLint *params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterIuiv, (GLenum target, GLenum pname, const GLuint *params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterIiv, (GLenum target, GLenum pname, GLint *params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterIuiv, (GLenum target, GLenum pname, GLuint *params), (target, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterIiv, (GLuint sampler, GLenum pname, const GLint *param), (sampler, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterIuiv, (GLuint sampler, GLenum pname, const GLuint *param), (sampler, pname, param))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterIiv, (GLuint sampler, GLenum pname, GLint *params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterIuiv, (GLuint sampler, GLenum pname, GLuint *params), (sampler, pname, params))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexBuffer, (GLenum target, GLenum internalformat, GLuint buffer), (target, internalformat, buffer))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexBufferRange, (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size), (target, internalformat, buffer, offset, size))
-_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage3DMultisample, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations), (target, samples, internalformat, width, height, depth, fixedsamplelocations))
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendBarrier, void)
+_EVASGL_FUNCTION_BEGIN_VOID( glCopyImageSubData, GLuint, srcName, GLenum, srcTarget, GLint, srcLevel, GLint, srcX, GLint, srcY, GLint, srcZ,
+                             GLuint, dstName, GLenum, dstTarget, GLint, dstLevel, GLint, dstX, GLint, dstY, GLint, dstZ,
+                             GLsizei, srcWidth, GLsizei, srcHeight, GLsizei, srcDepth)
+_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageControl, GLenum, source, GLenum, type, GLenum, severity, GLsizei, count, const GLuint *, ids, GLboolean, enabled)
+_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageInsert, GLenum, source, GLenum, type, GLuint, id, GLenum, severity, GLsizei, length, const GLchar *, buf)
+_EVASGL_FUNCTION_BEGIN_VOID( glDebugMessageCallback, GLDEBUGPROC, callback, const void *, userParam)
+_EVASGL_FUNCTION_BEGIN (GLuint, glGetDebugMessageLog, GLuint, count, GLsizei, bufSize, GLenum *, sources, GLenum *, types, GLuint *, ids, GLenum *, severities, GLsizei *, lengths, GLchar *, messageLog)
+_EVASGL_FUNCTION_BEGIN_VOID( glPushDebugGroup, GLenum, source, GLuint, id, GLsizei, length, const GLchar *, message)
+_EVASGL_FUNCTION_BEGIN_VOID( glPopDebugGroup, void)
+_EVASGL_FUNCTION_BEGIN_VOID( glObjectLabel, GLenum, identifier, GLuint, name, GLsizei, length, const GLchar *, label)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetObjectLabel, GLenum, identifier, GLuint, name, GLsizei, bufSize, GLsizei *, length, GLchar *, label)
+_EVASGL_FUNCTION_BEGIN_VOID( glObjectPtrLabel, const void *, ptr, GLsizei, length, const GLchar *, label)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetObjectPtrLabel, const void *, ptr, GLsizei, bufSize, GLsizei *, length, GLchar *, label)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetPointerv, GLenum, pname, void **, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glEnablei, GLenum, target, GLuint, index)
+_EVASGL_FUNCTION_BEGIN_VOID( glDisablei, GLenum, target, GLuint, index)
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationi, GLuint, buf, GLenum, mode)
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendEquationSeparatei, GLuint, buf, GLenum, modeRGB, GLenum, modeAlpha)
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendFunci, GLuint, buf, GLenum, src, GLenum, dst)
+_EVASGL_FUNCTION_BEGIN_VOID( glBlendFuncSeparatei, GLuint, buf, GLenum, srcRGB, GLenum, dstRGB, GLenum, srcAlpha, GLenum, dstAlpha)
+_EVASGL_FUNCTION_BEGIN_VOID( glColorMaski, GLuint, index, GLboolean, r, GLboolean, g, GLboolean, b, GLboolean, a)
+_EVASGL_FUNCTION_BEGIN(GLboolean, glIsEnabledi, GLenum, target, GLuint, index)
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsBaseVertex, GLenum, mode, GLsizei, count, GLenum, type, const void *, indices, GLint, basevertex)
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawRangeElementsBaseVertex, GLenum, mode, GLuint, start, GLuint, end, GLsizei, count, GLenum, type, const void *, indices, GLint, basevertex)
+_EVASGL_FUNCTION_BEGIN_VOID( glDrawElementsInstancedBaseVertex, GLenum, mode, GLsizei, count, GLenum, type, const void *, indices, GLsizei, instancecount, GLint, basevertex)
+_EVASGL_FUNCTION_BEGIN_VOID( glPrimitiveBoundingBox, GLfloat, minX, GLfloat, minY, GLfloat, minZ, GLfloat, minW, GLfloat, maxX, GLfloat, maxY, GLfloat, maxZ, GLfloat, maxW)
+_EVASGL_FUNCTION_BEGIN(GLenum, glGetGraphicsResetStatus, void)
+_EVASGL_FUNCTION_BEGIN_VOID( glReadnPixels, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, GLsizei, bufSize, void *,data)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformfv, GLuint, program, GLint, location, GLsizei, bufSize, GLfloat *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformiv, GLuint, program, GLint, location, GLsizei, bufSize, GLint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetnUniformuiv, GLuint, program, GLint, location, GLsizei, bufSize, GLuint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glMinSampleShading, GLfloat, value)
+_EVASGL_FUNCTION_BEGIN_VOID( glPatchParameteri, GLenum, pname, GLint, value)
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterIiv, GLenum, target, GLenum, pname, const GLint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glTexParameterIuiv, GLenum, target, GLenum, pname, const GLuint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterIiv, GLenum, target, GLenum, pname, GLint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetTexParameterIuiv, GLenum, target, GLenum, pname, GLuint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterIiv, GLuint, sampler, GLenum, pname, const GLint *, param)
+_EVASGL_FUNCTION_BEGIN_VOID( glSamplerParameterIuiv, GLuint, sampler, GLenum, pname, const GLuint *, param)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterIiv, GLuint, sampler, GLenum, pname, GLint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glGetSamplerParameterIuiv, GLuint, sampler, GLenum, pname, GLuint *, params)
+_EVASGL_FUNCTION_BEGIN_VOID( glTexBuffer, GLenum, target, GLenum, internalformat, GLuint, buffer)
+_EVASGL_FUNCTION_BEGIN_VOID( glTexBufferRange, GLenum, target, GLenum, internalformat, GLuint, buffer, GLintptr, offset, GLsizeiptr, size)
+_EVASGL_FUNCTION_BEGIN_VOID( glTexStorage3DMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLboolean, fixedsamplelocations)
index 3147d56..5aeea7d 100644 (file)
@@ -31,6 +31,7 @@
 #  endif
 # else
 #  ifdef GL_GLES
+#   include <EGL/egl.h>
 #   include <GLES2/gl2.h>
 #   include <GLES2/gl2ext.h>
 //#   include <GLES3/gl3.h>
@@ -817,85 +818,87 @@ __evas_gl_errdyn(int err, const char *file, const char *func, int line, const ch
 }
 # define GLERRV(op) \
   { \
-      int __gl_err = glGetError_thread_cmd(); \
+      int __gl_err = GL_TH(glGetError); \
       if (__gl_err != GL_NO_ERROR) \
         __evas_gl_errdyn(__gl_err, __FILE__, __FUNCTION__, __LINE__, op); \
    }
+
 /* Redefine common gl funcs */
 # ifndef GL_ERRORS_NODEF
 #  ifndef GL_ERRORS_TRACE
-#   define GL_ERROR_TRACE(f, _args, ...) do { f(__VA_ARGS__); GLERRV(#f); } while(0)
-#   define GL_ERROR_TRACE_RET(t, f, _args, ...) ({ t _r = f(__VA_ARGS__); GLERRV(#f); _r; })
+#   define GL_ERROR_TRACE(thf, f, _args, ...) do { GL_TH_CALL(thf, f, ##__VA_ARGS__); GLERRV(#f); } while(0)
+#   define GL_ERROR_TRACE_RET(t, thf, f, _args, ...) ({ t _r = GL_TH_CALL(thf, f, ##__VA_ARGS__); GLERRV(#f); _r; })
 #  else
-#   define GL_ERROR_TRACE(f, _args, ...) do { DBG("%s(%s);", #f, _args); f(__VA_ARGS__); GLERRV(#f); } while(0)
-#   define GL_ERROR_TRACE_RET(t, f, _args, ...) ({ t _r; DBG("%s(%s);", #f, _args); _r = f(__VA_ARGS__); GLERRV(#f); _r; })
+#   define GL_ERROR_TRACE(thf, f, _args, ...) do { DBG("%s(%s);", #f, _args); GL_TH_CALL(thf, f, __VA_ARGS__); GLERRV(#f); } while(0)
+#   define GL_ERROR_TRACE_RET(t, thf, f, _args, ...) ({ t _r; DBG("%s(%s);", #f, _args); _r = GL_TH_CALL(thf, f, __VA_ARGS__); GLERRV(#f); _r; })
 #  endif
-#  define glActiveTexture(...) GL_ERROR_TRACE(glActiveTexture_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBindAttribLocation(...) GL_ERROR_TRACE(glBindAttribLocation_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBindBuffer(...) GL_ERROR_TRACE(glBindBuffer_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBindTexture(...) GL_ERROR_TRACE(glBindTexture_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBlendFunc(...) GL_ERROR_TRACE(glBlendFunc_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBufferData(...) GL_ERROR_TRACE(glBufferData_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glCompressedTexSubImage2D(...) GL_ERROR_TRACE(glCompressedTexSubImage2D_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glDeleteBuffers(...) GL_ERROR_TRACE(glDeleteBuffers_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glDepthMask(...) GL_ERROR_TRACE(glDepthMask_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glDisable(...) GL_ERROR_TRACE(glDisable_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glDisableVertexAttribArray(...) GL_ERROR_TRACE(glDisableVertexAttribArray_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glDrawArrays(...) GL_ERROR_TRACE(glDrawArrays_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glEnable(...) GL_ERROR_TRACE(glEnable_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glEnableVertexAttribArray(...) GL_ERROR_TRACE(glEnableVertexAttribArray_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGenBuffers(...) GL_ERROR_TRACE(glGenBuffers_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetFloatv(...) GL_ERROR_TRACE(glGetFloatv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetIntegerv(...) GL_ERROR_TRACE(glGetIntegerv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetUniformLocation(...) GL_ERROR_TRACE_RET(GLuint, glGetUniformLocation_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glHint(...) GL_ERROR_TRACE(glHint_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glReadPixels(...) GL_ERROR_TRACE(glReadPixels_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glScissor(...) GL_ERROR_TRACE(glScissor_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGenFramebuffers(...) GL_ERROR_TRACE(glGenFramebuffers_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glBindFramebuffer(...) GL_ERROR_TRACE(glBindFramebuffer_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glEndTiling(...) GL_ERROR_TRACE(glEndTiling_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetProgramBinary(...) GL_ERROR_TRACE(glGetProgramBinary_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glMapBuffer(...) GL_ERROR_TRACE_RET(void *, glMapBuffer_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glStartTiling(...) GL_ERROR_TRACE(glStartTiling_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUnmapBuffer(...) GL_ERROR_TRACE(glUnmapBuffer_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glTexParameterf(...) GL_ERROR_TRACE(glTexParameterf_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glTexParameteri(...) GL_ERROR_TRACE(glTexParameteri_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glTexSubImage2D(...) GL_ERROR_TRACE(glTexSubImage2D_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUniform1f(...) GL_ERROR_TRACE(glUniform1f_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUniform1i(...) GL_ERROR_TRACE(glUniform1i_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUniform2fv(...) GL_ERROR_TRACE(glUniform2fv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUniform4fv(...) GL_ERROR_TRACE(glUniform4fv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUniformMatrix4fv(...) GL_ERROR_TRACE(glUniformMatrix4fv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glUseProgram(...) GL_ERROR_TRACE(glUseProgram_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glVertexAttribPointer(...) GL_ERROR_TRACE(glVertexAttribPointer_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glViewport(...) GL_ERROR_TRACE(glViewport_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glPixelStorei(...) GL_ERROR_TRACE(glPixelStorei_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glCompressedTexImage2D(...) GL_ERROR_TRACE(glCompressedTexImage2D_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glCreateShader(...) GL_ERROR_TRACE_RET(GLuint, glCreateShader_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glCreateProgram(...) GL_ERROR_TRACE_RET(GLuint, glCreateProgram_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glAttachShader(...) GL_ERROR_TRACE(glAttachShader_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glLinkProgram(...) GL_ERROR_TRACE(glLinkProgram_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetProgramiv(...) GL_ERROR_TRACE(glGetProgramiv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetProgramInfoLog(...) GL_ERROR_TRACE(glGetProgramInfoLog_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glGetShaderiv(...) GL_ERROR_TRACE(glGetShaderiv_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glShaderSource(...) GL_ERROR_TRACE(glShaderSource_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glCompileShader(...) GL_ERROR_TRACE(glCompileShader_thread_cmd, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glGenFramebuffers(...) GL_ERROR_TRACE(glsym_glGenFramebuffers, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glBindFramebuffer(...) GL_ERROR_TRACE(glsym_glBindFramebuffer, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glFramebufferTexture2D(...) GL_ERROR_TRACE(glsym_glFramebufferTexture2D, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glDeleteFramebuffers(...) GL_ERROR_TRACE(glsym_glDeleteFramebuffers, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glGetProgramBinary(...) GL_ERROR_TRACE(glsym_glGetProgramBinary, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glProgramBinary(...) GL_ERROR_TRACE(glsym_glProgramBinary, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glProgramParameteri(...) GL_ERROR_TRACE(glsym_glProgramParameteri, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glReleaseShaderCompiler(...) GL_ERROR_TRACE(glsym_glReleaseShaderCompiler, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glMapBuffer(...) GL_ERROR_TRACE_RET(void *, glsym_glMapBuffer, #__VA_ARGS__, __VA_ARGS__)
-#  define glsym_glUnmapBuffer(...) GL_ERROR_TRACE_RET(unsigned int, glsym_glUnmapBuffer, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_eglCreateImage(...) GL_ERROR_TRACE_RET(void *, secsym_eglCreateImage, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_eglDestroyImage(...) GL_ERROR_TRACE_RET(unsigned int, secsym_eglDestroyImage, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_glEGLImageTargetTexture2DOES(...) GL_ERROR_TRACE(secsym_glEGLImageTargetTexture2DOES, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_eglMapImageSEC(...) GL_ERROR_TRACE_RET(void *, secsym_eglMapImageSEC, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_eglUnmapImageSEC(...) GL_ERROR_TRACE_RET(unsigned int, secsym_eglUnmapImageSEC, #__VA_ARGS__, __VA_ARGS__)
-#  define secsym_eglGetImageAttribSEC(...) GL_ERROR_TRACE_RET(unsigned int, secsym_eglGetImageAttribSEC, #__VA_ARGS__, __VA_ARGS__)
+#  define glActiveTexture(...) GL_ERROR_TRACE(glActiveTexture, glActiveTexture, #__VA_ARGS__, __VA_ARGS__)
+#  define glBindAttribLocation(...) GL_ERROR_TRACE(glBindAttribLocation, glBindAttribLocation, #__VA_ARGS__, __VA_ARGS__)
+#  define glBindBuffer(...) GL_ERROR_TRACE(glBindBuffer, glBindBuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glBindTexture(...) GL_ERROR_TRACE(glBindTexture, glBindTexture, #__VA_ARGS__, __VA_ARGS__)
+#  define glBlendFunc(...) GL_ERROR_TRACE(glBlendFunc, glBlendFunc, #__VA_ARGS__, __VA_ARGS__)
+#  define glBufferData(...) GL_ERROR_TRACE(glBufferData, glBufferData, #__VA_ARGS__, __VA_ARGS__)
+#  define glCompressedTexSubImage2D(...) GL_ERROR_TRACE(glCompressedTexSubImage2D, glCompressedTexSubImage2D, #__VA_ARGS__, __VA_ARGS__)
+#  define glDeleteBuffers(...) GL_ERROR_TRACE(glDeleteBuffers, glDeleteBuffers, #__VA_ARGS__, __VA_ARGS__)
+#  define glDepthMask(...) GL_ERROR_TRACE(glDepthMask, glDepthMask, #__VA_ARGS__, __VA_ARGS__)
+#  define glDisable(...) GL_ERROR_TRACE(glDisable, glDisable, #__VA_ARGS__, __VA_ARGS__)
+#  define glDisableVertexAttribArray(...) GL_ERROR_TRACE(glDisableVertexAttribArray, glDisableVertexAttribArray, #__VA_ARGS__, __VA_ARGS__)
+#  define glDrawArrays(...) GL_ERROR_TRACE(glDrawArrays, glDrawArrays, #__VA_ARGS__, __VA_ARGS__)
+#  define glEnable(...) GL_ERROR_TRACE(glEnable, glEnable, #__VA_ARGS__, __VA_ARGS__)
+#  define glEnableVertexAttribArray(...) GL_ERROR_TRACE(glEnableVertexAttribArray, glEnableVertexAttribArray, #__VA_ARGS__, __VA_ARGS__)
+#  define glGenBuffers(...) GL_ERROR_TRACE(glGenBuffers, glGenBuffers, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetFloatv(...) GL_ERROR_TRACE(glGetFloatv, glGetFloatv, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetIntegerv(...) GL_ERROR_TRACE(glGetIntegerv, glGetIntegerv, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetUniformLocation(...) GL_ERROR_TRACE_RET(GLuint, glGetUniformLocation, #__VA_ARGS__, __VA_ARGS__)
+#  define glHint(...) GL_ERROR_TRACE(glHint, glHint, #__VA_ARGS__, __VA_ARGS__)
+#  define glReadPixels(...) GL_ERROR_TRACE(glReadPixels, glReadPixels, #__VA_ARGS__, __VA_ARGS__)
+#  define glScissor(...) GL_ERROR_TRACE(glScissor, glScissor, #__VA_ARGS__, __VA_ARGS__)
+#  define glGenFramebuffers(...) GL_ERROR_TRACE(glGenFramebuffers, glGenFramebuffers, #__VA_ARGS__, __VA_ARGS__)
+#  define glBindFramebuffer(...) GL_ERROR_TRACE(glBindFramebuffer, glBindFramebuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glEndTiling(...) GL_ERROR_TRACE(glEndTiling, glEndTiling, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetProgramBinary(...) GL_ERROR_TRACE(glGetProgramBinary, glGetProgramBinary, #__VA_ARGS__, __VA_ARGS__)
+#  define glMapBuffer(...) GL_ERROR_TRACE_RET(void *, glMapBuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glStartTiling(...) GL_ERROR_TRACE(glStartTiling, glStartTiling, #__VA_ARGS__, __VA_ARGS__)
+#  define glUnmapBuffer(...) GL_ERROR_TRACE(glUnmapBuffer, glUnmapBuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glTexParameterf(...) GL_ERROR_TRACE(glTexParameterf, glTexParameterf, #__VA_ARGS__, __VA_ARGS__)
+#  define glTexParameteri(...) GL_ERROR_TRACE(glTexParameteri, glTexParameteri, #__VA_ARGS__, __VA_ARGS__)
+#  define glTexSubImage2D(...) GL_ERROR_TRACE(glTexSubImage2D, glTexSubImage2D, #__VA_ARGS__, __VA_ARGS__)
+#  define glUniform1f(...) GL_ERROR_TRACE(glUniform1f, glUniform1f, #__VA_ARGS__, __VA_ARGS__)
+#  define glUniform1i(...) GL_ERROR_TRACE(glUniform1i, glUniform1i, #__VA_ARGS__, __VA_ARGS__)
+#  define glUniform2fv(...) GL_ERROR_TRACE(glUniform2fv, glUniform2fv, #__VA_ARGS__, __VA_ARGS__)
+#  define glUniform4fv(...) GL_ERROR_TRACE(glUniform4fv, glUniform4fv, #__VA_ARGS__, __VA_ARGS__)
+#  define glUniformMatrix4fv(...) GL_ERROR_TRACE(glUniformMatrix4fv, glUniformMatrix4fv, #__VA_ARGS__, __VA_ARGS__)
+#  define glUseProgram(...) GL_ERROR_TRACE(glUseProgram, glUseProgram, #__VA_ARGS__, __VA_ARGS__)
+#  define glVertexAttribPointer(...) GL_ERROR_TRACE(glVertexAttribPointer, glVertexAttribPointer, #__VA_ARGS__, __VA_ARGS__)
+#  define glViewport(...) GL_ERROR_TRACE(glViewport, glViewport, #__VA_ARGS__, __VA_ARGS__)
+#  define glPixelStorei(...) GL_ERROR_TRACE(glPixelStorei, glPixelStorei, #__VA_ARGS__, __VA_ARGS__)
+#  define glCompressedTexImage2D(...) GL_ERROR_TRACE(glCompressedTexImage2D, glCompressedTexImage2D, #__VA_ARGS__, __VA_ARGS__)
+#  define glCreateShader(...) GL_ERROR_TRACE_RET(GLuint, glCreateShader, #__VA_ARGS__, __VA_ARGS__)
+#  define glCreateProgram(...) GL_ERROR_TRACE_RET(GLuint, glCreateProgram, #__VA_ARGS__, __VA_ARGS__)
+#  define glAttachShader(...) GL_ERROR_TRACE(glAttachShader, glAttachShader, #__VA_ARGS__, __VA_ARGS__)
+#  define glLinkProgram(...) GL_ERROR_TRACE(glLinkProgram, glLinkProgram, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetProgramiv(...) GL_ERROR_TRACE(glGetProgramiv, glGetProgramiv, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetProgramInfoLog(...) GL_ERROR_TRACE(glGetProgramInfoLog, glGetProgramInfoLog, #__VA_ARGS__, __VA_ARGS__)
+#  define glGetShaderiv(...) GL_ERROR_TRACE(glGetShaderiv, glGetShaderiv, #__VA_ARGS__, __VA_ARGS__)
+#  define glShaderSource(...) GL_ERROR_TRACE(glShaderSource, glShaderSource, #__VA_ARGS__, __VA_ARGS__)
+#  define glCompileShader(...) GL_ERROR_TRACE(glCompileShader, glCompileShader, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glGenFramebuffers(...) GL_ERROR_TRACE(glGenFramebuffers, glsym_glGenFramebuffers, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glBindFramebuffer(...) GL_ERROR_TRACE(glBindFramebuffer, glsym_glBindFramebuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glFramebufferTexture2D(...) GL_ERROR_TRACE(glFramebufferTexture2D, glsym_glFramebufferTexture2D, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glDeleteFramebuffers(...) GL_ERROR_TRACE(glDeleteFramebuffers, glsym_glDeleteFramebuffers, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glGetProgramBinary(...) GL_ERROR_TRACE(glGetProgramBinary, glsym_glGetProgramBinary, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glProgramBinary(...) GL_ERROR_TRACE(glProgramBinary, glsym_glProgramBinary, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glProgramParameteri(...) GL_ERROR_TRACE(glProgramParameteri, glsym_glProgramParameteri, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glReleaseShaderCompiler(...) GL_ERROR_TRACE(glReleaseShaderCompiler, glsym_glReleaseShaderCompiler, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glMapBuffer(...) GL_ERROR_TRACE_RET(void *, glMapBuffer, glsym_glMapBuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define glsym_glUnmapBuffer(...) GL_ERROR_TRACE_RET(unsigned int, glUnmapBuffer, glsym_glUnmapBuffer, #__VA_ARGS__, __VA_ARGS__)
+#  define eglsym_eglCreateImage(...) GL_ERROR_TRACE_RET(void *, eglCreateImage, eglsym_eglCreateImage, #__VA_ARGS__, __VA_ARGS__)
+#  define eglsym_eglCreateImageKHR(...) GL_ERROR_TRACE_RET(void *, eglCreateImageKHR, eglsym_eglCreateImageKHR, #__VA_ARGS__, __VA_ARGS__)
+#  define secsym_eglDestroyImage(...) GL_ERROR_TRACE_RET(unsigned int, eglDestroyImage, secsym_eglDestroyImage, #__VA_ARGS__, __VA_ARGS__)
+#  define secsym_glEGLImageTargetTexture2DOES(...) GL_ERROR_TRACE(glEGLImageTargetTexture2DOES, secsym_glEGLImageTargetTexture2DOES, #__VA_ARGS__, __VA_ARGS__)
+#  define secsym_eglMapImageSEC(...) GL_ERROR_TRACE_RET(void *, eglMapImageSEC, secsym_eglMapImageSEC, secsym_eglMapImageSEC, #__VA_ARGS__, __VA_ARGS__)
+#  define secsym_eglUnmapImageSEC(...) GL_ERROR_TRACE_RET(unsigned int, eglUnmapImageSEC, secsym_eglUnmapImageSEC, #__VA_ARGS__, __VA_ARGS__)
+#  define secsym_eglGetImageAttribSEC(...) GL_ERROR_TRACE_RET(unsigned int, eglGetImageAttribSEC, secsym_eglGetImageAttribSEC, #__VA_ARGS__, __VA_ARGS__)
 # endif
 #else
 # define GLERRV(op)
index 8647c32..e90e45e 100644 (file)
@@ -33,6 +33,7 @@ GLboolean  (*glsym_glUnmapBuffer)          (GLenum a) = NULL;
 void       (*glsym_glStartTiling)          (GLuint a, GLuint b, GLuint c, GLuint d, GLuint e) = NULL;
 void       (*glsym_glEndTiling)            (GLuint a) = NULL;
 
+
 #ifdef GL_GLES
 
 # ifndef GL_LINE_SMOOTH
@@ -70,13 +71,6 @@ typedef void (*_eng_fn) (void);
 typedef _eng_fn (*glsym_func_eng_fn) ();
 #endif
 
-#define REPLACE_THREAD(prefix, dst, typ) \
-   if (prefix##dst && prefix##dst != (typ) dst##_thread_cmd) \
-     { \
-        dst##_orig_evas_set(prefix##dst); \
-        prefix##dst = (typ) dst##_thread_cmd; \
-     }
-
 static int dbgflushnum = -1;
 
 static void
@@ -108,7 +102,6 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
 #ifdef GL_GLES
    FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
    FINDSYM2(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
-   REPLACE_THREAD(glsym_, glGenFramebuffers, glsym_func_void);
    FALLBAK(glsym_glGenFramebuffers, glsym_func_void);
 #else
    FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersEXT", glsym_func_void);
@@ -116,14 +109,12 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
    // nvidia tegra3 drivers seem to not expose via getprocaddress, but dlsym finds it
    FINDSYM2(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
-   REPLACE_THREAD(glsym_, glGenFramebuffers, glsym_func_void);
    FALLBAK(glsym_glGenFramebuffers, glsym_func_void);
 #endif
 
 #ifdef GL_GLES
    FINDSYM(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
    FINDSYM2(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
-   REPLACE_THREAD(glsym_, glBindFramebuffer, glsym_func_void);
    FALLBAK(glsym_glBindFramebuffer, glsym_func_void);
 #else
    FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferEXT", glsym_func_void);
@@ -131,7 +122,6 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
    // nvidia tegra3 drivers seem to not expose via getprocaddress, but dlsym finds it
    FINDSYM2(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
-   REPLACE_THREAD(glsym_, glBindFramebuffer, glsym_func_void);
    FALLBAK(glsym_glBindFramebuffer, glsym_func_void);
 #endif
 
@@ -140,7 +130,6 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void);
    // nvidia tegra3 drivers seem to not expose via getprocaddress, but dlsym finds it
    FINDSYM2(glsym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void);
-   REPLACE_THREAD(glsym_, glFramebufferTexture2D, glsym_func_void);
    FALLBAK(glsym_glFramebufferTexture2D, glsym_func_void);
 
    FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersEXT", glsym_func_void);
@@ -148,7 +137,6 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffers", glsym_func_void);
    // nvidia tegra3 drivers seem to not expose via getprocaddress, but dlsym finds it
    FINDSYM2(glsym_glDeleteFramebuffers, "glDeleteFramebuffers", glsym_func_void);
-   REPLACE_THREAD(glsym_, glDeleteFramebuffers, glsym_func_void);
    FALLBAK(glsym_glDeleteFramebuffers, glsym_func_void);
 
    FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void);
@@ -156,35 +144,29 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void);
    FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void);
    FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void);
-   REPLACE_THREAD(glsym_, glGetProgramBinary, glsym_func_void);
 
    FINDSYM(glsym_glProgramBinary, "glProgramBinaryOES", glsym_func_void);
    FINDSYM(glsym_glProgramBinary, "glProgramBinaryKHR", glsym_func_void);
    FINDSYM(glsym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void);
    FINDSYM(glsym_glProgramBinary, "glProgramBinaryARB", glsym_func_void);
    FINDSYM(glsym_glProgramBinary, "glProgramBinary", glsym_func_void);
-   REPLACE_THREAD(glsym_, glProgramBinary, glsym_func_void);
 
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void);
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void);
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void);
-   REPLACE_THREAD(glsym_, glProgramParameteri, glsym_func_void);
 
    FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompilerEXT", glsym_func_void);
    FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompilerARB", glsym_func_void);
    FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void);
    FINDSYM2(glsym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void);
-   REPLACE_THREAD(glsym_, glReleaseShaderCompiler, glsym_func_void);
    FALLBAK(glsym_glReleaseShaderCompiler, glsym_func_void);
 
    FINDSYM(glsym_glStartTiling, "glStartTilingQCOM", glsym_func_void);
    FINDSYM(glsym_glStartTiling, "glStartTiling", glsym_func_void);
    FINDSYM(glsym_glStartTiling, "glActivateTileQCOM", glsym_func_void);
-   REPLACE_THREAD(glsym_, glStartTiling, glsym_func_void);
 
    FINDSYM(glsym_glEndTiling, "glEndTilingQCOM", glsym_func_void);
    FINDSYM(glsym_glEndTiling, "glEndTiling", glsym_func_void);
-   REPLACE_THREAD(glsym_, glEndTiling, glsym_func_void);
 
    if (!getenv("EVAS_GL_MAPBUFFER_DISABLE"))
      {
@@ -193,14 +175,12 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
         FINDSYM(glsym_glMapBuffer, "glMapBufferARB", glsym_func_void_ptr);
         FINDSYM(glsym_glMapBuffer, "glMapBufferKHR", glsym_func_void_ptr);
         FINDSYM(glsym_glMapBuffer, "glMapBuffer", glsym_func_void_ptr);
-        REPLACE_THREAD(glsym_, glMapBuffer, glsym_func_void_ptr);
 
         FINDSYM(glsym_glUnmapBuffer, "glUnmapBufferOES", glsym_func_boolean);
         FINDSYM(glsym_glUnmapBuffer, "glUnmapBufferEXT", glsym_func_boolean);
         FINDSYM(glsym_glUnmapBuffer, "glUnmapBufferARB", glsym_func_boolean);
         FINDSYM(glsym_glUnmapBuffer, "glUnmapBufferKHR", glsym_func_boolean);
         FINDSYM(glsym_glUnmapBuffer, "glUnmapBuffer", glsym_func_boolean);
-        REPLACE_THREAD(glsym_, glUnmapBuffer, glsym_func_boolean);
      }
 
 #ifdef GL_GLES
@@ -227,10 +207,8 @@ evas_gl_symbols(void *(*GetProcAddress)(const char *name))
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void);
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void);
    FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void);
-   REPLACE_THREAD(glsym_, glProgramParameteri, glsym_func_void);
 
    FINDSYM(secsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void);
-   REPLACE_THREAD(secsym_, glEGLImageTargetTexture2DOES, glsym_func_void);
 
    FINDSYM(secsym_eglMapImageSEC, "eglMapImageSEC", secsym_func_void_ptr);
 
@@ -304,7 +282,7 @@ __evas_gl_err(int err, const char *file, const char *func, int line, const char
 #ifdef GL_INVALID_FRAMEBUFFER_OPERATION
      case GL_INVALID_FRAMEBUFFER_OPERATION:
         {
-           GLenum e = glCheckFramebufferStatus_thread_cmd(GL_FRAMEBUFFER);
+           GLenum e = GL_TH(glCheckFramebufferStatus, GL_FRAMEBUFFER);
            switch (e)
              {
 #ifdef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
@@ -415,7 +393,7 @@ _evas_gl_common_version_check(int *gles_ver)
    * GL_VERSION is used to get the version of the connection
    */
 
-   version = (char *)glGetString_thread_cmd(GL_VERSION);
+   version = (char *)GL_TH(glGetString, GL_VERSION);
    if (!version)
      {
         /* Something is wrong! */
@@ -624,9 +602,9 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc, int pipe, int force_upd
    if (foc == 0)
      {
         if ((rot == 0) || (rot == 180))
-           glViewport_thread_cmd(0, 0, w, h);
+           GL_TH(glViewport, 0, 0, w, h);
         else
-           glViewport_thread_cmd(0, 0, h, w);
+           GL_TH(glViewport, 0, 0, h, w);
         // std matrix
         if (m == 1)
            matrix_ortho(gc->shared->proj,
@@ -650,9 +628,9 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc, int pipe, int force_upd
                        &vx, &vy, &vw, &vh, &ax, &ay);
 
         if ((rot == 0) || (rot == 180))
-           glViewport_thread_cmd(-2 * vx, -2 * vy, vw, vh);
+           GL_TH(glViewport, -2 * vx, -2 * vy, vw, vh);
         else
-           glViewport_thread_cmd(-2 * vy, -2 * vx, vh, vw);
+           GL_TH(glViewport, -2 * vy, -2 * vx, vh, vw);
         if (m == 1)
            matrix_ortho(gc->shared->proj, 0, vw, 0, vh,
                         -1000000.0, 1000000.0,
@@ -674,9 +652,9 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc, int pipe, int force_upd
    if (gc->state.current.prog != PRG_INVALID)
      {
         prog = gc->state.current.prog;
-        glUseProgram_thread_cmd(prog->prog);
-        glUniform1i_thread_cmd(prog->uniform.rotation_id, gc->rot / 90);
-        glUniformMatrix4fv_thread_cmd(prog->uniform.mvp, 1, GL_FALSE, gc->shared->proj);
+        GL_TH(glUseProgram, prog->prog);
+        GL_TH(glUniform1i, prog->uniform.rotation_id, gc->rot / 90);
+        GL_TH(glUniformMatrix4fv, gc->state.current.prog->uniform.mvp, 1, GL_FALSE, gc->shared->proj);
      }
 }
 
@@ -716,7 +694,7 @@ evas_gl_common_context_new(void)
         gc->pipe[i].shader.render_op = EVAS_RENDER_BLEND;
         if (glsym_glMapBuffer && glsym_glUnmapBuffer)
           {
-             glGenBuffers_thread_cmd(1, &gc->pipe[i].array.buffer);
+             GL_TH(glGenBuffers, 1, &gc->pipe[i].array.buffer);
              gc->pipe[i].array.buffer_alloc = 0;
              gc->pipe[i].array.buffer_use = 0;
           }
@@ -727,7 +705,8 @@ evas_gl_common_context_new(void)
         const char *ext;
 
         shared = calloc(1, sizeof(Evas_GL_Shared));
-        ext = (const char *) glGetString_thread_cmd(GL_EXTENSIONS);
+        if (!shared) goto error;
+        ext = (const char *) GL_TH(glGetString, GL_EXTENSIONS);
         if (ext)
           {
              if (getenv("EVAS_GL_INFO"))
@@ -755,7 +734,7 @@ evas_gl_common_context_new(void)
 
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
              if ((strstr(ext, "GL_EXT_texture_filter_anisotropic")))
-               glGetFloatv_thread_cmd(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,
+               GL_TH(glGetFloatv, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,
                            &(shared->info.anisotropic));
 #endif
 #ifdef GL_BGRA
@@ -801,14 +780,14 @@ evas_gl_common_context_new(void)
                   glsym_glEndTiling = NULL;
                }
           }
-        glGetIntegerv_thread_cmd(GL_MAX_TEXTURE_IMAGE_UNITS,
+        GL_TH(glGetIntegerv, GL_MAX_TEXTURE_IMAGE_UNITS,
                       &(shared->info.max_texture_units));
-        glGetIntegerv_thread_cmd(GL_MAX_TEXTURE_SIZE,
+        GL_TH(glGetIntegerv, GL_MAX_TEXTURE_SIZE,
                       &(shared->info.max_texture_size));
         shared->info.max_vertex_elements = 6 * 100000;
 #ifdef GL_MAX_ELEMENTS_VERTICES
 /* only applies to glDrawRangeElements. don't really need to get it.
-        glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,
+        GL_TH(glGetIntegerv, GL_MAX_ELEMENTS_VERTICES,
                       &(shared->info.max_vertex_elements));
  */
 #endif
@@ -828,7 +807,7 @@ evas_gl_common_context_new(void)
         shared->info.tune.atlas.max_memcpy_size      = DEF_ATLAS_MEMCPY;
 
         // per gpu hacks. based on impirical measurement of some known gpu's
-        s = (const char *)glGetString_thread_cmd(GL_RENDERER);
+        s = (const char *)GL_TH(glGetString, GL_RENDERER);
         if (s)
           {
              if      (strstr(s, "PowerVR SGX 540"))
@@ -841,7 +820,7 @@ evas_gl_common_context_new(void)
         if (!getenv("EVAS_GL_MAPBUFFER"))
           {
              glsym_glMapBuffer = NULL;
-             glsym_glUnmapBuffer= NULL;
+             glsym_glUnmapBuffer = NULL;
           }
 
 #define GETENVOPT(name, tune_param, min, max) \
@@ -874,14 +853,14 @@ evas_gl_common_context_new(void)
         // Detect ECT2 support. We need both RGB and RGBA formats.
           {
              GLint texFormatCnt = 0;
-             glGetIntegerv_thread_cmd(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &texFormatCnt);
+             GL_TH(glGetIntegerv, GL_NUM_COMPRESSED_TEXTURE_FORMATS, &texFormatCnt);
              if (texFormatCnt > 0)
                {
                   GLenum *texFormats = malloc(texFormatCnt * sizeof(GLenum));
                   if (texFormats)
                     {
                        int k, cnt = 0;
-                       glGetIntegerv_thread_cmd(GL_COMPRESSED_TEXTURE_FORMATS, (GLint *) texFormats);
+                       GL_TH(glGetIntegerv, GL_COMPRESSED_TEXTURE_FORMATS, (GLint *) texFormats);
                        for (k = 0; k < texFormatCnt && cnt < 2; k++)
                          {
                             if (texFormats[k] == GL_COMPRESSED_RGB8_ETC2)
@@ -955,32 +934,32 @@ evas_gl_common_context_new(void)
                    (int)shared->info.tune.atlas.max_memcpy_size
                   );
 
-        glDisable_thread_cmd(GL_DEPTH_TEST);
-        glEnable_thread_cmd(GL_DITHER);
-        glDisable_thread_cmd(GL_BLEND);
-        glBlendFunc_thread_cmd(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+        GL_TH(glDisable, GL_DEPTH_TEST);
+        GL_TH(glEnable, GL_DITHER);
+        GL_TH(glDisable, GL_BLEND);
+        GL_TH(glBlendFunc, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
         // no dest alpha
-//        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
-//        glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
-        glDepthMask_thread_cmd(GL_FALSE);
-
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+//        GL_TH(glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
+//        GL_TH(glBlendFunc, GL_SRC_ALPHA, GL_ONE); // ???
+        GL_TH(glDepthMask, GL_FALSE);
+
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
         if (shared->info.anisotropic > 0.0)
-          glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
+          GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
 #endif
 
-        glEnableVertexAttribArray_thread_cmd(SHAD_VERTEX);
-        glEnableVertexAttribArray_thread_cmd(SHAD_COLOR);
+        GL_TH(glEnableVertexAttribArray, SHAD_VERTEX);
+        GL_TH(glEnableVertexAttribArray, SHAD_COLOR);
 
         if (!evas_gl_common_shader_program_init(shared))
           goto error;
 
          if (gc->state.current.prog)
-          glUseProgram_thread_cmd(gc->state.current.prog->prog);
+          GL_TH(glUseProgram, gc->state.current.prog->prog);
 
         // in shader:
         // uniform sampler2D tex[8];
@@ -1029,7 +1008,7 @@ evas_gl_common_context_free(Evas_Engine_GL_Context *gc)
    if (glsym_glMapBuffer && glsym_glUnmapBuffer)
      {
         for (i = 0; i < MAX_PIPES; i++)
-          glDeleteBuffers_thread_cmd(1, &gc->pipe[i].array.buffer);
+          GL_TH(glDeleteBuffers, 1, &gc->pipe[i].array.buffer);
      }
 
    if (gc->shared)
@@ -1172,33 +1151,33 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc)
         gc->pipe[i].shader.ch = 0;
      }
 
-   glDisable_thread_cmd(GL_SCISSOR_TEST);
-   glScissor_thread_cmd(0, 0, 0, 0);
+   GL_TH(glDisable, GL_SCISSOR_TEST);
+   GL_TH(glScissor, 0, 0, 0, 0);
 
-   glDisable_thread_cmd(GL_DEPTH_TEST);
-   glEnable_thread_cmd(GL_DITHER);
-   glDisable_thread_cmd(GL_BLEND);
-   glBlendFunc_thread_cmd(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+   GL_TH(glDisable, GL_DEPTH_TEST);
+   GL_TH(glEnable, GL_DITHER);
+   GL_TH(glDisable, GL_BLEND);
+   GL_TH(glBlendFunc, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    // no dest alpha
-//   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
-//   glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
-   glDepthMask_thread_cmd(GL_FALSE);
-
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+//   GL_TH(glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
+//   GL_TH(glBlendFunc, GL_SRC_ALPHA, GL_ONE); // ???
+   GL_TH(glDepthMask, GL_FALSE);
+
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
    if (shared->info.anisotropic > 0.0)
-     glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
+     GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
 #endif
 
-   glEnableVertexAttribArray_thread_cmd(SHAD_VERTEX);
-   glEnableVertexAttribArray_thread_cmd(SHAD_COLOR);
+   GL_TH(glEnableVertexAttribArray, SHAD_VERTEX);
+   GL_TH(glEnableVertexAttribArray, SHAD_COLOR);
    if (gc->state.current.prog != PRG_INVALID)
-     glUseProgram_thread_cmd(gc->state.current.prog->prog);
+     GL_TH(glUseProgram, gc->state.current.prog->prog);
 
-   glActiveTexture_thread_cmd(GL_TEXTURE0);
+   GL_TH(glActiveTexture, GL_TEXTURE0);
    evas_gl_common_texture_shared_back(gc, NULL);
 
    _evas_gl_common_viewport_set(gc, 0, 1);
@@ -1233,19 +1212,19 @@ evas_gl_common_tiling_start(Evas_Engine_GL_Context *gc EINA_UNUSED,
    switch (rot)
      {
       case 0: // UP this way: ^
-        glsym_glStartTiling(cx, cy, cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cx, cy, cw, ch, bitmask);
         break;
       case 90: // UP this way: <
-        glsym_glStartTiling(gh - (cy + ch), cx, ch, cw, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, gh - (cy + ch), cx, ch, cw, bitmask);
         break;
       case 180: // UP this way: v
-        glsym_glStartTiling(gw - (cx + cw), gh - (cy + ch), cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, gw - (cx + cw), gh - (cy + ch), cw, ch, bitmask);
         break;
       case 270: // UP this way: >
-        glsym_glStartTiling(cy, gw - (cx + cw), ch, cw, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cy, gw - (cx + cw), ch, cw, bitmask);
         break;
       default: // assume up is up
-        glsym_glStartTiling(cx, cy, cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cx, cy, cw, ch, bitmask);
         break;
      }
    GLERRV("glsym_glStartTiling");
@@ -1256,7 +1235,7 @@ evas_gl_common_tiling_done(Evas_Engine_GL_Context *gc EINA_UNUSED)
 {
    if (glsym_glEndTiling)
      {
-        glsym_glEndTiling(GL_COLOR_BUFFER_BIT0_QCOM);
+        GL_TH_CALL(glEndTilingQCOM, glsym_glEndTiling, GL_COLOR_BUFFER_BIT0_QCOM);
         GLERRV("glsym_glEndTiling");
      }
 }
@@ -1269,7 +1248,7 @@ evas_gl_common_context_done(Evas_Engine_GL_Context *gc)
      {
         if (glsym_glEndTiling)
           {
-             glsym_glEndTiling(GL_COLOR_BUFFER_BIT0_QCOM);
+             GL_TH_CALL(glEndTilingQCOM, glsym_glEndTiling, GL_COLOR_BUFFER_BIT0_QCOM);
              GLERRV("glsym_glEndTiling");
           }
         gc->master_clip.used = EINA_FALSE;
@@ -1312,9 +1291,9 @@ evas_gl_common_context_target_surface_set(Evas_Engine_GL_Context *gc,
 # endif
 #endif
    if (gc->pipe[0].shader.surface == gc->def_surface)
-     glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
+      GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, 0);
    else
-        glsym_glBindFramebuffer(GL_FRAMEBUFFER, surface->tex->pt->fb);
+      GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, surface->tex->pt->fb);
    _evas_gl_common_viewport_set(gc, 0, 0);
 }
 
@@ -3213,19 +3192,19 @@ scissor_rot(Evas_Engine_GL_Context *gc EINA_UNUSED,
    switch (rot)
      {
       case 0: // UP this way: ^
-        glScissor_thread_cmd(cx, cy, cw, ch);
+        GL_TH(glScissor, cx, cy, cw, ch);
         break;
       case 90: // UP this way: <
-        glScissor_thread_cmd(gh - (cy + ch), cx, ch, cw);
+        GL_TH(glScissor, gh - (cy + ch), cx, ch, cw);
         break;
       case 180: // UP this way: v
-        glScissor_thread_cmd(gw - (cx + cw), gh - (cy + ch), cw, ch);
+        GL_TH(glScissor, gw - (cx + cw), gh - (cy + ch), cw, ch);
         break;
       case 270: // UP this way: >
-        glScissor_thread_cmd(cy, gw - (cx + cw), ch, cw);
+        GL_TH(glScissor, cy, gw - (cx + cw), ch, cw);
         break;
       default: // assume up is up
-        glScissor_thread_cmd(cx, cy, cw, ch);
+        GL_TH(glScissor, cx, cy, cw, ch);
         break;
      }
 }
@@ -3239,19 +3218,19 @@ start_tiling(Evas_Engine_GL_Context *gc EINA_UNUSED,
    switch (rot)
      {
       case 0: // UP this way: ^
-        glsym_glStartTiling(cx, cy, cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cx, cy, cw, ch, bitmask);
         break;
       case 90: // UP this way: <
-        glsym_glStartTiling(gh - (cy + ch), cx, ch, cw, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, gh - (cy + ch), cx, ch, cw, bitmask);
         break;
       case 180: // UP this way: v
-        glsym_glStartTiling(gw - (cx + cw), gh - (cy + ch), cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, gw - (cx + cw), gh - (cy + ch), cw, ch, bitmask);
         break;
       case 270: // UP this way: >
-        glsym_glStartTiling(cy, gw - (cx + cw), ch, cw, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cy, gw - (cx + cw), ch, cw, bitmask);
         break;
       default: // assume up is up
-        glsym_glStartTiling(cx, cy, cw, ch, bitmask);
+        GL_TH_CALL(glStartTilingQCOM, glsym_glStartTiling, cx, cy, cw, ch, bitmask);
         break;
      }
    GLERRV("glsym_glStartTiling");
@@ -3289,11 +3268,11 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
         GLERRV("<flush err>");
         if (prog && (prog != gc->state.current.prog))
           {
-             glUseProgram_thread_cmd(prog->prog);
+             GL_TH(glUseProgram, prog->prog);
              if (prog->reset)
                {
-                  glUniform1i_thread_cmd(prog->uniform.rotation_id, fbo? 0 : gc->rot / 90);
-                  glUniformMatrix4fv_thread_cmd(prog->uniform.mvp, 1, GL_FALSE, gc->shared->proj);
+                  GL_TH(glUniform1i, prog->uniform.rotation_id, fbo ? 0 : gc->rot / 90);
+                  GL_TH(glUniformMatrix4fv, prog->uniform.mvp, 1, GL_FALSE, gc->shared->proj);
                   prog->reset = EINA_FALSE;
                }
           }
@@ -3303,14 +3282,14 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
 #if 0
              if (gc->pipe[i].shader.cur_tex)
                {
-                  glEnable(GL_TEXTURE_2D);
+                  GL_TH(glEnable, GL_TEXTURE_2D);
                }
              else
                {
-                  glDisable(GL_TEXTURE_2D);
+                  GL_TH(glDisable, GL_TEXTURE_2D);
                }
 #endif
-             glActiveTexture_thread_cmd(GL_TEXTURE0);
+             GL_TH(glActiveTexture, GL_TEXTURE0);
              evas_gl_common_texture_shared_specific(gc, NULL, i);
           }
         if (gc->pipe[i].array.im)
@@ -3318,8 +3297,8 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
 #ifdef GL_GLES
              if (gc->pipe[i].array.im->tex->pt->dyn.img)
                {
-                  secsym_glEGLImageTargetTexture2DOES
-                        (gc->pipe[i].array.im->tex->pt->dyn.target, gc->pipe[i].array.im->tex->pt->dyn.img);
+                   GL_TH_CALL(glEGLImageTargetTexture2DOES, secsym_glEGLImageTargetTexture2DOES,
+                        gc->pipe[i].array.im->tex->pt->dyn.target, gc->pipe[i].array.im->tex->pt->dyn.img);
                }
              else
 #endif
@@ -3338,49 +3317,49 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
              switch (gc->pipe[i].shader.render_op)
                {
                 case EVAS_RENDER_BLEND: /**< default op: d = d*(1-sa) + s */
-                  glBlendFunc_thread_cmd(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+                  GL_TH(glBlendFunc, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
                   break;
                 case EVAS_RENDER_BLEND_REL: /**< d = d*(1 - sa) + s*da */
-                  glBlendFunc_thread_cmd(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                  GL_TH(glBlendFunc, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                   break;
                 case EVAS_RENDER_COPY: /**< d = s */
                   gc->pipe[i].shader.blend = 0;
                   // just disable blend mode. no need to set blend func
-                  //glBlendFunc(GL_ONE, GL_ZERO);
+                  //GL_TH(glBlendFunc, GL_ONE, GL_ZERO);
                   break;
                 case EVAS_RENDER_COPY_REL: /**< d = s*da */
-                  glBlendFunc_thread_cmd(GL_DST_ALPHA, GL_ZERO);
+                  GL_TH(glBlendFunc, GL_DST_ALPHA, GL_ZERO);
                   break;
                 case EVAS_RENDER_ADD: /**< d = d + s */
-                  glBlendFunc_thread_cmd(GL_ONE, GL_ONE);
+                  GL_TH(glBlendFunc, GL_ONE, GL_ONE);
                   break;
                 case EVAS_RENDER_ADD_REL: /**< d = d + s*da */
-                  glBlendFunc_thread_cmd(GL_DST_ALPHA, GL_ONE);
+                  GL_TH(glBlendFunc, GL_DST_ALPHA, GL_ONE);
                   break;
                 case EVAS_RENDER_SUB: /**< d = d - s */
-                  glBlendFunc_thread_cmd(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
+                  GL_TH(glBlendFunc, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
                   break;
                 case EVAS_RENDER_SUB_REL: /**< d = d - s*da */
-                  glBlendFunc_thread_cmd(GL_ZERO, GL_ONE_MINUS_DST_ALPHA);
+                  GL_TH(glBlendFunc, GL_ZERO, GL_ONE_MINUS_DST_ALPHA);
                   break;
                 case EVAS_RENDER_MASK: /**< d = d*sa */
-                  glBlendFunc_thread_cmd(GL_ZERO, GL_SRC_ALPHA);
+                  GL_TH(glBlendFunc, GL_ZERO, GL_SRC_ALPHA);
                   break;
                   // FIXME: fix blend funcs below!
                 case EVAS_RENDER_TINT: /**< d = d*s + d*(1 - sa) + s*(1 - da) */
                 case EVAS_RENDER_TINT_REL: /**< d = d*(1 - sa + s) */
                 case EVAS_RENDER_MUL: /**< d = d*s */
                 default:
-                  glBlendFunc_thread_cmd(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+                  GL_TH(glBlendFunc, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
                   break;
                }
           }
         if (gc->pipe[i].shader.blend != gc->state.current.blend)
           {
              if (gc->pipe[i].shader.blend)
-               glEnable_thread_cmd(GL_BLEND);
+               GL_TH(glEnable, GL_BLEND);
              else
-               glDisable_thread_cmd(GL_BLEND);
+               GL_TH(glDisable, GL_BLEND);
           }
         if ((gc->pipe[i].shader.smooth != gc->state.current.smooth) ||
             (gc->pipe[i].shader.cur_tex != gc->state.current.cur_tex))
@@ -3389,31 +3368,31 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
                {
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
                   if (shared->info.anisotropic > 0.0)
-                    glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
+                    GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
 #endif
                   if (gc->pipe[i].array.im && gc->pipe[i].array.im->native.target == GL_TEXTURE_EXTERNAL_OES)
                     {
-                      glTexParameteri_thread_cmd(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                      glTexParameteri_thread_cmd(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                      GL_TH(glTexParameteri, GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                      GL_TH(glTexParameteri, GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     }
                   else
                     {
-                      glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                      glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                      GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                      GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     }
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                }
              else
                {
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
                   if (shared->info.anisotropic > 0.0)
-                    glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
+                    GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0);
 #endif
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                }
           }
         if (gc->pipe[i].shader.clip != gc->state.current.clip)
@@ -3467,11 +3446,11 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
              if ((gc->pipe[i].shader.clip) ||
                  ((gc->master_clip.enabled) && (!fbo)))
                {
-                  glEnable_thread_cmd(GL_SCISSOR_TEST);
+                  GL_TH(glEnable, GL_SCISSOR_TEST);
                   if (!fbo)
                     scissor_rot(gc, gc->rot, gw, gh, cx, gh - cy - ch, cw, ch);
                   else
-                     glScissor_thread_cmd(cx, cy, cw, ch);
+                     GL_TH(glScissor, cx, cy, cw, ch);
                   setclip = EINA_TRUE;
                   gc->state.current.cx = cx;
                   gc->state.current.cy = cy;
@@ -3480,8 +3459,8 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
                }
              else
                {
-                  glDisable_thread_cmd(GL_SCISSOR_TEST);
-                  glScissor_thread_cmd(0, 0, 0, 0);
+                  GL_TH(glDisable, GL_SCISSOR_TEST);
+                  GL_TH(glScissor, 0, 0, 0, 0);
                   gc->state.current.cx = 0;
                   gc->state.current.cy = 0;
                   gc->state.current.cw = 0;
@@ -3521,7 +3500,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
                   if (!fbo)
                     scissor_rot(gc, gc->rot, gw, gh, cx, gh - cy - ch, cw, ch);
                   else
-                    glScissor_thread_cmd(cx, cy, cw, ch);
+                    GL_TH(glScissor, cx, cy, cw, ch);
                   gc->state.current.cx = cx;
                   gc->state.current.cy = cy;
                   gc->state.current.cw = cw;
@@ -3538,7 +3517,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
         unsigned char *texsam_ptr = NULL;
         unsigned char *mask_ptr = NULL;
         unsigned char *masksam_ptr = NULL;
-        GLint MASK_TEXTURE = GL_TEXTURE0;
+        GLint ACTIVE_TEXTURE = GL_TEXTURE0;
 
         if (glsym_glMapBuffer && glsym_glUnmapBuffer)
           {
@@ -3560,17 +3539,17 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
              masksam_ptr = mask_ptr + MASK_SIZE;
 # define END_POINTER (masksam_ptr + SAM_SIZE)
 
-             glBindBuffer_thread_cmd(GL_ARRAY_BUFFER, gc->pipe[i].array.buffer);
+             GL_TH(glBindBuffer, GL_ARRAY_BUFFER, gc->pipe[i].array.buffer);
              if ((gc->pipe[i].array.buffer_alloc < (long)END_POINTER) ||
                  (gc->pipe[i].array.buffer_use >= (ARRAY_BUFFER_USE + ARRAY_BUFFER_USE_SHIFT * i)))
                {
-                  glBufferData_thread_cmd(GL_ARRAY_BUFFER, (long)END_POINTER, NULL, GL_STATIC_DRAW);
+                  GL_TH(glBufferData, GL_ARRAY_BUFFER, (long)END_POINTER, NULL, GL_STATIC_DRAW);
                   gc->pipe[i].array.buffer_alloc = (long)END_POINTER;
                   gc->pipe[i].array.buffer_use = 0;
                }
              gc->pipe[i].array.buffer_use++;
 
-             x = glsym_glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+             x = GL_TH_CALL(glMapBufferOES, glsym_glMapBuffer, GL_ARRAY_BUFFER, GL_WRITE_ONLY);
              if (x)
                {
                   if (gc->pipe[i].array.use_vertex)
@@ -3608,7 +3587,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
                           gc->pipe[i].array.use_texsam,
                           gc->pipe[i].array.use_texm);
  */
-                  glsym_glUnmapBuffer(GL_ARRAY_BUFFER);
+                  GL_TH_CALL(glUnmapBufferOES, glsym_glUnmapBuffer, GL_ARRAY_BUFFER);
                }
           }
         else
@@ -3625,237 +3604,236 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
           }
 
         // use_vertex is always true
-        glVertexAttribPointer_thread_cmd(SHAD_VERTEX, VERTEX_CNT, GL_SHORT, GL_FALSE, 0, vertex_ptr);
+        GL_TH(glVertexAttribPointer, SHAD_VERTEX, VERTEX_CNT, GL_SHORT, GL_FALSE, 0, vertex_ptr);
 
         if (gc->pipe[i].array.use_color)
           {
-             glEnableVertexAttribArray_thread_cmd(SHAD_COLOR);
-             glVertexAttribPointer_thread_cmd(SHAD_COLOR, COLOR_CNT, GL_UNSIGNED_BYTE, GL_TRUE, 0, color_ptr);
+             GL_TH(glEnableVertexAttribArray, SHAD_COLOR);
+             GL_TH(glVertexAttribPointer, SHAD_COLOR, COLOR_CNT, GL_UNSIGNED_BYTE, GL_TRUE, 0, color_ptr);
           }
         else
-          glDisableVertexAttribArray_thread_cmd(SHAD_COLOR);
+          GL_TH(glDisableVertexAttribArray, SHAD_COLOR);
 
         if (gc->pipe[i].array.line)
           {
              if (gc->pipe[i].array.anti_alias)
                {
-                  glEnable_thread_cmd(GL_BLEND);
-                  glBlendFunc_thread_cmd(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                  glHint_thread_cmd(GL_LINE_SMOOTH, GL_NICEST);
-                  glEnable_thread_cmd(GL_LINE_SMOOTH);
+                  GL_TH(glEnable, GL_BLEND);
+                  GL_TH(glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                  GL_TH(glHint, GL_LINE_SMOOTH, GL_NICEST);
+                  GL_TH(glEnable, GL_LINE_SMOOTH);
                }
              else
                {
-                  glDisable_thread_cmd(GL_LINE_SMOOTH);
+                  GL_TH(glDisable, GL_LINE_SMOOTH);
                }
 
-             glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV);
-             glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV2);
-             glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV3);
-             glDisableVertexAttribArray_thread_cmd(SHAD_TEXA);
-             glDisableVertexAttribArray_thread_cmd(SHAD_TEXSAM);
+             GL_TH(glDisableVertexAttribArray, SHAD_TEXUV);
+             GL_TH(glDisableVertexAttribArray, SHAD_TEXUV2);
+             GL_TH(glDisableVertexAttribArray, SHAD_TEXUV3);
+             GL_TH(glDisableVertexAttribArray, SHAD_TEXA);
+             GL_TH(glDisableVertexAttribArray, SHAD_TEXSAM);
 
              /* kopi pasta from below */
              if (gc->pipe[i].array.use_mask)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_MASK);
-                  glVertexAttribPointer_thread_cmd(SHAD_MASK, MASK_CNT, GL_FLOAT, GL_FALSE, 0, mask_ptr);
-                  glActiveTexture_thread_cmd(MASK_TEXTURE);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm);
+                  GL_TH(glEnableVertexAttribArray, SHAD_MASK);
+                  GL_TH(glVertexAttribPointer, SHAD_MASK, MASK_CNT, GL_FLOAT, GL_FALSE, 0, mask_ptr);
+                  GL_TH(glActiveTexture, ACTIVE_TEXTURE);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm);
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
                   if (shared->info.anisotropic > 0.0)
-                    glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
+                    GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
 #endif
                   if (gc->pipe[i].shader.mask_smooth)
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     }
                   else
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                     }
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-                  glActiveTexture_thread_cmd(GL_TEXTURE0);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glActiveTexture, GL_TEXTURE0);
 
                   if (gc->pipe[i].array.use_masksam)
                     {
-                       glEnableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
-                       glVertexAttribPointer_thread_cmd(SHAD_MASKSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, masksam_ptr);
+                       GL_TH(glEnableVertexAttribArray, SHAD_MASKSAM);
+                       GL_TH(glVertexAttribPointer, SHAD_MASKSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, masksam_ptr);
                     }
-                  else glDisableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
+                  else GL_TH(glDisableVertexAttribArray, SHAD_MASKSAM);
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_MASK);
-                  glDisableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
+                  GL_TH(glDisableVertexAttribArray, SHAD_MASK);
+                  GL_TH(glDisableVertexAttribArray, SHAD_MASKSAM);
                }
 
-             glDrawArrays_thread_cmd(GL_LINES, 0, gc->pipe[i].array.num);
+             GL_TH(glDrawArrays, GL_LINES, 0, gc->pipe[i].array.num);
           }
         else
           {
              if (gc->pipe[i].array.use_texuv)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXUV);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXUV, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv_ptr);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXUV);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXUV, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv_ptr);
 
-                  MASK_TEXTURE += 1;
+                  ACTIVE_TEXTURE += 1;
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV);
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXUV);
                }
 
              /* Alpha plane */
              if (gc->pipe[i].array.use_texa)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXA);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXA, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texa_ptr);
-                  glActiveTexture_thread_cmd(GL_TEXTURE1);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texa);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXA);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXA, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texa_ptr);
+                  GL_TH(glActiveTexture, GL_TEXTURE1);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texa);
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
                   if (shared->info.anisotropic > 0.0)
-                    glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
+                    GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
 #endif
                   if (gc->pipe[i].shader.smooth)
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     }
                   else
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                     }
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-                  glActiveTexture_thread_cmd(GL_TEXTURE0);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glActiveTexture, GL_TEXTURE0);
 
-                  MASK_TEXTURE += 1;
+                  ACTIVE_TEXTURE += 1;
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXA);
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXA);
                }
 
              if (gc->pipe[i].array.use_texsam)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXSAM);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, texsam_ptr);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXSAM);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, texsam_ptr);
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXSAM);
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXSAM);
                }
 
              if ((gc->pipe[i].array.use_texuv2) && (gc->pipe[i].array.use_texuv3))
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXUV2);
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXUV3);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXUV2, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv2_ptr);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXUV3, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv3_ptr);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXUV2);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXUV3);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXUV2, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv2_ptr);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXUV3, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv3_ptr);
 
-                  glActiveTexture_thread_cmd(GL_TEXTURE1);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
+                  GL_TH(glActiveTexture, GL_TEXTURE1);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
 #ifdef GL_GLES
                   if (gc->pipe[i].shader.cur_texu_dyn)
-                    secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
+                    GL_TH_CALL(glEGLImageTargetTexture2DOES, secsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
 #endif
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-                  glActiveTexture_thread_cmd(GL_TEXTURE2);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv);
+                  GL_TH(glActiveTexture, GL_TEXTURE2);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv);
 #ifdef GL_GLES
                   if (gc->pipe[i].shader.cur_texv_dyn)
-                    secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv_dyn);
+                    GL_TH_CALL(glEGLImageTargetTexture2DOES, secsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv_dyn);
 #endif
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-                  glActiveTexture_thread_cmd(GL_TEXTURE0);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glActiveTexture, GL_TEXTURE0);
 
-                  MASK_TEXTURE += 2;
+                  ACTIVE_TEXTURE += 2;
                }
              else if (gc->pipe[i].array.use_texuv2)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_TEXUV2);
-                  glVertexAttribPointer_thread_cmd(SHAD_TEXUV2, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv2_ptr);
+                  GL_TH(glEnableVertexAttribArray, SHAD_TEXUV2);
+                  GL_TH(glVertexAttribPointer, SHAD_TEXUV2, TEX_CNT, GL_FLOAT, GL_FALSE, 0, texuv2_ptr);
 
-                  glActiveTexture_thread_cmd(GL_TEXTURE1);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
+                  GL_TH(glActiveTexture, GL_TEXTURE1);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
 #ifdef GL_GLES
                   if (gc->pipe[i].shader.cur_texu_dyn)
-                    secsym_glEGLImageTargetTexture2DOES
-                          (GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
+                    GL_TH_CALL(glEGLImageTargetTexture2DOES, secsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
 #endif
                   if (gc->pipe[i].shader.smooth)
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                     }
                   else
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                     }
-                  glActiveTexture_thread_cmd(GL_TEXTURE0);
+                  GL_TH(glActiveTexture, GL_TEXTURE0);
 
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV3);
-                  MASK_TEXTURE += 1;
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXUV3);
+                  ACTIVE_TEXTURE += 1;
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV2);
-                  glDisableVertexAttribArray_thread_cmd(SHAD_TEXUV3);
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXUV2);
+                  GL_TH(glDisableVertexAttribArray, SHAD_TEXUV3);
                }
 
              /* Mask surface */
              if (gc->pipe[i].array.use_mask)
                {
-                  glEnableVertexAttribArray_thread_cmd(SHAD_MASK);
-                  glVertexAttribPointer_thread_cmd(SHAD_MASK, MASK_CNT, GL_FLOAT, GL_FALSE, 0, mask_ptr);
-                  glActiveTexture_thread_cmd(MASK_TEXTURE);
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm);
+                  GL_TH(glEnableVertexAttribArray, SHAD_MASK);
+                  GL_TH(glVertexAttribPointer, SHAD_MASK, MASK_CNT, GL_FLOAT, GL_FALSE, 0, mask_ptr);
+                  GL_TH(glActiveTexture, ACTIVE_TEXTURE);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm);
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
                   if (shared->info.anisotropic > 0.0)
-                    glTexParameterf_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
+                    GL_TH(glTexParameterf, GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
 #endif
                   if (gc->pipe[i].shader.mask_smooth)
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     }
                   else
                     {
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-                       glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+                       GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                     }
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                  glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-                  glActiveTexture_thread_cmd(GL_TEXTURE0);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+                  GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+                  GL_TH(glActiveTexture, GL_TEXTURE0);
 
                   if (gc->pipe[i].array.use_masksam)
                     {
-                       glEnableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
-                       glVertexAttribPointer_thread_cmd(SHAD_MASKSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, masksam_ptr);
+                       GL_TH(glEnableVertexAttribArray, SHAD_MASKSAM);
+                       GL_TH(glVertexAttribPointer, SHAD_MASKSAM, SAM_CNT, GL_FLOAT, GL_FALSE, 0, masksam_ptr);
                     }
-                  else glDisableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
+                  else GL_TH(glDisableVertexAttribArray, SHAD_MASKSAM);
                }
              else
                {
-                  glDisableVertexAttribArray_thread_cmd(SHAD_MASK);
-                  glDisableVertexAttribArray_thread_cmd(SHAD_MASKSAM);
+                  GL_TH(glDisableVertexAttribArray, SHAD_MASK);
+                  GL_TH(glDisableVertexAttribArray, SHAD_MASKSAM);
                }
 
              if (dbgflushnum == 1)
@@ -3873,7 +3851,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
                          types[gc->pipe[i].region.type]
                          );
                }
-             glDrawArrays_thread_cmd(GL_TRIANGLES, 0, gc->pipe[i].array.num);
+             GL_TH(glDrawArrays, GL_TRIANGLES, 0, gc->pipe[i].array.num);
           }
         if (gc->pipe[i].array.im)
           {
@@ -3905,7 +3883,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
 
         if (glsym_glMapBuffer && glsym_glUnmapBuffer)
           {
-             glBindBuffer_thread_cmd(GL_ARRAY_BUFFER, 0);
+             GL_TH(glBindBuffer, GL_ARRAY_BUFFER, 0);
           }
      }
 
@@ -3967,36 +3945,38 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
 typedef struct
 {
    Evas_Engine_GL_Context *gc;
-} Evas_Thread_Command_shader_array_flush;
+} GL_TH_ST(shader_array_flush);
 
 static void
-_gl_thread_shader_array_flush(void *data)
+GL_TH_CB(shader_array_flush)(void *data)
 {
-   Evas_Thread_Command_shader_array_flush *thread_param =
-      (Evas_Thread_Command_shader_array_flush *)data;
-    evas_gl_thread_begin();
+   GL_TH_ST(shader_array_flush) *thread_param = *(void **)data;
+
     _orig_shader_array_flush(thread_param->gc);
-    evas_gl_thread_end();
 }
 
 static void
 shader_array_flush(Evas_Engine_GL_Context *gc)
 {
+   GL_TH_ST(shader_array_flush) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
    if (!gc->havestuff) return;
 
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
      {
         _orig_shader_array_flush(gc);
         return;
      }
 
-   Evas_Thread_Command_shader_array_flush thread_param_local;
-   Evas_Thread_Command_shader_array_flush *thread_param = &thread_param_local;
-   thread_param->gc = gc;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(shader_array_flush) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->gc = gc;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_shader_array_flush,
-                              thread_param,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(shader_array_flush),
                               EVAS_GL_THREAD_MODE_FINISH);
 
 }
@@ -4020,7 +4000,7 @@ evas_gl_common_buffer_dump(Evas_Engine_GL_Context *gc, const char* dname, const
 
    if ((!data1) || (!data2)) goto finish;
 
-   glReadPixels_thread_cmd(0, 0, gc->w, gc->h, GL_RGBA,
+   GL_TH(glReadPixels, 0, 0, gc->w, gc->h, GL_RGBA,
                 GL_UNSIGNED_BYTE, (unsigned char*)data1);
 
    // Flip the Y and change from RGBA TO BGRA
index c762ea7..4545e50 100644 (file)
@@ -1,4 +1,5 @@
 #include "evas_gl_core_private.h"
+#include "evas_gl_api_ext.h"
 
 #ifndef _WIN32
 # include <dlfcn.h>
@@ -170,9 +171,7 @@ _internal_resource_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context
    if (!surface)
      {
         // Set the surface to evas surface if it's there
-        // But this reusing mechanism is only available at the single thread model like direct rendering.
-        // So avoid it when evasgl thread rendering is used.
-        if (rsc->id == evgl_engine->main_tid && !evas_gl_thread_enabled())
+        if (rsc->id == evgl_engine->main_tid)
            rsc->direct.surface = evgl_engine->funcs->evas_surface_get(eng_data);
 
         if (rsc->direct.surface)
@@ -242,7 +241,7 @@ _internal_resource_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context
 static void
 _texture_create(GLuint *tex)
 {
-   glGenTextures_evgl_thread_cmd(1, tex);
+   EVGL_TH(glGenTextures, 1, tex);
 }
 
 // Create and allocate 2D texture
@@ -250,21 +249,20 @@ static void
 _texture_allocate_2d(GLuint tex, GLint ifmt, GLenum fmt, GLenum type, int w, int h, int version)
 {
    //if (!(*tex))
-   //   glGenTextures(1, tex);
-
+   //   EVGL_TH(glGenTextures, 1, tex);
    GLint curr_tex = 0;
-   glGetIntegerv_evgl_thread_cmd(GL_TEXTURE_BINDING_2D, &curr_tex);
+   EVGL_TH(glGetIntegerv, GL_TEXTURE_BINDING_2D, &curr_tex);
 
-   glBindTexture_evgl_thread_cmd(GL_TEXTURE_2D, tex);
-   glTexParameteri_evgl_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_evgl_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-   glTexParameteri_evgl_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_evgl_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   EVGL_TH(glBindTexture, GL_TEXTURE_2D, tex);
+   EVGL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   EVGL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   EVGL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   EVGL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    if (version == EVAS_GL_GLES_1_X)
-     glTexImage2DEVAS_evgl_thread_cmd(1, GL_TEXTURE_2D, 0, ifmt, w, h, 0, fmt, type, NULL);
+     EVGL_TH_FN(glTexImage2DEVAS)(1, GL_TEXTURE_2D, 0, ifmt, w, h, 0, fmt, type, NULL);
    else
-     glTexImage2D_evgl_thread_cmd(GL_TEXTURE_2D, 0, ifmt, w, h, 0, fmt, type, NULL);
-   glBindTexture_evgl_thread_cmd(GL_TEXTURE_2D, (GLuint)curr_tex);
+      EVGL_TH(glTexImage2D, GL_TEXTURE_2D, 0, ifmt, w, h, 0, fmt, type, NULL);
+   EVGL_TH(glBindTexture, GL_TEXTURE_2D, (GLuint)curr_tex);
 }
 
 // Destroy Texture
@@ -272,12 +270,12 @@ static void
 _texture_destroy(GLuint *tex)
 {
    GLint curr_tex = 0;
-   glGetIntegerv_evgl_thread_cmd(GL_TEXTURE_BINDING_2D, &curr_tex);
+   EVGL_TH(glGetIntegerv, GL_TEXTURE_BINDING_2D, &curr_tex);
 
-   if ((GLuint)curr_tex == *tex) glBindTexture_evgl_thread_cmd(GL_TEXTURE_2D, 0);
+   if ((GLuint)curr_tex == *tex) EVGL_TH(glBindTexture, GL_TEXTURE_2D, 0);
    if (*tex)
      {
-        glDeleteTextures_evgl_thread_cmd(1, tex);
+        EVGL_TH(glDeleteTextures, 1, tex);
         *tex = 0;
      }
 }
@@ -292,29 +290,28 @@ _texture_attach_2d(GLuint tex, GLenum attach, GLenum attach2, int samples, Evas_
         if (samples)
           {
 #ifdef GL_GLES
-             if (EXT_FUNC(glFramebufferTexture2DMultisampleEXT))
-               {
-                  EXT_FUNC(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
-                                                              attach,
-                                                              GL_TEXTURE_2D, tex,
-                                                              0, samples);
-
-                  if (attach2)
-                    EXT_FUNC(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
-                                                                attach2,
-                                                                GL_TEXTURE_2D, tex,
-                                                                0, samples);
-               }
-             else
+            if (EXT_FUNC(glFramebufferTexture2DMultisampleEXT))
+              {
+                EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC(glFramebufferTexture2DMultisampleEXT),
+                             GL_FRAMEBUFFER,
+                             attach,
+                             GL_TEXTURE_2D, tex,
+                             0, samples);
+
+                if (attach2)
+                  EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC(glFramebufferTexture2DMultisampleEXT),
+                               GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0, samples);
+              }
+            else
 #endif
-             ERR("MSAA not supported.  Should not have come in here...!");
-           }
+               ERR("MSAA not supported.  Should not have come in here...!");
+          }
         else
           {
-             glFramebufferTexture2D_evgl_thread_cmd(GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
+            EVGL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
 
-             if (attach2)
-               glFramebufferTexture2D_evgl_thread_cmd(GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
+            if (attach2)
+              EVGL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
           }
      }
    else if (EVAS_GL_GLES_3_X == version)
@@ -324,13 +321,15 @@ _texture_attach_2d(GLuint tex, GLenum attach, GLenum attach2, int samples, Evas_
 #ifdef GL_GLES
              if (EXT_FUNC_GLES3(glFramebufferTexture2DMultisampleEXT))
                {
-                  EXT_FUNC_GLES3(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
+                 EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC_GLES3(glFramebufferTexture2DMultisampleEXT),
+                                                                    GL_FRAMEBUFFER,
                                                                     attach,
                                                                     GL_TEXTURE_2D, tex,
                                                                     0, samples);
 
                   if (attach2)
-                    EXT_FUNC_GLES3(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
+                    EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC_GLES3(glFramebufferTexture2DMultisampleEXT),
+                                                                      GL_FRAMEBUFFER,
                                                                       attach2,
                                                                       GL_TEXTURE_2D, tex,
                                                                       0, samples);
@@ -341,10 +340,10 @@ _texture_attach_2d(GLuint tex, GLenum attach, GLenum attach2, int samples, Evas_
            }
         else
           {
-             glFramebufferTexture2D_evgl_thread_cmd(GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
+            EVGL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
 
              if (attach2)
-               glFramebufferTexture2D_evgl_thread_cmd(GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
+               EVGL_TH(glFramebufferTexture2D, GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
           }
      }
    else if (EVAS_GL_GLES_1_X == version)
@@ -354,13 +353,15 @@ _texture_attach_2d(GLuint tex, GLenum attach, GLenum attach2, int samples, Evas_
 #ifdef GL_GLES
              if (EXT_FUNC_GLES1(glFramebufferTexture2DMultisampleEXT))
                {
-                  EXT_FUNC_GLES1(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
+                 EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC_GLES1(glFramebufferTexture2DMultisampleEXT),
+                                                              GL_FRAMEBUFFER,
                                                               attach,
                                                               GL_TEXTURE_2D, tex,
                                                               0, samples);
 
                   if (attach2)
-                    EXT_FUNC_GLES1(glFramebufferTexture2DMultisampleEXT)(GL_FRAMEBUFFER,
+                    EVGL_TH_CALL(glFramebufferTexture2DMultisampleEXT, EXT_FUNC_GLES1(glFramebufferTexture2DMultisampleEXT),
+                                                                GL_FRAMEBUFFER,
                                                                 attach2,
                                                                 GL_TEXTURE_2D, tex,
                                                                 0, samples);
@@ -373,11 +374,12 @@ _texture_attach_2d(GLuint tex, GLenum attach, GLenum attach2, int samples, Evas_
         else
           {
              if (EXT_FUNC_GLES1(glFramebufferTexture2DOES))
-               EXT_FUNC_GLES1(glFramebufferTexture2DOES)(GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
-
+               EVGL_TH_CALL(glFramebufferTexture2DOES, EXT_FUNC_GLES1(glFramebufferTexture2DOES),
+                                                   GL_FRAMEBUFFER, attach, GL_TEXTURE_2D, tex, 0);
              if (attach2)
                if (EXT_FUNC_GLES1(glFramebufferTexture2DOES))
-                 EXT_FUNC_GLES1(glFramebufferTexture2DOES)(GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
+                 EVGL_TH_CALL(glFramebufferTexture2DOES, EXT_FUNC_GLES1(glFramebufferTexture2DOES),
+                                                   GL_FRAMEBUFFER, attach2, GL_TEXTURE_2D, tex, 0);
           }
      }
 }
@@ -446,11 +448,11 @@ _framebuffer_create(GLuint *buf, Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glGenFramebuffersOES))
-          EXT_FUNC_GLES1(glGenFramebuffersOES)(1, buf);
+            EVGL_TH_CALL(glGenFramebuffersOES, EXT_FUNC_GLES1(glGenFramebuffersOES), 1, buf);
      }
    else
      {
-        glGenFramebuffers_evgl_thread_cmd(1, buf);
+        EVGL_TH(glGenFramebuffers, 1, buf);
      }
 }
 
@@ -460,11 +462,11 @@ _framebuffer_bind(GLuint buf, Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glBindFramebufferOES))
-          EXT_FUNC_GLES1(glBindFramebufferOES)(GL_FRAMEBUFFER, buf);
+          EVGL_TH_CALL(glBindFramebuffer, EXT_FUNC_GLES1(glBindFramebufferOES), GL_FRAMEBUFFER, buf);
      }
    else
      {
-        glBindFramebuffer_evgl_thread_cmd(GL_FRAMEBUFFER, buf);
+        EVGL_TH(glBindFramebuffer, GL_FRAMEBUFFER, buf);
      }
 }
 
@@ -472,7 +474,7 @@ static void
 _framebuffer_draw_bind(GLuint buf, Evas_GL_Context_Version version)
 {
    if (version == EVAS_GL_GLES_3_X)
-     glBindFramebuffer_evgl_thread_cmd(GL_DRAW_FRAMEBUFFER, buf);
+     EVGL_TH(glBindFramebuffer, GL_DRAW_FRAMEBUFFER, buf);
 }
 
 //This function is not needed in EvasGL backend engine with GLES 2.0.
@@ -481,7 +483,7 @@ static void
 _framebuffer_read_bind(GLuint buf, Evas_GL_Context_Version version)
 {
    if (version == EVAS_GL_GLES_3_X)
-     glBindFramebuffer_evgl_thread_cmd(GL_READ_FRAMEBUFFER, buf);
+     EVGL_TH(glBindFramebuffer, GL_READ_FRAMEBUFFER, buf);
 }
 
 static void
@@ -490,11 +492,11 @@ _framebuffer_delete(GLuint *buf, Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glDeleteFramebuffersOES))
-          EXT_FUNC_GLES1(glDeleteFramebuffersOES)(1, buf);
+          EVGL_TH_CALL(glDeleteFramebuffersOES, EXT_FUNC_GLES1(glDeleteFramebuffersOES), 1, buf);
      }
    else
      {
-        glDeleteFramebuffers_evgl_thread_cmd(1, buf);
+        EVGL_TH(glDeleteFramebuffers, 1, buf);
      }
 }
 
@@ -505,11 +507,11 @@ _framebuffer_check(Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glCheckFramebufferStatusOES))
-          ret = EXT_FUNC_GLES1(glCheckFramebufferStatusOES)(GL_FRAMEBUFFER);
+          ret = EVGL_TH_CALL(glCheckFramebufferStatus, EXT_FUNC_GLES1(glCheckFramebufferStatusOES), GL_FRAMEBUFFER);
      }
    else
      {
-        ret = glCheckFramebufferStatus_evgl_thread_cmd(GL_FRAMEBUFFER);
+        ret = EVGL_TH(glCheckFramebufferStatus, GL_FRAMEBUFFER);
      }
    return ret;
 }
@@ -521,11 +523,11 @@ _renderbuffer_create(GLuint *buf, Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glGenRenderbuffersOES))
-          EXT_FUNC_GLES1(glGenRenderbuffersOES)(1, buf);
+            EVGL_TH_CALL(glGenRenderbuffersOES, EXT_FUNC_GLES1(glGenRenderbuffersOES), 1, buf);
      }
    else
      {
-        glGenRenderbuffers_evgl_thread_cmd(1, buf);
+        EVGL_TH(glGenRenderbuffers, 1, buf);
      }
 }
 
@@ -534,72 +536,75 @@ _renderbuffer_create(GLuint *buf, Evas_GL_Context_Version version)
 static void
 _renderbuffer_allocate(GLuint buf, GLenum fmt, int w, int h, int samples, Evas_GL_Context_Version version)
 {
-   if (version == EVAS_GL_GLES_1_X)
-     {
-        if (EXT_FUNC_GLES1(glBindRenderbufferOES))
-          EXT_FUNC_GLES1(glBindRenderbufferOES)(GL_RENDERBUFFER, buf);
+  if (version == EVAS_GL_GLES_1_X)
+    {
+      if (EXT_FUNC_GLES1(glBindRenderbufferOES))
+        EVGL_TH_CALL(glBindRenderbufferOES, EXT_FUNC_GLES1(glBindRenderbufferOES), GL_RENDERBUFFER, buf);
 
-        if (samples)
+      if (samples)
+        {
 #ifdef GL_GLES
           {
             if (EXT_FUNC_GLES1(glRenderbufferStorageMultisampleEXT))
-              EXT_FUNC_GLES1(glRenderbufferStorageMultisampleEXT)(GL_RENDERBUFFER, samples, fmt, w, h);
+              EVGL_TH_CALL(glRenderbufferStorageMultisampleEXT, EXT_FUNC_GLES1(glRenderbufferStorageMultisampleEXT), GL_RENDERBUFFER, samples, fmt, w, h);
           }
 #else
           ERR("MSAA not supported.  Should not have come in here...!");
 #endif
-        else
-          {
-             if (EXT_FUNC_GLES1(glRenderbufferStorageOES))
-               EXT_FUNC_GLES1(glRenderbufferStorageOES)(GL_RENDERBUFFER, fmt, w, h);
-          }
+        }
+      else
+        {
+          if (EXT_FUNC_GLES1(glRenderbufferStorageOES))
+            EVGL_TH_CALL(glRenderbufferStorageOES, EXT_FUNC_GLES1(glRenderbufferStorageOES), GL_RENDERBUFFER, fmt, w, h);
+        }
 
         if (EXT_FUNC_GLES1(glBindRenderbufferOES))
-          EXT_FUNC_GLES1(glBindRenderbufferOES)(GL_RENDERBUFFER, 0);
+          EVGL_TH_CALL(glBindRenderbufferOES, EXT_FUNC_GLES1(glBindRenderbufferOES), GL_RENDERBUFFER, 0);
       }
    else if (version == EVAS_GL_GLES_3_X)
      {
-         glBindRenderbuffer_evgl_thread_cmd(GL_RENDERBUFFER, buf);
+       EVGL_TH(glBindRenderbuffer, GL_RENDERBUFFER, buf);
 
         if (samples)
 #ifdef GL_GLES
           {
              if (EXT_FUNC_GLES3(glRenderbufferStorageMultisampleEXT))
-               EXT_FUNC_GLES3(glRenderbufferStorageMultisampleEXT)(GL_RENDERBUFFER, samples, fmt, w, h);
+               EVGL_TH_CALL(glRenderbufferStorageMultisampleEXT, EXT_FUNC_GLES3(glRenderbufferStorageMultisampleEXT), GL_RENDERBUFFER, samples, fmt, w, h);
           }
 #else
           ERR("MSAA not supported.  Should not have come in here...!");
 #endif
         else
           {
-             glRenderbufferStorage_evgl_thread_cmd(GL_RENDERBUFFER, fmt, w, h);
+            EVGL_TH(glRenderbufferStorage, GL_RENDERBUFFER, fmt, w, h);
           }
 
-        glBindRenderbuffer_evgl_thread_cmd(GL_RENDERBUFFER, 0);
+        EVGL_TH(glBindRenderbuffer, GL_RENDERBUFFER, 0);
     }
    else
      {
-        glBindRenderbuffer_evgl_thread_cmd(GL_RENDERBUFFER, buf);
+       EVGL_TH(glBindRenderbuffer, GL_RENDERBUFFER, buf);
 
-        if (samples)
+      if (samples)
+        {
 #ifdef GL_GLES
           {
              if (EXT_FUNC(glRenderbufferStorageMultisampleEXT))
-               EXT_FUNC(glRenderbufferStorageMultisampleEXT)(GL_RENDERBUFFER, samples, fmt, w, h);
+               EVGL_TH_CALL(glRenderbufferStorageMultisampleEXT, EXT_FUNC(glRenderbufferStorageMultisampleEXT), GL_RENDERBUFFER, samples, fmt, w, h);
           }
 #else
           ERR("MSAA not supported.  Should not have come in here...!");
 #endif
-        else
-          {
-             glRenderbufferStorage_evgl_thread_cmd(GL_RENDERBUFFER, fmt, w, h);
-          }
+        }
+      else
+        {
+          EVGL_TH(glRenderbufferStorage, GL_RENDERBUFFER, fmt, w, h);
+        }
 
-        glBindRenderbuffer_evgl_thread_cmd(GL_RENDERBUFFER, 0);
-     }
+      EVGL_TH(glBindRenderbuffer, GL_RENDERBUFFER, 0);
+    }
 
-   return;
-   samples = 0;
+  return;
 }
 
 static void
@@ -610,11 +615,11 @@ _renderbuffer_destroy(GLuint *buf, Evas_GL_Context_Version version)
         if (version == EVAS_GL_GLES_1_X)
           {
              if (EXT_FUNC_GLES1(glDeleteRenderbuffersOES))
-             EXT_FUNC_GLES1(glDeleteRenderbuffersOES)(1, buf);
+                EVGL_TH_CALL(glDeleteRenderbuffersOES, EXT_FUNC_GLES1(glDeleteRenderbuffersOES), 1, buf);
           }
         else
           {
-             glDeleteRenderbuffers_evgl_thread_cmd(1, buf);
+             EVGL_TH(glDeleteRenderbuffers, 1, buf);
           }
 
         *buf = 0;
@@ -628,11 +633,11 @@ _renderbuffer_attach(GLuint buf, GLenum attach, Evas_GL_Context_Version version)
    if (version == EVAS_GL_GLES_1_X)
      {
         if (EXT_FUNC_GLES1(glFramebufferRenderbufferOES))
-          EXT_FUNC_GLES1(glFramebufferRenderbufferOES)(GL_FRAMEBUFFER, attach, GL_RENDERBUFFER, buf);
+           EVGL_TH_CALL(glFramebufferRenderbuffer, EXT_FUNC_GLES1(glFramebufferRenderbufferOES), GL_FRAMEBUFFER, attach, GL_RENDERBUFFER, buf);
      }
    else
      {
-        glFramebufferRenderbuffer_evgl_thread_cmd(GL_FRAMEBUFFER, attach, GL_RENDERBUFFER, buf);
+        EVGL_TH(glFramebufferRenderbuffer, GL_FRAMEBUFFER, attach, GL_RENDERBUFFER, buf);
      }
 }
 
@@ -703,7 +708,7 @@ _fbo_surface_cap_test(GLint color_ifmt, GLenum color_fmt,
    // Return the result
    if (fb_status != GL_FRAMEBUFFER_COMPLETE)
      {
-        int err = glGetError();
+        int err = EVGL_TH(glGetError);
 
         if (err != GL_NO_ERROR)
            DBG("glGetError() returns %x ", err);
@@ -714,9 +719,9 @@ _fbo_surface_cap_test(GLint color_ifmt, GLenum color_fmt,
      {
         // Check that all attachments is valid.
         GLint color_atc, depth_atc, stencil_atc;
-        glGetFramebufferAttachmentParameteriv_evgl_thread_cmd(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &color_atc);
-        glGetFramebufferAttachmentParameteriv_evgl_thread_cmd(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depth_atc);
-        glGetFramebufferAttachmentParameteriv_evgl_thread_cmd(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &stencil_atc);
+        EVGL_TH(glGetFramebufferAttachmentParameteriv, GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &color_atc);
+        EVGL_TH(glGetFramebufferAttachmentParameteriv, GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depth_atc);
+        EVGL_TH(glGetFramebufferAttachmentParameteriv, GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &stencil_atc);
 
         if (color_fmt && !color_atc)
           ret = 0;
@@ -1062,7 +1067,7 @@ _surface_cap_init(void *eng_data EINA_UNUSED, Evas_GL_Context_Version version)
    int caps_idx = version - 1;
 
    // Query the max width and height of the surface
-   glGetIntegerv_evgl_thread_cmd(GL_MAX_RENDERBUFFER_SIZE, &max_size);
+   EVGL_TH(glGetIntegerv, GL_MAX_RENDERBUFFER_SIZE, &max_size);
 
    evgl_engine->caps[caps_idx].max_w = max_size;
    evgl_engine->caps[caps_idx].max_h = max_size;
@@ -1071,17 +1076,17 @@ _surface_cap_init(void *eng_data EINA_UNUSED, Evas_GL_Context_Version version)
 
    if (version == 3)
      {
-        glGetIntegerv_evgl_thread_cmd(GL_MAX_SAMPLES, &max_samples);
+        EVGL_TH(glGetIntegerv, GL_MAX_SAMPLES, &max_samples);
      }
 #ifdef GL_GLES
    else
      {
-        const char *exts = (const char *) glGetString_evgl_thread_cmd(GL_EXTENSIONS);
+        const char *exts = (const char *) EVGL_TH(glGetString, GL_EXTENSIONS);
 
         if (exts && strstr(exts, "EXT_multisampled_render_to_texture"))
-          glGetIntegerv_evgl_thread_cmd(GL_MAX_SAMPLES_EXT, &max_samples);
+          EVGL_TH(glGetIntegerv, GL_MAX_SAMPLES_EXT, &max_samples);
         else if (exts && strstr(exts, "IMG_multisampled_render_to_texture"))
-          glGetIntegerv_evgl_thread_cmd(GL_MAX_SAMPLES_IMG, &max_samples);
+          EVGL_TH(glGetIntegerv, GL_MAX_SAMPLES_IMG, &max_samples);
      }
 #endif
 
@@ -1581,7 +1586,7 @@ try_again:
                   support_win_cfg = EINA_FALSE;
                }
 
-             if ((sfc->direct_override) || (support_win_cfg && !evas_gl_thread_enabled()))
+             if (sfc->direct_override || support_win_cfg )
                sfc->direct_fb_opt = !!(cfg->options_bits & EVAS_GL_OPTIONS_DIRECT);
              else if (cfg->options_bits & EVAS_GL_OPTIONS_DIRECT)
                {
@@ -1685,7 +1690,6 @@ _evgl_direct_renderable(EVGL_Resource *rsc, EVGL_Surface *sfc)
    if (rsc->id != evgl_engine->main_tid) return 0;
    if (!sfc->direct_fb_opt) return 0;
    if (!rsc->direct.enabled) return 0;
-   if (evas_gl_thread_enabled()) return 0;
 
    return 1;
 }
@@ -1693,7 +1697,6 @@ _evgl_direct_renderable(EVGL_Resource *rsc, EVGL_Surface *sfc)
 //---------------------------------------------------------------//
 // Functions used by Evas GL module
 //---------------------------------------------------------------//
-
 EVGL_Resource *
 _evgl_tls_resource_get(void)
 {
@@ -2136,7 +2139,7 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
      {
         ERR("Surface allocation failed.");
         evas_gl_common_error_set(eng_data, EVAS_GL_BAD_ALLOC);
-        goto error;
+        return NULL;
      }
 
    // Set surface info
@@ -2160,9 +2163,9 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
    else if (evgl_engine->direct_override == 1)
      sfc->direct_override = EINA_TRUE;
 
-   if ((sfc->direct_override == EINA_TRUE) || (cfg->options_bits & EVAS_GL_OPTIONS_DIRECT) || (evgl_engine->disable_render_thread == 1))
+   if (evgl_engine->disable_render_thread == 1)
      {
-        if (evas_gl_thread_enabled())
+        if (evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
           {
              // Now surface direct override is ON.
              // It means that EvasGL DIRECT rendering is enabled strictly
@@ -2171,20 +2174,15 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
              // But it may not work correctly if some rendering is not yet completely finished.
              // So it is recommended that programmer should disable EVAS_GL_THREAD_RENDER flag.
              int ret;
-             EGLDisplay display = eglGetCurrentDisplay_thread_cmd();
+             EGLDisplay display = GL_TH(eglGetCurrentDisplay);
 
              DBG("Overriding Thread Rendering ON to OFF (FALLBACK is occurred)");
 
-             ret = eglMakeCurrent_thread_cmd(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-             if (ret != EGL_TRUE)
-               ERR("Evas GL thread fallback is failed");
-
-             ret = eglMakeCurrent_evgl_thread_cmd(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+             ret = GL_TH(eglMakeCurrent, display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
              if (ret != EGL_TRUE)
                ERR("Evas GL thread fallback is failed");
 
-             evas_gl_thread_begin();
-             evas_evgl_thread_begin();
+             evas_gl_thread_disabled();
           }
      }
 
@@ -2204,10 +2202,6 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
       evgl_engine->funcs->partial_rendering_disable();
 
    return sfc;
-
-error:
-   if (sfc) free(sfc);
-   return NULL;
 }
 
 void *
@@ -2554,7 +2548,7 @@ evgl_context_destroy(void *eng_data, EVGL_Context *ctx)
              ERR("Error doing an internal resource make current");
              return 0;
           }
-        glDeleteFramebuffers_evgl_thread_cmd(1, &ctx->surface_fbo);
+        EVGL_TH(glDeleteFramebuffers, 1, &ctx->surface_fbo);
      }
 
    // Retrieve the resource object
@@ -2650,24 +2644,24 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
 
              if (rsc->current_ctx->version == EVAS_GL_GLES_3_X)
                {
-                  glGetIntegerv_evgl_thread_cmd(GL_DRAW_FRAMEBUFFER_BINDING, &curr_draw_fbo);
+                  EVGL_TH(glGetIntegerv, GL_DRAW_FRAMEBUFFER_BINDING, &curr_draw_fbo);
                   if ((rsc->current_ctx->surface_fbo == (GLuint) curr_draw_fbo) ||
                       (rsc->current_ctx->current_sfc &&
                        rsc->current_ctx->current_sfc->color_buf == (GLuint) curr_draw_fbo))
                     {
-                       glBindFramebuffer_evgl_thread_cmd(GL_FRAMEBUFFER, 0);
+                       EVGL_TH(glBindFramebuffer, GL_FRAMEBUFFER, 0);
                        rsc->current_ctx->current_draw_fbo = 0;
                        rsc->current_ctx->current_read_fbo = 0;
                     }
                }
              else
                {
-                  glGetIntegerv_evgl_thread_cmd(GL_FRAMEBUFFER_BINDING, &curr_fbo);
+                  EVGL_TH(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &curr_fbo);
                   if ((rsc->current_ctx->surface_fbo == (GLuint) curr_fbo) ||
                       (rsc->current_ctx->current_sfc &&
                        rsc->current_ctx->current_sfc->color_buf == (GLuint) curr_fbo))
                     {
-                       glBindFramebuffer_evgl_thread_cmd(GL_FRAMEBUFFER, 0);
+                       EVGL_TH(glBindFramebuffer, GL_FRAMEBUFFER, 0);
                        rsc->current_ctx->current_fbo = 0;
                     }
                }
@@ -2766,8 +2760,8 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
    else
      {
         DBG("Performing surfaceless make current");
-        glViewport_evgl_thread_cmd(0, 0, 0, 0);
-        glScissor_evgl_thread_cmd(0, 0, 0, 0);
+        EVGL_TH(glViewport, 0, 0, 0, 0);
+        EVGL_TH(glScissor, 0, 0, 0, 0);
         rsc->direct.rendered = 0;
         goto finish;
      }
@@ -2848,9 +2842,9 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
              if (!rsc->direct.rendered)
                {
                   // Restore viewport and scissor test to direct rendering mode
-                  glViewport_evgl_thread_cmd(ctx->viewport_direct[0], ctx->viewport_direct[1], ctx->viewport_direct[2], ctx->viewport_direct[3]);
+                  EVGL_TH(glViewport, ctx->viewport_direct[0], ctx->viewport_direct[1], ctx->viewport_direct[2], ctx->viewport_direct[3]);
                   if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-                    glEnable_evgl_thread_cmd(GL_SCISSOR_TEST);
+                    EVGL_TH(glEnable, GL_SCISSOR_TEST);
                }
              if (dbg) DBG("sfc %p is direct renderable.", sfc);
              rsc->direct.rendered = 1;
@@ -2860,9 +2854,9 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
              // Transition from direct rendering to indirect rendering
              if (rsc->direct.rendered)
                {
-                  glViewport_evgl_thread_cmd(ctx->viewport_coord[0], ctx->viewport_coord[1], ctx->viewport_coord[2], ctx->viewport_coord[3]);
+                  EVGL_TH(glViewport, ctx->viewport_coord[0], ctx->viewport_coord[1], ctx->viewport_coord[2], ctx->viewport_coord[3]);
                   if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
-                    glDisable_evgl_thread_cmd(GL_SCISSOR_TEST);
+                    EVGL_TH(glDisable, GL_SCISSOR_TEST);
              }
 
              if (ctx->version == EVAS_GL_GLES_3_X)
@@ -2892,7 +2886,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
              if (ctx->version == EVAS_GL_GLES_3_X)
                {
                   // This is to transition from FBO rendering to direct rendering
-                  glGetIntegerv_evgl_thread_cmd(GL_DRAW_FRAMEBUFFER_BINDING, &curr_draw_fbo);
+                  EVGL_TH(glGetIntegerv, GL_DRAW_FRAMEBUFFER_BINDING, &curr_draw_fbo);
                   if (ctx->surface_fbo == (GLuint)curr_draw_fbo)
                     {
                        _framebuffer_draw_bind(0, ctx->version);
@@ -2905,7 +2899,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
                        ctx->current_draw_fbo = 0;
                     }
 
-                  glGetIntegerv_evgl_thread_cmd(GL_READ_FRAMEBUFFER_BINDING, &curr_read_fbo);
+                  EVGL_TH(glGetIntegerv, GL_READ_FRAMEBUFFER_BINDING, &curr_read_fbo);
                   if (ctx->surface_fbo == (GLuint)curr_read_fbo)
                     {
                        _framebuffer_read_bind(0, ctx->version);
@@ -2944,7 +2938,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
                   else
                     {
                   // This is to transition from FBO rendering to direct rendering
-                  glGetIntegerv_evgl_thread_cmd(GL_FRAMEBUFFER_BINDING, &curr_fbo);
+                  EVGL_TH(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &curr_fbo);
                   if (ctx->surface_fbo == (GLuint)curr_fbo)
                     {
                        _framebuffer_bind(0, ctx->version);
@@ -3379,7 +3373,7 @@ evgl_api_get(void *eng_data, Evas_GL_Context_Version version, Eina_Bool alloc_on
         api = gles3_funcs;
      }
    else return NULL;
-   if (alloc_only && (api->version == EVAS_GL_API_VERSION))
+   if (alloc_only && (api && api->version == EVAS_GL_API_VERSION))
      return api;
 
 #ifdef GL_GLES
@@ -3400,7 +3394,14 @@ evgl_api_get(void *eng_data, Evas_GL_Context_Version version, Eina_Bool alloc_on
      }
    else if (version == EVAS_GL_GLES_3_X)
      {
-        _evgl_api_gles3_get(api, evgl_engine->api_debug_mode);
+        void *(*get_proc_address)(const char *) = NULL;
+        const char *egl_exts;
+
+        egl_exts = evgl_engine->funcs->ext_string_get(eng_data);
+        if (egl_exts && strstr(egl_exts, "EGL_KHR_get_all_proc_addresses"))
+          get_proc_address = evgl_engine->funcs->proc_address_get;
+
+        _evgl_api_gles3_get(api, get_proc_address, evgl_engine->api_debug_mode);
         evgl_api_gles3_ext_get(api, evgl_engine->funcs->proc_address_get, evgl_engine->funcs->ext_string_get(eng_data));
      }
 
index 428aba9..a1d51bf 100644 (file)
@@ -2,12 +2,9 @@
 #define _EVAS_GL_CORE_PRIVATE_H
 #include "evas_gl_private.h"
 #include "evas_gl_core.h"
-#include "evas_gl_api_ext.h"
 #define EVAS_GL_NO_GL_H_CHECK 1
 #include "Evas_GL.h"
 
-//#include "evas_gl_ext.h"
-
 extern int _evas_gl_log_dom;
 
 #ifdef ERR
@@ -35,6 +32,282 @@ extern int _evas_gl_log_dom;
 #define CRI(...) EINA_LOG_DOM_CRIT(_evas_gl_log_dom, __VA_ARGS__)
 
 
+#define _EVASGL_EXPAND(x) x
+
+#define _EVASGL_PARAM_OVERRIDE( \
+ ptype18, pname18, ptype17, pname17, \
+ ptype16, pname16, ptype15, pname15, ptype14, pname14, ptype13, pname13, \
+ ptype12, pname12, ptype11, pname11, ptype10, pname10, ptype9,  pname9, \
+ ptype8,  pname8,  ptype7,  pname7,  ptype6,  pname6,  ptype5,  pname5, \
+ ptype4,  pname4,  ptype3,  pname3,  ptype2,  pname2,  ptype1,  pname1, \
+ ptype0,  NAME, ...) NAME
+
+#define  _EVASGL_PARAM_PROTO0(...)
+#define  _EVASGL_PARAM_PROTO1(ptype1,  pname1,  ...) \
+   ptype1  pname1
+#define  _EVASGL_PARAM_PROTO2(ptype1,  pname1,  ptype2,  pname2,  ...) \
+   ptype1  pname1,  ptype2  pname2
+#define  _EVASGL_PARAM_PROTO3(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ...) \
+   ptype1  pname1,  ptype2  pname2,  ptype3  pname3
+#define  _EVASGL_PARAM_PROTO4(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ...) \
+   ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4
+
+#define  _EVASGL_PARAM_PROTO5(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ...) \
+   ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+ , ptype5  pname5
+#define  _EVASGL_PARAM_PROTO6(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ...) \
+   ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+ , ptype5  pname5,  ptype6  pname6
+#define  _EVASGL_PARAM_PROTO7(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ...) \
+    ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5,  ptype6  pname6,  ptype7  pname7
+#define  _EVASGL_PARAM_PROTO8(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ...) \
+    ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5,  ptype6  pname6,  ptype7  pname7,  ptype8  pname8
+#define  _EVASGL_PARAM_PROTO9(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ...) \
+    ptype1  pname1,  ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5,  ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9
+#define _EVASGL_PARAM_PROTO10(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10
+#define _EVASGL_PARAM_PROTO11(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11
+#define _EVASGL_PARAM_PROTO12(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12
+#define _EVASGL_PARAM_PROTO13(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13
+#define _EVASGL_PARAM_PROTO14(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ptype14, pname14, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13, ptype14 pname14
+#define _EVASGL_PARAM_PROTO15(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ptype14, pname14, ptype15, pname15, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13, ptype14 pname14, ptype15 pname15
+#define _EVASGL_PARAM_PROTO16(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                              ptype16, pname16, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13, ptype14 pname14, ptype15 pname15, ptype16 pname16
+#define _EVASGL_PARAM_PROTO17(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                              ptype16, pname16, ptype17, pname17, ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13, ptype14 pname14, ptype15 pname15, ptype16 pname16 \
+  , ptype17 pname17
+#define _EVASGL_PARAM_PROTO18(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                              ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                              ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                              ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                              ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                              ptype16, pname16, ptype17, pname17, ptype18, pname18, \
+                              ...) \
+    ptype1  pname1, ptype2  pname2,  ptype3  pname3,  ptype4  pname4 \
+  , ptype5  pname5, ptype6  pname6,  ptype7  pname7,  ptype8  pname8 \
+  , ptype9  pname9, ptype10 pname10, ptype11 pname11, ptype12 pname12 \
+  , ptype13 pname13, ptype14 pname14, ptype15 pname15, ptype16 pname16 \
+  , ptype17 pname17, ptype18 pname18
+
+
+#define _EVASGL_PARAM_PROTO(...) \
+   _EVASGL_EXPAND(_EVASGL_PARAM_OVERRIDE(__VA_ARGS__, \
+   _EVASGL_PARAM_PROTO18, _EVASGL_PARAM_PROTO18, \
+   _EVASGL_PARAM_PROTO17, _EVASGL_PARAM_PROTO17, \
+   _EVASGL_PARAM_PROTO16, _EVASGL_PARAM_PROTO16, \
+   _EVASGL_PARAM_PROTO15, _EVASGL_PARAM_PROTO15, \
+   _EVASGL_PARAM_PROTO14, _EVASGL_PARAM_PROTO14, \
+   _EVASGL_PARAM_PROTO13, _EVASGL_PARAM_PROTO13, \
+   _EVASGL_PARAM_PROTO12, _EVASGL_PARAM_PROTO12, \
+   _EVASGL_PARAM_PROTO11, _EVASGL_PARAM_PROTO11, \
+   _EVASGL_PARAM_PROTO10, _EVASGL_PARAM_PROTO10, \
+   _EVASGL_PARAM_PROTO9,  _EVASGL_PARAM_PROTO9, \
+   _EVASGL_PARAM_PROTO8,  _EVASGL_PARAM_PROTO8, \
+   _EVASGL_PARAM_PROTO7,  _EVASGL_PARAM_PROTO7, \
+   _EVASGL_PARAM_PROTO6,  _EVASGL_PARAM_PROTO6, \
+   _EVASGL_PARAM_PROTO5,  _EVASGL_PARAM_PROTO5, \
+   _EVASGL_PARAM_PROTO4,  _EVASGL_PARAM_PROTO4, \
+   _EVASGL_PARAM_PROTO3,  _EVASGL_PARAM_PROTO3, \
+   _EVASGL_PARAM_PROTO2,  _EVASGL_PARAM_PROTO2, \
+   _EVASGL_PARAM_PROTO1,  _EVASGL_PARAM_PROTO1, \
+   _EVASGL_PARAM_PROTO0) (__VA_ARGS__))
+
+#define  _EVASGL_PARAM_NAME0(...)
+#define  _EVASGL_PARAM_NAME1(ptype1,  pname1,  ...) \
+   pname1
+#define  _EVASGL_PARAM_NAME2(ptype1,  pname1,  ptype2,  pname2,  ...) \
+   pname1,  pname2
+#define  _EVASGL_PARAM_NAME3(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                            ...) \
+   pname1,  pname2,  pname3
+#define  _EVASGL_PARAM_NAME4(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ...) \
+   pname1,  pname2,  pname3,  pname4
+
+#define  _EVASGL_PARAM_NAME5(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5
+#define  _EVASGL_PARAM_NAME6(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6
+#define  _EVASGL_PARAM_NAME7(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7
+#define  _EVASGL_PARAM_NAME8(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8
+#define  _EVASGL_PARAM_NAME9(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9
+#define _EVASGL_PARAM_NAME10(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10
+#define _EVASGL_PARAM_NAME11(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11
+#define _EVASGL_PARAM_NAME12(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12
+#define _EVASGL_PARAM_NAME13(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13
+#define _EVASGL_PARAM_NAME14(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ptype14, pname14, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13, pname14
+#define _EVASGL_PARAM_NAME15(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                             ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13, pname14, pname15
+#define _EVASGL_PARAM_NAME16(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                             ptype16, pname16, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13, pname14, pname15, pname16
+#define _EVASGL_PARAM_NAME17(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                             ptype16, pname16, ptype17, pname17, ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13, pname14, pname15, pname16, pname17
+#define _EVASGL_PARAM_NAME18(ptype1,  pname1,  ptype2,  pname2,  ptype3,  pname3,  \
+                             ptype4,  pname4,  ptype5,  pname5,  ptype6,  pname6,  \
+                             ptype7,  pname7,  ptype8,  pname8,  ptype9,  pname9,  \
+                             ptype10, pname10, ptype11, pname11, ptype12, pname12, \
+                             ptype13, pname13, ptype14, pname14, ptype15, pname15, \
+                             ptype16, pname16, ptype17, pname17, ptype18, pname18, \
+                             ...) \
+   pname1,  pname2,  pname3,  pname4,  pname5,  pname6,  pname7,  pname8,  pname9, \
+   pname10, pname11, pname12, pname13, pname14, pname15, pname16, pname17, pname18
+
+#define _EVASGL_PARAM_NAME(...) \
+   _EVASGL_EXPAND(_EVASGL_PARAM_OVERRIDE(__VA_ARGS__, \
+   _EVASGL_PARAM_NAME18, _EVASGL_PARAM_NAME18, \
+   _EVASGL_PARAM_NAME17, _EVASGL_PARAM_NAME17, \
+   _EVASGL_PARAM_NAME16, _EVASGL_PARAM_NAME16, \
+   _EVASGL_PARAM_NAME15, _EVASGL_PARAM_NAME15, \
+   _EVASGL_PARAM_NAME14, _EVASGL_PARAM_NAME14, \
+   _EVASGL_PARAM_NAME13, _EVASGL_PARAM_NAME13, \
+   _EVASGL_PARAM_NAME12, _EVASGL_PARAM_NAME12, \
+   _EVASGL_PARAM_NAME11, _EVASGL_PARAM_NAME11, \
+   _EVASGL_PARAM_NAME10, _EVASGL_PARAM_NAME10, \
+   _EVASGL_PARAM_NAME9,  _EVASGL_PARAM_NAME9, \
+   _EVASGL_PARAM_NAME8,  _EVASGL_PARAM_NAME8, \
+   _EVASGL_PARAM_NAME7,  _EVASGL_PARAM_NAME7, \
+   _EVASGL_PARAM_NAME6,  _EVASGL_PARAM_NAME6, \
+   _EVASGL_PARAM_NAME5,  _EVASGL_PARAM_NAME5, \
+   _EVASGL_PARAM_NAME4,  _EVASGL_PARAM_NAME4, \
+   _EVASGL_PARAM_NAME3,  _EVASGL_PARAM_NAME3, \
+   _EVASGL_PARAM_NAME2,  _EVASGL_PARAM_NAME2, \
+   _EVASGL_PARAM_NAME1,  _EVASGL_PARAM_NAME1, \
+   _EVASGL_PARAM_NAME0) (__VA_ARGS__))
+
+
 struct _EVGL_Interface
 {
    // Returns the native display of evas engine.
@@ -379,7 +652,7 @@ extern EVGL_Engine   *evgl_engine;
 // Internally used functions
 extern void           _evgl_api_gles2_get(Evas_GL_API *api, Eina_Bool debug);
 extern void           _evgl_api_gles1_get(Evas_GL_API *api, Eina_Bool debug);
-extern void           _evgl_api_gles3_get(Evas_GL_API *api, Eina_Bool debug);
+extern void           _evgl_api_gles3_get(Evas_GL_API *funcs, void *(*get_proc_address)(const char *), Eina_Bool debug);
 extern EVGL_Resource *_evgl_tls_resource_get(void);
 extern EVGL_Resource *_evgl_tls_resource_create(void *data);
 extern void           _evgl_tls_resource_destroy(void *data);
index ccd4f8f..bf7ebdd 100644 (file)
@@ -97,9 +97,9 @@ evas_gl_common_file_cache_file_check(const char *cache_dir, const char *cache_na
    char *driver = NULL;
    char *version = NULL;
 
-   vendor = (char *)glGetString_thread_cmd(GL_VENDOR);
-   driver = (char *)glGetString_thread_cmd(GL_RENDERER);
-   version = (char *)glGetString_thread_cmd(GL_VERSION);
+   vendor = (char *)GL_TH(glGetString, GL_VENDOR);
+   driver = (char *)GL_TH(glGetString, GL_RENDERER);
+   version = (char *)GL_TH(glGetString, GL_VERSION);
 
    if (!vendor)  vendor  = "-UNKNOWN-";
    if (!driver)  driver  = "-UNKNOWN-";
index 969fc62..0452666 100644 (file)
@@ -59,7 +59,7 @@ evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int
         if (!getenv("EVAS_GL_LINE_OFFSET_HACK_DISABLE"))
           {
              const char *vendor_name;
-             vendor_name = (char *) glGetString_thread_cmd(GL_VENDOR);
+             vendor_name = (char *) GL_TH(glGetString, GL_VENDOR);
              if (vendor_name && !strcmp(vendor_name, "ARM"))
                offset_hack = OFFSET_HACK_ARM;
              else
index 95796d2..eecb067 100644 (file)
@@ -75,24 +75,38 @@ gl_compile_link_error(GLuint target, const char *action, Eina_Bool is_shader)
 
    if (is_shader)
      /* Shader info log */
-     glGetShaderiv_thread_cmd(target, GL_INFO_LOG_LENGTH, &loglen);
+     GL_TH(glGetShaderiv, target, GL_INFO_LOG_LENGTH, &loglen);
    else
      /* Program info log */
-     glGetProgramiv_thread_cmd(target, GL_INFO_LOG_LENGTH, &loglen);
+     GL_TH(glGetProgramiv, target, GL_INFO_LOG_LENGTH, &loglen);
 
    if (loglen > 0)
      {
         logtxt = calloc(loglen, sizeof(char));
         if (logtxt)
           {
-             if (is_shader) glGetShaderInfoLog_thread_cmd(target, loglen, &chars, logtxt);
-             else glGetProgramInfoLog_thread_cmd(target, loglen, &chars, logtxt);
+             if (is_shader) GL_TH(glGetShaderInfoLog, target, loglen, &chars, logtxt);
+             else GL_TH(glGetProgramInfoLog, target, loglen, &chars, logtxt);
              ERR("Failed to %s: %s", action, logtxt);
              free(logtxt);
           }
      }
 }
 
+static inline void
+_attributes_bind(GLint prg)
+{
+   GL_TH(glBindAttribLocation, prg, SHAD_VERTEX,  "vertex");
+   GL_TH(glBindAttribLocation, prg, SHAD_COLOR,   "color");
+   GL_TH(glBindAttribLocation, prg, SHAD_TEXUV,   "tex_coord");
+   GL_TH(glBindAttribLocation, prg, SHAD_TEXUV2,  "tex_coord2");
+   GL_TH(glBindAttribLocation, prg, SHAD_TEXUV3,  "tex_coord3");
+   GL_TH(glBindAttribLocation, prg, SHAD_TEXA,    "tex_coorda");
+   GL_TH(glBindAttribLocation, prg, SHAD_TEXSAM,  "tex_sample");
+   GL_TH(glBindAttribLocation, prg, SHAD_MASK,    "mask_coord");
+   GL_TH(glBindAttribLocation, prg, SHAD_MASKSAM, "tex_masksample");
+}
+
 static Evas_GL_Program *
 _evas_gl_common_shader_program_binary_load(Eet_File *ef, unsigned int flags)
 {
@@ -115,59 +129,52 @@ _evas_gl_common_shader_program_binary_load(Eet_File *ef, unsigned int flags)
      }
    if ((!data) || (length <= 0)) goto finish;
 
-   glGetIntegerv_thread_cmd(GL_NUM_PROGRAM_BINARY_FORMATS, &num);
+   GL_TH(glGetIntegerv, GL_NUM_PROGRAM_BINARY_FORMATS, &num);
    if (num <= 0) goto finish;
 
    formats = calloc(num, sizeof(int));
    if (!formats) goto finish;
 
-   glGetIntegerv_thread_cmd(GL_PROGRAM_BINARY_FORMATS, formats);
+   GL_TH(glGetIntegerv, GL_PROGRAM_BINARY_FORMATS, formats);
    if (!formats[0]) goto finish;
 
-   prg = glCreateProgram_thread_cmd();
+   prg = GL_TH(glCreateProgram);
 #if 1
    // TODO: invalid rendering error occurs when attempting to use a
    // glProgramBinary. in order to render correctly we should create a dummy
    // vertex shader.
-   vtx = glCreateShader_thread_cmd(GL_VERTEX_SHADER);
-   glAttachShader_thread_cmd(prg, vtx);
-   frg = glCreateShader_thread_cmd(GL_FRAGMENT_SHADER);
-   glAttachShader_thread_cmd(prg, frg);
+   vtx = GL_TH(glCreateShader, GL_VERTEX_SHADER);
+   GL_TH(glAttachShader, prg, vtx);
+   frg = GL_TH(glCreateShader, GL_FRAGMENT_SHADER);
+   GL_TH(glAttachShader, prg, frg);
 #endif
-   glsym_glProgramBinary(prg, formats[0], data, length);
-
-   glBindAttribLocation_thread_cmd(prg, SHAD_VERTEX,  "vertex");
-   glBindAttribLocation_thread_cmd(prg, SHAD_COLOR,   "color");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV,   "tex_coord");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV2,  "tex_coord2");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV3,  "tex_coord3");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXA,    "tex_coorda");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXSAM,  "tex_sample");
-   glBindAttribLocation_thread_cmd(prg, SHAD_MASK,    "mask_coord");
-   glBindAttribLocation_thread_cmd(prg, SHAD_MASKSAM, "tex_masksample");
-
-   glGetProgramiv_thread_cmd(prg, GL_LINK_STATUS, &ok);
+   GL_TH_CALL(glProgramBinaryOES, glsym_glProgramBinary, prg, formats[0], data, length);
+
+   _attributes_bind(prg);
+
+   GL_TH(glGetProgramiv, prg, GL_LINK_STATUS, &ok);
    if (!ok)
      {
         gl_compile_link_error(prg, "load a program object", EINA_FALSE);
         ERR("Abort load of program (%s)", pname);
-        glDeleteProgram_thread_cmd(prg);
+        GL_TH(glDeleteProgram, prg);
         goto finish;
      }
 
    p = calloc(1, sizeof(*p));
+   if (!p) goto finish;
    p->flags = flags;
    p->prog = prg;
    p->reset = EINA_TRUE;
    p->bin_saved = EINA_TRUE;
-   glUseProgram_thread_cmd(prg);
-   p->uniform.mvp = glGetUniformLocation_thread_cmd(prg, "mvp");
-   p->uniform.rotation_id = glGetUniformLocation_thread_cmd(prg, "rotation_id");
+   GL_TH(glUseProgram, prg);
+   p->uniform.mvp = GL_TH(glGetUniformLocation, prg, "mvp");
+   p->uniform.rotation_id = GL_TH(glGetUniformLocation, prg, "rotation_id");
    evas_gl_common_shader_textures_bind(p);
 
 finish:
-   if (vtx) glDeleteShader_thread_cmd(vtx);
-   if (frg) glDeleteShader_thread_cmd(frg);
+   if (vtx) GL_TH(glDeleteShader, vtx);
+   if (frg) GL_TH(glDeleteShader, frg);
    free(formats);
    if (!direct) free(data);
    return p;
@@ -183,13 +190,13 @@ _evas_gl_common_shader_program_binary_save(Evas_GL_Program *p, Eet_File *ef)
 
    if (!glsym_glGetProgramBinary) return 0;
 
-   glGetProgramiv_thread_cmd(p->prog, GL_PROGRAM_BINARY_LENGTH, &length);
+   GL_TH(glGetProgramiv, p->prog, GL_PROGRAM_BINARY_LENGTH, &length);
    if (length <= 0) return 0;
 
    data = malloc(length);
    if (!data) return 0;
 
-   glsym_glGetProgramBinary(p->prog, length, &size, &format, data);
+   GL_TH_CALL(glGetProgramBinaryOES, glsym_glGetProgramBinary, p->prog, length, &size, &format, data);
 
    if (length != size)
      {
@@ -379,7 +386,7 @@ _evas_gl_common_shader_binary_save(Evas_GL_Shared *shared)
 static inline void
 _program_del(Evas_GL_Program *p)
 {
-   if (p->prog) glDeleteProgram_thread_cmd(p->prog);
+   if (p->prog) GL_TH(glDeleteProgram, p->prog);
    free(p);
 }
 
@@ -462,71 +469,66 @@ evas_gl_common_shader_compile(unsigned int flags, const char *vertex,
    GLint ok = 0;
 
    compiler_released = EINA_FALSE;
-   vtx = glCreateShader_thread_cmd(GL_VERTEX_SHADER);
-   frg = glCreateShader_thread_cmd(GL_FRAGMENT_SHADER);
+   vtx = GL_TH(glCreateShader, GL_VERTEX_SHADER);
+   frg = GL_TH(glCreateShader, GL_FRAGMENT_SHADER);
 
-   glShaderSource_thread_cmd(vtx, 1, &vertex, NULL);
-   glCompileShader_thread_cmd(vtx);
-   glGetShaderiv_thread_cmd(vtx, GL_COMPILE_STATUS, &ok);
+   GL_TH(glShaderSource, vtx, 1, &vertex, NULL);
+   GL_TH(glCompileShader, vtx);
+   GL_TH(glGetShaderiv, vtx, GL_COMPILE_STATUS, &ok);
    if (!ok)
      {
         gl_compile_link_error(vtx, "compile vertex shader", EINA_TRUE);
         ERR("Abort compile of vertex shader:\n%s", vertex);
-        glDeleteShader_thread_cmd(vtx);
+        GL_TH(glDeleteShader, vtx);
         return NULL;
      }
    ok = 0;
 
-   glShaderSource_thread_cmd(frg, 1, &fragment, NULL);
-   glCompileShader_thread_cmd(frg);
-   glGetShaderiv_thread_cmd(frg, GL_COMPILE_STATUS, &ok);
+   GL_TH(glShaderSource, frg, 1, &fragment, NULL);
+   GL_TH(glCompileShader, frg);
+   GL_TH(glGetShaderiv, frg, GL_COMPILE_STATUS, &ok);
    if (!ok)
      {
         gl_compile_link_error(frg, "compile fragment shader", EINA_TRUE);
         ERR("Abort compile of fragment shader:\n%s", fragment);
-        glDeleteShader_thread_cmd(vtx);
-        glDeleteShader_thread_cmd(frg);
+        GL_TH(glDeleteShader, vtx);
+        GL_TH(glDeleteShader, frg);
         return NULL;
      }
    ok = 0;
 
-   prg = glCreateProgram_thread_cmd();
+   prg = GL_TH(glCreateProgram);
 #ifndef GL_GLES
    if ((glsym_glGetProgramBinary) && (glsym_glProgramParameteri))
-     glsym_glProgramParameteri(prg, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
+     GL_TH_CALL(glProgramParameteri, glsym_glProgramParameteri, prg, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
 #endif
-   glAttachShader_thread_cmd(prg, vtx);
-   glAttachShader_thread_cmd(prg, frg);
-
-   glBindAttribLocation_thread_cmd(prg, SHAD_VERTEX,  "vertex");
-   glBindAttribLocation_thread_cmd(prg, SHAD_COLOR,   "color");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV,   "tex_coord");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV2,  "tex_coord2");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXUV3,  "tex_coord3");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXA,    "tex_coorda");
-   glBindAttribLocation_thread_cmd(prg, SHAD_TEXSAM,  "tex_sample");
-   glBindAttribLocation_thread_cmd(prg, SHAD_MASK,    "mask_coord");
-   glBindAttribLocation_thread_cmd(prg, SHAD_MASKSAM, "tex_masksample");
-
-   glLinkProgram_thread_cmd(prg);
-   glGetProgramiv_thread_cmd(prg, GL_LINK_STATUS, &ok);
+   GL_TH(glAttachShader, prg, vtx);
+   GL_TH(glAttachShader, prg, frg);
+
+   _attributes_bind(prg);
+
+   GL_TH(glLinkProgram, prg);
+   GL_TH(glGetProgramiv, prg, GL_LINK_STATUS, &ok);
    if (!ok)
      {
         gl_compile_link_error(prg, "link fragment and vertex shaders", EINA_FALSE);
         ERR("Abort compile of shader (flags: %08x)", flags);
-        glDeleteShader_thread_cmd(vtx);
-        glDeleteShader_thread_cmd(frg);
-        glDeleteProgram_thread_cmd(prg);
+        GL_TH(glDeleteShader, vtx);
+        GL_TH(glDeleteShader, frg);
+        GL_TH(glDeleteProgram, prg);
         return 0;
      }
 
    p = calloc(1, sizeof(*p));
-   p->flags = flags;
-   p->prog = prg;
-   p->reset = EINA_TRUE;
+   if (p)
+     {
+       p->flags = flags;
+       p->prog = prg;
+       p->reset = EINA_TRUE;
+     }
 
-   glDeleteShader_thread_cmd(vtx);
-   glDeleteShader_thread_cmd(frg);
+   GL_TH(glDeleteShader, vtx);
+   GL_TH(glDeleteShader, frg);
 
    return p;
 }
@@ -632,8 +634,8 @@ evas_gl_common_shader_generate_and_compile(Evas_GL_Shared *shared, unsigned int
    if (p)
      {
         shared->needs_shaders_flush = 1;
-        p->uniform.mvp = glGetUniformLocation_thread_cmd(p->prog, "mvp");
-        p->uniform.rotation_id = glGetUniformLocation_thread_cmd(p->prog, "rotation_id");
+        p->uniform.mvp = GL_TH(glGetUniformLocation, p->prog, "mvp");
+        p->uniform.rotation_id = GL_TH(glGetUniformLocation, p->prog, "rotation_id");
         evas_gl_common_shader_textures_bind(p);
         eina_hash_add(shared->shaders_hash, &flags, p);
      }
@@ -733,10 +735,10 @@ evas_gl_common_shaders_flush(Evas_GL_Shared *shared)
      {
         compiler_released = EINA_TRUE;
 #ifdef GL_GLES
-        glReleaseShaderCompiler_thread_cmd();
+        GL_TH(glReleaseShaderCompiler);
 #else
         if (glsym_glReleaseShaderCompiler)
-          glsym_glReleaseShaderCompiler();
+          GL_TH_CALL(glReleaseShaderCompiler, glsym_glReleaseShaderCompiler);
 #endif
      }
    if (shared->needs_shaders_flush)
@@ -961,21 +963,21 @@ evas_gl_common_shader_textures_bind(Evas_GL_Program *p)
    if (hastex)
      {
         GLuint curr_prog = 0;
-        glGetIntegerv_thread_cmd(GL_CURRENT_PROGRAM, (GLint *)&curr_prog);
+        GL_TH(glGetIntegerv, GL_CURRENT_PROGRAM, (GLint *)&curr_prog);
 
-        glUseProgram_thread_cmd(p->prog); // is this necessary??
+        GL_TH(glUseProgram, p->prog); // is this necessary??
         for (i = 0; textures[i].name; i++)
           {
              if (!textures[i].enabled) continue;
-             loc = glGetUniformLocation_thread_cmd(p->prog, textures[i].name);
+             loc = GL_TH(glGetUniformLocation, p->prog, textures[i].name);
              if (loc < 0)
                {
                   ERR("Couldn't find uniform '%s' (shader: %08x)",
                       textures[i].name, p->flags);
                }
-             glUniform1i_thread_cmd(loc, p->tex_count++);
+             GL_TH(glUniform1i, loc, p->tex_count++);
           }
-        glUseProgram_thread_cmd(curr_prog);
+        GL_TH(glUseProgram, curr_prog);
      }
 }
 
index 1fe2c06..ef2c9c0 100644 (file)
@@ -102,7 +102,7 @@ _tex_sub_2d(Evas_Engine_GL_Context *gc, int x, int y, int w, int h, int fmt, int
 {
    if ((w > gc->shared->info.max_texture_size) ||
        (h > gc->shared->info.max_texture_size)) return;
-   glTexSubImage2DEVAS_thread_cmd(0, GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
+   GL_TH_FN(glTexSubImage2DEVAS)(0, GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
 }
 
 static void
@@ -110,7 +110,7 @@ _tex_sub_2d_push(Evas_Engine_GL_Context *gc, int x, int y, int w, int h, int fmt
 {
    if ((w > gc->shared->info.max_texture_size) ||
        (h > gc->shared->info.max_texture_size)) return;
-   glTexSubImage2DEVAS_thread_cmd(1, GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
+   GL_TH_FN(glTexSubImage2DEVAS)(1, GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
 }
 
 static void
@@ -118,7 +118,7 @@ _comp_tex_sub_2d(Evas_Engine_GL_Context *gc, int x, int y, int w, int h, int fmt
 {
    if ((w > gc->shared->info.max_texture_size) ||
        (h > gc->shared->info.max_texture_size)) return;
-   glCompressedTexSubImage2D_thread_cmd(GL_TEXTURE_2D, 0, x, y, w, h, fmt, imgsize, pix);
+   GL_TH(glCompressedTexSubImage2D, GL_TEXTURE_2D, 0, x, y, w, h, fmt, imgsize, pix);
 }
 
 #ifdef GL_TEXTURE_INTERNAL_FORMAT
@@ -200,7 +200,7 @@ evas_gl_common_texture_shared_specific(Evas_Engine_GL_Context *gc, Evas_GL_Textu
         else
           gc->pipe[i].shader.tex_target = GL_TEXTURE_2D;
 
-        glBindTexture_thread_cmd(gc->pipe[i].shader.tex_target, gc->pipe[i].shader.cur_tex);
+        GL_TH(glBindTexture, gc->pipe[i].shader.tex_target, gc->pipe[i].shader.cur_tex);
      }
 }
 
@@ -357,18 +357,18 @@ _tex_2d(Evas_Engine_GL_Context *gc, int intfmt, int w, int h, int fmt, int type,
      }
    sz = _evas_gl_texture_size_get(w, h, intfmt, &comp);
    if (!comp)
-     glTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, data);
+     GL_TH(glTexImage2D, GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, data);
    else
-     glCompressedTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, intfmt, w, h, 0, sz, data);
+     GL_TH(glCompressedTexImage2D, GL_TEXTURE_2D, 0, intfmt, w, h, 0, sz, data);
 #ifdef GL_TEXTURE_INTERNAL_FORMAT
 # ifdef GL_GLES
 # else
 // this is not in opengles!!! hrrrm   
-//   if (glGetTexLevelParameteriv) // in case of weak symbols?
+//   if (GL_TH(glGetTexLevelParameteriv)) // in case of weak symbols?
      {
         int intfmtret = -1;
 
-        glGetTexLevelParameteriv_thread_cmd(GL_TEXTURE_2D, 0,
+        GL_TH(glGetTexLevelParameteriv, GL_TEXTURE_2D, 0,
                                  GL_TEXTURE_INTERNAL_FORMAT, &intfmtret);
         if (!_evas_gl_texture_match(intfmt, intfmtret))
           {
@@ -442,22 +442,22 @@ _pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, GLenum intformat, GLenum
    pt->references = 0;
    pt->eina_pool = eina_rectangle_pool_new(w, h);
 
-   glGenTextures_thread_cmd(1, &(pt->texture));
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, pt->texture);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GL_TH(glGenTextures, 1, &(pt->texture));
+   GL_TH(glBindTexture, GL_TEXTURE_2D, pt->texture);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat, NULL);
 
    if (gc->state.current.tex_target)
-      glBindTexture_thread_cmd(gc->state.current.tex_target, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, gc->state.current.tex_target, gc->state.current.cur_tex);
    else
-      glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, GL_TEXTURE_2D, gc->state.current.cur_tex);
 
    if (!ok)
      {
-        glDeleteTextures_thread_cmd(1, &(pt->texture));
+        GL_TH(glDeleteTextures, 1, &(pt->texture));
         if (pt->eina_pool)
           eina_rectangle_pool_free(pt->eina_pool);
         free(pt);
@@ -672,41 +672,42 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
 #  define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
 # endif
 #endif
-   glGetIntegerv_thread_cmd(GL_FRAMEBUFFER_BINDING, &fnum);
-   glGenTextures_thread_cmd(1, &(pt->texture));
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, pt->texture);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GL_TH(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &fnum);
+   GL_TH(glGenTextures, 1, &(pt->texture));
+   GL_TH(glBindTexture, GL_TEXTURE_2D, pt->texture);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GL_TH(glTexParameteri, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat, NULL);
 
    if (ok)
      {
-        glsym_glGenFramebuffers(1, &(pt->fb));
-        glsym_glBindFramebuffer(GL_FRAMEBUFFER, pt->fb);
-        glsym_glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pt->texture, 0);
+        GL_TH_CALL(glGenFramebuffers, glsym_glGenFramebuffers, 1, &(pt->fb));
+        GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, pt->fb);
+        GL_TH_CALL(glFramebufferTexture2D, glsym_glFramebufferTexture2D,
+                   GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pt->texture, 0);
         // note: should check fbo completeness
      }
 
    if (stencil)
      {
-        glGenRenderbuffers_thread_cmd(1, &(pt->stencil));
-        glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, pt->stencil);
-        glRenderbufferStorage_thread_cmd(GL_RENDERBUFFER, GL_STENCIL_INDEX8, pt->w, pt->h);
-        glBindRenderbuffer_thread_cmd(GL_RENDERBUFFER, 0);
-        glFramebufferRenderbuffer_thread_cmd(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, pt->stencil);
+        GL_TH(glGenRenderbuffers, 1, &(pt->stencil));
+        GL_TH(glBindRenderbuffer, GL_RENDERBUFFER, pt->stencil);
+        GL_TH(glRenderbufferStorage, GL_RENDERBUFFER, GL_STENCIL_INDEX8, pt->w, pt->h);
+        GL_TH(glBindRenderbuffer, GL_RENDERBUFFER, 0);
+        GL_TH(glFramebufferRenderbuffer, GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, pt->stencil);
      }
 
-   glsym_glBindFramebuffer(GL_FRAMEBUFFER, fnum);
+   GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, fnum);
    if (gc->state.current.tex_target)
-      glBindTexture_thread_cmd(gc->state.current.tex_target, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, gc->state.current.tex_target, gc->state.current.cur_tex);
    else
-      glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, GL_TEXTURE_2D, gc->state.current.cur_tex);
 
    if (!ok)
      {
-        glDeleteTextures_thread_cmd(1, &(pt->texture));
+        GL_TH(glDeleteTextures, 1, &(pt->texture));
         if (pt->eina_pool)
           eina_rectangle_pool_free(pt->eina_pool);
         free(pt);
@@ -753,8 +754,8 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
    pt->references = 0;
    pt->native = 1;
    pt->eina_pool = eina_rectangle_pool_new(w, h);
-   glGenTextures_thread_cmd(1, &(pt->texture));
-   glBindTexture_thread_cmd(im->native.target, pt->texture);
+   GL_TH(glGenTextures, 1, &(pt->texture));
+   GL_TH(glBindTexture, im->native.target, pt->texture);
 
 #ifdef GL_GLES
 #else
@@ -765,15 +766,15 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
      }
 #endif
 
-   glTexParameteri_thread_cmd(im->native.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(im->native.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-   glBindTexture_thread_cmd(im->native.target, 0);
+   GL_TH(glTexParameteri, im->native.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, im->native.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GL_TH(glTexParameteri, im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GL_TH(glBindTexture, im->native.target, 0);
    if (gc->state.current.tex_target)
-      glBindTexture_thread_cmd(gc->state.current.tex_target, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, gc->state.current.tex_target, gc->state.current.cur_tex);
    else
-      glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, GL_TEXTURE_2D, gc->state.current.cur_tex);
 
    texinfo.n.num++;
    texinfo.n.pix += pt->w * pt->h;
@@ -810,12 +811,12 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
 
    pt->dyn.target = GL_TEXTURE_2D;
 
-   glGenTextures_thread_cmd(1, &(pt->texture));
-   glBindTexture_thread_cmd(pt->dyn.target, pt->texture);
-   glTexParameteri_thread_cmd(pt->dyn.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(pt->dyn.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri_thread_cmd(pt->dyn.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-   glTexParameteri_thread_cmd(pt->dyn.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+   GL_TH(glGenTextures, 1, &(pt->texture));
+   GL_TH(glBindTexture, pt->dyn.target, pt->texture);
+   GL_TH(glTexParameteri, pt->dyn.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, pt->dyn.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   GL_TH(glTexParameteri, pt->dyn.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+   GL_TH(glTexParameteri, pt->dyn.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
    egldisplay = pt->gc->egldisp;
 
@@ -924,9 +925,9 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i
      }
 
    if (gc->state.current.tex_target)
-      glBindTexture_thread_cmd(gc->state.current.tex_target, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, gc->state.current.tex_target, gc->state.current.cur_tex);
    else
-      glBindTexture_thread_cmd(GL_TEXTURE_2D, gc->state.current.cur_tex);
+      GL_TH(glBindTexture, GL_TEXTURE_2D, gc->state.current.cur_tex);
 #else
    if (gc + w + h + intformat + format) return pt;
 #endif
@@ -940,8 +941,8 @@ error:
        secsym_eglDestroyImage(egldisplay, pt->dyn.img);
        pt->dyn.img = NULL;
     }
-  glBindTexture_thread_cmd(pt->dyn.target, 0);
-  glDeleteTextures_thread_cmd(1, &(pt->texture));
+  GL_TH(glBindTexture, pt->dyn.target, 0);
+  GL_TH(glDeleteTextures, 1, &(pt->texture));
   if (pt->eina_pool)
     eina_rectangle_pool_free(pt->eina_pool);
   free(pt);
@@ -1012,17 +1013,17 @@ evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt)
      }
 #endif
 
-   glDeleteTextures_thread_cmd(1, &(pt->texture));
+   GL_TH(glDeleteTextures, 1, &(pt->texture));
    if (pt->gc->state.current.cur_tex == pt->texture)
      pt->gc->state.current.cur_tex = 0;
    if (pt->stencil)
      {
-        glDeleteRenderbuffers_thread_cmd(1, &(pt->stencil));
+        GL_TH(glDeleteRenderbuffers, 1, &(pt->stencil));
         pt->stencil = 0;
      }
    if (pt->fb)
      {
-        glsym_glDeleteFramebuffers(1, &(pt->fb));
+        GL_TH_CALL(glDeleteFramebuffers, glsym_glDeleteFramebuffers, 1, &(pt->fb));
         pt->fb = 0;
      }
     EINA_LIST_FREE(pt->allocations, apt)
@@ -1140,10 +1141,10 @@ evas_gl_common_texture_upload(Evas_GL_Texture *tex, RGBA_Image *im, unsigned int
    GLuint fmt;
 
    fmt = tex->pt->format;
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
    if (tex->gc->shared->info.unpack_row_length)
-     glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, 0);
-   glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, bytes_count);
+     GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, 0);
+   GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, bytes_count);
 
    if ((tex->gc->shared->info.tune.atlas.max_memcpy_size > im->cache_entry.w) &&
            (tex->gc->shared->info.tune.atlas.max_memcpy_size > im->cache_entry.h))
@@ -1246,7 +1247,7 @@ evas_gl_common_texture_upload(Evas_GL_Texture *tex, RGBA_Image *im, unsigned int
                     im->image.data8 + (im->cache_entry.w - 1) * bytes_count);
         if (tex->gc->shared->info.unpack_row_length)
           {
-            glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, im->cache_entry.w);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, im->cache_entry.w);
             // |xxx
             // |xxx
             //
@@ -1300,13 +1301,13 @@ evas_gl_common_texture_upload(Evas_GL_Texture *tex, RGBA_Image *im, unsigned int
                         tpix);
           }
      }
-   //glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 4);
+   //GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 4);
    if (tex->pt->texture != tex->gc->state.current.cur_tex)
      {
         if (tex->gc->state.current.tex_target)
-           glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+           GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
         else
-           glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+           GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
      }
 }
 
@@ -1369,22 +1370,22 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
            height = im->cache_entry.h + im->cache_entry.borders.t + im->cache_entry.borders.b;
            EINA_SAFETY_ON_FALSE_RETURN(!(width & 0x3) && !(height & 0x3));
 
-           glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+           GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
 
            if ((tex->gc->shared->info.etc1_subimage ||
                (im->cache_entry.space != EVAS_COLORSPACE_ETC1))
                && (tex->pt->w != width || tex->pt->h != height))
              {
                 int err;
-                err = glGetError_thread_cmd();
+                err = GL_TH(glGetError);
 
-                glCompressedTexSubImage2D_thread_cmd(GL_TEXTURE_2D, 0,
+                GL_TH(glCompressedTexSubImage2D, GL_TEXTURE_2D, 0,
                                           x, y, width, height,
                                           tex->pt->format,
                                           ((width * height) >> 4) * bsize,
                                           im->image.data);
 
-                err = glGetError_thread_cmd();
+                err = GL_TH(glGetError);
                 if (err != GL_NO_ERROR)
                   {
                      __evas_gl_err(err, __FILE__, __FUNCTION__, __LINE__,
@@ -1399,7 +1400,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
              }
            else
              {
-                glCompressedTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, tex->pt->format,
+                GL_TH(glCompressedTexImage2D, GL_TEXTURE_2D, 0, tex->pt->format,
                                        width, height, 0,
                                        ((width * height) >> 4) * bsize,
                                        im->image.data);
@@ -1408,9 +1409,9 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
            if (tex->pt->texture != tex->gc->state.current.cur_tex)
              {
                 if (tex->gc->state.current.tex_target)
-                   glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+                   GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
                 else
-                   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+                   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
              }
            return;
         }
@@ -1519,12 +1520,12 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
 
         // Bind and upload ! Vooom !
         fmt = tex->ptt->format;
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptt->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptt->texture);
         if (tex->gc->shared->info.unpack_row_length)
           {
-             glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, 0);
+             GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, 0);
           }
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, bytes_count);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, bytes_count);
 
         _tex_sub_2d(tex->gc, u, tex->ty, EVAS_GL_TILE_SIZE, EVAS_GL_TILE_SIZE, fmt, tex->ptt->dataformat, out);
 
@@ -1532,9 +1533,9 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
         if (tex->ptt->texture != tex->gc->state.current.cur_tex)
           {
              if (tex->gc->state.current.tex_target)
-                glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+                GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
              else
-                glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+                GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
           }
 
         // Now prepare uploading the main texture before returning;
@@ -1671,20 +1672,20 @@ evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels,
                                     unsigned int w, unsigned int h, int fh EINA_UNUSED)
 {
    if (!tex->pt) return;
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
    if (tex->gc->shared->info.unpack_row_length)
      {
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, 0);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, 0);
      }
-   glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 4);
+   GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 4);
    _tex_sub_2d(tex->gc, tex->x, tex->y, w, h, tex->pt->format,
                tex->pt->dataformat, pixels);
    if (tex->pt->texture != tex->gc->state.current.cur_tex)
      {
         if (tex->gc->state.current.tex_target)
-           glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+           GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
         else
-           glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+           GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
      }
 }
 
@@ -1778,25 +1779,25 @@ evas_gl_common_texture_rgb_a_pair_update(Evas_GL_Texture *tex,
    if (!subimage || tex->gc->shared->info.unpack_row_length)
      {
         if (tex->gc->shared->info.unpack_row_length)
-          glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, w);
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+          GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, w);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
           goto on_error;
         if (upload)
           {
              if (comp)
-               glCompressedTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, tex->pt->intformat, w, h, 0, sz, data1);
+               GL_TH(glCompressedTexImage2D, GL_TEXTURE_2D, 0, tex->pt->intformat, w, h, 0, sz, data1);
              else
                _tex_sub_2d_push(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, data1);
           }
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pta->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pta->texture);
         if (!_tex_2d(tex->gc, tex->pta->intformat, w, h, tex->pta->format, tex->pta->dataformat, NULL))
           goto on_error;
         if (upload)
           {
              if (comp)
-               glCompressedTexImage2D_thread_cmd(GL_TEXTURE_2D, 0, tex->pta->intformat, w, h, 0, sz, data2);
+               GL_TH(glCompressedTexImage2D, GL_TEXTURE_2D, 0, tex->pta->intformat, w, h, 0, sz, data2);
              else
                _tex_sub_2d_push(tex->gc, 0, 0, w, h, tex->pta->format, tex->pta->dataformat, data2);
           }
@@ -1805,8 +1806,8 @@ evas_gl_common_texture_rgb_a_pair_update(Evas_GL_Texture *tex,
      {
         int y;
 
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format,
                      tex->pt->dataformat, NULL))
           goto on_error;
@@ -1832,7 +1833,7 @@ evas_gl_common_texture_rgb_a_pair_update(Evas_GL_Texture *tex,
                }
           }
 
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pta->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pta->texture);
         if (!_tex_2d(tex->gc, tex->pta->intformat, w, h, tex->pta->format,
                      tex->pta->dataformat, NULL))
           goto on_error;
@@ -1860,9 +1861,9 @@ evas_gl_common_texture_rgb_a_pair_update(Evas_GL_Texture *tex,
      }
 on_error:
    if (tex->gc->state.current.tex_target)
-      glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+      GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
    else
-      glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+      GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
    evas_gl_thread_finish();
 }
 
@@ -1990,19 +1991,19 @@ _orig_evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
    // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2
    if (tex->gc->shared->info.unpack_row_length)
      {
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]);
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
           goto finish;
         _tex_sub_2d_push(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptu->texture);
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptu->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
         if (!_tex_2d(tex->gc, tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, NULL))
           goto finish;
         _tex_sub_2d_push(tex->gc, 0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptv->texture);
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptv->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]);
         if (!_tex_2d(tex->gc, tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, NULL))
           goto finish;
         _tex_sub_2d_push(tex->gc, 0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
@@ -2011,8 +2012,8 @@ _orig_evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
      {
         unsigned int y;
         
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
           goto finish;
         if ((rows[1] - rows[0]) == (int)w)
@@ -2023,7 +2024,7 @@ _orig_evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
                _tex_sub_2d_push(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
           }
 
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptu->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptu->texture);
         if (!_tex_2d(tex->gc, tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, NULL))
           goto finish;
         if ((rows[h + 1] - rows[h]) == (int)(w / 2))
@@ -2034,7 +2035,7 @@ _orig_evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
                _tex_sub_2d_push(tex->gc, 0, y, w / 2, 1, tex->ptu->format, tex->ptu->dataformat, rows[h + y]);
           }
 
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptv->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptv->texture);
         if (!_tex_2d(tex->gc, tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, NULL))
           goto finish;
         if ((rows[h + (h / 2) + 1] - rows[h + (h / 2)]) == (int)(w / 2))
@@ -2048,9 +2049,9 @@ _orig_evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
    if (tex->pt->texture != tex->gc->state.current.cur_tex)
      {
         if (tex->gc->state.current.tex_target)
-          glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
         else
-          glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
      }
 
 finish:
@@ -2063,38 +2064,39 @@ typedef struct
    DATA8 **rows;
    unsigned int w;
    unsigned int h;
-} Evas_Thread_Command_evas_gl_common_texture_yuv_update;
+} GL_TH_ST(evas_gl_common_texture_yuv_update);
 
 static void
-_gl_thread_evas_gl_common_texture_yuv_update(void *data)
+GL_TH_CB(evas_gl_common_texture_yuv_update)(void *data)
 {
-   Evas_Thread_Command_evas_gl_common_texture_yuv_update *thread_param =
-      (Evas_Thread_Command_evas_gl_common_texture_yuv_update *)data;
+   GL_TH_ST(evas_gl_common_texture_yuv_update) *thread_data = *(void**)data;
 
-   evas_gl_thread_begin();
-   _orig_evas_gl_common_texture_yuv_update(thread_param->tex, thread_param->rows, thread_param->w, thread_param->h);
-   evas_gl_thread_end();
+   _orig_evas_gl_common_texture_yuv_update(thread_data->tex, thread_data->rows, thread_data->w, thread_data->h);
 }
 
 void
 evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned int w, unsigned int h)
 {
-   if (!evas_gl_thread_enabled())
+   GL_TH_ST(evas_gl_common_texture_yuv_update) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
      {
         _orig_evas_gl_common_texture_yuv_update(tex, rows, w, h);
         return;
      }
 
-   Evas_Thread_Command_evas_gl_common_texture_yuv_update thread_param_local;
-   Evas_Thread_Command_evas_gl_common_texture_yuv_update *thread_param = &thread_param_local;
-   thread_param->tex = tex;
-   thread_param->rows = rows;
-   thread_param->w = w;
-   thread_param->h = h;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(evas_gl_common_texture_yuv_update) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->tex = tex;
+   thread_data->rows = rows;
+   thread_data->w = w;
+   thread_data->h = h;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_evas_gl_common_texture_yuv_update,
-                              thread_param,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evas_gl_common_texture_yuv_update),
                               EVAS_GL_THREAD_MODE_FINISH);
 
 }
@@ -2235,8 +2237,8 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
    tex->pt = tex->double_buffer.pt[tex->double_buffer.source];
    tex->ptuv = tex->double_buffer.ptuv[tex->double_buffer.source];
 
-   glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+   GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
    if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
      return;
    if ((rows[1] - rows[0]) == (int)w * 4)
@@ -2247,7 +2249,7 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
           _tex_sub_2d_push(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
      }
 
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptuv->texture);
+  GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptuv->texture);
    if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat, NULL))
      goto finish;
 #if 0
@@ -2267,9 +2269,9 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
    if (tex->pt->texture != tex->gc->state.current.cur_tex)
      {
         if (tex->gc->state.current.tex_target)
-          glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
         else
-          glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
      }
 finish:
    evas_gl_thread_finish();
@@ -2287,14 +2289,14 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
    // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2
    if (tex->gc->shared->info.unpack_row_length)
      {
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]);
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
           goto finish;
         _tex_sub_2d_push(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptuv->texture);
-        glPixelStorei_thread_cmd(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptuv->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
         if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, NULL))
           goto finish;
         _tex_sub_2d_push(tex->gc, 0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]);
@@ -2303,8 +2305,8 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
      {
         unsigned int y;
 
-        glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+        GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
         if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
           goto finish;
         if ((rows[1] - rows[0]) == (int)w)
@@ -2315,7 +2317,7 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
                _tex_sub_2d_push(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
           }
 
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptuv->texture);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptuv->texture);
         if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, NULL))
           goto finish;
         if ((rows[h + 1] - rows[h]) == (int)(w / 2))
@@ -2329,9 +2331,9 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
    if (tex->pt->texture != tex->gc->state.current.cur_tex)
      {
         if (tex->gc->state.current.tex_target)
-          glBindTexture_thread_cmd(tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, tex->gc->state.current.tex_target, tex->gc->state.current.cur_tex);
         else
-          glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
+          GL_TH(glBindTexture, GL_TEXTURE_2D, tex->gc->state.current.cur_tex);
      }
 finish:
    evas_gl_thread_finish();
@@ -2491,8 +2493,8 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
      }
 #endif
 
-   glPixelStorei_thread_cmd(GL_UNPACK_ALIGNMENT, 1);
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->pt->texture);
+   GL_TH(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->pt->texture);
 
    // We are telling the driver to not swizzle back the buffer as we are going to replace all pixel
    if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat, NULL))
@@ -2539,7 +2541,7 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
           _tex_sub_2d_push(tex->gc, x, ry, 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x);
      }
 
-   glBindTexture_thread_cmd(GL_TEXTURE_2D, tex->ptuv->texture);
+   GL_TH(glBindTexture, GL_TEXTURE_2D, tex->ptuv->texture);
 
    if (!_tex_2d(tex->gc, tex->ptuv->intformat, w, h, tex->ptuv->format, tex->ptuv->dataformat, NULL))
      goto finish;
index 2f6978e..d3d7026 100644 (file)
@@ -1,8 +1,7 @@
 #include "evas_gl_common.h"
-#include "evas_gl_thread.h"
 
 /* Main Thread id */
-Eina_Thread _main_thread_id = 0;
+static Eina_Thread    _main_thread_id = 0;
 
 #ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
@@ -17,7 +16,7 @@ unsigned int _mp_default_memory_size = 128;
 unsigned int _mp_command_memory_size = 256;
 unsigned int _mp_uniform_memory_size = 128;
 unsigned int _mp_delete_object_memory_size = 128;
-unsigned int _mp_texture_memory_size = 4 * 256 * 256;
+unsigned int _mp_texture_memory_size       = 128 * 1024;
 
 unsigned int _mp_default_pool_size     = 64;
 unsigned int _mp_command_pool_size     = 64;
@@ -28,72 +27,84 @@ unsigned int _mp_texture_pool_size = 8;
 
 /* Thread Environment */
 static int env_evas_gl_render_thread = -1;
-static int env_evas_evgl_render_thread = -1;
 static int env_evas_gl_force_finish = -1;
-static int evas_gl_enable_thread = 0;
-static int evas_evgl_enable_thread = 0;
 
 int
-evas_gl_thread_enabled()
+evas_gl_thread_enabled(int thread_type)
 {
-   if (env_evas_gl_render_thread == -1)
-     {
-        char *env_thread = getenv("EVAS_GL_RENDER_THREAD");
-        int env_thread_value = 0;
-        if (env_thread)
-           env_thread_value = atoi(env_thread);
-
-        /* Thread rendering is forced off because direct rendering explicitly on */
-        char *env_direct_override = getenv("EVAS_GL_DIRECT_OVERRIDE");
-        int env_direct_override_value = 0;
-        if (env_direct_override)
-           env_direct_override_value = atoi(env_direct_override);
+  if (env_evas_gl_render_thread == 0) {
+      return 0;
+  }
+
+  Eina_Thread tid = eina_thread_self();
+  if (UNLIKELY(tid != _main_thread_id))
+    {
+      if (thread_type == EVAS_GL_THREAD_TYPE_EVGL) {
+          return 0;
+      }
+    }
+  if (UNLIKELY(tid == evas_gl_thread_get(EVAS_GL_THREAD_TYPE_GL))) {
+      return 0;
+  }
+  return 1;
+}
 
-        if (env_thread_value == 1 && env_direct_override_value == 0)
-          env_evas_gl_render_thread = 1;
-        else
-          env_evas_gl_render_thread = 0;
-     }
-   return env_evas_gl_render_thread &&
-      (evas_gl_enable_thread == 0);
+void
+evas_gl_thread_disabled(void)
+{
+  env_evas_gl_render_thread = 0;
 }
 
 int
-evas_evgl_thread_enabled()
+evas_gl_thread_force_finish(void)
 {
-   if (env_evas_evgl_render_thread == -1)
+   if (env_evas_gl_force_finish == -1)
      {
-        char *env_thread = getenv("EVAS_EVGL_RENDER_THREAD");
+        char *env_thread = getenv("EVAS_GL_RENDER_THREAD_FORCE_FINISH");
         int env_thread_value = 0;
         if (env_thread)
            env_thread_value = atoi(env_thread);
 
         if (env_thread_value)
-          env_evas_evgl_render_thread = 1;
+           env_evas_gl_force_finish = 1;
         else
-          env_evas_evgl_render_thread = 0;
+           env_evas_gl_force_finish = 0;
      }
-   return env_evas_gl_render_thread &&
-      env_evas_evgl_render_thread &&
-      (evas_evgl_enable_thread == 0);
+   return env_evas_gl_force_finish;
 }
 
-int
-evas_gl_thread_force_finish()
+static Evas_GL_Thread_Func th_func;
+Eina_Bool th_func_initialized = EINA_FALSE;
+
+EAPI const Evas_GL_Thread_Func *
+evas_gl_thread_func_get(void)
 {
-   if (env_evas_gl_force_finish == -1)
+   if (!th_func_initialized)
      {
-        if (getenv("EVAS_GL_RENDER_THREAD_FORCE_FINISH"))
-          env_evas_gl_force_finish = 1;
-        else
-          env_evas_gl_force_finish = 0;
+#define THREAD_FUNCTION_ASSIGN(func) th_func.func = func;
+
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_enabled);
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_disabled);
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_finish);
+
+#ifdef GL_GLES
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_egl_func_get);
+#else
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_glx_func_get);
+#endif
+
+        THREAD_FUNCTION_ASSIGN(evas_gl_thread_gl_func_get);
+
+#undef THREAD_FUNCTION_ASSIGN
+
+        th_func_initialized = EINA_TRUE;
      }
-   return env_evas_gl_force_finish;
-}
 
+   return &th_func;
+}
 
 void
-evas_gl_thread_init()
+evas_gl_thread_init(void)
 {
 #define BUILD_MEMPOOL(name) \
    name = eina_mempool_add("chained_mempool", #name, NULL, \
@@ -101,6 +112,16 @@ evas_gl_thread_init()
    if (name == NULL) \
    EINA_LOG_ERR("eina_mempool_add() failed");
 
+   char *env_thread = getenv("EVAS_GL_RENDER_THREAD");
+   int env_thread_value = 0;
+   if (env_thread)
+      env_thread_value = atoi(env_thread);
+
+   if (env_thread_value == 1)
+      env_evas_gl_render_thread = 1;
+   else
+      env_evas_gl_render_thread = 0;
+
    BUILD_MEMPOOL(_mp_default);
    BUILD_MEMPOOL(_mp_command);
    BUILD_MEMPOOL(_mp_uniform);
@@ -111,7 +132,7 @@ evas_gl_thread_init()
 }
 
 void
-evas_gl_thread_terminate()
+evas_gl_thread_terminate(void)
 {
    eina_mempool_del(_mp_default);
    eina_mempool_del(_mp_command);
@@ -120,57 +141,22 @@ evas_gl_thread_terminate()
    eina_mempool_del(_mp_texture);
 }
 
-void
-evas_gl_thread_begin()
-{
-   evas_gl_enable_thread++;
-}
-
-void
-evas_gl_thread_end()
-{
-   evas_gl_enable_thread--;
-}
-
-static void
-_gl_thread_finish(void *data)
-{
-    data = data;
-}
-
-void
-evas_gl_thread_finish()
-{
-   if (evas_gl_thread_enabled())
-   {
-      evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL, _gl_thread_finish, NULL, EVAS_GL_THREAD_MODE_FINISH);
-   }
-}
-
-void
-evas_evgl_thread_begin()
-{
-   evas_evgl_enable_thread++;
-}
-
-void
-evas_evgl_thread_end()
-{
-   evas_evgl_enable_thread--;
-}
-
 static void
-_evgl_thread_finish(void *data)
+GL_TH_CB(finish)(void *data)
 {
     data = data;
 }
 
 void
-evas_evgl_thread_finish()
+evas_gl_thread_finish(void)
 {
-   if (evas_gl_thread_enabled())
+   if (evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
    {
-      evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL, _evgl_thread_finish, NULL, EVAS_GL_THREAD_MODE_FINISH);
+      void *thcmd_ref;
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, 0, &thcmd_ref);
+      evas_gl_thread_cmd_enqueue(thcmd_ref,
+                                 GL_TH_CB(finish),
+                                 EVAS_GL_THREAD_MODE_FINISH);
    }
 }
 
@@ -180,42 +166,58 @@ evas_evgl_thread_finish()
 
 #include <dlfcn.h>
 
-int (*evas_gl_thread_enabled)();
-int (*evas_evgl_thread_enabled)();
+const Evas_GL_Thread_Func *(*evas_gl_thread_func_get)(void);
 
-void (*evas_gl_thread_begin)();
-void (*evas_gl_thread_end)();
-void (*evas_gl_thread_finish)();
-void (*evas_evgl_thread_begin)();
-void (*evas_evgl_thread_end)();
-void (*evas_evgl_thread_finish)();
+int (*evas_gl_thread_enabled)(int thread_type);
+void (*evas_gl_thread_disabled)(void);
+void (*evas_gl_thread_finish)(void);
 
 void
-evas_gl_thread_link_init()
+evas_gl_thread_link_init(void)
 {
+   const Evas_GL_Thread_Func *th_func = NULL;
+
 #define LINK2GENERIC(sym) \
    sym = dlsym(RTLD_DEFAULT, #sym); \
    if (!sym) ERR("Could not find function '%s'", #sym);
 
-   LINK2GENERIC(evas_gl_thread_enabled);
-   LINK2GENERIC(evas_evgl_thread_enabled);
+   LINK2GENERIC(evas_gl_thread_func_get);
+
+   th_func = evas_gl_thread_func_get();
+
+   if (!th_func)
+     {
+        ERR("Thread functions (BASE) are not exist");
+        return;
+     }
+
+#define THREAD_FUNCTION_ASSIGN(func) func = th_func->func;
 
-   LINK2GENERIC(evas_gl_thread_begin);
-   LINK2GENERIC(evas_gl_thread_end);
-   LINK2GENERIC(evas_gl_thread_finish);
-   LINK2GENERIC(evas_evgl_thread_begin);
-   LINK2GENERIC(evas_evgl_thread_end);
-   LINK2GENERIC(evas_evgl_thread_finish);
+   THREAD_FUNCTION_ASSIGN(evas_gl_thread_enabled);
+   THREAD_FUNCTION_ASSIGN(evas_gl_thread_disabled);
+   THREAD_FUNCTION_ASSIGN(evas_gl_thread_finish);
+
+#undef THREAD_FUNCTION_ASSIGN
 
 #ifdef GL_GLES
-   _egl_thread_link_init();
+   if (th_func->evas_gl_thread_egl_func_get)
+      _egl_thread_link_init(th_func->evas_gl_thread_egl_func_get());
+   else
+      ERR("Thread functions (EGL) are not exist");
 #else
-   _glx_thread_link_init();
+   if (th_func->evas_gl_thread_glx_func_get)
+      _glx_thread_link_init(th_func->evas_gl_thread_glx_func_get());
+   else
+      ERR("Thread functions (GLX) are not exist");
 #endif
-   _gl_thread_link_init();
+
+   if (th_func->evas_gl_thread_gl_func_get)
+      _gl_thread_link_init(th_func->evas_gl_thread_gl_func_get());
+   else
+      ERR("Thread functions (GL) are not exist");
 
    _main_thread_id = eina_thread_self();
 }
 
 
-#endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
+#endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
index 5b1201a..b2efc39 100644 (file)
@@ -1,9 +1,37 @@
 #ifndef EVAS_GL_THREAD_H
 #define EVAS_GL_THREAD_H
 
+
 #include "evas_gl_common.h"
 
-extern Eina_Thread _main_thread_id;
+typedef struct
+{
+   int (*evas_gl_thread_enabled)(int thread_type);
+   void (*evas_gl_thread_disabled)(void);
+   void (*evas_gl_thread_finish)(void);
+
+   void *(*evas_gl_thread_gl_func_get)(void);
+   void *(*evas_gl_thread_egl_func_get)(void);
+   void *(*evas_gl_thread_glx_func_get)(void);
+} Evas_GL_Thread_Func;
+
+#define GL_TH_FN(api)                evas_##api##_thread_cmd
+#define GL_TH_FNTYPE(api)            PFN_EVTH_##api
+#define GL_TH_ST(api)                Evas_Thread_Command_##api
+#define GL_TH_CB(api)                _gl_thread_##api
+#define GL_TH_DP                     int thread_type, void *orig_func
+
+#define GL_TH(api, ...)              GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_GL, api, ##__VA_ARGS__)
+#define GL_TH_CALL(api, orig, ...)   GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_GL, orig, ##__VA_ARGS__)
+
+//#define EVGL_TH(api, ...)            GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_GL, api, ##__VA_ARGS__)
+//#define EVGL_TH_CALL(api, orig, ...) GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_GL, orig, ##__VA_ARGS__)
+#define EVGL_TH(api, ...)            GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_EVGL, api, ##__VA_ARGS__)
+#define EVGL_TH_CALL(api, orig, ...) GL_TH_FN(api)(EVAS_GL_THREAD_TYPE_EVGL, orig, ##__VA_ARGS__)
+#define EVGL_TH_FN(api)              GL_TH_FN(api)
+
+
+#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
 /* Memory Pool */
 extern Eina_Mempool *_mp_default;
@@ -25,8 +53,6 @@ extern unsigned int _mp_delete_object_pool_size;
 extern unsigned int _mp_texture_pool_size;
 
 
-#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
-
 #ifdef EAPI
 # undef EAPI
 #endif
@@ -54,35 +80,27 @@ extern unsigned int _mp_texture_pool_size;
 #endif /* ! _WIN32 */
 
 
-EAPI int evas_gl_thread_enabled();
-EAPI int evas_evgl_thread_enabled();
-EAPI int evas_gl_thread_force_finish();
+EAPI const Evas_GL_Thread_Func *evas_gl_thread_func_get(void);
 
-EAPI void evas_gl_thread_begin();
-EAPI void evas_gl_thread_end();
-EAPI void evas_gl_thread_finish();
-EAPI void evas_evgl_thread_begin();
-EAPI void evas_evgl_thread_end();
-EAPI void evas_evgl_thread_finish();
+extern int evas_gl_thread_enabled(int thread_type);
+extern void evas_gl_thread_disabled(void);
+extern int evas_gl_thread_force_finish(void);
+extern void evas_gl_thread_finish(void);
 
-extern void evas_gl_thread_init();
-extern void evas_gl_thread_terminate();
+extern void evas_gl_thread_init(void);
+extern void evas_gl_thread_terminate(void);
 
 
 #else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
 
-extern int (*evas_gl_thread_enabled)();
-extern int (*evas_evgl_thread_enabled)();
+extern const Evas_GL_Thread_Func *(*evas_gl_thread_func_get)(void);
 
-extern void (*evas_gl_thread_begin)();
-extern void (*evas_gl_thread_end)();
-extern void (*evas_gl_thread_finish)();
-extern void (*evas_evgl_thread_begin)();
-extern void (*evas_evgl_thread_end)();
-extern void (*evas_evgl_thread_finish)();
+extern int (*evas_gl_thread_enabled)(int thread_type);
+extern void (*evas_gl_thread_disabled)(void);
+extern void (*evas_gl_thread_finish)(void);
 
-extern void evas_gl_thread_link_init();
+extern void evas_gl_thread_link_init(void);
 
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
index 1516d69..e8812e6 100644 (file)
 #include "evas_gl_thread.h"
 
+
 #ifdef GL_GLES
 
-#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+    ret (*GL_TH_FN(name))(GL_TH_DP,  ##__VA_ARGS__);
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+    void *(*GL_TH_FN(name##_begin))(GL_TH_DP,  ##__VA_ARGS__); \
+    ret (*GL_TH_FN(name##_end))(void *ref);
+
+typedef struct
+{
+  EVAS_TH_EGL_FN_LIST
+} Evas_GL_Thread_EGL_Func;
 
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
+
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+    typedef ret (*GL_TH_FNTYPE(name))(__VA_ARGS__);
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+    typedef void *(*GL_TH_FNTYPE(name##_begin))(__VA_ARGS__); \
+    typedef ret (*GL_TH_FNTYPE(name##_end))(void *ref);
+
+EVAS_TH_EGL_FN_LIST
+
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
+
+
+#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
 
 typedef struct
 {
-   EGLint return_value;
-} Evas_Thread_Command_eglGetError;
+  GL_TH_FNTYPE(eglGetError) orig_func;
+  EGLint return_value;
+} GL_TH_ST(eglGetError);
 
 static void
-_gl_thread_eglGetError(void *data)
+GL_TH_CB(eglGetError)(void *data)
 {
-   Evas_Thread_Command_eglGetError *thread_data = data;
-   thread_data->return_value = eglGetError();
+  GL_TH_ST(eglGetError) *thread_data = (*(void **)data);
+
+  thread_data->return_value =
+      thread_data->orig_func();
 }
 
-EAPI EGLint
-eglGetError_thread_cmd(void)
+EGLint
+GL_TH_FN(eglGetError)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     return eglGetError();
+  GL_TH_ST(eglGetError) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetError))orig_func)();
 
-   Evas_Thread_Command_eglGetError thread_data;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglGetError) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
+  *thread_data_ptr = thread_data;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglGetError,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data->orig_func = orig_func;
 
-   return thread_data.return_value;
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglGetError),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLenum api;
-} Evas_Thread_Command_eglBindAPI;
+  GL_TH_FNTYPE(eglBindAPI) orig_func;
+  EGLBoolean return_value;
+  EGLenum api;
+} GL_TH_ST(eglBindAPI);
 
 static void
-_gl_thread_eglBindAPI(void *data)
+GL_TH_CB(eglBindAPI)(void *data)
 {
-   Evas_Thread_Command_eglBindAPI *thread_data = data;
+  GL_TH_ST(eglBindAPI) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglBindAPI(thread_data->api);
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->api);
 }
 
-EAPI EGLBoolean
-eglBindAPI_thread_cmd(EGLenum api)
+EGLBoolean
+GL_TH_FN(eglBindAPI)(GL_TH_DP, EGLenum api)
 {
-   if (!evas_gl_thread_enabled())
-     return eglBindAPI(api);
+  GL_TH_ST(eglBindAPI) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   Evas_Thread_Command_eglBindAPI thread_data;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglBindAPI))orig_func)(api);
 
-   thread_data.api = api;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglBindAPI) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglBindAPI,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data->api = api;
+  thread_data->orig_func = orig_func;
 
-   return thread_data.return_value;
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglBindAPI),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLenum return_value;
-} Evas_Thread_Command_eglQueryAPI;
+  GL_TH_FNTYPE(eglQueryAPI) orig_func;
+  EGLenum return_value;
+} GL_TH_ST(eglQueryAPI);
 
 static void
-_gl_thread_eglQueryAPI(void *data)
+GL_TH_CB(eglQueryAPI)(void *data)
 {
-   Evas_Thread_Command_eglQueryAPI *thread_data = data;
+  GL_TH_ST(eglQueryAPI) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglQueryAPI();
+  thread_data->return_value =
+      thread_data->orig_func();
 }
 
-EAPI EGLenum
-eglQueryAPI_thread_cmd(void)
+EGLenum
+GL_TH_FN(eglQueryAPI)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     return eglQueryAPI();
+  GL_TH_ST(eglQueryAPI) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglQueryAPI))orig_func)();
 
-   Evas_Thread_Command_eglQueryAPI thread_data;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglQueryAPI) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglQueryAPI,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data->orig_func = orig_func;
 
-   return thread_data.return_value;
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglQueryAPI),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface draw;
-   EGLSurface read;
-   EGLContext ctx;
-} Evas_Thread_Command_eglMakeCurrent;
+  GL_TH_FNTYPE(eglMakeCurrent) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLSurface draw;
+  EGLSurface read;
+  EGLContext ctx;
+} GL_TH_ST(eglMakeCurrent);
 
 EGLDisplay current_thread_dpy  = EGL_NO_DISPLAY;
 EGLSurface current_thread_draw = EGL_NO_SURFACE;
@@ -116,328 +168,510 @@ EGLSurface current_thread_read = EGL_NO_SURFACE;
 EGLContext current_thread_ctx  = EGL_NO_CONTEXT;
 
 static void
-_gl_thread_eglMakeCurrent(void *data)
-{
-   Evas_Thread_Command_eglMakeCurrent *thread_data = data;
-   DBG("THREAD >> OTHER THREAD MAKECURRENT : (%p, %p, %p, %p)\n", thread_data->dpy,
-         thread_data->draw, thread_data->read, thread_data->ctx);
-
-   thread_data->return_value = eglMakeCurrent(thread_data->dpy,
-                                              thread_data->draw,
-                                              thread_data->read,
-                                              thread_data->ctx);
-
-   if (thread_data->return_value == EGL_TRUE)
-     {
-        current_thread_dpy = thread_data->dpy;
-        current_thread_draw = thread_data->draw;
-        current_thread_read = thread_data->read;
-        current_thread_ctx = thread_data->ctx;
-     }
+GL_TH_CB(eglMakeCurrent)(void *data)
+{
+  GL_TH_ST(eglMakeCurrent) *thread_data = *(void **)data;
+  DBG("THREAD >> OTHER THREAD MAKECURRENT : (%p, %p, %p, %p)\n", thread_data->dpy,
+      thread_data->draw, thread_data->read, thread_data->ctx);
+
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->draw,
+                             thread_data->read,
+                             thread_data->ctx);
+
+  if (thread_data->return_value == EGL_TRUE)
+    {
+      current_thread_dpy = thread_data->dpy;
+      current_thread_draw = thread_data->draw;
+      current_thread_read = thread_data->read;
+      current_thread_ctx = thread_data->ctx;
+    }
 }
 
-EAPI EGLBoolean
-eglMakeCurrent_thread_cmd(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
+EGLBoolean
+GL_TH_FN(eglMakeCurrent)(GL_TH_DP, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
 {
-   if (!evas_gl_thread_enabled())
-     return eglMakeCurrent(dpy, draw, read, ctx);
+  GL_TH_ST(eglMakeCurrent) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglMakeCurrent))orig_func)(dpy, draw, read, ctx);
+
+  /* Skip for noop make-current */
+  if (current_thread_dpy == dpy &&
+      current_thread_draw == draw &&
+      current_thread_read == read &&
+      current_thread_ctx == ctx)
+    return EGL_TRUE;
 
-   Evas_Thread_Command_eglMakeCurrent thread_data;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglMakeCurrent) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   thread_data.dpy = dpy;
-   thread_data.draw = draw;
-   thread_data.read = read;
-   thread_data.ctx = ctx;
+  thread_data->dpy = dpy;
+  thread_data->draw = draw;
+  thread_data->read = read;
+  thread_data->ctx = ctx;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglMakeCurrent,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglMakeCurrent),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  return thread_data->return_value;
 }
 
 
 
-EAPI EGLContext
-eglGetCurrentContext_thread_cmd(void)
+EGLContext
+GL_TH_FN(eglGetCurrentContext)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     return eglGetCurrentContext();
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetCurrentContext))orig_func)();
 
-   /* Current thread is one per thread */
-   return current_thread_ctx;
+  /* Current context is completely tracked by this variable */
+  return current_thread_ctx;
 }
 
 
-EAPI EGLSurface
-eglGetCurrentSurface_thread_cmd(EGLint readdraw)
+EGLSurface
+GL_TH_FN(eglGetCurrentSurface)(GL_TH_DP, EGLint readdraw)
 {
-   if (!evas_gl_thread_enabled())
-     return eglGetCurrentSurface(readdraw);
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetCurrentSurface))orig_func)(readdraw);
 
-   if (readdraw == EGL_READ)
-      return current_thread_read;
-   else if (readdraw == EGL_DRAW)
-      return current_thread_draw;
-   else
-     return NULL;
+  /* Current surfaces are completely tracked by this variable */
+  if (readdraw == EGL_READ)
+    return current_thread_read;
+  else if (readdraw == EGL_DRAW)
+    return current_thread_draw;
+  else
+    return NULL;
 }
 
 
-EAPI EGLDisplay
-eglGetCurrentDisplay_thread_cmd(void)
+EGLDisplay
+GL_TH_FN(eglGetCurrentDisplay)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     return eglGetCurrentDisplay();
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetCurrentDisplay))orig_func)();
 
-   return current_thread_dpy;
+  /* Current display is completely tracked by this variable */
+  return current_thread_dpy;
 }
 
-
 typedef struct
 {
-   EGLBoolean return_value;
-} Evas_Thread_Command_eglReleaseThread;
+  GL_TH_FNTYPE(eglReleaseThread) orig_func;
+  EGLBoolean return_value;
+} GL_TH_ST(eglReleaseThread);
 
 static void
-_gl_thread_eglReleaseThread(void *data)
+GL_TH_CB(eglReleaseThread)(void *data)
 {
-   Evas_Thread_Command_eglReleaseThread *thread_data = data;
+  GL_TH_ST(eglReleaseThread) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglReleaseThread();
+  thread_data->return_value =
+      thread_data->orig_func();
 }
 
-EAPI EGLBoolean
-eglReleaseThread_thread_cmd(void)
+EGLBoolean
+GL_TH_FN(eglReleaseThread)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     return eglReleaseThread();
+  GL_TH_ST(eglReleaseThread) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglReleaseThread))orig_func)();
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglReleaseThread) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   Evas_Thread_Command_eglReleaseThread thread_data;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglReleaseThread,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglReleaseThread),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  return thread_data->return_value;
 }
 
+
+
 typedef struct
 {
-  void *return_value;
-  char const * procname;
-} Evas_Thread_Command_eglGetProcAddress;
+  GL_TH_FNTYPE(eglQuerySurface) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLSurface surface;
+  EGLint attribute;
+  EGLint *value;
+} GL_TH_ST(eglQuerySurface);
+
+static void
+GL_TH_CB(eglQuerySurface)(void *data)
+{
+  GL_TH_ST(eglQuerySurface) *thread_data = *(void **)data;
 
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->surface,
+                             thread_data->attribute,
+                             thread_data->value);
+}
+
+EGLBoolean
+GL_TH_FN(eglQuerySurface)(GL_TH_DP, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
+{
+  GL_TH_ST(eglQuerySurface) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglQuerySurface))orig_func)(dpy, surface, attribute, value);
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglQuerySurface) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
+
+  thread_data->dpy = dpy;
+  thread_data->surface = surface;
+  thread_data->attribute = attribute;
+  thread_data->value =value;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglQuerySurface),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
 
-void *(*orig_evas_eglGetProcAddress)(char const * procname);
 
-EAPI void
-eglGetProcAddress_orig_evas_set(void *func)
+
+typedef struct
+{
+  GL_TH_FNTYPE(eglSwapInterval) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLint interval;
+} GL_TH_ST(eglSwapInterval);
+
+static void
+GL_TH_CB(eglSwapInterval)(void *data)
 {
-   orig_evas_eglGetProcAddress = func;
+  GL_TH_ST(eglSwapInterval) *thread_data = *(void **)data;
+
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->interval);
 }
 
-EAPI void *
-eglGetProcAddress_orig_evas_get()
+EGLBoolean
+GL_TH_FN(eglSwapInterval)(GL_TH_DP, EGLDisplay dpy, EGLint interval)
 {
-   return orig_evas_eglGetProcAddress;
+  GL_TH_ST(eglSwapInterval) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglSwapInterval))orig_func)(dpy, interval);
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglSwapInterval) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
+
+  thread_data->dpy = dpy;
+  thread_data->interval = interval;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglSwapInterval),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
+
+typedef struct
+{
+  GL_TH_FNTYPE(eglWaitGL) orig_func;
+  EGLBoolean return_value;
+} GL_TH_ST(eglWaitGL);
+
 static void
-_gl_thread_eglGetProcAddress(void *data)
+GL_TH_CB(eglWaitGL)(void *data)
 {
-  Evas_Thread_Command_eglGetProcAddress *thread_data = data;
+  GL_TH_ST(eglWaitGL) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_eglGetProcAddress(thread_data->procname);
+  thread_data->return_value =
+      thread_data->orig_func();
 }
 
-EAPI void *
-eglGetProcAddress_thread_cmd(char const * procname)
+EGLBoolean
+GL_TH_FN(eglWaitGL)(GL_TH_DP)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglGetProcAddress(procname);
+  GL_TH_ST(eglWaitGL) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglWaitGL))orig_func)();
 
-   Evas_Thread_Command_eglGetProcAddress thread_data;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglWaitGL) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   thread_data.procname = procname;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _gl_thread_eglGetProcAddress,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglWaitGL),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  return thread_data->return_value;
 }
 
 
+
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface surface;
-   EGLint attribute;
-   EGLint *value;
-} Evas_Thread_Command_eglQuerySurface;
+  GL_TH_FNTYPE(eglSwapBuffers) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLSurface surface;
+} GL_TH_ST(eglSwapBuffers);
 
 static void
-_gl_thread_eglQuerySurface(void *data)
+GL_TH_CB(eglSwapBuffers)(void *data)
 {
-   Evas_Thread_Command_eglQuerySurface *thread_data = data;
+  GL_TH_ST(eglSwapBuffers) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglQuerySurface(thread_data->dpy,
-                                               thread_data->surface,
-                                               thread_data->attribute,
-                                               thread_data->value);
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->surface);
 }
 
-EAPI EGLBoolean
-eglQuerySurface_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
+EGLBoolean
+GL_TH_FN(eglSwapBuffers)(GL_TH_DP, EGLDisplay dpy, EGLSurface surface)
 {
-   if (!evas_gl_thread_enabled())
-     return eglQuerySurface(dpy, surface, attribute, value);
+  GL_TH_ST(eglSwapBuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   Evas_Thread_Command_eglQuerySurface thread_data;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglSwapBuffers))orig_func)(dpy, surface);
 
-   thread_data.dpy = dpy;
-   thread_data.surface = surface;
-   thread_data.attribute = attribute;
-   thread_data.value = value;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglSwapBuffers) *) + sizeof(GL_TH_ST(eglSwapBuffers)), &thcmd_ref);
+  *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(eglSwapBuffers) *));
+  thread_data = *thread_data_ptr;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglQuerySurface,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+  if (!evas_gl_thread_force_finish())
+    thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   return thread_data.return_value;
+  thread_data->dpy = dpy;
+  thread_data->surface = surface;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglSwapBuffers),
+                             thread_mode);
+
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLint interval;
-} Evas_Thread_Command_eglSwapInterval;
+  GL_TH_FNTYPE(eglSwapBuffersWithDamage) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLSurface surface;
+  EGLint *rects;
+  EGLint n_rects;
+} GL_TH_ST(eglSwapBuffersWithDamage);
 
 static void
-_gl_thread_eglSwapInterval(void *data)
+GL_TH_CB(eglSwapBuffersWithDamage)(void *data)
 {
-   Evas_Thread_Command_eglSwapInterval *thread_data = data;
+  GL_TH_ST(eglSwapBuffersWithDamage) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglSwapInterval(thread_data->dpy,
-                                               thread_data->interval);
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->surface,
+                             thread_data->rects,
+                             thread_data->n_rects);
 }
 
-EAPI EGLBoolean
-eglSwapInterval_thread_cmd(EGLDisplay dpy, EGLint interval)
+
+EGLBoolean
+GL_TH_FN(eglSwapBuffersWithDamage)(GL_TH_DP, EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects)
 {
-   if (!evas_gl_thread_enabled())
-     return eglSwapInterval(dpy, interval);
+  GL_TH_ST(eglSwapBuffersWithDamage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   Evas_Thread_Command_eglSwapInterval thread_data;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglSwapBuffersWithDamage))orig_func)(dpy, surface, rects, n_rects);
 
-   thread_data.dpy = dpy;
-   thread_data.interval = interval;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglSwapBuffersWithDamage) *) + sizeof(GL_TH_ST(eglSwapBuffersWithDamage)), &thcmd_ref);
+  *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(eglSwapBuffersWithDamage) *));
+  thread_data = *thread_data_ptr;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglSwapInterval,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+  if (!evas_gl_thread_force_finish())
+    thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   return thread_data.return_value;
+  thread_data->dpy = dpy;
+  thread_data->surface = surface;
+  thread_data->rects = rects;
+  thread_data->n_rects = n_rects;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglSwapBuffersWithDamage),
+                             thread_mode);
+
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-} Evas_Thread_Command_eglWaitGL;
+  GL_TH_FNTYPE(eglSetDamageRegion) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  EGLSurface surface;
+  EGLint *rects;
+  EGLint n_rects;
+} GL_TH_ST(eglSetDamageRegion);
 
 static void
-_gl_thread_eglWaitGL(void *data)
+GL_TH_CB(eglSetDamageRegion)(void *data)
 {
-   Evas_Thread_Command_eglWaitGL *thread_data = data;
+  GL_TH_ST(eglSetDamageRegion) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglWaitGL();
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->surface,
+                             thread_data->rects,
+                             thread_data->n_rects);
 }
 
-EAPI EGLBoolean
-eglWaitGL_thread_cmd(void)
+EGLBoolean
+GL_TH_FN(eglSetDamageRegion)(GL_TH_DP, EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects)
 {
-   if (!evas_gl_thread_enabled())
-     return eglWaitGL();
+  GL_TH_ST(eglSetDamageRegion) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglSetDamageRegion))orig_func)(dpy, surface, rects, n_rects);
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglSetDamageRegion) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   Evas_Thread_Command_eglWaitGL thread_data;
+  thread_data->dpy = dpy;
+  thread_data->surface = surface;
+  thread_data->rects = rects;
+  thread_data->n_rects = n_rects;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglWaitGL,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglSetDamageRegion),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  return thread_data->return_value;
 }
 
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface surface;
-   int command_allocated;
-} Evas_Thread_Command_eglSwapBuffers;
+  GL_TH_FNTYPE(eglQueryWaylandBufferWL) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay dpy;
+  void *buffer;
+  EGLint attribute;
+  EGLint *value;
+} GL_TH_ST(eglQueryWaylandBufferWL);
 
 static void
-_gl_thread_eglSwapBuffers(void *data)
+GL_TH_CB(eglQueryWaylandBufferWL)(void *data)
 {
-   Evas_Thread_Command_eglSwapBuffers *thread_data = data;
+  GL_TH_ST(eglQueryWaylandBufferWL) *thread_data = *(void **)data;
+
+  thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->buffer,
+                             thread_data->attribute,
+                             thread_data->value);
+}
 
-   thread_data->return_value = eglSwapBuffers(thread_data->dpy,
-                                              thread_data->surface);
+EGLBoolean
+GL_TH_FN(eglQueryWaylandBufferWL)(GL_TH_DP, EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value)
+{
+  GL_TH_ST(eglQueryWaylandBufferWL) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglQueryWaylandBufferWL))orig_func)(dpy, buffer, attribute, value);
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglQueryWaylandBufferWL) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
+
+  thread_data->dpy = dpy;
+  thread_data->buffer = buffer;
+  thread_data->attribute = attribute;
+  thread_data->value =value;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglQueryWaylandBufferWL),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
-EAPI EGLBoolean
-eglSwapBuffers_thread_cmd(EGLDisplay dpy, EGLSurface surface)
+typedef struct
 {
-   if (!evas_gl_thread_enabled())
-     return eglSwapBuffers(dpy, surface);
+  GL_TH_FNTYPE(eglGetProcAddress) orig_func;
+  void *return_value;
+  char const * procname;
+} GL_TH_ST(eglGetProcAddress);
 
-   Evas_Thread_Command_eglSwapBuffers thread_data_local;
-   Evas_Thread_Command_eglSwapBuffers *thread_data = &thread_data_local;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+static void
+GL_TH_CB(eglGetProcAddress)(void *data)
+{
+  GL_TH_ST(eglGetProcAddress) *thread_data = *(void **)data;
+
+   thread_data->return_value = thread_data->orig_func(thread_data->procname);
+}
+
+void *
+GL_TH_FN(eglGetProcAddress)(GL_TH_DP, char const * procname)
+{
+  GL_TH_ST(eglGetProcAddress) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetProcAddress))orig_func)(procname);
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-       Evas_Thread_Command_eglSwapBuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_eglSwapBuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglGetProcAddress) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   thread_data->dpy = dpy;
-   thread_data->surface = surface;
+  thread_data->procname = procname;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglSwapBuffers,
-                              thread_data,
-                              thread_mode);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglGetProcAddress),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
    return thread_data->return_value;
 }
@@ -446,611 +680,774 @@ eglSwapBuffers_thread_cmd(EGLDisplay dpy, EGLSurface surface)
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface surface;
-   EGLint *rects;
-   EGLint n_rects;
-} Evas_Thread_Command_eglSwapBuffersWithDamage;
-
-EGLBoolean (*orig_evas_eglSwapBuffersWithDamage)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+  GL_TH_FNTYPE(eglCreateWindowSurface) orig_func;
+  EGLSurface return_value;
+  EGLDisplay egl_disp;
+  EGLConfig egl_config;
+  EGLNativeWindowType egl_win;
+  EGLint const * attrib_list;
+} GL_TH_ST(eglCreateWindowSurface);
 
-EAPI void
-eglSwapBuffersWithDamage_orig_evas_set(void *func)
+static void
+GL_TH_CB(eglCreateWindowSurface)(void *data)
 {
-   orig_evas_eglSwapBuffersWithDamage = func;
+  GL_TH_ST(eglCreateWindowSurface) *thread_data = *(void **)data;
+
+  thread_data->return_value = thread_data->orig_func(thread_data->egl_disp,
+                                                     thread_data->egl_config,
+                                                     thread_data->egl_win,
+                                                     thread_data->attrib_list);
 }
 
-EAPI void *
-eglSwapBuffersWithDamage_orig_evas_get()
+EGLSurface
+GL_TH_FN(eglCreateWindowSurface)(GL_TH_DP, EGLDisplay egl_disp, EGLConfig egl_config,
+    EGLNativeWindowType egl_win, EGLint const * attrib_list)
+    {
+  GL_TH_ST(eglCreateWindowSurface) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglCreateWindowSurface))orig_func)(egl_disp, egl_config,
+        egl_win, attrib_list);
+
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglCreateWindowSurface) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
+
+  thread_data->egl_disp = egl_disp;
+  thread_data->egl_config = egl_config;
+  thread_data->egl_win = egl_win;
+  thread_data->attrib_list = attrib_list;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglCreateWindowSurface),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+    }
+
+typedef struct
 {
-   return orig_evas_eglSwapBuffersWithDamage;
-}
+  GL_TH_FNTYPE(eglDestroySurface) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay egl_disp;
+  EGLSurface egl_surf;
+} GL_TH_ST(eglDestroySurface);
 
 static void
-_gl_thread_eglSwapBuffersWithDamage(void *data)
+GL_TH_CB(eglDestroySurface)(void *data)
 {
-   Evas_Thread_Command_eglSwapBuffersWithDamage *thread_data = data;
+  GL_TH_ST(eglDestroySurface) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_eglSwapBuffersWithDamage(thread_data->dpy,
-                                                                  thread_data->surface,
-                                                                  thread_data->rects,
-                                                                  thread_data->n_rects);
+  thread_data->return_value = thread_data->orig_func(thread_data->egl_disp,
+                                                     thread_data->egl_surf);
 }
 
-EAPI EGLBoolean
-eglSwapBuffersWithDamage_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects)
+EGLBoolean
+GL_TH_FN(eglDestroySurface)(GL_TH_DP, EGLDisplay egl_disp, EGLSurface egl_surf)
 {
-   if (!evas_gl_thread_enabled())
-     return orig_evas_eglSwapBuffersWithDamage(dpy, surface, rects, n_rects);
+  GL_TH_ST(eglDestroySurface) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglDestroySurface))orig_func)(egl_disp, egl_surf);
 
-   Evas_Thread_Command_eglSwapBuffersWithDamage thread_data;
 
-   thread_data.dpy = dpy;
-   thread_data.surface = surface;
-   thread_data.rects = rects;
-   thread_data.n_rects = n_rects;
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglDestroySurface) *), &thcmd_ref);
+  *thread_data_ptr = thread_data;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglSwapBuffersWithDamage,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data->egl_disp = egl_disp;
+  thread_data->egl_surf = egl_surf;
+  thread_data->orig_func = orig_func;
 
-   return thread_data.return_value;
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglDestroySurface),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+
+  return thread_data->return_value;
 }
 
+
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface surface;
-   EGLint *rects;
-   EGLint n_rects;
-} Evas_Thread_Command_eglSetDamageRegion;
-
-EGLBoolean (*orig_evas_eglSetDamageRegion)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+  GL_TH_FNTYPE(eglCreateContext) orig_func;
+  EGLContext return_value;
+  EGLDisplay display;
+  EGLConfig config;
+  EGLContext share_context;
+  EGLint const * attrib_list;
+} GL_TH_ST(eglCreateContext);
 
-EAPI void
-eglSetDamageRegion_orig_evas_set(void *func)
+static void
+GL_TH_CB(eglCreateContext)(void *data)
 {
-   orig_evas_eglSetDamageRegion = func;
+  GL_TH_ST(eglCreateContext) *thread_data = *(void **)data;
+
+  thread_data->return_value = thread_data->orig_func(thread_data->display,
+                                               thread_data->config,
+                                               thread_data->share_context,
+                                               thread_data->attrib_list);
 }
 
-EAPI void *
-eglSetDamageRegion_orig_evas_get()
+EGLContext
+GL_TH_FN(eglCreateContext)(GL_TH_DP, EGLDisplay display,
+                                 EGLConfig config,
+                                 EGLContext share_context,
+                                 EGLint const * attrib_list)
 {
-   return orig_evas_eglSetDamageRegion;
+
+  GL_TH_ST(eglCreateContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglCreateContext))orig_func)(display, config, share_context, attrib_list);
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglCreateContext) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
+    thread_data->display = display;
+    thread_data->config = config;
+    thread_data->share_context = share_context;
+    thread_data->attrib_list = attrib_list;
+    thread_data->orig_func = orig_func;
+
+    evas_gl_thread_cmd_enqueue(thcmd_ref,
+                               GL_TH_CB(eglCreateContext),
+                               EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
+typedef struct
+{
+  GL_TH_FNTYPE(eglDestroyContext) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay display;
+  EGLContext context;
+} GL_TH_ST(eglDestroyContext);
+
 static void
-_gl_thread_eglSetDamageRegion(void *data)
+GL_TH_CB(eglDestroyContext)(void *data)
 {
-   Evas_Thread_Command_eglSetDamageRegion *thread_data = data;
+  GL_TH_ST(eglDestroyContext) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_eglSetDamageRegion(thread_data->dpy,
-                                                            thread_data->surface,
-                                                            thread_data->rects,
-                                                            thread_data->n_rects);
+  thread_data->return_value = thread_data->orig_func(thread_data->display,
+                                                thread_data->context);
 }
 
-EAPI EGLBoolean
-eglSetDamageRegion_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects)
+EGLBoolean
+GL_TH_FN(eglDestroyContext)(GL_TH_DP,EGLDisplay display,
+                                  EGLContext context)
 {
-   if (!evas_gl_thread_enabled())
-     return orig_evas_eglSetDamageRegion(dpy, surface, rects, n_rects);
 
-   Evas_Thread_Command_eglSetDamageRegion thread_data;
+  GL_TH_ST(eglDestroyContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   thread_data.dpy = dpy;
-   thread_data.surface = surface;
-   thread_data.rects = rects;
-   thread_data.n_rects = n_rects;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglDestroyContext))orig_func)(display, context);
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglSetDamageRegion,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
-}
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglDestroyContext) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
 
+  thread_data->display = display;
+  thread_data->context = context;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglDestroyContext),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
 
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   void *buffer;
-   EGLint attribute;
-   EGLint *value;
-} Evas_Thread_Command_eglQueryWaylandBuffer;
-
-EGLBoolean (*orig_evas_eglQueryWaylandBuffer)(EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value);
+  GL_TH_FNTYPE(eglQueryString) orig_func;
+  char const * return_value;
+  EGLDisplay display;
+  EGLint name;
+} GL_TH_ST(eglQueryString);
 
-EAPI void
-eglQueryWaylandBuffer_orig_evas_set(void *func)
+static void
+GL_TH_CB(eglQueryString)(void *data)
 {
-   orig_evas_eglQueryWaylandBuffer = func;
+  GL_TH_ST(eglQueryString) *thread_data = *(void **)data;
+
+  thread_data->return_value = thread_data->orig_func(thread_data->display,
+                                                thread_data->name);
 }
 
-EAPI void *
-eglQueryWaylandBuffer_orig_evas_get()
+char const *
+GL_TH_FN(eglQueryString)(GL_TH_DP,EGLDisplay display,  EGLint name)
 {
-   return orig_evas_eglQueryWaylandBuffer;
+
+  GL_TH_ST(eglQueryString) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglQueryString))orig_func)(display, name);
+
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglQueryString) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
+
+  thread_data->display = display;
+  thread_data->name = name;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglQueryString),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
+typedef struct
+{
+  GL_TH_FNTYPE(eglCreateImage) orig_func;
+  void * return_value;
+  EGLDisplay dpy;
+  EGLContext ctx;
+  int target;
+  void* buffer;
+  int *attribs;
+} GL_TH_ST(eglCreateImage);
+
 static void
-_gl_thread_eglQueryWaylandBuffer(void *data)
+GL_TH_CB(eglCreateImage)(void *data)
 {
-   Evas_Thread_Command_eglQueryWaylandBuffer *thread_data = data;
+  GL_TH_ST(eglCreateImage) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_eglQueryWaylandBuffer(thread_data->dpy,
-                                                               thread_data->buffer,
-                                                               thread_data->attribute,
-                                                               thread_data->value);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->ctx, thread_data->target,
+                                                     thread_data->buffer, thread_data->attribs);
 }
 
-EAPI EGLBoolean
-eglQueryWaylandBuffer_thread_cmd(EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value)
+void *
+GL_TH_FN(eglCreateImage)(GL_TH_DP, EGLDisplay dpy, EGLContext ctx, int target, void* buffer, int *attribs)
 {
-   if (!evas_gl_thread_enabled())
-     return orig_evas_eglQueryWaylandBuffer(dpy, buffer, attribute, value);
 
-   Evas_Thread_Command_eglQueryWaylandBuffer thread_data;
+  GL_TH_ST(eglCreateImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   thread_data.dpy = dpy;
-   thread_data.buffer = buffer;
-   thread_data.attribute = attribute;
-   thread_data.value = value;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglCreateImage))orig_func)(dpy, ctx, target, buffer, attribs);
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eglQueryWaylandBuffer,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
-}
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglCreateImage) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
 
+  thread_data->dpy = dpy;
+  thread_data->ctx = ctx;
+  thread_data->target = target;
+  thread_data->buffer = buffer;
+  thread_data->attribs = attribs;
+  thread_data->orig_func = orig_func;
 
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglCreateImage),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
 
-/***** EVAS GL *****/
 
 typedef struct
 {
-   EGLint return_value;
-} Evas_GL_Thread_Command_eglGetError;
+  GL_TH_FNTYPE(eglDestroyImage) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay  dpy;
+  EGLImageKHR img;
+} GL_TH_ST(eglDestroyImage);
 
 static void
-_evgl_thread_eglGetError(void *data)
+GL_TH_CB(eglDestroyImage)(void *data)
 {
-   Evas_GL_Thread_Command_eglGetError *thread_data = data;
+  GL_TH_ST(eglDestroyImage) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglGetError();
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->img);
 }
 
-EAPI EGLint
-eglGetError_evgl_thread_cmd(void)
+EGLBoolean
+GL_TH_FN(eglDestroyImage)(GL_TH_DP,  EGLDisplay  dpy, EGLImageKHR img)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglGetError();
 
-   Evas_GL_Thread_Command_eglGetError thread_data;
+  GL_TH_ST(eglDestroyImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglGetError,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglDestroyImage))orig_func)(dpy, img);
 
-   return thread_data.return_value;
-}
 
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglDestroyImage) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
 
-EGLDisplay current_evgl_thread_dpy  = EGL_NO_DISPLAY;
-EGLSurface current_evgl_thread_draw = EGL_NO_SURFACE;
-EGLSurface current_evgl_thread_read = EGL_NO_SURFACE;
-EGLContext current_evgl_thread_ctx  = EGL_NO_CONTEXT;
+  thread_data->dpy = dpy;
+  thread_data->img = img;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglDestroyImage),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
+
 
 typedef struct
 {
-   EGLBoolean return_value;
-   EGLDisplay dpy;
-   EGLSurface draw;
-   EGLSurface read;
-   EGLContext ctx;
-} Evas_GL_Thread_Command_eglMakeCurrent;
+  GL_TH_FNTYPE(eglCreateSyncKHR) orig_func;
+  void * return_value;
+  EGLDisplay dpy;
+  unsigned int type;
+  const int *attrib_list;
+} GL_TH_ST(eglCreateSyncKHR);
 
 static void
-_evgl_thread_eglMakeCurrent(void *data)
+GL_TH_CB(eglCreateSyncKHR)(void *data)
 {
-   Evas_GL_Thread_Command_eglMakeCurrent *thread_data = data;
+  GL_TH_ST(eglCreateSyncKHR) *thread_data = *(void **)data;
 
-   DBG("THREAD >> EVGL OTHER THREAD MAKECURRENT : (%p, %p, %p, %p)\n", thread_data->dpy,
-                     thread_data->draw, thread_data->read, thread_data->ctx);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->type, thread_data->attrib_list);
+}
 
-   thread_data->return_value = eglMakeCurrent(thread_data->dpy,
-                                              thread_data->draw,
-                                              thread_data->read,
-                                              thread_data->ctx);
+void *
+GL_TH_FN(eglCreateSyncKHR)(GL_TH_DP, EGLDisplay dpy, unsigned int type, const int *attrib_list)
+{
+
+  GL_TH_ST(eglCreateSyncKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglCreateSyncKHR))orig_func)(dpy, type, attrib_list);
 
-   if (thread_data->return_value == EGL_TRUE)
-     {
-        current_evgl_thread_dpy = thread_data->dpy;
-        current_evgl_thread_draw = thread_data->draw;
-        current_evgl_thread_read = thread_data->read;
-        current_evgl_thread_ctx = thread_data->ctx;
-     }
-}
 
-EAPI EGLBoolean
-eglMakeCurrent_evgl_thread_cmd(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        if (eina_thread_self() == evas_gl_thread_get(EVAS_GL_THREAD_TYPE_EVGL))
-           DBG("THREAD >> EVGL OTHER THREAD MAKECURRENT(INNER) : (%p, %p, %p, %p)\n",
-                                                               dpy, draw, read, ctx);
-        return eglMakeCurrent(dpy, draw, read, ctx);
-     }
-
-   Evas_GL_Thread_Command_eglMakeCurrent thread_data;
-
-   /* Skip for noop make-current */
-   if (current_evgl_thread_dpy == dpy &&
-       current_evgl_thread_draw == draw &&
-       current_evgl_thread_read == read &&
-       current_evgl_thread_ctx == ctx)
-      return EGL_TRUE;
-
-   thread_data.dpy = dpy;
-   thread_data.draw = draw;
-   thread_data.read = read;
-   thread_data.ctx = ctx;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglMakeCurrent,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
-
-   return thread_data.return_value;
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglCreateSyncKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
+
+  thread_data->dpy = dpy;
+  thread_data->type = type;
+  thread_data->attrib_list = attrib_list;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglCreateSyncKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
+typedef struct
+{
+  GL_TH_FNTYPE(eglDestroySyncKHR) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay  dpy;
+  void * sync;
+} GL_TH_ST(eglDestroySyncKHR);
 
-EAPI EGLContext
-eglGetCurrentContext_evgl_thread_cmd(void)
+static void
+GL_TH_CB(eglDestroySyncKHR)(void *data)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglGetCurrentContext();
+  GL_TH_ST(eglDestroySyncKHR) *thread_data = *(void **)data;
 
-   return current_evgl_thread_ctx;
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->sync);
 }
 
-
-EAPI EGLSurface
-eglGetCurrentSurface_evgl_thread_cmd(EGLint readdraw)
+EGLBoolean
+GL_TH_FN(eglDestroySyncKHR)(GL_TH_DP,  EGLDisplay  dpy, void * sync)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglGetCurrentSurface(readdraw);
 
-   if (readdraw == EGL_READ)
-      return current_evgl_thread_read;
-   else if (readdraw == EGL_DRAW)
-      return current_evgl_thread_draw;
-   else
-      return NULL;
+  GL_TH_ST(eglDestroySyncKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglDestroySyncKHR))orig_func)(dpy, sync);
+
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglDestroySyncKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
+
+  thread_data->dpy = dpy;
+  thread_data->sync = sync;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglDestroySyncKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
-EAPI EGLDisplay
-eglGetCurrentDisplay_evgl_thread_cmd(void)
+typedef struct
+{
+  GL_TH_FNTYPE(eglClientWaitSyncKHR) orig_func;
+  int return_value;
+  EGLDisplay  dpy;
+  void * sync;
+  int flags;
+  unsigned long long timeout;
+} GL_TH_ST(eglClientWaitSyncKHR);
+
+static void
+GL_TH_CB(eglClientWaitSyncKHR)(void *data)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglGetCurrentDisplay();
+  GL_TH_ST(eglClientWaitSyncKHR) *thread_data = *(void **)data;
 
-   return current_evgl_thread_dpy;
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->sync, thread_data->flags, thread_data->timeout);
 }
 
+int
+GL_TH_FN(eglClientWaitSyncKHR)(GL_TH_DP,  EGLDisplay  dpy,  void * sync, int flags, unsigned long long timeout)
+{
+
+  GL_TH_ST(eglClientWaitSyncKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglClientWaitSyncKHR))orig_func)(dpy, sync, flags, timeout);
+
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglClientWaitSyncKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
 
+  thread_data->dpy = dpy;
+  thread_data->sync = sync;
+  thread_data->flags = flags;
+  thread_data->timeout = timeout;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglClientWaitSyncKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
 
 typedef struct
 {
-  EGLSurface return_value;
-   EGLDisplay egl_disp;
-   EGLConfig egl_config;
-   EGLNativeWindowType egl_win;
-   EGLint const * attrib_list;
-} Evas_GL_Thread_Command_eglCreateWindowSurface;
+  GL_TH_FNTYPE(eglSignalSyncKHR) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay  dpy;
+  void * sync;
+  unsigned mode;
+} GL_TH_ST(eglSignalSyncKHR);
 
 static void
-_evgl_thread_eglCreateWindowSurface(void *data)
+GL_TH_CB(eglSignalSyncKHR)(void *data)
 {
-  Evas_GL_Thread_Command_eglCreateWindowSurface *thread_data = data;
+  GL_TH_ST(eglSignalSyncKHR) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglCreateWindowSurface(thread_data->egl_disp,
-                                                      thread_data->egl_config,
-                                                      thread_data->egl_win,
-                                                      thread_data->attrib_list);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->sync, thread_data->mode);
 }
 
-EAPI EGLSurface
-eglCreateWindowSurface_evgl_thread_cmd(EGLDisplay egl_disp, EGLConfig egl_config,
-                                       EGLNativeWindowType egl_win, EGLint const * attrib_list)
+EGLBoolean
+GL_TH_FN(eglSignalSyncKHR)(GL_TH_DP,  EGLDisplay  dpy,  void * sync, unsigned mode)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglCreateWindowSurface(egl_disp, egl_config,
-                                   egl_win, attrib_list);
 
-   Evas_GL_Thread_Command_eglCreateWindowSurface thread_data;
+  GL_TH_ST(eglSignalSyncKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglSignalSyncKHR))orig_func)(dpy, sync, mode);
+
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglSignalSyncKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
 
-   thread_data.egl_disp = egl_disp;
-   thread_data.egl_config = egl_config;
-   thread_data.egl_win = egl_win;
-   thread_data.attrib_list = attrib_list;
+  thread_data->dpy = dpy;
+  thread_data->sync = sync;
+  thread_data->mode = mode;
+  thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglCreateWindowSurface,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglSignalSyncKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  return thread_data->return_value;
 }
 
 typedef struct
 {
+  GL_TH_FNTYPE(eglGetSyncAttribKHR) orig_func;
   EGLBoolean return_value;
-  EGLDisplay egl_disp;
-  EGLSurface egl_surf;
-} Evas_GL_Thread_Command_eglDestroySurface;
+  EGLDisplay  dpy;
+  void * sync;
+  int attribute;
+  int *value;
+} GL_TH_ST(eglGetSyncAttribKHR);
 
 static void
-_evgl_thread_eglDestroySurface(void *data)
+GL_TH_CB(eglGetSyncAttribKHR)(void *data)
 {
-  Evas_GL_Thread_Command_eglDestroySurface *thread_data = data;
+  GL_TH_ST(eglGetSyncAttribKHR) *thread_data = *(void **)data;
 
-   thread_data->return_value = eglDestroySurface(thread_data->egl_disp,
-                                                 thread_data->egl_surf);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->sync, thread_data->attribute, thread_data->value);
 }
 
-EAPI EGLBoolean
-eglDestroySurface_evgl_thread_cmd(EGLDisplay egl_disp, EGLSurface egl_surf)
+EGLBoolean
+GL_TH_FN(eglGetSyncAttribKHR)(GL_TH_DP,  EGLDisplay  dpy,  void * sync, int attribute, int *value)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglDestroySurface(egl_disp, egl_surf);
 
-   Evas_GL_Thread_Command_eglDestroySurface thread_data;
+  GL_TH_ST(eglGetSyncAttribKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglGetSyncAttribKHR))orig_func)(dpy, sync, attribute, value);
+
 
-   thread_data.egl_disp = egl_disp;
-   thread_data.egl_surf = egl_surf;
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglGetSyncAttribKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglDestroySurface,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  thread_data->dpy = dpy;
+  thread_data->sync = sync;
+  thread_data->attribute = attribute;
+  thread_data->value = value;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglGetSyncAttribKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
 typedef struct
 {
-  EGLContext return_value;
-  EGLDisplay display;
-  EGLConfig config;
-  EGLContext share_context;
-  EGLint const * attrib_list;
-} Evas_GL_Thread_Command_eglCreateContext;
+  GL_TH_FNTYPE(eglWaitSyncKHR) orig_func;
+  int return_value;
+  EGLDisplay  dpy;
+  void * sync;
+  int flags;
+} GL_TH_ST(eglWaitSyncKHR);
 
 static void
-_evgl_thread_eglCreateContext(void *data)
+GL_TH_CB(eglWaitSyncKHR)(void *data)
 {
-  Evas_GL_Thread_Command_eglCreateContext *thread_data = data;
+  GL_TH_ST(eglWaitSyncKHR) *thread_data = *(void **)data;
 
-  thread_data->return_value = eglCreateContext(thread_data->display,
-                                               thread_data->config,
-                                               thread_data->share_context,
-                                               thread_data->attrib_list);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->sync, thread_data->flags);
 }
 
-EAPI EGLContext
-eglCreateContext_evgl_thread_cmd(EGLDisplay display,
-                                 EGLConfig config,
-                                 EGLContext share_context,
-                                 EGLint const * attrib_list)
+int
+GL_TH_FN(eglWaitSyncKHR)(GL_TH_DP,  EGLDisplay  dpy,  void * sync, int flags)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglCreateContext(display, config, share_context, attrib_list);
 
-   Evas_GL_Thread_Command_eglCreateContext thread_data;
+  GL_TH_ST(eglWaitSyncKHR) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglWaitSyncKHR))orig_func)(dpy, sync, flags);
+
+
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglWaitSyncKHR) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
-   thread_data.display = display;
-   thread_data.config = config;
-   thread_data.share_context = share_context;
-   thread_data.attrib_list = attrib_list;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglCreateContext,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data->dpy = dpy;
+  thread_data->sync = sync;
+  thread_data->flags = flags;
+  thread_data->orig_func = orig_func;
 
-   return thread_data.return_value;
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglWaitSyncKHR),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
+
 typedef struct
 {
+  GL_TH_FNTYPE(eglBindWaylandDisplayWL) orig_func;
   EGLBoolean return_value;
-  EGLDisplay display;
-  EGLContext context;
-} Evas_GL_Thread_Command_eglDestroyContext;
+  EGLDisplay  dpy;
+  void * wl_display;
+} GL_TH_ST(eglBindWaylandDisplayWL);
 
 static void
-_evgl_thread_eglDestroyContext(void *data)
+GL_TH_CB(eglBindWaylandDisplayWL)(void *data)
 {
-  Evas_GL_Thread_Command_eglDestroyContext *thread_data = data;
+  GL_TH_ST(eglBindWaylandDisplayWL) *thread_data = *(void **)data;
 
-  thread_data->return_value = eglDestroyContext(thread_data->display,
-                                               thread_data->context);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->wl_display);
 }
 
-EAPI EGLBoolean
-eglDestroyContext_evgl_thread_cmd(EGLDisplay display,
-                                 EGLContext context)
+EGLBoolean
+GL_TH_FN(eglBindWaylandDisplayWL)(GL_TH_DP,  EGLDisplay  dpy,  void *wl_display)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglDestroyContext(display, context);
 
-   Evas_GL_Thread_Command_eglDestroyContext thread_data;
+  GL_TH_ST(eglBindWaylandDisplayWL) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
 
-   thread_data.display = display;
-   thread_data.context = context;
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglBindWaylandDisplayWL))orig_func)(dpy, wl_display);
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglDestroyContext,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_data.return_value;
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglBindWaylandDisplayWL) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
+
+
+  thread_data->dpy = dpy;
+  thread_data->wl_display = wl_display;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglBindWaylandDisplayWL),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
 }
 
 
 typedef struct
 {
-  char const * return_value;
-  EGLDisplay display;
-  EGLint name;
-} Evas_GL_Thread_Command_eglQueryString;
+  GL_TH_FNTYPE(eglUnbindWaylandDisplayWL) orig_func;
+  EGLBoolean return_value;
+  EGLDisplay  dpy;
+  void * wl_display;
+} GL_TH_ST(eglUnbindWaylandDisplayWL);
 
 static void
-_evgl_thread_eglQueryString(void *data)
+GL_TH_CB(eglUnbindWaylandDisplayWL)(void *data)
 {
-  Evas_GL_Thread_Command_eglQueryString *thread_data = data;
+  GL_TH_ST(eglUnbindWaylandDisplayWL) *thread_data = *(void **)data;
 
-  thread_data->return_value = eglQueryString(thread_data->display,
-                                               thread_data->name);
+  thread_data->return_value = thread_data->orig_func(thread_data->dpy, thread_data->wl_display);
 }
 
-EAPI char const *
-eglQueryString_evgl_thread_cmd(EGLDisplay display,  EGLint name)
+EGLBoolean
+GL_TH_FN(eglUnbindWaylandDisplayWL)(GL_TH_DP,  EGLDisplay  dpy,  void *wl_display)
 {
-   if (!evas_evgl_thread_enabled())
-     return eglQueryString(display, name);
 
-   Evas_GL_Thread_Command_eglQueryString thread_data;
+  GL_TH_ST(eglUnbindWaylandDisplayWL) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(thread_type))
+    return ((GL_TH_FNTYPE(eglUnbindWaylandDisplayWL))orig_func)(dpy, wl_display);
 
-   thread_data.display = display;
-   thread_data.name = name;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_eglQueryString,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+  thread_data_ptr =
+        evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(eglUnbindWaylandDisplayWL) *), &thcmd_ref);
+    *thread_data_ptr = thread_data;
 
-   return thread_data.return_value;
+
+  thread_data->dpy = dpy;
+  thread_data->wl_display = wl_display;
+  thread_data->orig_func = orig_func;
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(eglUnbindWaylandDisplayWL),
+                             EVAS_GL_THREAD_MODE_FINISH);
+
+  return thread_data->return_value;
+}
+
+
+/*****************************************************************************/
+
+
+static Evas_GL_Thread_EGL_Func th_egl_func;
+Eina_Bool th_egl_func_initialized = EINA_FALSE;
+
+void *
+evas_gl_thread_egl_func_get()
+{
+  if (!th_egl_func_initialized)
+    {
+#define THREAD_FUNCTION_ASSIGN(func) th_egl_func.func = func;
+
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name));
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_begin)); \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_end));
+
+      EVAS_TH_EGL_FN_LIST
+
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
+
+#undef THREAD_FUNCTION_ASSIGN
+
+      th_egl_func_initialized = EINA_TRUE;
+    }
+
+  return &th_egl_func;
 }
 
 
 #else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
+/* compiled for GL backend */
 
 
 #include <dlfcn.h>
 
-EGLint     (*eglGetError_thread_cmd)();
-EGLBoolean (*eglBindAPI_thread_cmd)(EGLenum api);
-EGLenum    (*eglQueryAPI_thread_cmd)();
-EGLBoolean (*eglMakeCurrent_thread_cmd)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-EGLContext (*eglGetCurrentContext_thread_cmd)(void);
-EGLSurface (*eglGetCurrentSurface_thread_cmd)(EGLint readdraw);
-EGLDisplay (*eglGetCurrentDisplay_thread_cmd)(void);
-EGLBoolean (*eglReleaseThread_thread_cmd)();
-void       (*eglGetProcAddress_orig_evas_set)(void *func);
-void      *(*eglGetProcAddress_orig_evas_get)();
-void       *(*eglGetProcAddress_thread_cmd)(char const * procname);
-
-EGLBoolean (*eglQuerySurface_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
-EGLBoolean (*eglSwapInterval_thread_cmd)(EGLDisplay dpy, EGLint interval);
-EGLBoolean (*eglWaitGL_thread_cmd)(void);
-EGLBoolean (*eglSwapBuffers_thread_cmd)(EGLDisplay dpy, EGLSurface surface);
-
-void       (*eglSwapBuffersWithDamage_orig_evas_set)(void *func);
-void      *(*eglSwapBuffersWithDamage_orig_evas_get)();
-EGLBoolean (*eglSwapBuffersWithDamage_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-
-void       (*eglSetDamageRegion_orig_evas_set)(void *func);
-void      *(*eglSetDamageRegion_orig_evas_get)();
-EGLBoolean (*eglSetDamageRegion_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-
-void       (*eglQueryWaylandBuffer_orig_evas_set)(void *func);
-void      *(*eglQueryWaylandBuffer_orig_evas_get)();
-EGLBoolean (*eglQueryWaylandBuffer_thread_cmd)(EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value);
-
-
-/***** EVAS GL *****/
-
-EGLint     (*eglGetError_evgl_thread_cmd)();
-EGLBoolean (*eglMakeCurrent_evgl_thread_cmd)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-EGLContext (*eglGetCurrentContext_evgl_thread_cmd)(void);
-EGLSurface (*eglGetCurrentSurface_evgl_thread_cmd)(EGLint readdraw);
-EGLDisplay (*eglGetCurrentDisplay_evgl_thread_cmd)(void);
-EGLSurface (*eglCreateWindowSurface_evgl_thread_cmd)(EGLDisplay egl_disp, EGLConfig egl_config, EGLNativeWindowType egl_win, EGLint const * attrib_list);
-EGLBoolean (*eglDestroySurface_evgl_thread_cmd)(EGLDisplay egl_disp, EGLSurface egl_surf);
-EGLContext (*eglCreateContext_evgl_thread_cmd)(EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const * attrib_list);
-EGLBoolean (*eglDestroyContext_evgl_thread_cmd)(EGLDisplay display, EGLContext context);
-char const *(*eglQueryString_evgl_thread_cmd)(EGLDisplay display,  EGLint name);
-
-
-void _egl_thread_link_init()
-{
-#define LINK2GENERIC(sym) \
-   sym = dlsym(RTLD_DEFAULT, #sym); \
-   if (!sym) ERR("Could not find function '%s'", #sym);
-
-   // Get function pointer to evas_gl_common that is now provided through the link of GL_Generic.
-   LINK2GENERIC(eglGetError_thread_cmd);
-   LINK2GENERIC(eglBindAPI_thread_cmd);
-   LINK2GENERIC(eglQueryAPI_thread_cmd);
-   LINK2GENERIC(eglMakeCurrent_thread_cmd);
-   LINK2GENERIC(eglGetCurrentContext_thread_cmd);
-   LINK2GENERIC(eglGetCurrentSurface_thread_cmd);
-   LINK2GENERIC(eglGetCurrentDisplay_thread_cmd);
-   LINK2GENERIC(eglReleaseThread_thread_cmd);
-   LINK2GENERIC(eglGetProcAddress_orig_evas_set);
-   LINK2GENERIC(eglGetProcAddress_orig_evas_get);
-   LINK2GENERIC(eglGetProcAddress_thread_cmd);
-
-   LINK2GENERIC(eglQuerySurface_thread_cmd);
-   LINK2GENERIC(eglSwapInterval_thread_cmd);
-   LINK2GENERIC(eglWaitGL_thread_cmd);
-   LINK2GENERIC(eglSwapBuffers_thread_cmd);
-
-   LINK2GENERIC(eglSwapBuffersWithDamage_orig_evas_set);
-   LINK2GENERIC(eglSwapBuffersWithDamage_orig_evas_get);
-   LINK2GENERIC(eglSwapBuffersWithDamage_thread_cmd);
-
-   LINK2GENERIC(eglSetDamageRegion_orig_evas_set);
-   LINK2GENERIC(eglSetDamageRegion_orig_evas_get);
-   LINK2GENERIC(eglSetDamageRegion_thread_cmd);
-
-   LINK2GENERIC(eglQueryWaylandBuffer_orig_evas_set);
-   LINK2GENERIC(eglQueryWaylandBuffer_orig_evas_get);
-   LINK2GENERIC(eglQueryWaylandBuffer_thread_cmd);
-
-   /***** EVAS GL *****/
-
-   LINK2GENERIC(eglGetError_evgl_thread_cmd);
-   LINK2GENERIC(eglMakeCurrent_evgl_thread_cmd);
-   LINK2GENERIC(eglGetCurrentContext_evgl_thread_cmd);
-   LINK2GENERIC(eglGetCurrentSurface_evgl_thread_cmd);
-   LINK2GENERIC(eglGetCurrentDisplay_evgl_thread_cmd);
-   LINK2GENERIC(eglCreateWindowSurface_evgl_thread_cmd);
-   LINK2GENERIC(eglDestroySurface_evgl_thread_cmd);
-   LINK2GENERIC(eglCreateContext_evgl_thread_cmd);
-   LINK2GENERIC(eglDestroyContext_evgl_thread_cmd);
-   LINK2GENERIC(eglQueryString_evgl_thread_cmd);
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+    ret (*GL_TH_FN(name))(GL_TH_DP,  ##__VA_ARGS__);
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+    void *(*GL_TH_FN(name##_begin))(GL_TH_DP,  ##__VA_ARGS__); \
+    ret (*GL_TH_FN(name##_end))(void *ref);
+
+EVAS_TH_EGL_FN_LIST
+
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
+
+void
+_egl_thread_link_init(void *func_ptr)
+{
+  const Evas_GL_Thread_EGL_Func *th_egl_func = func_ptr;
+
+  if (!th_egl_func)
+    {
+      ERR("Thread functions (EGL BASE) are not exist");
+      return;
+    }
+
+#define THREAD_FUNCTION_ASSIGN(func) func = th_egl_func->func;
+
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name));
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_begin)); \
+    THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_end));
+
+  EVAS_TH_EGL_FN_LIST
 
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
 
+#undef THREAD_FUNCTION_ASSIGN
 }
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
-#endif
+#endif /* ! GL_GLES */
index 9b21044..4947bfe 100644 (file)
 #ifdef GL_GLES
 
 #include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+extern void *evas_gl_thread_egl_func_get(void);
+
+
+#define EVAS_TH_EGL_FN_LIST \
+/* EGL 1.4 Referencing to Thread Local Storage */ \
+EVAS_TH_EGL_FN      (EGLint     , eglGetError) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglBindAPI, EGLenum api) \
+EVAS_TH_EGL_FN      (EGLenum    , eglQueryAPI) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglMakeCurrent, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) \
+EVAS_TH_EGL_FN      (EGLContext , eglGetCurrentContext) \
+EVAS_TH_EGL_FN      (EGLSurface , eglGetCurrentSurface, EGLint readdraw) \
+EVAS_TH_EGL_FN      (EGLDisplay , eglGetCurrentDisplay) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglReleaseThread) \
+ \
+/* EGL 1.4 Sequential Operations */ \
+EVAS_TH_EGL_FN      (EGLBoolean , eglQuerySurface, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglSwapInterval, EGLDisplay dpy, EGLint interval) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglWaitGL) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglSwapBuffers, EGLDisplay dpy, EGLSurface surface) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglSwapBuffersWithDamage, EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglSetDamageRegion, EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglQueryWaylandBufferWL, EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value) \
+EVAS_TH_EGL_FN      (EGLSurface , eglCreateWindowSurface, EGLDisplay egl_disp, EGLConfig egl_config, EGLNativeWindowType egl_win, EGLint const * attrib_list) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglDestroySurface, EGLDisplay egl_disp, EGLSurface egl_surf) \
+EVAS_TH_EGL_FN      (EGLContext , eglCreateContext, EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const * attrib_list) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglDestroyContext, EGLDisplay display, EGLContext context) \
+EVAS_TH_EGL_FN      (char const *, eglQueryString, EGLDisplay display,  EGLint name) \
+EVAS_TH_EGL_FN      (void *     , eglCreateImage, EGLDisplay dpy, EGLContext ctx, int target, void* buffer, int *attribs) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglDestroyImage,  EGLDisplay  dpy, EGLImageKHR img) \
+EVAS_TH_EGL_FN      (void *     , eglCreateSyncKHR, EGLDisplay dpy, unsigned int type, const int *attrib_list) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglDestroySyncKHR,  EGLDisplay  dpy, void * sync) \
+EVAS_TH_EGL_FN      (int        , eglClientWaitSyncKHR,  EGLDisplay  dpy,  void * sync, int flags, unsigned long long timeout) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglSignalSyncKHR,  EGLDisplay  dpy,  void * sync, unsigned mode) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglGetSyncAttribKHR,  EGLDisplay  dpy,  void * sync, int attribute, int *value) \
+EVAS_TH_EGL_FN      (int        , eglWaitSyncKHR,  EGLDisplay  dpy,  void * sync, int flags) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglBindWaylandDisplayWL,  EGLDisplay  dpy,  void *wl_display) \
+EVAS_TH_EGL_FN      (EGLBoolean , eglUnbindWaylandDisplayWL,  EGLDisplay  dpy,  void *wl_display) \
+EVAS_TH_EGL_FN      (void *     , eglGetProcAddress, char const * procname)
 
-#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
 
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-/* EGL 1.4 Referencing to Thread Local Storage */
-EAPI EGLint     eglGetError_thread_cmd();
-EAPI EGLBoolean eglBindAPI_thread_cmd(EGLenum api);
-EAPI EGLenum    eglQueryAPI_thread_cmd();
-EAPI EGLBoolean eglMakeCurrent_thread_cmd(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-EAPI EGLContext eglGetCurrentContext_thread_cmd(void);
-EAPI EGLSurface eglGetCurrentSurface_thread_cmd(EGLint readdraw);
-EAPI EGLDisplay eglGetCurrentDisplay_thread_cmd(void);
-EAPI EGLBoolean eglReleaseThread_thread_cmd();
-
-
-/* EGL 1.4 Sequential Operations */
-EAPI EGLBoolean eglQuerySurface_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
-EAPI EGLBoolean eglSwapInterval_thread_cmd(EGLDisplay dpy, EGLint interval);
-EAPI EGLBoolean eglWaitGL_thread_cmd(void);
-EAPI EGLBoolean eglSwapBuffers_thread_cmd(EGLDisplay dpy, EGLSurface surface);
-
-EAPI void       eglSwapBuffersWithDamage_orig_evas_set(void *func);
-EAPI void      *eglSwapBuffersWithDamage_orig_evas_get();
-EAPI EGLBoolean eglSwapBuffersWithDamage_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-
-EAPI void       eglSetDamageRegion_orig_evas_set(void *func);
-EAPI void      *eglSetDamageRegion_orig_evas_get();
-EAPI EGLBoolean eglSetDamageRegion_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-
-EAPI void       eglQueryWaylandBuffer_orig_evas_set(void *func);
-EAPI void      *eglQueryWaylandBuffer_orig_evas_get();
-EAPI EGLBoolean eglQueryWaylandBuffer_thread_cmd(EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value);
-
-EAPI void       eglGetProcAddress_orig_evas_set(void *func);
-EAPI void      *eglGetProcAddress_orig_evas_get();
-EAPI void      *eglGetProcAddress_thread_cmd(char const * procname);
-
-/***** EVAS GL *****/
-
-/* EGL 1.4 Referencing to Thread Local Storage */
-EAPI EGLint     eglGetError_evgl_thread_cmd();
-EAPI EGLBoolean eglMakeCurrent_evgl_thread_cmd(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-EAPI EGLContext eglGetCurrentContext_evgl_thread_cmd(void);
-EAPI EGLSurface eglGetCurrentSurface_evgl_thread_cmd(EGLint readdraw);
-EAPI EGLDisplay eglGetCurrentDisplay_evgl_thread_cmd(void);
-EAPI EGLSurface eglCreateWindowSurface_evgl_thread_cmd(EGLDisplay egl_disp, EGLConfig egl_config, EGLNativeWindowType egl_win, EGLint const * attrib_list);
-EAPI EGLBoolean eglDestroySurface_evgl_thread_cmd(EGLDisplay egl_disp, EGLSurface egl_surf);
-EAPI EGLContext eglCreateContext_evgl_thread_cmd(EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const * attrib_list);
-EAPI EGLBoolean eglDestroyContext_evgl_thread_cmd(EGLDisplay display, EGLContext context);
-EAPI char const *eglQueryString_evgl_thread_cmd(EGLDisplay display,  EGLint name);
 
 
-#else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
+#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
-/* EGL 1.4 Referencing to Thread Local Storage */
-extern EGLint     (*eglGetError_thread_cmd)();
-extern EGLBoolean (*eglBindAPI_thread_cmd)(EGLenum api);
-extern EGLenum    (*eglQueryAPI_thread_cmd)();
-extern EGLBoolean (*eglMakeCurrent_thread_cmd)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-extern EGLContext (*eglGetCurrentContext_thread_cmd)(void);
-extern EGLSurface (*eglGetCurrentSurface_thread_cmd)(EGLint readdraw);
-extern EGLDisplay (*eglGetCurrentDisplay_thread_cmd)(void);
-extern EGLBoolean (*eglReleaseThread_thread_cmd)();
-extern void       (*eglGetProcAddress_orig_evas_set)(void *func);
-extern void      *(*eglGetProcAddress_orig_evas_get)();
-extern void       *(*eglGetProcAddress_thread_cmd)(char const * procname);
 
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+ extern ret GL_TH_FN(name)(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+ extern void *GL_TH_FN(name##_begin)(GL_TH_DP, ##__VA_ARGS__); \
+ extern ret GL_TH_FN(name##_end)(void *ref);
 
-/* EGL 1.4 Sequential Operations */
-extern EGLBoolean (*eglQuerySurface_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
-extern EGLBoolean (*eglSwapInterval_thread_cmd)(EGLDisplay dpy, EGLint interval);
-extern EGLBoolean (*eglWaitGL_thread_cmd)(void);
-extern EGLBoolean (*eglSwapBuffers_thread_cmd)(EGLDisplay dpy, EGLSurface surface);
-extern void       (*eglSwapBuffersWithDamage_orig_evas_set)(void *func);
-extern void      *(*eglSwapBuffersWithDamage_orig_evas_get)();
-extern EGLBoolean (*eglSwapBuffersWithDamage_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-extern void       (*eglSetDamageRegion_orig_evas_set)(void *func);
-extern void      *(*eglSetDamageRegion_orig_evas_get)();
-extern EGLBoolean (*eglSetDamageRegion_thread_cmd)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
-extern void       (*eglQueryWaylandBuffer_orig_evas_set)(void *func);
-extern void      *(*eglQueryWaylandBuffer_orig_evas_get)();
-extern EGLBoolean (*eglQueryWaylandBuffer_thread_cmd)(EGLDisplay dpy, void *buffer, EGLint attribute, EGLint *value);
+EVAS_TH_EGL_FN_LIST
 
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
 
-/***** EVAS GL *****/
 
-/* EGL 1.4 Referencing to Thread Local Storage */
-extern EGLint     (*eglGetError_evgl_thread_cmd)();
-extern EGLBoolean (*eglMakeCurrent_evgl_thread_cmd)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
-extern EGLContext (*eglGetCurrentContext_evgl_thread_cmd)(void);
-extern EGLSurface (*eglGetCurrentSurface_evgl_thread_cmd)(EGLint readdraw);
-extern EGLDisplay (*eglGetCurrentDisplay_evgl_thread_cmd)(void);
-extern EGLSurface (*eglCreateWindowSurface_evgl_thread_cmd)(EGLDisplay egl_disp, EGLConfig egl_config, EGLNativeWindowType egl_win, EGLint const * attrib_list);
-extern EGLBoolean (*eglDestroySurface_evgl_thread_cmd)(EGLDisplay egl_disp, EGLSurface egl_surf);
-extern EGLContext (*eglCreateContext_evgl_thread_cmd)(EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const * attrib_list);
-extern EGLBoolean (*eglDestroyContext_evgl_thread_cmd)(EGLDisplay display, EGLContext context);
-extern char const *(*eglQueryString_evgl_thread_cmd)(EGLDisplay display,  EGLint name);
+#else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
 
+#define EVAS_TH_EGL_FN(ret, name, ...) \
+ extern ret (*GL_TH_FN(name))(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_EGL_FN_ASYNC(ret, name, ...) \
+ extern void *(*GL_TH_FN(name##_begin))(GL_TH_DP, ##__VA_ARGS__); \
+ extern ret (*GL_TH_FN(name##_end))(void *ref);
 
-extern void _egl_thread_link_init();
+EVAS_TH_EGL_FN_LIST
+
+#undef EVAS_TH_EGL_FN_ASYNC
+#undef EVAS_TH_EGL_FN
+
+extern void _egl_thread_link_init(void *func_ptr);
 
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
+
 #endif /* GL_GLES */
 
-#endif
+#endif /* EVAS_GL_THREAD_EGL_H */
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.c b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.c
deleted file mode 100644 (file)
index a113f96..0000000
+++ /dev/null
@@ -1,34871 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-
-/*
- * void
- * glActiveTexture(GLenum texture);
- */
-
-typedef struct
-{
-   GLenum texture;
-
-} EVGL_API_Thread_Command_glActiveTexture;
-
-void (*orig_evgl_api_glActiveTexture)(GLenum texture);
-
-static void
-_evgl_api_thread_glActiveTexture(void *data)
-{
-   EVGL_API_Thread_Command_glActiveTexture *thread_data =
-      (EVGL_API_Thread_Command_glActiveTexture *)data;
-
-   orig_evgl_api_glActiveTexture(thread_data->texture);
-
-}
-
-EAPI void
-glActiveTexture_evgl_api_thread_cmd(GLenum texture)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glActiveTexture(texture);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glActiveTexture thread_data_local;
-   EVGL_API_Thread_Command_glActiveTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glActiveTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glAttachShader(GLuint program, GLuint shader);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glAttachShader;
-
-void (*orig_evgl_api_glAttachShader)(GLuint program, GLuint shader);
-
-static void
-_evgl_api_thread_glAttachShader(void *data)
-{
-   EVGL_API_Thread_Command_glAttachShader *thread_data =
-      (EVGL_API_Thread_Command_glAttachShader *)data;
-
-   orig_evgl_api_glAttachShader(thread_data->program,
-                                thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glAttachShader_evgl_api_thread_cmd(GLuint program, GLuint shader)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glAttachShader(program, shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glAttachShader thread_data_local;
-   EVGL_API_Thread_Command_glAttachShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glAttachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glAttachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glAttachShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindAttribLocation(GLuint program, GLuint index, const char* name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   const char* name;
-
-} EVGL_API_Thread_Command_glBindAttribLocation;
-
-void (*orig_evgl_api_glBindAttribLocation)(GLuint program, GLuint index, const char* name);
-
-static void
-_evgl_api_thread_glBindAttribLocation(void *data)
-{
-   EVGL_API_Thread_Command_glBindAttribLocation *thread_data =
-      (EVGL_API_Thread_Command_glBindAttribLocation *)data;
-
-   orig_evgl_api_glBindAttribLocation(thread_data->program,
-                                      thread_data->index,
-                                      thread_data->name);
-
-}
-
-EAPI void
-glBindAttribLocation_evgl_api_thread_cmd(GLuint program, GLuint index, const char* name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindAttribLocation(program, index, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindAttribLocation thread_data_local;
-   EVGL_API_Thread_Command_glBindAttribLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindAttribLocation,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindBuffer(GLenum target, GLuint buffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint buffer;
-
-} EVGL_API_Thread_Command_glBindBuffer;
-
-void (*orig_evgl_api_glBindBuffer)(GLenum target, GLuint buffer);
-
-static void
-_evgl_api_thread_glBindBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glBindBuffer *thread_data =
-      (EVGL_API_Thread_Command_glBindBuffer *)data;
-
-   orig_evgl_api_glBindBuffer(thread_data->target,
-                              thread_data->buffer);
-
-}
-
-EAPI void
-glBindBuffer_evgl_api_thread_cmd(GLenum target, GLuint buffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindBuffer(target, buffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindBuffer thread_data_local;
-   EVGL_API_Thread_Command_glBindBuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindBuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindFramebuffer(GLenum target, GLuint framebuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint framebuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBindFramebuffer;
-
-void (*orig_evgl_api_glBindFramebuffer)(GLenum target, GLuint framebuffer);
-
-static void
-_evgl_api_thread_glBindFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glBindFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glBindFramebuffer *)data;
-
-   orig_evgl_api_glBindFramebuffer(thread_data->target,
-                                   thread_data->framebuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindFramebuffer_evgl_api_thread_cmd(GLenum target, GLuint framebuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindFramebuffer(target, framebuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glBindFramebuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBindFramebuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBindFramebuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBindRenderbuffer;
-
-void (*orig_evgl_api_glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glBindRenderbuffer(void *data)
-{
-   EVGL_API_Thread_Command_glBindRenderbuffer *thread_data =
-      (EVGL_API_Thread_Command_glBindRenderbuffer *)data;
-
-   orig_evgl_api_glBindRenderbuffer(thread_data->target,
-                                    thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindRenderbuffer_evgl_api_thread_cmd(GLenum target, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindRenderbuffer(target, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindRenderbuffer thread_data_local;
-   EVGL_API_Thread_Command_glBindRenderbuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBindRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBindRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindRenderbuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindTexture(GLenum target, GLuint texture);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint texture;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBindTexture;
-
-void (*orig_evgl_api_glBindTexture)(GLenum target, GLuint texture);
-
-static void
-_evgl_api_thread_glBindTexture(void *data)
-{
-   EVGL_API_Thread_Command_glBindTexture *thread_data =
-      (EVGL_API_Thread_Command_glBindTexture *)data;
-
-   orig_evgl_api_glBindTexture(thread_data->target,
-                               thread_data->texture);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindTexture_evgl_api_thread_cmd(GLenum target, GLuint texture)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindTexture(target, texture);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindTexture thread_data_local;
-   EVGL_API_Thread_Command_glBindTexture *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBindTexture *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBindTexture));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
- */
-
-typedef struct
-{
-   GLclampf red;
-   GLclampf green;
-   GLclampf blue;
-   GLclampf alpha;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBlendColor;
-
-void (*orig_evgl_api_glBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-
-static void
-_evgl_api_thread_glBlendColor(void *data)
-{
-   EVGL_API_Thread_Command_glBlendColor *thread_data =
-      (EVGL_API_Thread_Command_glBlendColor *)data;
-
-   orig_evgl_api_glBlendColor(thread_data->red,
-                              thread_data->green,
-                              thread_data->blue,
-                              thread_data->alpha);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendColor_evgl_api_thread_cmd(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendColor(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendColor thread_data_local;
-   EVGL_API_Thread_Command_glBlendColor *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBlendColor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBlendColor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendColor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquation(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBlendEquation;
-
-void (*orig_evgl_api_glBlendEquation)(GLenum mode);
-
-static void
-_evgl_api_thread_glBlendEquation(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquation *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquation *)data;
-
-   orig_evgl_api_glBlendEquation(thread_data->mode);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendEquation_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquation(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquation thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquation *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBlendEquation *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBlendEquation));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquation,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
- */
-
-typedef struct
-{
-   GLenum modeRGB;
-   GLenum modeAlpha;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBlendEquationSeparate;
-
-void (*orig_evgl_api_glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
-
-static void
-_evgl_api_thread_glBlendEquationSeparate(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquationSeparate *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquationSeparate *)data;
-
-   orig_evgl_api_glBlendEquationSeparate(thread_data->modeRGB,
-                                         thread_data->modeAlpha);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendEquationSeparate_evgl_api_thread_cmd(GLenum modeRGB, GLenum modeAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquationSeparate(modeRGB, modeAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquationSeparate thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquationSeparate *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBlendEquationSeparate *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBlendEquationSeparate));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->modeRGB = modeRGB;
-   thread_data->modeAlpha = modeAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquationSeparate,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFunc(GLenum sfactor, GLenum dfactor);
- */
-
-typedef struct
-{
-   GLenum sfactor;
-   GLenum dfactor;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBlendFunc;
-
-void (*orig_evgl_api_glBlendFunc)(GLenum sfactor, GLenum dfactor);
-
-static void
-_evgl_api_thread_glBlendFunc(void *data)
-{
-   EVGL_API_Thread_Command_glBlendFunc *thread_data =
-      (EVGL_API_Thread_Command_glBlendFunc *)data;
-
-   orig_evgl_api_glBlendFunc(thread_data->sfactor,
-                             thread_data->dfactor);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendFunc_evgl_api_thread_cmd(GLenum sfactor, GLenum dfactor)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendFunc(sfactor, dfactor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendFunc thread_data_local;
-   EVGL_API_Thread_Command_glBlendFunc *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBlendFunc *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBlendFunc));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->sfactor = sfactor;
-   thread_data->dfactor = dfactor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendFunc,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- */
-
-typedef struct
-{
-   GLenum srcRGB;
-   GLenum dstRGB;
-   GLenum srcAlpha;
-   GLenum dstAlpha;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBlendFuncSeparate;
-
-void (*orig_evgl_api_glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-static void
-_evgl_api_thread_glBlendFuncSeparate(void *data)
-{
-   EVGL_API_Thread_Command_glBlendFuncSeparate *thread_data =
-      (EVGL_API_Thread_Command_glBlendFuncSeparate *)data;
-
-   orig_evgl_api_glBlendFuncSeparate(thread_data->srcRGB,
-                                     thread_data->dstRGB,
-                                     thread_data->srcAlpha,
-                                     thread_data->dstAlpha);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendFuncSeparate_evgl_api_thread_cmd(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendFuncSeparate thread_data_local;
-   EVGL_API_Thread_Command_glBlendFuncSeparate *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBlendFuncSeparate *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBlendFuncSeparate));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->srcRGB = srcRGB;
-   thread_data->dstRGB = dstRGB;
-   thread_data->srcAlpha = srcAlpha;
-   thread_data->dstAlpha = dstAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendFuncSeparate,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizeiptr size;
-   const void* data;
-   GLenum usage;
-
-} EVGL_API_Thread_Command_glBufferData;
-
-void (*orig_evgl_api_glBufferData)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
-
-static void
-_evgl_api_thread_glBufferData(void *data)
-{
-   EVGL_API_Thread_Command_glBufferData *thread_data =
-      (EVGL_API_Thread_Command_glBufferData *)data;
-
-   orig_evgl_api_glBufferData(thread_data->target,
-                              thread_data->size,
-                              thread_data->data,
-                              thread_data->usage);
-
-}
-
-EAPI void
-glBufferData_evgl_api_thread_cmd(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBufferData(target, size, data, usage);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBufferData thread_data_local;
-   EVGL_API_Thread_Command_glBufferData *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->size = size;
-   thread_data->data = data;
-   thread_data->usage = usage;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBufferData,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLintptr offset;
-   GLsizeiptr size;
-   const void* data;
-
-} EVGL_API_Thread_Command_glBufferSubData;
-
-void (*orig_evgl_api_glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
-
-static void
-_evgl_api_thread_glBufferSubData(void *data)
-{
-   EVGL_API_Thread_Command_glBufferSubData *thread_data =
-      (EVGL_API_Thread_Command_glBufferSubData *)data;
-
-   orig_evgl_api_glBufferSubData(thread_data->target,
-                                 thread_data->offset,
-                                 thread_data->size,
-                                 thread_data->data);
-
-}
-
-EAPI void
-glBufferSubData_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBufferSubData(target, offset, size, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBufferSubData thread_data_local;
-   EVGL_API_Thread_Command_glBufferSubData *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->offset = offset;
-   thread_data->size = size;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBufferSubData,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glCheckFramebufferStatus(GLenum target);
- */
-
-typedef struct
-{
-   GLenum return_value;
-   GLenum target;
-
-} EVGL_API_Thread_Command_glCheckFramebufferStatus;
-
-GLenum (*orig_evgl_api_glCheckFramebufferStatus)(GLenum target);
-
-static void
-_evgl_api_thread_glCheckFramebufferStatus(void *data)
-{
-   EVGL_API_Thread_Command_glCheckFramebufferStatus *thread_data =
-      (EVGL_API_Thread_Command_glCheckFramebufferStatus *)data;
-
-   thread_data->return_value = orig_evgl_api_glCheckFramebufferStatus(thread_data->target);
-
-}
-
-EAPI GLenum
-glCheckFramebufferStatus_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glCheckFramebufferStatus(target);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCheckFramebufferStatus thread_data_local;
-   EVGL_API_Thread_Command_glCheckFramebufferStatus *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCheckFramebufferStatus,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glClear(GLbitfield mask);
- */
-
-typedef struct
-{
-   GLbitfield mask;
-
-} EVGL_API_Thread_Command_glClear;
-
-void (*orig_evgl_api_glClear)(GLbitfield mask);
-
-static void
-_evgl_api_thread_glClear(void *data)
-{
-   EVGL_API_Thread_Command_glClear *thread_data =
-      (EVGL_API_Thread_Command_glClear *)data;
-
-   orig_evgl_api_glClear(thread_data->mask);
-
-}
-
-EAPI void
-glClear_evgl_api_thread_cmd(GLbitfield mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClear(mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClear thread_data_local;
-   EVGL_API_Thread_Command_glClear *thread_data = &thread_data_local;
-
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClear,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
- */
-
-typedef struct
-{
-   GLclampf red;
-   GLclampf green;
-   GLclampf blue;
-   GLclampf alpha;
-
-} EVGL_API_Thread_Command_glClearColor;
-
-void (*orig_evgl_api_glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-
-static void
-_evgl_api_thread_glClearColor(void *data)
-{
-   EVGL_API_Thread_Command_glClearColor *thread_data =
-      (EVGL_API_Thread_Command_glClearColor *)data;
-
-   orig_evgl_api_glClearColor(thread_data->red,
-                              thread_data->green,
-                              thread_data->blue,
-                              thread_data->alpha);
-
-}
-
-EAPI void
-glClearColor_evgl_api_thread_cmd(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearColor(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearColor thread_data_local;
-   EVGL_API_Thread_Command_glClearColor *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearColor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearDepthf(GLclampf depth);
- */
-
-typedef struct
-{
-   GLclampf depth;
-
-} EVGL_API_Thread_Command_glClearDepthf;
-
-void (*orig_evgl_api_glClearDepthf)(GLclampf depth);
-
-static void
-_evgl_api_thread_glClearDepthf(void *data)
-{
-   EVGL_API_Thread_Command_glClearDepthf *thread_data =
-      (EVGL_API_Thread_Command_glClearDepthf *)data;
-
-   orig_evgl_api_glClearDepthf(thread_data->depth);
-
-}
-
-EAPI void
-glClearDepthf_evgl_api_thread_cmd(GLclampf depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearDepthf(depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearDepthf thread_data_local;
-   EVGL_API_Thread_Command_glClearDepthf *thread_data = &thread_data_local;
-
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearDepthf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearStencil(GLint s);
- */
-
-typedef struct
-{
-   GLint s;
-
-} EVGL_API_Thread_Command_glClearStencil;
-
-void (*orig_evgl_api_glClearStencil)(GLint s);
-
-static void
-_evgl_api_thread_glClearStencil(void *data)
-{
-   EVGL_API_Thread_Command_glClearStencil *thread_data =
-      (EVGL_API_Thread_Command_glClearStencil *)data;
-
-   orig_evgl_api_glClearStencil(thread_data->s);
-
-}
-
-EAPI void
-glClearStencil_evgl_api_thread_cmd(GLint s)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearStencil(s);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearStencil thread_data_local;
-   EVGL_API_Thread_Command_glClearStencil *thread_data = &thread_data_local;
-
-   thread_data->s = s;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearStencil,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
- */
-
-typedef struct
-{
-   GLboolean red;
-   GLboolean green;
-   GLboolean blue;
-   GLboolean alpha;
-
-} EVGL_API_Thread_Command_glColorMask;
-
-void (*orig_evgl_api_glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-
-static void
-_evgl_api_thread_glColorMask(void *data)
-{
-   EVGL_API_Thread_Command_glColorMask *thread_data =
-      (EVGL_API_Thread_Command_glColorMask *)data;
-
-   orig_evgl_api_glColorMask(thread_data->red,
-                             thread_data->green,
-                             thread_data->blue,
-                             thread_data->alpha);
-
-}
-
-EAPI void
-glColorMask_evgl_api_thread_cmd(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColorMask(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColorMask thread_data_local;
-   EVGL_API_Thread_Command_glColorMask *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColorMask,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompileShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glCompileShader;
-
-void (*orig_evgl_api_glCompileShader)(GLuint shader);
-
-static void
-_evgl_api_thread_glCompileShader(void *data)
-{
-   EVGL_API_Thread_Command_glCompileShader *thread_data =
-      (EVGL_API_Thread_Command_glCompileShader *)data;
-
-   orig_evgl_api_glCompileShader(thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompileShader_evgl_api_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompileShader(shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompileShader thread_data_local;
-   EVGL_API_Thread_Command_glCompileShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glCompileShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glCompileShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompileShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLsizei imageSize;
-   const void* data;
-   int command_allocated;
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_API_Thread_Command_glCompressedTexImage2D;
-
-void (*orig_evgl_api_glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
-
-static void
-_evgl_api_thread_glCompressedTexImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexImage2D *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexImage2D *)data;
-
-   orig_evgl_api_glCompressedTexImage2D(thread_data->target,
-                                        thread_data->level,
-                                        thread_data->internalformat,
-                                        thread_data->width,
-                                        thread_data->height,
-                                        thread_data->border,
-                                        thread_data->imageSize,
-                                        thread_data->data);
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompressedTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexImage2D thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glCompressedTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glCompressedTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLsizei imageSize;
-   const void* data;
-   int command_allocated;
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_API_Thread_Command_glCompressedTexSubImage2D;
-
-void (*orig_evgl_api_glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
-
-static void
-_evgl_api_thread_glCompressedTexSubImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexSubImage2D *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexSubImage2D *)data;
-
-   orig_evgl_api_glCompressedTexSubImage2D(thread_data->target,
-                                           thread_data->level,
-                                           thread_data->xoffset,
-                                           thread_data->yoffset,
-                                           thread_data->width,
-                                           thread_data->height,
-                                           thread_data->format,
-                                           thread_data->imageSize,
-                                           thread_data->data);
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompressedTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexSubImage2D thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexSubImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glCompressedTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glCompressedTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexSubImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-
-} EVGL_API_Thread_Command_glCopyTexImage2D;
-
-void (*orig_evgl_api_glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-
-static void
-_evgl_api_thread_glCopyTexImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glCopyTexImage2D *thread_data =
-      (EVGL_API_Thread_Command_glCopyTexImage2D *)data;
-
-   orig_evgl_api_glCopyTexImage2D(thread_data->target,
-                                  thread_data->level,
-                                  thread_data->internalformat,
-                                  thread_data->x,
-                                  thread_data->y,
-                                  thread_data->width,
-                                  thread_data->height,
-                                  thread_data->border);
-
-}
-
-EAPI void
-glCopyTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyTexImage2D thread_data_local;
-   EVGL_API_Thread_Command_glCopyTexImage2D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyTexImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glCopyTexSubImage2D;
-
-void (*orig_evgl_api_glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glCopyTexSubImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glCopyTexSubImage2D *thread_data =
-      (EVGL_API_Thread_Command_glCopyTexSubImage2D *)data;
-
-   orig_evgl_api_glCopyTexSubImage2D(thread_data->target,
-                                     thread_data->level,
-                                     thread_data->xoffset,
-                                     thread_data->yoffset,
-                                     thread_data->x,
-                                     thread_data->y,
-                                     thread_data->width,
-                                     thread_data->height);
-
-}
-
-EAPI void
-glCopyTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyTexSubImage2D thread_data_local;
-   EVGL_API_Thread_Command_glCopyTexSubImage2D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyTexSubImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glCreateProgram(void);
- */
-
-typedef struct
-{
-   GLuint return_value;
-
-} EVGL_API_Thread_Command_glCreateProgram;
-
-GLuint (*orig_evgl_api_glCreateProgram)(void);
-
-static void
-_evgl_api_thread_glCreateProgram(void *data)
-{
-   EVGL_API_Thread_Command_glCreateProgram *thread_data =
-      (EVGL_API_Thread_Command_glCreateProgram *)data;
-
-   thread_data->return_value = orig_evgl_api_glCreateProgram();
-
-}
-
-EAPI GLuint
-glCreateProgram_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glCreateProgram();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCreateProgram thread_data_local;
-   EVGL_API_Thread_Command_glCreateProgram *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCreateProgram,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLuint
- * glCreateShader(GLenum type);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLenum type;
-
-} EVGL_API_Thread_Command_glCreateShader;
-
-GLuint (*orig_evgl_api_glCreateShader)(GLenum type);
-
-static void
-_evgl_api_thread_glCreateShader(void *data)
-{
-   EVGL_API_Thread_Command_glCreateShader *thread_data =
-      (EVGL_API_Thread_Command_glCreateShader *)data;
-
-   thread_data->return_value = orig_evgl_api_glCreateShader(thread_data->type);
-
-}
-
-EAPI GLuint
-glCreateShader_evgl_api_thread_cmd(GLenum type)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glCreateShader(type);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCreateShader thread_data_local;
-   EVGL_API_Thread_Command_glCreateShader *thread_data = &thread_data_local;
-
-   thread_data->type = type;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCreateShader,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glCullFace(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glCullFace;
-
-void (*orig_evgl_api_glCullFace)(GLenum mode);
-
-static void
-_evgl_api_thread_glCullFace(void *data)
-{
-   EVGL_API_Thread_Command_glCullFace *thread_data =
-      (EVGL_API_Thread_Command_glCullFace *)data;
-
-   orig_evgl_api_glCullFace(thread_data->mode);
-
-}
-
-EAPI void
-glCullFace_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCullFace(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCullFace thread_data_local;
-   EVGL_API_Thread_Command_glCullFace *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCullFace,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteBuffers(GLsizei n, const GLuint* buffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* buffers;
-   void *buffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteBuffers;
-
-void (*orig_evgl_api_glDeleteBuffers)(GLsizei n, const GLuint* buffers);
-
-static void
-_evgl_api_thread_glDeleteBuffers(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteBuffers *thread_data =
-      (EVGL_API_Thread_Command_glDeleteBuffers *)data;
-
-   orig_evgl_api_glDeleteBuffers(thread_data->n,
-                                 thread_data->buffers);
-
-
-   if (thread_data->buffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->buffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteBuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* buffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteBuffers(n, buffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteBuffers thread_data_local;
-   EVGL_API_Thread_Command_glDeleteBuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteBuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteBuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->buffers = buffers;
-
-   thread_data->buffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (buffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->buffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->buffers_copied)
-          {
-             memcpy(thread_data->buffers_copied, buffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->buffers = (const GLuint *)thread_data->buffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteBuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* framebuffers;
-   void *framebuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteFramebuffers;
-
-void (*orig_evgl_api_glDeleteFramebuffers)(GLsizei n, const GLuint* framebuffers);
-
-static void
-_evgl_api_thread_glDeleteFramebuffers(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteFramebuffers *thread_data =
-      (EVGL_API_Thread_Command_glDeleteFramebuffers *)data;
-
-   orig_evgl_api_glDeleteFramebuffers(thread_data->n,
-                                      thread_data->framebuffers);
-
-
-   if (thread_data->framebuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteFramebuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* framebuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteFramebuffers(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteFramebuffers thread_data_local;
-   EVGL_API_Thread_Command_glDeleteFramebuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteFramebuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteFramebuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   thread_data->framebuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (framebuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->framebuffers_copied)
-          {
-             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->framebuffers = (const GLuint *)thread_data->framebuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteFramebuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-
-} EVGL_API_Thread_Command_glDeleteProgram;
-
-void (*orig_evgl_api_glDeleteProgram)(GLuint program);
-
-static void
-_evgl_api_thread_glDeleteProgram(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteProgram *thread_data =
-      (EVGL_API_Thread_Command_glDeleteProgram *)data;
-
-   orig_evgl_api_glDeleteProgram(thread_data->program);
-
-}
-
-EAPI void
-glDeleteProgram_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteProgram thread_data_local;
-   EVGL_API_Thread_Command_glDeleteProgram *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* renderbuffers;
-   void *renderbuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteRenderbuffers;
-
-void (*orig_evgl_api_glDeleteRenderbuffers)(GLsizei n, const GLuint* renderbuffers);
-
-static void
-_evgl_api_thread_glDeleteRenderbuffers(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteRenderbuffers *thread_data =
-      (EVGL_API_Thread_Command_glDeleteRenderbuffers *)data;
-
-   orig_evgl_api_glDeleteRenderbuffers(thread_data->n,
-                                       thread_data->renderbuffers);
-
-
-   if (thread_data->renderbuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteRenderbuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* renderbuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteRenderbuffers(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteRenderbuffers thread_data_local;
-   EVGL_API_Thread_Command_glDeleteRenderbuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteRenderbuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteRenderbuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   thread_data->renderbuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (renderbuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->renderbuffers_copied)
-          {
-             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->renderbuffers = (const GLuint *)thread_data->renderbuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteRenderbuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteShader;
-
-void (*orig_evgl_api_glDeleteShader)(GLuint shader);
-
-static void
-_evgl_api_thread_glDeleteShader(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteShader *thread_data =
-      (EVGL_API_Thread_Command_glDeleteShader *)data;
-
-   orig_evgl_api_glDeleteShader(thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteShader_evgl_api_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteShader(shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteShader thread_data_local;
-   EVGL_API_Thread_Command_glDeleteShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteTextures(GLsizei n, const GLuint* textures);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* textures;
-   void *textures_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteTextures;
-
-void (*orig_evgl_api_glDeleteTextures)(GLsizei n, const GLuint* textures);
-
-static void
-_evgl_api_thread_glDeleteTextures(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteTextures *thread_data =
-      (EVGL_API_Thread_Command_glDeleteTextures *)data;
-
-   orig_evgl_api_glDeleteTextures(thread_data->n,
-                                  thread_data->textures);
-
-
-   if (thread_data->textures_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->textures_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteTextures_evgl_api_thread_cmd(GLsizei n, const GLuint* textures)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteTextures(n, textures);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteTextures thread_data_local;
-   EVGL_API_Thread_Command_glDeleteTextures *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteTextures *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteTextures));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->textures = textures;
-
-   thread_data->textures_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (textures)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->textures_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->textures_copied)
-          {
-             memcpy(thread_data->textures_copied, textures, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->textures = (const GLuint *)thread_data->textures_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteTextures,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthFunc(GLenum func);
- */
-
-typedef struct
-{
-   GLenum func;
-
-} EVGL_API_Thread_Command_glDepthFunc;
-
-void (*orig_evgl_api_glDepthFunc)(GLenum func);
-
-static void
-_evgl_api_thread_glDepthFunc(void *data)
-{
-   EVGL_API_Thread_Command_glDepthFunc *thread_data =
-      (EVGL_API_Thread_Command_glDepthFunc *)data;
-
-   orig_evgl_api_glDepthFunc(thread_data->func);
-
-}
-
-EAPI void
-glDepthFunc_evgl_api_thread_cmd(GLenum func)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthFunc(func);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthFunc thread_data_local;
-   EVGL_API_Thread_Command_glDepthFunc *thread_data = &thread_data_local;
-
-   thread_data->func = func;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthFunc,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthMask(GLboolean flag);
- */
-
-typedef struct
-{
-   GLboolean flag;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDepthMask;
-
-void (*orig_evgl_api_glDepthMask)(GLboolean flag);
-
-static void
-_evgl_api_thread_glDepthMask(void *data)
-{
-   EVGL_API_Thread_Command_glDepthMask *thread_data =
-      (EVGL_API_Thread_Command_glDepthMask *)data;
-
-   orig_evgl_api_glDepthMask(thread_data->flag);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDepthMask_evgl_api_thread_cmd(GLboolean flag)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthMask(flag);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthMask thread_data_local;
-   EVGL_API_Thread_Command_glDepthMask *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDepthMask *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDepthMask));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->flag = flag;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthMask,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthRangef(GLclampf zNear, GLclampf zFar);
- */
-
-typedef struct
-{
-   GLclampf zNear;
-   GLclampf zFar;
-
-} EVGL_API_Thread_Command_glDepthRangef;
-
-void (*orig_evgl_api_glDepthRangef)(GLclampf zNear, GLclampf zFar);
-
-static void
-_evgl_api_thread_glDepthRangef(void *data)
-{
-   EVGL_API_Thread_Command_glDepthRangef *thread_data =
-      (EVGL_API_Thread_Command_glDepthRangef *)data;
-
-   orig_evgl_api_glDepthRangef(thread_data->zNear,
-                               thread_data->zFar);
-
-}
-
-EAPI void
-glDepthRangef_evgl_api_thread_cmd(GLclampf zNear, GLclampf zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthRangef(zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthRangef thread_data_local;
-   EVGL_API_Thread_Command_glDepthRangef *thread_data = &thread_data_local;
-
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthRangef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDetachShader(GLuint program, GLuint shader);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDetachShader;
-
-void (*orig_evgl_api_glDetachShader)(GLuint program, GLuint shader);
-
-static void
-_evgl_api_thread_glDetachShader(void *data)
-{
-   EVGL_API_Thread_Command_glDetachShader *thread_data =
-      (EVGL_API_Thread_Command_glDetachShader *)data;
-
-   orig_evgl_api_glDetachShader(thread_data->program,
-                                thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDetachShader_evgl_api_thread_cmd(GLuint program, GLuint shader)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDetachShader(program, shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDetachShader thread_data_local;
-   EVGL_API_Thread_Command_glDetachShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDetachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDetachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDetachShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisable(GLenum cap);
- */
-
-typedef struct
-{
-   GLenum cap;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDisable;
-
-void (*orig_evgl_api_glDisable)(GLenum cap);
-
-static void
-_evgl_api_thread_glDisable(void *data)
-{
-   EVGL_API_Thread_Command_glDisable *thread_data =
-      (EVGL_API_Thread_Command_glDisable *)data;
-
-   orig_evgl_api_glDisable(thread_data->cap);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDisable_evgl_api_thread_cmd(GLenum cap)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDisable(cap);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDisable thread_data_local;
-   EVGL_API_Thread_Command_glDisable *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDisable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDisable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->cap = cap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDisable,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisableVertexAttribArray(GLuint index);
- */
-
-typedef struct
-{
-   GLuint index;
-
-} EVGL_API_Thread_Command_glDisableVertexAttribArray;
-
-void (*orig_evgl_api_glDisableVertexAttribArray)(GLuint index);
-
-static void
-_evgl_api_thread_glDisableVertexAttribArray(void *data)
-{
-   EVGL_API_Thread_Command_glDisableVertexAttribArray *thread_data =
-      (EVGL_API_Thread_Command_glDisableVertexAttribArray *)data;
-
-   orig_evgl_api_glDisableVertexAttribArray(thread_data->index);
-
-}
-
-EAPI void
-glDisableVertexAttribArray_evgl_api_thread_cmd(GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDisableVertexAttribArray(index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDisableVertexAttribArray thread_data_local;
-   EVGL_API_Thread_Command_glDisableVertexAttribArray *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDisableVertexAttribArray,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawArrays(GLenum mode, GLint first, GLsizei count);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLint first;
-   GLsizei count;
-
-} EVGL_API_Thread_Command_glDrawArrays;
-
-void (*orig_evgl_api_glDrawArrays)(GLenum mode, GLint first, GLsizei count);
-
-static void
-_evgl_api_thread_glDrawArrays(void *data)
-{
-   EVGL_API_Thread_Command_glDrawArrays *thread_data =
-      (EVGL_API_Thread_Command_glDrawArrays *)data;
-
-   orig_evgl_api_glDrawArrays(thread_data->mode,
-                              thread_data->first,
-                              thread_data->count);
-
-}
-
-EAPI void
-glDrawArrays_evgl_api_thread_cmd(GLenum mode, GLint first, GLsizei count)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawArrays(mode, first, count);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawArrays thread_data_local;
-   EVGL_API_Thread_Command_glDrawArrays *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawArrays,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void* indices;
-
-} EVGL_API_Thread_Command_glDrawElements;
-
-void (*orig_evgl_api_glDrawElements)(GLenum mode, GLsizei count, GLenum type, const void* indices);
-
-static void
-_evgl_api_thread_glDrawElements(void *data)
-{
-   EVGL_API_Thread_Command_glDrawElements *thread_data =
-      (EVGL_API_Thread_Command_glDrawElements *)data;
-
-   orig_evgl_api_glDrawElements(thread_data->mode,
-                                thread_data->count,
-                                thread_data->type,
-                                thread_data->indices);
-
-}
-
-EAPI void
-glDrawElements_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void* indices)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawElements(mode, count, type, indices);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawElements thread_data_local;
-   EVGL_API_Thread_Command_glDrawElements *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawElements,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnable(GLenum cap);
- */
-
-typedef struct
-{
-   GLenum cap;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glEnable;
-
-void (*orig_evgl_api_glEnable)(GLenum cap);
-
-static void
-_evgl_api_thread_glEnable(void *data)
-{
-   EVGL_API_Thread_Command_glEnable *thread_data =
-      (EVGL_API_Thread_Command_glEnable *)data;
-
-   orig_evgl_api_glEnable(thread_data->cap);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glEnable_evgl_api_thread_cmd(GLenum cap)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEnable(cap);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEnable thread_data_local;
-   EVGL_API_Thread_Command_glEnable *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glEnable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glEnable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->cap = cap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEnable,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnableVertexAttribArray(GLuint index);
- */
-
-typedef struct
-{
-   GLuint index;
-
-} EVGL_API_Thread_Command_glEnableVertexAttribArray;
-
-void (*orig_evgl_api_glEnableVertexAttribArray)(GLuint index);
-
-static void
-_evgl_api_thread_glEnableVertexAttribArray(void *data)
-{
-   EVGL_API_Thread_Command_glEnableVertexAttribArray *thread_data =
-      (EVGL_API_Thread_Command_glEnableVertexAttribArray *)data;
-
-   orig_evgl_api_glEnableVertexAttribArray(thread_data->index);
-
-}
-
-EAPI void
-glEnableVertexAttribArray_evgl_api_thread_cmd(GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEnableVertexAttribArray(index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEnableVertexAttribArray thread_data_local;
-   EVGL_API_Thread_Command_glEnableVertexAttribArray *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEnableVertexAttribArray,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFinish(void);
- */
-
-void (*orig_evgl_api_glFinish)(void);
-
-static void
-_evgl_api_thread_glFinish(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glFinish();
-
-}
-
-EAPI void
-glFinish_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFinish();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFinish,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glFlush(void);
- */
-
-void (*orig_evgl_api_glFlush)(void);
-
-static void
-_evgl_api_thread_glFlush(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glFlush();
-
-}
-
-EAPI void
-glFlush_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFlush();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFlush,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum renderbuffertarget;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferRenderbuffer;
-
-void (*orig_evgl_api_glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glFramebufferRenderbuffer(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferRenderbuffer *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferRenderbuffer *)data;
-
-   orig_evgl_api_glFramebufferRenderbuffer(thread_data->target,
-                                           thread_data->attachment,
-                                           thread_data->renderbuffertarget,
-                                           thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferRenderbuffer_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferRenderbuffer thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferRenderbuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->renderbuffertarget = renderbuffertarget;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferRenderbuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum textarget;
-   GLuint texture;
-   GLint level;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferTexture2D;
-
-void (*orig_evgl_api_glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-static void
-_evgl_api_thread_glFramebufferTexture2D(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture2D *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture2D *)data;
-
-   orig_evgl_api_glFramebufferTexture2D(thread_data->target,
-                                        thread_data->attachment,
-                                        thread_data->textarget,
-                                        thread_data->texture,
-                                        thread_data->level);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2D_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture2D(target, attachment, textarget, texture, level);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture2D thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferTexture2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferTexture2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
-   thread_data->texture = texture;
-   thread_data->level = level;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFrontFace(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glFrontFace;
-
-void (*orig_evgl_api_glFrontFace)(GLenum mode);
-
-static void
-_evgl_api_thread_glFrontFace(void *data)
-{
-   EVGL_API_Thread_Command_glFrontFace *thread_data =
-      (EVGL_API_Thread_Command_glFrontFace *)data;
-
-   orig_evgl_api_glFrontFace(thread_data->mode);
-
-}
-
-EAPI void
-glFrontFace_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFrontFace(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFrontFace thread_data_local;
-   EVGL_API_Thread_Command_glFrontFace *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFrontFace,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenBuffers(GLsizei n, GLuint* buffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* buffers;
-
-} EVGL_API_Thread_Command_glGenBuffers;
-
-void (*orig_evgl_api_glGenBuffers)(GLsizei n, GLuint* buffers);
-
-static void
-_evgl_api_thread_glGenBuffers(void *data)
-{
-   EVGL_API_Thread_Command_glGenBuffers *thread_data =
-      (EVGL_API_Thread_Command_glGenBuffers *)data;
-
-   orig_evgl_api_glGenBuffers(thread_data->n,
-                              thread_data->buffers);
-
-}
-
-EAPI void
-glGenBuffers_evgl_api_thread_cmd(GLsizei n, GLuint* buffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenBuffers(n, buffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenBuffers thread_data_local;
-   EVGL_API_Thread_Command_glGenBuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->buffers = buffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenBuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenerateMipmap(GLenum target);
- */
-
-typedef struct
-{
-   GLenum target;
-
-} EVGL_API_Thread_Command_glGenerateMipmap;
-
-void (*orig_evgl_api_glGenerateMipmap)(GLenum target);
-
-static void
-_evgl_api_thread_glGenerateMipmap(void *data)
-{
-   EVGL_API_Thread_Command_glGenerateMipmap *thread_data =
-      (EVGL_API_Thread_Command_glGenerateMipmap *)data;
-
-   orig_evgl_api_glGenerateMipmap(thread_data->target);
-
-}
-
-EAPI void
-glGenerateMipmap_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenerateMipmap(target);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenerateMipmap thread_data_local;
-   EVGL_API_Thread_Command_glGenerateMipmap *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenerateMipmap,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenFramebuffers(GLsizei n, GLuint* framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* framebuffers;
-
-} EVGL_API_Thread_Command_glGenFramebuffers;
-
-void (*orig_evgl_api_glGenFramebuffers)(GLsizei n, GLuint* framebuffers);
-
-static void
-_evgl_api_thread_glGenFramebuffers(void *data)
-{
-   EVGL_API_Thread_Command_glGenFramebuffers *thread_data =
-      (EVGL_API_Thread_Command_glGenFramebuffers *)data;
-
-   orig_evgl_api_glGenFramebuffers(thread_data->n,
-                                   thread_data->framebuffers);
-
-}
-
-EAPI void
-glGenFramebuffers_evgl_api_thread_cmd(GLsizei n, GLuint* framebuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenFramebuffers(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenFramebuffers thread_data_local;
-   EVGL_API_Thread_Command_glGenFramebuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenFramebuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* renderbuffers;
-
-} EVGL_API_Thread_Command_glGenRenderbuffers;
-
-void (*orig_evgl_api_glGenRenderbuffers)(GLsizei n, GLuint* renderbuffers);
-
-static void
-_evgl_api_thread_glGenRenderbuffers(void *data)
-{
-   EVGL_API_Thread_Command_glGenRenderbuffers *thread_data =
-      (EVGL_API_Thread_Command_glGenRenderbuffers *)data;
-
-   orig_evgl_api_glGenRenderbuffers(thread_data->n,
-                                    thread_data->renderbuffers);
-
-}
-
-EAPI void
-glGenRenderbuffers_evgl_api_thread_cmd(GLsizei n, GLuint* renderbuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenRenderbuffers(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenRenderbuffers thread_data_local;
-   EVGL_API_Thread_Command_glGenRenderbuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenRenderbuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenTextures(GLsizei n, GLuint* textures);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* textures;
-
-} EVGL_API_Thread_Command_glGenTextures;
-
-void (*orig_evgl_api_glGenTextures)(GLsizei n, GLuint* textures);
-
-static void
-_evgl_api_thread_glGenTextures(void *data)
-{
-   EVGL_API_Thread_Command_glGenTextures *thread_data =
-      (EVGL_API_Thread_Command_glGenTextures *)data;
-
-   orig_evgl_api_glGenTextures(thread_data->n,
-                               thread_data->textures);
-
-}
-
-EAPI void
-glGenTextures_evgl_api_thread_cmd(GLsizei n, GLuint* textures)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenTextures(n, textures);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenTextures thread_data_local;
-   EVGL_API_Thread_Command_glGenTextures *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->textures = textures;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenTextures,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   GLsizei bufsize;
-   GLsizei* length;
-   GLint* size;
-   GLenum* type;
-   char* name;
-
-} EVGL_API_Thread_Command_glGetActiveAttrib;
-
-void (*orig_evgl_api_glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-
-static void
-_evgl_api_thread_glGetActiveAttrib(void *data)
-{
-   EVGL_API_Thread_Command_glGetActiveAttrib *thread_data =
-      (EVGL_API_Thread_Command_glGetActiveAttrib *)data;
-
-   orig_evgl_api_glGetActiveAttrib(thread_data->program,
-                                   thread_data->index,
-                                   thread_data->bufsize,
-                                   thread_data->length,
-                                   thread_data->size,
-                                   thread_data->type,
-                                   thread_data->name);
-
-}
-
-EAPI void
-glGetActiveAttrib_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetActiveAttrib(program, index, bufsize, length, size, type, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetActiveAttrib thread_data_local;
-   EVGL_API_Thread_Command_glGetActiveAttrib *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetActiveAttrib,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   GLsizei bufsize;
-   GLsizei* length;
-   GLint* size;
-   GLenum* type;
-   char* name;
-
-} EVGL_API_Thread_Command_glGetActiveUniform;
-
-void (*orig_evgl_api_glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-
-static void
-_evgl_api_thread_glGetActiveUniform(void *data)
-{
-   EVGL_API_Thread_Command_glGetActiveUniform *thread_data =
-      (EVGL_API_Thread_Command_glGetActiveUniform *)data;
-
-   orig_evgl_api_glGetActiveUniform(thread_data->program,
-                                    thread_data->index,
-                                    thread_data->bufsize,
-                                    thread_data->length,
-                                    thread_data->size,
-                                    thread_data->type,
-                                    thread_data->name);
-
-}
-
-EAPI void
-glGetActiveUniform_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetActiveUniform(program, index, bufsize, length, size, type, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetActiveUniform thread_data_local;
-   EVGL_API_Thread_Command_glGetActiveUniform *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetActiveUniform,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei maxcount;
-   GLsizei* count;
-   GLuint* shaders;
-
-} EVGL_API_Thread_Command_glGetAttachedShaders;
-
-void (*orig_evgl_api_glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-
-static void
-_evgl_api_thread_glGetAttachedShaders(void *data)
-{
-   EVGL_API_Thread_Command_glGetAttachedShaders *thread_data =
-      (EVGL_API_Thread_Command_glGetAttachedShaders *)data;
-
-   orig_evgl_api_glGetAttachedShaders(thread_data->program,
-                                      thread_data->maxcount,
-                                      thread_data->count,
-                                      thread_data->shaders);
-
-}
-
-EAPI void
-glGetAttachedShaders_evgl_api_thread_cmd(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetAttachedShaders(program, maxcount, count, shaders);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetAttachedShaders thread_data_local;
-   EVGL_API_Thread_Command_glGetAttachedShaders *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->maxcount = maxcount;
-   thread_data->count = count;
-   thread_data->shaders = shaders;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetAttachedShaders,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * int
- * glGetAttribLocation(GLuint program, const char* name);
- */
-
-typedef struct
-{
-   int return_value;
-   GLuint program;
-   const char* name;
-
-} EVGL_API_Thread_Command_glGetAttribLocation;
-
-int (*orig_evgl_api_glGetAttribLocation)(GLuint program, const char* name);
-
-static void
-_evgl_api_thread_glGetAttribLocation(void *data)
-{
-   EVGL_API_Thread_Command_glGetAttribLocation *thread_data =
-      (EVGL_API_Thread_Command_glGetAttribLocation *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetAttribLocation(thread_data->program,
-                                                                 thread_data->name);
-
-}
-
-EAPI int
-glGetAttribLocation_evgl_api_thread_cmd(GLuint program, const char* name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetAttribLocation(program, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetAttribLocation thread_data_local;
-   EVGL_API_Thread_Command_glGetAttribLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetAttribLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetBooleanv(GLenum pname, GLboolean* params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLboolean* params;
-
-} EVGL_API_Thread_Command_glGetBooleanv;
-
-void (*orig_evgl_api_glGetBooleanv)(GLenum pname, GLboolean* params);
-
-static void
-_evgl_api_thread_glGetBooleanv(void *data)
-{
-   EVGL_API_Thread_Command_glGetBooleanv *thread_data =
-      (EVGL_API_Thread_Command_glGetBooleanv *)data;
-
-   orig_evgl_api_glGetBooleanv(thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetBooleanv_evgl_api_thread_cmd(GLenum pname, GLboolean* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBooleanv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBooleanv thread_data_local;
-   EVGL_API_Thread_Command_glGetBooleanv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBooleanv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetBufferParameteriv;
-
-void (*orig_evgl_api_glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetBufferParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetBufferParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetBufferParameteriv *)data;
-
-   orig_evgl_api_glGetBufferParameteriv(thread_data->target,
-                                        thread_data->pname,
-                                        thread_data->params);
-
-}
-
-EAPI void
-glGetBufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBufferParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBufferParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetBufferParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBufferParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glGetError(void);
- */
-
-typedef struct
-{
-   GLenum return_value;
-
-} EVGL_API_Thread_Command_glGetError;
-
-GLenum (*orig_evgl_api_glGetError)(void);
-
-static void
-_evgl_api_thread_glGetError(void *data)
-{
-   EVGL_API_Thread_Command_glGetError *thread_data =
-      (EVGL_API_Thread_Command_glGetError *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetError();
-
-}
-
-EAPI GLenum
-glGetError_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetError();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetError thread_data_local;
-   EVGL_API_Thread_Command_glGetError *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetError,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetFloatv(GLenum pname, GLfloat* params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat* params;
-
-} EVGL_API_Thread_Command_glGetFloatv;
-
-void (*orig_evgl_api_glGetFloatv)(GLenum pname, GLfloat* params);
-
-static void
-_evgl_api_thread_glGetFloatv(void *data)
-{
-   EVGL_API_Thread_Command_glGetFloatv *thread_data =
-      (EVGL_API_Thread_Command_glGetFloatv *)data;
-
-   orig_evgl_api_glGetFloatv(thread_data->pname,
-                             thread_data->params);
-
-}
-
-EAPI void
-glGetFloatv_evgl_api_thread_cmd(GLenum pname, GLfloat* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFloatv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFloatv thread_data_local;
-   EVGL_API_Thread_Command_glGetFloatv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFloatv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetFramebufferAttachmentParameteriv;
-
-void (*orig_evgl_api_glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetFramebufferAttachmentParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetFramebufferAttachmentParameteriv *)data;
-
-   orig_evgl_api_glGetFramebufferAttachmentParameteriv(thread_data->target,
-                                                       thread_data->attachment,
-                                                       thread_data->pname,
-                                                       thread_data->params);
-
-}
-
-EAPI void
-glGetFramebufferAttachmentParameteriv_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFramebufferAttachmentParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetIntegerv(GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetIntegerv;
-
-void (*orig_evgl_api_glGetIntegerv)(GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetIntegerv(void *data)
-{
-   EVGL_API_Thread_Command_glGetIntegerv *thread_data =
-      (EVGL_API_Thread_Command_glGetIntegerv *)data;
-
-   orig_evgl_api_glGetIntegerv(thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetIntegerv_evgl_api_thread_cmd(GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetIntegerv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetIntegerv thread_data_local;
-   EVGL_API_Thread_Command_glGetIntegerv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetIntegerv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramiv(GLuint program, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetProgramiv;
-
-void (*orig_evgl_api_glGetProgramiv)(GLuint program, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetProgramiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramiv *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramiv *)data;
-
-   orig_evgl_api_glGetProgramiv(thread_data->program,
-                                thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetProgramiv_evgl_api_thread_cmd(GLuint program, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramiv(program, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramiv thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei bufsize;
-   GLsizei* length;
-   char* infolog;
-
-} EVGL_API_Thread_Command_glGetProgramInfoLog;
-
-void (*orig_evgl_api_glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
-
-static void
-_evgl_api_thread_glGetProgramInfoLog(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramInfoLog *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramInfoLog *)data;
-
-   orig_evgl_api_glGetProgramInfoLog(thread_data->program,
-                                     thread_data->bufsize,
-                                     thread_data->length,
-                                     thread_data->infolog);
-
-}
-
-EAPI void
-glGetProgramInfoLog_evgl_api_thread_cmd(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramInfoLog(program, bufsize, length, infolog);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramInfoLog thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramInfoLog *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->infolog = infolog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramInfoLog,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetRenderbufferParameteriv;
-
-void (*orig_evgl_api_glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetRenderbufferParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetRenderbufferParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetRenderbufferParameteriv *)data;
-
-   orig_evgl_api_glGetRenderbufferParameteriv(thread_data->target,
-                                              thread_data->pname,
-                                              thread_data->params);
-
-}
-
-EAPI void
-glGetRenderbufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetRenderbufferParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetRenderbufferParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetRenderbufferParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetRenderbufferParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetShaderiv;
-
-void (*orig_evgl_api_glGetShaderiv)(GLuint shader, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetShaderiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetShaderiv *thread_data =
-      (EVGL_API_Thread_Command_glGetShaderiv *)data;
-
-   orig_evgl_api_glGetShaderiv(thread_data->shader,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetShaderiv_evgl_api_thread_cmd(GLuint shader, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetShaderiv(shader, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetShaderiv thread_data_local;
-   EVGL_API_Thread_Command_glGetShaderiv *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetShaderiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei bufsize;
-   GLsizei* length;
-   char* infolog;
-
-} EVGL_API_Thread_Command_glGetShaderInfoLog;
-
-void (*orig_evgl_api_glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
-
-static void
-_evgl_api_thread_glGetShaderInfoLog(void *data)
-{
-   EVGL_API_Thread_Command_glGetShaderInfoLog *thread_data =
-      (EVGL_API_Thread_Command_glGetShaderInfoLog *)data;
-
-   orig_evgl_api_glGetShaderInfoLog(thread_data->shader,
-                                    thread_data->bufsize,
-                                    thread_data->length,
-                                    thread_data->infolog);
-
-}
-
-EAPI void
-glGetShaderInfoLog_evgl_api_thread_cmd(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetShaderInfoLog(shader, bufsize, length, infolog);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetShaderInfoLog thread_data_local;
-   EVGL_API_Thread_Command_glGetShaderInfoLog *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->infolog = infolog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetShaderInfoLog,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
- */
-
-typedef struct
-{
-   GLenum shadertype;
-   GLenum precisiontype;
-   GLint* range;
-   GLint* precision;
-
-} EVGL_API_Thread_Command_glGetShaderPrecisionFormat;
-
-void (*orig_evgl_api_glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-
-static void
-_evgl_api_thread_glGetShaderPrecisionFormat(void *data)
-{
-   EVGL_API_Thread_Command_glGetShaderPrecisionFormat *thread_data =
-      (EVGL_API_Thread_Command_glGetShaderPrecisionFormat *)data;
-
-   orig_evgl_api_glGetShaderPrecisionFormat(thread_data->shadertype,
-                                            thread_data->precisiontype,
-                                            thread_data->range,
-                                            thread_data->precision);
-
-}
-
-EAPI void
-glGetShaderPrecisionFormat_evgl_api_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetShaderPrecisionFormat thread_data_local;
-   EVGL_API_Thread_Command_glGetShaderPrecisionFormat *thread_data = &thread_data_local;
-
-   thread_data->shadertype = shadertype;
-   thread_data->precisiontype = precisiontype;
-   thread_data->range = range;
-   thread_data->precision = precision;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetShaderPrecisionFormat,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei bufsize;
-   GLsizei* length;
-   char* source;
-
-} EVGL_API_Thread_Command_glGetShaderSource;
-
-void (*orig_evgl_api_glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
-
-static void
-_evgl_api_thread_glGetShaderSource(void *data)
-{
-   EVGL_API_Thread_Command_glGetShaderSource *thread_data =
-      (EVGL_API_Thread_Command_glGetShaderSource *)data;
-
-   orig_evgl_api_glGetShaderSource(thread_data->shader,
-                                   thread_data->bufsize,
-                                   thread_data->length,
-                                   thread_data->source);
-
-}
-
-EAPI void
-glGetShaderSource_evgl_api_thread_cmd(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetShaderSource(shader, bufsize, length, source);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetShaderSource thread_data_local;
-   EVGL_API_Thread_Command_glGetShaderSource *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->source = source;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetShaderSource,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * const GLubyte*
- * glGetString(GLenum name);
- */
-
-typedef struct
-{
-   const GLubyte* return_value;
-   GLenum name;
-
-} EVGL_API_Thread_Command_glGetString;
-
-const GLubyte* (*orig_evgl_api_glGetString)(GLenum name);
-
-static void
-_evgl_api_thread_glGetString(void *data)
-{
-   EVGL_API_Thread_Command_glGetString *thread_data =
-      (EVGL_API_Thread_Command_glGetString *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetString(thread_data->name);
-
-}
-
-EAPI const GLubyte*
-glGetString_evgl_api_thread_cmd(GLenum name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetString(name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetString thread_data_local;
-   EVGL_API_Thread_Command_glGetString *thread_data = &thread_data_local;
-
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetString,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfloat* params;
-
-} EVGL_API_Thread_Command_glGetTexParameterfv;
-
-void (*orig_evgl_api_glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params);
-
-static void
-_evgl_api_thread_glGetTexParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameterfv *)data;
-
-   orig_evgl_api_glGetTexParameterfv(thread_data->target,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameterfv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameterfv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameterfv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetTexParameteriv;
-
-void (*orig_evgl_api_glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetTexParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameteriv *)data;
-
-   orig_evgl_api_glGetTexParameteriv(thread_data->target,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetUniformfv(GLuint program, GLint location, GLfloat* params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLfloat* params;
-
-} EVGL_API_Thread_Command_glGetUniformfv;
-
-void (*orig_evgl_api_glGetUniformfv)(GLuint program, GLint location, GLfloat* params);
-
-static void
-_evgl_api_thread_glGetUniformfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformfv *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformfv *)data;
-
-   orig_evgl_api_glGetUniformfv(thread_data->program,
-                                thread_data->location,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetUniformfv_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetUniformfv(program, location, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformfv thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformfv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetUniformiv(GLuint program, GLint location, GLint* params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetUniformiv;
-
-void (*orig_evgl_api_glGetUniformiv)(GLuint program, GLint location, GLint* params);
-
-static void
-_evgl_api_thread_glGetUniformiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformiv *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformiv *)data;
-
-   orig_evgl_api_glGetUniformiv(thread_data->program,
-                                thread_data->location,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetUniformiv_evgl_api_thread_cmd(GLuint program, GLint location, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetUniformiv(program, location, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformiv thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * int
- * glGetUniformLocation(GLuint program, const char* name);
- */
-
-typedef struct
-{
-   int return_value;
-   GLuint program;
-   const char* name;
-
-} EVGL_API_Thread_Command_glGetUniformLocation;
-
-int (*orig_evgl_api_glGetUniformLocation)(GLuint program, const char* name);
-
-static void
-_evgl_api_thread_glGetUniformLocation(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformLocation *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformLocation *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetUniformLocation(thread_data->program,
-                                                                  thread_data->name);
-
-}
-
-EAPI int
-glGetUniformLocation_evgl_api_thread_cmd(GLuint program, const char* name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetUniformLocation(program, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformLocation thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLfloat* params;
-
-} EVGL_API_Thread_Command_glGetVertexAttribfv;
-
-void (*orig_evgl_api_glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params);
-
-static void
-_evgl_api_thread_glGetVertexAttribfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetVertexAttribfv *thread_data =
-      (EVGL_API_Thread_Command_glGetVertexAttribfv *)data;
-
-   orig_evgl_api_glGetVertexAttribfv(thread_data->index,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribfv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLfloat* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetVertexAttribfv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetVertexAttribfv thread_data_local;
-   EVGL_API_Thread_Command_glGetVertexAttribfv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetVertexAttribfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetVertexAttribiv;
-
-void (*orig_evgl_api_glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetVertexAttribiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetVertexAttribiv *thread_data =
-      (EVGL_API_Thread_Command_glGetVertexAttribiv *)data;
-
-   orig_evgl_api_glGetVertexAttribiv(thread_data->index,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetVertexAttribiv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetVertexAttribiv thread_data_local;
-   EVGL_API_Thread_Command_glGetVertexAttribiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetVertexAttribiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   void** pointer;
-
-} EVGL_API_Thread_Command_glGetVertexAttribPointerv;
-
-void (*orig_evgl_api_glGetVertexAttribPointerv)(GLuint index, GLenum pname, void** pointer);
-
-static void
-_evgl_api_thread_glGetVertexAttribPointerv(void *data)
-{
-   EVGL_API_Thread_Command_glGetVertexAttribPointerv *thread_data =
-      (EVGL_API_Thread_Command_glGetVertexAttribPointerv *)data;
-
-   orig_evgl_api_glGetVertexAttribPointerv(thread_data->index,
-                                           thread_data->pname,
-                                           thread_data->pointer);
-
-}
-
-EAPI void
-glGetVertexAttribPointerv_evgl_api_thread_cmd(GLuint index, GLenum pname, void** pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetVertexAttribPointerv(index, pname, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetVertexAttribPointerv thread_data_local;
-   EVGL_API_Thread_Command_glGetVertexAttribPointerv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetVertexAttribPointerv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glHint(GLenum target, GLenum mode);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum mode;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glHint;
-
-void (*orig_evgl_api_glHint)(GLenum target, GLenum mode);
-
-static void
-_evgl_api_thread_glHint(void *data)
-{
-   EVGL_API_Thread_Command_glHint *thread_data =
-      (EVGL_API_Thread_Command_glHint *)data;
-
-   orig_evgl_api_glHint(thread_data->target,
-                        thread_data->mode);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glHint_evgl_api_thread_cmd(GLenum target, GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glHint(target, mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glHint thread_data_local;
-   EVGL_API_Thread_Command_glHint *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glHint *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glHint));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glHint,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsBuffer(GLuint buffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint buffer;
-
-} EVGL_API_Thread_Command_glIsBuffer;
-
-GLboolean (*orig_evgl_api_glIsBuffer)(GLuint buffer);
-
-static void
-_evgl_api_thread_glIsBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glIsBuffer *thread_data =
-      (EVGL_API_Thread_Command_glIsBuffer *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsBuffer(thread_data->buffer);
-
-}
-
-EAPI GLboolean
-glIsBuffer_evgl_api_thread_cmd(GLuint buffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsBuffer(buffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsBuffer thread_data_local;
-   EVGL_API_Thread_Command_glIsBuffer *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsBuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsEnabled(GLenum cap);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLenum cap;
-
-} EVGL_API_Thread_Command_glIsEnabled;
-
-GLboolean (*orig_evgl_api_glIsEnabled)(GLenum cap);
-
-static void
-_evgl_api_thread_glIsEnabled(void *data)
-{
-   EVGL_API_Thread_Command_glIsEnabled *thread_data =
-      (EVGL_API_Thread_Command_glIsEnabled *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsEnabled(thread_data->cap);
-
-}
-
-EAPI GLboolean
-glIsEnabled_evgl_api_thread_cmd(GLenum cap)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsEnabled(cap);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsEnabled thread_data_local;
-   EVGL_API_Thread_Command_glIsEnabled *thread_data = &thread_data_local;
-
-   thread_data->cap = cap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsEnabled,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsFramebuffer(GLuint framebuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint framebuffer;
-
-} EVGL_API_Thread_Command_glIsFramebuffer;
-
-GLboolean (*orig_evgl_api_glIsFramebuffer)(GLuint framebuffer);
-
-static void
-_evgl_api_thread_glIsFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glIsFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glIsFramebuffer *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsFramebuffer(thread_data->framebuffer);
-
-}
-
-EAPI GLboolean
-glIsFramebuffer_evgl_api_thread_cmd(GLuint framebuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsFramebuffer(framebuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glIsFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsFramebuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint program;
-
-} EVGL_API_Thread_Command_glIsProgram;
-
-GLboolean (*orig_evgl_api_glIsProgram)(GLuint program);
-
-static void
-_evgl_api_thread_glIsProgram(void *data)
-{
-   EVGL_API_Thread_Command_glIsProgram *thread_data =
-      (EVGL_API_Thread_Command_glIsProgram *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsProgram(thread_data->program);
-
-}
-
-EAPI GLboolean
-glIsProgram_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsProgram(program);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsProgram thread_data_local;
-   EVGL_API_Thread_Command_glIsProgram *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsProgram,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsRenderbuffer(GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint renderbuffer;
-
-} EVGL_API_Thread_Command_glIsRenderbuffer;
-
-GLboolean (*orig_evgl_api_glIsRenderbuffer)(GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glIsRenderbuffer(void *data)
-{
-   EVGL_API_Thread_Command_glIsRenderbuffer *thread_data =
-      (EVGL_API_Thread_Command_glIsRenderbuffer *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsRenderbuffer(thread_data->renderbuffer);
-
-}
-
-EAPI GLboolean
-glIsRenderbuffer_evgl_api_thread_cmd(GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsRenderbuffer(renderbuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsRenderbuffer thread_data_local;
-   EVGL_API_Thread_Command_glIsRenderbuffer *thread_data = &thread_data_local;
-
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsRenderbuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint shader;
-
-} EVGL_API_Thread_Command_glIsShader;
-
-GLboolean (*orig_evgl_api_glIsShader)(GLuint shader);
-
-static void
-_evgl_api_thread_glIsShader(void *data)
-{
-   EVGL_API_Thread_Command_glIsShader *thread_data =
-      (EVGL_API_Thread_Command_glIsShader *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsShader(thread_data->shader);
-
-}
-
-EAPI GLboolean
-glIsShader_evgl_api_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsShader(shader);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsShader thread_data_local;
-   EVGL_API_Thread_Command_glIsShader *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsShader,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsTexture(GLuint texture);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint texture;
-
-} EVGL_API_Thread_Command_glIsTexture;
-
-GLboolean (*orig_evgl_api_glIsTexture)(GLuint texture);
-
-static void
-_evgl_api_thread_glIsTexture(void *data)
-{
-   EVGL_API_Thread_Command_glIsTexture *thread_data =
-      (EVGL_API_Thread_Command_glIsTexture *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsTexture(thread_data->texture);
-
-}
-
-EAPI GLboolean
-glIsTexture_evgl_api_thread_cmd(GLuint texture)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsTexture(texture);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsTexture thread_data_local;
-   EVGL_API_Thread_Command_glIsTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsTexture,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glLineWidth(GLfloat width);
- */
-
-typedef struct
-{
-   GLfloat width;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glLineWidth;
-
-void (*orig_evgl_api_glLineWidth)(GLfloat width);
-
-static void
-_evgl_api_thread_glLineWidth(void *data)
-{
-   EVGL_API_Thread_Command_glLineWidth *thread_data =
-      (EVGL_API_Thread_Command_glLineWidth *)data;
-
-   orig_evgl_api_glLineWidth(thread_data->width);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glLineWidth_evgl_api_thread_cmd(GLfloat width)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLineWidth(width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLineWidth thread_data_local;
-   EVGL_API_Thread_Command_glLineWidth *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glLineWidth *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glLineWidth));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLineWidth,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLinkProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glLinkProgram;
-
-void (*orig_evgl_api_glLinkProgram)(GLuint program);
-
-static void
-_evgl_api_thread_glLinkProgram(void *data)
-{
-   EVGL_API_Thread_Command_glLinkProgram *thread_data =
-      (EVGL_API_Thread_Command_glLinkProgram *)data;
-
-   orig_evgl_api_glLinkProgram(thread_data->program);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glLinkProgram_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLinkProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLinkProgram thread_data_local;
-   EVGL_API_Thread_Command_glLinkProgram *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glLinkProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glLinkProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLinkProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPixelStorei(GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLint param;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glPixelStorei;
-
-void (*orig_evgl_api_glPixelStorei)(GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glPixelStorei(void *data)
-{
-   EVGL_API_Thread_Command_glPixelStorei *thread_data =
-      (EVGL_API_Thread_Command_glPixelStorei *)data;
-
-   orig_evgl_api_glPixelStorei(thread_data->pname,
-                               thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glPixelStorei_evgl_api_thread_cmd(GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPixelStorei(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPixelStorei thread_data_local;
-   EVGL_API_Thread_Command_glPixelStorei *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glPixelStorei *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glPixelStorei));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPixelStorei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPolygonOffset(GLfloat factor, GLfloat units);
- */
-
-typedef struct
-{
-   GLfloat factor;
-   GLfloat units;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glPolygonOffset;
-
-void (*orig_evgl_api_glPolygonOffset)(GLfloat factor, GLfloat units);
-
-static void
-_evgl_api_thread_glPolygonOffset(void *data)
-{
-   EVGL_API_Thread_Command_glPolygonOffset *thread_data =
-      (EVGL_API_Thread_Command_glPolygonOffset *)data;
-
-   orig_evgl_api_glPolygonOffset(thread_data->factor,
-                                 thread_data->units);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glPolygonOffset_evgl_api_thread_cmd(GLfloat factor, GLfloat units)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPolygonOffset(factor, units);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPolygonOffset thread_data_local;
-   EVGL_API_Thread_Command_glPolygonOffset *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glPolygonOffset *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glPolygonOffset));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->factor = factor;
-   thread_data->units = units;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPolygonOffset,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   void* pixels;
-
-} EVGL_API_Thread_Command_glReadPixels;
-
-void (*orig_evgl_api_glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
-
-static void
-_evgl_api_thread_glReadPixels(void *data)
-{
-   EVGL_API_Thread_Command_glReadPixels *thread_data =
-      (EVGL_API_Thread_Command_glReadPixels *)data;
-
-   orig_evgl_api_glReadPixels(thread_data->x,
-                              thread_data->y,
-                              thread_data->width,
-                              thread_data->height,
-                              thread_data->format,
-                              thread_data->type,
-                              thread_data->pixels);
-
-}
-
-EAPI void
-glReadPixels_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glReadPixels(x, y, width, height, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glReadPixels thread_data_local;
-   EVGL_API_Thread_Command_glReadPixels *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glReadPixels,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glReleaseShaderCompiler(void);
- */
-
-void (*orig_evgl_api_glReleaseShaderCompiler)(void);
-
-static void
-_evgl_api_thread_glReleaseShaderCompiler(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glReleaseShaderCompiler();
-
-}
-
-EAPI void
-glReleaseShaderCompiler_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glReleaseShaderCompiler();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glReleaseShaderCompiler,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glRenderbufferStorage;
-
-void (*orig_evgl_api_glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glRenderbufferStorage(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorage *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorage *)data;
-
-   orig_evgl_api_glRenderbufferStorage(thread_data->target,
-                                       thread_data->internalformat,
-                                       thread_data->width,
-                                       thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glRenderbufferStorage_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorage(target, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorage thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorage *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glRenderbufferStorage *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glRenderbufferStorage));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSampleCoverage(GLclampf value, GLboolean invert);
- */
-
-typedef struct
-{
-   GLclampf value;
-   GLboolean invert;
-
-} EVGL_API_Thread_Command_glSampleCoverage;
-
-void (*orig_evgl_api_glSampleCoverage)(GLclampf value, GLboolean invert);
-
-static void
-_evgl_api_thread_glSampleCoverage(void *data)
-{
-   EVGL_API_Thread_Command_glSampleCoverage *thread_data =
-      (EVGL_API_Thread_Command_glSampleCoverage *)data;
-
-   orig_evgl_api_glSampleCoverage(thread_data->value,
-                                  thread_data->invert);
-
-}
-
-EAPI void
-glSampleCoverage_evgl_api_thread_cmd(GLclampf value, GLboolean invert)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSampleCoverage(value, invert);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSampleCoverage thread_data_local;
-   EVGL_API_Thread_Command_glSampleCoverage *thread_data = &thread_data_local;
-
-   thread_data->value = value;
-   thread_data->invert = invert;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSampleCoverage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glScissor;
-
-void (*orig_evgl_api_glScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glScissor(void *data)
-{
-   EVGL_API_Thread_Command_glScissor *thread_data =
-      (EVGL_API_Thread_Command_glScissor *)data;
-
-   orig_evgl_api_glScissor(thread_data->x,
-                           thread_data->y,
-                           thread_data->width,
-                           thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glScissor_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glScissor(x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glScissor thread_data_local;
-   EVGL_API_Thread_Command_glScissor *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glScissor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glScissor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glScissor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* shaders;
-   GLenum binaryformat;
-   const void* binary;
-   GLsizei length;
-
-} EVGL_API_Thread_Command_glShaderBinary;
-
-void (*orig_evgl_api_glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
-
-static void
-_evgl_api_thread_glShaderBinary(void *data)
-{
-   EVGL_API_Thread_Command_glShaderBinary *thread_data =
-      (EVGL_API_Thread_Command_glShaderBinary *)data;
-
-   orig_evgl_api_glShaderBinary(thread_data->n,
-                                thread_data->shaders,
-                                thread_data->binaryformat,
-                                thread_data->binary,
-                                thread_data->length);
-
-}
-
-EAPI void
-glShaderBinary_evgl_api_thread_cmd(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glShaderBinary(n, shaders, binaryformat, binary, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glShaderBinary thread_data_local;
-   EVGL_API_Thread_Command_glShaderBinary *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->shaders = shaders;
-   thread_data->binaryformat = binaryformat;
-   thread_data->binary = binary;
-   thread_data->length = length;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glShaderBinary,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glShaderSource(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei count;
-   const char* const * string;
-   const GLint* length;
-   int command_allocated;
-   GLSHADERSOURCE_COPY_VARIABLE; /* TODO */
-
-} EVGL_API_Thread_Command_glShaderSource;
-
-void (*orig_evgl_api_glShaderSource)(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
-
-static void
-_evgl_api_thread_glShaderSource(void *data)
-{
-   EVGL_API_Thread_Command_glShaderSource *thread_data =
-      (EVGL_API_Thread_Command_glShaderSource *)data;
-
-   orig_evgl_api_glShaderSource(thread_data->shader,
-                                thread_data->count,
-                                thread_data->string,
-                                thread_data->length);
-
-   GLSHADERSOURCE_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glShaderSource_evgl_api_thread_cmd(GLuint shader, GLsizei count, const char* const * string, const GLint* length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glShaderSource(shader, count, string, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glShaderSource thread_data_local;
-   EVGL_API_Thread_Command_glShaderSource *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glShaderSource *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glShaderSource));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-   thread_data->count = count;
-   thread_data->string = string;
-   thread_data->length = length;
-
-   GLSHADERSOURCE_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLSHADERSOURCE_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glShaderSource,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilFunc(GLenum func, GLint ref, GLuint mask);
- */
-
-typedef struct
-{
-   GLenum func;
-   GLint ref;
-   GLuint mask;
-
-} EVGL_API_Thread_Command_glStencilFunc;
-
-void (*orig_evgl_api_glStencilFunc)(GLenum func, GLint ref, GLuint mask);
-
-static void
-_evgl_api_thread_glStencilFunc(void *data)
-{
-   EVGL_API_Thread_Command_glStencilFunc *thread_data =
-      (EVGL_API_Thread_Command_glStencilFunc *)data;
-
-   orig_evgl_api_glStencilFunc(thread_data->func,
-                               thread_data->ref,
-                               thread_data->mask);
-
-}
-
-EAPI void
-glStencilFunc_evgl_api_thread_cmd(GLenum func, GLint ref, GLuint mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilFunc(func, ref, mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilFunc thread_data_local;
-   EVGL_API_Thread_Command_glStencilFunc *thread_data = &thread_data_local;
-
-   thread_data->func = func;
-   thread_data->ref = ref;
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilFunc,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum func;
-   GLint ref;
-   GLuint mask;
-
-} EVGL_API_Thread_Command_glStencilFuncSeparate;
-
-void (*orig_evgl_api_glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask);
-
-static void
-_evgl_api_thread_glStencilFuncSeparate(void *data)
-{
-   EVGL_API_Thread_Command_glStencilFuncSeparate *thread_data =
-      (EVGL_API_Thread_Command_glStencilFuncSeparate *)data;
-
-   orig_evgl_api_glStencilFuncSeparate(thread_data->face,
-                                       thread_data->func,
-                                       thread_data->ref,
-                                       thread_data->mask);
-
-}
-
-EAPI void
-glStencilFuncSeparate_evgl_api_thread_cmd(GLenum face, GLenum func, GLint ref, GLuint mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilFuncSeparate(face, func, ref, mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilFuncSeparate thread_data_local;
-   EVGL_API_Thread_Command_glStencilFuncSeparate *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->func = func;
-   thread_data->ref = ref;
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilFuncSeparate,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilMask(GLuint mask);
- */
-
-typedef struct
-{
-   GLuint mask;
-
-} EVGL_API_Thread_Command_glStencilMask;
-
-void (*orig_evgl_api_glStencilMask)(GLuint mask);
-
-static void
-_evgl_api_thread_glStencilMask(void *data)
-{
-   EVGL_API_Thread_Command_glStencilMask *thread_data =
-      (EVGL_API_Thread_Command_glStencilMask *)data;
-
-   orig_evgl_api_glStencilMask(thread_data->mask);
-
-}
-
-EAPI void
-glStencilMask_evgl_api_thread_cmd(GLuint mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilMask(mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilMask thread_data_local;
-   EVGL_API_Thread_Command_glStencilMask *thread_data = &thread_data_local;
-
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilMask,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilMaskSeparate(GLenum face, GLuint mask);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLuint mask;
-
-} EVGL_API_Thread_Command_glStencilMaskSeparate;
-
-void (*orig_evgl_api_glStencilMaskSeparate)(GLenum face, GLuint mask);
-
-static void
-_evgl_api_thread_glStencilMaskSeparate(void *data)
-{
-   EVGL_API_Thread_Command_glStencilMaskSeparate *thread_data =
-      (EVGL_API_Thread_Command_glStencilMaskSeparate *)data;
-
-   orig_evgl_api_glStencilMaskSeparate(thread_data->face,
-                                       thread_data->mask);
-
-}
-
-EAPI void
-glStencilMaskSeparate_evgl_api_thread_cmd(GLenum face, GLuint mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilMaskSeparate(face, mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilMaskSeparate thread_data_local;
-   EVGL_API_Thread_Command_glStencilMaskSeparate *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilMaskSeparate,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
- */
-
-typedef struct
-{
-   GLenum fail;
-   GLenum zfail;
-   GLenum zpass;
-
-} EVGL_API_Thread_Command_glStencilOp;
-
-void (*orig_evgl_api_glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
-
-static void
-_evgl_api_thread_glStencilOp(void *data)
-{
-   EVGL_API_Thread_Command_glStencilOp *thread_data =
-      (EVGL_API_Thread_Command_glStencilOp *)data;
-
-   orig_evgl_api_glStencilOp(thread_data->fail,
-                             thread_data->zfail,
-                             thread_data->zpass);
-
-}
-
-EAPI void
-glStencilOp_evgl_api_thread_cmd(GLenum fail, GLenum zfail, GLenum zpass)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilOp(fail, zfail, zpass);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilOp thread_data_local;
-   EVGL_API_Thread_Command_glStencilOp *thread_data = &thread_data_local;
-
-   thread_data->fail = fail;
-   thread_data->zfail = zfail;
-   thread_data->zpass = zpass;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilOp,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum fail;
-   GLenum zfail;
-   GLenum zpass;
-
-} EVGL_API_Thread_Command_glStencilOpSeparate;
-
-void (*orig_evgl_api_glStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-
-static void
-_evgl_api_thread_glStencilOpSeparate(void *data)
-{
-   EVGL_API_Thread_Command_glStencilOpSeparate *thread_data =
-      (EVGL_API_Thread_Command_glStencilOpSeparate *)data;
-
-   orig_evgl_api_glStencilOpSeparate(thread_data->face,
-                                     thread_data->fail,
-                                     thread_data->zfail,
-                                     thread_data->zpass);
-
-}
-
-EAPI void
-glStencilOpSeparate_evgl_api_thread_cmd(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStencilOpSeparate(face, fail, zfail, zpass);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStencilOpSeparate thread_data_local;
-   EVGL_API_Thread_Command_glStencilOpSeparate *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->fail = fail;
-   thread_data->zfail = zfail;
-   thread_data->zpass = zpass;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStencilOpSeparate,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLenum format;
-   GLenum type;
-   const void* pixels;
-   int command_allocated;
-   GLTEXIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_API_Thread_Command_glTexImage2D;
-
-void (*orig_evgl_api_glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
-
-static void
-_evgl_api_thread_glTexImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glTexImage2D *thread_data =
-      (EVGL_API_Thread_Command_glTexImage2D *)data;
-
-   orig_evgl_api_glTexImage2D(thread_data->target,
-                              thread_data->level,
-                              thread_data->internalformat,
-                              thread_data->width,
-                              thread_data->height,
-                              thread_data->border,
-                              thread_data->format,
-                              thread_data->type,
-                              thread_data->pixels);
-
-   GLTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexImage2D thread_data_local;
-   EVGL_API_Thread_Command_glTexImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfloat param;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glTexParameterf;
-
-void (*orig_evgl_api_glTexParameterf)(GLenum target, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glTexParameterf(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterf *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterf *)data;
-
-   orig_evgl_api_glTexParameterf(thread_data->target,
-                                 thread_data->pname,
-                                 thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameterf_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterf(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterf thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterf *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexParameterf *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexParameterf));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfloat* params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glTexParameterfv;
-
-void (*orig_evgl_api_glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params);
-
-static void
-_evgl_api_thread_glTexParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterfv *)data;
-
-   orig_evgl_api_glTexParameterfv(thread_data->target,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameterfv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfloat* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterfv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterfv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexParameterfv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexParameterfv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (params)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLfloat);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLfloat *)thread_data->params_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameteri(GLenum target, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint param;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glTexParameteri;
-
-void (*orig_evgl_api_glTexParameteri)(GLenum target, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glTexParameteri(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameteri *thread_data =
-      (EVGL_API_Thread_Command_glTexParameteri *)data;
-
-   orig_evgl_api_glTexParameteri(thread_data->target,
-                                 thread_data->pname,
-                                 thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameteri_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameteri(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameteri thread_data_local;
-   EVGL_API_Thread_Command_glTexParameteri *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexParameteri *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexParameteri));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLint* params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glTexParameteriv;
-
-void (*orig_evgl_api_glTexParameteriv)(GLenum target, GLenum pname, const GLint* params);
-
-static void
-_evgl_api_thread_glTexParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glTexParameteriv *)data;
-
-   orig_evgl_api_glTexParameteriv(thread_data->target,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glTexParameteriv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexParameteriv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexParameteriv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (params)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLint);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLint *)thread_data->params_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   const void* pixels;
-   int command_allocated;
-   GLTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_API_Thread_Command_glTexSubImage2D;
-
-void (*orig_evgl_api_glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
-
-static void
-_evgl_api_thread_glTexSubImage2D(void *data)
-{
-   EVGL_API_Thread_Command_glTexSubImage2D *thread_data =
-      (EVGL_API_Thread_Command_glTexSubImage2D *)data;
-
-   orig_evgl_api_glTexSubImage2D(thread_data->target,
-                                 thread_data->level,
-                                 thread_data->xoffset,
-                                 thread_data->yoffset,
-                                 thread_data->width,
-                                 thread_data->height,
-                                 thread_data->format,
-                                 thread_data->type,
-                                 thread_data->pixels);
-
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexSubImage2D thread_data_local;
-   EVGL_API_Thread_Command_glTexSubImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexSubImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1f(GLint location, GLfloat x);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat x;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform1f;
-
-void (*orig_evgl_api_glUniform1f)(GLint location, GLfloat x);
-
-static void
-_evgl_api_thread_glUniform1f(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1f *thread_data =
-      (EVGL_API_Thread_Command_glUniform1f *)data;
-
-   orig_evgl_api_glUniform1f(thread_data->location,
-                             thread_data->x);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1f_evgl_api_thread_cmd(GLint location, GLfloat x)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1f(location, x);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1f thread_data_local;
-   EVGL_API_Thread_Command_glUniform1f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform1f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform1f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform1fv;
-
-void (*orig_evgl_api_glUniform1fv)(GLint location, GLsizei count, const GLfloat* v);
-
-static void
-_evgl_api_thread_glUniform1fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1fv *thread_data =
-      (EVGL_API_Thread_Command_glUniform1fv *)data;
-
-   orig_evgl_api_glUniform1fv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1fv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1fv thread_data_local;
-   EVGL_API_Thread_Command_glUniform1fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform1fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform1fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLfloat *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1i(GLint location, GLint x);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint x;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform1i;
-
-void (*orig_evgl_api_glUniform1i)(GLint location, GLint x);
-
-static void
-_evgl_api_thread_glUniform1i(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1i *thread_data =
-      (EVGL_API_Thread_Command_glUniform1i *)data;
-
-   orig_evgl_api_glUniform1i(thread_data->location,
-                             thread_data->x);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1i_evgl_api_thread_cmd(GLint location, GLint x)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1i(location, x);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1i thread_data_local;
-   EVGL_API_Thread_Command_glUniform1i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform1i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform1i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1iv(GLint location, GLsizei count, const GLint* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform1iv;
-
-void (*orig_evgl_api_glUniform1iv)(GLint location, GLsizei count, const GLint* v);
-
-static void
-_evgl_api_thread_glUniform1iv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1iv *thread_data =
-      (EVGL_API_Thread_Command_glUniform1iv *)data;
-
-   orig_evgl_api_glUniform1iv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1iv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1iv thread_data_local;
-   EVGL_API_Thread_Command_glUniform1iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform1iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform1iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLint *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2f(GLint location, GLfloat x, GLfloat y);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat x;
-   GLfloat y;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform2f;
-
-void (*orig_evgl_api_glUniform2f)(GLint location, GLfloat x, GLfloat y);
-
-static void
-_evgl_api_thread_glUniform2f(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2f *thread_data =
-      (EVGL_API_Thread_Command_glUniform2f *)data;
-
-   orig_evgl_api_glUniform2f(thread_data->location,
-                             thread_data->x,
-                             thread_data->y);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2f(location, x, y);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2f thread_data_local;
-   EVGL_API_Thread_Command_glUniform2f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform2f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform2f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform2fv;
-
-void (*orig_evgl_api_glUniform2fv)(GLint location, GLsizei count, const GLfloat* v);
-
-static void
-_evgl_api_thread_glUniform2fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2fv *thread_data =
-      (EVGL_API_Thread_Command_glUniform2fv *)data;
-
-   orig_evgl_api_glUniform2fv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2fv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2fv thread_data_local;
-   EVGL_API_Thread_Command_glUniform2fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLfloat *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2i(GLint location, GLint x, GLint y);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint x;
-   GLint y;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform2i;
-
-void (*orig_evgl_api_glUniform2i)(GLint location, GLint x, GLint y);
-
-static void
-_evgl_api_thread_glUniform2i(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2i *thread_data =
-      (EVGL_API_Thread_Command_glUniform2i *)data;
-
-   orig_evgl_api_glUniform2i(thread_data->location,
-                             thread_data->x,
-                             thread_data->y);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2i_evgl_api_thread_cmd(GLint location, GLint x, GLint y)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2i(location, x, y);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2i thread_data_local;
-   EVGL_API_Thread_Command_glUniform2i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform2i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform2i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2iv(GLint location, GLsizei count, const GLint* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform2iv;
-
-void (*orig_evgl_api_glUniform2iv)(GLint location, GLsizei count, const GLint* v);
-
-static void
-_evgl_api_thread_glUniform2iv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2iv *thread_data =
-      (EVGL_API_Thread_Command_glUniform2iv *)data;
-
-   orig_evgl_api_glUniform2iv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2iv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2iv thread_data_local;
-   EVGL_API_Thread_Command_glUniform2iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform2iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform2iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLint *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform3f;
-
-void (*orig_evgl_api_glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z);
-
-static void
-_evgl_api_thread_glUniform3f(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3f *thread_data =
-      (EVGL_API_Thread_Command_glUniform3f *)data;
-
-   orig_evgl_api_glUniform3f(thread_data->location,
-                             thread_data->x,
-                             thread_data->y,
-                             thread_data->z);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3f(location, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3f thread_data_local;
-   EVGL_API_Thread_Command_glUniform3f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform3f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform3f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform3fv;
-
-void (*orig_evgl_api_glUniform3fv)(GLint location, GLsizei count, const GLfloat* v);
-
-static void
-_evgl_api_thread_glUniform3fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3fv *thread_data =
-      (EVGL_API_Thread_Command_glUniform3fv *)data;
-
-   orig_evgl_api_glUniform3fv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3fv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3fv thread_data_local;
-   EVGL_API_Thread_Command_glUniform3fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLfloat *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3i(GLint location, GLint x, GLint y, GLint z);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint x;
-   GLint y;
-   GLint z;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform3i;
-
-void (*orig_evgl_api_glUniform3i)(GLint location, GLint x, GLint y, GLint z);
-
-static void
-_evgl_api_thread_glUniform3i(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3i *thread_data =
-      (EVGL_API_Thread_Command_glUniform3i *)data;
-
-   orig_evgl_api_glUniform3i(thread_data->location,
-                             thread_data->x,
-                             thread_data->y,
-                             thread_data->z);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3i_evgl_api_thread_cmd(GLint location, GLint x, GLint y, GLint z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3i(location, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3i thread_data_local;
-   EVGL_API_Thread_Command_glUniform3i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform3i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform3i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3iv(GLint location, GLsizei count, const GLint* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform3iv;
-
-void (*orig_evgl_api_glUniform3iv)(GLint location, GLsizei count, const GLint* v);
-
-static void
-_evgl_api_thread_glUniform3iv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3iv *thread_data =
-      (EVGL_API_Thread_Command_glUniform3iv *)data;
-
-   orig_evgl_api_glUniform3iv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3iv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3iv thread_data_local;
-   EVGL_API_Thread_Command_glUniform3iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform3iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform3iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLint *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-   GLfloat w;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform4f;
-
-void (*orig_evgl_api_glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-
-static void
-_evgl_api_thread_glUniform4f(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4f *thread_data =
-      (EVGL_API_Thread_Command_glUniform4f *)data;
-
-   orig_evgl_api_glUniform4f(thread_data->location,
-                             thread_data->x,
-                             thread_data->y,
-                             thread_data->z,
-                             thread_data->w);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4f(location, x, y, z, w);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4f thread_data_local;
-   EVGL_API_Thread_Command_glUniform4f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform4f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform4f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->w = w;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform4fv;
-
-void (*orig_evgl_api_glUniform4fv)(GLint location, GLsizei count, const GLfloat* v);
-
-static void
-_evgl_api_thread_glUniform4fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4fv *thread_data =
-      (EVGL_API_Thread_Command_glUniform4fv *)data;
-
-   orig_evgl_api_glUniform4fv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4fv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4fv thread_data_local;
-   EVGL_API_Thread_Command_glUniform4fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLfloat *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint x;
-   GLint y;
-   GLint z;
-   GLint w;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform4i;
-
-void (*orig_evgl_api_glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w);
-
-static void
-_evgl_api_thread_glUniform4i(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4i *thread_data =
-      (EVGL_API_Thread_Command_glUniform4i *)data;
-
-   orig_evgl_api_glUniform4i(thread_data->location,
-                             thread_data->x,
-                             thread_data->y,
-                             thread_data->z,
-                             thread_data->w);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4i_evgl_api_thread_cmd(GLint location, GLint x, GLint y, GLint z, GLint w)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4i(location, x, y, z, w);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4i thread_data_local;
-   EVGL_API_Thread_Command_glUniform4i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform4i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform4i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->w = w;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4iv(GLint location, GLsizei count, const GLint* v);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint* v;
-   void *v_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniform4iv;
-
-void (*orig_evgl_api_glUniform4iv)(GLint location, GLsizei count, const GLint* v);
-
-static void
-_evgl_api_thread_glUniform4iv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4iv *thread_data =
-      (EVGL_API_Thread_Command_glUniform4iv *)data;
-
-   orig_evgl_api_glUniform4iv(thread_data->location,
-                              thread_data->count,
-                              thread_data->v);
-
-
-   if (thread_data->v_copied)
-     eina_mempool_free(_mp_uniform, thread_data->v_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4iv(location, count, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4iv thread_data_local;
-   EVGL_API_Thread_Command_glUniform4iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniform4iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniform4iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->v = v;
-
-   thread_data->v_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (v)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->v_copied)
-          {
-             memcpy(thread_data->v_copied, v, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->v = (const GLint *)thread_data->v_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat* value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniformMatrix2fv;
-
-void (*orig_evgl_api_glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-static void
-_evgl_api_thread_glUniformMatrix2fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix2fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix2fv *)data;
-
-   orig_evgl_api_glUniformMatrix2fv(thread_data->location,
-                                    thread_data->count,
-                                    thread_data->transpose,
-                                    thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix2fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix2fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix2fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniformMatrix2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniformMatrix2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat* value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniformMatrix3fv;
-
-void (*orig_evgl_api_glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-static void
-_evgl_api_thread_glUniformMatrix3fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix3fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix3fv *)data;
-
-   orig_evgl_api_glUniformMatrix3fv(thread_data->location,
-                                    thread_data->count,
-                                    thread_data->transpose,
-                                    thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix3fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix3fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix3fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniformMatrix3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniformMatrix3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 9 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat* value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUniformMatrix4fv;
-
-void (*orig_evgl_api_glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-static void
-_evgl_api_thread_glUniformMatrix4fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix4fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix4fv *)data;
-
-   orig_evgl_api_glUniformMatrix4fv(thread_data->location,
-                                    thread_data->count,
-                                    thread_data->transpose,
-                                    thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix4fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix4fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix4fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUniformMatrix4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUniformMatrix4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 16 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUseProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glUseProgram;
-
-void (*orig_evgl_api_glUseProgram)(GLuint program);
-
-static void
-_evgl_api_thread_glUseProgram(void *data)
-{
-   EVGL_API_Thread_Command_glUseProgram *thread_data =
-      (EVGL_API_Thread_Command_glUseProgram *)data;
-
-   orig_evgl_api_glUseProgram(thread_data->program);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUseProgram_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUseProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUseProgram thread_data_local;
-   EVGL_API_Thread_Command_glUseProgram *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glUseProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glUseProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUseProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glValidateProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-
-} EVGL_API_Thread_Command_glValidateProgram;
-
-void (*orig_evgl_api_glValidateProgram)(GLuint program);
-
-static void
-_evgl_api_thread_glValidateProgram(void *data)
-{
-   EVGL_API_Thread_Command_glValidateProgram *thread_data =
-      (EVGL_API_Thread_Command_glValidateProgram *)data;
-
-   orig_evgl_api_glValidateProgram(thread_data->program);
-
-}
-
-EAPI void
-glValidateProgram_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glValidateProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glValidateProgram thread_data_local;
-   EVGL_API_Thread_Command_glValidateProgram *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glValidateProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib1f(GLuint indx, GLfloat x);
- */
-
-typedef struct
-{
-   GLuint indx;
-   GLfloat x;
-
-} EVGL_API_Thread_Command_glVertexAttrib1f;
-
-void (*orig_evgl_api_glVertexAttrib1f)(GLuint indx, GLfloat x);
-
-static void
-_evgl_api_thread_glVertexAttrib1f(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib1f *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib1f *)data;
-
-   orig_evgl_api_glVertexAttrib1f(thread_data->indx,
-                                  thread_data->x);
-
-}
-
-EAPI void
-glVertexAttrib1f_evgl_api_thread_cmd(GLuint indx, GLfloat x)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib1f(indx, x);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib1f thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib1f *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->x = x;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib1f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib1fv(GLuint indx, const GLfloat* values);
- */
-
-typedef struct
-{
-   GLuint indx;
-   const GLfloat* values;
-
-} EVGL_API_Thread_Command_glVertexAttrib1fv;
-
-void (*orig_evgl_api_glVertexAttrib1fv)(GLuint indx, const GLfloat* values);
-
-static void
-_evgl_api_thread_glVertexAttrib1fv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib1fv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib1fv *)data;
-
-   orig_evgl_api_glVertexAttrib1fv(thread_data->indx,
-                                   thread_data->values);
-
-}
-
-EAPI void
-glVertexAttrib1fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib1fv(indx, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib1fv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib1fv *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib1fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
- */
-
-typedef struct
-{
-   GLuint indx;
-   GLfloat x;
-   GLfloat y;
-
-} EVGL_API_Thread_Command_glVertexAttrib2f;
-
-void (*orig_evgl_api_glVertexAttrib2f)(GLuint indx, GLfloat x, GLfloat y);
-
-static void
-_evgl_api_thread_glVertexAttrib2f(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib2f *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib2f *)data;
-
-   orig_evgl_api_glVertexAttrib2f(thread_data->indx,
-                                  thread_data->x,
-                                  thread_data->y);
-
-}
-
-EAPI void
-glVertexAttrib2f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib2f(indx, x, y);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib2f thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib2f *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->x = x;
-   thread_data->y = y;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib2f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib2fv(GLuint indx, const GLfloat* values);
- */
-
-typedef struct
-{
-   GLuint indx;
-   const GLfloat* values;
-
-} EVGL_API_Thread_Command_glVertexAttrib2fv;
-
-void (*orig_evgl_api_glVertexAttrib2fv)(GLuint indx, const GLfloat* values);
-
-static void
-_evgl_api_thread_glVertexAttrib2fv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib2fv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib2fv *)data;
-
-   orig_evgl_api_glVertexAttrib2fv(thread_data->indx,
-                                   thread_data->values);
-
-}
-
-EAPI void
-glVertexAttrib2fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib2fv(indx, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib2fv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib2fv *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
- */
-
-typedef struct
-{
-   GLuint indx;
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-
-} EVGL_API_Thread_Command_glVertexAttrib3f;
-
-void (*orig_evgl_api_glVertexAttrib3f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-
-static void
-_evgl_api_thread_glVertexAttrib3f(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib3f *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib3f *)data;
-
-   orig_evgl_api_glVertexAttrib3f(thread_data->indx,
-                                  thread_data->x,
-                                  thread_data->y,
-                                  thread_data->z);
-
-}
-
-EAPI void
-glVertexAttrib3f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib3f(indx, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib3f thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib3f *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib3f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib3fv(GLuint indx, const GLfloat* values);
- */
-
-typedef struct
-{
-   GLuint indx;
-   const GLfloat* values;
-
-} EVGL_API_Thread_Command_glVertexAttrib3fv;
-
-void (*orig_evgl_api_glVertexAttrib3fv)(GLuint indx, const GLfloat* values);
-
-static void
-_evgl_api_thread_glVertexAttrib3fv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib3fv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib3fv *)data;
-
-   orig_evgl_api_glVertexAttrib3fv(thread_data->indx,
-                                   thread_data->values);
-
-}
-
-EAPI void
-glVertexAttrib3fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib3fv(indx, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib3fv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib3fv *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
- */
-
-typedef struct
-{
-   GLuint indx;
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-   GLfloat w;
-
-} EVGL_API_Thread_Command_glVertexAttrib4f;
-
-void (*orig_evgl_api_glVertexAttrib4f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-
-static void
-_evgl_api_thread_glVertexAttrib4f(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib4f *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib4f *)data;
-
-   orig_evgl_api_glVertexAttrib4f(thread_data->indx,
-                                  thread_data->x,
-                                  thread_data->y,
-                                  thread_data->z,
-                                  thread_data->w);
-
-}
-
-EAPI void
-glVertexAttrib4f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib4f(indx, x, y, z, w);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib4f thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib4f *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->w = w;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttrib4fv(GLuint indx, const GLfloat* values);
- */
-
-typedef struct
-{
-   GLuint indx;
-   const GLfloat* values;
-
-} EVGL_API_Thread_Command_glVertexAttrib4fv;
-
-void (*orig_evgl_api_glVertexAttrib4fv)(GLuint indx, const GLfloat* values);
-
-static void
-_evgl_api_thread_glVertexAttrib4fv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttrib4fv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttrib4fv *)data;
-
-   orig_evgl_api_glVertexAttrib4fv(thread_data->indx,
-                                   thread_data->values);
-
-}
-
-EAPI void
-glVertexAttrib4fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttrib4fv(indx, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttrib4fv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttrib4fv *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttrib4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
- */
-
-typedef struct
-{
-   GLuint indx;
-   GLint size;
-   GLenum type;
-   GLboolean normalized;
-   GLsizei stride;
-   const void* ptr;
-
-} EVGL_API_Thread_Command_glVertexAttribPointer;
-
-void (*orig_evgl_api_glVertexAttribPointer)(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
-
-static void
-_evgl_api_thread_glVertexAttribPointer(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribPointer *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribPointer *)data;
-
-   orig_evgl_api_glVertexAttribPointer(thread_data->indx,
-                                       thread_data->size,
-                                       thread_data->type,
-                                       thread_data->normalized,
-                                       thread_data->stride,
-                                       thread_data->ptr);
-
-}
-
-EAPI void
-glVertexAttribPointer_evgl_api_thread_cmd(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribPointer thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribPointer *thread_data = &thread_data_local;
-
-   thread_data->indx = indx;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->normalized = normalized;
-   thread_data->stride = stride;
-   thread_data->ptr = ptr;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glViewport;
-
-void (*orig_evgl_api_glViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glViewport(void *data)
-{
-   EVGL_API_Thread_Command_glViewport *thread_data =
-      (EVGL_API_Thread_Command_glViewport *)data;
-
-   orig_evgl_api_glViewport(thread_data->x,
-                            thread_data->y,
-                            thread_data->width,
-                            thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glViewport_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glViewport(x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glViewport thread_data_local;
-   EVGL_API_Thread_Command_glViewport *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glViewport *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glViewport));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glViewport,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEvasGLImageTargetTexture2DOES(GLenum target, EvasGLImage image);
- */
-
-typedef struct
-{
-   GLenum target;
-   EvasGLImage image;
-
-} EVGL_API_Thread_Command_glEvasGLImageTargetTexture2DOES;
-
-void (*orig_evgl_api_glEvasGLImageTargetTexture2DOES)(GLenum target, EvasGLImage image);
-
-static void
-_evgl_api_thread_glEvasGLImageTargetTexture2DOES(void *data)
-{
-   EVGL_API_Thread_Command_glEvasGLImageTargetTexture2DOES *thread_data =
-      (EVGL_API_Thread_Command_glEvasGLImageTargetTexture2DOES *)data;
-
-   orig_evgl_api_glEvasGLImageTargetTexture2DOES(thread_data->target,
-                                                 thread_data->image);
-
-}
-
-EAPI void
-glEvasGLImageTargetTexture2DOES_evgl_api_thread_cmd(GLenum target, EvasGLImage image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEvasGLImageTargetTexture2DOES(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEvasGLImageTargetTexture2DOES thread_data_local;
-   EVGL_API_Thread_Command_glEvasGLImageTargetTexture2DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEvasGLImageTargetTexture2DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEvasGLImageTargetRenderbufferStorageOES(GLenum target, EvasGLImage image);
- */
-
-typedef struct
-{
-   GLenum target;
-   EvasGLImage image;
-
-} EVGL_API_Thread_Command_glEvasGLImageTargetRenderbufferStorageOES;
-
-void (*orig_evgl_api_glEvasGLImageTargetRenderbufferStorageOES)(GLenum target, EvasGLImage image);
-
-static void
-_evgl_api_thread_glEvasGLImageTargetRenderbufferStorageOES(void *data)
-{
-   EVGL_API_Thread_Command_glEvasGLImageTargetRenderbufferStorageOES *thread_data =
-      (EVGL_API_Thread_Command_glEvasGLImageTargetRenderbufferStorageOES *)data;
-
-   orig_evgl_api_glEvasGLImageTargetRenderbufferStorageOES(thread_data->target,
-                                                           thread_data->image);
-
-}
-
-EAPI void
-glEvasGLImageTargetRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, EvasGLImage image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEvasGLImageTargetRenderbufferStorageOES(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEvasGLImageTargetRenderbufferStorageOES thread_data_local;
-   EVGL_API_Thread_Command_glEvasGLImageTargetRenderbufferStorageOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEvasGLImageTargetRenderbufferStorageOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLenum *binaryFormat;
-   void *binary;
-
-} EVGL_API_Thread_Command_glGetProgramBinaryOES;
-
-void (*orig_evgl_api_glGetProgramBinaryOES)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-static void
-_evgl_api_thread_glGetProgramBinaryOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramBinaryOES *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramBinaryOES *)data;
-
-   orig_evgl_api_glGetProgramBinaryOES(thread_data->program,
-                                       thread_data->bufSize,
-                                       thread_data->length,
-                                       thread_data->binaryFormat,
-                                       thread_data->binary);
-
-}
-
-EAPI void
-glGetProgramBinaryOES_evgl_api_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramBinaryOES thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramBinaryOES *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramBinaryOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramBinaryOES(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum binaryFormat;
-   const void *binary;
-   GLint length;
-   void *binary_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glProgramBinaryOES;
-
-void (*orig_evgl_api_glProgramBinaryOES)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-
-static void
-_evgl_api_thread_glProgramBinaryOES(void *data)
-{
-   EVGL_API_Thread_Command_glProgramBinaryOES *thread_data =
-      (EVGL_API_Thread_Command_glProgramBinaryOES *)data;
-
-   orig_evgl_api_glProgramBinaryOES(thread_data->program,
-                                    thread_data->binaryFormat,
-                                    thread_data->binary,
-                                    thread_data->length);
-
-
-   if (thread_data->binary_copied)
-     eina_mempool_free(_mp_default, thread_data->binary_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glProgramBinaryOES_evgl_api_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramBinaryOES(program, binaryFormat, binary, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramBinaryOES thread_data_local;
-   EVGL_API_Thread_Command_glProgramBinaryOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glProgramBinaryOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glProgramBinaryOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-   thread_data->length = length;
-
-   thread_data->binary_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (binary)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = length;
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->binary_copied)
-          {
-             memcpy(thread_data->binary_copied, binary, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->binary = (const void  *)thread_data->binary_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramBinaryOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void *
- * glMapBufferOES(GLenum target, GLenum access);
- */
-
-typedef struct
-{
-   void * return_value;
-   GLenum target;
-   GLenum access;
-
-} EVGL_API_Thread_Command_glMapBufferOES;
-
-void * (*orig_evgl_api_glMapBufferOES)(GLenum target, GLenum access);
-
-static void
-_evgl_api_thread_glMapBufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glMapBufferOES *thread_data =
-      (EVGL_API_Thread_Command_glMapBufferOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glMapBufferOES(thread_data->target,
-                                                            thread_data->access);
-
-}
-
-EAPI void *
-glMapBufferOES_evgl_api_thread_cmd(GLenum target, GLenum access)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glMapBufferOES(target, access);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMapBufferOES thread_data_local;
-   EVGL_API_Thread_Command_glMapBufferOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->access = access;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMapBufferOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glUnmapBufferOES(GLenum target);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLenum target;
-
-} EVGL_API_Thread_Command_glUnmapBufferOES;
-
-GLboolean (*orig_evgl_api_glUnmapBufferOES)(GLenum target);
-
-static void
-_evgl_api_thread_glUnmapBufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glUnmapBufferOES *thread_data =
-      (EVGL_API_Thread_Command_glUnmapBufferOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glUnmapBufferOES(thread_data->target);
-
-}
-
-EAPI GLboolean
-glUnmapBufferOES_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glUnmapBufferOES(target);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUnmapBufferOES thread_data_local;
-   EVGL_API_Thread_Command_glUnmapBufferOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUnmapBufferOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetBufferPointervOES(GLenum target, GLenum pname, void** params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   void** params;
-
-} EVGL_API_Thread_Command_glGetBufferPointervOES;
-
-void (*orig_evgl_api_glGetBufferPointervOES)(GLenum target, GLenum pname, void** params);
-
-static void
-_evgl_api_thread_glGetBufferPointervOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetBufferPointervOES *thread_data =
-      (EVGL_API_Thread_Command_glGetBufferPointervOES *)data;
-
-   orig_evgl_api_glGetBufferPointervOES(thread_data->target,
-                                        thread_data->pname,
-                                        thread_data->params);
-
-}
-
-EAPI void
-glGetBufferPointervOES_evgl_api_thread_cmd(GLenum target, GLenum pname, void** params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBufferPointervOES(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBufferPointervOES thread_data_local;
-   EVGL_API_Thread_Command_glGetBufferPointervOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBufferPointervOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLint border;
-   GLenum format;
-   GLenum type;
-   const void* pixels;
-
-} EVGL_API_Thread_Command_glTexImage3DOES;
-
-void (*orig_evgl_api_glTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
-
-static void
-_evgl_api_thread_glTexImage3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexImage3DOES *thread_data =
-      (EVGL_API_Thread_Command_glTexImage3DOES *)data;
-
-   orig_evgl_api_glTexImage3DOES(thread_data->target,
-                                 thread_data->level,
-                                 thread_data->internalformat,
-                                 thread_data->width,
-                                 thread_data->height,
-                                 thread_data->depth,
-                                 thread_data->border,
-                                 thread_data->format,
-                                 thread_data->type,
-                                 thread_data->pixels);
-
-}
-
-EAPI void
-glTexImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexImage3DOES thread_data_local;
-   EVGL_API_Thread_Command_glTexImage3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexImage3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLenum format;
-   GLenum type;
-   const void* pixels;
-
-} EVGL_API_Thread_Command_glTexSubImage3DOES;
-
-void (*orig_evgl_api_glTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
-
-static void
-_evgl_api_thread_glTexSubImage3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexSubImage3DOES *thread_data =
-      (EVGL_API_Thread_Command_glTexSubImage3DOES *)data;
-
-   orig_evgl_api_glTexSubImage3DOES(thread_data->target,
-                                    thread_data->level,
-                                    thread_data->xoffset,
-                                    thread_data->yoffset,
-                                    thread_data->zoffset,
-                                    thread_data->width,
-                                    thread_data->height,
-                                    thread_data->depth,
-                                    thread_data->format,
-                                    thread_data->type,
-                                    thread_data->pixels);
-
-}
-
-EAPI void
-glTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexSubImage3DOES thread_data_local;
-   EVGL_API_Thread_Command_glTexSubImage3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexSubImage3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glCopyTexSubImage3DOES;
-
-void (*orig_evgl_api_glCopyTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glCopyTexSubImage3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glCopyTexSubImage3DOES *thread_data =
-      (EVGL_API_Thread_Command_glCopyTexSubImage3DOES *)data;
-
-   orig_evgl_api_glCopyTexSubImage3DOES(thread_data->target,
-                                        thread_data->level,
-                                        thread_data->xoffset,
-                                        thread_data->yoffset,
-                                        thread_data->zoffset,
-                                        thread_data->x,
-                                        thread_data->y,
-                                        thread_data->width,
-                                        thread_data->height);
-
-}
-
-EAPI void
-glCopyTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyTexSubImage3DOES thread_data_local;
-   EVGL_API_Thread_Command_glCopyTexSubImage3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyTexSubImage3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLint border;
-   GLsizei imageSize;
-   const void* data;
-
-} EVGL_API_Thread_Command_glCompressedTexImage3DOES;
-
-void (*orig_evgl_api_glCompressedTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
-
-static void
-_evgl_api_thread_glCompressedTexImage3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexImage3DOES *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexImage3DOES *)data;
-
-   orig_evgl_api_glCompressedTexImage3DOES(thread_data->target,
-                                           thread_data->level,
-                                           thread_data->internalformat,
-                                           thread_data->width,
-                                           thread_data->height,
-                                           thread_data->depth,
-                                           thread_data->border,
-                                           thread_data->imageSize,
-                                           thread_data->data);
-
-}
-
-EAPI void
-glCompressedTexImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexImage3DOES thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexImage3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->border = border;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexImage3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLenum format;
-   GLsizei imageSize;
-   const void* data;
-
-} EVGL_API_Thread_Command_glCompressedTexSubImage3DOES;
-
-void (*orig_evgl_api_glCompressedTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
-
-static void
-_evgl_api_thread_glCompressedTexSubImage3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexSubImage3DOES *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexSubImage3DOES *)data;
-
-   orig_evgl_api_glCompressedTexSubImage3DOES(thread_data->target,
-                                              thread_data->level,
-                                              thread_data->xoffset,
-                                              thread_data->yoffset,
-                                              thread_data->zoffset,
-                                              thread_data->width,
-                                              thread_data->height,
-                                              thread_data->depth,
-                                              thread_data->format,
-                                              thread_data->imageSize,
-                                              thread_data->data);
-
-}
-
-EAPI void
-glCompressedTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexSubImage3DOES thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexSubImage3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->format = format;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexSubImage3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum textarget;
-   GLuint texture;
-   GLint level;
-   GLint zoffset;
-
-} EVGL_API_Thread_Command_glFramebufferTexture3DOES;
-
-void (*orig_evgl_api_glFramebufferTexture3DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-
-static void
-_evgl_api_thread_glFramebufferTexture3DOES(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture3DOES *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture3DOES *)data;
-
-   orig_evgl_api_glFramebufferTexture3DOES(thread_data->target,
-                                           thread_data->attachment,
-                                           thread_data->textarget,
-                                           thread_data->texture,
-                                           thread_data->level,
-                                           thread_data->zoffset);
-
-}
-
-EAPI void
-glFramebufferTexture3DOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture3DOES thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture3DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
-   thread_data->texture = texture;
-   thread_data->level = level;
-   thread_data->zoffset = zoffset;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture3DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
- */
-
-typedef struct
-{
-   GLint* numGroups;
-   GLsizei groupsSize;
-   GLuint* groups;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorGroupsAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorGroupsAMD)(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
-
-static void
-_evgl_api_thread_glGetPerfMonitorGroupsAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupsAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorGroupsAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorGroupsAMD(thread_data->numGroups,
-                                           thread_data->groupsSize,
-                                           thread_data->groups);
-
-}
-
-EAPI void
-glGetPerfMonitorGroupsAMD_evgl_api_thread_cmd(GLint* numGroups, GLsizei groupsSize, GLuint* groups)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupsAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupsAMD *thread_data = &thread_data_local;
-
-   thread_data->numGroups = numGroups;
-   thread_data->groupsSize = groupsSize;
-   thread_data->groups = groups;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorGroupsAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
- */
-
-typedef struct
-{
-   GLuint group;
-   GLint* numCounters;
-   GLint* maxActiveCounters;
-   GLsizei counterSize;
-   GLuint* counters;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorCountersAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorCountersAMD)(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
-
-static void
-_evgl_api_thread_glGetPerfMonitorCountersAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorCountersAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorCountersAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorCountersAMD(thread_data->group,
-                                             thread_data->numCounters,
-                                             thread_data->maxActiveCounters,
-                                             thread_data->counterSize,
-                                             thread_data->counters);
-
-}
-
-EAPI void
-glGetPerfMonitorCountersAMD_evgl_api_thread_cmd(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorCountersAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorCountersAMD *thread_data = &thread_data_local;
-
-   thread_data->group = group;
-   thread_data->numCounters = numCounters;
-   thread_data->maxActiveCounters = maxActiveCounters;
-   thread_data->counterSize = counterSize;
-   thread_data->counters = counters;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorCountersAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
- */
-
-typedef struct
-{
-   GLuint group;
-   GLsizei bufSize;
-   GLsizei* length;
-   char* groupString;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorGroupStringAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorGroupStringAMD)(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
-
-static void
-_evgl_api_thread_glGetPerfMonitorGroupStringAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupStringAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorGroupStringAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorGroupStringAMD(thread_data->group,
-                                                thread_data->bufSize,
-                                                thread_data->length,
-                                                thread_data->groupString);
-
-}
-
-EAPI void
-glGetPerfMonitorGroupStringAMD_evgl_api_thread_cmd(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupStringAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorGroupStringAMD *thread_data = &thread_data_local;
-
-   thread_data->group = group;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->groupString = groupString;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorGroupStringAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
- */
-
-typedef struct
-{
-   GLuint group;
-   GLuint counter;
-   GLsizei bufSize;
-   GLsizei* length;
-   char* counterString;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorCounterStringAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorCounterStringAMD)(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
-
-static void
-_evgl_api_thread_glGetPerfMonitorCounterStringAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterStringAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorCounterStringAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorCounterStringAMD(thread_data->group,
-                                                  thread_data->counter,
-                                                  thread_data->bufSize,
-                                                  thread_data->length,
-                                                  thread_data->counterString);
-
-}
-
-EAPI void
-glGetPerfMonitorCounterStringAMD_evgl_api_thread_cmd(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterStringAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterStringAMD *thread_data = &thread_data_local;
-
-   thread_data->group = group;
-   thread_data->counter = counter;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->counterString = counterString;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorCounterStringAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data);
- */
-
-typedef struct
-{
-   GLuint group;
-   GLuint counter;
-   GLenum pname;
-   void* data;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorCounterInfoAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorCounterInfoAMD)(GLuint group, GLuint counter, GLenum pname, void* data);
-
-static void
-_evgl_api_thread_glGetPerfMonitorCounterInfoAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterInfoAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorCounterInfoAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorCounterInfoAMD(thread_data->group,
-                                                thread_data->counter,
-                                                thread_data->pname,
-                                                thread_data->data);
-
-}
-
-EAPI void
-glGetPerfMonitorCounterInfoAMD_evgl_api_thread_cmd(GLuint group, GLuint counter, GLenum pname, void* data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorCounterInfoAMD(group, counter, pname, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterInfoAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterInfoAMD *thread_data = &thread_data_local;
-
-   thread_data->group = group;
-   thread_data->counter = counter;
-   thread_data->pname = pname;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorCounterInfoAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* monitors;
-
-} EVGL_API_Thread_Command_glGenPerfMonitorsAMD;
-
-void (*orig_evgl_api_glGenPerfMonitorsAMD)(GLsizei n, GLuint* monitors);
-
-static void
-_evgl_api_thread_glGenPerfMonitorsAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGenPerfMonitorsAMD *thread_data =
-      (EVGL_API_Thread_Command_glGenPerfMonitorsAMD *)data;
-
-   orig_evgl_api_glGenPerfMonitorsAMD(thread_data->n,
-                                      thread_data->monitors);
-
-}
-
-EAPI void
-glGenPerfMonitorsAMD_evgl_api_thread_cmd(GLsizei n, GLuint* monitors)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenPerfMonitorsAMD(n, monitors);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenPerfMonitorsAMD thread_data_local;
-   EVGL_API_Thread_Command_glGenPerfMonitorsAMD *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->monitors = monitors;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenPerfMonitorsAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* monitors;
-
-} EVGL_API_Thread_Command_glDeletePerfMonitorsAMD;
-
-void (*orig_evgl_api_glDeletePerfMonitorsAMD)(GLsizei n, GLuint* monitors);
-
-static void
-_evgl_api_thread_glDeletePerfMonitorsAMD(void *data)
-{
-   EVGL_API_Thread_Command_glDeletePerfMonitorsAMD *thread_data =
-      (EVGL_API_Thread_Command_glDeletePerfMonitorsAMD *)data;
-
-   orig_evgl_api_glDeletePerfMonitorsAMD(thread_data->n,
-                                         thread_data->monitors);
-
-}
-
-EAPI void
-glDeletePerfMonitorsAMD_evgl_api_thread_cmd(GLsizei n, GLuint* monitors)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeletePerfMonitorsAMD(n, monitors);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeletePerfMonitorsAMD thread_data_local;
-   EVGL_API_Thread_Command_glDeletePerfMonitorsAMD *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->monitors = monitors;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeletePerfMonitorsAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
- */
-
-typedef struct
-{
-   GLuint monitor;
-   GLboolean enable;
-   GLuint group;
-   GLint numCounters;
-   GLuint* countersList;
-
-} EVGL_API_Thread_Command_glSelectPerfMonitorCountersAMD;
-
-void (*orig_evgl_api_glSelectPerfMonitorCountersAMD)(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
-
-static void
-_evgl_api_thread_glSelectPerfMonitorCountersAMD(void *data)
-{
-   EVGL_API_Thread_Command_glSelectPerfMonitorCountersAMD *thread_data =
-      (EVGL_API_Thread_Command_glSelectPerfMonitorCountersAMD *)data;
-
-   orig_evgl_api_glSelectPerfMonitorCountersAMD(thread_data->monitor,
-                                                thread_data->enable,
-                                                thread_data->group,
-                                                thread_data->numCounters,
-                                                thread_data->countersList);
-
-}
-
-EAPI void
-glSelectPerfMonitorCountersAMD_evgl_api_thread_cmd(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, countersList);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSelectPerfMonitorCountersAMD thread_data_local;
-   EVGL_API_Thread_Command_glSelectPerfMonitorCountersAMD *thread_data = &thread_data_local;
-
-   thread_data->monitor = monitor;
-   thread_data->enable = enable;
-   thread_data->group = group;
-   thread_data->numCounters = numCounters;
-   thread_data->countersList = countersList;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSelectPerfMonitorCountersAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBeginPerfMonitorAMD(GLuint monitor);
- */
-
-typedef struct
-{
-   GLuint monitor;
-
-} EVGL_API_Thread_Command_glBeginPerfMonitorAMD;
-
-void (*orig_evgl_api_glBeginPerfMonitorAMD)(GLuint monitor);
-
-static void
-_evgl_api_thread_glBeginPerfMonitorAMD(void *data)
-{
-   EVGL_API_Thread_Command_glBeginPerfMonitorAMD *thread_data =
-      (EVGL_API_Thread_Command_glBeginPerfMonitorAMD *)data;
-
-   orig_evgl_api_glBeginPerfMonitorAMD(thread_data->monitor);
-
-}
-
-EAPI void
-glBeginPerfMonitorAMD_evgl_api_thread_cmd(GLuint monitor)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBeginPerfMonitorAMD(monitor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBeginPerfMonitorAMD thread_data_local;
-   EVGL_API_Thread_Command_glBeginPerfMonitorAMD *thread_data = &thread_data_local;
-
-   thread_data->monitor = monitor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBeginPerfMonitorAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEndPerfMonitorAMD(GLuint monitor);
- */
-
-typedef struct
-{
-   GLuint monitor;
-
-} EVGL_API_Thread_Command_glEndPerfMonitorAMD;
-
-void (*orig_evgl_api_glEndPerfMonitorAMD)(GLuint monitor);
-
-static void
-_evgl_api_thread_glEndPerfMonitorAMD(void *data)
-{
-   EVGL_API_Thread_Command_glEndPerfMonitorAMD *thread_data =
-      (EVGL_API_Thread_Command_glEndPerfMonitorAMD *)data;
-
-   orig_evgl_api_glEndPerfMonitorAMD(thread_data->monitor);
-
-}
-
-EAPI void
-glEndPerfMonitorAMD_evgl_api_thread_cmd(GLuint monitor)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEndPerfMonitorAMD(monitor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEndPerfMonitorAMD thread_data_local;
-   EVGL_API_Thread_Command_glEndPerfMonitorAMD *thread_data = &thread_data_local;
-
-   thread_data->monitor = monitor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEndPerfMonitorAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
- */
-
-typedef struct
-{
-   GLuint monitor;
-   GLenum pname;
-   GLsizei dataSize;
-   GLuint* data;
-   GLint* bytesWritten;
-
-} EVGL_API_Thread_Command_glGetPerfMonitorCounterDataAMD;
-
-void (*orig_evgl_api_glGetPerfMonitorCounterDataAMD)(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
-
-static void
-_evgl_api_thread_glGetPerfMonitorCounterDataAMD(void *data)
-{
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterDataAMD *thread_data =
-      (EVGL_API_Thread_Command_glGetPerfMonitorCounterDataAMD *)data;
-
-   orig_evgl_api_glGetPerfMonitorCounterDataAMD(thread_data->monitor,
-                                                thread_data->pname,
-                                                thread_data->dataSize,
-                                                thread_data->data,
-                                                thread_data->bytesWritten);
-
-}
-
-EAPI void
-glGetPerfMonitorCounterDataAMD_evgl_api_thread_cmd(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterDataAMD thread_data_local;
-   EVGL_API_Thread_Command_glGetPerfMonitorCounterDataAMD *thread_data = &thread_data_local;
-
-   thread_data->monitor = monitor;
-   thread_data->pname = pname;
-   thread_data->dataSize = dataSize;
-   thread_data->data = data;
-   thread_data->bytesWritten = bytesWritten;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPerfMonitorCounterDataAMD,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDiscardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei numAttachments;
-   const GLenum* attachments;
-
-} EVGL_API_Thread_Command_glDiscardFramebuffer;
-
-void (*orig_evgl_api_glDiscardFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-static void
-_evgl_api_thread_glDiscardFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glDiscardFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glDiscardFramebuffer *)data;
-
-   orig_evgl_api_glDiscardFramebuffer(thread_data->target,
-                                      thread_data->numAttachments,
-                                      thread_data->attachments);
-
-}
-
-EAPI void
-glDiscardFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDiscardFramebuffer(target, numAttachments, attachments);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDiscardFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glDiscardFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->numAttachments = numAttachments;
-   thread_data->attachments = attachments;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDiscardFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei numAttachments;
-   const GLenum* attachments;
-
-} EVGL_API_Thread_Command_glDiscardFramebufferEXT;
-
-void (*orig_evgl_api_glDiscardFramebufferEXT)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-static void
-_evgl_api_thread_glDiscardFramebufferEXT(void *data)
-{
-   EVGL_API_Thread_Command_glDiscardFramebufferEXT *thread_data =
-      (EVGL_API_Thread_Command_glDiscardFramebufferEXT *)data;
-
-   orig_evgl_api_glDiscardFramebufferEXT(thread_data->target,
-                                         thread_data->numAttachments,
-                                         thread_data->attachments);
-
-}
-
-EAPI void
-glDiscardFramebufferEXT_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDiscardFramebufferEXT(target, numAttachments, attachments);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDiscardFramebufferEXT thread_data_local;
-   EVGL_API_Thread_Command_glDiscardFramebufferEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->numAttachments = numAttachments;
-   thread_data->attachments = attachments;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDiscardFramebufferEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiDrawArrays(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLint* first;
-   GLsizei* count;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glMultiDrawArrays;
-
-void (*orig_evgl_api_glMultiDrawArrays)(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-
-static void
-_evgl_api_thread_glMultiDrawArrays(void *data)
-{
-   EVGL_API_Thread_Command_glMultiDrawArrays *thread_data =
-      (EVGL_API_Thread_Command_glMultiDrawArrays *)data;
-
-   orig_evgl_api_glMultiDrawArrays(thread_data->mode,
-                                   thread_data->first,
-                                   thread_data->count,
-                                   thread_data->primcount);
-
-}
-
-EAPI void
-glMultiDrawArrays_evgl_api_thread_cmd(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiDrawArrays(mode, first, count, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiDrawArrays thread_data_local;
-   EVGL_API_Thread_Command_glMultiDrawArrays *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiDrawArrays,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiDrawArraysEXT(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLint* first;
-   GLsizei* count;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glMultiDrawArraysEXT;
-
-void (*orig_evgl_api_glMultiDrawArraysEXT)(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-
-static void
-_evgl_api_thread_glMultiDrawArraysEXT(void *data)
-{
-   EVGL_API_Thread_Command_glMultiDrawArraysEXT *thread_data =
-      (EVGL_API_Thread_Command_glMultiDrawArraysEXT *)data;
-
-   orig_evgl_api_glMultiDrawArraysEXT(thread_data->mode,
-                                      thread_data->first,
-                                      thread_data->count,
-                                      thread_data->primcount);
-
-}
-
-EAPI void
-glMultiDrawArraysEXT_evgl_api_thread_cmd(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiDrawArraysEXT(mode, first, count, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiDrawArraysEXT thread_data_local;
-   EVGL_API_Thread_Command_glMultiDrawArraysEXT *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiDrawArraysEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   const GLsizei* count;
-   GLenum type;
-   const GLvoid** indices;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glMultiDrawElements;
-
-void (*orig_evgl_api_glMultiDrawElements)(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-
-static void
-_evgl_api_thread_glMultiDrawElements(void *data)
-{
-   EVGL_API_Thread_Command_glMultiDrawElements *thread_data =
-      (EVGL_API_Thread_Command_glMultiDrawElements *)data;
-
-   orig_evgl_api_glMultiDrawElements(thread_data->mode,
-                                     thread_data->count,
-                                     thread_data->type,
-                                     thread_data->indices,
-                                     thread_data->primcount);
-
-}
-
-EAPI void
-glMultiDrawElements_evgl_api_thread_cmd(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiDrawElements(mode, count, type, indices, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiDrawElements thread_data_local;
-   EVGL_API_Thread_Command_glMultiDrawElements *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiDrawElements,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiDrawElementsEXT(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   const GLsizei* count;
-   GLenum type;
-   const GLvoid** indices;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glMultiDrawElementsEXT;
-
-void (*orig_evgl_api_glMultiDrawElementsEXT)(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-
-static void
-_evgl_api_thread_glMultiDrawElementsEXT(void *data)
-{
-   EVGL_API_Thread_Command_glMultiDrawElementsEXT *thread_data =
-      (EVGL_API_Thread_Command_glMultiDrawElementsEXT *)data;
-
-   orig_evgl_api_glMultiDrawElementsEXT(thread_data->mode,
-                                        thread_data->count,
-                                        thread_data->type,
-                                        thread_data->indices,
-                                        thread_data->primcount);
-
-}
-
-EAPI void
-glMultiDrawElementsEXT_evgl_api_thread_cmd(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiDrawElementsEXT(mode, count, type, indices, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiDrawElementsEXT thread_data_local;
-   EVGL_API_Thread_Command_glMultiDrawElementsEXT *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiDrawElementsEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteFencesNV(GLsizei n, const GLuint* fences);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* fences;
-
-} EVGL_API_Thread_Command_glDeleteFencesNV;
-
-void (*orig_evgl_api_glDeleteFencesNV)(GLsizei n, const GLuint* fences);
-
-static void
-_evgl_api_thread_glDeleteFencesNV(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteFencesNV *thread_data =
-      (EVGL_API_Thread_Command_glDeleteFencesNV *)data;
-
-   orig_evgl_api_glDeleteFencesNV(thread_data->n,
-                                  thread_data->fences);
-
-}
-
-EAPI void
-glDeleteFencesNV_evgl_api_thread_cmd(GLsizei n, const GLuint* fences)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteFencesNV(n, fences);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteFencesNV thread_data_local;
-   EVGL_API_Thread_Command_glDeleteFencesNV *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->fences = fences;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteFencesNV,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenFencesNV(GLsizei n, GLuint* fences);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* fences;
-
-} EVGL_API_Thread_Command_glGenFencesNV;
-
-void (*orig_evgl_api_glGenFencesNV)(GLsizei n, GLuint* fences);
-
-static void
-_evgl_api_thread_glGenFencesNV(void *data)
-{
-   EVGL_API_Thread_Command_glGenFencesNV *thread_data =
-      (EVGL_API_Thread_Command_glGenFencesNV *)data;
-
-   orig_evgl_api_glGenFencesNV(thread_data->n,
-                               thread_data->fences);
-
-}
-
-EAPI void
-glGenFencesNV_evgl_api_thread_cmd(GLsizei n, GLuint* fences)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenFencesNV(n, fences);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenFencesNV thread_data_local;
-   EVGL_API_Thread_Command_glGenFencesNV *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->fences = fences;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenFencesNV,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsFenceNV(GLuint fence);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint fence;
-
-} EVGL_API_Thread_Command_glIsFenceNV;
-
-GLboolean (*orig_evgl_api_glIsFenceNV)(GLuint fence);
-
-static void
-_evgl_api_thread_glIsFenceNV(void *data)
-{
-   EVGL_API_Thread_Command_glIsFenceNV *thread_data =
-      (EVGL_API_Thread_Command_glIsFenceNV *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsFenceNV(thread_data->fence);
-
-}
-
-EAPI GLboolean
-glIsFenceNV_evgl_api_thread_cmd(GLuint fence)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsFenceNV(fence);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsFenceNV thread_data_local;
-   EVGL_API_Thread_Command_glIsFenceNV *thread_data = &thread_data_local;
-
-   thread_data->fence = fence;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsFenceNV,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glTestFenceNV(GLuint fence);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint fence;
-
-} EVGL_API_Thread_Command_glTestFenceNV;
-
-GLboolean (*orig_evgl_api_glTestFenceNV)(GLuint fence);
-
-static void
-_evgl_api_thread_glTestFenceNV(void *data)
-{
-   EVGL_API_Thread_Command_glTestFenceNV *thread_data =
-      (EVGL_API_Thread_Command_glTestFenceNV *)data;
-
-   thread_data->return_value = orig_evgl_api_glTestFenceNV(thread_data->fence);
-
-}
-
-EAPI GLboolean
-glTestFenceNV_evgl_api_thread_cmd(GLuint fence)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glTestFenceNV(fence);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTestFenceNV thread_data_local;
-   EVGL_API_Thread_Command_glTestFenceNV *thread_data = &thread_data_local;
-
-   thread_data->fence = fence;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTestFenceNV,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetFenceivNV(GLuint fence, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLuint fence;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetFenceivNV;
-
-void (*orig_evgl_api_glGetFenceivNV)(GLuint fence, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetFenceivNV(void *data)
-{
-   EVGL_API_Thread_Command_glGetFenceivNV *thread_data =
-      (EVGL_API_Thread_Command_glGetFenceivNV *)data;
-
-   orig_evgl_api_glGetFenceivNV(thread_data->fence,
-                                thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetFenceivNV_evgl_api_thread_cmd(GLuint fence, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFenceivNV(fence, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFenceivNV thread_data_local;
-   EVGL_API_Thread_Command_glGetFenceivNV *thread_data = &thread_data_local;
-
-   thread_data->fence = fence;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFenceivNV,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFinishFenceNV(GLuint fence);
- */
-
-typedef struct
-{
-   GLuint fence;
-
-} EVGL_API_Thread_Command_glFinishFenceNV;
-
-void (*orig_evgl_api_glFinishFenceNV)(GLuint fence);
-
-static void
-_evgl_api_thread_glFinishFenceNV(void *data)
-{
-   EVGL_API_Thread_Command_glFinishFenceNV *thread_data =
-      (EVGL_API_Thread_Command_glFinishFenceNV *)data;
-
-   orig_evgl_api_glFinishFenceNV(thread_data->fence);
-
-}
-
-EAPI void
-glFinishFenceNV_evgl_api_thread_cmd(GLuint fence)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFinishFenceNV(fence);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFinishFenceNV thread_data_local;
-   EVGL_API_Thread_Command_glFinishFenceNV *thread_data = &thread_data_local;
-
-   thread_data->fence = fence;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFinishFenceNV,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSetFenceNV(GLuint a, GLenum b);
- */
-
-typedef struct
-{
-   GLuint a;
-   GLenum b;
-
-} EVGL_API_Thread_Command_glSetFenceNV;
-
-void (*orig_evgl_api_glSetFenceNV)(GLuint a, GLenum b);
-
-static void
-_evgl_api_thread_glSetFenceNV(void *data)
-{
-   EVGL_API_Thread_Command_glSetFenceNV *thread_data =
-      (EVGL_API_Thread_Command_glSetFenceNV *)data;
-
-   orig_evgl_api_glSetFenceNV(thread_data->a,
-                              thread_data->b);
-
-}
-
-EAPI void
-glSetFenceNV_evgl_api_thread_cmd(GLuint a, GLenum b)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSetFenceNV(a, b);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSetFenceNV thread_data_local;
-   EVGL_API_Thread_Command_glSetFenceNV *thread_data = &thread_data_local;
-
-   thread_data->a = a;
-   thread_data->b = b;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSetFenceNV,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetDriverControlsQCOM(GLint* num, GLsizei size, GLuint* driverControls);
- */
-
-typedef struct
-{
-   GLint* num;
-   GLsizei size;
-   GLuint* driverControls;
-
-} EVGL_API_Thread_Command_glGetDriverControlsQCOM;
-
-void (*orig_evgl_api_glGetDriverControlsQCOM)(GLint* num, GLsizei size, GLuint* driverControls);
-
-static void
-_evgl_api_thread_glGetDriverControlsQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glGetDriverControlsQCOM *thread_data =
-      (EVGL_API_Thread_Command_glGetDriverControlsQCOM *)data;
-
-   orig_evgl_api_glGetDriverControlsQCOM(thread_data->num,
-                                         thread_data->size,
-                                         thread_data->driverControls);
-
-}
-
-EAPI void
-glGetDriverControlsQCOM_evgl_api_thread_cmd(GLint* num, GLsizei size, GLuint* driverControls)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetDriverControlsQCOM(num, size, driverControls);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetDriverControlsQCOM thread_data_local;
-   EVGL_API_Thread_Command_glGetDriverControlsQCOM *thread_data = &thread_data_local;
-
-   thread_data->num = num;
-   thread_data->size = size;
-   thread_data->driverControls = driverControls;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetDriverControlsQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
- */
-
-typedef struct
-{
-   GLuint driverControl;
-   GLsizei bufSize;
-   GLsizei* length;
-   char* driverControlString;
-
-} EVGL_API_Thread_Command_glGetDriverControlStringQCOM;
-
-void (*orig_evgl_api_glGetDriverControlStringQCOM)(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
-
-static void
-_evgl_api_thread_glGetDriverControlStringQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glGetDriverControlStringQCOM *thread_data =
-      (EVGL_API_Thread_Command_glGetDriverControlStringQCOM *)data;
-
-   orig_evgl_api_glGetDriverControlStringQCOM(thread_data->driverControl,
-                                              thread_data->bufSize,
-                                              thread_data->length,
-                                              thread_data->driverControlString);
-
-}
-
-EAPI void
-glGetDriverControlStringQCOM_evgl_api_thread_cmd(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetDriverControlStringQCOM thread_data_local;
-   EVGL_API_Thread_Command_glGetDriverControlStringQCOM *thread_data = &thread_data_local;
-
-   thread_data->driverControl = driverControl;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->driverControlString = driverControlString;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetDriverControlStringQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnableDriverControlQCOM(GLuint driverControl);
- */
-
-typedef struct
-{
-   GLuint driverControl;
-
-} EVGL_API_Thread_Command_glEnableDriverControlQCOM;
-
-void (*orig_evgl_api_glEnableDriverControlQCOM)(GLuint driverControl);
-
-static void
-_evgl_api_thread_glEnableDriverControlQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glEnableDriverControlQCOM *thread_data =
-      (EVGL_API_Thread_Command_glEnableDriverControlQCOM *)data;
-
-   orig_evgl_api_glEnableDriverControlQCOM(thread_data->driverControl);
-
-}
-
-EAPI void
-glEnableDriverControlQCOM_evgl_api_thread_cmd(GLuint driverControl)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEnableDriverControlQCOM(driverControl);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEnableDriverControlQCOM thread_data_local;
-   EVGL_API_Thread_Command_glEnableDriverControlQCOM *thread_data = &thread_data_local;
-
-   thread_data->driverControl = driverControl;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEnableDriverControlQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisableDriverControlQCOM(GLuint driverControl);
- */
-
-typedef struct
-{
-   GLuint driverControl;
-
-} EVGL_API_Thread_Command_glDisableDriverControlQCOM;
-
-void (*orig_evgl_api_glDisableDriverControlQCOM)(GLuint driverControl);
-
-static void
-_evgl_api_thread_glDisableDriverControlQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glDisableDriverControlQCOM *thread_data =
-      (EVGL_API_Thread_Command_glDisableDriverControlQCOM *)data;
-
-   orig_evgl_api_glDisableDriverControlQCOM(thread_data->driverControl);
-
-}
-
-EAPI void
-glDisableDriverControlQCOM_evgl_api_thread_cmd(GLuint driverControl)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDisableDriverControlQCOM(driverControl);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDisableDriverControlQCOM thread_data_local;
-   EVGL_API_Thread_Command_glDisableDriverControlQCOM *thread_data = &thread_data_local;
-
-   thread_data->driverControl = driverControl;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDisableDriverControlQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetTexturesQCOM(GLuint* textures, GLint maxTextures, GLint* numTextures);
- */
-
-typedef struct
-{
-   GLuint* textures;
-   GLint maxTextures;
-   GLint* numTextures;
-
-} EVGL_API_Thread_Command_glExtGetTexturesQCOM;
-
-void (*orig_evgl_api_glExtGetTexturesQCOM)(GLuint* textures, GLint maxTextures, GLint* numTextures);
-
-static void
-_evgl_api_thread_glExtGetTexturesQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetTexturesQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetTexturesQCOM *)data;
-
-   orig_evgl_api_glExtGetTexturesQCOM(thread_data->textures,
-                                      thread_data->maxTextures,
-                                      thread_data->numTextures);
-
-}
-
-EAPI void
-glExtGetTexturesQCOM_evgl_api_thread_cmd(GLuint* textures, GLint maxTextures, GLint* numTextures)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetTexturesQCOM(textures, maxTextures, numTextures);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetTexturesQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetTexturesQCOM *thread_data = &thread_data_local;
-
-   thread_data->textures = textures;
-   thread_data->maxTextures = maxTextures;
-   thread_data->numTextures = numTextures;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetTexturesQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetBuffersQCOM(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
- */
-
-typedef struct
-{
-   GLuint* buffers;
-   GLint maxBuffers;
-   GLint* numBuffers;
-
-} EVGL_API_Thread_Command_glExtGetBuffersQCOM;
-
-void (*orig_evgl_api_glExtGetBuffersQCOM)(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
-
-static void
-_evgl_api_thread_glExtGetBuffersQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetBuffersQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetBuffersQCOM *)data;
-
-   orig_evgl_api_glExtGetBuffersQCOM(thread_data->buffers,
-                                     thread_data->maxBuffers,
-                                     thread_data->numBuffers);
-
-}
-
-EAPI void
-glExtGetBuffersQCOM_evgl_api_thread_cmd(GLuint* buffers, GLint maxBuffers, GLint* numBuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetBuffersQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetBuffersQCOM *thread_data = &thread_data_local;
-
-   thread_data->buffers = buffers;
-   thread_data->maxBuffers = maxBuffers;
-   thread_data->numBuffers = numBuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetBuffersQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetRenderbuffersQCOM(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
- */
-
-typedef struct
-{
-   GLuint* renderbuffers;
-   GLint maxRenderbuffers;
-   GLint* numRenderbuffers;
-
-} EVGL_API_Thread_Command_glExtGetRenderbuffersQCOM;
-
-void (*orig_evgl_api_glExtGetRenderbuffersQCOM)(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
-
-static void
-_evgl_api_thread_glExtGetRenderbuffersQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetRenderbuffersQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetRenderbuffersQCOM *)data;
-
-   orig_evgl_api_glExtGetRenderbuffersQCOM(thread_data->renderbuffers,
-                                           thread_data->maxRenderbuffers,
-                                           thread_data->numRenderbuffers);
-
-}
-
-EAPI void
-glExtGetRenderbuffersQCOM_evgl_api_thread_cmd(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetRenderbuffersQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetRenderbuffersQCOM *thread_data = &thread_data_local;
-
-   thread_data->renderbuffers = renderbuffers;
-   thread_data->maxRenderbuffers = maxRenderbuffers;
-   thread_data->numRenderbuffers = numRenderbuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetRenderbuffersQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetFramebuffersQCOM(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
- */
-
-typedef struct
-{
-   GLuint* framebuffers;
-   GLint maxFramebuffers;
-   GLint* numFramebuffers;
-
-} EVGL_API_Thread_Command_glExtGetFramebuffersQCOM;
-
-void (*orig_evgl_api_glExtGetFramebuffersQCOM)(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
-
-static void
-_evgl_api_thread_glExtGetFramebuffersQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetFramebuffersQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetFramebuffersQCOM *)data;
-
-   orig_evgl_api_glExtGetFramebuffersQCOM(thread_data->framebuffers,
-                                          thread_data->maxFramebuffers,
-                                          thread_data->numFramebuffers);
-
-}
-
-EAPI void
-glExtGetFramebuffersQCOM_evgl_api_thread_cmd(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetFramebuffersQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetFramebuffersQCOM *thread_data = &thread_data_local;
-
-   thread_data->framebuffers = framebuffers;
-   thread_data->maxFramebuffers = maxFramebuffers;
-   thread_data->numFramebuffers = numFramebuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetFramebuffersQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLuint texture;
-   GLenum face;
-   GLint level;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glExtGetTexLevelParameterivQCOM;
-
-void (*orig_evgl_api_glExtGetTexLevelParameterivQCOM)(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glExtGetTexLevelParameterivQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetTexLevelParameterivQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetTexLevelParameterivQCOM *)data;
-
-   orig_evgl_api_glExtGetTexLevelParameterivQCOM(thread_data->texture,
-                                                 thread_data->face,
-                                                 thread_data->level,
-                                                 thread_data->pname,
-                                                 thread_data->params);
-
-}
-
-EAPI void
-glExtGetTexLevelParameterivQCOM_evgl_api_thread_cmd(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetTexLevelParameterivQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetTexLevelParameterivQCOM *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-   thread_data->face = face;
-   thread_data->level = level;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetTexLevelParameterivQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint param;
-
-} EVGL_API_Thread_Command_glExtTexObjectStateOverrideiQCOM;
-
-void (*orig_evgl_api_glExtTexObjectStateOverrideiQCOM)(GLenum target, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glExtTexObjectStateOverrideiQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtTexObjectStateOverrideiQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtTexObjectStateOverrideiQCOM *)data;
-
-   orig_evgl_api_glExtTexObjectStateOverrideiQCOM(thread_data->target,
-                                                  thread_data->pname,
-                                                  thread_data->param);
-
-}
-
-EAPI void
-glExtTexObjectStateOverrideiQCOM_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtTexObjectStateOverrideiQCOM(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtTexObjectStateOverrideiQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtTexObjectStateOverrideiQCOM *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtTexObjectStateOverrideiQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLenum format;
-   GLenum type;
-   void* texels;
-
-} EVGL_API_Thread_Command_glExtGetTexSubImageQCOM;
-
-void (*orig_evgl_api_glExtGetTexSubImageQCOM)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
-
-static void
-_evgl_api_thread_glExtGetTexSubImageQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetTexSubImageQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetTexSubImageQCOM *)data;
-
-   orig_evgl_api_glExtGetTexSubImageQCOM(thread_data->target,
-                                         thread_data->level,
-                                         thread_data->xoffset,
-                                         thread_data->yoffset,
-                                         thread_data->zoffset,
-                                         thread_data->width,
-                                         thread_data->height,
-                                         thread_data->depth,
-                                         thread_data->format,
-                                         thread_data->type,
-                                         thread_data->texels);
-
-}
-
-EAPI void
-glExtGetTexSubImageQCOM_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetTexSubImageQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetTexSubImageQCOM *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->texels = texels;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetTexSubImageQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetBufferPointervQCOM(GLenum target, void** params);
- */
-
-typedef struct
-{
-   GLenum target;
-   void** params;
-
-} EVGL_API_Thread_Command_glExtGetBufferPointervQCOM;
-
-void (*orig_evgl_api_glExtGetBufferPointervQCOM)(GLenum target, void** params);
-
-static void
-_evgl_api_thread_glExtGetBufferPointervQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetBufferPointervQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetBufferPointervQCOM *)data;
-
-   orig_evgl_api_glExtGetBufferPointervQCOM(thread_data->target,
-                                            thread_data->params);
-
-}
-
-EAPI void
-glExtGetBufferPointervQCOM_evgl_api_thread_cmd(GLenum target, void** params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetBufferPointervQCOM(target, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetBufferPointervQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetBufferPointervQCOM *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetBufferPointervQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetShadersQCOM(GLuint* shaders, GLint maxShaders, GLint* numShaders);
- */
-
-typedef struct
-{
-   GLuint* shaders;
-   GLint maxShaders;
-   GLint* numShaders;
-
-} EVGL_API_Thread_Command_glExtGetShadersQCOM;
-
-void (*orig_evgl_api_glExtGetShadersQCOM)(GLuint* shaders, GLint maxShaders, GLint* numShaders);
-
-static void
-_evgl_api_thread_glExtGetShadersQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetShadersQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetShadersQCOM *)data;
-
-   orig_evgl_api_glExtGetShadersQCOM(thread_data->shaders,
-                                     thread_data->maxShaders,
-                                     thread_data->numShaders);
-
-}
-
-EAPI void
-glExtGetShadersQCOM_evgl_api_thread_cmd(GLuint* shaders, GLint maxShaders, GLint* numShaders)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetShadersQCOM(shaders, maxShaders, numShaders);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetShadersQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetShadersQCOM *thread_data = &thread_data_local;
-
-   thread_data->shaders = shaders;
-   thread_data->maxShaders = maxShaders;
-   thread_data->numShaders = numShaders;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetShadersQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glExtGetProgramsQCOM(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
- */
-
-typedef struct
-{
-   GLuint* programs;
-   GLint maxPrograms;
-   GLint* numPrograms;
-
-} EVGL_API_Thread_Command_glExtGetProgramsQCOM;
-
-void (*orig_evgl_api_glExtGetProgramsQCOM)(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
-
-static void
-_evgl_api_thread_glExtGetProgramsQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetProgramsQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetProgramsQCOM *)data;
-
-   orig_evgl_api_glExtGetProgramsQCOM(thread_data->programs,
-                                      thread_data->maxPrograms,
-                                      thread_data->numPrograms);
-
-}
-
-EAPI void
-glExtGetProgramsQCOM_evgl_api_thread_cmd(GLuint* programs, GLint maxPrograms, GLint* numPrograms)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetProgramsQCOM(programs, maxPrograms, numPrograms);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetProgramsQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetProgramsQCOM *thread_data = &thread_data_local;
-
-   thread_data->programs = programs;
-   thread_data->maxPrograms = maxPrograms;
-   thread_data->numPrograms = numPrograms;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetProgramsQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glExtIsProgramBinaryQCOM(GLuint program);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint program;
-
-} EVGL_API_Thread_Command_glExtIsProgramBinaryQCOM;
-
-GLboolean (*orig_evgl_api_glExtIsProgramBinaryQCOM)(GLuint program);
-
-static void
-_evgl_api_thread_glExtIsProgramBinaryQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtIsProgramBinaryQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtIsProgramBinaryQCOM *)data;
-
-   thread_data->return_value = orig_evgl_api_glExtIsProgramBinaryQCOM(thread_data->program);
-
-}
-
-EAPI GLboolean
-glExtIsProgramBinaryQCOM_evgl_api_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glExtIsProgramBinaryQCOM(program);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtIsProgramBinaryQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtIsProgramBinaryQCOM *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtIsProgramBinaryQCOM,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glExtGetProgramBinarySourceQCOM(GLuint program, GLenum shadertype, char* source, GLint* length);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum shadertype;
-   char* source;
-   GLint* length;
-
-} EVGL_API_Thread_Command_glExtGetProgramBinarySourceQCOM;
-
-void (*orig_evgl_api_glExtGetProgramBinarySourceQCOM)(GLuint program, GLenum shadertype, char* source, GLint* length);
-
-static void
-_evgl_api_thread_glExtGetProgramBinarySourceQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glExtGetProgramBinarySourceQCOM *thread_data =
-      (EVGL_API_Thread_Command_glExtGetProgramBinarySourceQCOM *)data;
-
-   orig_evgl_api_glExtGetProgramBinarySourceQCOM(thread_data->program,
-                                                 thread_data->shadertype,
-                                                 thread_data->source,
-                                                 thread_data->length);
-
-}
-
-EAPI void
-glExtGetProgramBinarySourceQCOM_evgl_api_thread_cmd(GLuint program, GLenum shadertype, char* source, GLint* length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glExtGetProgramBinarySourceQCOM(program, shadertype, source, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glExtGetProgramBinarySourceQCOM thread_data_local;
-   EVGL_API_Thread_Command_glExtGetProgramBinarySourceQCOM *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->shadertype = shadertype;
-   thread_data->source = source;
-   thread_data->length = length;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glExtGetProgramBinarySourceQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glAlphaFunc(GLenum func, GLclampf ref);
- */
-
-typedef struct
-{
-   GLenum func;
-   GLclampf ref;
-
-} EVGL_API_Thread_Command_glAlphaFunc;
-
-void (*orig_evgl_api_glAlphaFunc)(GLenum func, GLclampf ref);
-
-static void
-_evgl_api_thread_glAlphaFunc(void *data)
-{
-   EVGL_API_Thread_Command_glAlphaFunc *thread_data =
-      (EVGL_API_Thread_Command_glAlphaFunc *)data;
-
-   orig_evgl_api_glAlphaFunc(thread_data->func,
-                             thread_data->ref);
-
-}
-
-EAPI void
-glAlphaFunc_evgl_api_thread_cmd(GLenum func, GLclampf ref)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glAlphaFunc(func, ref);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glAlphaFunc thread_data_local;
-   EVGL_API_Thread_Command_glAlphaFunc *thread_data = &thread_data_local;
-
-   thread_data->func = func;
-   thread_data->ref = ref;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glAlphaFunc,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanef(GLenum plane, const GLfloat *equation);
- */
-
-typedef struct
-{
-   GLenum plane;
-   const GLfloat *equation;
-
-} EVGL_API_Thread_Command_glClipPlanef;
-
-void (*orig_evgl_api_glClipPlanef)(GLenum plane, const GLfloat *equation);
-
-static void
-_evgl_api_thread_glClipPlanef(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanef *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanef *)data;
-
-   orig_evgl_api_glClipPlanef(thread_data->plane,
-                              thread_data->equation);
-
-}
-
-EAPI void
-glClipPlanef_evgl_api_thread_cmd(GLenum plane, const GLfloat *equation)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanef(plane, equation);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanef thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanef *thread_data = &thread_data_local;
-
-   thread_data->plane = plane;
-   thread_data->equation = equation;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- */
-
-typedef struct
-{
-   GLfloat red;
-   GLfloat green;
-   GLfloat blue;
-   GLfloat alpha;
-
-} EVGL_API_Thread_Command_glColor4f;
-
-void (*orig_evgl_api_glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
-static void
-_evgl_api_thread_glColor4f(void *data)
-{
-   EVGL_API_Thread_Command_glColor4f *thread_data =
-      (EVGL_API_Thread_Command_glColor4f *)data;
-
-   orig_evgl_api_glColor4f(thread_data->red,
-                           thread_data->green,
-                           thread_data->blue,
-                           thread_data->alpha);
-
-}
-
-EAPI void
-glColor4f_evgl_api_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColor4f(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColor4f thread_data_local;
-   EVGL_API_Thread_Command_glColor4f *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColor4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogf(GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glFogf;
-
-void (*orig_evgl_api_glFogf)(GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glFogf(void *data)
-{
-   EVGL_API_Thread_Command_glFogf *thread_data =
-      (EVGL_API_Thread_Command_glFogf *)data;
-
-   orig_evgl_api_glFogf(thread_data->pname,
-                        thread_data->param);
-
-}
-
-EAPI void
-glFogf_evgl_api_thread_cmd(GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogf(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogf thread_data_local;
-   EVGL_API_Thread_Command_glFogf *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogfv(GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glFogfv;
-
-void (*orig_evgl_api_glFogfv)(GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glFogfv(void *data)
-{
-   EVGL_API_Thread_Command_glFogfv *thread_data =
-      (EVGL_API_Thread_Command_glFogfv *)data;
-
-   orig_evgl_api_glFogfv(thread_data->pname,
-                         thread_data->params);
-
-}
-
-EAPI void
-glFogfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogfv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogfv thread_data_local;
-   EVGL_API_Thread_Command_glFogfv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
- */
-
-typedef struct
-{
-   GLfloat left;
-   GLfloat right;
-   GLfloat bottom;
-   GLfloat top;
-   GLfloat zNear;
-   GLfloat zFar;
-
-} EVGL_API_Thread_Command_glFrustumf;
-
-void (*orig_evgl_api_glFrustumf)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-static void
-_evgl_api_thread_glFrustumf(void *data)
-{
-   EVGL_API_Thread_Command_glFrustumf *thread_data =
-      (EVGL_API_Thread_Command_glFrustumf *)data;
-
-   orig_evgl_api_glFrustumf(thread_data->left,
-                            thread_data->right,
-                            thread_data->bottom,
-                            thread_data->top,
-                            thread_data->zNear,
-                            thread_data->zFar);
-
-}
-
-EAPI void
-glFrustumf_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFrustumf(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFrustumf thread_data_local;
-   EVGL_API_Thread_Command_glFrustumf *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFrustumf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetClipPlanef(GLenum pname, GLfloat eqn[4]);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat eqn[4];
-
-} EVGL_API_Thread_Command_glGetClipPlanef;
-
-void (*orig_evgl_api_glGetClipPlanef)(GLenum pname, GLfloat eqn[4]);
-
-static void
-_evgl_api_thread_glGetClipPlanef(void *data)
-{
-   EVGL_API_Thread_Command_glGetClipPlanef *thread_data =
-      (EVGL_API_Thread_Command_glGetClipPlanef *)data;
-
-   orig_evgl_api_glGetClipPlanef(thread_data->pname,
-                                 thread_data->eqn);
-
-}
-
-EAPI void
-glGetClipPlanef_evgl_api_thread_cmd(GLenum pname, GLfloat eqn[4])
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetClipPlanef(pname, eqn);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetClipPlanef thread_data_local;
-   EVGL_API_Thread_Command_glGetClipPlanef *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   memcpy(thread_data->eqn, &eqn, sizeof(GLfloat) * 4);
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetClipPlanef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_API_Thread_Command_glGetLightfv;
-
-void (*orig_evgl_api_glGetLightfv)(GLenum light, GLenum pname, GLfloat *params);
-
-static void
-_evgl_api_thread_glGetLightfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetLightfv *thread_data =
-      (EVGL_API_Thread_Command_glGetLightfv *)data;
-
-   orig_evgl_api_glGetLightfv(thread_data->light,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glGetLightfv_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetLightfv(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetLightfv thread_data_local;
-   EVGL_API_Thread_Command_glGetLightfv *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetLightfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_API_Thread_Command_glGetMaterialfv;
-
-void (*orig_evgl_api_glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params);
-
-static void
-_evgl_api_thread_glGetMaterialfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetMaterialfv *thread_data =
-      (EVGL_API_Thread_Command_glGetMaterialfv *)data;
-
-   orig_evgl_api_glGetMaterialfv(thread_data->face,
-                                 thread_data->pname,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetMaterialfv_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetMaterialfv(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetMaterialfv thread_data_local;
-   EVGL_API_Thread_Command_glGetMaterialfv *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetMaterialfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum env;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_API_Thread_Command_glGetTexEnvfv;
-
-void (*orig_evgl_api_glGetTexEnvfv)(GLenum env, GLenum pname, GLfloat *params);
-
-static void
-_evgl_api_thread_glGetTexEnvfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexEnvfv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexEnvfv *)data;
-
-   orig_evgl_api_glGetTexEnvfv(thread_data->env,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetTexEnvfv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexEnvfv(env, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexEnvfv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexEnvfv *thread_data = &thread_data_local;
-
-   thread_data->env = env;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexEnvfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelf(GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glLightModelf;
-
-void (*orig_evgl_api_glLightModelf)(GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glLightModelf(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelf *thread_data =
-      (EVGL_API_Thread_Command_glLightModelf *)data;
-
-   orig_evgl_api_glLightModelf(thread_data->pname,
-                               thread_data->param);
-
-}
-
-EAPI void
-glLightModelf_evgl_api_thread_cmd(GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelf(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelf thread_data_local;
-   EVGL_API_Thread_Command_glLightModelf *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelfv(GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glLightModelfv;
-
-void (*orig_evgl_api_glLightModelfv)(GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glLightModelfv(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelfv *thread_data =
-      (EVGL_API_Thread_Command_glLightModelfv *)data;
-
-   orig_evgl_api_glLightModelfv(thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glLightModelfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelfv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelfv thread_data_local;
-   EVGL_API_Thread_Command_glLightModelfv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightf(GLenum light, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glLightf;
-
-void (*orig_evgl_api_glLightf)(GLenum light, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glLightf(void *data)
-{
-   EVGL_API_Thread_Command_glLightf *thread_data =
-      (EVGL_API_Thread_Command_glLightf *)data;
-
-   orig_evgl_api_glLightf(thread_data->light,
-                          thread_data->pname,
-                          thread_data->param);
-
-}
-
-EAPI void
-glLightf_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightf(light, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightf thread_data_local;
-   EVGL_API_Thread_Command_glLightf *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightfv(GLenum light, GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glLightfv;
-
-void (*orig_evgl_api_glLightfv)(GLenum light, GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glLightfv(void *data)
-{
-   EVGL_API_Thread_Command_glLightfv *thread_data =
-      (EVGL_API_Thread_Command_glLightfv *)data;
-
-   orig_evgl_api_glLightfv(thread_data->light,
-                           thread_data->pname,
-                           thread_data->params);
-
-}
-
-EAPI void
-glLightfv_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightfv(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightfv thread_data_local;
-   EVGL_API_Thread_Command_glLightfv *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLoadMatrixf(const GLfloat *m);
- */
-
-typedef struct
-{
-   const GLfloat *m;
-
-} EVGL_API_Thread_Command_glLoadMatrixf;
-
-void (*orig_evgl_api_glLoadMatrixf)(const GLfloat *m);
-
-static void
-_evgl_api_thread_glLoadMatrixf(void *data)
-{
-   EVGL_API_Thread_Command_glLoadMatrixf *thread_data =
-      (EVGL_API_Thread_Command_glLoadMatrixf *)data;
-
-   orig_evgl_api_glLoadMatrixf(thread_data->m);
-
-}
-
-EAPI void
-glLoadMatrixf_evgl_api_thread_cmd(const GLfloat *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLoadMatrixf(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLoadMatrixf thread_data_local;
-   EVGL_API_Thread_Command_glLoadMatrixf *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLoadMatrixf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialf(GLenum face, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glMaterialf;
-
-void (*orig_evgl_api_glMaterialf)(GLenum face, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glMaterialf(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialf *thread_data =
-      (EVGL_API_Thread_Command_glMaterialf *)data;
-
-   orig_evgl_api_glMaterialf(thread_data->face,
-                             thread_data->pname,
-                             thread_data->param);
-
-}
-
-EAPI void
-glMaterialf_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialf(face, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialf thread_data_local;
-   EVGL_API_Thread_Command_glMaterialf *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glMaterialfv;
-
-void (*orig_evgl_api_glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glMaterialfv(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialfv *thread_data =
-      (EVGL_API_Thread_Command_glMaterialfv *)data;
-
-   orig_evgl_api_glMaterialfv(thread_data->face,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glMaterialfv_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialfv(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialfv thread_data_local;
-   EVGL_API_Thread_Command_glMaterialfv *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultMatrixf(const GLfloat *m);
- */
-
-typedef struct
-{
-   const GLfloat *m;
-
-} EVGL_API_Thread_Command_glMultMatrixf;
-
-void (*orig_evgl_api_glMultMatrixf)(const GLfloat *m);
-
-static void
-_evgl_api_thread_glMultMatrixf(void *data)
-{
-   EVGL_API_Thread_Command_glMultMatrixf *thread_data =
-      (EVGL_API_Thread_Command_glMultMatrixf *)data;
-
-   orig_evgl_api_glMultMatrixf(thread_data->m);
-
-}
-
-EAPI void
-glMultMatrixf_evgl_api_thread_cmd(const GLfloat *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultMatrixf(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultMatrixf thread_data_local;
-   EVGL_API_Thread_Command_glMultMatrixf *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultMatrixf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLfloat s;
-   GLfloat t;
-   GLfloat r;
-   GLfloat q;
-
-} EVGL_API_Thread_Command_glMultiTexCoord4f;
-
-void (*orig_evgl_api_glMultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-
-static void
-_evgl_api_thread_glMultiTexCoord4f(void *data)
-{
-   EVGL_API_Thread_Command_glMultiTexCoord4f *thread_data =
-      (EVGL_API_Thread_Command_glMultiTexCoord4f *)data;
-
-   orig_evgl_api_glMultiTexCoord4f(thread_data->target,
-                                   thread_data->s,
-                                   thread_data->t,
-                                   thread_data->r,
-                                   thread_data->q);
-
-}
-
-EAPI void
-glMultiTexCoord4f_evgl_api_thread_cmd(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiTexCoord4f(target, s, t, r, q);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiTexCoord4f thread_data_local;
-   EVGL_API_Thread_Command_glMultiTexCoord4f *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->s = s;
-   thread_data->t = t;
-   thread_data->r = r;
-   thread_data->q = q;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiTexCoord4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
- */
-
-typedef struct
-{
-   GLfloat nx;
-   GLfloat ny;
-   GLfloat nz;
-
-} EVGL_API_Thread_Command_glNormal3f;
-
-void (*orig_evgl_api_glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz);
-
-static void
-_evgl_api_thread_glNormal3f(void *data)
-{
-   EVGL_API_Thread_Command_glNormal3f *thread_data =
-      (EVGL_API_Thread_Command_glNormal3f *)data;
-
-   orig_evgl_api_glNormal3f(thread_data->nx,
-                            thread_data->ny,
-                            thread_data->nz);
-
-}
-
-EAPI void
-glNormal3f_evgl_api_thread_cmd(GLfloat nx, GLfloat ny, GLfloat nz)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glNormal3f(nx, ny, nz);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glNormal3f thread_data_local;
-   EVGL_API_Thread_Command_glNormal3f *thread_data = &thread_data_local;
-
-   thread_data->nx = nx;
-   thread_data->ny = ny;
-   thread_data->nz = nz;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glNormal3f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
- */
-
-typedef struct
-{
-   GLfloat left;
-   GLfloat right;
-   GLfloat bottom;
-   GLfloat top;
-   GLfloat zNear;
-   GLfloat zFar;
-
-} EVGL_API_Thread_Command_glOrthof;
-
-void (*orig_evgl_api_glOrthof)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-static void
-_evgl_api_thread_glOrthof(void *data)
-{
-   EVGL_API_Thread_Command_glOrthof *thread_data =
-      (EVGL_API_Thread_Command_glOrthof *)data;
-
-   orig_evgl_api_glOrthof(thread_data->left,
-                          thread_data->right,
-                          thread_data->bottom,
-                          thread_data->top,
-                          thread_data->zNear,
-                          thread_data->zFar);
-
-}
-
-EAPI void
-glOrthof_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glOrthof(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glOrthof thread_data_local;
-   EVGL_API_Thread_Command_glOrthof *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glOrthof,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterf(GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glPointParameterf;
-
-void (*orig_evgl_api_glPointParameterf)(GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glPointParameterf(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterf *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterf *)data;
-
-   orig_evgl_api_glPointParameterf(thread_data->pname,
-                                   thread_data->param);
-
-}
-
-EAPI void
-glPointParameterf_evgl_api_thread_cmd(GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterf(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterf thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterf *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterfv(GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glPointParameterfv;
-
-void (*orig_evgl_api_glPointParameterfv)(GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glPointParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterfv *)data;
-
-   orig_evgl_api_glPointParameterfv(thread_data->pname,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glPointParameterfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterfv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterfv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointSize(GLfloat size);
- */
-
-typedef struct
-{
-   GLfloat size;
-
-} EVGL_API_Thread_Command_glPointSize;
-
-void (*orig_evgl_api_glPointSize)(GLfloat size);
-
-static void
-_evgl_api_thread_glPointSize(void *data)
-{
-   EVGL_API_Thread_Command_glPointSize *thread_data =
-      (EVGL_API_Thread_Command_glPointSize *)data;
-
-   orig_evgl_api_glPointSize(thread_data->size);
-
-}
-
-EAPI void
-glPointSize_evgl_api_thread_cmd(GLfloat size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointSize(size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointSize thread_data_local;
-   EVGL_API_Thread_Command_glPointSize *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointSize,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid * pointer);
- */
-
-typedef struct
-{
-   GLenum type;
-   GLsizei stride;
-   const GLvoid * pointer;
-
-} EVGL_API_Thread_Command_glPointSizePointerOES;
-
-void (*orig_evgl_api_glPointSizePointerOES)(GLenum type, GLsizei stride, const GLvoid * pointer);
-
-static void
-_evgl_api_thread_glPointSizePointerOES(void *data)
-{
-   EVGL_API_Thread_Command_glPointSizePointerOES *thread_data =
-      (EVGL_API_Thread_Command_glPointSizePointerOES *)data;
-
-   orig_evgl_api_glPointSizePointerOES(thread_data->type,
-                                       thread_data->stride,
-                                       thread_data->pointer);
-
-}
-
-EAPI void
-glPointSizePointerOES_evgl_api_thread_cmd(GLenum type, GLsizei stride, const GLvoid * pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointSizePointerOES(type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointSizePointerOES thread_data_local;
-   EVGL_API_Thread_Command_glPointSizePointerOES *thread_data = &thread_data_local;
-
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointSizePointerOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
- */
-
-typedef struct
-{
-   GLfloat angle;
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-
-} EVGL_API_Thread_Command_glRotatef;
-
-void (*orig_evgl_api_glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-
-static void
-_evgl_api_thread_glRotatef(void *data)
-{
-   EVGL_API_Thread_Command_glRotatef *thread_data =
-      (EVGL_API_Thread_Command_glRotatef *)data;
-
-   orig_evgl_api_glRotatef(thread_data->angle,
-                           thread_data->x,
-                           thread_data->y,
-                           thread_data->z);
-
-}
-
-EAPI void
-glRotatef_evgl_api_thread_cmd(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRotatef(angle, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRotatef thread_data_local;
-   EVGL_API_Thread_Command_glRotatef *thread_data = &thread_data_local;
-
-   thread_data->angle = angle;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRotatef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glScalef(GLfloat x, GLfloat y, GLfloat z);
- */
-
-typedef struct
-{
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-
-} EVGL_API_Thread_Command_glScalef;
-
-void (*orig_evgl_api_glScalef)(GLfloat x, GLfloat y, GLfloat z);
-
-static void
-_evgl_api_thread_glScalef(void *data)
-{
-   EVGL_API_Thread_Command_glScalef *thread_data =
-      (EVGL_API_Thread_Command_glScalef *)data;
-
-   orig_evgl_api_glScalef(thread_data->x,
-                          thread_data->y,
-                          thread_data->z);
-
-}
-
-EAPI void
-glScalef_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glScalef(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glScalef thread_data_local;
-   EVGL_API_Thread_Command_glScalef *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glScalef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvf(GLenum target, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glTexEnvf;
-
-void (*orig_evgl_api_glTexEnvf)(GLenum target, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glTexEnvf(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvf *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvf *)data;
-
-   orig_evgl_api_glTexEnvf(thread_data->target,
-                           thread_data->pname,
-                           thread_data->param);
-
-}
-
-EAPI void
-glTexEnvf_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvf(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvf thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvf *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glTexEnvfv;
-
-void (*orig_evgl_api_glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glTexEnvfv(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvfv *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvfv *)data;
-
-   orig_evgl_api_glTexEnvfv(thread_data->target,
-                            thread_data->pname,
-                            thread_data->params);
-
-}
-
-EAPI void
-glTexEnvfv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvfv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvfv thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvfv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTranslatef(GLfloat x, GLfloat y, GLfloat z);
- */
-
-typedef struct
-{
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-
-} EVGL_API_Thread_Command_glTranslatef;
-
-void (*orig_evgl_api_glTranslatef)(GLfloat x, GLfloat y, GLfloat z);
-
-static void
-_evgl_api_thread_glTranslatef(void *data)
-{
-   EVGL_API_Thread_Command_glTranslatef *thread_data =
-      (EVGL_API_Thread_Command_glTranslatef *)data;
-
-   orig_evgl_api_glTranslatef(thread_data->x,
-                              thread_data->y,
-                              thread_data->z);
-
-}
-
-EAPI void
-glTranslatef_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTranslatef(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTranslatef thread_data_local;
-   EVGL_API_Thread_Command_glTranslatef *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTranslatef,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glAlphaFuncx(GLenum func, GLclampx ref);
- */
-
-typedef struct
-{
-   GLenum func;
-   GLclampx ref;
-
-} EVGL_API_Thread_Command_glAlphaFuncx;
-
-void (*orig_evgl_api_glAlphaFuncx)(GLenum func, GLclampx ref);
-
-static void
-_evgl_api_thread_glAlphaFuncx(void *data)
-{
-   EVGL_API_Thread_Command_glAlphaFuncx *thread_data =
-      (EVGL_API_Thread_Command_glAlphaFuncx *)data;
-
-   orig_evgl_api_glAlphaFuncx(thread_data->func,
-                              thread_data->ref);
-
-}
-
-EAPI void
-glAlphaFuncx_evgl_api_thread_cmd(GLenum func, GLclampx ref)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glAlphaFuncx(func, ref);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glAlphaFuncx thread_data_local;
-   EVGL_API_Thread_Command_glAlphaFuncx *thread_data = &thread_data_local;
-
-   thread_data->func = func;
-   thread_data->ref = ref;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glAlphaFuncx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
- */
-
-typedef struct
-{
-   GLclampx red;
-   GLclampx green;
-   GLclampx blue;
-   GLclampx alpha;
-
-} EVGL_API_Thread_Command_glClearColorx;
-
-void (*orig_evgl_api_glClearColorx)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-
-static void
-_evgl_api_thread_glClearColorx(void *data)
-{
-   EVGL_API_Thread_Command_glClearColorx *thread_data =
-      (EVGL_API_Thread_Command_glClearColorx *)data;
-
-   orig_evgl_api_glClearColorx(thread_data->red,
-                               thread_data->green,
-                               thread_data->blue,
-                               thread_data->alpha);
-
-}
-
-EAPI void
-glClearColorx_evgl_api_thread_cmd(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearColorx(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearColorx thread_data_local;
-   EVGL_API_Thread_Command_glClearColorx *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearColorx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearDepthx(GLclampx depth);
- */
-
-typedef struct
-{
-   GLclampx depth;
-
-} EVGL_API_Thread_Command_glClearDepthx;
-
-void (*orig_evgl_api_glClearDepthx)(GLclampx depth);
-
-static void
-_evgl_api_thread_glClearDepthx(void *data)
-{
-   EVGL_API_Thread_Command_glClearDepthx *thread_data =
-      (EVGL_API_Thread_Command_glClearDepthx *)data;
-
-   orig_evgl_api_glClearDepthx(thread_data->depth);
-
-}
-
-EAPI void
-glClearDepthx_evgl_api_thread_cmd(GLclampx depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearDepthx(depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearDepthx thread_data_local;
-   EVGL_API_Thread_Command_glClearDepthx *thread_data = &thread_data_local;
-
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearDepthx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClientActiveTexture(GLenum texture);
- */
-
-typedef struct
-{
-   GLenum texture;
-
-} EVGL_API_Thread_Command_glClientActiveTexture;
-
-void (*orig_evgl_api_glClientActiveTexture)(GLenum texture);
-
-static void
-_evgl_api_thread_glClientActiveTexture(void *data)
-{
-   EVGL_API_Thread_Command_glClientActiveTexture *thread_data =
-      (EVGL_API_Thread_Command_glClientActiveTexture *)data;
-
-   orig_evgl_api_glClientActiveTexture(thread_data->texture);
-
-}
-
-EAPI void
-glClientActiveTexture_evgl_api_thread_cmd(GLenum texture)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClientActiveTexture(texture);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClientActiveTexture thread_data_local;
-   EVGL_API_Thread_Command_glClientActiveTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClientActiveTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanex(GLenum plane, const GLfixed *equation);
- */
-
-typedef struct
-{
-   GLenum plane;
-   const GLfixed *equation;
-
-} EVGL_API_Thread_Command_glClipPlanex;
-
-void (*orig_evgl_api_glClipPlanex)(GLenum plane, const GLfixed *equation);
-
-static void
-_evgl_api_thread_glClipPlanex(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanex *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanex *)data;
-
-   orig_evgl_api_glClipPlanex(thread_data->plane,
-                              thread_data->equation);
-
-}
-
-EAPI void
-glClipPlanex_evgl_api_thread_cmd(GLenum plane, const GLfixed *equation)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanex(plane, equation);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanex thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanex *thread_data = &thread_data_local;
-
-   thread_data->plane = plane;
-   thread_data->equation = equation;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
- */
-
-typedef struct
-{
-   GLubyte red;
-   GLubyte green;
-   GLubyte blue;
-   GLubyte alpha;
-
-} EVGL_API_Thread_Command_glColor4ub;
-
-void (*orig_evgl_api_glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-
-static void
-_evgl_api_thread_glColor4ub(void *data)
-{
-   EVGL_API_Thread_Command_glColor4ub *thread_data =
-      (EVGL_API_Thread_Command_glColor4ub *)data;
-
-   orig_evgl_api_glColor4ub(thread_data->red,
-                            thread_data->green,
-                            thread_data->blue,
-                            thread_data->alpha);
-
-}
-
-EAPI void
-glColor4ub_evgl_api_thread_cmd(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColor4ub(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColor4ub thread_data_local;
-   EVGL_API_Thread_Command_glColor4ub *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColor4ub,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
- */
-
-typedef struct
-{
-   GLfixed red;
-   GLfixed green;
-   GLfixed blue;
-   GLfixed alpha;
-
-} EVGL_API_Thread_Command_glColor4x;
-
-void (*orig_evgl_api_glColor4x)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-
-static void
-_evgl_api_thread_glColor4x(void *data)
-{
-   EVGL_API_Thread_Command_glColor4x *thread_data =
-      (EVGL_API_Thread_Command_glColor4x *)data;
-
-   orig_evgl_api_glColor4x(thread_data->red,
-                           thread_data->green,
-                           thread_data->blue,
-                           thread_data->alpha);
-
-}
-
-EAPI void
-glColor4x_evgl_api_thread_cmd(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColor4x(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColor4x thread_data_local;
-   EVGL_API_Thread_Command_glColor4x *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColor4x,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glColorPointer;
-
-void (*orig_evgl_api_glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glColorPointer(void *data)
-{
-   EVGL_API_Thread_Command_glColorPointer *thread_data =
-      (EVGL_API_Thread_Command_glColorPointer *)data;
-
-   orig_evgl_api_glColorPointer(thread_data->size,
-                                thread_data->type,
-                                thread_data->stride,
-                                thread_data->pointer);
-
-}
-
-EAPI void
-glColorPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColorPointer(size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColorPointer thread_data_local;
-   EVGL_API_Thread_Command_glColorPointer *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColorPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthRangex(GLclampx zNear, GLclampx zFar);
- */
-
-typedef struct
-{
-   GLclampx zNear;
-   GLclampx zFar;
-
-} EVGL_API_Thread_Command_glDepthRangex;
-
-void (*orig_evgl_api_glDepthRangex)(GLclampx zNear, GLclampx zFar);
-
-static void
-_evgl_api_thread_glDepthRangex(void *data)
-{
-   EVGL_API_Thread_Command_glDepthRangex *thread_data =
-      (EVGL_API_Thread_Command_glDepthRangex *)data;
-
-   orig_evgl_api_glDepthRangex(thread_data->zNear,
-                               thread_data->zFar);
-
-}
-
-EAPI void
-glDepthRangex_evgl_api_thread_cmd(GLclampx zNear, GLclampx zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthRangex(zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthRangex thread_data_local;
-   EVGL_API_Thread_Command_glDepthRangex *thread_data = &thread_data_local;
-
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthRangex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisableClientState(GLenum array);
- */
-
-typedef struct
-{
-   GLenum array;
-
-} EVGL_API_Thread_Command_glDisableClientState;
-
-void (*orig_evgl_api_glDisableClientState)(GLenum array);
-
-static void
-_evgl_api_thread_glDisableClientState(void *data)
-{
-   EVGL_API_Thread_Command_glDisableClientState *thread_data =
-      (EVGL_API_Thread_Command_glDisableClientState *)data;
-
-   orig_evgl_api_glDisableClientState(thread_data->array);
-
-}
-
-EAPI void
-glDisableClientState_evgl_api_thread_cmd(GLenum array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDisableClientState(array);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDisableClientState thread_data_local;
-   EVGL_API_Thread_Command_glDisableClientState *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDisableClientState,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnableClientState(GLenum array);
- */
-
-typedef struct
-{
-   GLenum array;
-
-} EVGL_API_Thread_Command_glEnableClientState;
-
-void (*orig_evgl_api_glEnableClientState)(GLenum array);
-
-static void
-_evgl_api_thread_glEnableClientState(void *data)
-{
-   EVGL_API_Thread_Command_glEnableClientState *thread_data =
-      (EVGL_API_Thread_Command_glEnableClientState *)data;
-
-   orig_evgl_api_glEnableClientState(thread_data->array);
-
-}
-
-EAPI void
-glEnableClientState_evgl_api_thread_cmd(GLenum array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEnableClientState(array);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEnableClientState thread_data_local;
-   EVGL_API_Thread_Command_glEnableClientState *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEnableClientState,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogx(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glFogx;
-
-void (*orig_evgl_api_glFogx)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glFogx(void *data)
-{
-   EVGL_API_Thread_Command_glFogx *thread_data =
-      (EVGL_API_Thread_Command_glFogx *)data;
-
-   orig_evgl_api_glFogx(thread_data->pname,
-                        thread_data->param);
-
-}
-
-EAPI void
-glFogx_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogx(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogx thread_data_local;
-   EVGL_API_Thread_Command_glFogx *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogxv(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glFogxv;
-
-void (*orig_evgl_api_glFogxv)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glFogxv(void *data)
-{
-   EVGL_API_Thread_Command_glFogxv *thread_data =
-      (EVGL_API_Thread_Command_glFogxv *)data;
-
-   orig_evgl_api_glFogxv(thread_data->pname,
-                         thread_data->params);
-
-}
-
-EAPI void
-glFogxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogxv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogxv thread_data_local;
-   EVGL_API_Thread_Command_glFogxv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
- */
-
-typedef struct
-{
-   GLfixed left;
-   GLfixed right;
-   GLfixed bottom;
-   GLfixed top;
-   GLfixed zNear;
-   GLfixed zFar;
-
-} EVGL_API_Thread_Command_glFrustumx;
-
-void (*orig_evgl_api_glFrustumx)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-static void
-_evgl_api_thread_glFrustumx(void *data)
-{
-   EVGL_API_Thread_Command_glFrustumx *thread_data =
-      (EVGL_API_Thread_Command_glFrustumx *)data;
-
-   orig_evgl_api_glFrustumx(thread_data->left,
-                            thread_data->right,
-                            thread_data->bottom,
-                            thread_data->top,
-                            thread_data->zNear,
-                            thread_data->zFar);
-
-}
-
-EAPI void
-glFrustumx_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFrustumx(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFrustumx thread_data_local;
-   EVGL_API_Thread_Command_glFrustumx *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFrustumx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetClipPlanex(GLenum pname, GLfixed eqn[4]);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed eqn[4];
-
-} EVGL_API_Thread_Command_glGetClipPlanex;
-
-void (*orig_evgl_api_glGetClipPlanex)(GLenum pname, GLfixed eqn[4]);
-
-static void
-_evgl_api_thread_glGetClipPlanex(void *data)
-{
-   EVGL_API_Thread_Command_glGetClipPlanex *thread_data =
-      (EVGL_API_Thread_Command_glGetClipPlanex *)data;
-
-   orig_evgl_api_glGetClipPlanex(thread_data->pname,
-                                 thread_data->eqn);
-
-}
-
-EAPI void
-glGetClipPlanex_evgl_api_thread_cmd(GLenum pname, GLfixed eqn[4])
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetClipPlanex(pname, eqn);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetClipPlanex thread_data_local;
-   EVGL_API_Thread_Command_glGetClipPlanex *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   memcpy(thread_data->eqn, &eqn, sizeof(GLfixed) * 4);
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetClipPlanex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFixedv(GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetFixedv;
-
-void (*orig_evgl_api_glGetFixedv)(GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetFixedv(void *data)
-{
-   EVGL_API_Thread_Command_glGetFixedv *thread_data =
-      (EVGL_API_Thread_Command_glGetFixedv *)data;
-
-   orig_evgl_api_glGetFixedv(thread_data->pname,
-                             thread_data->params);
-
-}
-
-EAPI void
-glGetFixedv_evgl_api_thread_cmd(GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFixedv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFixedv thread_data_local;
-   EVGL_API_Thread_Command_glGetFixedv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFixedv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetLightxv(GLenum light, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetLightxv;
-
-void (*orig_evgl_api_glGetLightxv)(GLenum light, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetLightxv(void *data)
-{
-   EVGL_API_Thread_Command_glGetLightxv *thread_data =
-      (EVGL_API_Thread_Command_glGetLightxv *)data;
-
-   orig_evgl_api_glGetLightxv(thread_data->light,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glGetLightxv_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetLightxv(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetLightxv thread_data_local;
-   EVGL_API_Thread_Command_glGetLightxv *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetLightxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetMaterialxv;
-
-void (*orig_evgl_api_glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetMaterialxv(void *data)
-{
-   EVGL_API_Thread_Command_glGetMaterialxv *thread_data =
-      (EVGL_API_Thread_Command_glGetMaterialxv *)data;
-
-   orig_evgl_api_glGetMaterialxv(thread_data->face,
-                                 thread_data->pname,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetMaterialxv_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetMaterialxv(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetMaterialxv thread_data_local;
-   EVGL_API_Thread_Command_glGetMaterialxv *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetMaterialxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetPointerv(GLenum pname, GLvoid **params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLvoid **params;
-
-} EVGL_API_Thread_Command_glGetPointerv;
-
-void (*orig_evgl_api_glGetPointerv)(GLenum pname, GLvoid **params);
-
-static void
-_evgl_api_thread_glGetPointerv(void *data)
-{
-   EVGL_API_Thread_Command_glGetPointerv *thread_data =
-      (EVGL_API_Thread_Command_glGetPointerv *)data;
-
-   orig_evgl_api_glGetPointerv(thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetPointerv_evgl_api_thread_cmd(GLenum pname, GLvoid **params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetPointerv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetPointerv thread_data_local;
-   EVGL_API_Thread_Command_glGetPointerv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetPointerv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexEnviv(GLenum env, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum env;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetTexEnviv;
-
-void (*orig_evgl_api_glGetTexEnviv)(GLenum env, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetTexEnviv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexEnviv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexEnviv *)data;
-
-   orig_evgl_api_glGetTexEnviv(thread_data->env,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetTexEnviv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexEnviv(env, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexEnviv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexEnviv *thread_data = &thread_data_local;
-
-   thread_data->env = env;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexEnviv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum env;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetTexEnvxv;
-
-void (*orig_evgl_api_glGetTexEnvxv)(GLenum env, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetTexEnvxv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexEnvxv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexEnvxv *)data;
-
-   orig_evgl_api_glGetTexEnvxv(thread_data->env,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glGetTexEnvxv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexEnvxv(env, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexEnvxv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexEnvxv *thread_data = &thread_data_local;
-
-   thread_data->env = env;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexEnvxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetTexParameterxv;
-
-void (*orig_evgl_api_glGetTexParameterxv)(GLenum target, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetTexParameterxv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameterxv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameterxv *)data;
-
-   orig_evgl_api_glGetTexParameterxv(thread_data->target,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameterxv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameterxv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameterxv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameterxv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameterxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelx(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glLightModelx;
-
-void (*orig_evgl_api_glLightModelx)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glLightModelx(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelx *thread_data =
-      (EVGL_API_Thread_Command_glLightModelx *)data;
-
-   orig_evgl_api_glLightModelx(thread_data->pname,
-                               thread_data->param);
-
-}
-
-EAPI void
-glLightModelx_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelx(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelx thread_data_local;
-   EVGL_API_Thread_Command_glLightModelx *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelxv(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glLightModelxv;
-
-void (*orig_evgl_api_glLightModelxv)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glLightModelxv(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelxv *thread_data =
-      (EVGL_API_Thread_Command_glLightModelxv *)data;
-
-   orig_evgl_api_glLightModelxv(thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glLightModelxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelxv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelxv thread_data_local;
-   EVGL_API_Thread_Command_glLightModelxv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightx(GLenum light, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glLightx;
-
-void (*orig_evgl_api_glLightx)(GLenum light, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glLightx(void *data)
-{
-   EVGL_API_Thread_Command_glLightx *thread_data =
-      (EVGL_API_Thread_Command_glLightx *)data;
-
-   orig_evgl_api_glLightx(thread_data->light,
-                          thread_data->pname,
-                          thread_data->param);
-
-}
-
-EAPI void
-glLightx_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightx(light, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightx thread_data_local;
-   EVGL_API_Thread_Command_glLightx *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightxv(GLenum light, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glLightxv;
-
-void (*orig_evgl_api_glLightxv)(GLenum light, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glLightxv(void *data)
-{
-   EVGL_API_Thread_Command_glLightxv *thread_data =
-      (EVGL_API_Thread_Command_glLightxv *)data;
-
-   orig_evgl_api_glLightxv(thread_data->light,
-                           thread_data->pname,
-                           thread_data->params);
-
-}
-
-EAPI void
-glLightxv_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightxv(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightxv thread_data_local;
-   EVGL_API_Thread_Command_glLightxv *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLineWidthx(GLfixed width);
- */
-
-typedef struct
-{
-   GLfixed width;
-
-} EVGL_API_Thread_Command_glLineWidthx;
-
-void (*orig_evgl_api_glLineWidthx)(GLfixed width);
-
-static void
-_evgl_api_thread_glLineWidthx(void *data)
-{
-   EVGL_API_Thread_Command_glLineWidthx *thread_data =
-      (EVGL_API_Thread_Command_glLineWidthx *)data;
-
-   orig_evgl_api_glLineWidthx(thread_data->width);
-
-}
-
-EAPI void
-glLineWidthx_evgl_api_thread_cmd(GLfixed width)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLineWidthx(width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLineWidthx thread_data_local;
-   EVGL_API_Thread_Command_glLineWidthx *thread_data = &thread_data_local;
-
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLineWidthx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLoadIdentity(void);
- */
-
-void (*orig_evgl_api_glLoadIdentity)(void);
-
-static void
-_evgl_api_thread_glLoadIdentity(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glLoadIdentity();
-
-}
-
-EAPI void
-glLoadIdentity_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLoadIdentity();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLoadIdentity,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glLoadMatrixx(const GLfixed *m);
- */
-
-typedef struct
-{
-   const GLfixed *m;
-
-} EVGL_API_Thread_Command_glLoadMatrixx;
-
-void (*orig_evgl_api_glLoadMatrixx)(const GLfixed *m);
-
-static void
-_evgl_api_thread_glLoadMatrixx(void *data)
-{
-   EVGL_API_Thread_Command_glLoadMatrixx *thread_data =
-      (EVGL_API_Thread_Command_glLoadMatrixx *)data;
-
-   orig_evgl_api_glLoadMatrixx(thread_data->m);
-
-}
-
-EAPI void
-glLoadMatrixx_evgl_api_thread_cmd(const GLfixed *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLoadMatrixx(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLoadMatrixx thread_data_local;
-   EVGL_API_Thread_Command_glLoadMatrixx *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLoadMatrixx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLogicOp(GLenum opcode);
- */
-
-typedef struct
-{
-   GLenum opcode;
-
-} EVGL_API_Thread_Command_glLogicOp;
-
-void (*orig_evgl_api_glLogicOp)(GLenum opcode);
-
-static void
-_evgl_api_thread_glLogicOp(void *data)
-{
-   EVGL_API_Thread_Command_glLogicOp *thread_data =
-      (EVGL_API_Thread_Command_glLogicOp *)data;
-
-   orig_evgl_api_glLogicOp(thread_data->opcode);
-
-}
-
-EAPI void
-glLogicOp_evgl_api_thread_cmd(GLenum opcode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLogicOp(opcode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLogicOp thread_data_local;
-   EVGL_API_Thread_Command_glLogicOp *thread_data = &thread_data_local;
-
-   thread_data->opcode = opcode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLogicOp,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialx(GLenum face, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glMaterialx;
-
-void (*orig_evgl_api_glMaterialx)(GLenum face, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glMaterialx(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialx *thread_data =
-      (EVGL_API_Thread_Command_glMaterialx *)data;
-
-   orig_evgl_api_glMaterialx(thread_data->face,
-                             thread_data->pname,
-                             thread_data->param);
-
-}
-
-EAPI void
-glMaterialx_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialx(face, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialx thread_data_local;
-   EVGL_API_Thread_Command_glMaterialx *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialxv(GLenum face, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glMaterialxv;
-
-void (*orig_evgl_api_glMaterialxv)(GLenum face, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glMaterialxv(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialxv *thread_data =
-      (EVGL_API_Thread_Command_glMaterialxv *)data;
-
-   orig_evgl_api_glMaterialxv(thread_data->face,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glMaterialxv_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialxv(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialxv thread_data_local;
-   EVGL_API_Thread_Command_glMaterialxv *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMatrixMode(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glMatrixMode;
-
-void (*orig_evgl_api_glMatrixMode)(GLenum mode);
-
-static void
-_evgl_api_thread_glMatrixMode(void *data)
-{
-   EVGL_API_Thread_Command_glMatrixMode *thread_data =
-      (EVGL_API_Thread_Command_glMatrixMode *)data;
-
-   orig_evgl_api_glMatrixMode(thread_data->mode);
-
-}
-
-EAPI void
-glMatrixMode_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMatrixMode(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMatrixMode thread_data_local;
-   EVGL_API_Thread_Command_glMatrixMode *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMatrixMode,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultMatrixx(const GLfixed *m);
- */
-
-typedef struct
-{
-   const GLfixed *m;
-
-} EVGL_API_Thread_Command_glMultMatrixx;
-
-void (*orig_evgl_api_glMultMatrixx)(const GLfixed *m);
-
-static void
-_evgl_api_thread_glMultMatrixx(void *data)
-{
-   EVGL_API_Thread_Command_glMultMatrixx *thread_data =
-      (EVGL_API_Thread_Command_glMultMatrixx *)data;
-
-   orig_evgl_api_glMultMatrixx(thread_data->m);
-
-}
-
-EAPI void
-glMultMatrixx_evgl_api_thread_cmd(const GLfixed *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultMatrixx(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultMatrixx thread_data_local;
-   EVGL_API_Thread_Command_glMultMatrixx *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultMatrixx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLfixed s;
-   GLfixed t;
-   GLfixed r;
-   GLfixed q;
-
-} EVGL_API_Thread_Command_glMultiTexCoord4x;
-
-void (*orig_evgl_api_glMultiTexCoord4x)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-
-static void
-_evgl_api_thread_glMultiTexCoord4x(void *data)
-{
-   EVGL_API_Thread_Command_glMultiTexCoord4x *thread_data =
-      (EVGL_API_Thread_Command_glMultiTexCoord4x *)data;
-
-   orig_evgl_api_glMultiTexCoord4x(thread_data->target,
-                                   thread_data->s,
-                                   thread_data->t,
-                                   thread_data->r,
-                                   thread_data->q);
-
-}
-
-EAPI void
-glMultiTexCoord4x_evgl_api_thread_cmd(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiTexCoord4x(target, s, t, r, q);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiTexCoord4x thread_data_local;
-   EVGL_API_Thread_Command_glMultiTexCoord4x *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->s = s;
-   thread_data->t = t;
-   thread_data->r = r;
-   thread_data->q = q;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiTexCoord4x,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz);
- */
-
-typedef struct
-{
-   GLfixed nx;
-   GLfixed ny;
-   GLfixed nz;
-
-} EVGL_API_Thread_Command_glNormal3x;
-
-void (*orig_evgl_api_glNormal3x)(GLfixed nx, GLfixed ny, GLfixed nz);
-
-static void
-_evgl_api_thread_glNormal3x(void *data)
-{
-   EVGL_API_Thread_Command_glNormal3x *thread_data =
-      (EVGL_API_Thread_Command_glNormal3x *)data;
-
-   orig_evgl_api_glNormal3x(thread_data->nx,
-                            thread_data->ny,
-                            thread_data->nz);
-
-}
-
-EAPI void
-glNormal3x_evgl_api_thread_cmd(GLfixed nx, GLfixed ny, GLfixed nz)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glNormal3x(nx, ny, nz);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glNormal3x thread_data_local;
-   EVGL_API_Thread_Command_glNormal3x *thread_data = &thread_data_local;
-
-   thread_data->nx = nx;
-   thread_data->ny = ny;
-   thread_data->nz = nz;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glNormal3x,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glNormalPointer;
-
-void (*orig_evgl_api_glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glNormalPointer(void *data)
-{
-   EVGL_API_Thread_Command_glNormalPointer *thread_data =
-      (EVGL_API_Thread_Command_glNormalPointer *)data;
-
-   orig_evgl_api_glNormalPointer(thread_data->type,
-                                 thread_data->stride,
-                                 thread_data->pointer);
-
-}
-
-EAPI void
-glNormalPointer_evgl_api_thread_cmd(GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glNormalPointer(type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glNormalPointer thread_data_local;
-   EVGL_API_Thread_Command_glNormalPointer *thread_data = &thread_data_local;
-
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glNormalPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
- */
-
-typedef struct
-{
-   GLfixed left;
-   GLfixed right;
-   GLfixed bottom;
-   GLfixed top;
-   GLfixed zNear;
-   GLfixed zFar;
-
-} EVGL_API_Thread_Command_glOrthox;
-
-void (*orig_evgl_api_glOrthox)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-static void
-_evgl_api_thread_glOrthox(void *data)
-{
-   EVGL_API_Thread_Command_glOrthox *thread_data =
-      (EVGL_API_Thread_Command_glOrthox *)data;
-
-   orig_evgl_api_glOrthox(thread_data->left,
-                          thread_data->right,
-                          thread_data->bottom,
-                          thread_data->top,
-                          thread_data->zNear,
-                          thread_data->zFar);
-
-}
-
-EAPI void
-glOrthox_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glOrthox(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glOrthox thread_data_local;
-   EVGL_API_Thread_Command_glOrthox *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glOrthox,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterx(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glPointParameterx;
-
-void (*orig_evgl_api_glPointParameterx)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glPointParameterx(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterx *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterx *)data;
-
-   orig_evgl_api_glPointParameterx(thread_data->pname,
-                                   thread_data->param);
-
-}
-
-EAPI void
-glPointParameterx_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterx(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterx thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterx *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterxv(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glPointParameterxv;
-
-void (*orig_evgl_api_glPointParameterxv)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glPointParameterxv(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterxv *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterxv *)data;
-
-   orig_evgl_api_glPointParameterxv(thread_data->pname,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glPointParameterxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterxv(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterxv thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterxv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointSizex(GLfixed size);
- */
-
-typedef struct
-{
-   GLfixed size;
-
-} EVGL_API_Thread_Command_glPointSizex;
-
-void (*orig_evgl_api_glPointSizex)(GLfixed size);
-
-static void
-_evgl_api_thread_glPointSizex(void *data)
-{
-   EVGL_API_Thread_Command_glPointSizex *thread_data =
-      (EVGL_API_Thread_Command_glPointSizex *)data;
-
-   orig_evgl_api_glPointSizex(thread_data->size);
-
-}
-
-EAPI void
-glPointSizex_evgl_api_thread_cmd(GLfixed size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointSizex(size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointSizex thread_data_local;
-   EVGL_API_Thread_Command_glPointSizex *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointSizex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPolygonOffsetx(GLfixed factor, GLfixed units);
- */
-
-typedef struct
-{
-   GLfixed factor;
-   GLfixed units;
-
-} EVGL_API_Thread_Command_glPolygonOffsetx;
-
-void (*orig_evgl_api_glPolygonOffsetx)(GLfixed factor, GLfixed units);
-
-static void
-_evgl_api_thread_glPolygonOffsetx(void *data)
-{
-   EVGL_API_Thread_Command_glPolygonOffsetx *thread_data =
-      (EVGL_API_Thread_Command_glPolygonOffsetx *)data;
-
-   orig_evgl_api_glPolygonOffsetx(thread_data->factor,
-                                  thread_data->units);
-
-}
-
-EAPI void
-glPolygonOffsetx_evgl_api_thread_cmd(GLfixed factor, GLfixed units)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPolygonOffsetx(factor, units);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPolygonOffsetx thread_data_local;
-   EVGL_API_Thread_Command_glPolygonOffsetx *thread_data = &thread_data_local;
-
-   thread_data->factor = factor;
-   thread_data->units = units;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPolygonOffsetx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPopMatrix(void);
- */
-
-void (*orig_evgl_api_glPopMatrix)(void);
-
-static void
-_evgl_api_thread_glPopMatrix(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glPopMatrix();
-
-}
-
-EAPI void
-glPopMatrix_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPopMatrix();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPopMatrix,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glPushMatrix(void);
- */
-
-void (*orig_evgl_api_glPushMatrix)(void);
-
-static void
-_evgl_api_thread_glPushMatrix(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glPushMatrix();
-
-}
-
-EAPI void
-glPushMatrix_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPushMatrix();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPushMatrix,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed angle;
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glRotatex;
-
-void (*orig_evgl_api_glRotatex)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glRotatex(void *data)
-{
-   EVGL_API_Thread_Command_glRotatex *thread_data =
-      (EVGL_API_Thread_Command_glRotatex *)data;
-
-   orig_evgl_api_glRotatex(thread_data->angle,
-                           thread_data->x,
-                           thread_data->y,
-                           thread_data->z);
-
-}
-
-EAPI void
-glRotatex_evgl_api_thread_cmd(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRotatex(angle, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRotatex thread_data_local;
-   EVGL_API_Thread_Command_glRotatex *thread_data = &thread_data_local;
-
-   thread_data->angle = angle;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRotatex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSampleCoveragex(GLclampx value, GLboolean invert);
- */
-
-typedef struct
-{
-   GLclampx value;
-   GLboolean invert;
-
-} EVGL_API_Thread_Command_glSampleCoveragex;
-
-void (*orig_evgl_api_glSampleCoveragex)(GLclampx value, GLboolean invert);
-
-static void
-_evgl_api_thread_glSampleCoveragex(void *data)
-{
-   EVGL_API_Thread_Command_glSampleCoveragex *thread_data =
-      (EVGL_API_Thread_Command_glSampleCoveragex *)data;
-
-   orig_evgl_api_glSampleCoveragex(thread_data->value,
-                                   thread_data->invert);
-
-}
-
-EAPI void
-glSampleCoveragex_evgl_api_thread_cmd(GLclampx value, GLboolean invert)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSampleCoveragex(value, invert);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSampleCoveragex thread_data_local;
-   EVGL_API_Thread_Command_glSampleCoveragex *thread_data = &thread_data_local;
-
-   thread_data->value = value;
-   thread_data->invert = invert;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSampleCoveragex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glScalex(GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glScalex;
-
-void (*orig_evgl_api_glScalex)(GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glScalex(void *data)
-{
-   EVGL_API_Thread_Command_glScalex *thread_data =
-      (EVGL_API_Thread_Command_glScalex *)data;
-
-   orig_evgl_api_glScalex(thread_data->x,
-                          thread_data->y,
-                          thread_data->z);
-
-}
-
-EAPI void
-glScalex_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glScalex(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glScalex thread_data_local;
-   EVGL_API_Thread_Command_glScalex *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glScalex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glShadeModel(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glShadeModel;
-
-void (*orig_evgl_api_glShadeModel)(GLenum mode);
-
-static void
-_evgl_api_thread_glShadeModel(void *data)
-{
-   EVGL_API_Thread_Command_glShadeModel *thread_data =
-      (EVGL_API_Thread_Command_glShadeModel *)data;
-
-   orig_evgl_api_glShadeModel(thread_data->mode);
-
-}
-
-EAPI void
-glShadeModel_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glShadeModel(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glShadeModel thread_data_local;
-   EVGL_API_Thread_Command_glShadeModel *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glShadeModel,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glTexCoordPointer;
-
-void (*orig_evgl_api_glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glTexCoordPointer(void *data)
-{
-   EVGL_API_Thread_Command_glTexCoordPointer *thread_data =
-      (EVGL_API_Thread_Command_glTexCoordPointer *)data;
-
-   orig_evgl_api_glTexCoordPointer(thread_data->size,
-                                   thread_data->type,
-                                   thread_data->stride,
-                                   thread_data->pointer);
-
-}
-
-EAPI void
-glTexCoordPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexCoordPointer(size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexCoordPointer thread_data_local;
-   EVGL_API_Thread_Command_glTexCoordPointer *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexCoordPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvi(GLenum target, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint param;
-
-} EVGL_API_Thread_Command_glTexEnvi;
-
-void (*orig_evgl_api_glTexEnvi)(GLenum target, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glTexEnvi(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvi *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvi *)data;
-
-   orig_evgl_api_glTexEnvi(thread_data->target,
-                           thread_data->pname,
-                           thread_data->param);
-
-}
-
-EAPI void
-glTexEnvi_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvi(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvi thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvi *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvi,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvx(GLenum target, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glTexEnvx;
-
-void (*orig_evgl_api_glTexEnvx)(GLenum target, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glTexEnvx(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvx *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvx *)data;
-
-   orig_evgl_api_glTexEnvx(thread_data->target,
-                           thread_data->pname,
-                           thread_data->param);
-
-}
-
-EAPI void
-glTexEnvx_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvx(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvx thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvx *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnviv(GLenum target, GLenum pname, const GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLint *params;
-
-} EVGL_API_Thread_Command_glTexEnviv;
-
-void (*orig_evgl_api_glTexEnviv)(GLenum target, GLenum pname, const GLint *params);
-
-static void
-_evgl_api_thread_glTexEnviv(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnviv *thread_data =
-      (EVGL_API_Thread_Command_glTexEnviv *)data;
-
-   orig_evgl_api_glTexEnviv(thread_data->target,
-                            thread_data->pname,
-                            thread_data->params);
-
-}
-
-EAPI void
-glTexEnviv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnviv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnviv thread_data_local;
-   EVGL_API_Thread_Command_glTexEnviv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnviv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glTexEnvxv;
-
-void (*orig_evgl_api_glTexEnvxv)(GLenum target, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glTexEnvxv(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvxv *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvxv *)data;
-
-   orig_evgl_api_glTexEnvxv(thread_data->target,
-                            thread_data->pname,
-                            thread_data->params);
-
-}
-
-EAPI void
-glTexEnvxv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvxv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvxv thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvxv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterx(GLenum target, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glTexParameterx;
-
-void (*orig_evgl_api_glTexParameterx)(GLenum target, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glTexParameterx(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterx *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterx *)data;
-
-   orig_evgl_api_glTexParameterx(thread_data->target,
-                                 thread_data->pname,
-                                 thread_data->param);
-
-}
-
-EAPI void
-glTexParameterx_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterx(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterx thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterx *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterx,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glTexParameterxv;
-
-void (*orig_evgl_api_glTexParameterxv)(GLenum target, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glTexParameterxv(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterxv *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterxv *)data;
-
-   orig_evgl_api_glTexParameterxv(thread_data->target,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glTexParameterxv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterxv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterxv thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterxv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterxv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTranslatex(GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glTranslatex;
-
-void (*orig_evgl_api_glTranslatex)(GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glTranslatex(void *data)
-{
-   EVGL_API_Thread_Command_glTranslatex *thread_data =
-      (EVGL_API_Thread_Command_glTranslatex *)data;
-
-   orig_evgl_api_glTranslatex(thread_data->x,
-                              thread_data->y,
-                              thread_data->z);
-
-}
-
-EAPI void
-glTranslatex_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTranslatex(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTranslatex thread_data_local;
-   EVGL_API_Thread_Command_glTranslatex *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTranslatex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glVertexPointer;
-
-void (*orig_evgl_api_glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glVertexPointer(void *data)
-{
-   EVGL_API_Thread_Command_glVertexPointer *thread_data =
-      (EVGL_API_Thread_Command_glVertexPointer *)data;
-
-   orig_evgl_api_glVertexPointer(thread_data->size,
-                                 thread_data->type,
-                                 thread_data->stride,
-                                 thread_data->pointer);
-
-}
-
-EAPI void
-glVertexPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexPointer(size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexPointer thread_data_local;
-   EVGL_API_Thread_Command_glVertexPointer *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquationSeparateOES(GLenum modeRGB, GLenum modeAlpha);
- */
-
-typedef struct
-{
-   GLenum modeRGB;
-   GLenum modeAlpha;
-
-} EVGL_API_Thread_Command_glBlendEquationSeparateOES;
-
-void (*orig_evgl_api_glBlendEquationSeparateOES)(GLenum modeRGB, GLenum modeAlpha);
-
-static void
-_evgl_api_thread_glBlendEquationSeparateOES(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquationSeparateOES *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquationSeparateOES *)data;
-
-   orig_evgl_api_glBlendEquationSeparateOES(thread_data->modeRGB,
-                                            thread_data->modeAlpha);
-
-}
-
-EAPI void
-glBlendEquationSeparateOES_evgl_api_thread_cmd(GLenum modeRGB, GLenum modeAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquationSeparateOES(modeRGB, modeAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquationSeparateOES thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquationSeparateOES *thread_data = &thread_data_local;
-
-   thread_data->modeRGB = modeRGB;
-   thread_data->modeAlpha = modeAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquationSeparateOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- */
-
-typedef struct
-{
-   GLenum srcRGB;
-   GLenum dstRGB;
-   GLenum srcAlpha;
-   GLenum dstAlpha;
-
-} EVGL_API_Thread_Command_glBlendFuncSeparateOES;
-
-void (*orig_evgl_api_glBlendFuncSeparateOES)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-static void
-_evgl_api_thread_glBlendFuncSeparateOES(void *data)
-{
-   EVGL_API_Thread_Command_glBlendFuncSeparateOES *thread_data =
-      (EVGL_API_Thread_Command_glBlendFuncSeparateOES *)data;
-
-   orig_evgl_api_glBlendFuncSeparateOES(thread_data->srcRGB,
-                                        thread_data->dstRGB,
-                                        thread_data->srcAlpha,
-                                        thread_data->dstAlpha);
-
-}
-
-EAPI void
-glBlendFuncSeparateOES_evgl_api_thread_cmd(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendFuncSeparateOES(srcRGB, dstRGB, srcAlpha, dstAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendFuncSeparateOES thread_data_local;
-   EVGL_API_Thread_Command_glBlendFuncSeparateOES *thread_data = &thread_data_local;
-
-   thread_data->srcRGB = srcRGB;
-   thread_data->dstRGB = dstRGB;
-   thread_data->srcAlpha = srcAlpha;
-   thread_data->dstAlpha = dstAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendFuncSeparateOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquationOES(GLenum mode);
- */
-
-typedef struct
-{
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glBlendEquationOES;
-
-void (*orig_evgl_api_glBlendEquationOES)(GLenum mode);
-
-static void
-_evgl_api_thread_glBlendEquationOES(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquationOES *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquationOES *)data;
-
-   orig_evgl_api_glBlendEquationOES(thread_data->mode);
-
-}
-
-EAPI void
-glBlendEquationOES_evgl_api_thread_cmd(GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquationOES(mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquationOES thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquationOES *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquationOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
- */
-
-typedef struct
-{
-   GLshort x;
-   GLshort y;
-   GLshort z;
-   GLshort width;
-   GLshort height;
-
-} EVGL_API_Thread_Command_glDrawTexsOES;
-
-void (*orig_evgl_api_glDrawTexsOES)(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
-
-static void
-_evgl_api_thread_glDrawTexsOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexsOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexsOES *)data;
-
-   orig_evgl_api_glDrawTexsOES(thread_data->x,
-                               thread_data->y,
-                               thread_data->z,
-                               thread_data->width,
-                               thread_data->height);
-
-}
-
-EAPI void
-glDrawTexsOES_evgl_api_thread_cmd(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexsOES(x, y, z, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexsOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexsOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexsOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLint z;
-   GLint width;
-   GLint height;
-
-} EVGL_API_Thread_Command_glDrawTexiOES;
-
-void (*orig_evgl_api_glDrawTexiOES)(GLint x, GLint y, GLint z, GLint width, GLint height);
-
-static void
-_evgl_api_thread_glDrawTexiOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexiOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexiOES *)data;
-
-   orig_evgl_api_glDrawTexiOES(thread_data->x,
-                               thread_data->y,
-                               thread_data->z,
-                               thread_data->width,
-                               thread_data->height);
-
-}
-
-EAPI void
-glDrawTexiOES_evgl_api_thread_cmd(GLint x, GLint y, GLint z, GLint width, GLint height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexiOES(x, y, z, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexiOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexiOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexiOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
- */
-
-typedef struct
-{
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-   GLfixed width;
-   GLfixed height;
-
-} EVGL_API_Thread_Command_glDrawTexxOES;
-
-void (*orig_evgl_api_glDrawTexxOES)(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
-
-static void
-_evgl_api_thread_glDrawTexxOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexxOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexxOES *)data;
-
-   orig_evgl_api_glDrawTexxOES(thread_data->x,
-                               thread_data->y,
-                               thread_data->z,
-                               thread_data->width,
-                               thread_data->height);
-
-}
-
-EAPI void
-glDrawTexxOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexxOES(x, y, z, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexxOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexxOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexsvOES(const GLshort *coords);
- */
-
-typedef struct
-{
-   const GLshort *coords;
-
-} EVGL_API_Thread_Command_glDrawTexsvOES;
-
-void (*orig_evgl_api_glDrawTexsvOES)(const GLshort *coords);
-
-static void
-_evgl_api_thread_glDrawTexsvOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexsvOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexsvOES *)data;
-
-   orig_evgl_api_glDrawTexsvOES(thread_data->coords);
-
-}
-
-EAPI void
-glDrawTexsvOES_evgl_api_thread_cmd(const GLshort *coords)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexsvOES(coords);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexsvOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexsvOES *thread_data = &thread_data_local;
-
-   thread_data->coords = coords;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexsvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexivOES(const GLint *coords);
- */
-
-typedef struct
-{
-   const GLint *coords;
-
-} EVGL_API_Thread_Command_glDrawTexivOES;
-
-void (*orig_evgl_api_glDrawTexivOES)(const GLint *coords);
-
-static void
-_evgl_api_thread_glDrawTexivOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexivOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexivOES *)data;
-
-   orig_evgl_api_glDrawTexivOES(thread_data->coords);
-
-}
-
-EAPI void
-glDrawTexivOES_evgl_api_thread_cmd(const GLint *coords)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexivOES(coords);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexivOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexivOES *thread_data = &thread_data_local;
-
-   thread_data->coords = coords;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexivOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexxvOES(const GLfixed *coords);
- */
-
-typedef struct
-{
-   const GLfixed *coords;
-
-} EVGL_API_Thread_Command_glDrawTexxvOES;
-
-void (*orig_evgl_api_glDrawTexxvOES)(const GLfixed *coords);
-
-static void
-_evgl_api_thread_glDrawTexxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexxvOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexxvOES *)data;
-
-   orig_evgl_api_glDrawTexxvOES(thread_data->coords);
-
-}
-
-EAPI void
-glDrawTexxvOES_evgl_api_thread_cmd(const GLfixed *coords)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexxvOES(coords);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexxvOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexxvOES *thread_data = &thread_data_local;
-
-   thread_data->coords = coords;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
- */
-
-typedef struct
-{
-   GLfloat x;
-   GLfloat y;
-   GLfloat z;
-   GLfloat width;
-   GLfloat height;
-
-} EVGL_API_Thread_Command_glDrawTexfOES;
-
-void (*orig_evgl_api_glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
-
-static void
-_evgl_api_thread_glDrawTexfOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexfOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexfOES *)data;
-
-   orig_evgl_api_glDrawTexfOES(thread_data->x,
-                               thread_data->y,
-                               thread_data->z,
-                               thread_data->width,
-                               thread_data->height);
-
-}
-
-EAPI void
-glDrawTexfOES_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexfOES(x, y, z, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexfOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexfOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexfOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawTexfvOES(const GLfloat *coords);
- */
-
-typedef struct
-{
-   const GLfloat *coords;
-
-} EVGL_API_Thread_Command_glDrawTexfvOES;
-
-void (*orig_evgl_api_glDrawTexfvOES)(const GLfloat *coords);
-
-static void
-_evgl_api_thread_glDrawTexfvOES(void *data)
-{
-   EVGL_API_Thread_Command_glDrawTexfvOES *thread_data =
-      (EVGL_API_Thread_Command_glDrawTexfvOES *)data;
-
-   orig_evgl_api_glDrawTexfvOES(thread_data->coords);
-
-}
-
-EAPI void
-glDrawTexfvOES_evgl_api_thread_cmd(const GLfloat *coords)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawTexfvOES(coords);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawTexfvOES thread_data_local;
-   EVGL_API_Thread_Command_glDrawTexfvOES *thread_data = &thread_data_local;
-
-   thread_data->coords = coords;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawTexfvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glAlphaFuncxOES(GLenum func, GLclampx ref);
- */
-
-typedef struct
-{
-   GLenum func;
-   GLclampx ref;
-
-} EVGL_API_Thread_Command_glAlphaFuncxOES;
-
-void (*orig_evgl_api_glAlphaFuncxOES)(GLenum func, GLclampx ref);
-
-static void
-_evgl_api_thread_glAlphaFuncxOES(void *data)
-{
-   EVGL_API_Thread_Command_glAlphaFuncxOES *thread_data =
-      (EVGL_API_Thread_Command_glAlphaFuncxOES *)data;
-
-   orig_evgl_api_glAlphaFuncxOES(thread_data->func,
-                                 thread_data->ref);
-
-}
-
-EAPI void
-glAlphaFuncxOES_evgl_api_thread_cmd(GLenum func, GLclampx ref)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glAlphaFuncxOES(func, ref);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glAlphaFuncxOES thread_data_local;
-   EVGL_API_Thread_Command_glAlphaFuncxOES *thread_data = &thread_data_local;
-
-   thread_data->func = func;
-   thread_data->ref = ref;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glAlphaFuncxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearColorxOES(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
- */
-
-typedef struct
-{
-   GLclampx red;
-   GLclampx green;
-   GLclampx blue;
-   GLclampx alpha;
-
-} EVGL_API_Thread_Command_glClearColorxOES;
-
-void (*orig_evgl_api_glClearColorxOES)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-
-static void
-_evgl_api_thread_glClearColorxOES(void *data)
-{
-   EVGL_API_Thread_Command_glClearColorxOES *thread_data =
-      (EVGL_API_Thread_Command_glClearColorxOES *)data;
-
-   orig_evgl_api_glClearColorxOES(thread_data->red,
-                                  thread_data->green,
-                                  thread_data->blue,
-                                  thread_data->alpha);
-
-}
-
-EAPI void
-glClearColorxOES_evgl_api_thread_cmd(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearColorxOES(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearColorxOES thread_data_local;
-   EVGL_API_Thread_Command_glClearColorxOES *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearColorxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearDepthxOES(GLclampx depth);
- */
-
-typedef struct
-{
-   GLclampx depth;
-
-} EVGL_API_Thread_Command_glClearDepthxOES;
-
-void (*orig_evgl_api_glClearDepthxOES)(GLclampx depth);
-
-static void
-_evgl_api_thread_glClearDepthxOES(void *data)
-{
-   EVGL_API_Thread_Command_glClearDepthxOES *thread_data =
-      (EVGL_API_Thread_Command_glClearDepthxOES *)data;
-
-   orig_evgl_api_glClearDepthxOES(thread_data->depth);
-
-}
-
-EAPI void
-glClearDepthxOES_evgl_api_thread_cmd(GLclampx depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearDepthxOES(depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearDepthxOES thread_data_local;
-   EVGL_API_Thread_Command_glClearDepthxOES *thread_data = &thread_data_local;
-
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearDepthxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanexOES(GLenum plane, const GLfixed *equation);
- */
-
-typedef struct
-{
-   GLenum plane;
-   const GLfixed *equation;
-
-} EVGL_API_Thread_Command_glClipPlanexOES;
-
-void (*orig_evgl_api_glClipPlanexOES)(GLenum plane, const GLfixed *equation);
-
-static void
-_evgl_api_thread_glClipPlanexOES(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanexOES *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanexOES *)data;
-
-   orig_evgl_api_glClipPlanexOES(thread_data->plane,
-                                 thread_data->equation);
-
-}
-
-EAPI void
-glClipPlanexOES_evgl_api_thread_cmd(GLenum plane, const GLfixed *equation)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanexOES(plane, equation);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanexOES thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanexOES *thread_data = &thread_data_local;
-
-   thread_data->plane = plane;
-   thread_data->equation = equation;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
- */
-
-typedef struct
-{
-   GLfixed red;
-   GLfixed green;
-   GLfixed blue;
-   GLfixed alpha;
-
-} EVGL_API_Thread_Command_glColor4xOES;
-
-void (*orig_evgl_api_glColor4xOES)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-
-static void
-_evgl_api_thread_glColor4xOES(void *data)
-{
-   EVGL_API_Thread_Command_glColor4xOES *thread_data =
-      (EVGL_API_Thread_Command_glColor4xOES *)data;
-
-   orig_evgl_api_glColor4xOES(thread_data->red,
-                              thread_data->green,
-                              thread_data->blue,
-                              thread_data->alpha);
-
-}
-
-EAPI void
-glColor4xOES_evgl_api_thread_cmd(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColor4xOES(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColor4xOES thread_data_local;
-   EVGL_API_Thread_Command_glColor4xOES *thread_data = &thread_data_local;
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColor4xOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthRangexOES(GLclampx zNear, GLclampx zFar);
- */
-
-typedef struct
-{
-   GLclampx zNear;
-   GLclampx zFar;
-
-} EVGL_API_Thread_Command_glDepthRangexOES;
-
-void (*orig_evgl_api_glDepthRangexOES)(GLclampx zNear, GLclampx zFar);
-
-static void
-_evgl_api_thread_glDepthRangexOES(void *data)
-{
-   EVGL_API_Thread_Command_glDepthRangexOES *thread_data =
-      (EVGL_API_Thread_Command_glDepthRangexOES *)data;
-
-   orig_evgl_api_glDepthRangexOES(thread_data->zNear,
-                                  thread_data->zFar);
-
-}
-
-EAPI void
-glDepthRangexOES_evgl_api_thread_cmd(GLclampx zNear, GLclampx zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthRangexOES(zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthRangexOES thread_data_local;
-   EVGL_API_Thread_Command_glDepthRangexOES *thread_data = &thread_data_local;
-
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthRangexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogxOES(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glFogxOES;
-
-void (*orig_evgl_api_glFogxOES)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glFogxOES(void *data)
-{
-   EVGL_API_Thread_Command_glFogxOES *thread_data =
-      (EVGL_API_Thread_Command_glFogxOES *)data;
-
-   orig_evgl_api_glFogxOES(thread_data->pname,
-                           thread_data->param);
-
-}
-
-EAPI void
-glFogxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogxOES(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogxOES thread_data_local;
-   EVGL_API_Thread_Command_glFogxOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFogxvOES(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glFogxvOES;
-
-void (*orig_evgl_api_glFogxvOES)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glFogxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glFogxvOES *thread_data =
-      (EVGL_API_Thread_Command_glFogxvOES *)data;
-
-   orig_evgl_api_glFogxvOES(thread_data->pname,
-                            thread_data->params);
-
-}
-
-EAPI void
-glFogxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFogxvOES(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFogxvOES thread_data_local;
-   EVGL_API_Thread_Command_glFogxvOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFogxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFrustumxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
- */
-
-typedef struct
-{
-   GLfixed left;
-   GLfixed right;
-   GLfixed bottom;
-   GLfixed top;
-   GLfixed zNear;
-   GLfixed zFar;
-
-} EVGL_API_Thread_Command_glFrustumxOES;
-
-void (*orig_evgl_api_glFrustumxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-static void
-_evgl_api_thread_glFrustumxOES(void *data)
-{
-   EVGL_API_Thread_Command_glFrustumxOES *thread_data =
-      (EVGL_API_Thread_Command_glFrustumxOES *)data;
-
-   orig_evgl_api_glFrustumxOES(thread_data->left,
-                               thread_data->right,
-                               thread_data->bottom,
-                               thread_data->top,
-                               thread_data->zNear,
-                               thread_data->zFar);
-
-}
-
-EAPI void
-glFrustumxOES_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFrustumxOES(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFrustumxOES thread_data_local;
-   EVGL_API_Thread_Command_glFrustumxOES *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFrustumxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetClipPlanexOES(GLenum pname, GLfixed eqn[4]);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed eqn[4];
-
-} EVGL_API_Thread_Command_glGetClipPlanexOES;
-
-void (*orig_evgl_api_glGetClipPlanexOES)(GLenum pname, GLfixed eqn[4]);
-
-static void
-_evgl_api_thread_glGetClipPlanexOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetClipPlanexOES *thread_data =
-      (EVGL_API_Thread_Command_glGetClipPlanexOES *)data;
-
-   orig_evgl_api_glGetClipPlanexOES(thread_data->pname,
-                                    thread_data->eqn);
-
-}
-
-EAPI void
-glGetClipPlanexOES_evgl_api_thread_cmd(GLenum pname, GLfixed eqn[4])
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetClipPlanexOES(pname, eqn);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetClipPlanexOES thread_data_local;
-   EVGL_API_Thread_Command_glGetClipPlanexOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   memcpy(thread_data->eqn, &eqn, sizeof(GLfixed) * 4);
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetClipPlanexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFixedvOES(GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetFixedvOES;
-
-void (*orig_evgl_api_glGetFixedvOES)(GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetFixedvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetFixedvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetFixedvOES *)data;
-
-   orig_evgl_api_glGetFixedvOES(thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetFixedvOES_evgl_api_thread_cmd(GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFixedvOES(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFixedvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetFixedvOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFixedvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetLightxvOES(GLenum light, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetLightxvOES;
-
-void (*orig_evgl_api_glGetLightxvOES)(GLenum light, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetLightxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetLightxvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetLightxvOES *)data;
-
-   orig_evgl_api_glGetLightxvOES(thread_data->light,
-                                 thread_data->pname,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetLightxvOES_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetLightxvOES(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetLightxvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetLightxvOES *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetLightxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetMaterialxvOES;
-
-void (*orig_evgl_api_glGetMaterialxvOES)(GLenum face, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetMaterialxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetMaterialxvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetMaterialxvOES *)data;
-
-   orig_evgl_api_glGetMaterialxvOES(thread_data->face,
-                                    thread_data->pname,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glGetMaterialxvOES_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetMaterialxvOES(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetMaterialxvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetMaterialxvOES *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetMaterialxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexEnvxvOES(GLenum env, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum env;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetTexEnvxvOES;
-
-void (*orig_evgl_api_glGetTexEnvxvOES)(GLenum env, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetTexEnvxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexEnvxvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetTexEnvxvOES *)data;
-
-   orig_evgl_api_glGetTexEnvxvOES(thread_data->env,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glGetTexEnvxvOES_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexEnvxvOES(env, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexEnvxvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetTexEnvxvOES *thread_data = &thread_data_local;
-
-   thread_data->env = env;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexEnvxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetTexParameterxvOES;
-
-void (*orig_evgl_api_glGetTexParameterxvOES)(GLenum target, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetTexParameterxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameterxvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameterxvOES *)data;
-
-   orig_evgl_api_glGetTexParameterxvOES(thread_data->target,
-                                        thread_data->pname,
-                                        thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameterxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameterxvOES(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameterxvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameterxvOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameterxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelxOES(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glLightModelxOES;
-
-void (*orig_evgl_api_glLightModelxOES)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glLightModelxOES(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelxOES *thread_data =
-      (EVGL_API_Thread_Command_glLightModelxOES *)data;
-
-   orig_evgl_api_glLightModelxOES(thread_data->pname,
-                                  thread_data->param);
-
-}
-
-EAPI void
-glLightModelxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelxOES(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelxOES thread_data_local;
-   EVGL_API_Thread_Command_glLightModelxOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightModelxvOES(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glLightModelxvOES;
-
-void (*orig_evgl_api_glLightModelxvOES)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glLightModelxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glLightModelxvOES *thread_data =
-      (EVGL_API_Thread_Command_glLightModelxvOES *)data;
-
-   orig_evgl_api_glLightModelxvOES(thread_data->pname,
-                                   thread_data->params);
-
-}
-
-EAPI void
-glLightModelxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightModelxvOES(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightModelxvOES thread_data_local;
-   EVGL_API_Thread_Command_glLightModelxvOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightModelxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightxOES(GLenum light, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glLightxOES;
-
-void (*orig_evgl_api_glLightxOES)(GLenum light, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glLightxOES(void *data)
-{
-   EVGL_API_Thread_Command_glLightxOES *thread_data =
-      (EVGL_API_Thread_Command_glLightxOES *)data;
-
-   orig_evgl_api_glLightxOES(thread_data->light,
-                             thread_data->pname,
-                             thread_data->param);
-
-}
-
-EAPI void
-glLightxOES_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightxOES(light, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightxOES thread_data_local;
-   EVGL_API_Thread_Command_glLightxOES *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLightxvOES(GLenum light, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum light;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glLightxvOES;
-
-void (*orig_evgl_api_glLightxvOES)(GLenum light, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glLightxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glLightxvOES *thread_data =
-      (EVGL_API_Thread_Command_glLightxvOES *)data;
-
-   orig_evgl_api_glLightxvOES(thread_data->light,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glLightxvOES_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLightxvOES(light, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLightxvOES thread_data_local;
-   EVGL_API_Thread_Command_glLightxvOES *thread_data = &thread_data_local;
-
-   thread_data->light = light;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLightxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLineWidthxOES(GLfixed width);
- */
-
-typedef struct
-{
-   GLfixed width;
-
-} EVGL_API_Thread_Command_glLineWidthxOES;
-
-void (*orig_evgl_api_glLineWidthxOES)(GLfixed width);
-
-static void
-_evgl_api_thread_glLineWidthxOES(void *data)
-{
-   EVGL_API_Thread_Command_glLineWidthxOES *thread_data =
-      (EVGL_API_Thread_Command_glLineWidthxOES *)data;
-
-   orig_evgl_api_glLineWidthxOES(thread_data->width);
-
-}
-
-EAPI void
-glLineWidthxOES_evgl_api_thread_cmd(GLfixed width)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLineWidthxOES(width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLineWidthxOES thread_data_local;
-   EVGL_API_Thread_Command_glLineWidthxOES *thread_data = &thread_data_local;
-
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLineWidthxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLoadMatrixxOES(const GLfixed *m);
- */
-
-typedef struct
-{
-   const GLfixed *m;
-
-} EVGL_API_Thread_Command_glLoadMatrixxOES;
-
-void (*orig_evgl_api_glLoadMatrixxOES)(const GLfixed *m);
-
-static void
-_evgl_api_thread_glLoadMatrixxOES(void *data)
-{
-   EVGL_API_Thread_Command_glLoadMatrixxOES *thread_data =
-      (EVGL_API_Thread_Command_glLoadMatrixxOES *)data;
-
-   orig_evgl_api_glLoadMatrixxOES(thread_data->m);
-
-}
-
-EAPI void
-glLoadMatrixxOES_evgl_api_thread_cmd(const GLfixed *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLoadMatrixxOES(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glLoadMatrixxOES thread_data_local;
-   EVGL_API_Thread_Command_glLoadMatrixxOES *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLoadMatrixxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialxOES(GLenum face, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glMaterialxOES;
-
-void (*orig_evgl_api_glMaterialxOES)(GLenum face, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glMaterialxOES(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialxOES *thread_data =
-      (EVGL_API_Thread_Command_glMaterialxOES *)data;
-
-   orig_evgl_api_glMaterialxOES(thread_data->face,
-                                thread_data->pname,
-                                thread_data->param);
-
-}
-
-EAPI void
-glMaterialxOES_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialxOES(face, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialxOES thread_data_local;
-   EVGL_API_Thread_Command_glMaterialxOES *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMaterialxvOES(GLenum face, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum face;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glMaterialxvOES;
-
-void (*orig_evgl_api_glMaterialxvOES)(GLenum face, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glMaterialxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glMaterialxvOES *thread_data =
-      (EVGL_API_Thread_Command_glMaterialxvOES *)data;
-
-   orig_evgl_api_glMaterialxvOES(thread_data->face,
-                                 thread_data->pname,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glMaterialxvOES_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMaterialxvOES(face, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMaterialxvOES thread_data_local;
-   EVGL_API_Thread_Command_glMaterialxvOES *thread_data = &thread_data_local;
-
-   thread_data->face = face;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMaterialxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultMatrixxOES(const GLfixed *m);
- */
-
-typedef struct
-{
-   const GLfixed *m;
-
-} EVGL_API_Thread_Command_glMultMatrixxOES;
-
-void (*orig_evgl_api_glMultMatrixxOES)(const GLfixed *m);
-
-static void
-_evgl_api_thread_glMultMatrixxOES(void *data)
-{
-   EVGL_API_Thread_Command_glMultMatrixxOES *thread_data =
-      (EVGL_API_Thread_Command_glMultMatrixxOES *)data;
-
-   orig_evgl_api_glMultMatrixxOES(thread_data->m);
-
-}
-
-EAPI void
-glMultMatrixxOES_evgl_api_thread_cmd(const GLfixed *m)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultMatrixxOES(m);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultMatrixxOES thread_data_local;
-   EVGL_API_Thread_Command_glMultMatrixxOES *thread_data = &thread_data_local;
-
-   thread_data->m = m;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultMatrixxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMultiTexCoord4xOES(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLfixed s;
-   GLfixed t;
-   GLfixed r;
-   GLfixed q;
-
-} EVGL_API_Thread_Command_glMultiTexCoord4xOES;
-
-void (*orig_evgl_api_glMultiTexCoord4xOES)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-
-static void
-_evgl_api_thread_glMultiTexCoord4xOES(void *data)
-{
-   EVGL_API_Thread_Command_glMultiTexCoord4xOES *thread_data =
-      (EVGL_API_Thread_Command_glMultiTexCoord4xOES *)data;
-
-   orig_evgl_api_glMultiTexCoord4xOES(thread_data->target,
-                                      thread_data->s,
-                                      thread_data->t,
-                                      thread_data->r,
-                                      thread_data->q);
-
-}
-
-EAPI void
-glMultiTexCoord4xOES_evgl_api_thread_cmd(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMultiTexCoord4xOES(target, s, t, r, q);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMultiTexCoord4xOES thread_data_local;
-   EVGL_API_Thread_Command_glMultiTexCoord4xOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->s = s;
-   thread_data->t = t;
-   thread_data->r = r;
-   thread_data->q = q;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMultiTexCoord4xOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz);
- */
-
-typedef struct
-{
-   GLfixed nx;
-   GLfixed ny;
-   GLfixed nz;
-
-} EVGL_API_Thread_Command_glNormal3xOES;
-
-void (*orig_evgl_api_glNormal3xOES)(GLfixed nx, GLfixed ny, GLfixed nz);
-
-static void
-_evgl_api_thread_glNormal3xOES(void *data)
-{
-   EVGL_API_Thread_Command_glNormal3xOES *thread_data =
-      (EVGL_API_Thread_Command_glNormal3xOES *)data;
-
-   orig_evgl_api_glNormal3xOES(thread_data->nx,
-                               thread_data->ny,
-                               thread_data->nz);
-
-}
-
-EAPI void
-glNormal3xOES_evgl_api_thread_cmd(GLfixed nx, GLfixed ny, GLfixed nz)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glNormal3xOES(nx, ny, nz);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glNormal3xOES thread_data_local;
-   EVGL_API_Thread_Command_glNormal3xOES *thread_data = &thread_data_local;
-
-   thread_data->nx = nx;
-   thread_data->ny = ny;
-   thread_data->nz = nz;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glNormal3xOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glOrthoxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
- */
-
-typedef struct
-{
-   GLfixed left;
-   GLfixed right;
-   GLfixed bottom;
-   GLfixed top;
-   GLfixed zNear;
-   GLfixed zFar;
-
-} EVGL_API_Thread_Command_glOrthoxOES;
-
-void (*orig_evgl_api_glOrthoxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-static void
-_evgl_api_thread_glOrthoxOES(void *data)
-{
-   EVGL_API_Thread_Command_glOrthoxOES *thread_data =
-      (EVGL_API_Thread_Command_glOrthoxOES *)data;
-
-   orig_evgl_api_glOrthoxOES(thread_data->left,
-                             thread_data->right,
-                             thread_data->bottom,
-                             thread_data->top,
-                             thread_data->zNear,
-                             thread_data->zFar);
-
-}
-
-EAPI void
-glOrthoxOES_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glOrthoxOES(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glOrthoxOES thread_data_local;
-   EVGL_API_Thread_Command_glOrthoxOES *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glOrthoxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterxOES(GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glPointParameterxOES;
-
-void (*orig_evgl_api_glPointParameterxOES)(GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glPointParameterxOES(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterxOES *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterxOES *)data;
-
-   orig_evgl_api_glPointParameterxOES(thread_data->pname,
-                                      thread_data->param);
-
-}
-
-EAPI void
-glPointParameterxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterxOES(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterxOES thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterxOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointParameterxvOES(GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glPointParameterxvOES;
-
-void (*orig_evgl_api_glPointParameterxvOES)(GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glPointParameterxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glPointParameterxvOES *thread_data =
-      (EVGL_API_Thread_Command_glPointParameterxvOES *)data;
-
-   orig_evgl_api_glPointParameterxvOES(thread_data->pname,
-                                       thread_data->params);
-
-}
-
-EAPI void
-glPointParameterxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointParameterxvOES(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointParameterxvOES thread_data_local;
-   EVGL_API_Thread_Command_glPointParameterxvOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointParameterxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPointSizexOES(GLfixed size);
- */
-
-typedef struct
-{
-   GLfixed size;
-
-} EVGL_API_Thread_Command_glPointSizexOES;
-
-void (*orig_evgl_api_glPointSizexOES)(GLfixed size);
-
-static void
-_evgl_api_thread_glPointSizexOES(void *data)
-{
-   EVGL_API_Thread_Command_glPointSizexOES *thread_data =
-      (EVGL_API_Thread_Command_glPointSizexOES *)data;
-
-   orig_evgl_api_glPointSizexOES(thread_data->size);
-
-}
-
-EAPI void
-glPointSizexOES_evgl_api_thread_cmd(GLfixed size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPointSizexOES(size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPointSizexOES thread_data_local;
-   EVGL_API_Thread_Command_glPointSizexOES *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPointSizexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPolygonOffsetxOES(GLfixed factor, GLfixed units);
- */
-
-typedef struct
-{
-   GLfixed factor;
-   GLfixed units;
-
-} EVGL_API_Thread_Command_glPolygonOffsetxOES;
-
-void (*orig_evgl_api_glPolygonOffsetxOES)(GLfixed factor, GLfixed units);
-
-static void
-_evgl_api_thread_glPolygonOffsetxOES(void *data)
-{
-   EVGL_API_Thread_Command_glPolygonOffsetxOES *thread_data =
-      (EVGL_API_Thread_Command_glPolygonOffsetxOES *)data;
-
-   orig_evgl_api_glPolygonOffsetxOES(thread_data->factor,
-                                     thread_data->units);
-
-}
-
-EAPI void
-glPolygonOffsetxOES_evgl_api_thread_cmd(GLfixed factor, GLfixed units)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPolygonOffsetxOES(factor, units);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPolygonOffsetxOES thread_data_local;
-   EVGL_API_Thread_Command_glPolygonOffsetxOES *thread_data = &thread_data_local;
-
-   thread_data->factor = factor;
-   thread_data->units = units;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPolygonOffsetxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed angle;
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glRotatexOES;
-
-void (*orig_evgl_api_glRotatexOES)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glRotatexOES(void *data)
-{
-   EVGL_API_Thread_Command_glRotatexOES *thread_data =
-      (EVGL_API_Thread_Command_glRotatexOES *)data;
-
-   orig_evgl_api_glRotatexOES(thread_data->angle,
-                              thread_data->x,
-                              thread_data->y,
-                              thread_data->z);
-
-}
-
-EAPI void
-glRotatexOES_evgl_api_thread_cmd(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRotatexOES(angle, x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRotatexOES thread_data_local;
-   EVGL_API_Thread_Command_glRotatexOES *thread_data = &thread_data_local;
-
-   thread_data->angle = angle;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRotatexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSampleCoveragexOES(GLclampx value, GLboolean invert);
- */
-
-typedef struct
-{
-   GLclampx value;
-   GLboolean invert;
-
-} EVGL_API_Thread_Command_glSampleCoveragexOES;
-
-void (*orig_evgl_api_glSampleCoveragexOES)(GLclampx value, GLboolean invert);
-
-static void
-_evgl_api_thread_glSampleCoveragexOES(void *data)
-{
-   EVGL_API_Thread_Command_glSampleCoveragexOES *thread_data =
-      (EVGL_API_Thread_Command_glSampleCoveragexOES *)data;
-
-   orig_evgl_api_glSampleCoveragexOES(thread_data->value,
-                                      thread_data->invert);
-
-}
-
-EAPI void
-glSampleCoveragexOES_evgl_api_thread_cmd(GLclampx value, GLboolean invert)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSampleCoveragexOES(value, invert);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSampleCoveragexOES thread_data_local;
-   EVGL_API_Thread_Command_glSampleCoveragexOES *thread_data = &thread_data_local;
-
-   thread_data->value = value;
-   thread_data->invert = invert;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSampleCoveragexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glScalexOES(GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glScalexOES;
-
-void (*orig_evgl_api_glScalexOES)(GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glScalexOES(void *data)
-{
-   EVGL_API_Thread_Command_glScalexOES *thread_data =
-      (EVGL_API_Thread_Command_glScalexOES *)data;
-
-   orig_evgl_api_glScalexOES(thread_data->x,
-                             thread_data->y,
-                             thread_data->z);
-
-}
-
-EAPI void
-glScalexOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glScalexOES(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glScalexOES thread_data_local;
-   EVGL_API_Thread_Command_glScalexOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glScalexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvxOES(GLenum target, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glTexEnvxOES;
-
-void (*orig_evgl_api_glTexEnvxOES)(GLenum target, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glTexEnvxOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvxOES *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvxOES *)data;
-
-   orig_evgl_api_glTexEnvxOES(thread_data->target,
-                              thread_data->pname,
-                              thread_data->param);
-
-}
-
-EAPI void
-glTexEnvxOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvxOES(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvxOES thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvxOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glTexEnvxvOES;
-
-void (*orig_evgl_api_glTexEnvxvOES)(GLenum target, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glTexEnvxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexEnvxvOES *thread_data =
-      (EVGL_API_Thread_Command_glTexEnvxvOES *)data;
-
-   orig_evgl_api_glTexEnvxvOES(thread_data->target,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glTexEnvxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexEnvxvOES(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexEnvxvOES thread_data_local;
-   EVGL_API_Thread_Command_glTexEnvxvOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexEnvxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterxOES(GLenum target, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glTexParameterxOES;
-
-void (*orig_evgl_api_glTexParameterxOES)(GLenum target, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glTexParameterxOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterxOES *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterxOES *)data;
-
-   orig_evgl_api_glTexParameterxOES(thread_data->target,
-                                    thread_data->pname,
-                                    thread_data->param);
-
-}
-
-EAPI void
-glTexParameterxOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterxOES(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterxOES thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterxOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glTexParameterxvOES;
-
-void (*orig_evgl_api_glTexParameterxvOES)(GLenum target, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glTexParameterxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterxvOES *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterxvOES *)data;
-
-   orig_evgl_api_glTexParameterxvOES(thread_data->target,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glTexParameterxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterxvOES(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterxvOES thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterxvOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTranslatexOES(GLfixed x, GLfixed y, GLfixed z);
- */
-
-typedef struct
-{
-   GLfixed x;
-   GLfixed y;
-   GLfixed z;
-
-} EVGL_API_Thread_Command_glTranslatexOES;
-
-void (*orig_evgl_api_glTranslatexOES)(GLfixed x, GLfixed y, GLfixed z);
-
-static void
-_evgl_api_thread_glTranslatexOES(void *data)
-{
-   EVGL_API_Thread_Command_glTranslatexOES *thread_data =
-      (EVGL_API_Thread_Command_glTranslatexOES *)data;
-
-   orig_evgl_api_glTranslatexOES(thread_data->x,
-                                 thread_data->y,
-                                 thread_data->z);
-
-}
-
-EAPI void
-glTranslatexOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTranslatexOES(x, y, z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTranslatexOES thread_data_local;
-   EVGL_API_Thread_Command_glTranslatexOES *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->z = z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTranslatexOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsRenderbufferOES(GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint renderbuffer;
-
-} EVGL_API_Thread_Command_glIsRenderbufferOES;
-
-GLboolean (*orig_evgl_api_glIsRenderbufferOES)(GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glIsRenderbufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glIsRenderbufferOES *thread_data =
-      (EVGL_API_Thread_Command_glIsRenderbufferOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsRenderbufferOES(thread_data->renderbuffer);
-
-}
-
-EAPI GLboolean
-glIsRenderbufferOES_evgl_api_thread_cmd(GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsRenderbufferOES(renderbuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsRenderbufferOES thread_data_local;
-   EVGL_API_Thread_Command_glIsRenderbufferOES *thread_data = &thread_data_local;
-
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsRenderbufferOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glBindRenderbufferOES(GLenum target, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBindRenderbufferOES;
-
-void (*orig_evgl_api_glBindRenderbufferOES)(GLenum target, GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glBindRenderbufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glBindRenderbufferOES *thread_data =
-      (EVGL_API_Thread_Command_glBindRenderbufferOES *)data;
-
-   orig_evgl_api_glBindRenderbufferOES(thread_data->target,
-                                       thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindRenderbufferOES_evgl_api_thread_cmd(GLenum target, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindRenderbufferOES(target, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindRenderbufferOES thread_data_local;
-   EVGL_API_Thread_Command_glBindRenderbufferOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBindRenderbufferOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBindRenderbufferOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindRenderbufferOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* renderbuffers;
-   void *renderbuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteRenderbuffersOES;
-
-void (*orig_evgl_api_glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers);
-
-static void
-_evgl_api_thread_glDeleteRenderbuffersOES(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteRenderbuffersOES *thread_data =
-      (EVGL_API_Thread_Command_glDeleteRenderbuffersOES *)data;
-
-   orig_evgl_api_glDeleteRenderbuffersOES(thread_data->n,
-                                          thread_data->renderbuffers);
-
-
-   if (thread_data->renderbuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteRenderbuffersOES_evgl_api_thread_cmd(GLsizei n, const GLuint* renderbuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteRenderbuffersOES(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteRenderbuffersOES thread_data_local;
-   EVGL_API_Thread_Command_glDeleteRenderbuffersOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteRenderbuffersOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteRenderbuffersOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   thread_data->renderbuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (renderbuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->renderbuffers_copied)
-          {
-             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->renderbuffers = (const GLuint *)thread_data->renderbuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteRenderbuffersOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenRenderbuffersOES(GLsizei n, GLuint* renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* renderbuffers;
-
-} EVGL_API_Thread_Command_glGenRenderbuffersOES;
-
-void (*orig_evgl_api_glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers);
-
-static void
-_evgl_api_thread_glGenRenderbuffersOES(void *data)
-{
-   EVGL_API_Thread_Command_glGenRenderbuffersOES *thread_data =
-      (EVGL_API_Thread_Command_glGenRenderbuffersOES *)data;
-
-   orig_evgl_api_glGenRenderbuffersOES(thread_data->n,
-                                       thread_data->renderbuffers);
-
-}
-
-EAPI void
-glGenRenderbuffersOES_evgl_api_thread_cmd(GLsizei n, GLuint* renderbuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenRenderbuffersOES(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenRenderbuffersOES thread_data_local;
-   EVGL_API_Thread_Command_glGenRenderbuffersOES *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenRenderbuffersOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glRenderbufferStorageOES;
-
-void (*orig_evgl_api_glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glRenderbufferStorageOES(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorageOES *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorageOES *)data;
-
-   orig_evgl_api_glRenderbufferStorageOES(thread_data->target,
-                                          thread_data->internalformat,
-                                          thread_data->width,
-                                          thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorageOES(target, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorageOES thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorageOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glRenderbufferStorageOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glRenderbufferStorageOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorageOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetRenderbufferParameterivOES;
-
-void (*orig_evgl_api_glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetRenderbufferParameterivOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetRenderbufferParameterivOES *thread_data =
-      (EVGL_API_Thread_Command_glGetRenderbufferParameterivOES *)data;
-
-   orig_evgl_api_glGetRenderbufferParameterivOES(thread_data->target,
-                                                 thread_data->pname,
-                                                 thread_data->params);
-
-}
-
-EAPI void
-glGetRenderbufferParameterivOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetRenderbufferParameterivOES(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetRenderbufferParameterivOES thread_data_local;
-   EVGL_API_Thread_Command_glGetRenderbufferParameterivOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetRenderbufferParameterivOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsFramebufferOES(GLuint framebuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint framebuffer;
-
-} EVGL_API_Thread_Command_glIsFramebufferOES;
-
-GLboolean (*orig_evgl_api_glIsFramebufferOES)(GLuint framebuffer);
-
-static void
-_evgl_api_thread_glIsFramebufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glIsFramebufferOES *thread_data =
-      (EVGL_API_Thread_Command_glIsFramebufferOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsFramebufferOES(thread_data->framebuffer);
-
-}
-
-EAPI GLboolean
-glIsFramebufferOES_evgl_api_thread_cmd(GLuint framebuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsFramebufferOES(framebuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsFramebufferOES thread_data_local;
-   EVGL_API_Thread_Command_glIsFramebufferOES *thread_data = &thread_data_local;
-
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsFramebufferOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glBindFramebufferOES(GLenum target, GLuint framebuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint framebuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glBindFramebufferOES;
-
-void (*orig_evgl_api_glBindFramebufferOES)(GLenum target, GLuint framebuffer);
-
-static void
-_evgl_api_thread_glBindFramebufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glBindFramebufferOES *thread_data =
-      (EVGL_API_Thread_Command_glBindFramebufferOES *)data;
-
-   orig_evgl_api_glBindFramebufferOES(thread_data->target,
-                                      thread_data->framebuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindFramebufferOES_evgl_api_thread_cmd(GLenum target, GLuint framebuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindFramebufferOES(target, framebuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindFramebufferOES thread_data_local;
-   EVGL_API_Thread_Command_glBindFramebufferOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glBindFramebufferOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glBindFramebufferOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindFramebufferOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint* framebuffers;
-   void *framebuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glDeleteFramebuffersOES;
-
-void (*orig_evgl_api_glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers);
-
-static void
-_evgl_api_thread_glDeleteFramebuffersOES(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteFramebuffersOES *thread_data =
-      (EVGL_API_Thread_Command_glDeleteFramebuffersOES *)data;
-
-   orig_evgl_api_glDeleteFramebuffersOES(thread_data->n,
-                                         thread_data->framebuffers);
-
-
-   if (thread_data->framebuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteFramebuffersOES_evgl_api_thread_cmd(GLsizei n, const GLuint* framebuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteFramebuffersOES(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteFramebuffersOES thread_data_local;
-   EVGL_API_Thread_Command_glDeleteFramebuffersOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glDeleteFramebuffersOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDeleteFramebuffersOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   thread_data->framebuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (framebuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->framebuffers_copied)
-          {
-             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->framebuffers = (const GLuint *)thread_data->framebuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteFramebuffersOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenFramebuffersOES(GLsizei n, GLuint* framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint* framebuffers;
-
-} EVGL_API_Thread_Command_glGenFramebuffersOES;
-
-void (*orig_evgl_api_glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers);
-
-static void
-_evgl_api_thread_glGenFramebuffersOES(void *data)
-{
-   EVGL_API_Thread_Command_glGenFramebuffersOES *thread_data =
-      (EVGL_API_Thread_Command_glGenFramebuffersOES *)data;
-
-   orig_evgl_api_glGenFramebuffersOES(thread_data->n,
-                                      thread_data->framebuffers);
-
-}
-
-EAPI void
-glGenFramebuffersOES_evgl_api_thread_cmd(GLsizei n, GLuint* framebuffers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenFramebuffersOES(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenFramebuffersOES thread_data_local;
-   EVGL_API_Thread_Command_glGenFramebuffersOES *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenFramebuffersOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glCheckFramebufferStatusOES(GLenum target);
- */
-
-typedef struct
-{
-   GLenum return_value;
-   GLenum target;
-
-} EVGL_API_Thread_Command_glCheckFramebufferStatusOES;
-
-GLenum (*orig_evgl_api_glCheckFramebufferStatusOES)(GLenum target);
-
-static void
-_evgl_api_thread_glCheckFramebufferStatusOES(void *data)
-{
-   EVGL_API_Thread_Command_glCheckFramebufferStatusOES *thread_data =
-      (EVGL_API_Thread_Command_glCheckFramebufferStatusOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glCheckFramebufferStatusOES(thread_data->target);
-
-}
-
-EAPI GLenum
-glCheckFramebufferStatusOES_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glCheckFramebufferStatusOES(target);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCheckFramebufferStatusOES thread_data_local;
-   EVGL_API_Thread_Command_glCheckFramebufferStatusOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCheckFramebufferStatusOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glFramebufferRenderbufferOES(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum renderbuffertarget;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferRenderbufferOES;
-
-void (*orig_evgl_api_glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-static void
-_evgl_api_thread_glFramebufferRenderbufferOES(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferRenderbufferOES *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferRenderbufferOES *)data;
-
-   orig_evgl_api_glFramebufferRenderbufferOES(thread_data->target,
-                                              thread_data->attachment,
-                                              thread_data->renderbuffertarget,
-                                              thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferRenderbufferOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferRenderbufferOES(target, attachment, renderbuffertarget, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferRenderbufferOES thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferRenderbufferOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferRenderbufferOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferRenderbufferOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->renderbuffertarget = renderbuffertarget;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferRenderbufferOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum textarget;
-   GLuint texture;
-   GLint level;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferTexture2DOES;
-
-void (*orig_evgl_api_glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-static void
-_evgl_api_thread_glFramebufferTexture2DOES(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture2DOES *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture2DOES *)data;
-
-   orig_evgl_api_glFramebufferTexture2DOES(thread_data->target,
-                                           thread_data->attachment,
-                                           thread_data->textarget,
-                                           thread_data->texture,
-                                           thread_data->level);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2DOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture2DOES(target, attachment, textarget, texture, level);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture2DOES thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture2DOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferTexture2DOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferTexture2DOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
-   thread_data->texture = texture;
-   thread_data->level = level;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture2DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint* params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum pname;
-   GLint* params;
-
-} EVGL_API_Thread_Command_glGetFramebufferAttachmentParameterivOES;
-
-void (*orig_evgl_api_glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-
-static void
-_evgl_api_thread_glGetFramebufferAttachmentParameterivOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameterivOES *thread_data =
-      (EVGL_API_Thread_Command_glGetFramebufferAttachmentParameterivOES *)data;
-
-   orig_evgl_api_glGetFramebufferAttachmentParameterivOES(thread_data->target,
-                                                          thread_data->attachment,
-                                                          thread_data->pname,
-                                                          thread_data->params);
-
-}
-
-EAPI void
-glGetFramebufferAttachmentParameterivOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFramebufferAttachmentParameterivOES(target, attachment, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameterivOES thread_data_local;
-   EVGL_API_Thread_Command_glGetFramebufferAttachmentParameterivOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFramebufferAttachmentParameterivOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenerateMipmapOES(GLenum target);
- */
-
-typedef struct
-{
-   GLenum target;
-
-} EVGL_API_Thread_Command_glGenerateMipmapOES;
-
-void (*orig_evgl_api_glGenerateMipmapOES)(GLenum target);
-
-static void
-_evgl_api_thread_glGenerateMipmapOES(void *data)
-{
-   EVGL_API_Thread_Command_glGenerateMipmapOES *thread_data =
-      (EVGL_API_Thread_Command_glGenerateMipmapOES *)data;
-
-   orig_evgl_api_glGenerateMipmapOES(thread_data->target);
-
-}
-
-EAPI void
-glGenerateMipmapOES_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenerateMipmapOES(target);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenerateMipmapOES thread_data_local;
-   EVGL_API_Thread_Command_glGenerateMipmapOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenerateMipmapOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCurrentPaletteMatrixOES(GLuint matrixpaletteindex);
- */
-
-typedef struct
-{
-   GLuint matrixpaletteindex;
-
-} EVGL_API_Thread_Command_glCurrentPaletteMatrixOES;
-
-void (*orig_evgl_api_glCurrentPaletteMatrixOES)(GLuint matrixpaletteindex);
-
-static void
-_evgl_api_thread_glCurrentPaletteMatrixOES(void *data)
-{
-   EVGL_API_Thread_Command_glCurrentPaletteMatrixOES *thread_data =
-      (EVGL_API_Thread_Command_glCurrentPaletteMatrixOES *)data;
-
-   orig_evgl_api_glCurrentPaletteMatrixOES(thread_data->matrixpaletteindex);
-
-}
-
-EAPI void
-glCurrentPaletteMatrixOES_evgl_api_thread_cmd(GLuint matrixpaletteindex)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCurrentPaletteMatrixOES(matrixpaletteindex);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCurrentPaletteMatrixOES thread_data_local;
-   EVGL_API_Thread_Command_glCurrentPaletteMatrixOES *thread_data = &thread_data_local;
-
-   thread_data->matrixpaletteindex = matrixpaletteindex;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCurrentPaletteMatrixOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLoadPaletteFromModelViewMatrixOES(void);
- */
-
-void (*orig_evgl_api_glLoadPaletteFromModelViewMatrixOES)(void);
-
-static void
-_evgl_api_thread_glLoadPaletteFromModelViewMatrixOES(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glLoadPaletteFromModelViewMatrixOES();
-
-}
-
-EAPI void
-glLoadPaletteFromModelViewMatrixOES_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glLoadPaletteFromModelViewMatrixOES();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glLoadPaletteFromModelViewMatrixOES,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glMatrixIndexPointerOES;
-
-void (*orig_evgl_api_glMatrixIndexPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glMatrixIndexPointerOES(void *data)
-{
-   EVGL_API_Thread_Command_glMatrixIndexPointerOES *thread_data =
-      (EVGL_API_Thread_Command_glMatrixIndexPointerOES *)data;
-
-   orig_evgl_api_glMatrixIndexPointerOES(thread_data->size,
-                                         thread_data->type,
-                                         thread_data->stride,
-                                         thread_data->pointer);
-
-}
-
-EAPI void
-glMatrixIndexPointerOES_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMatrixIndexPointerOES(size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMatrixIndexPointerOES thread_data_local;
-   EVGL_API_Thread_Command_glMatrixIndexPointerOES *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMatrixIndexPointerOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glWeightPointerOES;
-
-void (*orig_evgl_api_glWeightPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glWeightPointerOES(void *data)
-{
-   EVGL_API_Thread_Command_glWeightPointerOES *thread_data =
-      (EVGL_API_Thread_Command_glWeightPointerOES *)data;
-
-   orig_evgl_api_glWeightPointerOES(thread_data->size,
-                                    thread_data->type,
-                                    thread_data->stride,
-                                    thread_data->pointer);
-
-}
-
-EAPI void
-glWeightPointerOES_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glWeightPointerOES(size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glWeightPointerOES thread_data_local;
-   EVGL_API_Thread_Command_glWeightPointerOES *thread_data = &thread_data_local;
-
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glWeightPointerOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLbitfield
- * glQueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]);
- */
-
-typedef struct
-{
-   GLbitfield return_value;
-   GLfixed mantissa[16];
-   GLint exponent[16];
-
-} EVGL_API_Thread_Command_glQueryMatrixxOES;
-
-GLbitfield (*orig_evgl_api_glQueryMatrixxOES)(GLfixed mantissa[16], GLint exponent[16]);
-
-static void
-_evgl_api_thread_glQueryMatrixxOES(void *data)
-{
-   EVGL_API_Thread_Command_glQueryMatrixxOES *thread_data =
-      (EVGL_API_Thread_Command_glQueryMatrixxOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glQueryMatrixxOES(thread_data->mantissa,
-                                                               thread_data->exponent);
-
-}
-
-EAPI GLbitfield
-glQueryMatrixxOES_evgl_api_thread_cmd(GLfixed mantissa[16], GLint exponent[16])
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glQueryMatrixxOES(mantissa, exponent);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glQueryMatrixxOES thread_data_local;
-   EVGL_API_Thread_Command_glQueryMatrixxOES *thread_data = &thread_data_local;
-
-   memcpy(thread_data->mantissa, &mantissa, sizeof(GLfixed) * 16);
-   memcpy(thread_data->exponent, &exponent, sizeof(GLint) * 16);
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glQueryMatrixxOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glDepthRangefOES(GLclampf zNear, GLclampf zFar);
- */
-
-typedef struct
-{
-   GLclampf zNear;
-   GLclampf zFar;
-
-} EVGL_API_Thread_Command_glDepthRangefOES;
-
-void (*orig_evgl_api_glDepthRangefOES)(GLclampf zNear, GLclampf zFar);
-
-static void
-_evgl_api_thread_glDepthRangefOES(void *data)
-{
-   EVGL_API_Thread_Command_glDepthRangefOES *thread_data =
-      (EVGL_API_Thread_Command_glDepthRangefOES *)data;
-
-   orig_evgl_api_glDepthRangefOES(thread_data->zNear,
-                                  thread_data->zFar);
-
-}
-
-EAPI void
-glDepthRangefOES_evgl_api_thread_cmd(GLclampf zNear, GLclampf zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDepthRangefOES(zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDepthRangefOES thread_data_local;
-   EVGL_API_Thread_Command_glDepthRangefOES *thread_data = &thread_data_local;
-
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDepthRangefOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFrustumfOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
- */
-
-typedef struct
-{
-   GLfloat left;
-   GLfloat right;
-   GLfloat bottom;
-   GLfloat top;
-   GLfloat zNear;
-   GLfloat zFar;
-
-} EVGL_API_Thread_Command_glFrustumfOES;
-
-void (*orig_evgl_api_glFrustumfOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-static void
-_evgl_api_thread_glFrustumfOES(void *data)
-{
-   EVGL_API_Thread_Command_glFrustumfOES *thread_data =
-      (EVGL_API_Thread_Command_glFrustumfOES *)data;
-
-   orig_evgl_api_glFrustumfOES(thread_data->left,
-                               thread_data->right,
-                               thread_data->bottom,
-                               thread_data->top,
-                               thread_data->zNear,
-                               thread_data->zFar);
-
-}
-
-EAPI void
-glFrustumfOES_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFrustumfOES(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFrustumfOES thread_data_local;
-   EVGL_API_Thread_Command_glFrustumfOES *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFrustumfOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glOrthofOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
- */
-
-typedef struct
-{
-   GLfloat left;
-   GLfloat right;
-   GLfloat bottom;
-   GLfloat top;
-   GLfloat zNear;
-   GLfloat zFar;
-
-} EVGL_API_Thread_Command_glOrthofOES;
-
-void (*orig_evgl_api_glOrthofOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-static void
-_evgl_api_thread_glOrthofOES(void *data)
-{
-   EVGL_API_Thread_Command_glOrthofOES *thread_data =
-      (EVGL_API_Thread_Command_glOrthofOES *)data;
-
-   orig_evgl_api_glOrthofOES(thread_data->left,
-                             thread_data->right,
-                             thread_data->bottom,
-                             thread_data->top,
-                             thread_data->zNear,
-                             thread_data->zFar);
-
-}
-
-EAPI void
-glOrthofOES_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glOrthofOES(left, right, bottom, top, zNear, zFar);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glOrthofOES thread_data_local;
-   EVGL_API_Thread_Command_glOrthofOES *thread_data = &thread_data_local;
-
-   thread_data->left = left;
-   thread_data->right = right;
-   thread_data->bottom = bottom;
-   thread_data->top = top;
-   thread_data->zNear = zNear;
-   thread_data->zFar = zFar;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glOrthofOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanefOES(GLenum plane, const GLfloat *equation);
- */
-
-typedef struct
-{
-   GLenum plane;
-   const GLfloat *equation;
-
-} EVGL_API_Thread_Command_glClipPlanefOES;
-
-void (*orig_evgl_api_glClipPlanefOES)(GLenum plane, const GLfloat *equation);
-
-static void
-_evgl_api_thread_glClipPlanefOES(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanefOES *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanefOES *)data;
-
-   orig_evgl_api_glClipPlanefOES(thread_data->plane,
-                                 thread_data->equation);
-
-}
-
-EAPI void
-glClipPlanefOES_evgl_api_thread_cmd(GLenum plane, const GLfloat *equation)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanefOES(plane, equation);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanefOES thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanefOES *thread_data = &thread_data_local;
-
-   thread_data->plane = plane;
-   thread_data->equation = equation;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanefOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetClipPlanefOES(GLenum pname, GLfloat eqn[4]);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat eqn[4];
-
-} EVGL_API_Thread_Command_glGetClipPlanefOES;
-
-void (*orig_evgl_api_glGetClipPlanefOES)(GLenum pname, GLfloat eqn[4]);
-
-static void
-_evgl_api_thread_glGetClipPlanefOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetClipPlanefOES *thread_data =
-      (EVGL_API_Thread_Command_glGetClipPlanefOES *)data;
-
-   orig_evgl_api_glGetClipPlanefOES(thread_data->pname,
-                                    thread_data->eqn);
-
-}
-
-EAPI void
-glGetClipPlanefOES_evgl_api_thread_cmd(GLenum pname, GLfloat eqn[4])
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetClipPlanefOES(pname, eqn);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetClipPlanefOES thread_data_local;
-   EVGL_API_Thread_Command_glGetClipPlanefOES *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   memcpy(thread_data->eqn, &eqn, sizeof(GLfloat) * 4);
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetClipPlanefOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearDepthfOES(GLclampf depth);
- */
-
-typedef struct
-{
-   GLclampf depth;
-
-} EVGL_API_Thread_Command_glClearDepthfOES;
-
-void (*orig_evgl_api_glClearDepthfOES)(GLclampf depth);
-
-static void
-_evgl_api_thread_glClearDepthfOES(void *data)
-{
-   EVGL_API_Thread_Command_glClearDepthfOES *thread_data =
-      (EVGL_API_Thread_Command_glClearDepthfOES *)data;
-
-   orig_evgl_api_glClearDepthfOES(thread_data->depth);
-
-}
-
-EAPI void
-glClearDepthfOES_evgl_api_thread_cmd(GLclampf depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearDepthfOES(depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearDepthfOES thread_data_local;
-   EVGL_API_Thread_Command_glClearDepthfOES *thread_data = &thread_data_local;
-
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearDepthfOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGenfOES(GLenum coord, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glTexGenfOES;
-
-void (*orig_evgl_api_glTexGenfOES)(GLenum coord, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glTexGenfOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGenfOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGenfOES *)data;
-
-   orig_evgl_api_glTexGenfOES(thread_data->coord,
-                              thread_data->pname,
-                              thread_data->param);
-
-}
-
-EAPI void
-glTexGenfOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGenfOES(coord, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGenfOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGenfOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGenfOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   const GLfloat *params;
-
-} EVGL_API_Thread_Command_glTexGenfvOES;
-
-void (*orig_evgl_api_glTexGenfvOES)(GLenum coord, GLenum pname, const GLfloat *params);
-
-static void
-_evgl_api_thread_glTexGenfvOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGenfvOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGenfvOES *)data;
-
-   orig_evgl_api_glTexGenfvOES(thread_data->coord,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glTexGenfvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGenfvOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGenfvOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGenfvOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGenfvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGeniOES(GLenum coord, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLint param;
-
-} EVGL_API_Thread_Command_glTexGeniOES;
-
-void (*orig_evgl_api_glTexGeniOES)(GLenum coord, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glTexGeniOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGeniOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGeniOES *)data;
-
-   orig_evgl_api_glTexGeniOES(thread_data->coord,
-                              thread_data->pname,
-                              thread_data->param);
-
-}
-
-EAPI void
-glTexGeniOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGeniOES(coord, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGeniOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGeniOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGeniOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGenivOES(GLenum coord, GLenum pname, const GLint *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   const GLint *params;
-
-} EVGL_API_Thread_Command_glTexGenivOES;
-
-void (*orig_evgl_api_glTexGenivOES)(GLenum coord, GLenum pname, const GLint *params);
-
-static void
-_evgl_api_thread_glTexGenivOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGenivOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGenivOES *)data;
-
-   orig_evgl_api_glTexGenivOES(thread_data->coord,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glTexGenivOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGenivOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGenivOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGenivOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGenivOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGenxOES(GLenum coord, GLenum pname, GLfixed param);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLfixed param;
-
-} EVGL_API_Thread_Command_glTexGenxOES;
-
-void (*orig_evgl_api_glTexGenxOES)(GLenum coord, GLenum pname, GLfixed param);
-
-static void
-_evgl_api_thread_glTexGenxOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGenxOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGenxOES *)data;
-
-   orig_evgl_api_glTexGenxOES(thread_data->coord,
-                              thread_data->pname,
-                              thread_data->param);
-
-}
-
-EAPI void
-glTexGenxOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfixed param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGenxOES(coord, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGenxOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGenxOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGenxOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   const GLfixed *params;
-
-} EVGL_API_Thread_Command_glTexGenxvOES;
-
-void (*orig_evgl_api_glTexGenxvOES)(GLenum coord, GLenum pname, const GLfixed *params);
-
-static void
-_evgl_api_thread_glTexGenxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glTexGenxvOES *thread_data =
-      (EVGL_API_Thread_Command_glTexGenxvOES *)data;
-
-   orig_evgl_api_glTexGenxvOES(thread_data->coord,
-                               thread_data->pname,
-                               thread_data->params);
-
-}
-
-EAPI void
-glTexGenxvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexGenxvOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexGenxvOES thread_data_local;
-   EVGL_API_Thread_Command_glTexGenxvOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexGenxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_API_Thread_Command_glGetTexGenfvOES;
-
-void (*orig_evgl_api_glGetTexGenfvOES)(GLenum coord, GLenum pname, GLfloat *params);
-
-static void
-_evgl_api_thread_glGetTexGenfvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexGenfvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetTexGenfvOES *)data;
-
-   orig_evgl_api_glGetTexGenfvOES(thread_data->coord,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glGetTexGenfvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexGenfvOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexGenfvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetTexGenfvOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexGenfvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexGenivOES(GLenum coord, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetTexGenivOES;
-
-void (*orig_evgl_api_glGetTexGenivOES)(GLenum coord, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetTexGenivOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexGenivOES *thread_data =
-      (EVGL_API_Thread_Command_glGetTexGenivOES *)data;
-
-   orig_evgl_api_glGetTexGenivOES(thread_data->coord,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glGetTexGenivOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexGenivOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexGenivOES thread_data_local;
-   EVGL_API_Thread_Command_glGetTexGenivOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexGenivOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params);
- */
-
-typedef struct
-{
-   GLenum coord;
-   GLenum pname;
-   GLfixed *params;
-
-} EVGL_API_Thread_Command_glGetTexGenxvOES;
-
-void (*orig_evgl_api_glGetTexGenxvOES)(GLenum coord, GLenum pname, GLfixed *params);
-
-static void
-_evgl_api_thread_glGetTexGenxvOES(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexGenxvOES *thread_data =
-      (EVGL_API_Thread_Command_glGetTexGenxvOES *)data;
-
-   orig_evgl_api_glGetTexGenxvOES(thread_data->coord,
-                                  thread_data->pname,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glGetTexGenxvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfixed *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexGenxvOES(coord, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexGenxvOES thread_data_local;
-   EVGL_API_Thread_Command_glGetTexGenxvOES *thread_data = &thread_data_local;
-
-   thread_data->coord = coord;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexGenxvOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindVertexArrayOES(GLuint array);
- */
-
-typedef struct
-{
-   GLuint array;
-
-} EVGL_API_Thread_Command_glBindVertexArrayOES;
-
-void (*orig_evgl_api_glBindVertexArrayOES)(GLuint array);
-
-static void
-_evgl_api_thread_glBindVertexArrayOES(void *data)
-{
-   EVGL_API_Thread_Command_glBindVertexArrayOES *thread_data =
-      (EVGL_API_Thread_Command_glBindVertexArrayOES *)data;
-
-   orig_evgl_api_glBindVertexArrayOES(thread_data->array);
-
-}
-
-EAPI void
-glBindVertexArrayOES_evgl_api_thread_cmd(GLuint array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindVertexArrayOES(array);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindVertexArrayOES thread_data_local;
-   EVGL_API_Thread_Command_glBindVertexArrayOES *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindVertexArrayOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *arrays;
-
-} EVGL_API_Thread_Command_glDeleteVertexArraysOES;
-
-void (*orig_evgl_api_glDeleteVertexArraysOES)(GLsizei n, const GLuint *arrays);
-
-static void
-_evgl_api_thread_glDeleteVertexArraysOES(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteVertexArraysOES *thread_data =
-      (EVGL_API_Thread_Command_glDeleteVertexArraysOES *)data;
-
-   orig_evgl_api_glDeleteVertexArraysOES(thread_data->n,
-                                         thread_data->arrays);
-
-}
-
-EAPI void
-glDeleteVertexArraysOES_evgl_api_thread_cmd(GLsizei n, const GLuint *arrays)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteVertexArraysOES(n, arrays);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteVertexArraysOES thread_data_local;
-   EVGL_API_Thread_Command_glDeleteVertexArraysOES *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->arrays = arrays;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteVertexArraysOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenVertexArraysOES(GLsizei n, GLuint *arrays);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *arrays;
-
-} EVGL_API_Thread_Command_glGenVertexArraysOES;
-
-void (*orig_evgl_api_glGenVertexArraysOES)(GLsizei n, GLuint *arrays);
-
-static void
-_evgl_api_thread_glGenVertexArraysOES(void *data)
-{
-   EVGL_API_Thread_Command_glGenVertexArraysOES *thread_data =
-      (EVGL_API_Thread_Command_glGenVertexArraysOES *)data;
-
-   orig_evgl_api_glGenVertexArraysOES(thread_data->n,
-                                      thread_data->arrays);
-
-}
-
-EAPI void
-glGenVertexArraysOES_evgl_api_thread_cmd(GLsizei n, GLuint *arrays)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenVertexArraysOES(n, arrays);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenVertexArraysOES thread_data_local;
-   EVGL_API_Thread_Command_glGenVertexArraysOES *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->arrays = arrays;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenVertexArraysOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsVertexArrayOES(GLuint array);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint array;
-
-} EVGL_API_Thread_Command_glIsVertexArrayOES;
-
-GLboolean (*orig_evgl_api_glIsVertexArrayOES)(GLuint array);
-
-static void
-_evgl_api_thread_glIsVertexArrayOES(void *data)
-{
-   EVGL_API_Thread_Command_glIsVertexArrayOES *thread_data =
-      (EVGL_API_Thread_Command_glIsVertexArrayOES *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsVertexArrayOES(thread_data->array);
-
-}
-
-EAPI GLboolean
-glIsVertexArrayOES_evgl_api_thread_cmd(GLuint array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsVertexArrayOES(array);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsVertexArrayOES thread_data_local;
-   EVGL_API_Thread_Command_glIsVertexArrayOES *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsVertexArrayOES,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glCopyTextureLevelsAPPLE(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
- */
-
-typedef struct
-{
-   GLuint destinationTexture;
-   GLuint sourceTexture;
-   GLint sourceBaseLevel;
-   GLsizei sourceLevelCount;
-
-} EVGL_API_Thread_Command_glCopyTextureLevelsAPPLE;
-
-void (*orig_evgl_api_glCopyTextureLevelsAPPLE)(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
-
-static void
-_evgl_api_thread_glCopyTextureLevelsAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glCopyTextureLevelsAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glCopyTextureLevelsAPPLE *)data;
-
-   orig_evgl_api_glCopyTextureLevelsAPPLE(thread_data->destinationTexture,
-                                          thread_data->sourceTexture,
-                                          thread_data->sourceBaseLevel,
-                                          thread_data->sourceLevelCount);
-
-}
-
-EAPI void
-glCopyTextureLevelsAPPLE_evgl_api_thread_cmd(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyTextureLevelsAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glCopyTextureLevelsAPPLE *thread_data = &thread_data_local;
-
-   thread_data->destinationTexture = destinationTexture;
-   thread_data->sourceTexture = sourceTexture;
-   thread_data->sourceBaseLevel = sourceBaseLevel;
-   thread_data->sourceLevelCount = sourceLevelCount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyTextureLevelsAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorageMultisampleAPPLE(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLsizei b;
-   GLenum c;
-   GLsizei d;
-   GLsizei e;
-
-} EVGL_API_Thread_Command_glRenderbufferStorageMultisampleAPPLE;
-
-void (*orig_evgl_api_glRenderbufferStorageMultisampleAPPLE)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-static void
-_evgl_api_thread_glRenderbufferStorageMultisampleAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorageMultisampleAPPLE *)data;
-
-   orig_evgl_api_glRenderbufferStorageMultisampleAPPLE(thread_data->a,
-                                                       thread_data->b,
-                                                       thread_data->c,
-                                                       thread_data->d,
-                                                       thread_data->e);
-
-}
-
-EAPI void
-glRenderbufferStorageMultisampleAPPLE_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorageMultisampleAPPLE(a, b, c, d, e);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleAPPLE *thread_data = &thread_data_local;
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorageMultisampleAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glResolveMultisampleFramebufferAPPLE(void);
- */
-
-void (*orig_evgl_api_glResolveMultisampleFramebufferAPPLE)(void);
-
-static void
-_evgl_api_thread_glResolveMultisampleFramebufferAPPLE(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glResolveMultisampleFramebufferAPPLE();
-
-}
-
-EAPI void
-glResolveMultisampleFramebufferAPPLE_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glResolveMultisampleFramebufferAPPLE();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glResolveMultisampleFramebufferAPPLE,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * GLsync
- * glFenceSyncAPPLE(GLenum condition, GLbitfield flags);
- */
-
-typedef struct
-{
-   GLsync return_value;
-   GLenum condition;
-   GLbitfield flags;
-
-} EVGL_API_Thread_Command_glFenceSyncAPPLE;
-
-GLsync (*orig_evgl_api_glFenceSyncAPPLE)(GLenum condition, GLbitfield flags);
-
-static void
-_evgl_api_thread_glFenceSyncAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glFenceSyncAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glFenceSyncAPPLE *)data;
-
-   thread_data->return_value = orig_evgl_api_glFenceSyncAPPLE(thread_data->condition,
-                                                              thread_data->flags);
-
-}
-
-EAPI GLsync
-glFenceSyncAPPLE_evgl_api_thread_cmd(GLenum condition, GLbitfield flags)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glFenceSyncAPPLE(condition, flags);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFenceSyncAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glFenceSyncAPPLE *thread_data = &thread_data_local;
-
-   thread_data->condition = condition;
-   thread_data->flags = flags;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFenceSyncAPPLE,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsSyncAPPLE(GLsync sync);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLsync sync;
-
-} EVGL_API_Thread_Command_glIsSyncAPPLE;
-
-GLboolean (*orig_evgl_api_glIsSyncAPPLE)(GLsync sync);
-
-static void
-_evgl_api_thread_glIsSyncAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glIsSyncAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glIsSyncAPPLE *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsSyncAPPLE(thread_data->sync);
-
-}
-
-EAPI GLboolean
-glIsSyncAPPLE_evgl_api_thread_cmd(GLsync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsSyncAPPLE(sync);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsSyncAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glIsSyncAPPLE *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsSyncAPPLE,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glDeleteSyncAPPLE(GLsync sync);
- */
-
-typedef struct
-{
-   GLsync sync;
-
-} EVGL_API_Thread_Command_glDeleteSyncAPPLE;
-
-void (*orig_evgl_api_glDeleteSyncAPPLE)(GLsync sync);
-
-static void
-_evgl_api_thread_glDeleteSyncAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteSyncAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glDeleteSyncAPPLE *)data;
-
-   orig_evgl_api_glDeleteSyncAPPLE(thread_data->sync);
-
-}
-
-EAPI void
-glDeleteSyncAPPLE_evgl_api_thread_cmd(GLsync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteSyncAPPLE(sync);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteSyncAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glDeleteSyncAPPLE *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteSyncAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glClientWaitSyncAPPLE(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
- */
-
-typedef struct
-{
-   GLenum return_value;
-   GLsync sync;
-   GLbitfield flags;
-   EvasGLuint64 timeout;
-
-} EVGL_API_Thread_Command_glClientWaitSyncAPPLE;
-
-GLenum (*orig_evgl_api_glClientWaitSyncAPPLE)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-static void
-_evgl_api_thread_glClientWaitSyncAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glClientWaitSyncAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glClientWaitSyncAPPLE *)data;
-
-   thread_data->return_value = orig_evgl_api_glClientWaitSyncAPPLE(thread_data->sync,
-                                                                   thread_data->flags,
-                                                                   thread_data->timeout);
-
-}
-
-EAPI GLenum
-glClientWaitSyncAPPLE_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glClientWaitSyncAPPLE(sync, flags, timeout);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClientWaitSyncAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glClientWaitSyncAPPLE *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->flags = flags;
-   thread_data->timeout = timeout;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClientWaitSyncAPPLE,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glWaitSyncAPPLE(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
- */
-
-typedef struct
-{
-   GLsync sync;
-   GLbitfield flags;
-   EvasGLuint64 timeout;
-
-} EVGL_API_Thread_Command_glWaitSyncAPPLE;
-
-void (*orig_evgl_api_glWaitSyncAPPLE)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-static void
-_evgl_api_thread_glWaitSyncAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glWaitSyncAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glWaitSyncAPPLE *)data;
-
-   orig_evgl_api_glWaitSyncAPPLE(thread_data->sync,
-                                 thread_data->flags,
-                                 thread_data->timeout);
-
-}
-
-EAPI void
-glWaitSyncAPPLE_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glWaitSyncAPPLE(sync, flags, timeout);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glWaitSyncAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glWaitSyncAPPLE *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->flags = flags;
-   thread_data->timeout = timeout;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glWaitSyncAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetInteger64vAPPLE(GLenum pname, EvasGLint64 *params);
- */
-
-typedef struct
-{
-   GLenum pname;
-   EvasGLint64 *params;
-
-} EVGL_API_Thread_Command_glGetInteger64vAPPLE;
-
-void (*orig_evgl_api_glGetInteger64vAPPLE)(GLenum pname, EvasGLint64 *params);
-
-static void
-_evgl_api_thread_glGetInteger64vAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glGetInteger64vAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glGetInteger64vAPPLE *)data;
-
-   orig_evgl_api_glGetInteger64vAPPLE(thread_data->pname,
-                                      thread_data->params);
-
-}
-
-EAPI void
-glGetInteger64vAPPLE_evgl_api_thread_cmd(GLenum pname, EvasGLint64 *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetInteger64vAPPLE(pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetInteger64vAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glGetInteger64vAPPLE *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetInteger64vAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- */
-
-typedef struct
-{
-   GLsync sync;
-   GLenum pname;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLint *values;
-
-} EVGL_API_Thread_Command_glGetSyncivAPPLE;
-
-void (*orig_evgl_api_glGetSyncivAPPLE)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
-static void
-_evgl_api_thread_glGetSyncivAPPLE(void *data)
-{
-   EVGL_API_Thread_Command_glGetSyncivAPPLE *thread_data =
-      (EVGL_API_Thread_Command_glGetSyncivAPPLE *)data;
-
-   orig_evgl_api_glGetSyncivAPPLE(thread_data->sync,
-                                  thread_data->pname,
-                                  thread_data->bufSize,
-                                  thread_data->length,
-                                  thread_data->values);
-
-}
-
-EAPI void
-glGetSyncivAPPLE_evgl_api_thread_cmd(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSyncivAPPLE(sync, pname, bufSize, length, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSyncivAPPLE thread_data_local;
-   EVGL_API_Thread_Command_glGetSyncivAPPLE *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->pname = pname;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSyncivAPPLE,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void *
- * glMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- */
-
-typedef struct
-{
-   void * return_value;
-   GLenum target;
-   GLintptr offset;
-   GLsizeiptr length;
-   GLbitfield access;
-
-} EVGL_API_Thread_Command_glMapBufferRangeEXT;
-
-void * (*orig_evgl_api_glMapBufferRangeEXT)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-
-static void
-_evgl_api_thread_glMapBufferRangeEXT(void *data)
-{
-   EVGL_API_Thread_Command_glMapBufferRangeEXT *thread_data =
-      (EVGL_API_Thread_Command_glMapBufferRangeEXT *)data;
-
-   thread_data->return_value = orig_evgl_api_glMapBufferRangeEXT(thread_data->target,
-                                                                 thread_data->offset,
-                                                                 thread_data->length,
-                                                                 thread_data->access);
-
-}
-
-EAPI void *
-glMapBufferRangeEXT_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glMapBufferRangeEXT(target, offset, length, access);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMapBufferRangeEXT thread_data_local;
-   EVGL_API_Thread_Command_glMapBufferRangeEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->offset = offset;
-   thread_data->length = length;
-   thread_data->access = access;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMapBufferRangeEXT,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLintptr offset;
-   GLsizeiptr length;
-
-} EVGL_API_Thread_Command_glFlushMappedBufferRangeEXT;
-
-void (*orig_evgl_api_glFlushMappedBufferRangeEXT)(GLenum target, GLintptr offset, GLsizeiptr length);
-
-static void
-_evgl_api_thread_glFlushMappedBufferRangeEXT(void *data)
-{
-   EVGL_API_Thread_Command_glFlushMappedBufferRangeEXT *thread_data =
-      (EVGL_API_Thread_Command_glFlushMappedBufferRangeEXT *)data;
-
-   orig_evgl_api_glFlushMappedBufferRangeEXT(thread_data->target,
-                                             thread_data->offset,
-                                             thread_data->length);
-
-}
-
-EAPI void
-glFlushMappedBufferRangeEXT_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFlushMappedBufferRangeEXT(target, offset, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFlushMappedBufferRangeEXT thread_data_local;
-   EVGL_API_Thread_Command_glFlushMappedBufferRangeEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->offset = offset;
-   thread_data->length = length;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFlushMappedBufferRangeEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorageMultisampleEXT(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLsizei b;
-   GLenum c;
-   GLsizei d;
-   GLsizei e;
-
-} EVGL_API_Thread_Command_glRenderbufferStorageMultisampleEXT;
-
-void (*orig_evgl_api_glRenderbufferStorageMultisampleEXT)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-static void
-_evgl_api_thread_glRenderbufferStorageMultisampleEXT(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleEXT *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorageMultisampleEXT *)data;
-
-   orig_evgl_api_glRenderbufferStorageMultisampleEXT(thread_data->a,
-                                                     thread_data->b,
-                                                     thread_data->c,
-                                                     thread_data->d,
-                                                     thread_data->e);
-
-}
-
-EAPI void
-glRenderbufferStorageMultisampleEXT_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorageMultisampleEXT(a, b, c, d, e);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleEXT thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleEXT *thread_data = &thread_data_local;
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorageMultisampleEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2DMultisample(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLenum b;
-   GLenum c;
-   GLuint d;
-   GLint e;
-   GLsizei f;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferTexture2DMultisample;
-
-void (*orig_evgl_api_glFramebufferTexture2DMultisample)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-static void
-_evgl_api_thread_glFramebufferTexture2DMultisample(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisample *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture2DMultisample *)data;
-
-   orig_evgl_api_glFramebufferTexture2DMultisample(thread_data->a,
-                                                   thread_data->b,
-                                                   thread_data->c,
-                                                   thread_data->d,
-                                                   thread_data->e,
-                                                   thread_data->f);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2DMultisample_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture2DMultisample(a, b, c, d, e, f);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisample thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisample *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferTexture2DMultisample *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferTexture2DMultisample));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-   thread_data->f = f;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture2DMultisample,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2DMultisampleEXT(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLenum b;
-   GLenum c;
-   GLuint d;
-   GLint e;
-   GLsizei f;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT;
-
-void (*orig_evgl_api_glFramebufferTexture2DMultisampleEXT)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-static void
-_evgl_api_thread_glFramebufferTexture2DMultisampleEXT(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT *)data;
-
-   orig_evgl_api_glFramebufferTexture2DMultisampleEXT(thread_data->a,
-                                                      thread_data->b,
-                                                      thread_data->c,
-                                                      thread_data->d,
-                                                      thread_data->e,
-                                                      thread_data->f);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2DMultisampleEXT_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture2DMultisampleEXT(a, b, c, d, e, f);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleEXT));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-   thread_data->f = f;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture2DMultisampleEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glGetGraphicsResetStatus(void);
- */
-
-typedef struct
-{
-   GLenum return_value;
-
-} EVGL_API_Thread_Command_glGetGraphicsResetStatus;
-
-GLenum (*orig_evgl_api_glGetGraphicsResetStatus)(void);
-
-static void
-_evgl_api_thread_glGetGraphicsResetStatus(void *data)
-{
-   EVGL_API_Thread_Command_glGetGraphicsResetStatus *thread_data =
-      (EVGL_API_Thread_Command_glGetGraphicsResetStatus *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetGraphicsResetStatus();
-
-}
-
-EAPI GLenum
-glGetGraphicsResetStatus_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetGraphicsResetStatus();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetGraphicsResetStatus thread_data_local;
-   EVGL_API_Thread_Command_glGetGraphicsResetStatus *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetGraphicsResetStatus,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLenum
- * glGetGraphicsResetStatusEXT(void);
- */
-
-typedef struct
-{
-   GLenum return_value;
-
-} EVGL_API_Thread_Command_glGetGraphicsResetStatusEXT;
-
-GLenum (*orig_evgl_api_glGetGraphicsResetStatusEXT)(void);
-
-static void
-_evgl_api_thread_glGetGraphicsResetStatusEXT(void *data)
-{
-   EVGL_API_Thread_Command_glGetGraphicsResetStatusEXT *thread_data =
-      (EVGL_API_Thread_Command_glGetGraphicsResetStatusEXT *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetGraphicsResetStatusEXT();
-
-}
-
-EAPI GLenum
-glGetGraphicsResetStatusEXT_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetGraphicsResetStatusEXT();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetGraphicsResetStatusEXT thread_data_local;
-   EVGL_API_Thread_Command_glGetGraphicsResetStatusEXT *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetGraphicsResetStatusEXT,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   GLsizei bufSize;
-   void *data;
-
-} EVGL_API_Thread_Command_glReadnPixels;
-
-void (*orig_evgl_api_glReadnPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-
-static void
-_evgl_api_thread_glReadnPixels(void *data)
-{
-   EVGL_API_Thread_Command_glReadnPixels *thread_data =
-      (EVGL_API_Thread_Command_glReadnPixels *)data;
-
-   orig_evgl_api_glReadnPixels(thread_data->x,
-                               thread_data->y,
-                               thread_data->width,
-                               thread_data->height,
-                               thread_data->format,
-                               thread_data->type,
-                               thread_data->bufSize,
-                               thread_data->data);
-
-}
-
-EAPI void
-glReadnPixels_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glReadnPixels(x, y, width, height, format, type, bufSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glReadnPixels thread_data_local;
-   EVGL_API_Thread_Command_glReadnPixels *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->bufSize = bufSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glReadnPixels,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   GLsizei bufSize;
-   void *data;
-
-} EVGL_API_Thread_Command_glReadnPixelsEXT;
-
-void (*orig_evgl_api_glReadnPixelsEXT)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-
-static void
-_evgl_api_thread_glReadnPixelsEXT(void *data)
-{
-   EVGL_API_Thread_Command_glReadnPixelsEXT *thread_data =
-      (EVGL_API_Thread_Command_glReadnPixelsEXT *)data;
-
-   orig_evgl_api_glReadnPixelsEXT(thread_data->x,
-                                  thread_data->y,
-                                  thread_data->width,
-                                  thread_data->height,
-                                  thread_data->format,
-                                  thread_data->type,
-                                  thread_data->bufSize,
-                                  thread_data->data);
-
-}
-
-EAPI void
-glReadnPixelsEXT_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glReadnPixelsEXT thread_data_local;
-   EVGL_API_Thread_Command_glReadnPixelsEXT *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->bufSize = bufSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glReadnPixelsEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, float *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei bufSize;
-   float *params;
-
-} EVGL_API_Thread_Command_glGetnUniformfv;
-
-void (*orig_evgl_api_glGetnUniformfv)(GLuint program, GLint location, GLsizei bufSize, float *params);
-
-static void
-_evgl_api_thread_glGetnUniformfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetnUniformfv *thread_data =
-      (EVGL_API_Thread_Command_glGetnUniformfv *)data;
-
-   orig_evgl_api_glGetnUniformfv(thread_data->program,
-                                 thread_data->location,
-                                 thread_data->bufSize,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetnUniformfv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, float *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetnUniformfv(program, location, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetnUniformfv thread_data_local;
-   EVGL_API_Thread_Command_glGetnUniformfv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetnUniformfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, float *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei bufSize;
-   float *params;
-
-} EVGL_API_Thread_Command_glGetnUniformfvEXT;
-
-void (*orig_evgl_api_glGetnUniformfvEXT)(GLuint program, GLint location, GLsizei bufSize, float *params);
-
-static void
-_evgl_api_thread_glGetnUniformfvEXT(void *data)
-{
-   EVGL_API_Thread_Command_glGetnUniformfvEXT *thread_data =
-      (EVGL_API_Thread_Command_glGetnUniformfvEXT *)data;
-
-   orig_evgl_api_glGetnUniformfvEXT(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->bufSize,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glGetnUniformfvEXT_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, float *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetnUniformfvEXT(program, location, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetnUniformfvEXT thread_data_local;
-   EVGL_API_Thread_Command_glGetnUniformfvEXT *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetnUniformfvEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei bufSize;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetnUniformiv;
-
-void (*orig_evgl_api_glGetnUniformiv)(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-
-static void
-_evgl_api_thread_glGetnUniformiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetnUniformiv *thread_data =
-      (EVGL_API_Thread_Command_glGetnUniformiv *)data;
-
-   orig_evgl_api_glGetnUniformiv(thread_data->program,
-                                 thread_data->location,
-                                 thread_data->bufSize,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetnUniformiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetnUniformiv(program, location, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetnUniformiv thread_data_local;
-   EVGL_API_Thread_Command_glGetnUniformiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetnUniformiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei bufSize;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetnUniformivEXT;
-
-void (*orig_evgl_api_glGetnUniformivEXT)(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-
-static void
-_evgl_api_thread_glGetnUniformivEXT(void *data)
-{
-   EVGL_API_Thread_Command_glGetnUniformivEXT *thread_data =
-      (EVGL_API_Thread_Command_glGetnUniformivEXT *)data;
-
-   orig_evgl_api_glGetnUniformivEXT(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->bufSize,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glGetnUniformivEXT_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetnUniformivEXT(program, location, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetnUniformivEXT thread_data_local;
-   EVGL_API_Thread_Command_glGetnUniformivEXT *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetnUniformivEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-
-} EVGL_API_Thread_Command_glTexStorage1DEXT;
-
-void (*orig_evgl_api_glTexStorage1DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-
-static void
-_evgl_api_thread_glTexStorage1DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage1DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage1DEXT *)data;
-
-   orig_evgl_api_glTexStorage1DEXT(thread_data->target,
-                                   thread_data->levels,
-                                   thread_data->internalformat,
-                                   thread_data->width);
-
-}
-
-EAPI void
-glTexStorage1DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage1DEXT(target, levels, internalformat, width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage1DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage1DEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage1DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glTexStorage2DEXT;
-
-void (*orig_evgl_api_glTexStorage2DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glTexStorage2DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage2DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage2DEXT *)data;
-
-   orig_evgl_api_glTexStorage2DEXT(thread_data->target,
-                                   thread_data->levels,
-                                   thread_data->internalformat,
-                                   thread_data->width,
-                                   thread_data->height);
-
-}
-
-EAPI void
-glTexStorage2DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage2DEXT(target, levels, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage2DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage2DEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage2DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-
-} EVGL_API_Thread_Command_glTexStorage3DEXT;
-
-void (*orig_evgl_api_glTexStorage3DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-static void
-_evgl_api_thread_glTexStorage3DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage3DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage3DEXT *)data;
-
-   orig_evgl_api_glTexStorage3DEXT(thread_data->target,
-                                   thread_data->levels,
-                                   thread_data->internalformat,
-                                   thread_data->width,
-                                   thread_data->height,
-                                   thread_data->depth);
-
-}
-
-EAPI void
-glTexStorage3DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage3DEXT(target, levels, internalformat, width, height, depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage3DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage3DEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage3DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
- */
-
-typedef struct
-{
-   GLuint texture;
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-
-} EVGL_API_Thread_Command_glTextureStorage1DEXT;
-
-void (*orig_evgl_api_glTextureStorage1DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-
-static void
-_evgl_api_thread_glTextureStorage1DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTextureStorage1DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTextureStorage1DEXT *)data;
-
-   orig_evgl_api_glTextureStorage1DEXT(thread_data->texture,
-                                       thread_data->target,
-                                       thread_data->levels,
-                                       thread_data->internalformat,
-                                       thread_data->width);
-
-}
-
-EAPI void
-glTextureStorage1DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTextureStorage1DEXT(texture, target, levels, internalformat, width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTextureStorage1DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTextureStorage1DEXT *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTextureStorage1DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLuint texture;
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glTextureStorage2DEXT;
-
-void (*orig_evgl_api_glTextureStorage2DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glTextureStorage2DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTextureStorage2DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTextureStorage2DEXT *)data;
-
-   orig_evgl_api_glTextureStorage2DEXT(thread_data->texture,
-                                       thread_data->target,
-                                       thread_data->levels,
-                                       thread_data->internalformat,
-                                       thread_data->width,
-                                       thread_data->height);
-
-}
-
-EAPI void
-glTextureStorage2DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTextureStorage2DEXT(texture, target, levels, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTextureStorage2DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTextureStorage2DEXT *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTextureStorage2DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- */
-
-typedef struct
-{
-   GLuint texture;
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-
-} EVGL_API_Thread_Command_glTextureStorage3DEXT;
-
-void (*orig_evgl_api_glTextureStorage3DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-static void
-_evgl_api_thread_glTextureStorage3DEXT(void *data)
-{
-   EVGL_API_Thread_Command_glTextureStorage3DEXT *thread_data =
-      (EVGL_API_Thread_Command_glTextureStorage3DEXT *)data;
-
-   orig_evgl_api_glTextureStorage3DEXT(thread_data->texture,
-                                       thread_data->target,
-                                       thread_data->levels,
-                                       thread_data->internalformat,
-                                       thread_data->width,
-                                       thread_data->height,
-                                       thread_data->depth);
-
-}
-
-EAPI void
-glTextureStorage3DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTextureStorage3DEXT thread_data_local;
-   EVGL_API_Thread_Command_glTextureStorage3DEXT *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTextureStorage3DEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanefIMG(GLenum a, const GLfloat * b);
- */
-
-typedef struct
-{
-   GLenum a;
-   const GLfloat * b;
-
-} EVGL_API_Thread_Command_glClipPlanefIMG;
-
-void (*orig_evgl_api_glClipPlanefIMG)(GLenum a, const GLfloat * b);
-
-static void
-_evgl_api_thread_glClipPlanefIMG(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanefIMG *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanefIMG *)data;
-
-   orig_evgl_api_glClipPlanefIMG(thread_data->a,
-                                 thread_data->b);
-
-}
-
-EAPI void
-glClipPlanefIMG_evgl_api_thread_cmd(GLenum a, const GLfloat * b)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanefIMG(a, b);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanefIMG thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanefIMG *thread_data = &thread_data_local;
-
-   thread_data->a = a;
-   thread_data->b = b;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanefIMG,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClipPlanexIMG(GLenum a, const GLfixed * b);
- */
-
-typedef struct
-{
-   GLenum a;
-   const GLfixed * b;
-
-} EVGL_API_Thread_Command_glClipPlanexIMG;
-
-void (*orig_evgl_api_glClipPlanexIMG)(GLenum a, const GLfixed * b);
-
-static void
-_evgl_api_thread_glClipPlanexIMG(void *data)
-{
-   EVGL_API_Thread_Command_glClipPlanexIMG *thread_data =
-      (EVGL_API_Thread_Command_glClipPlanexIMG *)data;
-
-   orig_evgl_api_glClipPlanexIMG(thread_data->a,
-                                 thread_data->b);
-
-}
-
-EAPI void
-glClipPlanexIMG_evgl_api_thread_cmd(GLenum a, const GLfixed * b)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClipPlanexIMG(a, b);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClipPlanexIMG thread_data_local;
-   EVGL_API_Thread_Command_glClipPlanexIMG *thread_data = &thread_data_local;
-
-   thread_data->a = a;
-   thread_data->b = b;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClipPlanexIMG,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorageMultisampleIMG(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLsizei b;
-   GLenum c;
-   GLsizei d;
-   GLsizei e;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG;
-
-void (*orig_evgl_api_glRenderbufferStorageMultisampleIMG)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-static void
-_evgl_api_thread_glRenderbufferStorageMultisampleIMG(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG *)data;
-
-   orig_evgl_api_glRenderbufferStorageMultisampleIMG(thread_data->a,
-                                                     thread_data->b,
-                                                     thread_data->c,
-                                                     thread_data->d,
-                                                     thread_data->e);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glRenderbufferStorageMultisampleIMG_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorageMultisampleIMG(a, b, c, d, e);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glRenderbufferStorageMultisampleIMG));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorageMultisampleIMG,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2DMultisampleIMG(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
- */
-
-typedef struct
-{
-   GLenum a;
-   GLenum b;
-   GLenum c;
-   GLuint d;
-   GLint e;
-   GLsizei f;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG;
-
-void (*orig_evgl_api_glFramebufferTexture2DMultisampleIMG)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-static void
-_evgl_api_thread_glFramebufferTexture2DMultisampleIMG(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG *)data;
-
-   orig_evgl_api_glFramebufferTexture2DMultisampleIMG(thread_data->a,
-                                                      thread_data->b,
-                                                      thread_data->c,
-                                                      thread_data->d,
-                                                      thread_data->e,
-                                                      thread_data->f);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2DMultisampleIMG_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture2DMultisampleIMG(a, b, c, d, e, f);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glFramebufferTexture2DMultisampleIMG));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
-   thread_data->f = f;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture2DMultisampleIMG,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
- */
-
-typedef struct
-{
-   GLuint x;
-   GLuint y;
-   GLuint width;
-   GLuint height;
-   GLbitfield preserveMask;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glStartTilingQCOM;
-
-void (*orig_evgl_api_glStartTilingQCOM)(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
-
-static void
-_evgl_api_thread_glStartTilingQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glStartTilingQCOM *thread_data =
-      (EVGL_API_Thread_Command_glStartTilingQCOM *)data;
-
-   orig_evgl_api_glStartTilingQCOM(thread_data->x,
-                                   thread_data->y,
-                                   thread_data->width,
-                                   thread_data->height,
-                                   thread_data->preserveMask);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glStartTilingQCOM_evgl_api_thread_cmd(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glStartTilingQCOM(x, y, width, height, preserveMask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glStartTilingQCOM thread_data_local;
-   EVGL_API_Thread_Command_glStartTilingQCOM *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glStartTilingQCOM *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glStartTilingQCOM));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->preserveMask = preserveMask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glStartTilingQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEndTilingQCOM(GLbitfield preserveMask);
- */
-
-typedef struct
-{
-   GLbitfield preserveMask;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glEndTilingQCOM;
-
-void (*orig_evgl_api_glEndTilingQCOM)(GLbitfield preserveMask);
-
-static void
-_evgl_api_thread_glEndTilingQCOM(void *data)
-{
-   EVGL_API_Thread_Command_glEndTilingQCOM *thread_data =
-      (EVGL_API_Thread_Command_glEndTilingQCOM *)data;
-
-   orig_evgl_api_glEndTilingQCOM(thread_data->preserveMask);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glEndTilingQCOM_evgl_api_thread_cmd(GLbitfield preserveMask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEndTilingQCOM(preserveMask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEndTilingQCOM thread_data_local;
-   EVGL_API_Thread_Command_glEndTilingQCOM *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glEndTilingQCOM *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glEndTilingQCOM));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->preserveMask = preserveMask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEndTilingQCOM,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBeginQuery(GLenum target, GLuint id);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint id;
-
-} EVGL_API_Thread_Command_glBeginQuery;
-
-void (*orig_evgl_api_glBeginQuery)(GLenum target, GLuint id);
-
-static void
-_evgl_api_thread_glBeginQuery(void *data)
-{
-   EVGL_API_Thread_Command_glBeginQuery *thread_data =
-      (EVGL_API_Thread_Command_glBeginQuery *)data;
-
-   orig_evgl_api_glBeginQuery(thread_data->target,
-                              thread_data->id);
-
-}
-
-EAPI void
-glBeginQuery_evgl_api_thread_cmd(GLenum target, GLuint id)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBeginQuery(target, id);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBeginQuery thread_data_local;
-   EVGL_API_Thread_Command_glBeginQuery *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->id = id;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBeginQuery,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBeginTransformFeedback(GLenum primitiveMode);
- */
-
-typedef struct
-{
-   GLenum primitiveMode;
-
-} EVGL_API_Thread_Command_glBeginTransformFeedback;
-
-void (*orig_evgl_api_glBeginTransformFeedback)(GLenum primitiveMode);
-
-static void
-_evgl_api_thread_glBeginTransformFeedback(void *data)
-{
-   EVGL_API_Thread_Command_glBeginTransformFeedback *thread_data =
-      (EVGL_API_Thread_Command_glBeginTransformFeedback *)data;
-
-   orig_evgl_api_glBeginTransformFeedback(thread_data->primitiveMode);
-
-}
-
-EAPI void
-glBeginTransformFeedback_evgl_api_thread_cmd(GLenum primitiveMode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBeginTransformFeedback(primitiveMode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBeginTransformFeedback thread_data_local;
-   EVGL_API_Thread_Command_glBeginTransformFeedback *thread_data = &thread_data_local;
-
-   thread_data->primitiveMode = primitiveMode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBeginTransformFeedback,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-   GLuint buffer;
-
-} EVGL_API_Thread_Command_glBindBufferBase;
-
-void (*orig_evgl_api_glBindBufferBase)(GLenum target, GLuint index, GLuint buffer);
-
-static void
-_evgl_api_thread_glBindBufferBase(void *data)
-{
-   EVGL_API_Thread_Command_glBindBufferBase *thread_data =
-      (EVGL_API_Thread_Command_glBindBufferBase *)data;
-
-   orig_evgl_api_glBindBufferBase(thread_data->target,
-                                  thread_data->index,
-                                  thread_data->buffer);
-
-}
-
-EAPI void
-glBindBufferBase_evgl_api_thread_cmd(GLenum target, GLuint index, GLuint buffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindBufferBase(target, index, buffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindBufferBase thread_data_local;
-   EVGL_API_Thread_Command_glBindBufferBase *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindBufferBase,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-   GLuint buffer;
-   GLintptr offset;
-   GLsizeiptr size;
-
-} EVGL_API_Thread_Command_glBindBufferRange;
-
-void (*orig_evgl_api_glBindBufferRange)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-
-static void
-_evgl_api_thread_glBindBufferRange(void *data)
-{
-   EVGL_API_Thread_Command_glBindBufferRange *thread_data =
-      (EVGL_API_Thread_Command_glBindBufferRange *)data;
-
-   orig_evgl_api_glBindBufferRange(thread_data->target,
-                                   thread_data->index,
-                                   thread_data->buffer,
-                                   thread_data->offset,
-                                   thread_data->size);
-
-}
-
-EAPI void
-glBindBufferRange_evgl_api_thread_cmd(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindBufferRange(target, index, buffer, offset, size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindBufferRange thread_data_local;
-   EVGL_API_Thread_Command_glBindBufferRange *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-   thread_data->buffer = buffer;
-   thread_data->offset = offset;
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindBufferRange,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindSampler(GLuint unit, GLuint sampler);
- */
-
-typedef struct
-{
-   GLuint unit;
-   GLuint sampler;
-
-} EVGL_API_Thread_Command_glBindSampler;
-
-void (*orig_evgl_api_glBindSampler)(GLuint unit, GLuint sampler);
-
-static void
-_evgl_api_thread_glBindSampler(void *data)
-{
-   EVGL_API_Thread_Command_glBindSampler *thread_data =
-      (EVGL_API_Thread_Command_glBindSampler *)data;
-
-   orig_evgl_api_glBindSampler(thread_data->unit,
-                               thread_data->sampler);
-
-}
-
-EAPI void
-glBindSampler_evgl_api_thread_cmd(GLuint unit, GLuint sampler)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindSampler(unit, sampler);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindSampler thread_data_local;
-   EVGL_API_Thread_Command_glBindSampler *thread_data = &thread_data_local;
-
-   thread_data->unit = unit;
-   thread_data->sampler = sampler;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindSampler,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindTransformFeedback(GLenum target, GLuint id);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint id;
-
-} EVGL_API_Thread_Command_glBindTransformFeedback;
-
-void (*orig_evgl_api_glBindTransformFeedback)(GLenum target, GLuint id);
-
-static void
-_evgl_api_thread_glBindTransformFeedback(void *data)
-{
-   EVGL_API_Thread_Command_glBindTransformFeedback *thread_data =
-      (EVGL_API_Thread_Command_glBindTransformFeedback *)data;
-
-   orig_evgl_api_glBindTransformFeedback(thread_data->target,
-                                         thread_data->id);
-
-}
-
-EAPI void
-glBindTransformFeedback_evgl_api_thread_cmd(GLenum target, GLuint id)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindTransformFeedback(target, id);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindTransformFeedback thread_data_local;
-   EVGL_API_Thread_Command_glBindTransformFeedback *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->id = id;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindTransformFeedback,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindVertexArray(GLuint array);
- */
-
-typedef struct
-{
-   GLuint array;
-
-} EVGL_API_Thread_Command_glBindVertexArray;
-
-void (*orig_evgl_api_glBindVertexArray)(GLuint array);
-
-static void
-_evgl_api_thread_glBindVertexArray(void *data)
-{
-   EVGL_API_Thread_Command_glBindVertexArray *thread_data =
-      (EVGL_API_Thread_Command_glBindVertexArray *)data;
-
-   orig_evgl_api_glBindVertexArray(thread_data->array);
-
-}
-
-EAPI void
-glBindVertexArray_evgl_api_thread_cmd(GLuint array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindVertexArray(array);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindVertexArray thread_data_local;
-   EVGL_API_Thread_Command_glBindVertexArray *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindVertexArray,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
- */
-
-typedef struct
-{
-   GLint srcX0;
-   GLint srcY0;
-   GLint srcX1;
-   GLint srcY1;
-   GLint dstX0;
-   GLint dstY0;
-   GLint dstX1;
-   GLint dstY1;
-   GLbitfield mask;
-   GLenum filter;
-
-} EVGL_API_Thread_Command_glBlitFramebuffer;
-
-void (*orig_evgl_api_glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-
-static void
-_evgl_api_thread_glBlitFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glBlitFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glBlitFramebuffer *)data;
-
-   orig_evgl_api_glBlitFramebuffer(thread_data->srcX0,
-                                   thread_data->srcY0,
-                                   thread_data->srcX1,
-                                   thread_data->srcY1,
-                                   thread_data->dstX0,
-                                   thread_data->dstY0,
-                                   thread_data->dstX1,
-                                   thread_data->dstY1,
-                                   thread_data->mask,
-                                   thread_data->filter);
-
-}
-
-EAPI void
-glBlitFramebuffer_evgl_api_thread_cmd(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlitFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glBlitFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->srcX0 = srcX0;
-   thread_data->srcY0 = srcY0;
-   thread_data->srcX1 = srcX1;
-   thread_data->srcY1 = srcY1;
-   thread_data->dstX0 = dstX0;
-   thread_data->dstY0 = dstY0;
-   thread_data->dstX1 = dstX1;
-   thread_data->dstY1 = dstY1;
-   thread_data->mask = mask;
-   thread_data->filter = filter;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlitFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearBufferfi(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
- */
-
-typedef struct
-{
-   GLenum buffer;
-   GLint drawBuffer;
-   GLfloat depth;
-   GLint stencil;
-
-} EVGL_API_Thread_Command_glClearBufferfi;
-
-void (*orig_evgl_api_glClearBufferfi)(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
-
-static void
-_evgl_api_thread_glClearBufferfi(void *data)
-{
-   EVGL_API_Thread_Command_glClearBufferfi *thread_data =
-      (EVGL_API_Thread_Command_glClearBufferfi *)data;
-
-   orig_evgl_api_glClearBufferfi(thread_data->buffer,
-                                 thread_data->drawBuffer,
-                                 thread_data->depth,
-                                 thread_data->stencil);
-
-}
-
-EAPI void
-glClearBufferfi_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearBufferfi(buffer, drawBuffer, depth, stencil);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearBufferfi thread_data_local;
-   EVGL_API_Thread_Command_glClearBufferfi *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-   thread_data->drawBuffer = drawBuffer;
-   thread_data->depth = depth;
-   thread_data->stencil = stencil;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearBufferfi,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat * value);
- */
-
-typedef struct
-{
-   GLenum buffer;
-   GLint drawBuffer;
-   const GLfloat * value;
-
-} EVGL_API_Thread_Command_glClearBufferfv;
-
-void (*orig_evgl_api_glClearBufferfv)(GLenum buffer, GLint drawBuffer, const GLfloat * value);
-
-static void
-_evgl_api_thread_glClearBufferfv(void *data)
-{
-   EVGL_API_Thread_Command_glClearBufferfv *thread_data =
-      (EVGL_API_Thread_Command_glClearBufferfv *)data;
-
-   orig_evgl_api_glClearBufferfv(thread_data->buffer,
-                                 thread_data->drawBuffer,
-                                 thread_data->value);
-
-}
-
-EAPI void
-glClearBufferfv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLfloat * value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearBufferfv(buffer, drawBuffer, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearBufferfv thread_data_local;
-   EVGL_API_Thread_Command_glClearBufferfv *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-   thread_data->drawBuffer = drawBuffer;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearBufferfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearBufferiv(GLenum buffer, GLint drawBuffer, const GLint * value);
- */
-
-typedef struct
-{
-   GLenum buffer;
-   GLint drawBuffer;
-   const GLint * value;
-
-} EVGL_API_Thread_Command_glClearBufferiv;
-
-void (*orig_evgl_api_glClearBufferiv)(GLenum buffer, GLint drawBuffer, const GLint * value);
-
-static void
-_evgl_api_thread_glClearBufferiv(void *data)
-{
-   EVGL_API_Thread_Command_glClearBufferiv *thread_data =
-      (EVGL_API_Thread_Command_glClearBufferiv *)data;
-
-   orig_evgl_api_glClearBufferiv(thread_data->buffer,
-                                 thread_data->drawBuffer,
-                                 thread_data->value);
-
-}
-
-EAPI void
-glClearBufferiv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLint * value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearBufferiv(buffer, drawBuffer, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearBufferiv thread_data_local;
-   EVGL_API_Thread_Command_glClearBufferiv *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-   thread_data->drawBuffer = drawBuffer;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearBufferiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearBufferuiv(GLenum buffer, GLint drawBuffer, const GLuint * value);
- */
-
-typedef struct
-{
-   GLenum buffer;
-   GLint drawBuffer;
-   const GLuint * value;
-
-} EVGL_API_Thread_Command_glClearBufferuiv;
-
-void (*orig_evgl_api_glClearBufferuiv)(GLenum buffer, GLint drawBuffer, const GLuint * value);
-
-static void
-_evgl_api_thread_glClearBufferuiv(void *data)
-{
-   EVGL_API_Thread_Command_glClearBufferuiv *thread_data =
-      (EVGL_API_Thread_Command_glClearBufferuiv *)data;
-
-   orig_evgl_api_glClearBufferuiv(thread_data->buffer,
-                                  thread_data->drawBuffer,
-                                  thread_data->value);
-
-}
-
-EAPI void
-glClearBufferuiv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLuint * value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glClearBufferuiv(buffer, drawBuffer, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClearBufferuiv thread_data_local;
-   EVGL_API_Thread_Command_glClearBufferuiv *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-   thread_data->drawBuffer = drawBuffer;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClearBufferuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glClientWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
- */
-
-typedef struct
-{
-   GLenum return_value;
-   GLsync sync;
-   GLbitfield flags;
-   EvasGLuint64 timeout;
-
-} EVGL_API_Thread_Command_glClientWaitSync;
-
-GLenum (*orig_evgl_api_glClientWaitSync)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-static void
-_evgl_api_thread_glClientWaitSync(void *data)
-{
-   EVGL_API_Thread_Command_glClientWaitSync *thread_data =
-      (EVGL_API_Thread_Command_glClientWaitSync *)data;
-
-   thread_data->return_value = orig_evgl_api_glClientWaitSync(thread_data->sync,
-                                                              thread_data->flags,
-                                                              thread_data->timeout);
-
-}
-
-EAPI GLenum
-glClientWaitSync_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glClientWaitSync(sync, flags, timeout);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glClientWaitSync thread_data_local;
-   EVGL_API_Thread_Command_glClientWaitSync *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->flags = flags;
-   thread_data->timeout = timeout;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glClientWaitSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLint border;
-   GLsizei imageSize;
-   const GLvoid * data;
-
-} EVGL_API_Thread_Command_glCompressedTexImage3D;
-
-void (*orig_evgl_api_glCompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
-
-static void
-_evgl_api_thread_glCompressedTexImage3D(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexImage3D *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexImage3D *)data;
-
-   orig_evgl_api_glCompressedTexImage3D(thread_data->target,
-                                        thread_data->level,
-                                        thread_data->internalformat,
-                                        thread_data->width,
-                                        thread_data->height,
-                                        thread_data->depth,
-                                        thread_data->border,
-                                        thread_data->imageSize,
-                                        thread_data->data);
-
-}
-
-EAPI void
-glCompressedTexImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexImage3D thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexImage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->border = border;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexImage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLenum format;
-   GLsizei imageSize;
-   const GLvoid * data;
-
-} EVGL_API_Thread_Command_glCompressedTexSubImage3D;
-
-void (*orig_evgl_api_glCompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
-
-static void
-_evgl_api_thread_glCompressedTexSubImage3D(void *data)
-{
-   EVGL_API_Thread_Command_glCompressedTexSubImage3D *thread_data =
-      (EVGL_API_Thread_Command_glCompressedTexSubImage3D *)data;
-
-   orig_evgl_api_glCompressedTexSubImage3D(thread_data->target,
-                                           thread_data->level,
-                                           thread_data->xoffset,
-                                           thread_data->yoffset,
-                                           thread_data->zoffset,
-                                           thread_data->width,
-                                           thread_data->height,
-                                           thread_data->depth,
-                                           thread_data->format,
-                                           thread_data->imageSize,
-                                           thread_data->data);
-
-}
-
-EAPI void
-glCompressedTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCompressedTexSubImage3D thread_data_local;
-   EVGL_API_Thread_Command_glCompressedTexSubImage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->format = format;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCompressedTexSubImage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
- */
-
-typedef struct
-{
-   GLenum readtarget;
-   GLenum writetarget;
-   GLintptr readoffset;
-   GLintptr writeoffset;
-   GLsizeiptr size;
-
-} EVGL_API_Thread_Command_glCopyBufferSubData;
-
-void (*orig_evgl_api_glCopyBufferSubData)(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
-
-static void
-_evgl_api_thread_glCopyBufferSubData(void *data)
-{
-   EVGL_API_Thread_Command_glCopyBufferSubData *thread_data =
-      (EVGL_API_Thread_Command_glCopyBufferSubData *)data;
-
-   orig_evgl_api_glCopyBufferSubData(thread_data->readtarget,
-                                     thread_data->writetarget,
-                                     thread_data->readoffset,
-                                     thread_data->writeoffset,
-                                     thread_data->size);
-
-}
-
-EAPI void
-glCopyBufferSubData_evgl_api_thread_cmd(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyBufferSubData thread_data_local;
-   EVGL_API_Thread_Command_glCopyBufferSubData *thread_data = &thread_data_local;
-
-   thread_data->readtarget = readtarget;
-   thread_data->writetarget = writetarget;
-   thread_data->readoffset = readoffset;
-   thread_data->writeoffset = writeoffset;
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyBufferSubData,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glCopyTexSubImage3D;
-
-void (*orig_evgl_api_glCopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glCopyTexSubImage3D(void *data)
-{
-   EVGL_API_Thread_Command_glCopyTexSubImage3D *thread_data =
-      (EVGL_API_Thread_Command_glCopyTexSubImage3D *)data;
-
-   orig_evgl_api_glCopyTexSubImage3D(thread_data->target,
-                                     thread_data->level,
-                                     thread_data->xoffset,
-                                     thread_data->yoffset,
-                                     thread_data->zoffset,
-                                     thread_data->x,
-                                     thread_data->y,
-                                     thread_data->width,
-                                     thread_data->height);
-
-}
-
-EAPI void
-glCopyTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyTexSubImage3D thread_data_local;
-   EVGL_API_Thread_Command_glCopyTexSubImage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyTexSubImage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteQueries(GLsizei n, const GLuint * ids);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint * ids;
-
-} EVGL_API_Thread_Command_glDeleteQueries;
-
-void (*orig_evgl_api_glDeleteQueries)(GLsizei n, const GLuint * ids);
-
-static void
-_evgl_api_thread_glDeleteQueries(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteQueries *thread_data =
-      (EVGL_API_Thread_Command_glDeleteQueries *)data;
-
-   orig_evgl_api_glDeleteQueries(thread_data->n,
-                                 thread_data->ids);
-
-}
-
-EAPI void
-glDeleteQueries_evgl_api_thread_cmd(GLsizei n, const GLuint * ids)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteQueries(n, ids);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteQueries thread_data_local;
-   EVGL_API_Thread_Command_glDeleteQueries *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->ids = ids;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteQueries,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteSamplers(GLsizei n, const GLuint * samplers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint * samplers;
-
-} EVGL_API_Thread_Command_glDeleteSamplers;
-
-void (*orig_evgl_api_glDeleteSamplers)(GLsizei n, const GLuint * samplers);
-
-static void
-_evgl_api_thread_glDeleteSamplers(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteSamplers *thread_data =
-      (EVGL_API_Thread_Command_glDeleteSamplers *)data;
-
-   orig_evgl_api_glDeleteSamplers(thread_data->n,
-                                  thread_data->samplers);
-
-}
-
-EAPI void
-glDeleteSamplers_evgl_api_thread_cmd(GLsizei n, const GLuint * samplers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteSamplers(n, samplers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteSamplers thread_data_local;
-   EVGL_API_Thread_Command_glDeleteSamplers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->samplers = samplers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteSamplers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteSync(GLsync sync);
- */
-
-typedef struct
-{
-   GLsync sync;
-
-} EVGL_API_Thread_Command_glDeleteSync;
-
-void (*orig_evgl_api_glDeleteSync)(GLsync sync);
-
-static void
-_evgl_api_thread_glDeleteSync(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteSync *thread_data =
-      (EVGL_API_Thread_Command_glDeleteSync *)data;
-
-   orig_evgl_api_glDeleteSync(thread_data->sync);
-
-}
-
-EAPI void
-glDeleteSync_evgl_api_thread_cmd(GLsync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteSync(sync);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteSync thread_data_local;
-   EVGL_API_Thread_Command_glDeleteSync *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteSync,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *ids;
-
-} EVGL_API_Thread_Command_glDeleteTransformFeedbacks;
-
-void (*orig_evgl_api_glDeleteTransformFeedbacks)(GLsizei n, const GLuint *ids);
-
-static void
-_evgl_api_thread_glDeleteTransformFeedbacks(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteTransformFeedbacks *thread_data =
-      (EVGL_API_Thread_Command_glDeleteTransformFeedbacks *)data;
-
-   orig_evgl_api_glDeleteTransformFeedbacks(thread_data->n,
-                                            thread_data->ids);
-
-}
-
-EAPI void
-glDeleteTransformFeedbacks_evgl_api_thread_cmd(GLsizei n, const GLuint *ids)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteTransformFeedbacks(n, ids);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteTransformFeedbacks thread_data_local;
-   EVGL_API_Thread_Command_glDeleteTransformFeedbacks *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->ids = ids;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteTransformFeedbacks,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *arrays;
-
-} EVGL_API_Thread_Command_glDeleteVertexArrays;
-
-void (*orig_evgl_api_glDeleteVertexArrays)(GLsizei n, const GLuint *arrays);
-
-static void
-_evgl_api_thread_glDeleteVertexArrays(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteVertexArrays *thread_data =
-      (EVGL_API_Thread_Command_glDeleteVertexArrays *)data;
-
-   orig_evgl_api_glDeleteVertexArrays(thread_data->n,
-                                      thread_data->arrays);
-
-}
-
-EAPI void
-glDeleteVertexArrays_evgl_api_thread_cmd(GLsizei n, const GLuint *arrays)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteVertexArrays(n, arrays);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteVertexArrays thread_data_local;
-   EVGL_API_Thread_Command_glDeleteVertexArrays *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->arrays = arrays;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteVertexArrays,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLint first;
-   GLsizei count;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glDrawArraysInstanced;
-
-void (*orig_evgl_api_glDrawArraysInstanced)(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
-
-static void
-_evgl_api_thread_glDrawArraysInstanced(void *data)
-{
-   EVGL_API_Thread_Command_glDrawArraysInstanced *thread_data =
-      (EVGL_API_Thread_Command_glDrawArraysInstanced *)data;
-
-   orig_evgl_api_glDrawArraysInstanced(thread_data->mode,
-                                       thread_data->first,
-                                       thread_data->count,
-                                       thread_data->primcount);
-
-}
-
-EAPI void
-glDrawArraysInstanced_evgl_api_thread_cmd(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawArraysInstanced(mode, first, count, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawArraysInstanced thread_data_local;
-   EVGL_API_Thread_Command_glDrawArraysInstanced *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawArraysInstanced,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawBuffers(GLsizei n, const GLenum *bufs);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLenum *bufs;
-
-} EVGL_API_Thread_Command_glDrawBuffers;
-
-void (*orig_evgl_api_glDrawBuffers)(GLsizei n, const GLenum *bufs);
-
-static void
-_evgl_api_thread_glDrawBuffers(void *data)
-{
-   EVGL_API_Thread_Command_glDrawBuffers *thread_data =
-      (EVGL_API_Thread_Command_glDrawBuffers *)data;
-
-   orig_evgl_api_glDrawBuffers(thread_data->n,
-                               thread_data->bufs);
-
-}
-
-EAPI void
-glDrawBuffers_evgl_api_thread_cmd(GLsizei n, const GLenum *bufs)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawBuffers(n, bufs);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawBuffers thread_data_local;
-   EVGL_API_Thread_Command_glDrawBuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->bufs = bufs;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawBuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void * indices;
-   GLsizei primcount;
-
-} EVGL_API_Thread_Command_glDrawElementsInstanced;
-
-void (*orig_evgl_api_glDrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
-
-static void
-_evgl_api_thread_glDrawElementsInstanced(void *data)
-{
-   EVGL_API_Thread_Command_glDrawElementsInstanced *thread_data =
-      (EVGL_API_Thread_Command_glDrawElementsInstanced *)data;
-
-   orig_evgl_api_glDrawElementsInstanced(thread_data->mode,
-                                         thread_data->count,
-                                         thread_data->type,
-                                         thread_data->indices,
-                                         thread_data->primcount);
-
-}
-
-EAPI void
-glDrawElementsInstanced_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawElementsInstanced(mode, count, type, indices, primcount);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawElementsInstanced thread_data_local;
-   EVGL_API_Thread_Command_glDrawElementsInstanced *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->primcount = primcount;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawElementsInstanced,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLuint start;
-   GLuint end;
-   GLsizei count;
-   GLenum type;
-   const GLvoid * indices;
-
-} EVGL_API_Thread_Command_glDrawRangeElements;
-
-void (*orig_evgl_api_glDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
-
-static void
-_evgl_api_thread_glDrawRangeElements(void *data)
-{
-   EVGL_API_Thread_Command_glDrawRangeElements *thread_data =
-      (EVGL_API_Thread_Command_glDrawRangeElements *)data;
-
-   orig_evgl_api_glDrawRangeElements(thread_data->mode,
-                                     thread_data->start,
-                                     thread_data->end,
-                                     thread_data->count,
-                                     thread_data->type,
-                                     thread_data->indices);
-
-}
-
-EAPI void
-glDrawRangeElements_evgl_api_thread_cmd(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawRangeElements(mode, start, end, count, type, indices);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawRangeElements thread_data_local;
-   EVGL_API_Thread_Command_glDrawRangeElements *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->start = start;
-   thread_data->end = end;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawRangeElements,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEndQuery(GLenum target);
- */
-
-typedef struct
-{
-   GLenum target;
-
-} EVGL_API_Thread_Command_glEndQuery;
-
-void (*orig_evgl_api_glEndQuery)(GLenum target);
-
-static void
-_evgl_api_thread_glEndQuery(void *data)
-{
-   EVGL_API_Thread_Command_glEndQuery *thread_data =
-      (EVGL_API_Thread_Command_glEndQuery *)data;
-
-   orig_evgl_api_glEndQuery(thread_data->target);
-
-}
-
-EAPI void
-glEndQuery_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEndQuery(target);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEndQuery thread_data_local;
-   EVGL_API_Thread_Command_glEndQuery *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEndQuery,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEndTransformFeedback(void);
- */
-
-void (*orig_evgl_api_glEndTransformFeedback)(void);
-
-static void
-_evgl_api_thread_glEndTransformFeedback(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glEndTransformFeedback();
-
-}
-
-EAPI void
-glEndTransformFeedback_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEndTransformFeedback();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEndTransformFeedback,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * GLsync
- * glFenceSync(GLenum condition, GLbitfield flags);
- */
-
-typedef struct
-{
-   GLsync return_value;
-   GLenum condition;
-   GLbitfield flags;
-
-} EVGL_API_Thread_Command_glFenceSync;
-
-GLsync (*orig_evgl_api_glFenceSync)(GLenum condition, GLbitfield flags);
-
-static void
-_evgl_api_thread_glFenceSync(void *data)
-{
-   EVGL_API_Thread_Command_glFenceSync *thread_data =
-      (EVGL_API_Thread_Command_glFenceSync *)data;
-
-   thread_data->return_value = orig_evgl_api_glFenceSync(thread_data->condition,
-                                                         thread_data->flags);
-
-}
-
-EAPI GLsync
-glFenceSync_evgl_api_thread_cmd(GLenum condition, GLbitfield flags)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glFenceSync(condition, flags);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFenceSync thread_data_local;
-   EVGL_API_Thread_Command_glFenceSync *thread_data = &thread_data_local;
-
-   thread_data->condition = condition;
-   thread_data->flags = flags;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFenceSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLsync
- * glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
- */
-
-typedef struct
-{
-   GLsync return_value;
-   GLenum target;
-   GLintptr offset;
-   GLsizeiptr length;
-
-} EVGL_API_Thread_Command_glFlushMappedBufferRange;
-
-GLsync (*orig_evgl_api_glFlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length);
-
-static void
-_evgl_api_thread_glFlushMappedBufferRange(void *data)
-{
-   EVGL_API_Thread_Command_glFlushMappedBufferRange *thread_data =
-      (EVGL_API_Thread_Command_glFlushMappedBufferRange *)data;
-
-   thread_data->return_value = orig_evgl_api_glFlushMappedBufferRange(thread_data->target,
-                                                                      thread_data->offset,
-                                                                      thread_data->length);
-
-}
-
-EAPI GLsync
-glFlushMappedBufferRange_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glFlushMappedBufferRange(target, offset, length);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFlushMappedBufferRange thread_data_local;
-   EVGL_API_Thread_Command_glFlushMappedBufferRange *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->offset = offset;
-   thread_data->length = length;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFlushMappedBufferRange,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLuint texture;
-   GLint level;
-   GLint layer;
-
-} EVGL_API_Thread_Command_glFramebufferTextureLayer;
-
-void (*orig_evgl_api_glFramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-
-static void
-_evgl_api_thread_glFramebufferTextureLayer(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTextureLayer *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTextureLayer *)data;
-
-   orig_evgl_api_glFramebufferTextureLayer(thread_data->target,
-                                           thread_data->attachment,
-                                           thread_data->texture,
-                                           thread_data->level,
-                                           thread_data->layer);
-
-}
-
-EAPI void
-glFramebufferTextureLayer_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTextureLayer(target, attachment, texture, level, layer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTextureLayer thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTextureLayer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->texture = texture;
-   thread_data->level = level;
-   thread_data->layer = layer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTextureLayer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenQueries(GLsizei n, GLuint * ids);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint * ids;
-
-} EVGL_API_Thread_Command_glGenQueries;
-
-void (*orig_evgl_api_glGenQueries)(GLsizei n, GLuint * ids);
-
-static void
-_evgl_api_thread_glGenQueries(void *data)
-{
-   EVGL_API_Thread_Command_glGenQueries *thread_data =
-      (EVGL_API_Thread_Command_glGenQueries *)data;
-
-   orig_evgl_api_glGenQueries(thread_data->n,
-                              thread_data->ids);
-
-}
-
-EAPI void
-glGenQueries_evgl_api_thread_cmd(GLsizei n, GLuint * ids)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenQueries(n, ids);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenQueries thread_data_local;
-   EVGL_API_Thread_Command_glGenQueries *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->ids = ids;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenQueries,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenSamplers(GLsizei n, GLuint *samplers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *samplers;
-
-} EVGL_API_Thread_Command_glGenSamplers;
-
-void (*orig_evgl_api_glGenSamplers)(GLsizei n, GLuint *samplers);
-
-static void
-_evgl_api_thread_glGenSamplers(void *data)
-{
-   EVGL_API_Thread_Command_glGenSamplers *thread_data =
-      (EVGL_API_Thread_Command_glGenSamplers *)data;
-
-   orig_evgl_api_glGenSamplers(thread_data->n,
-                               thread_data->samplers);
-
-}
-
-EAPI void
-glGenSamplers_evgl_api_thread_cmd(GLsizei n, GLuint *samplers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenSamplers(n, samplers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenSamplers thread_data_local;
-   EVGL_API_Thread_Command_glGenSamplers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->samplers = samplers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenSamplers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenTransformFeedbacks(GLsizei n, GLuint *ids);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *ids;
-
-} EVGL_API_Thread_Command_glGenTransformFeedbacks;
-
-void (*orig_evgl_api_glGenTransformFeedbacks)(GLsizei n, GLuint *ids);
-
-static void
-_evgl_api_thread_glGenTransformFeedbacks(void *data)
-{
-   EVGL_API_Thread_Command_glGenTransformFeedbacks *thread_data =
-      (EVGL_API_Thread_Command_glGenTransformFeedbacks *)data;
-
-   orig_evgl_api_glGenTransformFeedbacks(thread_data->n,
-                                         thread_data->ids);
-
-}
-
-EAPI void
-glGenTransformFeedbacks_evgl_api_thread_cmd(GLsizei n, GLuint *ids)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenTransformFeedbacks(n, ids);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenTransformFeedbacks thread_data_local;
-   EVGL_API_Thread_Command_glGenTransformFeedbacks *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->ids = ids;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenTransformFeedbacks,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenVertexArrays(GLsizei n, GLuint *arrays);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *arrays;
-
-} EVGL_API_Thread_Command_glGenVertexArrays;
-
-void (*orig_evgl_api_glGenVertexArrays)(GLsizei n, GLuint *arrays);
-
-static void
-_evgl_api_thread_glGenVertexArrays(void *data)
-{
-   EVGL_API_Thread_Command_glGenVertexArrays *thread_data =
-      (EVGL_API_Thread_Command_glGenVertexArrays *)data;
-
-   orig_evgl_api_glGenVertexArrays(thread_data->n,
-                                   thread_data->arrays);
-
-}
-
-EAPI void
-glGenVertexArrays_evgl_api_thread_cmd(GLsizei n, GLuint *arrays)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenVertexArrays(n, arrays);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenVertexArrays thread_data_local;
-   EVGL_API_Thread_Command_glGenVertexArrays *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->arrays = arrays;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenVertexArrays,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint uniformBlockIndex;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetActiveUniformBlockiv;
-
-void (*orig_evgl_api_glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetActiveUniformBlockiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetActiveUniformBlockiv *thread_data =
-      (EVGL_API_Thread_Command_glGetActiveUniformBlockiv *)data;
-
-   orig_evgl_api_glGetActiveUniformBlockiv(thread_data->program,
-                                           thread_data->uniformBlockIndex,
-                                           thread_data->pname,
-                                           thread_data->params);
-
-}
-
-EAPI void
-glGetActiveUniformBlockiv_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetActiveUniformBlockiv thread_data_local;
-   EVGL_API_Thread_Command_glGetActiveUniformBlockiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformBlockIndex = uniformBlockIndex;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetActiveUniformBlockiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint uniformBlockIndex;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *uniformBlockName;
-
-} EVGL_API_Thread_Command_glGetActiveUniformBlockName;
-
-void (*orig_evgl_api_glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
-
-static void
-_evgl_api_thread_glGetActiveUniformBlockName(void *data)
-{
-   EVGL_API_Thread_Command_glGetActiveUniformBlockName *thread_data =
-      (EVGL_API_Thread_Command_glGetActiveUniformBlockName *)data;
-
-   orig_evgl_api_glGetActiveUniformBlockName(thread_data->program,
-                                             thread_data->uniformBlockIndex,
-                                             thread_data->bufSize,
-                                             thread_data->length,
-                                             thread_data->uniformBlockName);
-
-}
-
-EAPI void
-glGetActiveUniformBlockName_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetActiveUniformBlockName thread_data_local;
-   EVGL_API_Thread_Command_glGetActiveUniformBlockName *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformBlockIndex = uniformBlockIndex;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->uniformBlockName = uniformBlockName;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetActiveUniformBlockName,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei uniformCount;
-   const GLuint *uniformIndices;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetActiveUniformsiv;
-
-void (*orig_evgl_api_glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetActiveUniformsiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetActiveUniformsiv *thread_data =
-      (EVGL_API_Thread_Command_glGetActiveUniformsiv *)data;
-
-   orig_evgl_api_glGetActiveUniformsiv(thread_data->program,
-                                       thread_data->uniformCount,
-                                       thread_data->uniformIndices,
-                                       thread_data->pname,
-                                       thread_data->params);
-
-}
-
-EAPI void
-glGetActiveUniformsiv_evgl_api_thread_cmd(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetActiveUniformsiv thread_data_local;
-   EVGL_API_Thread_Command_glGetActiveUniformsiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformCount = uniformCount;
-   thread_data->uniformIndices = uniformIndices;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetActiveUniformsiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetBufferParameteri64v(GLenum target, GLenum value, EvasGLint64 * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum value;
-   EvasGLint64 * data;
-
-} EVGL_API_Thread_Command_glGetBufferParameteri64v;
-
-void (*orig_evgl_api_glGetBufferParameteri64v)(GLenum target, GLenum value, EvasGLint64 * data);
-
-static void
-_evgl_api_thread_glGetBufferParameteri64v(void *data)
-{
-   EVGL_API_Thread_Command_glGetBufferParameteri64v *thread_data =
-      (EVGL_API_Thread_Command_glGetBufferParameteri64v *)data;
-
-   orig_evgl_api_glGetBufferParameteri64v(thread_data->target,
-                                          thread_data->value,
-                                          thread_data->data);
-
-}
-
-EAPI void
-glGetBufferParameteri64v_evgl_api_thread_cmd(GLenum target, GLenum value, EvasGLint64 * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBufferParameteri64v(target, value, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBufferParameteri64v thread_data_local;
-   EVGL_API_Thread_Command_glGetBufferParameteri64v *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->value = value;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBufferParameteri64v,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetBufferPointerv(GLenum target, GLenum pname, GLvoid ** params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLvoid ** params;
-
-} EVGL_API_Thread_Command_glGetBufferPointerv;
-
-void (*orig_evgl_api_glGetBufferPointerv)(GLenum target, GLenum pname, GLvoid ** params);
-
-static void
-_evgl_api_thread_glGetBufferPointerv(void *data)
-{
-   EVGL_API_Thread_Command_glGetBufferPointerv *thread_data =
-      (EVGL_API_Thread_Command_glGetBufferPointerv *)data;
-
-   orig_evgl_api_glGetBufferPointerv(thread_data->target,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetBufferPointerv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLvoid ** params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBufferPointerv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBufferPointerv thread_data_local;
-   EVGL_API_Thread_Command_glGetBufferPointerv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBufferPointerv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLint
- * glGetFragDataLocation(GLuint program, const char * name);
- */
-
-typedef struct
-{
-   GLint return_value;
-   GLuint program;
-   const char * name;
-
-} EVGL_API_Thread_Command_glGetFragDataLocation;
-
-GLint (*orig_evgl_api_glGetFragDataLocation)(GLuint program, const char * name);
-
-static void
-_evgl_api_thread_glGetFragDataLocation(void *data)
-{
-   EVGL_API_Thread_Command_glGetFragDataLocation *thread_data =
-      (EVGL_API_Thread_Command_glGetFragDataLocation *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetFragDataLocation(thread_data->program,
-                                                                   thread_data->name);
-
-}
-
-EAPI GLint
-glGetFragDataLocation_evgl_api_thread_cmd(GLuint program, const char * name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetFragDataLocation(program, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFragDataLocation thread_data_local;
-   EVGL_API_Thread_Command_glGetFragDataLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFragDataLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetInteger64i_v(GLenum target, GLuint index, EvasGLint64 * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-   EvasGLint64 * data;
-
-} EVGL_API_Thread_Command_glGetInteger64i_v;
-
-void (*orig_evgl_api_glGetInteger64i_v)(GLenum target, GLuint index, EvasGLint64 * data);
-
-static void
-_evgl_api_thread_glGetInteger64i_v(void *data)
-{
-   EVGL_API_Thread_Command_glGetInteger64i_v *thread_data =
-      (EVGL_API_Thread_Command_glGetInteger64i_v *)data;
-
-   orig_evgl_api_glGetInteger64i_v(thread_data->target,
-                                   thread_data->index,
-                                   thread_data->data);
-
-}
-
-EAPI void
-glGetInteger64i_v_evgl_api_thread_cmd(GLenum target, GLuint index, EvasGLint64 * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetInteger64i_v(target, index, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetInteger64i_v thread_data_local;
-   EVGL_API_Thread_Command_glGetInteger64i_v *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetInteger64i_v,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetInteger64v(GLenum pname, EvasGLint64 * data);
- */
-
-typedef struct
-{
-   GLenum pname;
-   EvasGLint64 * data;
-
-} EVGL_API_Thread_Command_glGetInteger64v;
-
-void (*orig_evgl_api_glGetInteger64v)(GLenum pname, EvasGLint64 * data);
-
-static void
-_evgl_api_thread_glGetInteger64v(void *data)
-{
-   EVGL_API_Thread_Command_glGetInteger64v *thread_data =
-      (EVGL_API_Thread_Command_glGetInteger64v *)data;
-
-   orig_evgl_api_glGetInteger64v(thread_data->pname,
-                                 thread_data->data);
-
-}
-
-EAPI void
-glGetInteger64v_evgl_api_thread_cmd(GLenum pname, EvasGLint64 * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetInteger64v(pname, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetInteger64v thread_data_local;
-   EVGL_API_Thread_Command_glGetInteger64v *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetInteger64v,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetIntegeri_v(GLenum target, GLuint index, GLint * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-   GLint * data;
-
-} EVGL_API_Thread_Command_glGetIntegeri_v;
-
-void (*orig_evgl_api_glGetIntegeri_v)(GLenum target, GLuint index, GLint * data);
-
-static void
-_evgl_api_thread_glGetIntegeri_v(void *data)
-{
-   EVGL_API_Thread_Command_glGetIntegeri_v *thread_data =
-      (EVGL_API_Thread_Command_glGetIntegeri_v *)data;
-
-   orig_evgl_api_glGetIntegeri_v(thread_data->target,
-                                 thread_data->index,
-                                 thread_data->data);
-
-}
-
-EAPI void
-glGetIntegeri_v_evgl_api_thread_cmd(GLenum target, GLuint index, GLint * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetIntegeri_v(target, index, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetIntegeri_v thread_data_local;
-   EVGL_API_Thread_Command_glGetIntegeri_v *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetIntegeri_v,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLenum pname;
-   GLsizei bufSize;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetInternalformativ;
-
-void (*orig_evgl_api_glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
-
-static void
-_evgl_api_thread_glGetInternalformativ(void *data)
-{
-   EVGL_API_Thread_Command_glGetInternalformativ *thread_data =
-      (EVGL_API_Thread_Command_glGetInternalformativ *)data;
-
-   orig_evgl_api_glGetInternalformativ(thread_data->target,
-                                       thread_data->internalformat,
-                                       thread_data->pname,
-                                       thread_data->bufSize,
-                                       thread_data->params);
-
-}
-
-EAPI void
-glGetInternalformativ_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetInternalformativ(target, internalformat, pname, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetInternalformativ thread_data_local;
-   EVGL_API_Thread_Command_glGetInternalformativ *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->pname = pname;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetInternalformativ,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei bufsize;
-   GLsizei *length;
-   GLenum *binaryFormat;
-   void *binary;
-
-} EVGL_API_Thread_Command_glGetProgramBinary;
-
-void (*orig_evgl_api_glGetProgramBinary)(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-static void
-_evgl_api_thread_glGetProgramBinary(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramBinary *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramBinary *)data;
-
-   orig_evgl_api_glGetProgramBinary(thread_data->program,
-                                    thread_data->bufsize,
-                                    thread_data->length,
-                                    thread_data->binaryFormat,
-                                    thread_data->binary);
-
-}
-
-EAPI void
-glGetProgramBinary_evgl_api_thread_cmd(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramBinary(program, bufsize, length, binaryFormat, binary);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramBinary thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramBinary *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufsize = bufsize;
-   thread_data->length = length;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramBinary,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetQueryiv(GLenum target, GLenum pname, GLint * params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint * params;
-
-} EVGL_API_Thread_Command_glGetQueryiv;
-
-void (*orig_evgl_api_glGetQueryiv)(GLenum target, GLenum pname, GLint * params);
-
-static void
-_evgl_api_thread_glGetQueryiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetQueryiv *thread_data =
-      (EVGL_API_Thread_Command_glGetQueryiv *)data;
-
-   orig_evgl_api_glGetQueryiv(thread_data->target,
-                              thread_data->pname,
-                              thread_data->params);
-
-}
-
-EAPI void
-glGetQueryiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetQueryiv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetQueryiv thread_data_local;
-   EVGL_API_Thread_Command_glGetQueryiv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetQueryiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint * params);
- */
-
-typedef struct
-{
-   GLuint id;
-   GLenum pname;
-   GLuint * params;
-
-} EVGL_API_Thread_Command_glGetQueryObjectuiv;
-
-void (*orig_evgl_api_glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint * params);
-
-static void
-_evgl_api_thread_glGetQueryObjectuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetQueryObjectuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetQueryObjectuiv *)data;
-
-   orig_evgl_api_glGetQueryObjectuiv(thread_data->id,
-                                     thread_data->pname,
-                                     thread_data->params);
-
-}
-
-EAPI void
-glGetQueryObjectuiv_evgl_api_thread_cmd(GLuint id, GLenum pname, GLuint * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetQueryObjectuiv(id, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetQueryObjectuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetQueryObjectuiv *thread_data = &thread_data_local;
-
-   thread_data->id = id;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetQueryObjectuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat * params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLfloat * params;
-
-} EVGL_API_Thread_Command_glGetSamplerParameterfv;
-
-void (*orig_evgl_api_glGetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat * params);
-
-static void
-_evgl_api_thread_glGetSamplerParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetSamplerParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glGetSamplerParameterfv *)data;
-
-   orig_evgl_api_glGetSamplerParameterfv(thread_data->sampler,
-                                         thread_data->pname,
-                                         thread_data->params);
-
-}
-
-EAPI void
-glGetSamplerParameterfv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLfloat * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSamplerParameterfv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSamplerParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glGetSamplerParameterfv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSamplerParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint * params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLint * params;
-
-} EVGL_API_Thread_Command_glGetSamplerParameteriv;
-
-void (*orig_evgl_api_glGetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint * params);
-
-static void
-_evgl_api_thread_glGetSamplerParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetSamplerParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetSamplerParameteriv *)data;
-
-   orig_evgl_api_glGetSamplerParameteriv(thread_data->sampler,
-                                         thread_data->pname,
-                                         thread_data->params);
-
-}
-
-EAPI void
-glGetSamplerParameteriv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSamplerParameteriv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSamplerParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetSamplerParameteriv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSamplerParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * const GLubyte *
- * glGetStringi(GLenum name, GLuint index);
- */
-
-typedef struct
-{
-   const GLubyte * return_value;
-   GLenum name;
-   GLuint index;
-
-} EVGL_API_Thread_Command_glGetStringi;
-
-const GLubyte * (*orig_evgl_api_glGetStringi)(GLenum name, GLuint index);
-
-static void
-_evgl_api_thread_glGetStringi(void *data)
-{
-   EVGL_API_Thread_Command_glGetStringi *thread_data =
-      (EVGL_API_Thread_Command_glGetStringi *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetStringi(thread_data->name,
-                                                          thread_data->index);
-
-}
-
-EAPI const GLubyte *
-glGetStringi_evgl_api_thread_cmd(GLenum name, GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetStringi(name, index);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetStringi thread_data_local;
-   EVGL_API_Thread_Command_glGetStringi *thread_data = &thread_data_local;
-
-   thread_data->name = name;
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetStringi,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
- */
-
-typedef struct
-{
-   GLsync sync;
-   GLenum pname;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLint *values;
-
-} EVGL_API_Thread_Command_glGetSynciv;
-
-void (*orig_evgl_api_glGetSynciv)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
-static void
-_evgl_api_thread_glGetSynciv(void *data)
-{
-   EVGL_API_Thread_Command_glGetSynciv *thread_data =
-      (EVGL_API_Thread_Command_glGetSynciv *)data;
-
-   orig_evgl_api_glGetSynciv(thread_data->sync,
-                             thread_data->pname,
-                             thread_data->bufSize,
-                             thread_data->length,
-                             thread_data->values);
-
-}
-
-EAPI void
-glGetSynciv_evgl_api_thread_cmd(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSynciv(sync, pname, bufSize, length, values);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSynciv thread_data_local;
-   EVGL_API_Thread_Command_glGetSynciv *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->pname = pname;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->values = values;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSynciv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   GLsizei bufSize;
-   GLsizei * length;
-   GLsizei * size;
-   GLenum * type;
-   char * name;
-
-} EVGL_API_Thread_Command_glGetTransformFeedbackVarying;
-
-void (*orig_evgl_api_glGetTransformFeedbackVarying)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
-
-static void
-_evgl_api_thread_glGetTransformFeedbackVarying(void *data)
-{
-   EVGL_API_Thread_Command_glGetTransformFeedbackVarying *thread_data =
-      (EVGL_API_Thread_Command_glGetTransformFeedbackVarying *)data;
-
-   orig_evgl_api_glGetTransformFeedbackVarying(thread_data->program,
-                                               thread_data->index,
-                                               thread_data->bufSize,
-                                               thread_data->length,
-                                               thread_data->size,
-                                               thread_data->type,
-                                               thread_data->name);
-
-}
-
-EAPI void
-glGetTransformFeedbackVarying_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTransformFeedbackVarying thread_data_local;
-   EVGL_API_Thread_Command_glGetTransformFeedbackVarying *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTransformFeedbackVarying,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLuint program;
-   const GLchar *uniformBlockName;
-
-} EVGL_API_Thread_Command_glGetUniformBlockIndex;
-
-GLuint (*orig_evgl_api_glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName);
-
-static void
-_evgl_api_thread_glGetUniformBlockIndex(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformBlockIndex *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformBlockIndex *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetUniformBlockIndex(thread_data->program,
-                                                                    thread_data->uniformBlockName);
-
-}
-
-EAPI GLuint
-glGetUniformBlockIndex_evgl_api_thread_cmd(GLuint program, const GLchar *uniformBlockName)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetUniformBlockIndex(program, uniformBlockName);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformBlockIndex thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformBlockIndex *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformBlockName = uniformBlockName;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformBlockIndex,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei uniformCount;
-   const GLchar *const*uniformNames;
-   GLuint *uniformIndices;
-
-} EVGL_API_Thread_Command_glGetUniformIndices;
-
-void (*orig_evgl_api_glGetUniformIndices)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
-
-static void
-_evgl_api_thread_glGetUniformIndices(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformIndices *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformIndices *)data;
-
-   orig_evgl_api_glGetUniformIndices(thread_data->program,
-                                     thread_data->uniformCount,
-                                     thread_data->uniformNames,
-                                     thread_data->uniformIndices);
-
-}
-
-EAPI void
-glGetUniformIndices_evgl_api_thread_cmd(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformIndices thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformIndices *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformCount = uniformCount;
-   thread_data->uniformNames = uniformNames;
-   thread_data->uniformIndices = uniformIndices;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformIndices,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetUniformuiv(GLuint program, GLint location, GLuint* params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLuint* params;
-
-} EVGL_API_Thread_Command_glGetUniformuiv;
-
-void (*orig_evgl_api_glGetUniformuiv)(GLuint program, GLint location, GLuint* params);
-
-static void
-_evgl_api_thread_glGetUniformuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetUniformuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetUniformuiv *)data;
-
-   orig_evgl_api_glGetUniformuiv(thread_data->program,
-                                 thread_data->location,
-                                 thread_data->params);
-
-}
-
-EAPI void
-glGetUniformuiv_evgl_api_thread_cmd(GLuint program, GLint location, GLuint* params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetUniformuiv(program, location, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetUniformuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetUniformuiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetUniformuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetVertexAttribIiv;
-
-void (*orig_evgl_api_glGetVertexAttribIiv)(GLuint index, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetVertexAttribIiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetVertexAttribIiv *thread_data =
-      (EVGL_API_Thread_Command_glGetVertexAttribIiv *)data;
-
-   orig_evgl_api_glGetVertexAttribIiv(thread_data->index,
-                                      thread_data->pname,
-                                      thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribIiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetVertexAttribIiv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetVertexAttribIiv thread_data_local;
-   EVGL_API_Thread_Command_glGetVertexAttribIiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetVertexAttribIiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLuint *params;
-
-} EVGL_API_Thread_Command_glGetVertexAttribIuiv;
-
-void (*orig_evgl_api_glGetVertexAttribIuiv)(GLuint index, GLenum pname, GLuint *params);
-
-static void
-_evgl_api_thread_glGetVertexAttribIuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetVertexAttribIuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetVertexAttribIuiv *)data;
-
-   orig_evgl_api_glGetVertexAttribIuiv(thread_data->index,
-                                       thread_data->pname,
-                                       thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribIuiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLuint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetVertexAttribIuiv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetVertexAttribIuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetVertexAttribIuiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetVertexAttribIuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei numAttachments;
-   const GLenum *attachments;
-
-} EVGL_API_Thread_Command_glInvalidateFramebuffer;
-
-void (*orig_evgl_api_glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
-
-static void
-_evgl_api_thread_glInvalidateFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glInvalidateFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glInvalidateFramebuffer *)data;
-
-   orig_evgl_api_glInvalidateFramebuffer(thread_data->target,
-                                         thread_data->numAttachments,
-                                         thread_data->attachments);
-
-}
-
-EAPI void
-glInvalidateFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum *attachments)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glInvalidateFramebuffer(target, numAttachments, attachments);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glInvalidateFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glInvalidateFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->numAttachments = numAttachments;
-   thread_data->attachments = attachments;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glInvalidateFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei numAttachments;
-   const GLenum *attachments;
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glInvalidateSubFramebuffer;
-
-void (*orig_evgl_api_glInvalidateSubFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glInvalidateSubFramebuffer(void *data)
-{
-   EVGL_API_Thread_Command_glInvalidateSubFramebuffer *thread_data =
-      (EVGL_API_Thread_Command_glInvalidateSubFramebuffer *)data;
-
-   orig_evgl_api_glInvalidateSubFramebuffer(thread_data->target,
-                                            thread_data->numAttachments,
-                                            thread_data->attachments,
-                                            thread_data->x,
-                                            thread_data->y,
-                                            thread_data->width,
-                                            thread_data->height);
-
-}
-
-EAPI void
-glInvalidateSubFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glInvalidateSubFramebuffer thread_data_local;
-   EVGL_API_Thread_Command_glInvalidateSubFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->numAttachments = numAttachments;
-   thread_data->attachments = attachments;
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glInvalidateSubFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsQuery(GLuint id);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint id;
-
-} EVGL_API_Thread_Command_glIsQuery;
-
-GLboolean (*orig_evgl_api_glIsQuery)(GLuint id);
-
-static void
-_evgl_api_thread_glIsQuery(void *data)
-{
-   EVGL_API_Thread_Command_glIsQuery *thread_data =
-      (EVGL_API_Thread_Command_glIsQuery *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsQuery(thread_data->id);
-
-}
-
-EAPI GLboolean
-glIsQuery_evgl_api_thread_cmd(GLuint id)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsQuery(id);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsQuery thread_data_local;
-   EVGL_API_Thread_Command_glIsQuery *thread_data = &thread_data_local;
-
-   thread_data->id = id;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsQuery,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsSampler(GLuint id);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint id;
-
-} EVGL_API_Thread_Command_glIsSampler;
-
-GLboolean (*orig_evgl_api_glIsSampler)(GLuint id);
-
-static void
-_evgl_api_thread_glIsSampler(void *data)
-{
-   EVGL_API_Thread_Command_glIsSampler *thread_data =
-      (EVGL_API_Thread_Command_glIsSampler *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsSampler(thread_data->id);
-
-}
-
-EAPI GLboolean
-glIsSampler_evgl_api_thread_cmd(GLuint id)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsSampler(id);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsSampler thread_data_local;
-   EVGL_API_Thread_Command_glIsSampler *thread_data = &thread_data_local;
-
-   thread_data->id = id;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsSampler,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsSync(GLsync sync);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLsync sync;
-
-} EVGL_API_Thread_Command_glIsSync;
-
-GLboolean (*orig_evgl_api_glIsSync)(GLsync sync);
-
-static void
-_evgl_api_thread_glIsSync(void *data)
-{
-   EVGL_API_Thread_Command_glIsSync *thread_data =
-      (EVGL_API_Thread_Command_glIsSync *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsSync(thread_data->sync);
-
-}
-
-EAPI GLboolean
-glIsSync_evgl_api_thread_cmd(GLsync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsSync(sync);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsSync thread_data_local;
-   EVGL_API_Thread_Command_glIsSync *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsTransformFeedback(GLuint id);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint id;
-
-} EVGL_API_Thread_Command_glIsTransformFeedback;
-
-GLboolean (*orig_evgl_api_glIsTransformFeedback)(GLuint id);
-
-static void
-_evgl_api_thread_glIsTransformFeedback(void *data)
-{
-   EVGL_API_Thread_Command_glIsTransformFeedback *thread_data =
-      (EVGL_API_Thread_Command_glIsTransformFeedback *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsTransformFeedback(thread_data->id);
-
-}
-
-EAPI GLboolean
-glIsTransformFeedback_evgl_api_thread_cmd(GLuint id)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsTransformFeedback(id);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsTransformFeedback thread_data_local;
-   EVGL_API_Thread_Command_glIsTransformFeedback *thread_data = &thread_data_local;
-
-   thread_data->id = id;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsTransformFeedback,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsVertexArray(GLuint array);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint array;
-
-} EVGL_API_Thread_Command_glIsVertexArray;
-
-GLboolean (*orig_evgl_api_glIsVertexArray)(GLuint array);
-
-static void
-_evgl_api_thread_glIsVertexArray(void *data)
-{
-   EVGL_API_Thread_Command_glIsVertexArray *thread_data =
-      (EVGL_API_Thread_Command_glIsVertexArray *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsVertexArray(thread_data->array);
-
-}
-
-EAPI GLboolean
-glIsVertexArray_evgl_api_thread_cmd(GLuint array)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsVertexArray(array);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsVertexArray thread_data_local;
-   EVGL_API_Thread_Command_glIsVertexArray *thread_data = &thread_data_local;
-
-   thread_data->array = array;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsVertexArray,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void *
- * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- */
-
-typedef struct
-{
-   void * return_value;
-   GLenum target;
-   GLintptr offset;
-   GLsizeiptr length;
-   GLbitfield access;
-
-} EVGL_API_Thread_Command_glMapBufferRange;
-
-void * (*orig_evgl_api_glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-
-static void
-_evgl_api_thread_glMapBufferRange(void *data)
-{
-   EVGL_API_Thread_Command_glMapBufferRange *thread_data =
-      (EVGL_API_Thread_Command_glMapBufferRange *)data;
-
-   thread_data->return_value = orig_evgl_api_glMapBufferRange(thread_data->target,
-                                                              thread_data->offset,
-                                                              thread_data->length,
-                                                              thread_data->access);
-
-}
-
-EAPI void *
-glMapBufferRange_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glMapBufferRange(target, offset, length, access);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMapBufferRange thread_data_local;
-   EVGL_API_Thread_Command_glMapBufferRange *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->offset = offset;
-   thread_data->length = length;
-   thread_data->access = access;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMapBufferRange,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glPauseTransformFeedback(void);
- */
-
-void (*orig_evgl_api_glPauseTransformFeedback)(void);
-
-static void
-_evgl_api_thread_glPauseTransformFeedback(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glPauseTransformFeedback();
-
-}
-
-EAPI void
-glPauseTransformFeedback_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPauseTransformFeedback();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPauseTransformFeedback,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum binaryFormat;
-   const void *binary;
-   GLsizei length;
-   void *binary_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glProgramBinary;
-
-void (*orig_evgl_api_glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
-
-static void
-_evgl_api_thread_glProgramBinary(void *data)
-{
-   EVGL_API_Thread_Command_glProgramBinary *thread_data =
-      (EVGL_API_Thread_Command_glProgramBinary *)data;
-
-   orig_evgl_api_glProgramBinary(thread_data->program,
-                                 thread_data->binaryFormat,
-                                 thread_data->binary,
-                                 thread_data->length);
-
-
-   if (thread_data->binary_copied)
-     eina_mempool_free(_mp_default, thread_data->binary_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glProgramBinary_evgl_api_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramBinary(program, binaryFormat, binary, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramBinary thread_data_local;
-   EVGL_API_Thread_Command_glProgramBinary *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glProgramBinary *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glProgramBinary));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-   thread_data->length = length;
-
-   thread_data->binary_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (binary)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = length;
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->binary_copied)
-          {
-             memcpy(thread_data->binary_copied, binary, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->binary = (const void  *)thread_data->binary_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramBinary,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramParameteri(GLuint program, GLenum pname, GLint value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum pname;
-   GLint value;
-
-} EVGL_API_Thread_Command_glProgramParameteri;
-
-void (*orig_evgl_api_glProgramParameteri)(GLuint program, GLenum pname, GLint value);
-
-static void
-_evgl_api_thread_glProgramParameteri(void *data)
-{
-   EVGL_API_Thread_Command_glProgramParameteri *thread_data =
-      (EVGL_API_Thread_Command_glProgramParameteri *)data;
-
-   orig_evgl_api_glProgramParameteri(thread_data->program,
-                                     thread_data->pname,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramParameteri_evgl_api_thread_cmd(GLuint program, GLenum pname, GLint value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramParameteri(program, pname, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramParameteri thread_data_local;
-   EVGL_API_Thread_Command_glProgramParameteri *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->pname = pname;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glReadBuffer(GLenum src);
- */
-
-typedef struct
-{
-   GLenum src;
-
-} EVGL_API_Thread_Command_glReadBuffer;
-
-void (*orig_evgl_api_glReadBuffer)(GLenum src);
-
-static void
-_evgl_api_thread_glReadBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glReadBuffer *thread_data =
-      (EVGL_API_Thread_Command_glReadBuffer *)data;
-
-   orig_evgl_api_glReadBuffer(thread_data->src);
-
-}
-
-EAPI void
-glReadBuffer_evgl_api_thread_cmd(GLenum src)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glReadBuffer(src);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glReadBuffer thread_data_local;
-   EVGL_API_Thread_Command_glReadBuffer *thread_data = &thread_data_local;
-
-   thread_data->src = src;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glReadBuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei samples;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glRenderbufferStorageMultisample;
-
-void (*orig_evgl_api_glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glRenderbufferStorageMultisample(void *data)
-{
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisample *thread_data =
-      (EVGL_API_Thread_Command_glRenderbufferStorageMultisample *)data;
-
-   orig_evgl_api_glRenderbufferStorageMultisample(thread_data->target,
-                                                  thread_data->samples,
-                                                  thread_data->internalformat,
-                                                  thread_data->width,
-                                                  thread_data->height);
-
-}
-
-EAPI void
-glRenderbufferStorageMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisample thread_data_local;
-   EVGL_API_Thread_Command_glRenderbufferStorageMultisample *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->samples = samples;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glRenderbufferStorageMultisample,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glResumeTransformFeedback(void);
- */
-
-void (*orig_evgl_api_glResumeTransformFeedback)(void);
-
-static void
-_evgl_api_thread_glResumeTransformFeedback(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glResumeTransformFeedback();
-
-}
-
-EAPI void
-glResumeTransformFeedback_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glResumeTransformFeedback();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glResumeTransformFeedback,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLfloat param;
-
-} EVGL_API_Thread_Command_glSamplerParameterf;
-
-void (*orig_evgl_api_glSamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param);
-
-static void
-_evgl_api_thread_glSamplerParameterf(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameterf *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameterf *)data;
-
-   orig_evgl_api_glSamplerParameterf(thread_data->sampler,
-                                     thread_data->pname,
-                                     thread_data->param);
-
-}
-
-EAPI void
-glSamplerParameterf_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameterf(sampler, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameterf thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameterf *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameterf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat * params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   const GLfloat * params;
-
-} EVGL_API_Thread_Command_glSamplerParameterfv;
-
-void (*orig_evgl_api_glSamplerParameterfv)(GLuint sampler, GLenum pname, const GLfloat * params);
-
-static void
-_evgl_api_thread_glSamplerParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameterfv *)data;
-
-   orig_evgl_api_glSamplerParameterfv(thread_data->sampler,
-                                      thread_data->pname,
-                                      thread_data->params);
-
-}
-
-EAPI void
-glSamplerParameterfv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLfloat * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameterfv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameterfv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLint param;
-
-} EVGL_API_Thread_Command_glSamplerParameteri;
-
-void (*orig_evgl_api_glSamplerParameteri)(GLuint sampler, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glSamplerParameteri(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameteri *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameteri *)data;
-
-   orig_evgl_api_glSamplerParameteri(thread_data->sampler,
-                                     thread_data->pname,
-                                     thread_data->param);
-
-}
-
-EAPI void
-glSamplerParameteri_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameteri(sampler, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameteri thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameteri *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint * params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   const GLint * params;
-
-} EVGL_API_Thread_Command_glSamplerParameteriv;
-
-void (*orig_evgl_api_glSamplerParameteriv)(GLuint sampler, GLenum pname, const GLint * params);
-
-static void
-_evgl_api_thread_glSamplerParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameteriv *)data;
-
-   orig_evgl_api_glSamplerParameteriv(thread_data->sampler,
-                                      thread_data->pname,
-                                      thread_data->params);
-
-}
-
-EAPI void
-glSamplerParameteriv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLint * params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameteriv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameteriv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint internalFormat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLint border;
-   GLenum format;
-   GLenum type;
-   const GLvoid * data;
-
-} EVGL_API_Thread_Command_glTexImage3D;
-
-void (*orig_evgl_api_glTexImage3D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
-
-static void
-_evgl_api_thread_glTexImage3D(void *data)
-{
-   EVGL_API_Thread_Command_glTexImage3D *thread_data =
-      (EVGL_API_Thread_Command_glTexImage3D *)data;
-
-   orig_evgl_api_glTexImage3D(thread_data->target,
-                              thread_data->level,
-                              thread_data->internalFormat,
-                              thread_data->width,
-                              thread_data->height,
-                              thread_data->depth,
-                              thread_data->border,
-                              thread_data->format,
-                              thread_data->type,
-                              thread_data->data);
-
-}
-
-EAPI void
-glTexImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexImage3D thread_data_local;
-   EVGL_API_Thread_Command_glTexImage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalFormat = internalFormat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexImage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-
-} EVGL_API_Thread_Command_glTexStorage2D;
-
-void (*orig_evgl_api_glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-static void
-_evgl_api_thread_glTexStorage2D(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage2D *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage2D *)data;
-
-   orig_evgl_api_glTexStorage2D(thread_data->target,
-                                thread_data->levels,
-                                thread_data->internalformat,
-                                thread_data->width,
-                                thread_data->height);
-
-}
-
-EAPI void
-glTexStorage2D_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage2D(target, levels, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage2D thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage2D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei levels;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-
-} EVGL_API_Thread_Command_glTexStorage3D;
-
-void (*orig_evgl_api_glTexStorage3D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-static void
-_evgl_api_thread_glTexStorage3D(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage3D *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage3D *)data;
-
-   orig_evgl_api_glTexStorage3D(thread_data->target,
-                                thread_data->levels,
-                                thread_data->internalformat,
-                                thread_data->width,
-                                thread_data->height,
-                                thread_data->depth);
-
-}
-
-EAPI void
-glTexStorage3D_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage3D(target, levels, internalformat, width, height, depth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage3D thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->levels = levels;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLint zoffset;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLenum format;
-   GLenum type;
-   const GLvoid * data;
-
-} EVGL_API_Thread_Command_glTexSubImage3D;
-
-void (*orig_evgl_api_glTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
-
-static void
-_evgl_api_thread_glTexSubImage3D(void *data)
-{
-   EVGL_API_Thread_Command_glTexSubImage3D *thread_data =
-      (EVGL_API_Thread_Command_glTexSubImage3D *)data;
-
-   orig_evgl_api_glTexSubImage3D(thread_data->target,
-                                 thread_data->level,
-                                 thread_data->xoffset,
-                                 thread_data->yoffset,
-                                 thread_data->zoffset,
-                                 thread_data->width,
-                                 thread_data->height,
-                                 thread_data->depth,
-                                 thread_data->format,
-                                 thread_data->type,
-                                 thread_data->data);
-
-}
-
-EAPI void
-glTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexSubImage3D thread_data_local;
-   EVGL_API_Thread_Command_glTexSubImage3D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->zoffset = zoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexSubImage3D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei count;
-   const GLchar *const* varyings;
-   GLenum bufferMode;
-
-} EVGL_API_Thread_Command_glTransformFeedbackVaryings;
-
-void (*orig_evgl_api_glTransformFeedbackVaryings)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
-
-static void
-_evgl_api_thread_glTransformFeedbackVaryings(void *data)
-{
-   EVGL_API_Thread_Command_glTransformFeedbackVaryings *thread_data =
-      (EVGL_API_Thread_Command_glTransformFeedbackVaryings *)data;
-
-   orig_evgl_api_glTransformFeedbackVaryings(thread_data->program,
-                                             thread_data->count,
-                                             thread_data->varyings,
-                                             thread_data->bufferMode);
-
-}
-
-EAPI void
-glTransformFeedbackVaryings_evgl_api_thread_cmd(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTransformFeedbackVaryings(program, count, varyings, bufferMode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTransformFeedbackVaryings thread_data_local;
-   EVGL_API_Thread_Command_glTransformFeedbackVaryings *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->count = count;
-   thread_data->varyings = varyings;
-   thread_data->bufferMode = bufferMode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTransformFeedbackVaryings,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1ui(GLint location, GLuint v0);
- */
-
-typedef struct
-{
-   GLint location;
-   GLuint v0;
-
-} EVGL_API_Thread_Command_glUniform1ui;
-
-void (*orig_evgl_api_glUniform1ui)(GLint location, GLuint v0);
-
-static void
-_evgl_api_thread_glUniform1ui(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1ui *thread_data =
-      (EVGL_API_Thread_Command_glUniform1ui *)data;
-
-   orig_evgl_api_glUniform1ui(thread_data->location,
-                              thread_data->v0);
-
-}
-
-EAPI void
-glUniform1ui_evgl_api_thread_cmd(GLint location, GLuint v0)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1ui(location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1ui thread_data_local;
-   EVGL_API_Thread_Command_glUniform1ui *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glUniform1uiv;
-
-void (*orig_evgl_api_glUniform1uiv)(GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glUniform1uiv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform1uiv *thread_data =
-      (EVGL_API_Thread_Command_glUniform1uiv *)data;
-
-   orig_evgl_api_glUniform1uiv(thread_data->location,
-                               thread_data->count,
-                               thread_data->value);
-
-}
-
-EAPI void
-glUniform1uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform1uiv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform1uiv thread_data_local;
-   EVGL_API_Thread_Command_glUniform1uiv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform1uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2ui(GLint location, GLuint v0, GLuint v1);
- */
-
-typedef struct
-{
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-
-} EVGL_API_Thread_Command_glUniform2ui;
-
-void (*orig_evgl_api_glUniform2ui)(GLint location, GLuint v0, GLuint v1);
-
-static void
-_evgl_api_thread_glUniform2ui(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2ui *thread_data =
-      (EVGL_API_Thread_Command_glUniform2ui *)data;
-
-   orig_evgl_api_glUniform2ui(thread_data->location,
-                              thread_data->v0,
-                              thread_data->v1);
-
-}
-
-EAPI void
-glUniform2ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2ui(location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2ui thread_data_local;
-   EVGL_API_Thread_Command_glUniform2ui *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glUniform2uiv;
-
-void (*orig_evgl_api_glUniform2uiv)(GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glUniform2uiv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform2uiv *thread_data =
-      (EVGL_API_Thread_Command_glUniform2uiv *)data;
-
-   orig_evgl_api_glUniform2uiv(thread_data->location,
-                               thread_data->count,
-                               thread_data->value);
-
-}
-
-EAPI void
-glUniform2uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform2uiv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform2uiv thread_data_local;
-   EVGL_API_Thread_Command_glUniform2uiv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform2uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
- */
-
-typedef struct
-{
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-   GLuint v2;
-
-} EVGL_API_Thread_Command_glUniform3ui;
-
-void (*orig_evgl_api_glUniform3ui)(GLint location, GLuint v0, GLuint v1, GLuint v2);
-
-static void
-_evgl_api_thread_glUniform3ui(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3ui *thread_data =
-      (EVGL_API_Thread_Command_glUniform3ui *)data;
-
-   orig_evgl_api_glUniform3ui(thread_data->location,
-                              thread_data->v0,
-                              thread_data->v1,
-                              thread_data->v2);
-
-}
-
-EAPI void
-glUniform3ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3ui(location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3ui thread_data_local;
-   EVGL_API_Thread_Command_glUniform3ui *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glUniform3uiv;
-
-void (*orig_evgl_api_glUniform3uiv)(GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glUniform3uiv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform3uiv *thread_data =
-      (EVGL_API_Thread_Command_glUniform3uiv *)data;
-
-   orig_evgl_api_glUniform3uiv(thread_data->location,
-                               thread_data->count,
-                               thread_data->value);
-
-}
-
-EAPI void
-glUniform3uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform3uiv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform3uiv thread_data_local;
-   EVGL_API_Thread_Command_glUniform3uiv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform3uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- */
-
-typedef struct
-{
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-   GLuint v2;
-   GLuint v3;
-
-} EVGL_API_Thread_Command_glUniform4ui;
-
-void (*orig_evgl_api_glUniform4ui)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-static void
-_evgl_api_thread_glUniform4ui(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4ui *thread_data =
-      (EVGL_API_Thread_Command_glUniform4ui *)data;
-
-   orig_evgl_api_glUniform4ui(thread_data->location,
-                              thread_data->v0,
-                              thread_data->v1,
-                              thread_data->v2,
-                              thread_data->v3);
-
-}
-
-EAPI void
-glUniform4ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4ui(location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4ui thread_data_local;
-   EVGL_API_Thread_Command_glUniform4ui *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glUniform4uiv;
-
-void (*orig_evgl_api_glUniform4uiv)(GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glUniform4uiv(void *data)
-{
-   EVGL_API_Thread_Command_glUniform4uiv *thread_data =
-      (EVGL_API_Thread_Command_glUniform4uiv *)data;
-
-   orig_evgl_api_glUniform4uiv(thread_data->location,
-                               thread_data->count,
-                               thread_data->value);
-
-}
-
-EAPI void
-glUniform4uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniform4uiv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniform4uiv thread_data_local;
-   EVGL_API_Thread_Command_glUniform4uiv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniform4uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint uniformBlockIndex;
-   GLuint uniformBlockBinding;
-
-} EVGL_API_Thread_Command_glUniformBlockBinding;
-
-void (*orig_evgl_api_glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-
-static void
-_evgl_api_thread_glUniformBlockBinding(void *data)
-{
-   EVGL_API_Thread_Command_glUniformBlockBinding *thread_data =
-      (EVGL_API_Thread_Command_glUniformBlockBinding *)data;
-
-   orig_evgl_api_glUniformBlockBinding(thread_data->program,
-                                       thread_data->uniformBlockIndex,
-                                       thread_data->uniformBlockBinding);
-
-}
-
-EAPI void
-glUniformBlockBinding_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformBlockBinding thread_data_local;
-   EVGL_API_Thread_Command_glUniformBlockBinding *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->uniformBlockIndex = uniformBlockIndex;
-   thread_data->uniformBlockBinding = uniformBlockBinding;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformBlockBinding,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix2x3fv;
-
-void (*orig_evgl_api_glUniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix2x3fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix2x3fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix2x3fv *)data;
-
-   orig_evgl_api_glUniformMatrix2x3fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix2x3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix2x3fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix2x3fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix2x3fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix2x3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix3x2fv;
-
-void (*orig_evgl_api_glUniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix3x2fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix3x2fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix3x2fv *)data;
-
-   orig_evgl_api_glUniformMatrix3x2fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix3x2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix3x2fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix3x2fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix3x2fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix3x2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix2x4fv;
-
-void (*orig_evgl_api_glUniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix2x4fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix2x4fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix2x4fv *)data;
-
-   orig_evgl_api_glUniformMatrix2x4fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix2x4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix2x4fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix2x4fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix2x4fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix2x4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix4x2fv;
-
-void (*orig_evgl_api_glUniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix4x2fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix4x2fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix4x2fv *)data;
-
-   orig_evgl_api_glUniformMatrix4x2fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix4x2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix4x2fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix4x2fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix4x2fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix4x2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix3x4fv;
-
-void (*orig_evgl_api_glUniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix3x4fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix3x4fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix3x4fv *)data;
-
-   orig_evgl_api_glUniformMatrix3x4fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix3x4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix3x4fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix3x4fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix3x4fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix3x4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glUniformMatrix4x3fv;
-
-void (*orig_evgl_api_glUniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glUniformMatrix4x3fv(void *data)
-{
-   EVGL_API_Thread_Command_glUniformMatrix4x3fv *thread_data =
-      (EVGL_API_Thread_Command_glUniformMatrix4x3fv *)data;
-
-   orig_evgl_api_glUniformMatrix4x3fv(thread_data->location,
-                                      thread_data->count,
-                                      thread_data->transpose,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glUniformMatrix4x3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUniformMatrix4x3fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUniformMatrix4x3fv thread_data_local;
-   EVGL_API_Thread_Command_glUniformMatrix4x3fv *thread_data = &thread_data_local;
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUniformMatrix4x3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glUnmapBuffer(GLenum target);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLenum target;
-
-} EVGL_API_Thread_Command_glUnmapBuffer;
-
-GLboolean (*orig_evgl_api_glUnmapBuffer)(GLenum target);
-
-static void
-_evgl_api_thread_glUnmapBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glUnmapBuffer *thread_data =
-      (EVGL_API_Thread_Command_glUnmapBuffer *)data;
-
-   thread_data->return_value = orig_evgl_api_glUnmapBuffer(thread_data->target);
-
-}
-
-EAPI GLboolean
-glUnmapBuffer_evgl_api_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glUnmapBuffer(target);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUnmapBuffer thread_data_local;
-   EVGL_API_Thread_Command_glUnmapBuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUnmapBuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glVertexAttribDivisor(GLuint index, GLuint divisor);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLuint divisor;
-
-} EVGL_API_Thread_Command_glVertexAttribDivisor;
-
-void (*orig_evgl_api_glVertexAttribDivisor)(GLuint index, GLuint divisor);
-
-static void
-_evgl_api_thread_glVertexAttribDivisor(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribDivisor *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribDivisor *)data;
-
-   orig_evgl_api_glVertexAttribDivisor(thread_data->index,
-                                       thread_data->divisor);
-
-}
-
-EAPI void
-glVertexAttribDivisor_evgl_api_thread_cmd(GLuint index, GLuint divisor)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribDivisor(index, divisor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribDivisor thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribDivisor *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->divisor = divisor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribDivisor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribI4i(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   GLint v3;
-
-} EVGL_API_Thread_Command_glVertexAttribI4i;
-
-void (*orig_evgl_api_glVertexAttribI4i)(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
-
-static void
-_evgl_api_thread_glVertexAttribI4i(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribI4i *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribI4i *)data;
-
-   orig_evgl_api_glVertexAttribI4i(thread_data->index,
-                                   thread_data->v0,
-                                   thread_data->v1,
-                                   thread_data->v2,
-                                   thread_data->v3);
-
-}
-
-EAPI void
-glVertexAttribI4i_evgl_api_thread_cmd(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribI4i(index, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribI4i thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribI4i *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribI4i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribI4iv(GLuint index, const GLint *v);
- */
-
-typedef struct
-{
-   GLuint index;
-   const GLint *v;
-
-} EVGL_API_Thread_Command_glVertexAttribI4iv;
-
-void (*orig_evgl_api_glVertexAttribI4iv)(GLuint index, const GLint *v);
-
-static void
-_evgl_api_thread_glVertexAttribI4iv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribI4iv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribI4iv *)data;
-
-   orig_evgl_api_glVertexAttribI4iv(thread_data->index,
-                                    thread_data->v);
-
-}
-
-EAPI void
-glVertexAttribI4iv_evgl_api_thread_cmd(GLuint index, const GLint *v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribI4iv(index, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribI4iv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribI4iv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->v = v;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribI4iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribI4ui(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLuint v0;
-   GLuint v1;
-   GLuint v2;
-   GLuint v3;
-
-} EVGL_API_Thread_Command_glVertexAttribI4ui;
-
-void (*orig_evgl_api_glVertexAttribI4ui)(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-static void
-_evgl_api_thread_glVertexAttribI4ui(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribI4ui *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribI4ui *)data;
-
-   orig_evgl_api_glVertexAttribI4ui(thread_data->index,
-                                    thread_data->v0,
-                                    thread_data->v1,
-                                    thread_data->v2,
-                                    thread_data->v3);
-
-}
-
-EAPI void
-glVertexAttribI4ui_evgl_api_thread_cmd(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribI4ui(index, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribI4ui thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribI4ui *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribI4ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribI4uiv(GLuint index, const GLuint *v);
- */
-
-typedef struct
-{
-   GLuint index;
-   const GLuint *v;
-
-} EVGL_API_Thread_Command_glVertexAttribI4uiv;
-
-void (*orig_evgl_api_glVertexAttribI4uiv)(GLuint index, const GLuint *v);
-
-static void
-_evgl_api_thread_glVertexAttribI4uiv(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribI4uiv *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribI4uiv *)data;
-
-   orig_evgl_api_glVertexAttribI4uiv(thread_data->index,
-                                     thread_data->v);
-
-}
-
-EAPI void
-glVertexAttribI4uiv_evgl_api_thread_cmd(GLuint index, const GLuint *v)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribI4uiv(index, v);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribI4uiv thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribI4uiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->v = v;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribI4uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLint size;
-   GLenum type;
-   GLsizei stride;
-   const GLvoid *pointer;
-
-} EVGL_API_Thread_Command_glVertexAttribIPointer;
-
-void (*orig_evgl_api_glVertexAttribIPointer)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-static void
-_evgl_api_thread_glVertexAttribIPointer(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribIPointer *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribIPointer *)data;
-
-   orig_evgl_api_glVertexAttribIPointer(thread_data->index,
-                                        thread_data->size,
-                                        thread_data->type,
-                                        thread_data->stride,
-                                        thread_data->pointer);
-
-}
-
-EAPI void
-glVertexAttribIPointer_evgl_api_thread_cmd(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribIPointer(index, size, type, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribIPointer thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribIPointer *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribIPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
- */
-
-typedef struct
-{
-   GLsync sync;
-   GLbitfield flags;
-   EvasGLuint64 timeout;
-
-} EVGL_API_Thread_Command_glWaitSync;
-
-void (*orig_evgl_api_glWaitSync)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-static void
-_evgl_api_thread_glWaitSync(void *data)
-{
-   EVGL_API_Thread_Command_glWaitSync *thread_data =
-      (EVGL_API_Thread_Command_glWaitSync *)data;
-
-   orig_evgl_api_glWaitSync(thread_data->sync,
-                            thread_data->flags,
-                            thread_data->timeout);
-
-}
-
-EAPI void
-glWaitSync_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glWaitSync(sync, flags, timeout);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glWaitSync thread_data_local;
-   EVGL_API_Thread_Command_glWaitSync *thread_data = &thread_data_local;
-
-   thread_data->sync = sync;
-   thread_data->flags = flags;
-   thread_data->timeout = timeout;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glWaitSync,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
- */
-
-typedef struct
-{
-   GLuint num_groups_x;
-   GLuint num_groups_y;
-   GLuint num_groups_z;
-
-} EVGL_API_Thread_Command_glDispatchCompute;
-
-void (*orig_evgl_api_glDispatchCompute)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
-
-static void
-_evgl_api_thread_glDispatchCompute(void *data)
-{
-   EVGL_API_Thread_Command_glDispatchCompute *thread_data =
-      (EVGL_API_Thread_Command_glDispatchCompute *)data;
-
-   orig_evgl_api_glDispatchCompute(thread_data->num_groups_x,
-                                   thread_data->num_groups_y,
-                                   thread_data->num_groups_z);
-
-}
-
-EAPI void
-glDispatchCompute_evgl_api_thread_cmd(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDispatchCompute(num_groups_x, num_groups_y, num_groups_z);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDispatchCompute thread_data_local;
-   EVGL_API_Thread_Command_glDispatchCompute *thread_data = &thread_data_local;
-
-   thread_data->num_groups_x = num_groups_x;
-   thread_data->num_groups_y = num_groups_y;
-   thread_data->num_groups_z = num_groups_z;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDispatchCompute,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDispatchComputeIndirect(GLintptr indirect);
- */
-
-typedef struct
-{
-   GLintptr indirect;
-
-} EVGL_API_Thread_Command_glDispatchComputeIndirect;
-
-void (*orig_evgl_api_glDispatchComputeIndirect)(GLintptr indirect);
-
-static void
-_evgl_api_thread_glDispatchComputeIndirect(void *data)
-{
-   EVGL_API_Thread_Command_glDispatchComputeIndirect *thread_data =
-      (EVGL_API_Thread_Command_glDispatchComputeIndirect *)data;
-
-   orig_evgl_api_glDispatchComputeIndirect(thread_data->indirect);
-
-}
-
-EAPI void
-glDispatchComputeIndirect_evgl_api_thread_cmd(GLintptr indirect)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDispatchComputeIndirect(indirect);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDispatchComputeIndirect thread_data_local;
-   EVGL_API_Thread_Command_glDispatchComputeIndirect *thread_data = &thread_data_local;
-
-   thread_data->indirect = indirect;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDispatchComputeIndirect,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawArraysIndirect(GLenum mode, const void *indirect);
- */
-
-typedef struct
-{
-   GLenum mode;
-   const void *indirect;
-
-} EVGL_API_Thread_Command_glDrawArraysIndirect;
-
-void (*orig_evgl_api_glDrawArraysIndirect)(GLenum mode, const void *indirect);
-
-static void
-_evgl_api_thread_glDrawArraysIndirect(void *data)
-{
-   EVGL_API_Thread_Command_glDrawArraysIndirect *thread_data =
-      (EVGL_API_Thread_Command_glDrawArraysIndirect *)data;
-
-   orig_evgl_api_glDrawArraysIndirect(thread_data->mode,
-                                      thread_data->indirect);
-
-}
-
-EAPI void
-glDrawArraysIndirect_evgl_api_thread_cmd(GLenum mode, const void *indirect)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawArraysIndirect(mode, indirect);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawArraysIndirect thread_data_local;
-   EVGL_API_Thread_Command_glDrawArraysIndirect *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->indirect = indirect;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawArraysIndirect,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLenum type;
-   const void *indirect;
-
-} EVGL_API_Thread_Command_glDrawElementsIndirect;
-
-void (*orig_evgl_api_glDrawElementsIndirect)(GLenum mode, GLenum type, const void *indirect);
-
-static void
-_evgl_api_thread_glDrawElementsIndirect(void *data)
-{
-   EVGL_API_Thread_Command_glDrawElementsIndirect *thread_data =
-      (EVGL_API_Thread_Command_glDrawElementsIndirect *)data;
-
-   orig_evgl_api_glDrawElementsIndirect(thread_data->mode,
-                                        thread_data->type,
-                                        thread_data->indirect);
-
-}
-
-EAPI void
-glDrawElementsIndirect_evgl_api_thread_cmd(GLenum mode, GLenum type, const void *indirect)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawElementsIndirect(mode, type, indirect);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawElementsIndirect thread_data_local;
-   EVGL_API_Thread_Command_glDrawElementsIndirect *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->type = type;
-   thread_data->indirect = indirect;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawElementsIndirect,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint param;
-
-} EVGL_API_Thread_Command_glFramebufferParameteri;
-
-void (*orig_evgl_api_glFramebufferParameteri)(GLenum target, GLenum pname, GLint param);
-
-static void
-_evgl_api_thread_glFramebufferParameteri(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferParameteri *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferParameteri *)data;
-
-   orig_evgl_api_glFramebufferParameteri(thread_data->target,
-                                         thread_data->pname,
-                                         thread_data->param);
-
-}
-
-EAPI void
-glFramebufferParameteri_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferParameteri(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferParameteri thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferParameteri *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetFramebufferParameteriv;
-
-void (*orig_evgl_api_glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetFramebufferParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetFramebufferParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetFramebufferParameteriv *)data;
-
-   orig_evgl_api_glGetFramebufferParameteriv(thread_data->target,
-                                             thread_data->pname,
-                                             thread_data->params);
-
-}
-
-EAPI void
-glGetFramebufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetFramebufferParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetFramebufferParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetFramebufferParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetFramebufferParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum programInterface;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetProgramInterfaceiv;
-
-void (*orig_evgl_api_glGetProgramInterfaceiv)(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetProgramInterfaceiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramInterfaceiv *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramInterfaceiv *)data;
-
-   orig_evgl_api_glGetProgramInterfaceiv(thread_data->program,
-                                         thread_data->programInterface,
-                                         thread_data->pname,
-                                         thread_data->params);
-
-}
-
-EAPI void
-glGetProgramInterfaceiv_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramInterfaceiv(program, programInterface, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramInterfaceiv thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramInterfaceiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->programInterface = programInterface;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramInterfaceiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLuint program;
-   GLenum programInterface;
-   const GLchar *name;
-
-} EVGL_API_Thread_Command_glGetProgramResourceIndex;
-
-GLuint (*orig_evgl_api_glGetProgramResourceIndex)(GLuint program, GLenum programInterface, const GLchar *name);
-
-static void
-_evgl_api_thread_glGetProgramResourceIndex(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramResourceIndex *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramResourceIndex *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetProgramResourceIndex(thread_data->program,
-                                                                       thread_data->programInterface,
-                                                                       thread_data->name);
-
-}
-
-EAPI GLuint
-glGetProgramResourceIndex_evgl_api_thread_cmd(GLuint program, GLenum programInterface, const GLchar *name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetProgramResourceIndex(program, programInterface, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramResourceIndex thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramResourceIndex *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->programInterface = programInterface;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramResourceIndex,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum programInterface;
-   GLuint index;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *name;
-
-} EVGL_API_Thread_Command_glGetProgramResourceName;
-
-void (*orig_evgl_api_glGetProgramResourceName)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
-
-static void
-_evgl_api_thread_glGetProgramResourceName(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramResourceName *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramResourceName *)data;
-
-   orig_evgl_api_glGetProgramResourceName(thread_data->program,
-                                          thread_data->programInterface,
-                                          thread_data->index,
-                                          thread_data->bufSize,
-                                          thread_data->length,
-                                          thread_data->name);
-
-}
-
-EAPI void
-glGetProgramResourceName_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramResourceName(program, programInterface, index, bufSize, length, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramResourceName thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramResourceName *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->programInterface = programInterface;
-   thread_data->index = index;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramResourceName,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum programInterface;
-   GLuint index;
-   GLsizei propCount;
-   const GLenum *props;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetProgramResourceiv;
-
-void (*orig_evgl_api_glGetProgramResourceiv)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
-
-static void
-_evgl_api_thread_glGetProgramResourceiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramResourceiv *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramResourceiv *)data;
-
-   orig_evgl_api_glGetProgramResourceiv(thread_data->program,
-                                        thread_data->programInterface,
-                                        thread_data->index,
-                                        thread_data->propCount,
-                                        thread_data->props,
-                                        thread_data->bufSize,
-                                        thread_data->length,
-                                        thread_data->params);
-
-}
-
-EAPI void
-glGetProgramResourceiv_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramResourceiv thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramResourceiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->programInterface = programInterface;
-   thread_data->index = index;
-   thread_data->propCount = propCount;
-   thread_data->props = props;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramResourceiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLint
- * glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
- */
-
-typedef struct
-{
-   GLint return_value;
-   GLuint program;
-   GLenum programInterface;
-   const GLchar *name;
-
-} EVGL_API_Thread_Command_glGetProgramResourceLocation;
-
-GLint (*orig_evgl_api_glGetProgramResourceLocation)(GLuint program, GLenum programInterface, const GLchar *name);
-
-static void
-_evgl_api_thread_glGetProgramResourceLocation(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramResourceLocation *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramResourceLocation *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetProgramResourceLocation(thread_data->program,
-                                                                          thread_data->programInterface,
-                                                                          thread_data->name);
-
-}
-
-EAPI GLint
-glGetProgramResourceLocation_evgl_api_thread_cmd(GLuint program, GLenum programInterface, const GLchar *name)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetProgramResourceLocation(program, programInterface, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramResourceLocation thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramResourceLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->programInterface = programInterface;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramResourceLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-   GLbitfield stages;
-   GLuint program;
-
-} EVGL_API_Thread_Command_glUseProgramStages;
-
-void (*orig_evgl_api_glUseProgramStages)(GLuint pipeline, GLbitfield stages, GLuint program);
-
-static void
-_evgl_api_thread_glUseProgramStages(void *data)
-{
-   EVGL_API_Thread_Command_glUseProgramStages *thread_data =
-      (EVGL_API_Thread_Command_glUseProgramStages *)data;
-
-   orig_evgl_api_glUseProgramStages(thread_data->pipeline,
-                                    thread_data->stages,
-                                    thread_data->program);
-
-}
-
-EAPI void
-glUseProgramStages_evgl_api_thread_cmd(GLuint pipeline, GLbitfield stages, GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glUseProgramStages(pipeline, stages, program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glUseProgramStages thread_data_local;
-   EVGL_API_Thread_Command_glUseProgramStages *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-   thread_data->stages = stages;
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glUseProgramStages,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glActiveShaderProgram(GLuint pipeline, GLuint program);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-   GLuint program;
-
-} EVGL_API_Thread_Command_glActiveShaderProgram;
-
-void (*orig_evgl_api_glActiveShaderProgram)(GLuint pipeline, GLuint program);
-
-static void
-_evgl_api_thread_glActiveShaderProgram(void *data)
-{
-   EVGL_API_Thread_Command_glActiveShaderProgram *thread_data =
-      (EVGL_API_Thread_Command_glActiveShaderProgram *)data;
-
-   orig_evgl_api_glActiveShaderProgram(thread_data->pipeline,
-                                       thread_data->program);
-
-}
-
-EAPI void
-glActiveShaderProgram_evgl_api_thread_cmd(GLuint pipeline, GLuint program)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glActiveShaderProgram(pipeline, program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glActiveShaderProgram thread_data_local;
-   EVGL_API_Thread_Command_glActiveShaderProgram *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glActiveShaderProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const*strings);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLenum type;
-   GLsizei count;
-   const GLchar *const*strings;
-
-} EVGL_API_Thread_Command_glCreateShaderProgramv;
-
-GLuint (*orig_evgl_api_glCreateShaderProgramv)(GLenum type, GLsizei count, const GLchar *const*strings);
-
-static void
-_evgl_api_thread_glCreateShaderProgramv(void *data)
-{
-   EVGL_API_Thread_Command_glCreateShaderProgramv *thread_data =
-      (EVGL_API_Thread_Command_glCreateShaderProgramv *)data;
-
-   thread_data->return_value = orig_evgl_api_glCreateShaderProgramv(thread_data->type,
-                                                                    thread_data->count,
-                                                                    thread_data->strings);
-
-}
-
-EAPI GLuint
-glCreateShaderProgramv_evgl_api_thread_cmd(GLenum type, GLsizei count, const GLchar *const*strings)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glCreateShaderProgramv(type, count, strings);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCreateShaderProgramv thread_data_local;
-   EVGL_API_Thread_Command_glCreateShaderProgramv *thread_data = &thread_data_local;
-
-   thread_data->type = type;
-   thread_data->count = count;
-   thread_data->strings = strings;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCreateShaderProgramv,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glBindProgramPipeline(GLuint pipeline);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-
-} EVGL_API_Thread_Command_glBindProgramPipeline;
-
-void (*orig_evgl_api_glBindProgramPipeline)(GLuint pipeline);
-
-static void
-_evgl_api_thread_glBindProgramPipeline(void *data)
-{
-   EVGL_API_Thread_Command_glBindProgramPipeline *thread_data =
-      (EVGL_API_Thread_Command_glBindProgramPipeline *)data;
-
-   orig_evgl_api_glBindProgramPipeline(thread_data->pipeline);
-
-}
-
-EAPI void
-glBindProgramPipeline_evgl_api_thread_cmd(GLuint pipeline)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindProgramPipeline(pipeline);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindProgramPipeline thread_data_local;
-   EVGL_API_Thread_Command_glBindProgramPipeline *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindProgramPipeline,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *pipelines;
-
-} EVGL_API_Thread_Command_glDeleteProgramPipelines;
-
-void (*orig_evgl_api_glDeleteProgramPipelines)(GLsizei n, const GLuint *pipelines);
-
-static void
-_evgl_api_thread_glDeleteProgramPipelines(void *data)
-{
-   EVGL_API_Thread_Command_glDeleteProgramPipelines *thread_data =
-      (EVGL_API_Thread_Command_glDeleteProgramPipelines *)data;
-
-   orig_evgl_api_glDeleteProgramPipelines(thread_data->n,
-                                          thread_data->pipelines);
-
-}
-
-EAPI void
-glDeleteProgramPipelines_evgl_api_thread_cmd(GLsizei n, const GLuint *pipelines)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDeleteProgramPipelines(n, pipelines);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDeleteProgramPipelines thread_data_local;
-   EVGL_API_Thread_Command_glDeleteProgramPipelines *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->pipelines = pipelines;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDeleteProgramPipelines,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenProgramPipelines(GLsizei n, GLuint *pipelines);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *pipelines;
-
-} EVGL_API_Thread_Command_glGenProgramPipelines;
-
-void (*orig_evgl_api_glGenProgramPipelines)(GLsizei n, GLuint *pipelines);
-
-static void
-_evgl_api_thread_glGenProgramPipelines(void *data)
-{
-   EVGL_API_Thread_Command_glGenProgramPipelines *thread_data =
-      (EVGL_API_Thread_Command_glGenProgramPipelines *)data;
-
-   orig_evgl_api_glGenProgramPipelines(thread_data->n,
-                                       thread_data->pipelines);
-
-}
-
-EAPI void
-glGenProgramPipelines_evgl_api_thread_cmd(GLsizei n, GLuint *pipelines)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGenProgramPipelines(n, pipelines);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGenProgramPipelines thread_data_local;
-   EVGL_API_Thread_Command_glGenProgramPipelines *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->pipelines = pipelines;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGenProgramPipelines,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsProgramPipeline(GLuint pipeline);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint pipeline;
-
-} EVGL_API_Thread_Command_glIsProgramPipeline;
-
-GLboolean (*orig_evgl_api_glIsProgramPipeline)(GLuint pipeline);
-
-static void
-_evgl_api_thread_glIsProgramPipeline(void *data)
-{
-   EVGL_API_Thread_Command_glIsProgramPipeline *thread_data =
-      (EVGL_API_Thread_Command_glIsProgramPipeline *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsProgramPipeline(thread_data->pipeline);
-
-}
-
-EAPI GLboolean
-glIsProgramPipeline_evgl_api_thread_cmd(GLuint pipeline)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsProgramPipeline(pipeline);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsProgramPipeline thread_data_local;
-   EVGL_API_Thread_Command_glIsProgramPipeline *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsProgramPipeline,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetProgramPipelineiv;
-
-void (*orig_evgl_api_glGetProgramPipelineiv)(GLuint pipeline, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetProgramPipelineiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramPipelineiv *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramPipelineiv *)data;
-
-   orig_evgl_api_glGetProgramPipelineiv(thread_data->pipeline,
-                                        thread_data->pname,
-                                        thread_data->params);
-
-}
-
-EAPI void
-glGetProgramPipelineiv_evgl_api_thread_cmd(GLuint pipeline, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramPipelineiv(pipeline, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramPipelineiv thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramPipelineiv *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramPipelineiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1i(GLuint program, GLint location, GLint v0);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLint v0;
-
-} EVGL_API_Thread_Command_glProgramUniform1i;
-
-void (*orig_evgl_api_glProgramUniform1i)(GLuint program, GLint location, GLint v0);
-
-static void
-_evgl_api_thread_glProgramUniform1i(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1i *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1i *)data;
-
-   orig_evgl_api_glProgramUniform1i(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0);
-
-}
-
-EAPI void
-glProgramUniform1i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1i(program, location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1i thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1i *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLint v0;
-   GLint v1;
-
-} EVGL_API_Thread_Command_glProgramUniform2i;
-
-void (*orig_evgl_api_glProgramUniform2i)(GLuint program, GLint location, GLint v0, GLint v1);
-
-static void
-_evgl_api_thread_glProgramUniform2i(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2i *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2i *)data;
-
-   orig_evgl_api_glProgramUniform2i(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1);
-
-}
-
-EAPI void
-glProgramUniform2i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2i(program, location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2i thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2i *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-
-} EVGL_API_Thread_Command_glProgramUniform3i;
-
-void (*orig_evgl_api_glProgramUniform3i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
-
-static void
-_evgl_api_thread_glProgramUniform3i(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3i *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3i *)data;
-
-   orig_evgl_api_glProgramUniform3i(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1,
-                                    thread_data->v2);
-
-}
-
-EAPI void
-glProgramUniform3i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3i(program, location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3i thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3i *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   GLint v3;
-
-} EVGL_API_Thread_Command_glProgramUniform4i;
-
-void (*orig_evgl_api_glProgramUniform4i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-
-static void
-_evgl_api_thread_glProgramUniform4i(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4i *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4i *)data;
-
-   orig_evgl_api_glProgramUniform4i(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1,
-                                    thread_data->v2,
-                                    thread_data->v3);
-
-}
-
-EAPI void
-glProgramUniform4i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4i(program, location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4i thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4i *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLuint v0;
-
-} EVGL_API_Thread_Command_glProgramUniform1ui;
-
-void (*orig_evgl_api_glProgramUniform1ui)(GLuint program, GLint location, GLuint v0);
-
-static void
-_evgl_api_thread_glProgramUniform1ui(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1ui *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1ui *)data;
-
-   orig_evgl_api_glProgramUniform1ui(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->v0);
-
-}
-
-EAPI void
-glProgramUniform1ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1ui(program, location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1ui thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1ui *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-
-} EVGL_API_Thread_Command_glProgramUniform2ui;
-
-void (*orig_evgl_api_glProgramUniform2ui)(GLuint program, GLint location, GLuint v0, GLuint v1);
-
-static void
-_evgl_api_thread_glProgramUniform2ui(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2ui *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2ui *)data;
-
-   orig_evgl_api_glProgramUniform2ui(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->v0,
-                                     thread_data->v1);
-
-}
-
-EAPI void
-glProgramUniform2ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2ui(program, location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2ui thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2ui *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-   GLuint v2;
-
-} EVGL_API_Thread_Command_glProgramUniform3ui;
-
-void (*orig_evgl_api_glProgramUniform3ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
-
-static void
-_evgl_api_thread_glProgramUniform3ui(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3ui *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3ui *)data;
-
-   orig_evgl_api_glProgramUniform3ui(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->v0,
-                                     thread_data->v1,
-                                     thread_data->v2);
-
-}
-
-EAPI void
-glProgramUniform3ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3ui(program, location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3ui thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3ui *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLuint v0;
-   GLuint v1;
-   GLuint v2;
-   GLuint v3;
-
-} EVGL_API_Thread_Command_glProgramUniform4ui;
-
-void (*orig_evgl_api_glProgramUniform4ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-static void
-_evgl_api_thread_glProgramUniform4ui(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4ui *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4ui *)data;
-
-   orig_evgl_api_glProgramUniform4ui(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->v0,
-                                     thread_data->v1,
-                                     thread_data->v2,
-                                     thread_data->v3);
-
-}
-
-EAPI void
-glProgramUniform4ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4ui(program, location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4ui thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4ui *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4ui,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLfloat v0;
-
-} EVGL_API_Thread_Command_glProgramUniform1f;
-
-void (*orig_evgl_api_glProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-
-static void
-_evgl_api_thread_glProgramUniform1f(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1f *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1f *)data;
-
-   orig_evgl_api_glProgramUniform1f(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0);
-
-}
-
-EAPI void
-glProgramUniform1f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1f(program, location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1f thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1f *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-
-} EVGL_API_Thread_Command_glProgramUniform2f;
-
-void (*orig_evgl_api_glProgramUniform2f)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
-
-static void
-_evgl_api_thread_glProgramUniform2f(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2f *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2f *)data;
-
-   orig_evgl_api_glProgramUniform2f(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1);
-
-}
-
-EAPI void
-glProgramUniform2f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2f(program, location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2f thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2f *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-
-} EVGL_API_Thread_Command_glProgramUniform3f;
-
-void (*orig_evgl_api_glProgramUniform3f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-
-static void
-_evgl_api_thread_glProgramUniform3f(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3f *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3f *)data;
-
-   orig_evgl_api_glProgramUniform3f(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1,
-                                    thread_data->v2);
-
-}
-
-EAPI void
-glProgramUniform3f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3f(program, location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3f thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3f *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-   GLfloat v3;
-
-} EVGL_API_Thread_Command_glProgramUniform4f;
-
-void (*orig_evgl_api_glProgramUniform4f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-
-static void
-_evgl_api_thread_glProgramUniform4f(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4f *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4f *)data;
-
-   orig_evgl_api_glProgramUniform4f(thread_data->program,
-                                    thread_data->location,
-                                    thread_data->v0,
-                                    thread_data->v1,
-                                    thread_data->v2,
-                                    thread_data->v3);
-
-}
-
-EAPI void
-glProgramUniform4f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4f(program, location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4f thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4f *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform1iv;
-
-void (*orig_evgl_api_glProgramUniform1iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-static void
-_evgl_api_thread_glProgramUniform1iv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1iv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1iv *)data;
-
-   orig_evgl_api_glProgramUniform1iv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform1iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1iv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1iv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1iv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform2iv;
-
-void (*orig_evgl_api_glProgramUniform2iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-static void
-_evgl_api_thread_glProgramUniform2iv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2iv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2iv *)data;
-
-   orig_evgl_api_glProgramUniform2iv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform2iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2iv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2iv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2iv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform3iv;
-
-void (*orig_evgl_api_glProgramUniform3iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-static void
-_evgl_api_thread_glProgramUniform3iv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3iv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3iv *)data;
-
-   orig_evgl_api_glProgramUniform3iv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform3iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3iv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3iv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3iv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform4iv;
-
-void (*orig_evgl_api_glProgramUniform4iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-static void
-_evgl_api_thread_glProgramUniform4iv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4iv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4iv *)data;
-
-   orig_evgl_api_glProgramUniform4iv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform4iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4iv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4iv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4iv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform1uiv;
-
-void (*orig_evgl_api_glProgramUniform1uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glProgramUniform1uiv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1uiv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1uiv *)data;
-
-   orig_evgl_api_glProgramUniform1uiv(thread_data->program,
-                                      thread_data->location,
-                                      thread_data->count,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform1uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1uiv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1uiv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1uiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform2uiv;
-
-void (*orig_evgl_api_glProgramUniform2uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glProgramUniform2uiv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2uiv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2uiv *)data;
-
-   orig_evgl_api_glProgramUniform2uiv(thread_data->program,
-                                      thread_data->location,
-                                      thread_data->count,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform2uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2uiv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2uiv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2uiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform3uiv;
-
-void (*orig_evgl_api_glProgramUniform3uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glProgramUniform3uiv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3uiv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3uiv *)data;
-
-   orig_evgl_api_glProgramUniform3uiv(thread_data->program,
-                                      thread_data->location,
-                                      thread_data->count,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform3uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3uiv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3uiv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3uiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLuint *value;
-
-} EVGL_API_Thread_Command_glProgramUniform4uiv;
-
-void (*orig_evgl_api_glProgramUniform4uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-static void
-_evgl_api_thread_glProgramUniform4uiv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4uiv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4uiv *)data;
-
-   orig_evgl_api_glProgramUniform4uiv(thread_data->program,
-                                      thread_data->location,
-                                      thread_data->count,
-                                      thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform4uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4uiv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4uiv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4uiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4uiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniform1fv;
-
-void (*orig_evgl_api_glProgramUniform1fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniform1fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform1fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform1fv *)data;
-
-   orig_evgl_api_glProgramUniform1fv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform1fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform1fv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform1fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform1fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform1fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniform2fv;
-
-void (*orig_evgl_api_glProgramUniform2fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniform2fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform2fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform2fv *)data;
-
-   orig_evgl_api_glProgramUniform2fv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform2fv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform2fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform2fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniform3fv;
-
-void (*orig_evgl_api_glProgramUniform3fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniform3fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform3fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform3fv *)data;
-
-   orig_evgl_api_glProgramUniform3fv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform3fv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform3fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform3fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniform4fv;
-
-void (*orig_evgl_api_glProgramUniform4fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniform4fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniform4fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniform4fv *)data;
-
-   orig_evgl_api_glProgramUniform4fv(thread_data->program,
-                                     thread_data->location,
-                                     thread_data->count,
-                                     thread_data->value);
-
-}
-
-EAPI void
-glProgramUniform4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniform4fv(program, location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniform4fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniform4fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniform4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix2fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix2fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix2fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix2fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix2fv(thread_data->program,
-                                           thread_data->location,
-                                           thread_data->count,
-                                           thread_data->transpose,
-                                           thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix2fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix2fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix2fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix3fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix3fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix3fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix3fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix3fv(thread_data->program,
-                                           thread_data->location,
-                                           thread_data->count,
-                                           thread_data->transpose,
-                                           thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix3fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix3fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix3fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix4fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix4fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix4fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix4fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix4fv(thread_data->program,
-                                           thread_data->location,
-                                           thread_data->count,
-                                           thread_data->transpose,
-                                           thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix4fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix4fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix4fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix2x3fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix2x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix2x3fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x3fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix2x3fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix2x3fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix2x3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix2x3fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x3fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x3fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix2x3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix3x2fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix3x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix3x2fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x2fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix3x2fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix3x2fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix3x2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix3x2fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x2fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x2fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix3x2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix2x4fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix2x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix2x4fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x4fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix2x4fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix2x4fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix2x4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix2x4fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x4fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix2x4fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix2x4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix4x2fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix4x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix4x2fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x2fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix4x2fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix4x2fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix4x2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix4x2fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x2fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x2fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix4x2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix3x4fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix3x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix3x4fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x4fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix3x4fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix3x4fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix3x4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix3x4fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x4fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix3x4fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix3x4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-
-} EVGL_API_Thread_Command_glProgramUniformMatrix4x3fv;
-
-void (*orig_evgl_api_glProgramUniformMatrix4x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-static void
-_evgl_api_thread_glProgramUniformMatrix4x3fv(void *data)
-{
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x3fv *thread_data =
-      (EVGL_API_Thread_Command_glProgramUniformMatrix4x3fv *)data;
-
-   orig_evgl_api_glProgramUniformMatrix4x3fv(thread_data->program,
-                                             thread_data->location,
-                                             thread_data->count,
-                                             thread_data->transpose,
-                                             thread_data->value);
-
-}
-
-EAPI void
-glProgramUniformMatrix4x3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glProgramUniformMatrix4x3fv(program, location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x3fv thread_data_local;
-   EVGL_API_Thread_Command_glProgramUniformMatrix4x3fv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glProgramUniformMatrix4x3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glValidateProgramPipeline(GLuint pipeline);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-
-} EVGL_API_Thread_Command_glValidateProgramPipeline;
-
-void (*orig_evgl_api_glValidateProgramPipeline)(GLuint pipeline);
-
-static void
-_evgl_api_thread_glValidateProgramPipeline(void *data)
-{
-   EVGL_API_Thread_Command_glValidateProgramPipeline *thread_data =
-      (EVGL_API_Thread_Command_glValidateProgramPipeline *)data;
-
-   orig_evgl_api_glValidateProgramPipeline(thread_data->pipeline);
-
-}
-
-EAPI void
-glValidateProgramPipeline_evgl_api_thread_cmd(GLuint pipeline)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glValidateProgramPipeline(pipeline);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glValidateProgramPipeline thread_data_local;
-   EVGL_API_Thread_Command_glValidateProgramPipeline *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glValidateProgramPipeline,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- */
-
-typedef struct
-{
-   GLuint pipeline;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *infoLog;
-
-} EVGL_API_Thread_Command_glGetProgramPipelineInfoLog;
-
-void (*orig_evgl_api_glGetProgramPipelineInfoLog)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-
-static void
-_evgl_api_thread_glGetProgramPipelineInfoLog(void *data)
-{
-   EVGL_API_Thread_Command_glGetProgramPipelineInfoLog *thread_data =
-      (EVGL_API_Thread_Command_glGetProgramPipelineInfoLog *)data;
-
-   orig_evgl_api_glGetProgramPipelineInfoLog(thread_data->pipeline,
-                                             thread_data->bufSize,
-                                             thread_data->length,
-                                             thread_data->infoLog);
-
-}
-
-EAPI void
-glGetProgramPipelineInfoLog_evgl_api_thread_cmd(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetProgramPipelineInfoLog thread_data_local;
-   EVGL_API_Thread_Command_glGetProgramPipelineInfoLog *thread_data = &thread_data_local;
-
-   thread_data->pipeline = pipeline;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->infoLog = infoLog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetProgramPipelineInfoLog,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
- */
-
-typedef struct
-{
-   GLuint unit;
-   GLuint texture;
-   GLint level;
-   GLboolean layered;
-   GLint layer;
-   GLenum access;
-   GLenum format;
-
-} EVGL_API_Thread_Command_glBindImageTexture;
-
-void (*orig_evgl_api_glBindImageTexture)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
-
-static void
-_evgl_api_thread_glBindImageTexture(void *data)
-{
-   EVGL_API_Thread_Command_glBindImageTexture *thread_data =
-      (EVGL_API_Thread_Command_glBindImageTexture *)data;
-
-   orig_evgl_api_glBindImageTexture(thread_data->unit,
-                                    thread_data->texture,
-                                    thread_data->level,
-                                    thread_data->layered,
-                                    thread_data->layer,
-                                    thread_data->access,
-                                    thread_data->format);
-
-}
-
-EAPI void
-glBindImageTexture_evgl_api_thread_cmd(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindImageTexture(unit, texture, level, layered, layer, access, format);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindImageTexture thread_data_local;
-   EVGL_API_Thread_Command_glBindImageTexture *thread_data = &thread_data_local;
-
-   thread_data->unit = unit;
-   thread_data->texture = texture;
-   thread_data->level = level;
-   thread_data->layered = layered;
-   thread_data->layer = layer;
-   thread_data->access = access;
-   thread_data->format = format;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindImageTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-   GLboolean *data;
-
-} EVGL_API_Thread_Command_glGetBooleani_v;
-
-void (*orig_evgl_api_glGetBooleani_v)(GLenum target, GLuint index, GLboolean *data);
-
-static void
-_evgl_api_thread_glGetBooleani_v(void *data)
-{
-   EVGL_API_Thread_Command_glGetBooleani_v *thread_data =
-      (EVGL_API_Thread_Command_glGetBooleani_v *)data;
-
-   orig_evgl_api_glGetBooleani_v(thread_data->target,
-                                 thread_data->index,
-                                 thread_data->data);
-
-}
-
-EAPI void
-glGetBooleani_v_evgl_api_thread_cmd(GLenum target, GLuint index, GLboolean *data)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetBooleani_v(target, index, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetBooleani_v thread_data_local;
-   EVGL_API_Thread_Command_glGetBooleani_v *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetBooleani_v,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMemoryBarrier(GLbitfield barriers);
- */
-
-typedef struct
-{
-   GLbitfield barriers;
-
-} EVGL_API_Thread_Command_glMemoryBarrier;
-
-void (*orig_evgl_api_glMemoryBarrier)(GLbitfield barriers);
-
-static void
-_evgl_api_thread_glMemoryBarrier(void *data)
-{
-   EVGL_API_Thread_Command_glMemoryBarrier *thread_data =
-      (EVGL_API_Thread_Command_glMemoryBarrier *)data;
-
-   orig_evgl_api_glMemoryBarrier(thread_data->barriers);
-
-}
-
-EAPI void
-glMemoryBarrier_evgl_api_thread_cmd(GLbitfield barriers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMemoryBarrier(barriers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMemoryBarrier thread_data_local;
-   EVGL_API_Thread_Command_glMemoryBarrier *thread_data = &thread_data_local;
-
-   thread_data->barriers = barriers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMemoryBarrier,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMemoryBarrierByRegion(GLbitfield barriers);
- */
-
-typedef struct
-{
-   GLbitfield barriers;
-
-} EVGL_API_Thread_Command_glMemoryBarrierByRegion;
-
-void (*orig_evgl_api_glMemoryBarrierByRegion)(GLbitfield barriers);
-
-static void
-_evgl_api_thread_glMemoryBarrierByRegion(void *data)
-{
-   EVGL_API_Thread_Command_glMemoryBarrierByRegion *thread_data =
-      (EVGL_API_Thread_Command_glMemoryBarrierByRegion *)data;
-
-   orig_evgl_api_glMemoryBarrierByRegion(thread_data->barriers);
-
-}
-
-EAPI void
-glMemoryBarrierByRegion_evgl_api_thread_cmd(GLbitfield barriers)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMemoryBarrierByRegion(barriers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMemoryBarrierByRegion thread_data_local;
-   EVGL_API_Thread_Command_glMemoryBarrierByRegion *thread_data = &thread_data_local;
-
-   thread_data->barriers = barriers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMemoryBarrierByRegion,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei samples;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLboolean fixedsamplelocations;
-
-} EVGL_API_Thread_Command_glTexStorage2DMultisample;
-
-void (*orig_evgl_api_glTexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
-
-static void
-_evgl_api_thread_glTexStorage2DMultisample(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage2DMultisample *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage2DMultisample *)data;
-
-   orig_evgl_api_glTexStorage2DMultisample(thread_data->target,
-                                           thread_data->samples,
-                                           thread_data->internalformat,
-                                           thread_data->width,
-                                           thread_data->height,
-                                           thread_data->fixedsamplelocations);
-
-}
-
-EAPI void
-glTexStorage2DMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage2DMultisample thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage2DMultisample *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->samples = samples;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->fixedsamplelocations = fixedsamplelocations;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage2DMultisample,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLuint index;
-   GLfloat *val;
-
-} EVGL_API_Thread_Command_glGetMultisamplefv;
-
-void (*orig_evgl_api_glGetMultisamplefv)(GLenum pname, GLuint index, GLfloat *val);
-
-static void
-_evgl_api_thread_glGetMultisamplefv(void *data)
-{
-   EVGL_API_Thread_Command_glGetMultisamplefv *thread_data =
-      (EVGL_API_Thread_Command_glGetMultisamplefv *)data;
-
-   orig_evgl_api_glGetMultisamplefv(thread_data->pname,
-                                    thread_data->index,
-                                    thread_data->val);
-
-}
-
-EAPI void
-glGetMultisamplefv_evgl_api_thread_cmd(GLenum pname, GLuint index, GLfloat *val)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetMultisamplefv(pname, index, val);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetMultisamplefv thread_data_local;
-   EVGL_API_Thread_Command_glGetMultisamplefv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->index = index;
-   thread_data->val = val;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetMultisamplefv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSampleMaski(GLuint maskNumber, GLbitfield mask);
- */
-
-typedef struct
-{
-   GLuint maskNumber;
-   GLbitfield mask;
-
-} EVGL_API_Thread_Command_glSampleMaski;
-
-void (*orig_evgl_api_glSampleMaski)(GLuint maskNumber, GLbitfield mask);
-
-static void
-_evgl_api_thread_glSampleMaski(void *data)
-{
-   EVGL_API_Thread_Command_glSampleMaski *thread_data =
-      (EVGL_API_Thread_Command_glSampleMaski *)data;
-
-   orig_evgl_api_glSampleMaski(thread_data->maskNumber,
-                               thread_data->mask);
-
-}
-
-EAPI void
-glSampleMaski_evgl_api_thread_cmd(GLuint maskNumber, GLbitfield mask)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSampleMaski(maskNumber, mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSampleMaski thread_data_local;
-   EVGL_API_Thread_Command_glSampleMaski *thread_data = &thread_data_local;
-
-   thread_data->maskNumber = maskNumber;
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSampleMaski,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetTexLevelParameteriv;
-
-void (*orig_evgl_api_glGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetTexLevelParameteriv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexLevelParameteriv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexLevelParameteriv *)data;
-
-   orig_evgl_api_glGetTexLevelParameteriv(thread_data->target,
-                                          thread_data->level,
-                                          thread_data->pname,
-                                          thread_data->params);
-
-}
-
-EAPI void
-glGetTexLevelParameteriv_evgl_api_thread_cmd(GLenum target, GLint level, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexLevelParameteriv(target, level, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexLevelParameteriv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexLevelParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexLevelParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_API_Thread_Command_glGetTexLevelParameterfv;
-
-void (*orig_evgl_api_glGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params);
-
-static void
-_evgl_api_thread_glGetTexLevelParameterfv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexLevelParameterfv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexLevelParameterfv *)data;
-
-   orig_evgl_api_glGetTexLevelParameterfv(thread_data->target,
-                                          thread_data->level,
-                                          thread_data->pname,
-                                          thread_data->params);
-
-}
-
-EAPI void
-glGetTexLevelParameterfv_evgl_api_thread_cmd(GLenum target, GLint level, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexLevelParameterfv(target, level, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexLevelParameterfv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexLevelParameterfv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexLevelParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
- */
-
-typedef struct
-{
-   GLuint bindingindex;
-   GLuint buffer;
-   GLintptr offset;
-   GLsizei stride;
-
-} EVGL_API_Thread_Command_glBindVertexBuffer;
-
-void (*orig_evgl_api_glBindVertexBuffer)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
-
-static void
-_evgl_api_thread_glBindVertexBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glBindVertexBuffer *thread_data =
-      (EVGL_API_Thread_Command_glBindVertexBuffer *)data;
-
-   orig_evgl_api_glBindVertexBuffer(thread_data->bindingindex,
-                                    thread_data->buffer,
-                                    thread_data->offset,
-                                    thread_data->stride);
-
-}
-
-EAPI void
-glBindVertexBuffer_evgl_api_thread_cmd(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBindVertexBuffer(bindingindex, buffer, offset, stride);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBindVertexBuffer thread_data_local;
-   EVGL_API_Thread_Command_glBindVertexBuffer *thread_data = &thread_data_local;
-
-   thread_data->bindingindex = bindingindex;
-   thread_data->buffer = buffer;
-   thread_data->offset = offset;
-   thread_data->stride = stride;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBindVertexBuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
- */
-
-typedef struct
-{
-   GLuint attribindex;
-   GLint size;
-   GLenum type;
-   GLboolean normalized;
-   GLuint relativeoffset;
-
-} EVGL_API_Thread_Command_glVertexAttribFormat;
-
-void (*orig_evgl_api_glVertexAttribFormat)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
-
-static void
-_evgl_api_thread_glVertexAttribFormat(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribFormat *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribFormat *)data;
-
-   orig_evgl_api_glVertexAttribFormat(thread_data->attribindex,
-                                      thread_data->size,
-                                      thread_data->type,
-                                      thread_data->normalized,
-                                      thread_data->relativeoffset);
-
-}
-
-EAPI void
-glVertexAttribFormat_evgl_api_thread_cmd(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribFormat thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribFormat *thread_data = &thread_data_local;
-
-   thread_data->attribindex = attribindex;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->normalized = normalized;
-   thread_data->relativeoffset = relativeoffset;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribFormat,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
- */
-
-typedef struct
-{
-   GLuint attribindex;
-   GLint size;
-   GLenum type;
-   GLuint relativeoffset;
-
-} EVGL_API_Thread_Command_glVertexAttribIFormat;
-
-void (*orig_evgl_api_glVertexAttribIFormat)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
-
-static void
-_evgl_api_thread_glVertexAttribIFormat(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribIFormat *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribIFormat *)data;
-
-   orig_evgl_api_glVertexAttribIFormat(thread_data->attribindex,
-                                       thread_data->size,
-                                       thread_data->type,
-                                       thread_data->relativeoffset);
-
-}
-
-EAPI void
-glVertexAttribIFormat_evgl_api_thread_cmd(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribIFormat(attribindex, size, type, relativeoffset);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribIFormat thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribIFormat *thread_data = &thread_data_local;
-
-   thread_data->attribindex = attribindex;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->relativeoffset = relativeoffset;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribIFormat,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
- */
-
-typedef struct
-{
-   GLuint attribindex;
-   GLuint bindingindex;
-
-} EVGL_API_Thread_Command_glVertexAttribBinding;
-
-void (*orig_evgl_api_glVertexAttribBinding)(GLuint attribindex, GLuint bindingindex);
-
-static void
-_evgl_api_thread_glVertexAttribBinding(void *data)
-{
-   EVGL_API_Thread_Command_glVertexAttribBinding *thread_data =
-      (EVGL_API_Thread_Command_glVertexAttribBinding *)data;
-
-   orig_evgl_api_glVertexAttribBinding(thread_data->attribindex,
-                                       thread_data->bindingindex);
-
-}
-
-EAPI void
-glVertexAttribBinding_evgl_api_thread_cmd(GLuint attribindex, GLuint bindingindex)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexAttribBinding(attribindex, bindingindex);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexAttribBinding thread_data_local;
-   EVGL_API_Thread_Command_glVertexAttribBinding *thread_data = &thread_data_local;
-
-   thread_data->attribindex = attribindex;
-   thread_data->bindingindex = bindingindex;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexAttribBinding,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
- */
-
-typedef struct
-{
-   GLuint bindingindex;
-   GLuint divisor;
-
-} EVGL_API_Thread_Command_glVertexBindingDivisor;
-
-void (*orig_evgl_api_glVertexBindingDivisor)(GLuint bindingindex, GLuint divisor);
-
-static void
-_evgl_api_thread_glVertexBindingDivisor(void *data)
-{
-   EVGL_API_Thread_Command_glVertexBindingDivisor *thread_data =
-      (EVGL_API_Thread_Command_glVertexBindingDivisor *)data;
-
-   orig_evgl_api_glVertexBindingDivisor(thread_data->bindingindex,
-                                        thread_data->divisor);
-
-}
-
-EAPI void
-glVertexBindingDivisor_evgl_api_thread_cmd(GLuint bindingindex, GLuint divisor)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glVertexBindingDivisor(bindingindex, divisor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glVertexBindingDivisor thread_data_local;
-   EVGL_API_Thread_Command_glVertexBindingDivisor *thread_data = &thread_data_local;
-
-   thread_data->bindingindex = bindingindex;
-   thread_data->divisor = divisor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glVertexBindingDivisor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendBarrier(void);
- */
-
-void (*orig_evgl_api_glBlendBarrier)(void);
-
-static void
-_evgl_api_thread_glBlendBarrier(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glBlendBarrier();
-
-}
-
-EAPI void
-glBlendBarrier_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendBarrier();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendBarrier,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
- */
-
-typedef struct
-{
-   GLuint srcName;
-   GLenum srcTarget;
-   GLint srcLevel;
-   GLint srcX;
-   GLint srcY;
-   GLint srcZ;
-   GLuint dstName;
-   GLenum dstTarget;
-   GLint dstLevel;
-   GLint dstX;
-   GLint dstY;
-   GLint dstZ;
-   GLsizei srcWidth;
-   GLsizei srcHeight;
-   GLsizei srcDepth;
-
-} EVGL_API_Thread_Command_glCopyImageSubData;
-
-void (*orig_evgl_api_glCopyImageSubData)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
-
-static void
-_evgl_api_thread_glCopyImageSubData(void *data)
-{
-   EVGL_API_Thread_Command_glCopyImageSubData *thread_data =
-      (EVGL_API_Thread_Command_glCopyImageSubData *)data;
-
-   orig_evgl_api_glCopyImageSubData(thread_data->srcName,
-                                    thread_data->srcTarget,
-                                    thread_data->srcLevel,
-                                    thread_data->srcX,
-                                    thread_data->srcY,
-                                    thread_data->srcZ,
-                                    thread_data->dstName,
-                                    thread_data->dstTarget,
-                                    thread_data->dstLevel,
-                                    thread_data->dstX,
-                                    thread_data->dstY,
-                                    thread_data->dstZ,
-                                    thread_data->srcWidth,
-                                    thread_data->srcHeight,
-                                    thread_data->srcDepth);
-
-}
-
-EAPI void
-glCopyImageSubData_evgl_api_thread_cmd(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glCopyImageSubData thread_data_local;
-   EVGL_API_Thread_Command_glCopyImageSubData *thread_data = &thread_data_local;
-
-   thread_data->srcName = srcName;
-   thread_data->srcTarget = srcTarget;
-   thread_data->srcLevel = srcLevel;
-   thread_data->srcX = srcX;
-   thread_data->srcY = srcY;
-   thread_data->srcZ = srcZ;
-   thread_data->dstName = dstName;
-   thread_data->dstTarget = dstTarget;
-   thread_data->dstLevel = dstLevel;
-   thread_data->dstX = dstX;
-   thread_data->dstY = dstY;
-   thread_data->dstZ = dstZ;
-   thread_data->srcWidth = srcWidth;
-   thread_data->srcHeight = srcHeight;
-   thread_data->srcDepth = srcDepth;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glCopyImageSubData,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
- */
-
-typedef struct
-{
-   GLenum source;
-   GLenum type;
-   GLenum severity;
-   GLsizei count;
-   const GLuint *ids;
-   GLboolean enabled;
-
-} EVGL_API_Thread_Command_glDebugMessageControl;
-
-void (*orig_evgl_api_glDebugMessageControl)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-
-static void
-_evgl_api_thread_glDebugMessageControl(void *data)
-{
-   EVGL_API_Thread_Command_glDebugMessageControl *thread_data =
-      (EVGL_API_Thread_Command_glDebugMessageControl *)data;
-
-   orig_evgl_api_glDebugMessageControl(thread_data->source,
-                                       thread_data->type,
-                                       thread_data->severity,
-                                       thread_data->count,
-                                       thread_data->ids,
-                                       thread_data->enabled);
-
-}
-
-EAPI void
-glDebugMessageControl_evgl_api_thread_cmd(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDebugMessageControl(source, type, severity, count, ids, enabled);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDebugMessageControl thread_data_local;
-   EVGL_API_Thread_Command_glDebugMessageControl *thread_data = &thread_data_local;
-
-   thread_data->source = source;
-   thread_data->type = type;
-   thread_data->severity = severity;
-   thread_data->count = count;
-   thread_data->ids = ids;
-   thread_data->enabled = enabled;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDebugMessageControl,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
- */
-
-typedef struct
-{
-   GLenum source;
-   GLenum type;
-   GLuint id;
-   GLenum severity;
-   GLsizei length;
-   const GLchar *buf;
-
-} EVGL_API_Thread_Command_glDebugMessageInsert;
-
-void (*orig_evgl_api_glDebugMessageInsert)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-
-static void
-_evgl_api_thread_glDebugMessageInsert(void *data)
-{
-   EVGL_API_Thread_Command_glDebugMessageInsert *thread_data =
-      (EVGL_API_Thread_Command_glDebugMessageInsert *)data;
-
-   orig_evgl_api_glDebugMessageInsert(thread_data->source,
-                                      thread_data->type,
-                                      thread_data->id,
-                                      thread_data->severity,
-                                      thread_data->length,
-                                      thread_data->buf);
-
-}
-
-EAPI void
-glDebugMessageInsert_evgl_api_thread_cmd(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDebugMessageInsert(source, type, id, severity, length, buf);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDebugMessageInsert thread_data_local;
-   EVGL_API_Thread_Command_glDebugMessageInsert *thread_data = &thread_data_local;
-
-   thread_data->source = source;
-   thread_data->type = type;
-   thread_data->id = id;
-   thread_data->severity = severity;
-   thread_data->length = length;
-   thread_data->buf = buf;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDebugMessageInsert,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
- */
-
-typedef struct
-{
-   GLDEBUGPROC callback;
-   const void *userParam;
-
-} EVGL_API_Thread_Command_glDebugMessageCallback;
-
-void (*orig_evgl_api_glDebugMessageCallback)(GLDEBUGPROC callback, const void *userParam);
-
-static void
-_evgl_api_thread_glDebugMessageCallback(void *data)
-{
-   EVGL_API_Thread_Command_glDebugMessageCallback *thread_data =
-      (EVGL_API_Thread_Command_glDebugMessageCallback *)data;
-
-   orig_evgl_api_glDebugMessageCallback(thread_data->callback,
-                                        thread_data->userParam);
-
-}
-
-EAPI void
-glDebugMessageCallback_evgl_api_thread_cmd(GLDEBUGPROC callback, const void *userParam)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDebugMessageCallback(callback, userParam);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDebugMessageCallback thread_data_local;
-   EVGL_API_Thread_Command_glDebugMessageCallback *thread_data = &thread_data_local;
-
-   thread_data->callback = callback;
-   thread_data->userParam = userParam;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDebugMessageCallback,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLuint count;
-   GLsizei bufSize;
-   GLenum *sources;
-   GLenum *types;
-   GLuint *ids;
-   GLenum *severities;
-   GLsizei *lengths;
-   GLchar *messageLog;
-
-} EVGL_API_Thread_Command_glGetDebugMessageLog;
-
-GLuint (*orig_evgl_api_glGetDebugMessageLog)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-
-static void
-_evgl_api_thread_glGetDebugMessageLog(void *data)
-{
-   EVGL_API_Thread_Command_glGetDebugMessageLog *thread_data =
-      (EVGL_API_Thread_Command_glGetDebugMessageLog *)data;
-
-   thread_data->return_value = orig_evgl_api_glGetDebugMessageLog(thread_data->count,
-                                                                  thread_data->bufSize,
-                                                                  thread_data->sources,
-                                                                  thread_data->types,
-                                                                  thread_data->ids,
-                                                                  thread_data->severities,
-                                                                  thread_data->lengths,
-                                                                  thread_data->messageLog);
-
-}
-
-EAPI GLuint
-glGetDebugMessageLog_evgl_api_thread_cmd(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glGetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetDebugMessageLog thread_data_local;
-   EVGL_API_Thread_Command_glGetDebugMessageLog *thread_data = &thread_data_local;
-
-   thread_data->count = count;
-   thread_data->bufSize = bufSize;
-   thread_data->sources = sources;
-   thread_data->types = types;
-   thread_data->ids = ids;
-   thread_data->severities = severities;
-   thread_data->lengths = lengths;
-   thread_data->messageLog = messageLog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetDebugMessageLog,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
- */
-
-typedef struct
-{
-   GLenum source;
-   GLuint id;
-   GLsizei length;
-   const GLchar *message;
-
-} EVGL_API_Thread_Command_glPushDebugGroup;
-
-void (*orig_evgl_api_glPushDebugGroup)(GLenum source, GLuint id, GLsizei length, const GLchar *message);
-
-static void
-_evgl_api_thread_glPushDebugGroup(void *data)
-{
-   EVGL_API_Thread_Command_glPushDebugGroup *thread_data =
-      (EVGL_API_Thread_Command_glPushDebugGroup *)data;
-
-   orig_evgl_api_glPushDebugGroup(thread_data->source,
-                                  thread_data->id,
-                                  thread_data->length,
-                                  thread_data->message);
-
-}
-
-EAPI void
-glPushDebugGroup_evgl_api_thread_cmd(GLenum source, GLuint id, GLsizei length, const GLchar *message)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPushDebugGroup(source, id, length, message);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPushDebugGroup thread_data_local;
-   EVGL_API_Thread_Command_glPushDebugGroup *thread_data = &thread_data_local;
-
-   thread_data->source = source;
-   thread_data->id = id;
-   thread_data->length = length;
-   thread_data->message = message;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPushDebugGroup,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPopDebugGroup(void);
- */
-
-void (*orig_evgl_api_glPopDebugGroup)(void);
-
-static void
-_evgl_api_thread_glPopDebugGroup(void *data EINA_UNUSED)
-{
-   orig_evgl_api_glPopDebugGroup();
-
-}
-
-EAPI void
-glPopDebugGroup_evgl_api_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPopDebugGroup();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPopDebugGroup,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
- */
-
-typedef struct
-{
-   GLenum identifier;
-   GLuint name;
-   GLsizei length;
-   const GLchar *label;
-
-} EVGL_API_Thread_Command_glObjectLabel;
-
-void (*orig_evgl_api_glObjectLabel)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
-
-static void
-_evgl_api_thread_glObjectLabel(void *data)
-{
-   EVGL_API_Thread_Command_glObjectLabel *thread_data =
-      (EVGL_API_Thread_Command_glObjectLabel *)data;
-
-   orig_evgl_api_glObjectLabel(thread_data->identifier,
-                               thread_data->name,
-                               thread_data->length,
-                               thread_data->label);
-
-}
-
-EAPI void
-glObjectLabel_evgl_api_thread_cmd(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glObjectLabel(identifier, name, length, label);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glObjectLabel thread_data_local;
-   EVGL_API_Thread_Command_glObjectLabel *thread_data = &thread_data_local;
-
-   thread_data->identifier = identifier;
-   thread_data->name = name;
-   thread_data->length = length;
-   thread_data->label = label;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glObjectLabel,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
- */
-
-typedef struct
-{
-   GLenum identifier;
-   GLuint name;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *label;
-
-} EVGL_API_Thread_Command_glGetObjectLabel;
-
-void (*orig_evgl_api_glGetObjectLabel)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-
-static void
-_evgl_api_thread_glGetObjectLabel(void *data)
-{
-   EVGL_API_Thread_Command_glGetObjectLabel *thread_data =
-      (EVGL_API_Thread_Command_glGetObjectLabel *)data;
-
-   orig_evgl_api_glGetObjectLabel(thread_data->identifier,
-                                  thread_data->name,
-                                  thread_data->bufSize,
-                                  thread_data->length,
-                                  thread_data->label);
-
-}
-
-EAPI void
-glGetObjectLabel_evgl_api_thread_cmd(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetObjectLabel(identifier, name, bufSize, length, label);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetObjectLabel thread_data_local;
-   EVGL_API_Thread_Command_glGetObjectLabel *thread_data = &thread_data_local;
-
-   thread_data->identifier = identifier;
-   thread_data->name = name;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->label = label;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetObjectLabel,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
- */
-
-typedef struct
-{
-   const void *ptr;
-   GLsizei length;
-   const GLchar *label;
-
-} EVGL_API_Thread_Command_glObjectPtrLabel;
-
-void (*orig_evgl_api_glObjectPtrLabel)(const void *ptr, GLsizei length, const GLchar *label);
-
-static void
-_evgl_api_thread_glObjectPtrLabel(void *data)
-{
-   EVGL_API_Thread_Command_glObjectPtrLabel *thread_data =
-      (EVGL_API_Thread_Command_glObjectPtrLabel *)data;
-
-   orig_evgl_api_glObjectPtrLabel(thread_data->ptr,
-                                  thread_data->length,
-                                  thread_data->label);
-
-}
-
-EAPI void
-glObjectPtrLabel_evgl_api_thread_cmd(const void *ptr, GLsizei length, const GLchar *label)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glObjectPtrLabel(ptr, length, label);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glObjectPtrLabel thread_data_local;
-   EVGL_API_Thread_Command_glObjectPtrLabel *thread_data = &thread_data_local;
-
-   thread_data->ptr = ptr;
-   thread_data->length = length;
-   thread_data->label = label;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glObjectPtrLabel,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
- */
-
-typedef struct
-{
-   const void *ptr;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *label;
-
-} EVGL_API_Thread_Command_glGetObjectPtrLabel;
-
-void (*orig_evgl_api_glGetObjectPtrLabel)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
-
-static void
-_evgl_api_thread_glGetObjectPtrLabel(void *data)
-{
-   EVGL_API_Thread_Command_glGetObjectPtrLabel *thread_data =
-      (EVGL_API_Thread_Command_glGetObjectPtrLabel *)data;
-
-   orig_evgl_api_glGetObjectPtrLabel(thread_data->ptr,
-                                     thread_data->bufSize,
-                                     thread_data->length,
-                                     thread_data->label);
-
-}
-
-EAPI void
-glGetObjectPtrLabel_evgl_api_thread_cmd(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetObjectPtrLabel(ptr, bufSize, length, label);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetObjectPtrLabel thread_data_local;
-   EVGL_API_Thread_Command_glGetObjectPtrLabel *thread_data = &thread_data_local;
-
-   thread_data->ptr = ptr;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->label = label;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetObjectPtrLabel,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnablei(GLenum target, GLuint index);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-
-} EVGL_API_Thread_Command_glEnablei;
-
-void (*orig_evgl_api_glEnablei)(GLenum target, GLuint index);
-
-static void
-_evgl_api_thread_glEnablei(void *data)
-{
-   EVGL_API_Thread_Command_glEnablei *thread_data =
-      (EVGL_API_Thread_Command_glEnablei *)data;
-
-   orig_evgl_api_glEnablei(thread_data->target,
-                           thread_data->index);
-
-}
-
-EAPI void
-glEnablei_evgl_api_thread_cmd(GLenum target, GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEnablei(target, index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEnablei thread_data_local;
-   EVGL_API_Thread_Command_glEnablei *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEnablei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisablei(GLenum target, GLuint index);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint index;
-
-} EVGL_API_Thread_Command_glDisablei;
-
-void (*orig_evgl_api_glDisablei)(GLenum target, GLuint index);
-
-static void
-_evgl_api_thread_glDisablei(void *data)
-{
-   EVGL_API_Thread_Command_glDisablei *thread_data =
-      (EVGL_API_Thread_Command_glDisablei *)data;
-
-   orig_evgl_api_glDisablei(thread_data->target,
-                            thread_data->index);
-
-}
-
-EAPI void
-glDisablei_evgl_api_thread_cmd(GLenum target, GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDisablei(target, index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDisablei thread_data_local;
-   EVGL_API_Thread_Command_glDisablei *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDisablei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquationi(GLuint buf, GLenum mode);
- */
-
-typedef struct
-{
-   GLuint buf;
-   GLenum mode;
-
-} EVGL_API_Thread_Command_glBlendEquationi;
-
-void (*orig_evgl_api_glBlendEquationi)(GLuint buf, GLenum mode);
-
-static void
-_evgl_api_thread_glBlendEquationi(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquationi *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquationi *)data;
-
-   orig_evgl_api_glBlendEquationi(thread_data->buf,
-                                  thread_data->mode);
-
-}
-
-EAPI void
-glBlendEquationi_evgl_api_thread_cmd(GLuint buf, GLenum mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquationi(buf, mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquationi thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquationi *thread_data = &thread_data_local;
-
-   thread_data->buf = buf;
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquationi,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
- */
-
-typedef struct
-{
-   GLuint buf;
-   GLenum modeRGB;
-   GLenum modeAlpha;
-
-} EVGL_API_Thread_Command_glBlendEquationSeparatei;
-
-void (*orig_evgl_api_glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
-
-static void
-_evgl_api_thread_glBlendEquationSeparatei(void *data)
-{
-   EVGL_API_Thread_Command_glBlendEquationSeparatei *thread_data =
-      (EVGL_API_Thread_Command_glBlendEquationSeparatei *)data;
-
-   orig_evgl_api_glBlendEquationSeparatei(thread_data->buf,
-                                          thread_data->modeRGB,
-                                          thread_data->modeAlpha);
-
-}
-
-EAPI void
-glBlendEquationSeparatei_evgl_api_thread_cmd(GLuint buf, GLenum modeRGB, GLenum modeAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendEquationSeparatei(buf, modeRGB, modeAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendEquationSeparatei thread_data_local;
-   EVGL_API_Thread_Command_glBlendEquationSeparatei *thread_data = &thread_data_local;
-
-   thread_data->buf = buf;
-   thread_data->modeRGB = modeRGB;
-   thread_data->modeAlpha = modeAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendEquationSeparatei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFunci(GLuint buf, GLenum src, GLenum dst);
- */
-
-typedef struct
-{
-   GLuint buf;
-   GLenum src;
-   GLenum dst;
-
-} EVGL_API_Thread_Command_glBlendFunci;
-
-void (*orig_evgl_api_glBlendFunci)(GLuint buf, GLenum src, GLenum dst);
-
-static void
-_evgl_api_thread_glBlendFunci(void *data)
-{
-   EVGL_API_Thread_Command_glBlendFunci *thread_data =
-      (EVGL_API_Thread_Command_glBlendFunci *)data;
-
-   orig_evgl_api_glBlendFunci(thread_data->buf,
-                              thread_data->src,
-                              thread_data->dst);
-
-}
-
-EAPI void
-glBlendFunci_evgl_api_thread_cmd(GLuint buf, GLenum src, GLenum dst)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendFunci(buf, src, dst);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendFunci thread_data_local;
-   EVGL_API_Thread_Command_glBlendFunci *thread_data = &thread_data_local;
-
-   thread_data->buf = buf;
-   thread_data->src = src;
-   thread_data->dst = dst;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendFunci,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
- */
-
-typedef struct
-{
-   GLuint buf;
-   GLenum srcRGB;
-   GLenum dstRGB;
-   GLenum srcAlpha;
-   GLenum dstAlpha;
-
-} EVGL_API_Thread_Command_glBlendFuncSeparatei;
-
-void (*orig_evgl_api_glBlendFuncSeparatei)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-static void
-_evgl_api_thread_glBlendFuncSeparatei(void *data)
-{
-   EVGL_API_Thread_Command_glBlendFuncSeparatei *thread_data =
-      (EVGL_API_Thread_Command_glBlendFuncSeparatei *)data;
-
-   orig_evgl_api_glBlendFuncSeparatei(thread_data->buf,
-                                      thread_data->srcRGB,
-                                      thread_data->dstRGB,
-                                      thread_data->srcAlpha,
-                                      thread_data->dstAlpha);
-
-}
-
-EAPI void
-glBlendFuncSeparatei_evgl_api_thread_cmd(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glBlendFuncSeparatei thread_data_local;
-   EVGL_API_Thread_Command_glBlendFuncSeparatei *thread_data = &thread_data_local;
-
-   thread_data->buf = buf;
-   thread_data->srcRGB = srcRGB;
-   thread_data->dstRGB = dstRGB;
-   thread_data->srcAlpha = srcAlpha;
-   thread_data->dstAlpha = dstAlpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glBlendFuncSeparatei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLboolean r;
-   GLboolean g;
-   GLboolean b;
-   GLboolean a;
-
-} EVGL_API_Thread_Command_glColorMaski;
-
-void (*orig_evgl_api_glColorMaski)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
-static void
-_evgl_api_thread_glColorMaski(void *data)
-{
-   EVGL_API_Thread_Command_glColorMaski *thread_data =
-      (EVGL_API_Thread_Command_glColorMaski *)data;
-
-   orig_evgl_api_glColorMaski(thread_data->index,
-                              thread_data->r,
-                              thread_data->g,
-                              thread_data->b,
-                              thread_data->a);
-
-}
-
-EAPI void
-glColorMaski_evgl_api_thread_cmd(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glColorMaski(index, r, g, b, a);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glColorMaski thread_data_local;
-   EVGL_API_Thread_Command_glColorMaski *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->r = r;
-   thread_data->g = g;
-   thread_data->b = b;
-   thread_data->a = a;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glColorMaski,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsEnabledi(GLenum target, GLuint index);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLenum target;
-   GLuint index;
-
-} EVGL_API_Thread_Command_glIsEnabledi;
-
-GLboolean (*orig_evgl_api_glIsEnabledi)(GLenum target, GLuint index);
-
-static void
-_evgl_api_thread_glIsEnabledi(void *data)
-{
-   EVGL_API_Thread_Command_glIsEnabledi *thread_data =
-      (EVGL_API_Thread_Command_glIsEnabledi *)data;
-
-   thread_data->return_value = orig_evgl_api_glIsEnabledi(thread_data->target,
-                                                          thread_data->index);
-
-}
-
-EAPI GLboolean
-glIsEnabledi_evgl_api_thread_cmd(GLenum target, GLuint index)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api_glIsEnabledi(target, index);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glIsEnabledi thread_data_local;
-   EVGL_API_Thread_Command_glIsEnabledi *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glIsEnabledi,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void *indices;
-   GLint basevertex;
-
-} EVGL_API_Thread_Command_glDrawElementsBaseVertex;
-
-void (*orig_evgl_api_glDrawElementsBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
-static void
-_evgl_api_thread_glDrawElementsBaseVertex(void *data)
-{
-   EVGL_API_Thread_Command_glDrawElementsBaseVertex *thread_data =
-      (EVGL_API_Thread_Command_glDrawElementsBaseVertex *)data;
-
-   orig_evgl_api_glDrawElementsBaseVertex(thread_data->mode,
-                                          thread_data->count,
-                                          thread_data->type,
-                                          thread_data->indices,
-                                          thread_data->basevertex);
-
-}
-
-EAPI void
-glDrawElementsBaseVertex_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawElementsBaseVertex thread_data_local;
-   EVGL_API_Thread_Command_glDrawElementsBaseVertex *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->basevertex = basevertex;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawElementsBaseVertex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLuint start;
-   GLuint end;
-   GLsizei count;
-   GLenum type;
-   const void *indices;
-   GLint basevertex;
-
-} EVGL_API_Thread_Command_glDrawRangeElementsBaseVertex;
-
-void (*orig_evgl_api_glDrawRangeElementsBaseVertex)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
-static void
-_evgl_api_thread_glDrawRangeElementsBaseVertex(void *data)
-{
-   EVGL_API_Thread_Command_glDrawRangeElementsBaseVertex *thread_data =
-      (EVGL_API_Thread_Command_glDrawRangeElementsBaseVertex *)data;
-
-   orig_evgl_api_glDrawRangeElementsBaseVertex(thread_data->mode,
-                                               thread_data->start,
-                                               thread_data->end,
-                                               thread_data->count,
-                                               thread_data->type,
-                                               thread_data->indices,
-                                               thread_data->basevertex);
-
-}
-
-EAPI void
-glDrawRangeElementsBaseVertex_evgl_api_thread_cmd(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawRangeElementsBaseVertex thread_data_local;
-   EVGL_API_Thread_Command_glDrawRangeElementsBaseVertex *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->start = start;
-   thread_data->end = end;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->basevertex = basevertex;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawRangeElementsBaseVertex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void *indices;
-   GLsizei instancecount;
-   GLint basevertex;
-
-} EVGL_API_Thread_Command_glDrawElementsInstancedBaseVertex;
-
-void (*orig_evgl_api_glDrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
-
-static void
-_evgl_api_thread_glDrawElementsInstancedBaseVertex(void *data)
-{
-   EVGL_API_Thread_Command_glDrawElementsInstancedBaseVertex *thread_data =
-      (EVGL_API_Thread_Command_glDrawElementsInstancedBaseVertex *)data;
-
-   orig_evgl_api_glDrawElementsInstancedBaseVertex(thread_data->mode,
-                                                   thread_data->count,
-                                                   thread_data->type,
-                                                   thread_data->indices,
-                                                   thread_data->instancecount,
-                                                   thread_data->basevertex);
-
-}
-
-EAPI void
-glDrawElementsInstancedBaseVertex_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glDrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glDrawElementsInstancedBaseVertex thread_data_local;
-   EVGL_API_Thread_Command_glDrawElementsInstancedBaseVertex *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-   thread_data->instancecount = instancecount;
-   thread_data->basevertex = basevertex;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glDrawElementsInstancedBaseVertex,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLuint texture;
-   GLint level;
-
-} EVGL_API_Thread_Command_glFramebufferTexture;
-
-void (*orig_evgl_api_glFramebufferTexture)(GLenum target, GLenum attachment, GLuint texture, GLint level);
-
-static void
-_evgl_api_thread_glFramebufferTexture(void *data)
-{
-   EVGL_API_Thread_Command_glFramebufferTexture *thread_data =
-      (EVGL_API_Thread_Command_glFramebufferTexture *)data;
-
-   orig_evgl_api_glFramebufferTexture(thread_data->target,
-                                      thread_data->attachment,
-                                      thread_data->texture,
-                                      thread_data->level);
-
-}
-
-EAPI void
-glFramebufferTexture_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLuint texture, GLint level)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glFramebufferTexture(target, attachment, texture, level);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glFramebufferTexture thread_data_local;
-   EVGL_API_Thread_Command_glFramebufferTexture *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->texture = texture;
-   thread_data->level = level;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glFramebufferTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPrimitiveBoundingBox(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
- */
-
-typedef struct
-{
-   GLfloat minX;
-   GLfloat minY;
-   GLfloat minZ;
-   GLfloat minW;
-   GLfloat maxX;
-   GLfloat maxY;
-   GLfloat maxZ;
-   GLfloat maxW;
-
-} EVGL_API_Thread_Command_glPrimitiveBoundingBox;
-
-void (*orig_evgl_api_glPrimitiveBoundingBox)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
-
-static void
-_evgl_api_thread_glPrimitiveBoundingBox(void *data)
-{
-   EVGL_API_Thread_Command_glPrimitiveBoundingBox *thread_data =
-      (EVGL_API_Thread_Command_glPrimitiveBoundingBox *)data;
-
-   orig_evgl_api_glPrimitiveBoundingBox(thread_data->minX,
-                                        thread_data->minY,
-                                        thread_data->minZ,
-                                        thread_data->minW,
-                                        thread_data->maxX,
-                                        thread_data->maxY,
-                                        thread_data->maxZ,
-                                        thread_data->maxW);
-
-}
-
-EAPI void
-glPrimitiveBoundingBox_evgl_api_thread_cmd(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPrimitiveBoundingBox(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPrimitiveBoundingBox thread_data_local;
-   EVGL_API_Thread_Command_glPrimitiveBoundingBox *thread_data = &thread_data_local;
-
-   thread_data->minX = minX;
-   thread_data->minY = minY;
-   thread_data->minZ = minZ;
-   thread_data->minW = minW;
-   thread_data->maxX = maxX;
-   thread_data->maxY = maxY;
-   thread_data->maxZ = maxZ;
-   thread_data->maxW = maxW;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPrimitiveBoundingBox,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLint location;
-   GLsizei bufSize;
-   GLuint *params;
-
-} EVGL_API_Thread_Command_glGetnUniformuiv;
-
-void (*orig_evgl_api_glGetnUniformuiv)(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
-
-static void
-_evgl_api_thread_glGetnUniformuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetnUniformuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetnUniformuiv *)data;
-
-   orig_evgl_api_glGetnUniformuiv(thread_data->program,
-                                  thread_data->location,
-                                  thread_data->bufSize,
-                                  thread_data->params);
-
-}
-
-EAPI void
-glGetnUniformuiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLuint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetnUniformuiv(program, location, bufSize, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetnUniformuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetnUniformuiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->location = location;
-   thread_data->bufSize = bufSize;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetnUniformuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glMinSampleShading(GLfloat value);
- */
-
-typedef struct
-{
-   GLfloat value;
-
-} EVGL_API_Thread_Command_glMinSampleShading;
-
-void (*orig_evgl_api_glMinSampleShading)(GLfloat value);
-
-static void
-_evgl_api_thread_glMinSampleShading(void *data)
-{
-   EVGL_API_Thread_Command_glMinSampleShading *thread_data =
-      (EVGL_API_Thread_Command_glMinSampleShading *)data;
-
-   orig_evgl_api_glMinSampleShading(thread_data->value);
-
-}
-
-EAPI void
-glMinSampleShading_evgl_api_thread_cmd(GLfloat value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glMinSampleShading(value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glMinSampleShading thread_data_local;
-   EVGL_API_Thread_Command_glMinSampleShading *thread_data = &thread_data_local;
-
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glMinSampleShading,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPatchParameteri(GLenum pname, GLint value);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLint value;
-
-} EVGL_API_Thread_Command_glPatchParameteri;
-
-void (*orig_evgl_api_glPatchParameteri)(GLenum pname, GLint value);
-
-static void
-_evgl_api_thread_glPatchParameteri(void *data)
-{
-   EVGL_API_Thread_Command_glPatchParameteri *thread_data =
-      (EVGL_API_Thread_Command_glPatchParameteri *)data;
-
-   orig_evgl_api_glPatchParameteri(thread_data->pname,
-                                   thread_data->value);
-
-}
-
-EAPI void
-glPatchParameteri_evgl_api_thread_cmd(GLenum pname, GLint value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glPatchParameteri(pname, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glPatchParameteri thread_data_local;
-   EVGL_API_Thread_Command_glPatchParameteri *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glPatchParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLint *params;
-
-} EVGL_API_Thread_Command_glTexParameterIiv;
-
-void (*orig_evgl_api_glTexParameterIiv)(GLenum target, GLenum pname, const GLint *params);
-
-static void
-_evgl_api_thread_glTexParameterIiv(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterIiv *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterIiv *)data;
-
-   orig_evgl_api_glTexParameterIiv(thread_data->target,
-                                   thread_data->pname,
-                                   thread_data->params);
-
-}
-
-EAPI void
-glTexParameterIiv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterIiv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterIiv thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterIiv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterIiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLuint *params;
-
-} EVGL_API_Thread_Command_glTexParameterIuiv;
-
-void (*orig_evgl_api_glTexParameterIuiv)(GLenum target, GLenum pname, const GLuint *params);
-
-static void
-_evgl_api_thread_glTexParameterIuiv(void *data)
-{
-   EVGL_API_Thread_Command_glTexParameterIuiv *thread_data =
-      (EVGL_API_Thread_Command_glTexParameterIuiv *)data;
-
-   orig_evgl_api_glTexParameterIuiv(thread_data->target,
-                                    thread_data->pname,
-                                    thread_data->params);
-
-}
-
-EAPI void
-glTexParameterIuiv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLuint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexParameterIuiv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexParameterIuiv thread_data_local;
-   EVGL_API_Thread_Command_glTexParameterIuiv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexParameterIuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetTexParameterIiv;
-
-void (*orig_evgl_api_glGetTexParameterIiv)(GLenum target, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetTexParameterIiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameterIiv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameterIiv *)data;
-
-   orig_evgl_api_glGetTexParameterIiv(thread_data->target,
-                                      thread_data->pname,
-                                      thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameterIiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameterIiv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameterIiv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameterIiv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameterIiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLuint *params;
-
-} EVGL_API_Thread_Command_glGetTexParameterIuiv;
-
-void (*orig_evgl_api_glGetTexParameterIuiv)(GLenum target, GLenum pname, GLuint *params);
-
-static void
-_evgl_api_thread_glGetTexParameterIuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetTexParameterIuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetTexParameterIuiv *)data;
-
-   orig_evgl_api_glGetTexParameterIuiv(thread_data->target,
-                                       thread_data->pname,
-                                       thread_data->params);
-
-}
-
-EAPI void
-glGetTexParameterIuiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLuint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetTexParameterIuiv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetTexParameterIuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetTexParameterIuiv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetTexParameterIuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   const GLint *param;
-
-} EVGL_API_Thread_Command_glSamplerParameterIiv;
-
-void (*orig_evgl_api_glSamplerParameterIiv)(GLuint sampler, GLenum pname, const GLint *param);
-
-static void
-_evgl_api_thread_glSamplerParameterIiv(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameterIiv *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameterIiv *)data;
-
-   orig_evgl_api_glSamplerParameterIiv(thread_data->sampler,
-                                       thread_data->pname,
-                                       thread_data->param);
-
-}
-
-EAPI void
-glSamplerParameterIiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLint *param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameterIiv(sampler, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameterIiv thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameterIiv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameterIiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   const GLuint *param;
-
-} EVGL_API_Thread_Command_glSamplerParameterIuiv;
-
-void (*orig_evgl_api_glSamplerParameterIuiv)(GLuint sampler, GLenum pname, const GLuint *param);
-
-static void
-_evgl_api_thread_glSamplerParameterIuiv(void *data)
-{
-   EVGL_API_Thread_Command_glSamplerParameterIuiv *thread_data =
-      (EVGL_API_Thread_Command_glSamplerParameterIuiv *)data;
-
-   orig_evgl_api_glSamplerParameterIuiv(thread_data->sampler,
-                                        thread_data->pname,
-                                        thread_data->param);
-
-}
-
-EAPI void
-glSamplerParameterIuiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLuint *param)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glSamplerParameterIuiv(sampler, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glSamplerParameterIuiv thread_data_local;
-   EVGL_API_Thread_Command_glSamplerParameterIuiv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glSamplerParameterIuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_API_Thread_Command_glGetSamplerParameterIiv;
-
-void (*orig_evgl_api_glGetSamplerParameterIiv)(GLuint sampler, GLenum pname, GLint *params);
-
-static void
-_evgl_api_thread_glGetSamplerParameterIiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetSamplerParameterIiv *thread_data =
-      (EVGL_API_Thread_Command_glGetSamplerParameterIiv *)data;
-
-   orig_evgl_api_glGetSamplerParameterIiv(thread_data->sampler,
-                                          thread_data->pname,
-                                          thread_data->params);
-
-}
-
-EAPI void
-glGetSamplerParameterIiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSamplerParameterIiv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSamplerParameterIiv thread_data_local;
-   EVGL_API_Thread_Command_glGetSamplerParameterIiv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSamplerParameterIiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
- */
-
-typedef struct
-{
-   GLuint sampler;
-   GLenum pname;
-   GLuint *params;
-
-} EVGL_API_Thread_Command_glGetSamplerParameterIuiv;
-
-void (*orig_evgl_api_glGetSamplerParameterIuiv)(GLuint sampler, GLenum pname, GLuint *params);
-
-static void
-_evgl_api_thread_glGetSamplerParameterIuiv(void *data)
-{
-   EVGL_API_Thread_Command_glGetSamplerParameterIuiv *thread_data =
-      (EVGL_API_Thread_Command_glGetSamplerParameterIuiv *)data;
-
-   orig_evgl_api_glGetSamplerParameterIuiv(thread_data->sampler,
-                                           thread_data->pname,
-                                           thread_data->params);
-
-}
-
-EAPI void
-glGetSamplerParameterIuiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLuint *params)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glGetSamplerParameterIuiv(sampler, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glGetSamplerParameterIuiv thread_data_local;
-   EVGL_API_Thread_Command_glGetSamplerParameterIuiv *thread_data = &thread_data_local;
-
-   thread_data->sampler = sampler;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glGetSamplerParameterIuiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLuint buffer;
-
-} EVGL_API_Thread_Command_glTexBuffer;
-
-void (*orig_evgl_api_glTexBuffer)(GLenum target, GLenum internalformat, GLuint buffer);
-
-static void
-_evgl_api_thread_glTexBuffer(void *data)
-{
-   EVGL_API_Thread_Command_glTexBuffer *thread_data =
-      (EVGL_API_Thread_Command_glTexBuffer *)data;
-
-   orig_evgl_api_glTexBuffer(thread_data->target,
-                             thread_data->internalformat,
-                             thread_data->buffer);
-
-}
-
-EAPI void
-glTexBuffer_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLuint buffer)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexBuffer(target, internalformat, buffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexBuffer thread_data_local;
-   EVGL_API_Thread_Command_glTexBuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexBuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLuint buffer;
-   GLintptr offset;
-   GLsizeiptr size;
-
-} EVGL_API_Thread_Command_glTexBufferRange;
-
-void (*orig_evgl_api_glTexBufferRange)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
-
-static void
-_evgl_api_thread_glTexBufferRange(void *data)
-{
-   EVGL_API_Thread_Command_glTexBufferRange *thread_data =
-      (EVGL_API_Thread_Command_glTexBufferRange *)data;
-
-   orig_evgl_api_glTexBufferRange(thread_data->target,
-                                  thread_data->internalformat,
-                                  thread_data->buffer,
-                                  thread_data->offset,
-                                  thread_data->size);
-
-}
-
-EAPI void
-glTexBufferRange_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexBufferRange(target, internalformat, buffer, offset, size);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexBufferRange thread_data_local;
-   EVGL_API_Thread_Command_glTexBufferRange *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->buffer = buffer;
-   thread_data->offset = offset;
-   thread_data->size = size;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexBufferRange,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei samples;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLsizei depth;
-   GLboolean fixedsamplelocations;
-
-} EVGL_API_Thread_Command_glTexStorage3DMultisample;
-
-void (*orig_evgl_api_glTexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
-
-static void
-_evgl_api_thread_glTexStorage3DMultisample(void *data)
-{
-   EVGL_API_Thread_Command_glTexStorage3DMultisample *thread_data =
-      (EVGL_API_Thread_Command_glTexStorage3DMultisample *)data;
-
-   orig_evgl_api_glTexStorage3DMultisample(thread_data->target,
-                                           thread_data->samples,
-                                           thread_data->internalformat,
-                                           thread_data->width,
-                                           thread_data->height,
-                                           thread_data->depth,
-                                           thread_data->fixedsamplelocations);
-
-}
-
-EAPI void
-glTexStorage3DMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glTexStorage3DMultisample thread_data_local;
-   EVGL_API_Thread_Command_glTexStorage3DMultisample *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->samples = samples;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->depth = depth;
-   thread_data->fixedsamplelocations = fixedsamplelocations;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glTexStorage3DMultisample,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEGLImageTargetTexture2DOES(GLenum target, void *image);
- */
-
-typedef struct
-{
-   GLenum target;
-   void *image;
-
-} EVGL_API_Thread_Command_glEGLImageTargetTexture2DOES;
-
-void (*orig_evgl_api_glEGLImageTargetTexture2DOES)(GLenum target, void *image);
-
-static void
-_evgl_api_thread_glEGLImageTargetTexture2DOES(void *data)
-{
-   EVGL_API_Thread_Command_glEGLImageTargetTexture2DOES *thread_data =
-      (EVGL_API_Thread_Command_glEGLImageTargetTexture2DOES *)data;
-
-   orig_evgl_api_glEGLImageTargetTexture2DOES(thread_data->target,
-                                              thread_data->image);
-
-}
-
-EAPI void
-glEGLImageTargetTexture2DOES_evgl_api_thread_cmd(GLenum target, void *image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEGLImageTargetTexture2DOES(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEGLImageTargetTexture2DOES thread_data_local;
-   EVGL_API_Thread_Command_glEGLImageTargetTexture2DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEGLImageTargetTexture2DOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEGLImageTargetRenderbufferStorageOES(GLenum target, void *image);
- */
-
-typedef struct
-{
-   GLenum target;
-   void *image;
-   int command_allocated;
-
-} EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES;
-
-void (*orig_evgl_api_glEGLImageTargetRenderbufferStorageOES)(GLenum target, void *image);
-
-static void
-_evgl_api_thread_glEGLImageTargetRenderbufferStorageOES(void *data)
-{
-   EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES *thread_data =
-      (EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES *)data;
-
-   orig_evgl_api_glEGLImageTargetRenderbufferStorageOES(thread_data->target,
-                                                        thread_data->image);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glEGLImageTargetRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, void *image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api_glEGLImageTargetRenderbufferStorageOES(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES thread_data_local;
-   EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glEGLImageTargetRenderbufferStorageOES));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread_glEGLImageTargetRenderbufferStorageOES,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * _evgl_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizei numAttachments;
-   const GLenum* attachments;
-
-} EVGL_API_Thread_Command__evgl_glDiscardFramebufferEXT;
-
-void (*orig_evgl_api__evgl_glDiscardFramebufferEXT)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-static void
-_evgl_api_thread__evgl_glDiscardFramebufferEXT(void *data)
-{
-   EVGL_API_Thread_Command__evgl_glDiscardFramebufferEXT *thread_data =
-      (EVGL_API_Thread_Command__evgl_glDiscardFramebufferEXT *)data;
-
-   orig_evgl_api__evgl_glDiscardFramebufferEXT(thread_data->target,
-                                               thread_data->numAttachments,
-                                               thread_data->attachments);
-
-}
-
-EAPI void
-_evgl_glDiscardFramebufferEXT_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api__evgl_glDiscardFramebufferEXT(target, numAttachments, attachments);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_glDiscardFramebufferEXT thread_data_local;
-   EVGL_API_Thread_Command__evgl_glDiscardFramebufferEXT *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->numAttachments = numAttachments;
-   thread_data->attachments = attachments;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_glDiscardFramebufferEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * _evgl_glEvasGLImageTargetTexture2D(GLenum target, EvasGLImage image);
- */
-
-typedef struct
-{
-   GLenum target;
-   EvasGLImage image;
-
-} EVGL_API_Thread_Command__evgl_glEvasGLImageTargetTexture2D;
-
-void (*orig_evgl_api__evgl_glEvasGLImageTargetTexture2D)(GLenum target, EvasGLImage image);
-
-static void
-_evgl_api_thread__evgl_glEvasGLImageTargetTexture2D(void *data)
-{
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetTexture2D *thread_data =
-      (EVGL_API_Thread_Command__evgl_glEvasGLImageTargetTexture2D *)data;
-
-   orig_evgl_api__evgl_glEvasGLImageTargetTexture2D(thread_data->target,
-                                                    thread_data->image);
-
-}
-
-EAPI void
-_evgl_glEvasGLImageTargetTexture2D_evgl_api_thread_cmd(GLenum target, EvasGLImage image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api__evgl_glEvasGLImageTargetTexture2D(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetTexture2D thread_data_local;
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetTexture2D *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_glEvasGLImageTargetTexture2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * _evgl_glEvasGLImageTargetRenderbufferStorage(GLenum target, EvasGLImage image);
- */
-
-typedef struct
-{
-   GLenum target;
-   EvasGLImage image;
-
-} EVGL_API_Thread_Command__evgl_glEvasGLImageTargetRenderbufferStorage;
-
-void (*orig_evgl_api__evgl_glEvasGLImageTargetRenderbufferStorage)(GLenum target, EvasGLImage image);
-
-static void
-_evgl_api_thread__evgl_glEvasGLImageTargetRenderbufferStorage(void *data)
-{
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetRenderbufferStorage *thread_data =
-      (EVGL_API_Thread_Command__evgl_glEvasGLImageTargetRenderbufferStorage *)data;
-
-   orig_evgl_api__evgl_glEvasGLImageTargetRenderbufferStorage(thread_data->target,
-                                                              thread_data->image);
-
-}
-
-EAPI void
-_evgl_glEvasGLImageTargetRenderbufferStorage_evgl_api_thread_cmd(GLenum target, EvasGLImage image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api__evgl_glEvasGLImageTargetRenderbufferStorage(target, image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetRenderbufferStorage thread_data_local;
-   EVGL_API_Thread_Command__evgl_glEvasGLImageTargetRenderbufferStorage *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_glEvasGLImageTargetRenderbufferStorage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * EvasGLImage
- * _evgl_evasglCreateImage(int target, void* buffer, const int *attrib_list);
- */
-
-typedef struct
-{
-   EvasGLImage return_value;
-   int target;
-   void* buffer;
-   const int *attrib_list;
-
-} EVGL_API_Thread_Command__evgl_evasglCreateImage;
-
-EvasGLImage (*orig_evgl_api__evgl_evasglCreateImage)(int target, void* buffer, const int *attrib_list);
-
-static void
-_evgl_api_thread__evgl_evasglCreateImage(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglCreateImage *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglCreateImage *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglCreateImage(thread_data->target,
-                                                                     thread_data->buffer,
-                                                                     thread_data->attrib_list);
-
-}
-
-EAPI EvasGLImage
-_evgl_evasglCreateImage_evgl_api_thread_cmd(int target, void* buffer, const int *attrib_list)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglCreateImage(target, buffer, attrib_list);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglCreateImage thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglCreateImage *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->buffer = buffer;
-   thread_data->attrib_list = attrib_list;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglCreateImage,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * _evgl_evasglDestroyImage(EvasGLImage image);
- */
-
-typedef struct
-{
-   EvasGLImage image;
-
-} EVGL_API_Thread_Command__evgl_evasglDestroyImage;
-
-void (*orig_evgl_api__evgl_evasglDestroyImage)(EvasGLImage image);
-
-static void
-_evgl_api_thread__evgl_evasglDestroyImage(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglDestroyImage *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglDestroyImage *)data;
-
-   orig_evgl_api__evgl_evasglDestroyImage(thread_data->image);
-
-}
-
-EAPI void
-_evgl_evasglDestroyImage_evgl_api_thread_cmd(EvasGLImage image)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        orig_evgl_api__evgl_evasglDestroyImage(image);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglDestroyImage thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglDestroyImage *thread_data = &thread_data_local;
-
-   thread_data->image = image;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglDestroyImage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * EvasGLImage
- * _evgl_evasglCreateImageForContext(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
- */
-
-typedef struct
-{
-   EvasGLImage return_value;
-   Evas_GL *evas_gl;
-   Evas_GL_Context *ctx;
-   int target;
-   void* buffer;
-   const int *attrib_list;
-
-} EVGL_API_Thread_Command__evgl_evasglCreateImageForContext;
-
-EvasGLImage (*orig_evgl_api__evgl_evasglCreateImageForContext)(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
-
-static void
-_evgl_api_thread__evgl_evasglCreateImageForContext(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglCreateImageForContext *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglCreateImageForContext *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglCreateImageForContext(thread_data->evas_gl,
-                                                                               thread_data->ctx,
-                                                                               thread_data->target,
-                                                                               thread_data->buffer,
-                                                                               thread_data->attrib_list);
-
-}
-
-EAPI EvasGLImage
-_evgl_evasglCreateImageForContext_evgl_api_thread_cmd(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglCreateImageForContext(evas_gl, ctx, target, buffer, attrib_list);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglCreateImageForContext thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglCreateImageForContext *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->ctx = ctx;
-   thread_data->target = target;
-   thread_data->buffer = buffer;
-   thread_data->attrib_list = attrib_list;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglCreateImageForContext,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * EvasGLSync
- * _evgl_evasglCreateSync(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
- */
-
-typedef struct
-{
-   EvasGLSync return_value;
-   Evas_GL *evas_gl;
-   unsigned int type;
-   const int *attrib_list;
-
-} EVGL_API_Thread_Command__evgl_evasglCreateSync;
-
-EvasGLSync (*orig_evgl_api__evgl_evasglCreateSync)(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
-
-static void
-_evgl_api_thread__evgl_evasglCreateSync(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglCreateSync *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglCreateSync *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglCreateSync(thread_data->evas_gl,
-                                                                    thread_data->type,
-                                                                    thread_data->attrib_list);
-
-}
-
-EAPI EvasGLSync
-_evgl_evasglCreateSync_evgl_api_thread_cmd(Evas_GL *evas_gl, unsigned int type, const int *attrib_list)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglCreateSync(evas_gl, type, attrib_list);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglCreateSync thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglCreateSync *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->type = type;
-   thread_data->attrib_list = attrib_list;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglCreateSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglDestroySync(Evas_GL *evas_gl, EvasGLSync sync);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   EvasGLSync sync;
-
-} EVGL_API_Thread_Command__evgl_evasglDestroySync;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglDestroySync)(Evas_GL *evas_gl, EvasGLSync sync);
-
-static void
-_evgl_api_thread__evgl_evasglDestroySync(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglDestroySync *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglDestroySync *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglDestroySync(thread_data->evas_gl,
-                                                                     thread_data->sync);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglDestroySync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglDestroySync(evas_gl, sync);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglDestroySync thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglDestroySync *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglDestroySync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * int
- * _evgl_evasglClientWaitSync(Evas_GL *evas_gl, EvasGLSync sync);
- */
-
-typedef struct
-{
-   int return_value;
-   Evas_GL *evas_gl;
-   EvasGLSync sync;
-
-} EVGL_API_Thread_Command__evgl_evasglClientWaitSync;
-
-int (*orig_evgl_api__evgl_evasglClientWaitSync)(Evas_GL *evas_gl, EvasGLSync sync);
-
-static void
-_evgl_api_thread__evgl_evasglClientWaitSync(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglClientWaitSync *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglClientWaitSync *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglClientWaitSync(thread_data->evas_gl,
-                                                                        thread_data->sync);
-
-}
-
-EAPI int
-_evgl_evasglClientWaitSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglClientWaitSync(evas_gl, sync);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglClientWaitSync thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglClientWaitSync *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->sync = sync;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglClientWaitSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglGetSyncAttrib(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   EvasGLSync sync;
-   int attribute;
-   int *value;
-
-} EVGL_API_Thread_Command__evgl_evasglGetSyncAttrib;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglGetSyncAttrib)(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
-
-static void
-_evgl_api_thread__evgl_evasglGetSyncAttrib(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglGetSyncAttrib *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglGetSyncAttrib *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglGetSyncAttrib(thread_data->evas_gl,
-                                                                       thread_data->sync,
-                                                                       thread_data->attribute,
-                                                                       thread_data->value);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglGetSyncAttrib_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglGetSyncAttrib(evas_gl, sync, attribute, value);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglGetSyncAttrib thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglGetSyncAttrib *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->sync = sync;
-   thread_data->attribute = attribute;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglGetSyncAttrib,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglSignalSync(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   EvasGLSync sync;
-   unsigned mode;
-
-} EVGL_API_Thread_Command__evgl_evasglSignalSync;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglSignalSync)(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
-
-static void
-_evgl_api_thread__evgl_evasglSignalSync(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglSignalSync *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglSignalSync *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglSignalSync(thread_data->evas_gl,
-                                                                    thread_data->sync,
-                                                                    thread_data->mode);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglSignalSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglSignalSync(evas_gl, sync, mode);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglSignalSync thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglSignalSync *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->sync = sync;
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglSignalSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * int
- * _evgl_evasglWaitSync(Evas_GL *evas_gl, EvasGLSync sync, int flags);
- */
-
-typedef struct
-{
-   int return_value;
-   Evas_GL *evas_gl;
-   EvasGLSync sync;
-   int flags;
-
-} EVGL_API_Thread_Command__evgl_evasglWaitSync;
-
-int (*orig_evgl_api__evgl_evasglWaitSync)(Evas_GL *evas_gl, EvasGLSync sync, int flags);
-
-static void
-_evgl_api_thread__evgl_evasglWaitSync(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglWaitSync *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglWaitSync *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglWaitSync(thread_data->evas_gl,
-                                                                  thread_data->sync,
-                                                                  thread_data->flags);
-
-}
-
-EAPI int
-_evgl_evasglWaitSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, int flags)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglWaitSync(evas_gl, sync, flags);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglWaitSync thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglWaitSync *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->sync = sync;
-   thread_data->flags = flags;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglWaitSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglBindWaylandDisplay(Evas_GL *evas_gl, void *wl_display);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   void *wl_display;
-
-} EVGL_API_Thread_Command__evgl_evasglBindWaylandDisplay;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglBindWaylandDisplay)(Evas_GL *evas_gl, void *wl_display);
-
-static void
-_evgl_api_thread__evgl_evasglBindWaylandDisplay(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglBindWaylandDisplay *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglBindWaylandDisplay *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglBindWaylandDisplay(thread_data->evas_gl,
-                                                                            thread_data->wl_display);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglBindWaylandDisplay_evgl_api_thread_cmd(Evas_GL *evas_gl, void *wl_display)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglBindWaylandDisplay(evas_gl, wl_display);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglBindWaylandDisplay thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglBindWaylandDisplay *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->wl_display = wl_display;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglBindWaylandDisplay,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglUnbindWaylandDisplay(Evas_GL *evas_gl, void *wl_display);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   void *wl_display;
-
-} EVGL_API_Thread_Command__evgl_evasglUnbindWaylandDisplay;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglUnbindWaylandDisplay)(Evas_GL *evas_gl, void *wl_display);
-
-static void
-_evgl_api_thread__evgl_evasglUnbindWaylandDisplay(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglUnbindWaylandDisplay *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglUnbindWaylandDisplay *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglUnbindWaylandDisplay(thread_data->evas_gl,
-                                                                              thread_data->wl_display);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglUnbindWaylandDisplay_evgl_api_thread_cmd(Evas_GL *evas_gl, void *wl_display)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglUnbindWaylandDisplay(evas_gl, wl_display);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglUnbindWaylandDisplay thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglUnbindWaylandDisplay *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->wl_display = wl_display;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglUnbindWaylandDisplay,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * Eina_Bool
- * _evgl_evasglQueryWaylandBuffer(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
- */
-
-typedef struct
-{
-   Eina_Bool return_value;
-   Evas_GL *evas_gl;
-   void *buffer;
-   int attribute;
-   int *value;
-
-} EVGL_API_Thread_Command__evgl_evasglQueryWaylandBuffer;
-
-Eina_Bool (*orig_evgl_api__evgl_evasglQueryWaylandBuffer)(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
-
-static void
-_evgl_api_thread__evgl_evasglQueryWaylandBuffer(void *data)
-{
-   EVGL_API_Thread_Command__evgl_evasglQueryWaylandBuffer *thread_data =
-      (EVGL_API_Thread_Command__evgl_evasglQueryWaylandBuffer *)data;
-
-   thread_data->return_value = orig_evgl_api__evgl_evasglQueryWaylandBuffer(thread_data->evas_gl,
-                                                                            thread_data->buffer,
-                                                                            thread_data->attribute,
-                                                                            thread_data->value);
-
-}
-
-EAPI Eina_Bool
-_evgl_evasglQueryWaylandBuffer_evgl_api_thread_cmd(Evas_GL *evas_gl, void *buffer, int attribute, int *value)
-{
-   if (!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self()))
-     {
-        return orig_evgl_api__evgl_evasglQueryWaylandBuffer(evas_gl, buffer, attribute, value);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_API_Thread_Command__evgl_evasglQueryWaylandBuffer thread_data_local;
-   EVGL_API_Thread_Command__evgl_evasglQueryWaylandBuffer *thread_data = &thread_data_local;
-
-   thread_data->evas_gl = evas_gl;
-   thread_data->buffer = buffer;
-   thread_data->attribute = attribute;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_api_thread__evgl_evasglQueryWaylandBuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.h b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.h
deleted file mode 100644 (file)
index b3d850d..0000000
+++ /dev/null
@@ -1,1938 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-
-#define EVAS_GL_NO_GL_H_CHECK 1
-#include "Evas_GL.h"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-
-extern void (*orig_evgl_api_glActiveTexture)(GLenum texture);
-EAPI void glActiveTexture_evgl_api_thread_cmd(GLenum texture);
-
-extern void (*orig_evgl_api_glAttachShader)(GLuint program, GLuint shader);
-EAPI void glAttachShader_evgl_api_thread_cmd(GLuint program, GLuint shader);
-
-extern void (*orig_evgl_api_glBindAttribLocation)(GLuint program, GLuint index, const char* name);
-EAPI void glBindAttribLocation_evgl_api_thread_cmd(GLuint program, GLuint index, const char* name);
-
-extern void (*orig_evgl_api_glBindBuffer)(GLenum target, GLuint buffer);
-EAPI void glBindBuffer_evgl_api_thread_cmd(GLenum target, GLuint buffer);
-
-extern void (*orig_evgl_api_glBindFramebuffer)(GLenum target, GLuint framebuffer);
-EAPI void glBindFramebuffer_evgl_api_thread_cmd(GLenum target, GLuint framebuffer);
-
-extern void (*orig_evgl_api_glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
-EAPI void glBindRenderbuffer_evgl_api_thread_cmd(GLenum target, GLuint renderbuffer);
-
-extern void (*orig_evgl_api_glBindTexture)(GLenum target, GLuint texture);
-EAPI void glBindTexture_evgl_api_thread_cmd(GLenum target, GLuint texture);
-
-extern void (*orig_evgl_api_glBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-EAPI void glBlendColor_evgl_api_thread_cmd(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-
-extern void (*orig_evgl_api_glBlendEquation)(GLenum mode);
-EAPI void glBlendEquation_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
-EAPI void glBlendEquationSeparate_evgl_api_thread_cmd(GLenum modeRGB, GLenum modeAlpha);
-
-extern void (*orig_evgl_api_glBlendFunc)(GLenum sfactor, GLenum dfactor);
-EAPI void glBlendFunc_evgl_api_thread_cmd(GLenum sfactor, GLenum dfactor);
-
-extern void (*orig_evgl_api_glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-EAPI void glBlendFuncSeparate_evgl_api_thread_cmd(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-extern void (*orig_evgl_api_glBufferData)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
-EAPI void glBufferData_evgl_api_thread_cmd(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
-
-extern void (*orig_evgl_api_glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
-EAPI void glBufferSubData_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
-
-extern GLenum (*orig_evgl_api_glCheckFramebufferStatus)(GLenum target);
-EAPI GLenum glCheckFramebufferStatus_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glClear)(GLbitfield mask);
-EAPI void glClear_evgl_api_thread_cmd(GLbitfield mask);
-
-extern void (*orig_evgl_api_glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-EAPI void glClearColor_evgl_api_thread_cmd(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-
-extern void (*orig_evgl_api_glClearDepthf)(GLclampf depth);
-EAPI void glClearDepthf_evgl_api_thread_cmd(GLclampf depth);
-
-extern void (*orig_evgl_api_glClearStencil)(GLint s);
-EAPI void glClearStencil_evgl_api_thread_cmd(GLint s);
-
-extern void (*orig_evgl_api_glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-EAPI void glColorMask_evgl_api_thread_cmd(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-
-extern void (*orig_evgl_api_glCompileShader)(GLuint shader);
-EAPI void glCompileShader_evgl_api_thread_cmd(GLuint shader);
-
-extern void (*orig_evgl_api_glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
-EAPI void glCompressedTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
-
-extern void (*orig_evgl_api_glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
-EAPI void glCompressedTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
-
-extern void (*orig_evgl_api_glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-EAPI void glCopyTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-
-extern void (*orig_evgl_api_glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glCopyTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern GLuint (*orig_evgl_api_glCreateProgram)(void);
-EAPI GLuint glCreateProgram_evgl_api_thread_cmd(void);
-
-extern GLuint (*orig_evgl_api_glCreateShader)(GLenum type);
-EAPI GLuint glCreateShader_evgl_api_thread_cmd(GLenum type);
-
-extern void (*orig_evgl_api_glCullFace)(GLenum mode);
-EAPI void glCullFace_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glDeleteBuffers)(GLsizei n, const GLuint* buffers);
-EAPI void glDeleteBuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* buffers);
-
-extern void (*orig_evgl_api_glDeleteFramebuffers)(GLsizei n, const GLuint* framebuffers);
-EAPI void glDeleteFramebuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* framebuffers);
-
-extern void (*orig_evgl_api_glDeleteProgram)(GLuint program);
-EAPI void glDeleteProgram_evgl_api_thread_cmd(GLuint program);
-
-extern void (*orig_evgl_api_glDeleteRenderbuffers)(GLsizei n, const GLuint* renderbuffers);
-EAPI void glDeleteRenderbuffers_evgl_api_thread_cmd(GLsizei n, const GLuint* renderbuffers);
-
-extern void (*orig_evgl_api_glDeleteShader)(GLuint shader);
-EAPI void glDeleteShader_evgl_api_thread_cmd(GLuint shader);
-
-extern void (*orig_evgl_api_glDeleteTextures)(GLsizei n, const GLuint* textures);
-EAPI void glDeleteTextures_evgl_api_thread_cmd(GLsizei n, const GLuint* textures);
-
-extern void (*orig_evgl_api_glDepthFunc)(GLenum func);
-EAPI void glDepthFunc_evgl_api_thread_cmd(GLenum func);
-
-extern void (*orig_evgl_api_glDepthMask)(GLboolean flag);
-EAPI void glDepthMask_evgl_api_thread_cmd(GLboolean flag);
-
-extern void (*orig_evgl_api_glDepthRangef)(GLclampf zNear, GLclampf zFar);
-EAPI void glDepthRangef_evgl_api_thread_cmd(GLclampf zNear, GLclampf zFar);
-
-extern void (*orig_evgl_api_glDetachShader)(GLuint program, GLuint shader);
-EAPI void glDetachShader_evgl_api_thread_cmd(GLuint program, GLuint shader);
-
-extern void (*orig_evgl_api_glDisable)(GLenum cap);
-EAPI void glDisable_evgl_api_thread_cmd(GLenum cap);
-
-extern void (*orig_evgl_api_glDisableVertexAttribArray)(GLuint index);
-EAPI void glDisableVertexAttribArray_evgl_api_thread_cmd(GLuint index);
-
-extern void (*orig_evgl_api_glDrawArrays)(GLenum mode, GLint first, GLsizei count);
-EAPI void glDrawArrays_evgl_api_thread_cmd(GLenum mode, GLint first, GLsizei count);
-
-extern void (*orig_evgl_api_glDrawElements)(GLenum mode, GLsizei count, GLenum type, const void* indices);
-EAPI void glDrawElements_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void* indices);
-
-extern void (*orig_evgl_api_glEnable)(GLenum cap);
-EAPI void glEnable_evgl_api_thread_cmd(GLenum cap);
-
-extern void (*orig_evgl_api_glEnableVertexAttribArray)(GLuint index);
-EAPI void glEnableVertexAttribArray_evgl_api_thread_cmd(GLuint index);
-
-extern void (*orig_evgl_api_glFinish)(void);
-EAPI void glFinish_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glFlush)(void);
-EAPI void glFlush_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-EAPI void glFramebufferRenderbuffer_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-extern void (*orig_evgl_api_glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-EAPI void glFramebufferTexture2D_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-extern void (*orig_evgl_api_glFrontFace)(GLenum mode);
-EAPI void glFrontFace_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glGenBuffers)(GLsizei n, GLuint* buffers);
-EAPI void glGenBuffers_evgl_api_thread_cmd(GLsizei n, GLuint* buffers);
-
-extern void (*orig_evgl_api_glGenerateMipmap)(GLenum target);
-EAPI void glGenerateMipmap_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glGenFramebuffers)(GLsizei n, GLuint* framebuffers);
-EAPI void glGenFramebuffers_evgl_api_thread_cmd(GLsizei n, GLuint* framebuffers);
-
-extern void (*orig_evgl_api_glGenRenderbuffers)(GLsizei n, GLuint* renderbuffers);
-EAPI void glGenRenderbuffers_evgl_api_thread_cmd(GLsizei n, GLuint* renderbuffers);
-
-extern void (*orig_evgl_api_glGenTextures)(GLsizei n, GLuint* textures);
-EAPI void glGenTextures_evgl_api_thread_cmd(GLsizei n, GLuint* textures);
-
-extern void (*orig_evgl_api_glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-EAPI void glGetActiveAttrib_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-
-extern void (*orig_evgl_api_glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-EAPI void glGetActiveUniform_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
-
-extern void (*orig_evgl_api_glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-EAPI void glGetAttachedShaders_evgl_api_thread_cmd(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-
-extern int (*orig_evgl_api_glGetAttribLocation)(GLuint program, const char* name);
-EAPI int glGetAttribLocation_evgl_api_thread_cmd(GLuint program, const char* name);
-
-extern void (*orig_evgl_api_glGetBooleanv)(GLenum pname, GLboolean* params);
-EAPI void glGetBooleanv_evgl_api_thread_cmd(GLenum pname, GLboolean* params);
-
-extern void (*orig_evgl_api_glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params);
-EAPI void glGetBufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params);
-
-extern GLenum (*orig_evgl_api_glGetError)(void);
-EAPI GLenum glGetError_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glGetFloatv)(GLenum pname, GLfloat* params);
-EAPI void glGetFloatv_evgl_api_thread_cmd(GLenum pname, GLfloat* params);
-
-extern void (*orig_evgl_api_glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-EAPI void glGetFramebufferAttachmentParameteriv_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetIntegerv)(GLenum pname, GLint* params);
-EAPI void glGetIntegerv_evgl_api_thread_cmd(GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetProgramiv)(GLuint program, GLenum pname, GLint* params);
-EAPI void glGetProgramiv_evgl_api_thread_cmd(GLuint program, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
-EAPI void glGetProgramInfoLog_evgl_api_thread_cmd(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
-
-extern void (*orig_evgl_api_glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint* params);
-EAPI void glGetRenderbufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetShaderiv)(GLuint shader, GLenum pname, GLint* params);
-EAPI void glGetShaderiv_evgl_api_thread_cmd(GLuint shader, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
-EAPI void glGetShaderInfoLog_evgl_api_thread_cmd(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
-
-extern void (*orig_evgl_api_glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-EAPI void glGetShaderPrecisionFormat_evgl_api_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-
-extern void (*orig_evgl_api_glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
-EAPI void glGetShaderSource_evgl_api_thread_cmd(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
-
-extern const GLubyte* (*orig_evgl_api_glGetString)(GLenum name);
-EAPI const GLubyte* glGetString_evgl_api_thread_cmd(GLenum name);
-
-extern void (*orig_evgl_api_glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params);
-EAPI void glGetTexParameterfv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat* params);
-
-extern void (*orig_evgl_api_glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params);
-EAPI void glGetTexParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetUniformfv)(GLuint program, GLint location, GLfloat* params);
-EAPI void glGetUniformfv_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat* params);
-
-extern void (*orig_evgl_api_glGetUniformiv)(GLuint program, GLint location, GLint* params);
-EAPI void glGetUniformiv_evgl_api_thread_cmd(GLuint program, GLint location, GLint* params);
-
-extern int (*orig_evgl_api_glGetUniformLocation)(GLuint program, const char* name);
-EAPI int glGetUniformLocation_evgl_api_thread_cmd(GLuint program, const char* name);
-
-extern void (*orig_evgl_api_glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params);
-EAPI void glGetVertexAttribfv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLfloat* params);
-
-extern void (*orig_evgl_api_glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params);
-EAPI void glGetVertexAttribiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGetVertexAttribPointerv)(GLuint index, GLenum pname, void** pointer);
-EAPI void glGetVertexAttribPointerv_evgl_api_thread_cmd(GLuint index, GLenum pname, void** pointer);
-
-extern void (*orig_evgl_api_glHint)(GLenum target, GLenum mode);
-EAPI void glHint_evgl_api_thread_cmd(GLenum target, GLenum mode);
-
-extern GLboolean (*orig_evgl_api_glIsBuffer)(GLuint buffer);
-EAPI GLboolean glIsBuffer_evgl_api_thread_cmd(GLuint buffer);
-
-extern GLboolean (*orig_evgl_api_glIsEnabled)(GLenum cap);
-EAPI GLboolean glIsEnabled_evgl_api_thread_cmd(GLenum cap);
-
-extern GLboolean (*orig_evgl_api_glIsFramebuffer)(GLuint framebuffer);
-EAPI GLboolean glIsFramebuffer_evgl_api_thread_cmd(GLuint framebuffer);
-
-extern GLboolean (*orig_evgl_api_glIsProgram)(GLuint program);
-EAPI GLboolean glIsProgram_evgl_api_thread_cmd(GLuint program);
-
-extern GLboolean (*orig_evgl_api_glIsRenderbuffer)(GLuint renderbuffer);
-EAPI GLboolean glIsRenderbuffer_evgl_api_thread_cmd(GLuint renderbuffer);
-
-extern GLboolean (*orig_evgl_api_glIsShader)(GLuint shader);
-EAPI GLboolean glIsShader_evgl_api_thread_cmd(GLuint shader);
-
-extern GLboolean (*orig_evgl_api_glIsTexture)(GLuint texture);
-EAPI GLboolean glIsTexture_evgl_api_thread_cmd(GLuint texture);
-
-extern void (*orig_evgl_api_glLineWidth)(GLfloat width);
-EAPI void glLineWidth_evgl_api_thread_cmd(GLfloat width);
-
-extern void (*orig_evgl_api_glLinkProgram)(GLuint program);
-EAPI void glLinkProgram_evgl_api_thread_cmd(GLuint program);
-
-extern void (*orig_evgl_api_glPixelStorei)(GLenum pname, GLint param);
-EAPI void glPixelStorei_evgl_api_thread_cmd(GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glPolygonOffset)(GLfloat factor, GLfloat units);
-EAPI void glPolygonOffset_evgl_api_thread_cmd(GLfloat factor, GLfloat units);
-
-extern void (*orig_evgl_api_glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
-EAPI void glReadPixels_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
-
-extern void (*orig_evgl_api_glReleaseShaderCompiler)(void);
-EAPI void glReleaseShaderCompiler_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glRenderbufferStorage_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glSampleCoverage)(GLclampf value, GLboolean invert);
-EAPI void glSampleCoverage_evgl_api_thread_cmd(GLclampf value, GLboolean invert);
-
-extern void (*orig_evgl_api_glScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glScissor_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
-EAPI void glShaderBinary_evgl_api_thread_cmd(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
-
-extern void (*orig_evgl_api_glShaderSource)(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
-EAPI void glShaderSource_evgl_api_thread_cmd(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
-
-extern void (*orig_evgl_api_glStencilFunc)(GLenum func, GLint ref, GLuint mask);
-EAPI void glStencilFunc_evgl_api_thread_cmd(GLenum func, GLint ref, GLuint mask);
-
-extern void (*orig_evgl_api_glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask);
-EAPI void glStencilFuncSeparate_evgl_api_thread_cmd(GLenum face, GLenum func, GLint ref, GLuint mask);
-
-extern void (*orig_evgl_api_glStencilMask)(GLuint mask);
-EAPI void glStencilMask_evgl_api_thread_cmd(GLuint mask);
-
-extern void (*orig_evgl_api_glStencilMaskSeparate)(GLenum face, GLuint mask);
-EAPI void glStencilMaskSeparate_evgl_api_thread_cmd(GLenum face, GLuint mask);
-
-extern void (*orig_evgl_api_glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
-EAPI void glStencilOp_evgl_api_thread_cmd(GLenum fail, GLenum zfail, GLenum zpass);
-
-extern void (*orig_evgl_api_glStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-EAPI void glStencilOpSeparate_evgl_api_thread_cmd(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-
-extern void (*orig_evgl_api_glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
-EAPI void glTexImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
-
-extern void (*orig_evgl_api_glTexParameterf)(GLenum target, GLenum pname, GLfloat param);
-EAPI void glTexParameterf_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params);
-EAPI void glTexParameterfv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfloat* params);
-
-extern void (*orig_evgl_api_glTexParameteri)(GLenum target, GLenum pname, GLint param);
-EAPI void glTexParameteri_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glTexParameteriv)(GLenum target, GLenum pname, const GLint* params);
-EAPI void glTexParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint* params);
-
-extern void (*orig_evgl_api_glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
-EAPI void glTexSubImage2D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
-
-extern void (*orig_evgl_api_glUniform1f)(GLint location, GLfloat x);
-EAPI void glUniform1f_evgl_api_thread_cmd(GLint location, GLfloat x);
-
-extern void (*orig_evgl_api_glUniform1fv)(GLint location, GLsizei count, const GLfloat* v);
-EAPI void glUniform1fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v);
-
-extern void (*orig_evgl_api_glUniform1i)(GLint location, GLint x);
-EAPI void glUniform1i_evgl_api_thread_cmd(GLint location, GLint x);
-
-extern void (*orig_evgl_api_glUniform1iv)(GLint location, GLsizei count, const GLint* v);
-EAPI void glUniform1iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v);
-
-extern void (*orig_evgl_api_glUniform2f)(GLint location, GLfloat x, GLfloat y);
-EAPI void glUniform2f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y);
-
-extern void (*orig_evgl_api_glUniform2fv)(GLint location, GLsizei count, const GLfloat* v);
-EAPI void glUniform2fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v);
-
-extern void (*orig_evgl_api_glUniform2i)(GLint location, GLint x, GLint y);
-EAPI void glUniform2i_evgl_api_thread_cmd(GLint location, GLint x, GLint y);
-
-extern void (*orig_evgl_api_glUniform2iv)(GLint location, GLsizei count, const GLint* v);
-EAPI void glUniform2iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v);
-
-extern void (*orig_evgl_api_glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z);
-EAPI void glUniform3f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y, GLfloat z);
-
-extern void (*orig_evgl_api_glUniform3fv)(GLint location, GLsizei count, const GLfloat* v);
-EAPI void glUniform3fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v);
-
-extern void (*orig_evgl_api_glUniform3i)(GLint location, GLint x, GLint y, GLint z);
-EAPI void glUniform3i_evgl_api_thread_cmd(GLint location, GLint x, GLint y, GLint z);
-
-extern void (*orig_evgl_api_glUniform3iv)(GLint location, GLsizei count, const GLint* v);
-EAPI void glUniform3iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v);
-
-extern void (*orig_evgl_api_glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-EAPI void glUniform4f_evgl_api_thread_cmd(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-
-extern void (*orig_evgl_api_glUniform4fv)(GLint location, GLsizei count, const GLfloat* v);
-EAPI void glUniform4fv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLfloat* v);
-
-extern void (*orig_evgl_api_glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w);
-EAPI void glUniform4i_evgl_api_thread_cmd(GLint location, GLint x, GLint y, GLint z, GLint w);
-
-extern void (*orig_evgl_api_glUniform4iv)(GLint location, GLsizei count, const GLint* v);
-EAPI void glUniform4iv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLint* v);
-
-extern void (*orig_evgl_api_glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-EAPI void glUniformMatrix2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-extern void (*orig_evgl_api_glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-EAPI void glUniformMatrix3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-extern void (*orig_evgl_api_glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-EAPI void glUniformMatrix4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-
-extern void (*orig_evgl_api_glUseProgram)(GLuint program);
-EAPI void glUseProgram_evgl_api_thread_cmd(GLuint program);
-
-extern void (*orig_evgl_api_glValidateProgram)(GLuint program);
-EAPI void glValidateProgram_evgl_api_thread_cmd(GLuint program);
-
-extern void (*orig_evgl_api_glVertexAttrib1f)(GLuint indx, GLfloat x);
-EAPI void glVertexAttrib1f_evgl_api_thread_cmd(GLuint indx, GLfloat x);
-
-extern void (*orig_evgl_api_glVertexAttrib1fv)(GLuint indx, const GLfloat* values);
-EAPI void glVertexAttrib1fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values);
-
-extern void (*orig_evgl_api_glVertexAttrib2f)(GLuint indx, GLfloat x, GLfloat y);
-EAPI void glVertexAttrib2f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y);
-
-extern void (*orig_evgl_api_glVertexAttrib2fv)(GLuint indx, const GLfloat* values);
-EAPI void glVertexAttrib2fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values);
-
-extern void (*orig_evgl_api_glVertexAttrib3f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-EAPI void glVertexAttrib3f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-
-extern void (*orig_evgl_api_glVertexAttrib3fv)(GLuint indx, const GLfloat* values);
-EAPI void glVertexAttrib3fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values);
-
-extern void (*orig_evgl_api_glVertexAttrib4f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-EAPI void glVertexAttrib4f_evgl_api_thread_cmd(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-
-extern void (*orig_evgl_api_glVertexAttrib4fv)(GLuint indx, const GLfloat* values);
-EAPI void glVertexAttrib4fv_evgl_api_thread_cmd(GLuint indx, const GLfloat* values);
-
-extern void (*orig_evgl_api_glVertexAttribPointer)(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
-EAPI void glVertexAttribPointer_evgl_api_thread_cmd(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
-
-extern void (*orig_evgl_api_glViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glViewport_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glEvasGLImageTargetTexture2DOES)(GLenum target, EvasGLImage image);
-EAPI void glEvasGLImageTargetTexture2DOES_evgl_api_thread_cmd(GLenum target, EvasGLImage image);
-
-extern void (*orig_evgl_api_glEvasGLImageTargetRenderbufferStorageOES)(GLenum target, EvasGLImage image);
-EAPI void glEvasGLImageTargetRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, EvasGLImage image);
-
-extern void (*orig_evgl_api_glGetProgramBinaryOES)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-EAPI void glGetProgramBinaryOES_evgl_api_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-extern void (*orig_evgl_api_glProgramBinaryOES)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-EAPI void glProgramBinaryOES_evgl_api_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-
-extern void * (*orig_evgl_api_glMapBufferOES)(GLenum target, GLenum access);
-EAPI void * glMapBufferOES_evgl_api_thread_cmd(GLenum target, GLenum access);
-
-extern GLboolean (*orig_evgl_api_glUnmapBufferOES)(GLenum target);
-EAPI GLboolean glUnmapBufferOES_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glGetBufferPointervOES)(GLenum target, GLenum pname, void** params);
-EAPI void glGetBufferPointervOES_evgl_api_thread_cmd(GLenum target, GLenum pname, void** params);
-
-extern void (*orig_evgl_api_glTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
-EAPI void glTexImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
-
-extern void (*orig_evgl_api_glTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
-EAPI void glTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
-
-extern void (*orig_evgl_api_glCopyTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glCopyTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glCompressedTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
-EAPI void glCompressedTexImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
-
-extern void (*orig_evgl_api_glCompressedTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
-EAPI void glCompressedTexSubImage3DOES_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
-
-extern void (*orig_evgl_api_glFramebufferTexture3DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-EAPI void glFramebufferTexture3DOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-
-extern void (*orig_evgl_api_glGetPerfMonitorGroupsAMD)(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
-EAPI void glGetPerfMonitorGroupsAMD_evgl_api_thread_cmd(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
-
-extern void (*orig_evgl_api_glGetPerfMonitorCountersAMD)(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
-EAPI void glGetPerfMonitorCountersAMD_evgl_api_thread_cmd(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
-
-extern void (*orig_evgl_api_glGetPerfMonitorGroupStringAMD)(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
-EAPI void glGetPerfMonitorGroupStringAMD_evgl_api_thread_cmd(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
-
-extern void (*orig_evgl_api_glGetPerfMonitorCounterStringAMD)(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
-EAPI void glGetPerfMonitorCounterStringAMD_evgl_api_thread_cmd(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
-
-extern void (*orig_evgl_api_glGetPerfMonitorCounterInfoAMD)(GLuint group, GLuint counter, GLenum pname, void* data);
-EAPI void glGetPerfMonitorCounterInfoAMD_evgl_api_thread_cmd(GLuint group, GLuint counter, GLenum pname, void* data);
-
-extern void (*orig_evgl_api_glGenPerfMonitorsAMD)(GLsizei n, GLuint* monitors);
-EAPI void glGenPerfMonitorsAMD_evgl_api_thread_cmd(GLsizei n, GLuint* monitors);
-
-extern void (*orig_evgl_api_glDeletePerfMonitorsAMD)(GLsizei n, GLuint* monitors);
-EAPI void glDeletePerfMonitorsAMD_evgl_api_thread_cmd(GLsizei n, GLuint* monitors);
-
-extern void (*orig_evgl_api_glSelectPerfMonitorCountersAMD)(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
-EAPI void glSelectPerfMonitorCountersAMD_evgl_api_thread_cmd(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
-
-extern void (*orig_evgl_api_glBeginPerfMonitorAMD)(GLuint monitor);
-EAPI void glBeginPerfMonitorAMD_evgl_api_thread_cmd(GLuint monitor);
-
-extern void (*orig_evgl_api_glEndPerfMonitorAMD)(GLuint monitor);
-EAPI void glEndPerfMonitorAMD_evgl_api_thread_cmd(GLuint monitor);
-
-extern void (*orig_evgl_api_glGetPerfMonitorCounterDataAMD)(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
-EAPI void glGetPerfMonitorCounterDataAMD_evgl_api_thread_cmd(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
-
-extern void (*orig_evgl_api_glDiscardFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-EAPI void glDiscardFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-extern void (*orig_evgl_api_glDiscardFramebufferEXT)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-EAPI void glDiscardFramebufferEXT_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-extern void (*orig_evgl_api_glMultiDrawArrays)(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-EAPI void glMultiDrawArrays_evgl_api_thread_cmd(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-
-extern void (*orig_evgl_api_glMultiDrawArraysEXT)(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-EAPI void glMultiDrawArraysEXT_evgl_api_thread_cmd(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
-
-extern void (*orig_evgl_api_glMultiDrawElements)(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-EAPI void glMultiDrawElements_evgl_api_thread_cmd(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-
-extern void (*orig_evgl_api_glMultiDrawElementsEXT)(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-EAPI void glMultiDrawElementsEXT_evgl_api_thread_cmd(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
-
-extern void (*orig_evgl_api_glDeleteFencesNV)(GLsizei n, const GLuint* fences);
-EAPI void glDeleteFencesNV_evgl_api_thread_cmd(GLsizei n, const GLuint* fences);
-
-extern void (*orig_evgl_api_glGenFencesNV)(GLsizei n, GLuint* fences);
-EAPI void glGenFencesNV_evgl_api_thread_cmd(GLsizei n, GLuint* fences);
-
-extern GLboolean (*orig_evgl_api_glIsFenceNV)(GLuint fence);
-EAPI GLboolean glIsFenceNV_evgl_api_thread_cmd(GLuint fence);
-
-extern GLboolean (*orig_evgl_api_glTestFenceNV)(GLuint fence);
-EAPI GLboolean glTestFenceNV_evgl_api_thread_cmd(GLuint fence);
-
-extern void (*orig_evgl_api_glGetFenceivNV)(GLuint fence, GLenum pname, GLint* params);
-EAPI void glGetFenceivNV_evgl_api_thread_cmd(GLuint fence, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glFinishFenceNV)(GLuint fence);
-EAPI void glFinishFenceNV_evgl_api_thread_cmd(GLuint fence);
-
-extern void (*orig_evgl_api_glSetFenceNV)(GLuint a, GLenum b);
-EAPI void glSetFenceNV_evgl_api_thread_cmd(GLuint a, GLenum b);
-
-extern void (*orig_evgl_api_glGetDriverControlsQCOM)(GLint* num, GLsizei size, GLuint* driverControls);
-EAPI void glGetDriverControlsQCOM_evgl_api_thread_cmd(GLint* num, GLsizei size, GLuint* driverControls);
-
-extern void (*orig_evgl_api_glGetDriverControlStringQCOM)(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
-EAPI void glGetDriverControlStringQCOM_evgl_api_thread_cmd(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
-
-extern void (*orig_evgl_api_glEnableDriverControlQCOM)(GLuint driverControl);
-EAPI void glEnableDriverControlQCOM_evgl_api_thread_cmd(GLuint driverControl);
-
-extern void (*orig_evgl_api_glDisableDriverControlQCOM)(GLuint driverControl);
-EAPI void glDisableDriverControlQCOM_evgl_api_thread_cmd(GLuint driverControl);
-
-extern void (*orig_evgl_api_glExtGetTexturesQCOM)(GLuint* textures, GLint maxTextures, GLint* numTextures);
-EAPI void glExtGetTexturesQCOM_evgl_api_thread_cmd(GLuint* textures, GLint maxTextures, GLint* numTextures);
-
-extern void (*orig_evgl_api_glExtGetBuffersQCOM)(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
-EAPI void glExtGetBuffersQCOM_evgl_api_thread_cmd(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
-
-extern void (*orig_evgl_api_glExtGetRenderbuffersQCOM)(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
-EAPI void glExtGetRenderbuffersQCOM_evgl_api_thread_cmd(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
-
-extern void (*orig_evgl_api_glExtGetFramebuffersQCOM)(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
-EAPI void glExtGetFramebuffersQCOM_evgl_api_thread_cmd(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
-
-extern void (*orig_evgl_api_glExtGetTexLevelParameterivQCOM)(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
-EAPI void glExtGetTexLevelParameterivQCOM_evgl_api_thread_cmd(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glExtTexObjectStateOverrideiQCOM)(GLenum target, GLenum pname, GLint param);
-EAPI void glExtTexObjectStateOverrideiQCOM_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glExtGetTexSubImageQCOM)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
-EAPI void glExtGetTexSubImageQCOM_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
-
-extern void (*orig_evgl_api_glExtGetBufferPointervQCOM)(GLenum target, void** params);
-EAPI void glExtGetBufferPointervQCOM_evgl_api_thread_cmd(GLenum target, void** params);
-
-extern void (*orig_evgl_api_glExtGetShadersQCOM)(GLuint* shaders, GLint maxShaders, GLint* numShaders);
-EAPI void glExtGetShadersQCOM_evgl_api_thread_cmd(GLuint* shaders, GLint maxShaders, GLint* numShaders);
-
-extern void (*orig_evgl_api_glExtGetProgramsQCOM)(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
-EAPI void glExtGetProgramsQCOM_evgl_api_thread_cmd(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
-
-extern GLboolean (*orig_evgl_api_glExtIsProgramBinaryQCOM)(GLuint program);
-EAPI GLboolean glExtIsProgramBinaryQCOM_evgl_api_thread_cmd(GLuint program);
-
-extern void (*orig_evgl_api_glExtGetProgramBinarySourceQCOM)(GLuint program, GLenum shadertype, char* source, GLint* length);
-EAPI void glExtGetProgramBinarySourceQCOM_evgl_api_thread_cmd(GLuint program, GLenum shadertype, char* source, GLint* length);
-
-extern void (*orig_evgl_api_glAlphaFunc)(GLenum func, GLclampf ref);
-EAPI void glAlphaFunc_evgl_api_thread_cmd(GLenum func, GLclampf ref);
-
-extern void (*orig_evgl_api_glClipPlanef)(GLenum plane, const GLfloat *equation);
-EAPI void glClipPlanef_evgl_api_thread_cmd(GLenum plane, const GLfloat *equation);
-
-extern void (*orig_evgl_api_glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-EAPI void glColor4f_evgl_api_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-
-extern void (*orig_evgl_api_glFogf)(GLenum pname, GLfloat param);
-EAPI void glFogf_evgl_api_thread_cmd(GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glFogfv)(GLenum pname, const GLfloat *params);
-EAPI void glFogfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glFrustumf)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-EAPI void glFrustumf_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-extern void (*orig_evgl_api_glGetClipPlanef)(GLenum pname, GLfloat eqn[4]);
-EAPI void glGetClipPlanef_evgl_api_thread_cmd(GLenum pname, GLfloat eqn[4]);
-
-extern void (*orig_evgl_api_glGetLightfv)(GLenum light, GLenum pname, GLfloat *params);
-EAPI void glGetLightfv_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfloat *params);
-
-extern void (*orig_evgl_api_glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params);
-EAPI void glGetMaterialfv_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfloat *params);
-
-extern void (*orig_evgl_api_glGetTexEnvfv)(GLenum env, GLenum pname, GLfloat *params);
-EAPI void glGetTexEnvfv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfloat *params);
-
-extern void (*orig_evgl_api_glLightModelf)(GLenum pname, GLfloat param);
-EAPI void glLightModelf_evgl_api_thread_cmd(GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glLightModelfv)(GLenum pname, const GLfloat *params);
-EAPI void glLightModelfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glLightf)(GLenum light, GLenum pname, GLfloat param);
-EAPI void glLightf_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glLightfv)(GLenum light, GLenum pname, const GLfloat *params);
-EAPI void glLightfv_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glLoadMatrixf)(const GLfloat *m);
-EAPI void glLoadMatrixf_evgl_api_thread_cmd(const GLfloat *m);
-
-extern void (*orig_evgl_api_glMaterialf)(GLenum face, GLenum pname, GLfloat param);
-EAPI void glMaterialf_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params);
-EAPI void glMaterialfv_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glMultMatrixf)(const GLfloat *m);
-EAPI void glMultMatrixf_evgl_api_thread_cmd(const GLfloat *m);
-
-extern void (*orig_evgl_api_glMultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-EAPI void glMultiTexCoord4f_evgl_api_thread_cmd(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-
-extern void (*orig_evgl_api_glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz);
-EAPI void glNormal3f_evgl_api_thread_cmd(GLfloat nx, GLfloat ny, GLfloat nz);
-
-extern void (*orig_evgl_api_glOrthof)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-EAPI void glOrthof_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-extern void (*orig_evgl_api_glPointParameterf)(GLenum pname, GLfloat param);
-EAPI void glPointParameterf_evgl_api_thread_cmd(GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glPointParameterfv)(GLenum pname, const GLfloat *params);
-EAPI void glPointParameterfv_evgl_api_thread_cmd(GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glPointSize)(GLfloat size);
-EAPI void glPointSize_evgl_api_thread_cmd(GLfloat size);
-
-extern void (*orig_evgl_api_glPointSizePointerOES)(GLenum type, GLsizei stride, const GLvoid * pointer);
-EAPI void glPointSizePointerOES_evgl_api_thread_cmd(GLenum type, GLsizei stride, const GLvoid * pointer);
-
-extern void (*orig_evgl_api_glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-EAPI void glRotatef_evgl_api_thread_cmd(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-
-extern void (*orig_evgl_api_glScalef)(GLfloat x, GLfloat y, GLfloat z);
-EAPI void glScalef_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z);
-
-extern void (*orig_evgl_api_glTexEnvf)(GLenum target, GLenum pname, GLfloat param);
-EAPI void glTexEnvf_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params);
-EAPI void glTexEnvfv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glTranslatef)(GLfloat x, GLfloat y, GLfloat z);
-EAPI void glTranslatef_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z);
-
-extern void (*orig_evgl_api_glAlphaFuncx)(GLenum func, GLclampx ref);
-EAPI void glAlphaFuncx_evgl_api_thread_cmd(GLenum func, GLclampx ref);
-
-extern void (*orig_evgl_api_glClearColorx)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-EAPI void glClearColorx_evgl_api_thread_cmd(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-
-extern void (*orig_evgl_api_glClearDepthx)(GLclampx depth);
-EAPI void glClearDepthx_evgl_api_thread_cmd(GLclampx depth);
-
-extern void (*orig_evgl_api_glClientActiveTexture)(GLenum texture);
-EAPI void glClientActiveTexture_evgl_api_thread_cmd(GLenum texture);
-
-extern void (*orig_evgl_api_glClipPlanex)(GLenum plane, const GLfixed *equation);
-EAPI void glClipPlanex_evgl_api_thread_cmd(GLenum plane, const GLfixed *equation);
-
-extern void (*orig_evgl_api_glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-EAPI void glColor4ub_evgl_api_thread_cmd(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-
-extern void (*orig_evgl_api_glColor4x)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-EAPI void glColor4x_evgl_api_thread_cmd(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-
-extern void (*orig_evgl_api_glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glColorPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glDepthRangex)(GLclampx zNear, GLclampx zFar);
-EAPI void glDepthRangex_evgl_api_thread_cmd(GLclampx zNear, GLclampx zFar);
-
-extern void (*orig_evgl_api_glDisableClientState)(GLenum array);
-EAPI void glDisableClientState_evgl_api_thread_cmd(GLenum array);
-
-extern void (*orig_evgl_api_glEnableClientState)(GLenum array);
-EAPI void glEnableClientState_evgl_api_thread_cmd(GLenum array);
-
-extern void (*orig_evgl_api_glFogx)(GLenum pname, GLfixed param);
-EAPI void glFogx_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glFogxv)(GLenum pname, const GLfixed *params);
-EAPI void glFogxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glFrustumx)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-EAPI void glFrustumx_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-extern void (*orig_evgl_api_glGetClipPlanex)(GLenum pname, GLfixed eqn[4]);
-EAPI void glGetClipPlanex_evgl_api_thread_cmd(GLenum pname, GLfixed eqn[4]);
-
-extern void (*orig_evgl_api_glGetFixedv)(GLenum pname, GLfixed *params);
-EAPI void glGetFixedv_evgl_api_thread_cmd(GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetLightxv)(GLenum light, GLenum pname, GLfixed *params);
-EAPI void glGetLightxv_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params);
-EAPI void glGetMaterialxv_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetPointerv)(GLenum pname, GLvoid **params);
-EAPI void glGetPointerv_evgl_api_thread_cmd(GLenum pname, GLvoid **params);
-
-extern void (*orig_evgl_api_glGetTexEnviv)(GLenum env, GLenum pname, GLint *params);
-EAPI void glGetTexEnviv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetTexEnvxv)(GLenum env, GLenum pname, GLfixed *params);
-EAPI void glGetTexEnvxv_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetTexParameterxv)(GLenum target, GLenum pname, GLfixed *params);
-EAPI void glGetTexParameterxv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glLightModelx)(GLenum pname, GLfixed param);
-EAPI void glLightModelx_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glLightModelxv)(GLenum pname, const GLfixed *params);
-EAPI void glLightModelxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glLightx)(GLenum light, GLenum pname, GLfixed param);
-EAPI void glLightx_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glLightxv)(GLenum light, GLenum pname, const GLfixed *params);
-EAPI void glLightxv_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glLineWidthx)(GLfixed width);
-EAPI void glLineWidthx_evgl_api_thread_cmd(GLfixed width);
-
-extern void (*orig_evgl_api_glLoadIdentity)(void);
-EAPI void glLoadIdentity_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glLoadMatrixx)(const GLfixed *m);
-EAPI void glLoadMatrixx_evgl_api_thread_cmd(const GLfixed *m);
-
-extern void (*orig_evgl_api_glLogicOp)(GLenum opcode);
-EAPI void glLogicOp_evgl_api_thread_cmd(GLenum opcode);
-
-extern void (*orig_evgl_api_glMaterialx)(GLenum face, GLenum pname, GLfixed param);
-EAPI void glMaterialx_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glMaterialxv)(GLenum face, GLenum pname, const GLfixed *params);
-EAPI void glMaterialxv_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glMatrixMode)(GLenum mode);
-EAPI void glMatrixMode_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glMultMatrixx)(const GLfixed *m);
-EAPI void glMultMatrixx_evgl_api_thread_cmd(const GLfixed *m);
-
-extern void (*orig_evgl_api_glMultiTexCoord4x)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-EAPI void glMultiTexCoord4x_evgl_api_thread_cmd(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-
-extern void (*orig_evgl_api_glNormal3x)(GLfixed nx, GLfixed ny, GLfixed nz);
-EAPI void glNormal3x_evgl_api_thread_cmd(GLfixed nx, GLfixed ny, GLfixed nz);
-
-extern void (*orig_evgl_api_glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glNormalPointer_evgl_api_thread_cmd(GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glOrthox)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-EAPI void glOrthox_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-extern void (*orig_evgl_api_glPointParameterx)(GLenum pname, GLfixed param);
-EAPI void glPointParameterx_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glPointParameterxv)(GLenum pname, const GLfixed *params);
-EAPI void glPointParameterxv_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glPointSizex)(GLfixed size);
-EAPI void glPointSizex_evgl_api_thread_cmd(GLfixed size);
-
-extern void (*orig_evgl_api_glPolygonOffsetx)(GLfixed factor, GLfixed units);
-EAPI void glPolygonOffsetx_evgl_api_thread_cmd(GLfixed factor, GLfixed units);
-
-extern void (*orig_evgl_api_glPopMatrix)(void);
-EAPI void glPopMatrix_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glPushMatrix)(void);
-EAPI void glPushMatrix_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glRotatex)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-EAPI void glRotatex_evgl_api_thread_cmd(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-
-extern void (*orig_evgl_api_glSampleCoveragex)(GLclampx value, GLboolean invert);
-EAPI void glSampleCoveragex_evgl_api_thread_cmd(GLclampx value, GLboolean invert);
-
-extern void (*orig_evgl_api_glScalex)(GLfixed x, GLfixed y, GLfixed z);
-EAPI void glScalex_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z);
-
-extern void (*orig_evgl_api_glShadeModel)(GLenum mode);
-EAPI void glShadeModel_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glTexCoordPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glTexEnvi)(GLenum target, GLenum pname, GLint param);
-EAPI void glTexEnvi_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glTexEnvx)(GLenum target, GLenum pname, GLfixed param);
-EAPI void glTexEnvx_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glTexEnviv)(GLenum target, GLenum pname, const GLint *params);
-EAPI void glTexEnviv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint *params);
-
-extern void (*orig_evgl_api_glTexEnvxv)(GLenum target, GLenum pname, const GLfixed *params);
-EAPI void glTexEnvxv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glTexParameterx)(GLenum target, GLenum pname, GLfixed param);
-EAPI void glTexParameterx_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glTexParameterxv)(GLenum target, GLenum pname, const GLfixed *params);
-EAPI void glTexParameterxv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glTranslatex)(GLfixed x, GLfixed y, GLfixed z);
-EAPI void glTranslatex_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z);
-
-extern void (*orig_evgl_api_glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glVertexPointer_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glBlendEquationSeparateOES)(GLenum modeRGB, GLenum modeAlpha);
-EAPI void glBlendEquationSeparateOES_evgl_api_thread_cmd(GLenum modeRGB, GLenum modeAlpha);
-
-extern void (*orig_evgl_api_glBlendFuncSeparateOES)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-EAPI void glBlendFuncSeparateOES_evgl_api_thread_cmd(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-extern void (*orig_evgl_api_glBlendEquationOES)(GLenum mode);
-EAPI void glBlendEquationOES_evgl_api_thread_cmd(GLenum mode);
-
-extern void (*orig_evgl_api_glDrawTexsOES)(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
-EAPI void glDrawTexsOES_evgl_api_thread_cmd(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
-
-extern void (*orig_evgl_api_glDrawTexiOES)(GLint x, GLint y, GLint z, GLint width, GLint height);
-EAPI void glDrawTexiOES_evgl_api_thread_cmd(GLint x, GLint y, GLint z, GLint width, GLint height);
-
-extern void (*orig_evgl_api_glDrawTexxOES)(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
-EAPI void glDrawTexxOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
-
-extern void (*orig_evgl_api_glDrawTexsvOES)(const GLshort *coords);
-EAPI void glDrawTexsvOES_evgl_api_thread_cmd(const GLshort *coords);
-
-extern void (*orig_evgl_api_glDrawTexivOES)(const GLint *coords);
-EAPI void glDrawTexivOES_evgl_api_thread_cmd(const GLint *coords);
-
-extern void (*orig_evgl_api_glDrawTexxvOES)(const GLfixed *coords);
-EAPI void glDrawTexxvOES_evgl_api_thread_cmd(const GLfixed *coords);
-
-extern void (*orig_evgl_api_glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
-EAPI void glDrawTexfOES_evgl_api_thread_cmd(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
-
-extern void (*orig_evgl_api_glDrawTexfvOES)(const GLfloat *coords);
-EAPI void glDrawTexfvOES_evgl_api_thread_cmd(const GLfloat *coords);
-
-extern void (*orig_evgl_api_glAlphaFuncxOES)(GLenum func, GLclampx ref);
-EAPI void glAlphaFuncxOES_evgl_api_thread_cmd(GLenum func, GLclampx ref);
-
-extern void (*orig_evgl_api_glClearColorxOES)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-EAPI void glClearColorxOES_evgl_api_thread_cmd(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
-
-extern void (*orig_evgl_api_glClearDepthxOES)(GLclampx depth);
-EAPI void glClearDepthxOES_evgl_api_thread_cmd(GLclampx depth);
-
-extern void (*orig_evgl_api_glClipPlanexOES)(GLenum plane, const GLfixed *equation);
-EAPI void glClipPlanexOES_evgl_api_thread_cmd(GLenum plane, const GLfixed *equation);
-
-extern void (*orig_evgl_api_glColor4xOES)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-EAPI void glColor4xOES_evgl_api_thread_cmd(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
-
-extern void (*orig_evgl_api_glDepthRangexOES)(GLclampx zNear, GLclampx zFar);
-EAPI void glDepthRangexOES_evgl_api_thread_cmd(GLclampx zNear, GLclampx zFar);
-
-extern void (*orig_evgl_api_glFogxOES)(GLenum pname, GLfixed param);
-EAPI void glFogxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glFogxvOES)(GLenum pname, const GLfixed *params);
-EAPI void glFogxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glFrustumxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-EAPI void glFrustumxOES_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-extern void (*orig_evgl_api_glGetClipPlanexOES)(GLenum pname, GLfixed eqn[4]);
-EAPI void glGetClipPlanexOES_evgl_api_thread_cmd(GLenum pname, GLfixed eqn[4]);
-
-extern void (*orig_evgl_api_glGetFixedvOES)(GLenum pname, GLfixed *params);
-EAPI void glGetFixedvOES_evgl_api_thread_cmd(GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetLightxvOES)(GLenum light, GLenum pname, GLfixed *params);
-EAPI void glGetLightxvOES_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetMaterialxvOES)(GLenum face, GLenum pname, GLfixed *params);
-EAPI void glGetMaterialxvOES_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetTexEnvxvOES)(GLenum env, GLenum pname, GLfixed *params);
-EAPI void glGetTexEnvxvOES_evgl_api_thread_cmd(GLenum env, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glGetTexParameterxvOES)(GLenum target, GLenum pname, GLfixed *params);
-EAPI void glGetTexParameterxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glLightModelxOES)(GLenum pname, GLfixed param);
-EAPI void glLightModelxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glLightModelxvOES)(GLenum pname, const GLfixed *params);
-EAPI void glLightModelxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glLightxOES)(GLenum light, GLenum pname, GLfixed param);
-EAPI void glLightxOES_evgl_api_thread_cmd(GLenum light, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glLightxvOES)(GLenum light, GLenum pname, const GLfixed *params);
-EAPI void glLightxvOES_evgl_api_thread_cmd(GLenum light, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glLineWidthxOES)(GLfixed width);
-EAPI void glLineWidthxOES_evgl_api_thread_cmd(GLfixed width);
-
-extern void (*orig_evgl_api_glLoadMatrixxOES)(const GLfixed *m);
-EAPI void glLoadMatrixxOES_evgl_api_thread_cmd(const GLfixed *m);
-
-extern void (*orig_evgl_api_glMaterialxOES)(GLenum face, GLenum pname, GLfixed param);
-EAPI void glMaterialxOES_evgl_api_thread_cmd(GLenum face, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glMaterialxvOES)(GLenum face, GLenum pname, const GLfixed *params);
-EAPI void glMaterialxvOES_evgl_api_thread_cmd(GLenum face, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glMultMatrixxOES)(const GLfixed *m);
-EAPI void glMultMatrixxOES_evgl_api_thread_cmd(const GLfixed *m);
-
-extern void (*orig_evgl_api_glMultiTexCoord4xOES)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-EAPI void glMultiTexCoord4xOES_evgl_api_thread_cmd(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
-
-extern void (*orig_evgl_api_glNormal3xOES)(GLfixed nx, GLfixed ny, GLfixed nz);
-EAPI void glNormal3xOES_evgl_api_thread_cmd(GLfixed nx, GLfixed ny, GLfixed nz);
-
-extern void (*orig_evgl_api_glOrthoxOES)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-EAPI void glOrthoxOES_evgl_api_thread_cmd(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
-
-extern void (*orig_evgl_api_glPointParameterxOES)(GLenum pname, GLfixed param);
-EAPI void glPointParameterxOES_evgl_api_thread_cmd(GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glPointParameterxvOES)(GLenum pname, const GLfixed *params);
-EAPI void glPointParameterxvOES_evgl_api_thread_cmd(GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glPointSizexOES)(GLfixed size);
-EAPI void glPointSizexOES_evgl_api_thread_cmd(GLfixed size);
-
-extern void (*orig_evgl_api_glPolygonOffsetxOES)(GLfixed factor, GLfixed units);
-EAPI void glPolygonOffsetxOES_evgl_api_thread_cmd(GLfixed factor, GLfixed units);
-
-extern void (*orig_evgl_api_glRotatexOES)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-EAPI void glRotatexOES_evgl_api_thread_cmd(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
-
-extern void (*orig_evgl_api_glSampleCoveragexOES)(GLclampx value, GLboolean invert);
-EAPI void glSampleCoveragexOES_evgl_api_thread_cmd(GLclampx value, GLboolean invert);
-
-extern void (*orig_evgl_api_glScalexOES)(GLfixed x, GLfixed y, GLfixed z);
-EAPI void glScalexOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z);
-
-extern void (*orig_evgl_api_glTexEnvxOES)(GLenum target, GLenum pname, GLfixed param);
-EAPI void glTexEnvxOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glTexEnvxvOES)(GLenum target, GLenum pname, const GLfixed *params);
-EAPI void glTexEnvxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glTexParameterxOES)(GLenum target, GLenum pname, GLfixed param);
-EAPI void glTexParameterxOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glTexParameterxvOES)(GLenum target, GLenum pname, const GLfixed *params);
-EAPI void glTexParameterxvOES_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glTranslatexOES)(GLfixed x, GLfixed y, GLfixed z);
-EAPI void glTranslatexOES_evgl_api_thread_cmd(GLfixed x, GLfixed y, GLfixed z);
-
-extern GLboolean (*orig_evgl_api_glIsRenderbufferOES)(GLuint renderbuffer);
-EAPI GLboolean glIsRenderbufferOES_evgl_api_thread_cmd(GLuint renderbuffer);
-
-extern void (*orig_evgl_api_glBindRenderbufferOES)(GLenum target, GLuint renderbuffer);
-EAPI void glBindRenderbufferOES_evgl_api_thread_cmd(GLenum target, GLuint renderbuffer);
-
-extern void (*orig_evgl_api_glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers);
-EAPI void glDeleteRenderbuffersOES_evgl_api_thread_cmd(GLsizei n, const GLuint* renderbuffers);
-
-extern void (*orig_evgl_api_glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers);
-EAPI void glGenRenderbuffersOES_evgl_api_thread_cmd(GLsizei n, GLuint* renderbuffers);
-
-extern void (*orig_evgl_api_glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params);
-EAPI void glGetRenderbufferParameterivOES_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint* params);
-
-extern GLboolean (*orig_evgl_api_glIsFramebufferOES)(GLuint framebuffer);
-EAPI GLboolean glIsFramebufferOES_evgl_api_thread_cmd(GLuint framebuffer);
-
-extern void (*orig_evgl_api_glBindFramebufferOES)(GLenum target, GLuint framebuffer);
-EAPI void glBindFramebufferOES_evgl_api_thread_cmd(GLenum target, GLuint framebuffer);
-
-extern void (*orig_evgl_api_glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers);
-EAPI void glDeleteFramebuffersOES_evgl_api_thread_cmd(GLsizei n, const GLuint* framebuffers);
-
-extern void (*orig_evgl_api_glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers);
-EAPI void glGenFramebuffersOES_evgl_api_thread_cmd(GLsizei n, GLuint* framebuffers);
-
-extern GLenum (*orig_evgl_api_glCheckFramebufferStatusOES)(GLenum target);
-EAPI GLenum glCheckFramebufferStatusOES_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-EAPI void glFramebufferRenderbufferOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-extern void (*orig_evgl_api_glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-EAPI void glFramebufferTexture2DOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-extern void (*orig_evgl_api_glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-EAPI void glGetFramebufferAttachmentParameterivOES_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-
-extern void (*orig_evgl_api_glGenerateMipmapOES)(GLenum target);
-EAPI void glGenerateMipmapOES_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glCurrentPaletteMatrixOES)(GLuint matrixpaletteindex);
-EAPI void glCurrentPaletteMatrixOES_evgl_api_thread_cmd(GLuint matrixpaletteindex);
-
-extern void (*orig_evgl_api_glLoadPaletteFromModelViewMatrixOES)(void);
-EAPI void glLoadPaletteFromModelViewMatrixOES_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glMatrixIndexPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glMatrixIndexPointerOES_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glWeightPointerOES)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glWeightPointerOES_evgl_api_thread_cmd(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern GLbitfield (*orig_evgl_api_glQueryMatrixxOES)(GLfixed mantissa[16], GLint exponent[16]);
-EAPI GLbitfield glQueryMatrixxOES_evgl_api_thread_cmd(GLfixed mantissa[16], GLint exponent[16]);
-
-extern void (*orig_evgl_api_glDepthRangefOES)(GLclampf zNear, GLclampf zFar);
-EAPI void glDepthRangefOES_evgl_api_thread_cmd(GLclampf zNear, GLclampf zFar);
-
-extern void (*orig_evgl_api_glFrustumfOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-EAPI void glFrustumfOES_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-extern void (*orig_evgl_api_glOrthofOES)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-EAPI void glOrthofOES_evgl_api_thread_cmd(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
-
-extern void (*orig_evgl_api_glClipPlanefOES)(GLenum plane, const GLfloat *equation);
-EAPI void glClipPlanefOES_evgl_api_thread_cmd(GLenum plane, const GLfloat *equation);
-
-extern void (*orig_evgl_api_glGetClipPlanefOES)(GLenum pname, GLfloat eqn[4]);
-EAPI void glGetClipPlanefOES_evgl_api_thread_cmd(GLenum pname, GLfloat eqn[4]);
-
-extern void (*orig_evgl_api_glClearDepthfOES)(GLclampf depth);
-EAPI void glClearDepthfOES_evgl_api_thread_cmd(GLclampf depth);
-
-extern void (*orig_evgl_api_glTexGenfOES)(GLenum coord, GLenum pname, GLfloat param);
-EAPI void glTexGenfOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glTexGenfvOES)(GLenum coord, GLenum pname, const GLfloat *params);
-EAPI void glTexGenfvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLfloat *params);
-
-extern void (*orig_evgl_api_glTexGeniOES)(GLenum coord, GLenum pname, GLint param);
-EAPI void glTexGeniOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glTexGenivOES)(GLenum coord, GLenum pname, const GLint *params);
-EAPI void glTexGenivOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLint *params);
-
-extern void (*orig_evgl_api_glTexGenxOES)(GLenum coord, GLenum pname, GLfixed param);
-EAPI void glTexGenxOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfixed param);
-
-extern void (*orig_evgl_api_glTexGenxvOES)(GLenum coord, GLenum pname, const GLfixed *params);
-EAPI void glTexGenxvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, const GLfixed *params);
-
-extern void (*orig_evgl_api_glGetTexGenfvOES)(GLenum coord, GLenum pname, GLfloat *params);
-EAPI void glGetTexGenfvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfloat *params);
-
-extern void (*orig_evgl_api_glGetTexGenivOES)(GLenum coord, GLenum pname, GLint *params);
-EAPI void glGetTexGenivOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetTexGenxvOES)(GLenum coord, GLenum pname, GLfixed *params);
-EAPI void glGetTexGenxvOES_evgl_api_thread_cmd(GLenum coord, GLenum pname, GLfixed *params);
-
-extern void (*orig_evgl_api_glBindVertexArrayOES)(GLuint array);
-EAPI void glBindVertexArrayOES_evgl_api_thread_cmd(GLuint array);
-
-extern void (*orig_evgl_api_glDeleteVertexArraysOES)(GLsizei n, const GLuint *arrays);
-EAPI void glDeleteVertexArraysOES_evgl_api_thread_cmd(GLsizei n, const GLuint *arrays);
-
-extern void (*orig_evgl_api_glGenVertexArraysOES)(GLsizei n, GLuint *arrays);
-EAPI void glGenVertexArraysOES_evgl_api_thread_cmd(GLsizei n, GLuint *arrays);
-
-extern GLboolean (*orig_evgl_api_glIsVertexArrayOES)(GLuint array);
-EAPI GLboolean glIsVertexArrayOES_evgl_api_thread_cmd(GLuint array);
-
-extern void (*orig_evgl_api_glCopyTextureLevelsAPPLE)(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
-EAPI void glCopyTextureLevelsAPPLE_evgl_api_thread_cmd(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
-
-extern void (*orig_evgl_api_glRenderbufferStorageMultisampleAPPLE)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-EAPI void glRenderbufferStorageMultisampleAPPLE_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-extern void (*orig_evgl_api_glResolveMultisampleFramebufferAPPLE)(void);
-EAPI void glResolveMultisampleFramebufferAPPLE_evgl_api_thread_cmd(void);
-
-extern GLsync (*orig_evgl_api_glFenceSyncAPPLE)(GLenum condition, GLbitfield flags);
-EAPI GLsync glFenceSyncAPPLE_evgl_api_thread_cmd(GLenum condition, GLbitfield flags);
-
-extern GLboolean (*orig_evgl_api_glIsSyncAPPLE)(GLsync sync);
-EAPI GLboolean glIsSyncAPPLE_evgl_api_thread_cmd(GLsync sync);
-
-extern void (*orig_evgl_api_glDeleteSyncAPPLE)(GLsync sync);
-EAPI void glDeleteSyncAPPLE_evgl_api_thread_cmd(GLsync sync);
-
-extern GLenum (*orig_evgl_api_glClientWaitSyncAPPLE)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-EAPI GLenum glClientWaitSyncAPPLE_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-extern void (*orig_evgl_api_glWaitSyncAPPLE)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-EAPI void glWaitSyncAPPLE_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-extern void (*orig_evgl_api_glGetInteger64vAPPLE)(GLenum pname, EvasGLint64 *params);
-EAPI void glGetInteger64vAPPLE_evgl_api_thread_cmd(GLenum pname, EvasGLint64 *params);
-
-extern void (*orig_evgl_api_glGetSyncivAPPLE)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-EAPI void glGetSyncivAPPLE_evgl_api_thread_cmd(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
-extern void * (*orig_evgl_api_glMapBufferRangeEXT)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-EAPI void * glMapBufferRangeEXT_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-
-extern void (*orig_evgl_api_glFlushMappedBufferRangeEXT)(GLenum target, GLintptr offset, GLsizeiptr length);
-EAPI void glFlushMappedBufferRangeEXT_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length);
-
-extern void (*orig_evgl_api_glRenderbufferStorageMultisampleEXT)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-EAPI void glRenderbufferStorageMultisampleEXT_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-extern void (*orig_evgl_api_glFramebufferTexture2DMultisample)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-EAPI void glFramebufferTexture2DMultisample_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-extern void (*orig_evgl_api_glFramebufferTexture2DMultisampleEXT)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-EAPI void glFramebufferTexture2DMultisampleEXT_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-extern GLenum (*orig_evgl_api_glGetGraphicsResetStatus)(void);
-EAPI GLenum glGetGraphicsResetStatus_evgl_api_thread_cmd(void);
-
-extern GLenum (*orig_evgl_api_glGetGraphicsResetStatusEXT)(void);
-EAPI GLenum glGetGraphicsResetStatusEXT_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glReadnPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-EAPI void glReadnPixels_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-
-extern void (*orig_evgl_api_glReadnPixelsEXT)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-EAPI void glReadnPixelsEXT_evgl_api_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-
-extern void (*orig_evgl_api_glGetnUniformfv)(GLuint program, GLint location, GLsizei bufSize, float *params);
-EAPI void glGetnUniformfv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, float *params);
-
-extern void (*orig_evgl_api_glGetnUniformfvEXT)(GLuint program, GLint location, GLsizei bufSize, float *params);
-EAPI void glGetnUniformfvEXT_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, float *params);
-
-extern void (*orig_evgl_api_glGetnUniformiv)(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-EAPI void glGetnUniformiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-
-extern void (*orig_evgl_api_glGetnUniformivEXT)(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-EAPI void glGetnUniformivEXT_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLint *params);
-
-extern void (*orig_evgl_api_glTexStorage1DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-EAPI void glTexStorage1DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-
-extern void (*orig_evgl_api_glTexStorage2DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glTexStorage2DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glTexStorage3DEXT)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-EAPI void glTexStorage3DEXT_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-extern void (*orig_evgl_api_glTextureStorage1DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-EAPI void glTextureStorage1DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-
-extern void (*orig_evgl_api_glTextureStorage2DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glTextureStorage2DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glTextureStorage3DEXT)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-EAPI void glTextureStorage3DEXT_evgl_api_thread_cmd(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-extern void (*orig_evgl_api_glClipPlanefIMG)(GLenum a, const GLfloat * b);
-EAPI void glClipPlanefIMG_evgl_api_thread_cmd(GLenum a, const GLfloat * b);
-
-extern void (*orig_evgl_api_glClipPlanexIMG)(GLenum a, const GLfixed * b);
-EAPI void glClipPlanexIMG_evgl_api_thread_cmd(GLenum a, const GLfixed * b);
-
-extern void (*orig_evgl_api_glRenderbufferStorageMultisampleIMG)(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-EAPI void glRenderbufferStorageMultisampleIMG_evgl_api_thread_cmd(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
-
-extern void (*orig_evgl_api_glFramebufferTexture2DMultisampleIMG)(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-EAPI void glFramebufferTexture2DMultisampleIMG_evgl_api_thread_cmd(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
-
-extern void (*orig_evgl_api_glStartTilingQCOM)(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
-EAPI void glStartTilingQCOM_evgl_api_thread_cmd(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
-
-extern void (*orig_evgl_api_glEndTilingQCOM)(GLbitfield preserveMask);
-EAPI void glEndTilingQCOM_evgl_api_thread_cmd(GLbitfield preserveMask);
-
-extern void (*orig_evgl_api_glBeginQuery)(GLenum target, GLuint id);
-EAPI void glBeginQuery_evgl_api_thread_cmd(GLenum target, GLuint id);
-
-extern void (*orig_evgl_api_glBeginTransformFeedback)(GLenum primitiveMode);
-EAPI void glBeginTransformFeedback_evgl_api_thread_cmd(GLenum primitiveMode);
-
-extern void (*orig_evgl_api_glBindBufferBase)(GLenum target, GLuint index, GLuint buffer);
-EAPI void glBindBufferBase_evgl_api_thread_cmd(GLenum target, GLuint index, GLuint buffer);
-
-extern void (*orig_evgl_api_glBindBufferRange)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-EAPI void glBindBufferRange_evgl_api_thread_cmd(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-
-extern void (*orig_evgl_api_glBindSampler)(GLuint unit, GLuint sampler);
-EAPI void glBindSampler_evgl_api_thread_cmd(GLuint unit, GLuint sampler);
-
-extern void (*orig_evgl_api_glBindTransformFeedback)(GLenum target, GLuint id);
-EAPI void glBindTransformFeedback_evgl_api_thread_cmd(GLenum target, GLuint id);
-
-extern void (*orig_evgl_api_glBindVertexArray)(GLuint array);
-EAPI void glBindVertexArray_evgl_api_thread_cmd(GLuint array);
-
-extern void (*orig_evgl_api_glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-EAPI void glBlitFramebuffer_evgl_api_thread_cmd(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-
-extern void (*orig_evgl_api_glClearBufferfi)(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
-EAPI void glClearBufferfi_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
-
-extern void (*orig_evgl_api_glClearBufferfv)(GLenum buffer, GLint drawBuffer, const GLfloat * value);
-EAPI void glClearBufferfv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLfloat * value);
-
-extern void (*orig_evgl_api_glClearBufferiv)(GLenum buffer, GLint drawBuffer, const GLint * value);
-EAPI void glClearBufferiv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLint * value);
-
-extern void (*orig_evgl_api_glClearBufferuiv)(GLenum buffer, GLint drawBuffer, const GLuint * value);
-EAPI void glClearBufferuiv_evgl_api_thread_cmd(GLenum buffer, GLint drawBuffer, const GLuint * value);
-
-extern GLenum (*orig_evgl_api_glClientWaitSync)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-EAPI GLenum glClientWaitSync_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-extern void (*orig_evgl_api_glCompressedTexImage3D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
-EAPI void glCompressedTexImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
-
-extern void (*orig_evgl_api_glCompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
-EAPI void glCompressedTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
-
-extern void (*orig_evgl_api_glCopyBufferSubData)(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
-EAPI void glCopyBufferSubData_evgl_api_thread_cmd(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
-
-extern void (*orig_evgl_api_glCopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glCopyTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glDeleteQueries)(GLsizei n, const GLuint * ids);
-EAPI void glDeleteQueries_evgl_api_thread_cmd(GLsizei n, const GLuint * ids);
-
-extern void (*orig_evgl_api_glDeleteSamplers)(GLsizei n, const GLuint * samplers);
-EAPI void glDeleteSamplers_evgl_api_thread_cmd(GLsizei n, const GLuint * samplers);
-
-extern void (*orig_evgl_api_glDeleteSync)(GLsync sync);
-EAPI void glDeleteSync_evgl_api_thread_cmd(GLsync sync);
-
-extern void (*orig_evgl_api_glDeleteTransformFeedbacks)(GLsizei n, const GLuint *ids);
-EAPI void glDeleteTransformFeedbacks_evgl_api_thread_cmd(GLsizei n, const GLuint *ids);
-
-extern void (*orig_evgl_api_glDeleteVertexArrays)(GLsizei n, const GLuint *arrays);
-EAPI void glDeleteVertexArrays_evgl_api_thread_cmd(GLsizei n, const GLuint *arrays);
-
-extern void (*orig_evgl_api_glDrawArraysInstanced)(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
-EAPI void glDrawArraysInstanced_evgl_api_thread_cmd(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
-
-extern void (*orig_evgl_api_glDrawBuffers)(GLsizei n, const GLenum *bufs);
-EAPI void glDrawBuffers_evgl_api_thread_cmd(GLsizei n, const GLenum *bufs);
-
-extern void (*orig_evgl_api_glDrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
-EAPI void glDrawElementsInstanced_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
-
-extern void (*orig_evgl_api_glDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
-EAPI void glDrawRangeElements_evgl_api_thread_cmd(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
-
-extern void (*orig_evgl_api_glEndQuery)(GLenum target);
-EAPI void glEndQuery_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glEndTransformFeedback)(void);
-EAPI void glEndTransformFeedback_evgl_api_thread_cmd(void);
-
-extern GLsync (*orig_evgl_api_glFenceSync)(GLenum condition, GLbitfield flags);
-EAPI GLsync glFenceSync_evgl_api_thread_cmd(GLenum condition, GLbitfield flags);
-
-extern GLsync (*orig_evgl_api_glFlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length);
-EAPI GLsync glFlushMappedBufferRange_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length);
-
-extern void (*orig_evgl_api_glFramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-EAPI void glFramebufferTextureLayer_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-
-extern void (*orig_evgl_api_glGenQueries)(GLsizei n, GLuint * ids);
-EAPI void glGenQueries_evgl_api_thread_cmd(GLsizei n, GLuint * ids);
-
-extern void (*orig_evgl_api_glGenSamplers)(GLsizei n, GLuint *samplers);
-EAPI void glGenSamplers_evgl_api_thread_cmd(GLsizei n, GLuint *samplers);
-
-extern void (*orig_evgl_api_glGenTransformFeedbacks)(GLsizei n, GLuint *ids);
-EAPI void glGenTransformFeedbacks_evgl_api_thread_cmd(GLsizei n, GLuint *ids);
-
-extern void (*orig_evgl_api_glGenVertexArrays)(GLsizei n, GLuint *arrays);
-EAPI void glGenVertexArrays_evgl_api_thread_cmd(GLsizei n, GLuint *arrays);
-
-extern void (*orig_evgl_api_glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
-EAPI void glGetActiveUniformBlockiv_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
-EAPI void glGetActiveUniformBlockName_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
-
-extern void (*orig_evgl_api_glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
-EAPI void glGetActiveUniformsiv_evgl_api_thread_cmd(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetBufferParameteri64v)(GLenum target, GLenum value, EvasGLint64 * data);
-EAPI void glGetBufferParameteri64v_evgl_api_thread_cmd(GLenum target, GLenum value, EvasGLint64 * data);
-
-extern void (*orig_evgl_api_glGetBufferPointerv)(GLenum target, GLenum pname, GLvoid ** params);
-EAPI void glGetBufferPointerv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLvoid ** params);
-
-extern GLint (*orig_evgl_api_glGetFragDataLocation)(GLuint program, const char * name);
-EAPI GLint glGetFragDataLocation_evgl_api_thread_cmd(GLuint program, const char * name);
-
-extern void (*orig_evgl_api_glGetInteger64i_v)(GLenum target, GLuint index, EvasGLint64 * data);
-EAPI void glGetInteger64i_v_evgl_api_thread_cmd(GLenum target, GLuint index, EvasGLint64 * data);
-
-extern void (*orig_evgl_api_glGetInteger64v)(GLenum pname, EvasGLint64 * data);
-EAPI void glGetInteger64v_evgl_api_thread_cmd(GLenum pname, EvasGLint64 * data);
-
-extern void (*orig_evgl_api_glGetIntegeri_v)(GLenum target, GLuint index, GLint * data);
-EAPI void glGetIntegeri_v_evgl_api_thread_cmd(GLenum target, GLuint index, GLint * data);
-
-extern void (*orig_evgl_api_glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
-EAPI void glGetInternalformativ_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
-
-extern void (*orig_evgl_api_glGetProgramBinary)(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
-EAPI void glGetProgramBinary_evgl_api_thread_cmd(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-extern void (*orig_evgl_api_glGetQueryiv)(GLenum target, GLenum pname, GLint * params);
-EAPI void glGetQueryiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint * params);
-
-extern void (*orig_evgl_api_glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint * params);
-EAPI void glGetQueryObjectuiv_evgl_api_thread_cmd(GLuint id, GLenum pname, GLuint * params);
-
-extern void (*orig_evgl_api_glGetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat * params);
-EAPI void glGetSamplerParameterfv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLfloat * params);
-
-extern void (*orig_evgl_api_glGetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint * params);
-EAPI void glGetSamplerParameteriv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint * params);
-
-extern const GLubyte * (*orig_evgl_api_glGetStringi)(GLenum name, GLuint index);
-EAPI const GLubyte * glGetStringi_evgl_api_thread_cmd(GLenum name, GLuint index);
-
-extern void (*orig_evgl_api_glGetSynciv)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-EAPI void glGetSynciv_evgl_api_thread_cmd(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-
-extern void (*orig_evgl_api_glGetTransformFeedbackVarying)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
-EAPI void glGetTransformFeedbackVarying_evgl_api_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
-
-extern GLuint (*orig_evgl_api_glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName);
-EAPI GLuint glGetUniformBlockIndex_evgl_api_thread_cmd(GLuint program, const GLchar *uniformBlockName);
-
-extern void (*orig_evgl_api_glGetUniformIndices)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
-EAPI void glGetUniformIndices_evgl_api_thread_cmd(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
-
-extern void (*orig_evgl_api_glGetUniformuiv)(GLuint program, GLint location, GLuint* params);
-EAPI void glGetUniformuiv_evgl_api_thread_cmd(GLuint program, GLint location, GLuint* params);
-
-extern void (*orig_evgl_api_glGetVertexAttribIiv)(GLuint index, GLenum pname, GLint *params);
-EAPI void glGetVertexAttribIiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetVertexAttribIuiv)(GLuint index, GLenum pname, GLuint *params);
-EAPI void glGetVertexAttribIuiv_evgl_api_thread_cmd(GLuint index, GLenum pname, GLuint *params);
-
-extern void (*orig_evgl_api_glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
-EAPI void glInvalidateFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum *attachments);
-
-extern void (*orig_evgl_api_glInvalidateSubFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glInvalidateSubFramebuffer_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-
-extern GLboolean (*orig_evgl_api_glIsQuery)(GLuint id);
-EAPI GLboolean glIsQuery_evgl_api_thread_cmd(GLuint id);
-
-extern GLboolean (*orig_evgl_api_glIsSampler)(GLuint id);
-EAPI GLboolean glIsSampler_evgl_api_thread_cmd(GLuint id);
-
-extern GLboolean (*orig_evgl_api_glIsSync)(GLsync sync);
-EAPI GLboolean glIsSync_evgl_api_thread_cmd(GLsync sync);
-
-extern GLboolean (*orig_evgl_api_glIsTransformFeedback)(GLuint id);
-EAPI GLboolean glIsTransformFeedback_evgl_api_thread_cmd(GLuint id);
-
-extern GLboolean (*orig_evgl_api_glIsVertexArray)(GLuint array);
-EAPI GLboolean glIsVertexArray_evgl_api_thread_cmd(GLuint array);
-
-extern void * (*orig_evgl_api_glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-EAPI void * glMapBufferRange_evgl_api_thread_cmd(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-
-extern void (*orig_evgl_api_glPauseTransformFeedback)(void);
-EAPI void glPauseTransformFeedback_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
-EAPI void glProgramBinary_evgl_api_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
-
-extern void (*orig_evgl_api_glProgramParameteri)(GLuint program, GLenum pname, GLint value);
-EAPI void glProgramParameteri_evgl_api_thread_cmd(GLuint program, GLenum pname, GLint value);
-
-extern void (*orig_evgl_api_glReadBuffer)(GLenum src);
-EAPI void glReadBuffer_evgl_api_thread_cmd(GLenum src);
-
-extern void (*orig_evgl_api_glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glRenderbufferStorageMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glResumeTransformFeedback)(void);
-EAPI void glResumeTransformFeedback_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glSamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param);
-EAPI void glSamplerParameterf_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLfloat param);
-
-extern void (*orig_evgl_api_glSamplerParameterfv)(GLuint sampler, GLenum pname, const GLfloat * params);
-EAPI void glSamplerParameterfv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLfloat * params);
-
-extern void (*orig_evgl_api_glSamplerParameteri)(GLuint sampler, GLenum pname, GLint param);
-EAPI void glSamplerParameteri_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glSamplerParameteriv)(GLuint sampler, GLenum pname, const GLint * params);
-EAPI void glSamplerParameteriv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLint * params);
-
-extern void (*orig_evgl_api_glTexImage3D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
-EAPI void glTexImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
-
-extern void (*orig_evgl_api_glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glTexStorage2D_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern void (*orig_evgl_api_glTexStorage3D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-EAPI void glTexStorage3D_evgl_api_thread_cmd(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-
-extern void (*orig_evgl_api_glTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
-EAPI void glTexSubImage3D_evgl_api_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
-
-extern void (*orig_evgl_api_glTransformFeedbackVaryings)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
-EAPI void glTransformFeedbackVaryings_evgl_api_thread_cmd(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
-
-extern void (*orig_evgl_api_glUniform1ui)(GLint location, GLuint v0);
-EAPI void glUniform1ui_evgl_api_thread_cmd(GLint location, GLuint v0);
-
-extern void (*orig_evgl_api_glUniform1uiv)(GLint location, GLsizei count, const GLuint *value);
-EAPI void glUniform1uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glUniform2ui)(GLint location, GLuint v0, GLuint v1);
-EAPI void glUniform2ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1);
-
-extern void (*orig_evgl_api_glUniform2uiv)(GLint location, GLsizei count, const GLuint *value);
-EAPI void glUniform2uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glUniform3ui)(GLint location, GLuint v0, GLuint v1, GLuint v2);
-EAPI void glUniform3ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1, GLuint v2);
-
-extern void (*orig_evgl_api_glUniform3uiv)(GLint location, GLsizei count, const GLuint *value);
-EAPI void glUniform3uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glUniform4ui)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-EAPI void glUniform4ui_evgl_api_thread_cmd(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-extern void (*orig_evgl_api_glUniform4uiv)(GLint location, GLsizei count, const GLuint *value);
-EAPI void glUniform4uiv_evgl_api_thread_cmd(GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-EAPI void glUniformBlockBinding_evgl_api_thread_cmd(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-
-extern void (*orig_evgl_api_glUniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix2x3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glUniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix3x2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glUniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix2x4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glUniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix4x2fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glUniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix3x4fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glUniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix4x3fv_evgl_api_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern GLboolean (*orig_evgl_api_glUnmapBuffer)(GLenum target);
-EAPI GLboolean glUnmapBuffer_evgl_api_thread_cmd(GLenum target);
-
-extern void (*orig_evgl_api_glVertexAttribDivisor)(GLuint index, GLuint divisor);
-EAPI void glVertexAttribDivisor_evgl_api_thread_cmd(GLuint index, GLuint divisor);
-
-extern void (*orig_evgl_api_glVertexAttribI4i)(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
-EAPI void glVertexAttribI4i_evgl_api_thread_cmd(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
-
-extern void (*orig_evgl_api_glVertexAttribI4iv)(GLuint index, const GLint *v);
-EAPI void glVertexAttribI4iv_evgl_api_thread_cmd(GLuint index, const GLint *v);
-
-extern void (*orig_evgl_api_glVertexAttribI4ui)(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-EAPI void glVertexAttribI4ui_evgl_api_thread_cmd(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-extern void (*orig_evgl_api_glVertexAttribI4uiv)(GLuint index, const GLuint *v);
-EAPI void glVertexAttribI4uiv_evgl_api_thread_cmd(GLuint index, const GLuint *v);
-
-extern void (*orig_evgl_api_glVertexAttribIPointer)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-EAPI void glVertexAttribIPointer_evgl_api_thread_cmd(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-extern void (*orig_evgl_api_glWaitSync)(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-EAPI void glWaitSync_evgl_api_thread_cmd(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
-
-extern void (*orig_evgl_api_glDispatchCompute)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
-EAPI void glDispatchCompute_evgl_api_thread_cmd(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
-
-extern void (*orig_evgl_api_glDispatchComputeIndirect)(GLintptr indirect);
-EAPI void glDispatchComputeIndirect_evgl_api_thread_cmd(GLintptr indirect);
-
-extern void (*orig_evgl_api_glDrawArraysIndirect)(GLenum mode, const void *indirect);
-EAPI void glDrawArraysIndirect_evgl_api_thread_cmd(GLenum mode, const void *indirect);
-
-extern void (*orig_evgl_api_glDrawElementsIndirect)(GLenum mode, GLenum type, const void *indirect);
-EAPI void glDrawElementsIndirect_evgl_api_thread_cmd(GLenum mode, GLenum type, const void *indirect);
-
-extern void (*orig_evgl_api_glFramebufferParameteri)(GLenum target, GLenum pname, GLint param);
-EAPI void glFramebufferParameteri_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint param);
-
-extern void (*orig_evgl_api_glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params);
-EAPI void glGetFramebufferParameteriv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetProgramInterfaceiv)(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
-EAPI void glGetProgramInterfaceiv_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
-
-extern GLuint (*orig_evgl_api_glGetProgramResourceIndex)(GLuint program, GLenum programInterface, const GLchar *name);
-EAPI GLuint glGetProgramResourceIndex_evgl_api_thread_cmd(GLuint program, GLenum programInterface, const GLchar *name);
-
-extern void (*orig_evgl_api_glGetProgramResourceName)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
-EAPI void glGetProgramResourceName_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
-
-extern void (*orig_evgl_api_glGetProgramResourceiv)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
-EAPI void glGetProgramResourceiv_evgl_api_thread_cmd(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
-
-extern GLint (*orig_evgl_api_glGetProgramResourceLocation)(GLuint program, GLenum programInterface, const GLchar *name);
-EAPI GLint glGetProgramResourceLocation_evgl_api_thread_cmd(GLuint program, GLenum programInterface, const GLchar *name);
-
-extern void (*orig_evgl_api_glUseProgramStages)(GLuint pipeline, GLbitfield stages, GLuint program);
-EAPI void glUseProgramStages_evgl_api_thread_cmd(GLuint pipeline, GLbitfield stages, GLuint program);
-
-extern void (*orig_evgl_api_glActiveShaderProgram)(GLuint pipeline, GLuint program);
-EAPI void glActiveShaderProgram_evgl_api_thread_cmd(GLuint pipeline, GLuint program);
-
-extern GLuint (*orig_evgl_api_glCreateShaderProgramv)(GLenum type, GLsizei count, const GLchar *const*strings);
-EAPI GLuint glCreateShaderProgramv_evgl_api_thread_cmd(GLenum type, GLsizei count, const GLchar *const*strings);
-
-extern void (*orig_evgl_api_glBindProgramPipeline)(GLuint pipeline);
-EAPI void glBindProgramPipeline_evgl_api_thread_cmd(GLuint pipeline);
-
-extern void (*orig_evgl_api_glDeleteProgramPipelines)(GLsizei n, const GLuint *pipelines);
-EAPI void glDeleteProgramPipelines_evgl_api_thread_cmd(GLsizei n, const GLuint *pipelines);
-
-extern void (*orig_evgl_api_glGenProgramPipelines)(GLsizei n, GLuint *pipelines);
-EAPI void glGenProgramPipelines_evgl_api_thread_cmd(GLsizei n, GLuint *pipelines);
-
-extern GLboolean (*orig_evgl_api_glIsProgramPipeline)(GLuint pipeline);
-EAPI GLboolean glIsProgramPipeline_evgl_api_thread_cmd(GLuint pipeline);
-
-extern void (*orig_evgl_api_glGetProgramPipelineiv)(GLuint pipeline, GLenum pname, GLint *params);
-EAPI void glGetProgramPipelineiv_evgl_api_thread_cmd(GLuint pipeline, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glProgramUniform1i)(GLuint program, GLint location, GLint v0);
-EAPI void glProgramUniform1i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0);
-
-extern void (*orig_evgl_api_glProgramUniform2i)(GLuint program, GLint location, GLint v0, GLint v1);
-EAPI void glProgramUniform2i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1);
-
-extern void (*orig_evgl_api_glProgramUniform3i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
-EAPI void glProgramUniform3i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
-
-extern void (*orig_evgl_api_glProgramUniform4i)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-EAPI void glProgramUniform4i_evgl_api_thread_cmd(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-
-extern void (*orig_evgl_api_glProgramUniform1ui)(GLuint program, GLint location, GLuint v0);
-EAPI void glProgramUniform1ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0);
-
-extern void (*orig_evgl_api_glProgramUniform2ui)(GLuint program, GLint location, GLuint v0, GLuint v1);
-EAPI void glProgramUniform2ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1);
-
-extern void (*orig_evgl_api_glProgramUniform3ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
-EAPI void glProgramUniform3ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
-
-extern void (*orig_evgl_api_glProgramUniform4ui)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-EAPI void glProgramUniform4ui_evgl_api_thread_cmd(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-
-extern void (*orig_evgl_api_glProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-EAPI void glProgramUniform1f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0);
-
-extern void (*orig_evgl_api_glProgramUniform2f)(GLuint program, GLint location, GLfloat v0, GLfloat v1);
-EAPI void glProgramUniform2f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1);
-
-extern void (*orig_evgl_api_glProgramUniform3f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-EAPI void glProgramUniform3f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-
-extern void (*orig_evgl_api_glProgramUniform4f)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-EAPI void glProgramUniform4f_evgl_api_thread_cmd(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-
-extern void (*orig_evgl_api_glProgramUniform1iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-EAPI void glProgramUniform1iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-extern void (*orig_evgl_api_glProgramUniform2iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-EAPI void glProgramUniform2iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-extern void (*orig_evgl_api_glProgramUniform3iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-EAPI void glProgramUniform3iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-extern void (*orig_evgl_api_glProgramUniform4iv)(GLuint program, GLint location, GLsizei count, const GLint *value);
-EAPI void glProgramUniform4iv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLint *value);
-
-extern void (*orig_evgl_api_glProgramUniform1uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-EAPI void glProgramUniform1uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glProgramUniform2uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-EAPI void glProgramUniform2uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glProgramUniform3uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-EAPI void glProgramUniform3uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glProgramUniform4uiv)(GLuint program, GLint location, GLsizei count, const GLuint *value);
-EAPI void glProgramUniform4uiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLuint *value);
-
-extern void (*orig_evgl_api_glProgramUniform1fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-EAPI void glProgramUniform1fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniform2fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-EAPI void glProgramUniform2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniform3fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-EAPI void glProgramUniform3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniform4fv)(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-EAPI void glProgramUniform4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix2x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix2x3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix3x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix3x2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix2x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix2x4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix4x2fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix4x2fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix3x4fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix3x4fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glProgramUniformMatrix4x3fv)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glProgramUniformMatrix4x3fv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-
-extern void (*orig_evgl_api_glValidateProgramPipeline)(GLuint pipeline);
-EAPI void glValidateProgramPipeline_evgl_api_thread_cmd(GLuint pipeline);
-
-extern void (*orig_evgl_api_glGetProgramPipelineInfoLog)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-EAPI void glGetProgramPipelineInfoLog_evgl_api_thread_cmd(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-
-extern void (*orig_evgl_api_glBindImageTexture)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
-EAPI void glBindImageTexture_evgl_api_thread_cmd(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
-
-extern void (*orig_evgl_api_glGetBooleani_v)(GLenum target, GLuint index, GLboolean *data);
-EAPI void glGetBooleani_v_evgl_api_thread_cmd(GLenum target, GLuint index, GLboolean *data);
-
-extern void (*orig_evgl_api_glMemoryBarrier)(GLbitfield barriers);
-EAPI void glMemoryBarrier_evgl_api_thread_cmd(GLbitfield barriers);
-
-extern void (*orig_evgl_api_glMemoryBarrierByRegion)(GLbitfield barriers);
-EAPI void glMemoryBarrierByRegion_evgl_api_thread_cmd(GLbitfield barriers);
-
-extern void (*orig_evgl_api_glTexStorage2DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
-EAPI void glTexStorage2DMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
-
-extern void (*orig_evgl_api_glGetMultisamplefv)(GLenum pname, GLuint index, GLfloat *val);
-EAPI void glGetMultisamplefv_evgl_api_thread_cmd(GLenum pname, GLuint index, GLfloat *val);
-
-extern void (*orig_evgl_api_glSampleMaski)(GLuint maskNumber, GLbitfield mask);
-EAPI void glSampleMaski_evgl_api_thread_cmd(GLuint maskNumber, GLbitfield mask);
-
-extern void (*orig_evgl_api_glGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
-EAPI void glGetTexLevelParameteriv_evgl_api_thread_cmd(GLenum target, GLint level, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params);
-EAPI void glGetTexLevelParameterfv_evgl_api_thread_cmd(GLenum target, GLint level, GLenum pname, GLfloat *params);
-
-extern void (*orig_evgl_api_glBindVertexBuffer)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
-EAPI void glBindVertexBuffer_evgl_api_thread_cmd(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
-
-extern void (*orig_evgl_api_glVertexAttribFormat)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
-EAPI void glVertexAttribFormat_evgl_api_thread_cmd(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
-
-extern void (*orig_evgl_api_glVertexAttribIFormat)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
-EAPI void glVertexAttribIFormat_evgl_api_thread_cmd(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
-
-extern void (*orig_evgl_api_glVertexAttribBinding)(GLuint attribindex, GLuint bindingindex);
-EAPI void glVertexAttribBinding_evgl_api_thread_cmd(GLuint attribindex, GLuint bindingindex);
-
-extern void (*orig_evgl_api_glVertexBindingDivisor)(GLuint bindingindex, GLuint divisor);
-EAPI void glVertexBindingDivisor_evgl_api_thread_cmd(GLuint bindingindex, GLuint divisor);
-
-extern void (*orig_evgl_api_glBlendBarrier)(void);
-EAPI void glBlendBarrier_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glCopyImageSubData)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
-EAPI void glCopyImageSubData_evgl_api_thread_cmd(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
-
-extern void (*orig_evgl_api_glDebugMessageControl)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-EAPI void glDebugMessageControl_evgl_api_thread_cmd(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-
-extern void (*orig_evgl_api_glDebugMessageInsert)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-EAPI void glDebugMessageInsert_evgl_api_thread_cmd(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-
-extern void (*orig_evgl_api_glDebugMessageCallback)(GLDEBUGPROC callback, const void *userParam);
-EAPI void glDebugMessageCallback_evgl_api_thread_cmd(GLDEBUGPROC callback, const void *userParam);
-
-extern GLuint (*orig_evgl_api_glGetDebugMessageLog)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-EAPI GLuint glGetDebugMessageLog_evgl_api_thread_cmd(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-
-extern void (*orig_evgl_api_glPushDebugGroup)(GLenum source, GLuint id, GLsizei length, const GLchar *message);
-EAPI void glPushDebugGroup_evgl_api_thread_cmd(GLenum source, GLuint id, GLsizei length, const GLchar *message);
-
-extern void (*orig_evgl_api_glPopDebugGroup)(void);
-EAPI void glPopDebugGroup_evgl_api_thread_cmd(void);
-
-extern void (*orig_evgl_api_glObjectLabel)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
-EAPI void glObjectLabel_evgl_api_thread_cmd(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
-
-extern void (*orig_evgl_api_glGetObjectLabel)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-EAPI void glGetObjectLabel_evgl_api_thread_cmd(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-
-extern void (*orig_evgl_api_glObjectPtrLabel)(const void *ptr, GLsizei length, const GLchar *label);
-EAPI void glObjectPtrLabel_evgl_api_thread_cmd(const void *ptr, GLsizei length, const GLchar *label);
-
-extern void (*orig_evgl_api_glGetObjectPtrLabel)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
-EAPI void glGetObjectPtrLabel_evgl_api_thread_cmd(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
-
-extern void (*orig_evgl_api_glEnablei)(GLenum target, GLuint index);
-EAPI void glEnablei_evgl_api_thread_cmd(GLenum target, GLuint index);
-
-extern void (*orig_evgl_api_glDisablei)(GLenum target, GLuint index);
-EAPI void glDisablei_evgl_api_thread_cmd(GLenum target, GLuint index);
-
-extern void (*orig_evgl_api_glBlendEquationi)(GLuint buf, GLenum mode);
-EAPI void glBlendEquationi_evgl_api_thread_cmd(GLuint buf, GLenum mode);
-
-extern void (*orig_evgl_api_glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
-EAPI void glBlendEquationSeparatei_evgl_api_thread_cmd(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
-
-extern void (*orig_evgl_api_glBlendFunci)(GLuint buf, GLenum src, GLenum dst);
-EAPI void glBlendFunci_evgl_api_thread_cmd(GLuint buf, GLenum src, GLenum dst);
-
-extern void (*orig_evgl_api_glBlendFuncSeparatei)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-EAPI void glBlendFuncSeparatei_evgl_api_thread_cmd(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-
-extern void (*orig_evgl_api_glColorMaski)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-EAPI void glColorMaski_evgl_api_thread_cmd(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-
-extern GLboolean (*orig_evgl_api_glIsEnabledi)(GLenum target, GLuint index);
-EAPI GLboolean glIsEnabledi_evgl_api_thread_cmd(GLenum target, GLuint index);
-
-extern void (*orig_evgl_api_glDrawElementsBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-EAPI void glDrawElementsBaseVertex_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
-extern void (*orig_evgl_api_glDrawRangeElementsBaseVertex)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-EAPI void glDrawRangeElementsBaseVertex_evgl_api_thread_cmd(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-
-extern void (*orig_evgl_api_glDrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
-EAPI void glDrawElementsInstancedBaseVertex_evgl_api_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
-
-extern void (*orig_evgl_api_glFramebufferTexture)(GLenum target, GLenum attachment, GLuint texture, GLint level);
-EAPI void glFramebufferTexture_evgl_api_thread_cmd(GLenum target, GLenum attachment, GLuint texture, GLint level);
-
-extern void (*orig_evgl_api_glPrimitiveBoundingBox)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
-EAPI void glPrimitiveBoundingBox_evgl_api_thread_cmd(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
-
-extern void (*orig_evgl_api_glGetnUniformuiv)(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
-EAPI void glGetnUniformuiv_evgl_api_thread_cmd(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
-
-extern void (*orig_evgl_api_glMinSampleShading)(GLfloat value);
-EAPI void glMinSampleShading_evgl_api_thread_cmd(GLfloat value);
-
-extern void (*orig_evgl_api_glPatchParameteri)(GLenum pname, GLint value);
-EAPI void glPatchParameteri_evgl_api_thread_cmd(GLenum pname, GLint value);
-
-extern void (*orig_evgl_api_glTexParameterIiv)(GLenum target, GLenum pname, const GLint *params);
-EAPI void glTexParameterIiv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLint *params);
-
-extern void (*orig_evgl_api_glTexParameterIuiv)(GLenum target, GLenum pname, const GLuint *params);
-EAPI void glTexParameterIuiv_evgl_api_thread_cmd(GLenum target, GLenum pname, const GLuint *params);
-
-extern void (*orig_evgl_api_glGetTexParameterIiv)(GLenum target, GLenum pname, GLint *params);
-EAPI void glGetTexParameterIiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetTexParameterIuiv)(GLenum target, GLenum pname, GLuint *params);
-EAPI void glGetTexParameterIuiv_evgl_api_thread_cmd(GLenum target, GLenum pname, GLuint *params);
-
-extern void (*orig_evgl_api_glSamplerParameterIiv)(GLuint sampler, GLenum pname, const GLint *param);
-EAPI void glSamplerParameterIiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLint *param);
-
-extern void (*orig_evgl_api_glSamplerParameterIuiv)(GLuint sampler, GLenum pname, const GLuint *param);
-EAPI void glSamplerParameterIuiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, const GLuint *param);
-
-extern void (*orig_evgl_api_glGetSamplerParameterIiv)(GLuint sampler, GLenum pname, GLint *params);
-EAPI void glGetSamplerParameterIiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLint *params);
-
-extern void (*orig_evgl_api_glGetSamplerParameterIuiv)(GLuint sampler, GLenum pname, GLuint *params);
-EAPI void glGetSamplerParameterIuiv_evgl_api_thread_cmd(GLuint sampler, GLenum pname, GLuint *params);
-
-extern void (*orig_evgl_api_glTexBuffer)(GLenum target, GLenum internalformat, GLuint buffer);
-EAPI void glTexBuffer_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLuint buffer);
-
-extern void (*orig_evgl_api_glTexBufferRange)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
-EAPI void glTexBufferRange_evgl_api_thread_cmd(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
-
-extern void (*orig_evgl_api_glTexStorage3DMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
-EAPI void glTexStorage3DMultisample_evgl_api_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
-
-extern void (*orig_evgl_api_glEGLImageTargetTexture2DOES)(GLenum target, void *image);
-EAPI void glEGLImageTargetTexture2DOES_evgl_api_thread_cmd(GLenum target, void *image);
-
-extern void (*orig_evgl_api_glEGLImageTargetRenderbufferStorageOES)(GLenum target, void *image);
-EAPI void glEGLImageTargetRenderbufferStorageOES_evgl_api_thread_cmd(GLenum target, void *image);
-
-extern void (*orig_evgl_api__evgl_glDiscardFramebufferEXT)(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-EAPI void _evgl_glDiscardFramebufferEXT_evgl_api_thread_cmd(GLenum target, GLsizei numAttachments, const GLenum* attachments);
-
-extern void (*orig_evgl_api__evgl_glEvasGLImageTargetTexture2D)(GLenum target, EvasGLImage image);
-EAPI void _evgl_glEvasGLImageTargetTexture2D_evgl_api_thread_cmd(GLenum target, EvasGLImage image);
-
-extern void (*orig_evgl_api__evgl_glEvasGLImageTargetRenderbufferStorage)(GLenum target, EvasGLImage image);
-EAPI void _evgl_glEvasGLImageTargetRenderbufferStorage_evgl_api_thread_cmd(GLenum target, EvasGLImage image);
-
-extern EvasGLImage (*orig_evgl_api__evgl_evasglCreateImage)(int target, void* buffer, const int *attrib_list);
-EAPI EvasGLImage _evgl_evasglCreateImage_evgl_api_thread_cmd(int target, void* buffer, const int *attrib_list);
-
-extern void (*orig_evgl_api__evgl_evasglDestroyImage)(EvasGLImage image);
-EAPI void _evgl_evasglDestroyImage_evgl_api_thread_cmd(EvasGLImage image);
-
-extern EvasGLImage (*orig_evgl_api__evgl_evasglCreateImageForContext)(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
-EAPI EvasGLImage _evgl_evasglCreateImageForContext_evgl_api_thread_cmd(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
-
-extern EvasGLSync (*orig_evgl_api__evgl_evasglCreateSync)(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
-EAPI EvasGLSync _evgl_evasglCreateSync_evgl_api_thread_cmd(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglDestroySync)(Evas_GL *evas_gl, EvasGLSync sync);
-EAPI Eina_Bool _evgl_evasglDestroySync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync);
-
-extern int (*orig_evgl_api__evgl_evasglClientWaitSync)(Evas_GL *evas_gl, EvasGLSync sync);
-EAPI int _evgl_evasglClientWaitSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglGetSyncAttrib)(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
-EAPI Eina_Bool _evgl_evasglGetSyncAttrib_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglSignalSync)(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
-EAPI Eina_Bool _evgl_evasglSignalSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
-
-extern int (*orig_evgl_api__evgl_evasglWaitSync)(Evas_GL *evas_gl, EvasGLSync sync, int flags);
-EAPI int _evgl_evasglWaitSync_evgl_api_thread_cmd(Evas_GL *evas_gl, EvasGLSync sync, int flags);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglBindWaylandDisplay)(Evas_GL *evas_gl, void *wl_display);
-EAPI Eina_Bool _evgl_evasglBindWaylandDisplay_evgl_api_thread_cmd(Evas_GL *evas_gl, void *wl_display);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglUnbindWaylandDisplay)(Evas_GL *evas_gl, void *wl_display);
-EAPI Eina_Bool _evgl_evasglUnbindWaylandDisplay_evgl_api_thread_cmd(Evas_GL *evas_gl, void *wl_display);
-
-extern Eina_Bool (*orig_evgl_api__evgl_evasglQueryWaylandBuffer)(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
-EAPI Eina_Bool _evgl_evasglQueryWaylandBuffer_evgl_api_thread_cmd(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.c b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.c
deleted file mode 100644 (file)
index cd57d48..0000000
+++ /dev/null
@@ -1,6955 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-
-/*
- * GLenum
- * glGetError(void);
- */
-
-typedef struct
-{
-   GLenum return_value;
-
-} EVGL_Thread_Command_glGetError;
-
-static void
-_evgl_thread_glGetError(void *data)
-{
-   EVGL_Thread_Command_glGetError *thread_data =
-      (EVGL_Thread_Command_glGetError *)data;
-
-   thread_data->return_value = glGetError();
-
-}
-
-EAPI GLenum
-glGetError_evgl_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glGetError();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetError thread_data_local;
-   EVGL_Thread_Command_glGetError *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetError,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLint size;
-   GLenum type;
-   GLboolean normalized;
-   GLsizei stride;
-   const void *pointer;
-
-} EVGL_Thread_Command_glVertexAttribPointer;
-
-static void
-_evgl_thread_glVertexAttribPointer(void *data)
-{
-   EVGL_Thread_Command_glVertexAttribPointer *thread_data =
-      (EVGL_Thread_Command_glVertexAttribPointer *)data;
-
-   glVertexAttribPointer(thread_data->index,
-                         thread_data->size,
-                         thread_data->type,
-                         thread_data->normalized,
-                         thread_data->stride,
-                         thread_data->pointer);
-
-}
-
-EAPI void
-glVertexAttribPointer_evgl_thread_cmd(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glVertexAttribPointer(index, size, type, normalized, stride, pointer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glVertexAttribPointer thread_data_local;
-   EVGL_Thread_Command_glVertexAttribPointer *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->normalized = normalized;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glVertexAttribPointer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnableVertexAttribArray(GLuint index);
- */
-
-typedef struct
-{
-   GLuint index;
-
-} EVGL_Thread_Command_glEnableVertexAttribArray;
-
-static void
-_evgl_thread_glEnableVertexAttribArray(void *data)
-{
-   EVGL_Thread_Command_glEnableVertexAttribArray *thread_data =
-      (EVGL_Thread_Command_glEnableVertexAttribArray *)data;
-
-   glEnableVertexAttribArray(thread_data->index);
-
-}
-
-EAPI void
-glEnableVertexAttribArray_evgl_thread_cmd(GLuint index)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glEnableVertexAttribArray(index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glEnableVertexAttribArray thread_data_local;
-   EVGL_Thread_Command_glEnableVertexAttribArray *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glEnableVertexAttribArray,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisableVertexAttribArray(GLuint index);
- */
-
-typedef struct
-{
-   GLuint index;
-
-} EVGL_Thread_Command_glDisableVertexAttribArray;
-
-static void
-_evgl_thread_glDisableVertexAttribArray(void *data)
-{
-   EVGL_Thread_Command_glDisableVertexAttribArray *thread_data =
-      (EVGL_Thread_Command_glDisableVertexAttribArray *)data;
-
-   glDisableVertexAttribArray(thread_data->index);
-
-}
-
-EAPI void
-glDisableVertexAttribArray_evgl_thread_cmd(GLuint index)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDisableVertexAttribArray(index);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDisableVertexAttribArray thread_data_local;
-   EVGL_Thread_Command_glDisableVertexAttribArray *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDisableVertexAttribArray,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawArrays(GLenum mode, GLint first, GLsizei count);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLint first;
-   GLsizei count;
-
-} EVGL_Thread_Command_glDrawArrays;
-
-static void
-_evgl_thread_glDrawArrays(void *data)
-{
-   EVGL_Thread_Command_glDrawArrays *thread_data =
-      (EVGL_Thread_Command_glDrawArrays *)data;
-
-   glDrawArrays(thread_data->mode,
-                thread_data->first,
-                thread_data->count);
-
-}
-
-EAPI void
-glDrawArrays_evgl_thread_cmd(GLenum mode, GLint first, GLsizei count)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDrawArrays(mode, first, count);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDrawArrays thread_data_local;
-   EVGL_Thread_Command_glDrawArrays *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDrawArrays,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
- */
-
-typedef struct
-{
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void *indices;
-
-} EVGL_Thread_Command_glDrawElements;
-
-static void
-_evgl_thread_glDrawElements(void *data)
-{
-   EVGL_Thread_Command_glDrawElements *thread_data =
-      (EVGL_Thread_Command_glDrawElements *)data;
-
-   glDrawElements(thread_data->mode,
-                  thread_data->count,
-                  thread_data->type,
-                  thread_data->indices);
-
-}
-
-EAPI void
-glDrawElements_evgl_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDrawElements(mode, count, type, indices);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDrawElements thread_data_local;
-   EVGL_Thread_Command_glDrawElements *thread_data = &thread_data_local;
-
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDrawElements,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenBuffers(GLsizei n, GLuint *buffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *buffers;
-
-} EVGL_Thread_Command_glGenBuffers;
-
-static void
-_evgl_thread_glGenBuffers(void *data)
-{
-   EVGL_Thread_Command_glGenBuffers *thread_data =
-      (EVGL_Thread_Command_glGenBuffers *)data;
-
-   glGenBuffers(thread_data->n,
-                thread_data->buffers);
-
-}
-
-EAPI void
-glGenBuffers_evgl_thread_cmd(GLsizei n, GLuint *buffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGenBuffers(n, buffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGenBuffers thread_data_local;
-   EVGL_Thread_Command_glGenBuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->buffers = buffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGenBuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteBuffers(GLsizei n, const GLuint *buffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *buffers;
-   void *buffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteBuffers;
-
-static void
-_evgl_thread_glDeleteBuffers(void *data)
-{
-   EVGL_Thread_Command_glDeleteBuffers *thread_data =
-      (EVGL_Thread_Command_glDeleteBuffers *)data;
-
-   glDeleteBuffers(thread_data->n,
-                   thread_data->buffers);
-
-
-   if (thread_data->buffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->buffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteBuffers_evgl_thread_cmd(GLsizei n, const GLuint *buffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteBuffers(n, buffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteBuffers thread_data_local;
-   EVGL_Thread_Command_glDeleteBuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteBuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteBuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->buffers = buffers;
-
-   thread_data->buffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (buffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->buffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->buffers_copied)
-          {
-             memcpy(thread_data->buffers_copied, buffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->buffers = (const GLuint  *)thread_data->buffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteBuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindBuffer(GLenum target, GLuint buffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint buffer;
-
-} EVGL_Thread_Command_glBindBuffer;
-
-static void
-_evgl_thread_glBindBuffer(void *data)
-{
-   EVGL_Thread_Command_glBindBuffer *thread_data =
-      (EVGL_Thread_Command_glBindBuffer *)data;
-
-   glBindBuffer(thread_data->target,
-                thread_data->buffer);
-
-}
-
-EAPI void
-glBindBuffer_evgl_thread_cmd(GLenum target, GLuint buffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBindBuffer(target, buffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBindBuffer thread_data_local;
-   EVGL_Thread_Command_glBindBuffer *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBindBuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLsizeiptr size;
-   const void *data;
-   GLenum usage;
-
-} EVGL_Thread_Command_glBufferData;
-
-static void
-_evgl_thread_glBufferData(void *data)
-{
-   EVGL_Thread_Command_glBufferData *thread_data =
-      (EVGL_Thread_Command_glBufferData *)data;
-
-   glBufferData(thread_data->target,
-                thread_data->size,
-                thread_data->data,
-                thread_data->usage);
-
-}
-
-EAPI void
-glBufferData_evgl_thread_cmd(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBufferData(target, size, data, usage);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBufferData thread_data_local;
-   EVGL_Thread_Command_glBufferData *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->size = size;
-   thread_data->data = data;
-   thread_data->usage = usage;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBufferData,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glCreateShader(GLenum type);
- */
-
-typedef struct
-{
-   GLuint return_value;
-   GLenum type;
-
-} EVGL_Thread_Command_glCreateShader;
-
-static void
-_evgl_thread_glCreateShader(void *data)
-{
-   EVGL_Thread_Command_glCreateShader *thread_data =
-      (EVGL_Thread_Command_glCreateShader *)data;
-
-   thread_data->return_value = glCreateShader(thread_data->type);
-
-}
-
-EAPI GLuint
-glCreateShader_evgl_thread_cmd(GLenum type)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glCreateShader(type);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCreateShader thread_data_local;
-   EVGL_Thread_Command_glCreateShader *thread_data = &thread_data_local;
-
-   thread_data->type = type;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCreateShader,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei count;
-   const GLchar **string;
-   const GLint *length;
-   int command_allocated;
-   GLSHADERSOURCE_COPY_VARIABLE; /* TODO */
-
-} EVGL_Thread_Command_glShaderSource;
-
-static void
-_evgl_thread_glShaderSource(void *data)
-{
-   EVGL_Thread_Command_glShaderSource *thread_data =
-      (EVGL_Thread_Command_glShaderSource *)data;
-
-   glShaderSource(thread_data->shader,
-                  thread_data->count,
-                  thread_data->string,
-                  thread_data->length);
-
-   GLSHADERSOURCE_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glShaderSource_evgl_thread_cmd(GLuint shader, GLsizei count, const GLchar **string, const GLint *length)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glShaderSource(shader, count, string, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glShaderSource thread_data_local;
-   EVGL_Thread_Command_glShaderSource *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glShaderSource *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glShaderSource));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-   thread_data->count = count;
-   thread_data->string = string;
-   thread_data->length = length;
-
-   GLSHADERSOURCE_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLSHADERSOURCE_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glShaderSource,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompileShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_Thread_Command_glCompileShader;
-
-static void
-_evgl_thread_glCompileShader(void *data)
-{
-   EVGL_Thread_Command_glCompileShader *thread_data =
-      (EVGL_Thread_Command_glCompileShader *)data;
-
-   glCompileShader(thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompileShader_evgl_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glCompileShader(shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCompileShader thread_data_local;
-   EVGL_Thread_Command_glCompileShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glCompileShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glCompileShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCompileShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteShader;
-
-static void
-_evgl_thread_glDeleteShader(void *data)
-{
-   EVGL_Thread_Command_glDeleteShader *thread_data =
-      (EVGL_Thread_Command_glDeleteShader *)data;
-
-   glDeleteShader(thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteShader_evgl_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteShader(shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteShader thread_data_local;
-   EVGL_Thread_Command_glDeleteShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLuint
- * glCreateProgram(void);
- */
-
-typedef struct
-{
-   GLuint return_value;
-
-} EVGL_Thread_Command_glCreateProgram;
-
-static void
-_evgl_thread_glCreateProgram(void *data)
-{
-   EVGL_Thread_Command_glCreateProgram *thread_data =
-      (EVGL_Thread_Command_glCreateProgram *)data;
-
-   thread_data->return_value = glCreateProgram();
-
-}
-
-EAPI GLuint
-glCreateProgram_evgl_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glCreateProgram();
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCreateProgram thread_data_local;
-   EVGL_Thread_Command_glCreateProgram *thread_data = &thread_data_local;
-
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCreateProgram,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glAttachShader(GLuint program, GLuint shader);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_Thread_Command_glAttachShader;
-
-static void
-_evgl_thread_glAttachShader(void *data)
-{
-   EVGL_Thread_Command_glAttachShader *thread_data =
-      (EVGL_Thread_Command_glAttachShader *)data;
-
-   glAttachShader(thread_data->program,
-                  thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glAttachShader_evgl_thread_cmd(GLuint program, GLuint shader)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glAttachShader(program, shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glAttachShader thread_data_local;
-   EVGL_Thread_Command_glAttachShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glAttachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glAttachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glAttachShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDetachShader(GLuint program, GLuint shader);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
-
-} EVGL_Thread_Command_glDetachShader;
-
-static void
-_evgl_thread_glDetachShader(void *data)
-{
-   EVGL_Thread_Command_glDetachShader *thread_data =
-      (EVGL_Thread_Command_glDetachShader *)data;
-
-   glDetachShader(thread_data->program,
-                  thread_data->shader);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDetachShader_evgl_thread_cmd(GLuint program, GLuint shader)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDetachShader(program, shader);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDetachShader thread_data_local;
-   EVGL_Thread_Command_glDetachShader *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDetachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDetachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDetachShader,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLinkProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-   int command_allocated;
-
-} EVGL_Thread_Command_glLinkProgram;
-
-static void
-_evgl_thread_glLinkProgram(void *data)
-{
-   EVGL_Thread_Command_glLinkProgram *thread_data =
-      (EVGL_Thread_Command_glLinkProgram *)data;
-
-   glLinkProgram(thread_data->program);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glLinkProgram_evgl_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glLinkProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glLinkProgram thread_data_local;
-   EVGL_Thread_Command_glLinkProgram *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glLinkProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glLinkProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glLinkProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUseProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUseProgram;
-
-static void
-_evgl_thread_glUseProgram(void *data)
-{
-   EVGL_Thread_Command_glUseProgram *thread_data =
-      (EVGL_Thread_Command_glUseProgram *)data;
-
-   glUseProgram(thread_data->program);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUseProgram_evgl_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUseProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUseProgram thread_data_local;
-   EVGL_Thread_Command_glUseProgram *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUseProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUseProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUseProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLuint program;
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteProgram;
-
-static void
-_evgl_thread_glDeleteProgram(void *data)
-{
-   EVGL_Thread_Command_glDeleteProgram *thread_data =
-      (EVGL_Thread_Command_glDeleteProgram *)data;
-
-   glDeleteProgram(thread_data->program);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteProgram_evgl_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteProgram(program);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteProgram thread_data_local;
-   EVGL_Thread_Command_glDeleteProgram *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteProgram,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLenum *binaryFormat;
-   void *binary;
-
-} EVGL_Thread_Command_glGetProgramBinary;
-
-void (*orig_evgl_glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-void
-glGetProgramBinary_orig_evgl_set(void *func)
-{
-   orig_evgl_glGetProgramBinary = func;
-}
-
-void *
-glGetProgramBinary_orig_evgl_get(void)
-{
-   return orig_evgl_glGetProgramBinary;
-}
-
-static void
-_evgl_thread_glGetProgramBinary(void *data)
-{
-   EVGL_Thread_Command_glGetProgramBinary *thread_data =
-      (EVGL_Thread_Command_glGetProgramBinary *)data;
-
-   orig_evgl_glGetProgramBinary(thread_data->program,
-                                thread_data->bufSize,
-                                thread_data->length,
-                                thread_data->binaryFormat,
-                                thread_data->binary);
-
-}
-
-EAPI void
-glGetProgramBinary_evgl_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glGetProgramBinary(program, bufSize, length, binaryFormat, binary);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetProgramBinary thread_data_local;
-   EVGL_Thread_Command_glGetProgramBinary *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetProgramBinary,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum binaryFormat;
-   const void *binary;
-   GLint length;
-   void *binary_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glProgramBinary;
-
-void (*orig_evgl_glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-
-void
-glProgramBinary_orig_evgl_set(void *func)
-{
-   orig_evgl_glProgramBinary = func;
-}
-
-void *
-glProgramBinary_orig_evgl_get(void)
-{
-   return orig_evgl_glProgramBinary;
-}
-
-static void
-_evgl_thread_glProgramBinary(void *data)
-{
-   EVGL_Thread_Command_glProgramBinary *thread_data =
-      (EVGL_Thread_Command_glProgramBinary *)data;
-
-   orig_evgl_glProgramBinary(thread_data->program,
-                             thread_data->binaryFormat,
-                             thread_data->binary,
-                             thread_data->length);
-
-
-   if (thread_data->binary_copied)
-     eina_mempool_free(_mp_default, thread_data->binary_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glProgramBinary_evgl_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glProgramBinary(program, binaryFormat, binary, length);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glProgramBinary thread_data_local;
-   EVGL_Thread_Command_glProgramBinary *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glProgramBinary *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glProgramBinary));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-   thread_data->length = length;
-
-   thread_data->binary_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (binary)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = length;
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->binary_copied)
-          {
-             memcpy(thread_data->binary_copied, binary, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->binary = (const void  *)thread_data->binary_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glProgramBinary,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLint *size;
-   GLenum *type;
-   GLchar *name;
-
-} EVGL_Thread_Command_glGetActiveAttrib;
-
-static void
-_evgl_thread_glGetActiveAttrib(void *data)
-{
-   EVGL_Thread_Command_glGetActiveAttrib *thread_data =
-      (EVGL_Thread_Command_glGetActiveAttrib *)data;
-
-   glGetActiveAttrib(thread_data->program,
-                     thread_data->index,
-                     thread_data->bufSize,
-                     thread_data->length,
-                     thread_data->size,
-                     thread_data->type,
-                     thread_data->name);
-
-}
-
-EAPI void
-glGetActiveAttrib_evgl_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetActiveAttrib(program, index, bufSize, length, size, type, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetActiveAttrib thread_data_local;
-   EVGL_Thread_Command_glGetActiveAttrib *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetActiveAttrib,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLint
- * glGetAttribLocation(GLuint program, const GLchar *name);
- */
-
-typedef struct
-{
-   GLint return_value;
-   GLuint program;
-   const GLchar *name;
-
-} EVGL_Thread_Command_glGetAttribLocation;
-
-static void
-_evgl_thread_glGetAttribLocation(void *data)
-{
-   EVGL_Thread_Command_glGetAttribLocation *thread_data =
-      (EVGL_Thread_Command_glGetAttribLocation *)data;
-
-   thread_data->return_value = glGetAttribLocation(thread_data->program,
-                                                   thread_data->name);
-
-}
-
-EAPI GLint
-glGetAttribLocation_evgl_thread_cmd(GLuint program, const GLchar *name)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glGetAttribLocation(program, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetAttribLocation thread_data_local;
-   EVGL_Thread_Command_glGetAttribLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetAttribLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLuint index;
-   const GLchar *name;
-
-} EVGL_Thread_Command_glBindAttribLocation;
-
-static void
-_evgl_thread_glBindAttribLocation(void *data)
-{
-   EVGL_Thread_Command_glBindAttribLocation *thread_data =
-      (EVGL_Thread_Command_glBindAttribLocation *)data;
-
-   glBindAttribLocation(thread_data->program,
-                        thread_data->index,
-                        thread_data->name);
-
-}
-
-EAPI void
-glBindAttribLocation_evgl_thread_cmd(GLuint program, GLuint index, const GLchar *name)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBindAttribLocation(program, index, name);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBindAttribLocation thread_data_local;
-   EVGL_Thread_Command_glBindAttribLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBindAttribLocation,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLint
- * glGetUniformLocation(GLuint program, const GLchar *name);
- */
-
-typedef struct
-{
-   GLint return_value;
-   GLuint program;
-   const GLchar *name;
-
-} EVGL_Thread_Command_glGetUniformLocation;
-
-static void
-_evgl_thread_glGetUniformLocation(void *data)
-{
-   EVGL_Thread_Command_glGetUniformLocation *thread_data =
-      (EVGL_Thread_Command_glGetUniformLocation *)data;
-
-   thread_data->return_value = glGetUniformLocation(thread_data->program,
-                                                    thread_data->name);
-
-}
-
-EAPI GLint
-glGetUniformLocation_evgl_thread_cmd(GLuint program, const GLchar *name)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glGetUniformLocation(program, name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetUniformLocation thread_data_local;
-   EVGL_Thread_Command_glGetUniformLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetUniformLocation,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glUniform1f(GLint location, GLfloat v0);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat v0;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform1f;
-
-static void
-_evgl_thread_glUniform1f(void *data)
-{
-   EVGL_Thread_Command_glUniform1f *thread_data =
-      (EVGL_Thread_Command_glUniform1f *)data;
-
-   glUniform1f(thread_data->location,
-               thread_data->v0);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1f_evgl_thread_cmd(GLint location, GLfloat v0)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform1f(location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform1f thread_data_local;
-   EVGL_Thread_Command_glUniform1f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform1f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform1f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform1f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1i(GLint location, GLint v0);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint v0;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform1i;
-
-static void
-_evgl_thread_glUniform1i(void *data)
-{
-   EVGL_Thread_Command_glUniform1i *thread_data =
-      (EVGL_Thread_Command_glUniform1i *)data;
-
-   glUniform1i(thread_data->location,
-               thread_data->v0);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1i_evgl_thread_cmd(GLint location, GLint v0)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform1i(location, v0);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform1i thread_data_local;
-   EVGL_Thread_Command_glUniform1i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform1i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform1i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform1i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2f(GLint location, GLfloat v0, GLfloat v1);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform2f;
-
-static void
-_evgl_thread_glUniform2f(void *data)
-{
-   EVGL_Thread_Command_glUniform2f *thread_data =
-      (EVGL_Thread_Command_glUniform2f *)data;
-
-   glUniform2f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform2f(location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform2f thread_data_local;
-   EVGL_Thread_Command_glUniform2f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform2f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform2f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform2f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2i(GLint location, GLint v0, GLint v1);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint v0;
-   GLint v1;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform2i;
-
-static void
-_evgl_thread_glUniform2i(void *data)
-{
-   EVGL_Thread_Command_glUniform2i *thread_data =
-      (EVGL_Thread_Command_glUniform2i *)data;
-
-   glUniform2i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2i_evgl_thread_cmd(GLint location, GLint v0, GLint v1)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform2i(location, v0, v1);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform2i thread_data_local;
-   EVGL_Thread_Command_glUniform2i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform2i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform2i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform2i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform3f;
-
-static void
-_evgl_thread_glUniform3f(void *data)
-{
-   EVGL_Thread_Command_glUniform3f *thread_data =
-      (EVGL_Thread_Command_glUniform3f *)data;
-
-   glUniform3f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform3f(location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform3f thread_data_local;
-   EVGL_Thread_Command_glUniform3f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform3f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform3f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform3f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform3i;
-
-static void
-_evgl_thread_glUniform3i(void *data)
-{
-   EVGL_Thread_Command_glUniform3i *thread_data =
-      (EVGL_Thread_Command_glUniform3i *)data;
-
-   glUniform3i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3i_evgl_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform3i(location, v0, v1, v2);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform3i thread_data_local;
-   EVGL_Thread_Command_glUniform3i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform3i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform3i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform3i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
- */
-
-typedef struct
-{
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-   GLfloat v3;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform4f;
-
-static void
-_evgl_thread_glUniform4f(void *data)
-{
-   EVGL_Thread_Command_glUniform4f *thread_data =
-      (EVGL_Thread_Command_glUniform4f *)data;
-
-   glUniform4f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2,
-               thread_data->v3);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform4f(location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform4f thread_data_local;
-   EVGL_Thread_Command_glUniform4f *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform4f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform4f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform4f,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
- */
-
-typedef struct
-{
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   GLint v3;
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform4i;
-
-static void
-_evgl_thread_glUniform4i(void *data)
-{
-   EVGL_Thread_Command_glUniform4i *thread_data =
-      (EVGL_Thread_Command_glUniform4i *)data;
-
-   glUniform4i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2,
-               thread_data->v3);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4i_evgl_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform4i(location, v0, v1, v2, v3);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform4i thread_data_local;
-   EVGL_Thread_Command_glUniform4i *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform4i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform4i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform4i,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform1fv;
-
-static void
-_evgl_thread_glUniform1fv(void *data)
-{
-   EVGL_Thread_Command_glUniform1fv *thread_data =
-      (EVGL_Thread_Command_glUniform1fv *)data;
-
-   glUniform1fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform1fv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform1fv thread_data_local;
-   EVGL_Thread_Command_glUniform1fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform1fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform1fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform1fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform1iv(GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform1iv;
-
-static void
-_evgl_thread_glUniform1iv(void *data)
-{
-   EVGL_Thread_Command_glUniform1iv *thread_data =
-      (EVGL_Thread_Command_glUniform1iv *)data;
-
-   glUniform1iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform1iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform1iv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform1iv thread_data_local;
-   EVGL_Thread_Command_glUniform1iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform1iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform1iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform1iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform2fv;
-
-static void
-_evgl_thread_glUniform2fv(void *data)
-{
-   EVGL_Thread_Command_glUniform2fv *thread_data =
-      (EVGL_Thread_Command_glUniform2fv *)data;
-
-   glUniform2fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform2fv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform2fv thread_data_local;
-   EVGL_Thread_Command_glUniform2fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform2iv(GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform2iv;
-
-static void
-_evgl_thread_glUniform2iv(void *data)
-{
-   EVGL_Thread_Command_glUniform2iv *thread_data =
-      (EVGL_Thread_Command_glUniform2iv *)data;
-
-   glUniform2iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform2iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform2iv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform2iv thread_data_local;
-   EVGL_Thread_Command_glUniform2iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform2iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform2iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform2iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform3fv;
-
-static void
-_evgl_thread_glUniform3fv(void *data)
-{
-   EVGL_Thread_Command_glUniform3fv *thread_data =
-      (EVGL_Thread_Command_glUniform3fv *)data;
-
-   glUniform3fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform3fv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform3fv thread_data_local;
-   EVGL_Thread_Command_glUniform3fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform3iv(GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform3iv;
-
-static void
-_evgl_thread_glUniform3iv(void *data)
-{
-   EVGL_Thread_Command_glUniform3iv *thread_data =
-      (EVGL_Thread_Command_glUniform3iv *)data;
-
-   glUniform3iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform3iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform3iv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform3iv thread_data_local;
-   EVGL_Thread_Command_glUniform3iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform3iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform3iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform3iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform4fv;
-
-static void
-_evgl_thread_glUniform4fv(void *data)
-{
-   EVGL_Thread_Command_glUniform4fv *thread_data =
-      (EVGL_Thread_Command_glUniform4fv *)data;
-
-   glUniform4fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform4fv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform4fv thread_data_local;
-   EVGL_Thread_Command_glUniform4fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniform4iv(GLint location, GLsizei count, const GLint *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniform4iv;
-
-static void
-_evgl_thread_glUniform4iv(void *data)
-{
-   EVGL_Thread_Command_glUniform4iv *thread_data =
-      (EVGL_Thread_Command_glUniform4iv *)data;
-
-   glUniform4iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniform4iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniform4iv(location, count, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniform4iv thread_data_local;
-   EVGL_Thread_Command_glUniform4iv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniform4iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniform4iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniform4iv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniformMatrix2fv;
-
-static void
-_evgl_thread_glUniformMatrix2fv(void *data)
-{
-   EVGL_Thread_Command_glUniformMatrix2fv *thread_data =
-      (EVGL_Thread_Command_glUniformMatrix2fv *)data;
-
-   glUniformMatrix2fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix2fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniformMatrix2fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniformMatrix2fv thread_data_local;
-   EVGL_Thread_Command_glUniformMatrix2fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniformMatrix2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniformMatrix2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniformMatrix2fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniformMatrix3fv;
-
-static void
-_evgl_thread_glUniformMatrix3fv(void *data)
-{
-   EVGL_Thread_Command_glUniformMatrix3fv *thread_data =
-      (EVGL_Thread_Command_glUniformMatrix3fv *)data;
-
-   glUniformMatrix3fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix3fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniformMatrix3fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniformMatrix3fv thread_data_local;
-   EVGL_Thread_Command_glUniformMatrix3fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniformMatrix3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniformMatrix3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 9 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniformMatrix3fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
- */
-
-typedef struct
-{
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glUniformMatrix4fv;
-
-static void
-_evgl_thread_glUniformMatrix4fv(void *data)
-{
-   EVGL_Thread_Command_glUniformMatrix4fv *thread_data =
-      (EVGL_Thread_Command_glUniformMatrix4fv *)data;
-
-   glUniformMatrix4fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
-
-
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glUniformMatrix4fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glUniformMatrix4fv(location, count, transpose, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glUniformMatrix4fv thread_data_local;
-   EVGL_Thread_Command_glUniformMatrix4fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glUniformMatrix4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glUniformMatrix4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 16 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glUniformMatrix4fv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_Thread_Command_glViewport;
-
-static void
-_evgl_thread_glViewport(void *data)
-{
-   EVGL_Thread_Command_glViewport *thread_data =
-      (EVGL_Thread_Command_glViewport *)data;
-
-   glViewport(thread_data->x,
-              thread_data->y,
-              thread_data->width,
-              thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glViewport_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glViewport(x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glViewport thread_data_local;
-   EVGL_Thread_Command_glViewport *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glViewport *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glViewport));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glViewport,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glEnable(GLenum cap);
- */
-
-typedef struct
-{
-   GLenum cap;
-   int command_allocated;
-
-} EVGL_Thread_Command_glEnable;
-
-static void
-_evgl_thread_glEnable(void *data)
-{
-   EVGL_Thread_Command_glEnable *thread_data =
-      (EVGL_Thread_Command_glEnable *)data;
-
-   glEnable(thread_data->cap);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glEnable_evgl_thread_cmd(GLenum cap)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glEnable(cap);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glEnable thread_data_local;
-   EVGL_Thread_Command_glEnable *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glEnable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glEnable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->cap = cap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glEnable,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDisable(GLenum cap);
- */
-
-typedef struct
-{
-   GLenum cap;
-   int command_allocated;
-
-} EVGL_Thread_Command_glDisable;
-
-static void
-_evgl_thread_glDisable(void *data)
-{
-   EVGL_Thread_Command_glDisable *thread_data =
-      (EVGL_Thread_Command_glDisable *)data;
-
-   glDisable(thread_data->cap);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDisable_evgl_thread_cmd(GLenum cap)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDisable(cap);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDisable thread_data_local;
-   EVGL_Thread_Command_glDisable *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDisable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDisable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->cap = cap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDisable,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glLineWidth(GLfloat width);
- */
-
-typedef struct
-{
-   GLfloat width;
-   int command_allocated;
-
-} EVGL_Thread_Command_glLineWidth;
-
-static void
-_evgl_thread_glLineWidth(void *data)
-{
-   EVGL_Thread_Command_glLineWidth *thread_data =
-      (EVGL_Thread_Command_glLineWidth *)data;
-
-   glLineWidth(thread_data->width);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glLineWidth_evgl_thread_cmd(GLfloat width)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glLineWidth(width);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glLineWidth thread_data_local;
-   EVGL_Thread_Command_glLineWidth *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glLineWidth *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glLineWidth));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->width = width;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glLineWidth,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPolygonOffset(GLfloat factor, GLfloat units);
- */
-
-typedef struct
-{
-   GLfloat factor;
-   GLfloat units;
-   int command_allocated;
-
-} EVGL_Thread_Command_glPolygonOffset;
-
-static void
-_evgl_thread_glPolygonOffset(void *data)
-{
-   EVGL_Thread_Command_glPolygonOffset *thread_data =
-      (EVGL_Thread_Command_glPolygonOffset *)data;
-
-   glPolygonOffset(thread_data->factor,
-                   thread_data->units);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glPolygonOffset_evgl_thread_cmd(GLfloat factor, GLfloat units)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glPolygonOffset(factor, units);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glPolygonOffset thread_data_local;
-   EVGL_Thread_Command_glPolygonOffset *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glPolygonOffset *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glPolygonOffset));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->factor = factor;
-   thread_data->units = units;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glPolygonOffset,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glPixelStorei(GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLint param;
-   int command_allocated;
-
-} EVGL_Thread_Command_glPixelStorei;
-
-static void
-_evgl_thread_glPixelStorei(void *data)
-{
-   EVGL_Thread_Command_glPixelStorei *thread_data =
-      (EVGL_Thread_Command_glPixelStorei *)data;
-
-   glPixelStorei(thread_data->pname,
-                 thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glPixelStorei_evgl_thread_cmd(GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glPixelStorei(pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glPixelStorei thread_data_local;
-   EVGL_Thread_Command_glPixelStorei *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glPixelStorei *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glPixelStorei));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glPixelStorei,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glActiveTexture(GLenum texture);
- */
-
-typedef struct
-{
-   GLenum texture;
-
-} EVGL_Thread_Command_glActiveTexture;
-
-static void
-_evgl_thread_glActiveTexture(void *data)
-{
-   EVGL_Thread_Command_glActiveTexture *thread_data =
-      (EVGL_Thread_Command_glActiveTexture *)data;
-
-   glActiveTexture(thread_data->texture);
-
-}
-
-EAPI void
-glActiveTexture_evgl_thread_cmd(GLenum texture)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glActiveTexture(texture);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glActiveTexture thread_data_local;
-   EVGL_Thread_Command_glActiveTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glActiveTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenTextures(GLsizei n, GLuint *textures);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *textures;
-
-} EVGL_Thread_Command_glGenTextures;
-
-static void
-_evgl_thread_glGenTextures(void *data)
-{
-   EVGL_Thread_Command_glGenTextures *thread_data =
-      (EVGL_Thread_Command_glGenTextures *)data;
-
-   glGenTextures(thread_data->n,
-                 thread_data->textures);
-
-}
-
-EAPI void
-glGenTextures_evgl_thread_cmd(GLsizei n, GLuint *textures)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGenTextures(n, textures);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGenTextures thread_data_local;
-   EVGL_Thread_Command_glGenTextures *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->textures = textures;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGenTextures,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindTexture(GLenum target, GLuint texture);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint texture;
-   int command_allocated;
-
-} EVGL_Thread_Command_glBindTexture;
-
-static void
-_evgl_thread_glBindTexture(void *data)
-{
-   EVGL_Thread_Command_glBindTexture *thread_data =
-      (EVGL_Thread_Command_glBindTexture *)data;
-
-   glBindTexture(thread_data->target,
-                 thread_data->texture);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindTexture_evgl_thread_cmd(GLenum target, GLuint texture)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBindTexture(target, texture);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBindTexture thread_data_local;
-   EVGL_Thread_Command_glBindTexture *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glBindTexture *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glBindTexture));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBindTexture,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteTextures(GLsizei n, const GLuint *textures);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *textures;
-   void *textures_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteTextures;
-
-static void
-_evgl_thread_glDeleteTextures(void *data)
-{
-   EVGL_Thread_Command_glDeleteTextures *thread_data =
-      (EVGL_Thread_Command_glDeleteTextures *)data;
-
-   glDeleteTextures(thread_data->n,
-                    thread_data->textures);
-
-
-   if (thread_data->textures_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->textures_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteTextures_evgl_thread_cmd(GLsizei n, const GLuint *textures)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteTextures(n, textures);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteTextures thread_data_local;
-   EVGL_Thread_Command_glDeleteTextures *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteTextures *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteTextures));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->textures = textures;
-
-   thread_data->textures_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (textures)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->textures_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->textures_copied)
-          {
-             memcpy(thread_data->textures_copied, textures, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->textures = (const GLuint  *)thread_data->textures_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteTextures,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLenum format;
-   GLenum type;
-   const void *pixels;
-   int command_allocated;
-   GLTEXIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_Thread_Command_glTexImage2D;
-
-static void
-_evgl_thread_glTexImage2D(void *data)
-{
-   EVGL_Thread_Command_glTexImage2D *thread_data =
-      (EVGL_Thread_Command_glTexImage2D *)data;
-
-   glTexImage2D(thread_data->target,
-                thread_data->level,
-                thread_data->internalformat,
-                thread_data->width,
-                thread_data->height,
-                thread_data->border,
-                thread_data->format,
-                thread_data->type,
-                thread_data->pixels);
-
-   GLTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexImage2D thread_data_local;
-   EVGL_Thread_Command_glTexImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   const void *pixels;
-   int command_allocated;
-   GLTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_Thread_Command_glTexSubImage2D;
-
-static void
-_evgl_thread_glTexSubImage2D(void *data)
-{
-   EVGL_Thread_Command_glTexSubImage2D *thread_data =
-      (EVGL_Thread_Command_glTexSubImage2D *)data;
-
-   glTexSubImage2D(thread_data->target,
-                   thread_data->level,
-                   thread_data->xoffset,
-                   thread_data->yoffset,
-                   thread_data->width,
-                   thread_data->height,
-                   thread_data->format,
-                   thread_data->type,
-                   thread_data->pixels);
-
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexSubImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexSubImage2D thread_data_local;
-   EVGL_Thread_Command_glTexSubImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexSubImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLsizei imageSize;
-   const void *data;
-   int command_allocated;
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_Thread_Command_glCompressedTexImage2D;
-
-static void
-_evgl_thread_glCompressedTexImage2D(void *data)
-{
-   EVGL_Thread_Command_glCompressedTexImage2D *thread_data =
-      (EVGL_Thread_Command_glCompressedTexImage2D *)data;
-
-   glCompressedTexImage2D(thread_data->target,
-                          thread_data->level,
-                          thread_data->internalformat,
-                          thread_data->width,
-                          thread_data->height,
-                          thread_data->border,
-                          thread_data->imageSize,
-                          thread_data->data);
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompressedTexImage2D_evgl_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCompressedTexImage2D thread_data_local;
-   EVGL_Thread_Command_glCompressedTexImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glCompressedTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glCompressedTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLCOMPRESSEDTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCompressedTexImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLsizei imageSize;
-   const void *data;
-   int command_allocated;
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
-
-} EVGL_Thread_Command_glCompressedTexSubImage2D;
-
-static void
-_evgl_thread_glCompressedTexSubImage2D(void *data)
-{
-   EVGL_Thread_Command_glCompressedTexSubImage2D *thread_data =
-      (EVGL_Thread_Command_glCompressedTexSubImage2D *)data;
-
-   glCompressedTexSubImage2D(thread_data->target,
-                             thread_data->level,
-                             thread_data->xoffset,
-                             thread_data->yoffset,
-                             thread_data->width,
-                             thread_data->height,
-                             thread_data->format,
-                             thread_data->imageSize,
-                             thread_data->data);
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glCompressedTexSubImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCompressedTexSubImage2D thread_data_local;
-   EVGL_Thread_Command_glCompressedTexSubImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glCompressedTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glCompressedTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCompressedTexSubImage2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterf(GLenum target, GLenum pname, GLfloat param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLfloat param;
-   int command_allocated;
-
-} EVGL_Thread_Command_glTexParameterf;
-
-static void
-_evgl_thread_glTexParameterf(void *data)
-{
-   EVGL_Thread_Command_glTexParameterf *thread_data =
-      (EVGL_Thread_Command_glTexParameterf *)data;
-
-   glTexParameterf(thread_data->target,
-                   thread_data->pname,
-                   thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameterf_evgl_thread_cmd(GLenum target, GLenum pname, GLfloat param)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexParameterf(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexParameterf thread_data_local;
-   EVGL_Thread_Command_glTexParameterf *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexParameterf *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexParameterf));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexParameterf,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLfloat *params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glTexParameterfv;
-
-static void
-_evgl_thread_glTexParameterfv(void *data)
-{
-   EVGL_Thread_Command_glTexParameterfv *thread_data =
-      (EVGL_Thread_Command_glTexParameterfv *)data;
-
-   glTexParameterfv(thread_data->target,
-                    thread_data->pname,
-                    thread_data->params);
-
-
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameterfv_evgl_thread_cmd(GLenum target, GLenum pname, const GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexParameterfv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexParameterfv thread_data_local;
-   EVGL_Thread_Command_glTexParameterfv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexParameterfv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexParameterfv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (params)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLfloat);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLfloat  *)thread_data->params_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexParameterfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameteri(GLenum target, GLenum pname, GLint param);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint param;
-   int command_allocated;
-
-} EVGL_Thread_Command_glTexParameteri;
-
-static void
-_evgl_thread_glTexParameteri(void *data)
-{
-   EVGL_Thread_Command_glTexParameteri *thread_data =
-      (EVGL_Thread_Command_glTexParameteri *)data;
-
-   glTexParameteri(thread_data->target,
-                   thread_data->pname,
-                   thread_data->param);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameteri_evgl_thread_cmd(GLenum target, GLenum pname, GLint param)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexParameteri(target, pname, param);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexParameteri thread_data_local;
-   EVGL_Thread_Command_glTexParameteri *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexParameteri *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexParameteri));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexParameteri,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   const GLint *params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glTexParameteriv;
-
-static void
-_evgl_thread_glTexParameteriv(void *data)
-{
-   EVGL_Thread_Command_glTexParameteriv *thread_data =
-      (EVGL_Thread_Command_glTexParameteriv *)data;
-
-   glTexParameteriv(thread_data->target,
-                    thread_data->pname,
-                    thread_data->params);
-
-
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glTexParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, const GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexParameteriv thread_data_local;
-   EVGL_Thread_Command_glTexParameteriv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glTexParameteriv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexParameteriv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (params)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLint);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLint  *)thread_data->params_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_Thread_Command_glScissor;
-
-static void
-_evgl_thread_glScissor(void *data)
-{
-   EVGL_Thread_Command_glScissor *thread_data =
-      (EVGL_Thread_Command_glScissor *)data;
-
-   glScissor(thread_data->x,
-             thread_data->y,
-             thread_data->width,
-             thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glScissor_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glScissor(x, y, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glScissor thread_data_local;
-   EVGL_Thread_Command_glScissor *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glScissor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glScissor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glScissor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendFunc(GLenum sfactor, GLenum dfactor);
- */
-
-typedef struct
-{
-   GLenum sfactor;
-   GLenum dfactor;
-   int command_allocated;
-
-} EVGL_Thread_Command_glBlendFunc;
-
-static void
-_evgl_thread_glBlendFunc(void *data)
-{
-   EVGL_Thread_Command_glBlendFunc *thread_data =
-      (EVGL_Thread_Command_glBlendFunc *)data;
-
-   glBlendFunc(thread_data->sfactor,
-               thread_data->dfactor);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendFunc_evgl_thread_cmd(GLenum sfactor, GLenum dfactor)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBlendFunc(sfactor, dfactor);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBlendFunc thread_data_local;
-   EVGL_Thread_Command_glBlendFunc *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glBlendFunc *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glBlendFunc));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->sfactor = sfactor;
-   thread_data->dfactor = dfactor;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBlendFunc,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- */
-
-typedef struct
-{
-   GLfloat red;
-   GLfloat green;
-   GLfloat blue;
-   GLfloat alpha;
-   int command_allocated;
-
-} EVGL_Thread_Command_glBlendColor;
-
-static void
-_evgl_thread_glBlendColor(void *data)
-{
-   EVGL_Thread_Command_glBlendColor *thread_data =
-      (EVGL_Thread_Command_glBlendColor *)data;
-
-   glBlendColor(thread_data->red,
-                thread_data->green,
-                thread_data->blue,
-                thread_data->alpha);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBlendColor_evgl_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBlendColor(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBlendColor thread_data_local;
-   EVGL_Thread_Command_glBlendColor *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glBlendColor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glBlendColor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBlendColor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDepthMask(GLboolean flag);
- */
-
-typedef struct
-{
-   GLboolean flag;
-   int command_allocated;
-
-} EVGL_Thread_Command_glDepthMask;
-
-static void
-_evgl_thread_glDepthMask(void *data)
-{
-   EVGL_Thread_Command_glDepthMask *thread_data =
-      (EVGL_Thread_Command_glDepthMask *)data;
-
-   glDepthMask(thread_data->flag);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDepthMask_evgl_thread_cmd(GLboolean flag)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDepthMask(flag);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDepthMask thread_data_local;
-   EVGL_Thread_Command_glDepthMask *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDepthMask *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDepthMask));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->flag = flag;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDepthMask,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClear(GLbitfield mask);
- */
-
-typedef struct
-{
-   GLbitfield mask;
-   int command_allocated;
-
-} EVGL_Thread_Command_glClear;
-
-static void
-_evgl_thread_glClear(void *data)
-{
-   EVGL_Thread_Command_glClear *thread_data =
-      (EVGL_Thread_Command_glClear *)data;
-
-   glClear(thread_data->mask);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glClear_evgl_thread_cmd(GLbitfield mask)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glClear(mask);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glClear thread_data_local;
-   EVGL_Thread_Command_glClear *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glClear *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glClear));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->mask = mask;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glClear,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
- */
-
-typedef struct
-{
-   GLfloat red;
-   GLfloat green;
-   GLfloat blue;
-   GLfloat alpha;
-   int command_allocated;
-
-} EVGL_Thread_Command_glClearColor;
-
-static void
-_evgl_thread_glClearColor(void *data)
-{
-   EVGL_Thread_Command_glClearColor *thread_data =
-      (EVGL_Thread_Command_glClearColor *)data;
-
-   glClearColor(thread_data->red,
-                thread_data->green,
-                thread_data->blue,
-                thread_data->alpha);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glClearColor_evgl_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glClearColor(red, green, blue, alpha);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glClearColor thread_data_local;
-   EVGL_Thread_Command_glClearColor *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glClearColor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glClearColor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glClearColor,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
- */
-
-typedef struct
-{
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   void *pixels;
-
-} EVGL_Thread_Command_glReadPixels;
-
-static void
-_evgl_thread_glReadPixels(void *data)
-{
-   EVGL_Thread_Command_glReadPixels *thread_data =
-      (EVGL_Thread_Command_glReadPixels *)data;
-
-   glReadPixels(thread_data->x,
-                thread_data->y,
-                thread_data->width,
-                thread_data->height,
-                thread_data->format,
-                thread_data->type,
-                thread_data->pixels);
-
-}
-
-EAPI void
-glReadPixels_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glReadPixels(x, y, width, height, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glReadPixels thread_data_local;
-   EVGL_Thread_Command_glReadPixels *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glReadPixels,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenFramebuffers(GLsizei n, GLuint *framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *framebuffers;
-
-} EVGL_Thread_Command_glGenFramebuffers;
-
-static void
-_evgl_thread_glGenFramebuffers(void *data)
-{
-   EVGL_Thread_Command_glGenFramebuffers *thread_data =
-      (EVGL_Thread_Command_glGenFramebuffers *)data;
-
-   glGenFramebuffers(thread_data->n,
-                     thread_data->framebuffers);
-
-}
-
-EAPI void
-glGenFramebuffers_evgl_thread_cmd(GLsizei n, GLuint *framebuffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGenFramebuffers(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGenFramebuffers thread_data_local;
-   EVGL_Thread_Command_glGenFramebuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGenFramebuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindFramebuffer(GLenum target, GLuint framebuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint framebuffer;
-   int command_allocated;
-
-} EVGL_Thread_Command_glBindFramebuffer;
-
-static void
-_evgl_thread_glBindFramebuffer(void *data)
-{
-   EVGL_Thread_Command_glBindFramebuffer *thread_data =
-      (EVGL_Thread_Command_glBindFramebuffer *)data;
-
-   glBindFramebuffer(thread_data->target,
-                     thread_data->framebuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindFramebuffer_evgl_thread_cmd(GLenum target, GLuint framebuffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBindFramebuffer(target, framebuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBindFramebuffer thread_data_local;
-   EVGL_Thread_Command_glBindFramebuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glBindFramebuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glBindFramebuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBindFramebuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *framebuffers;
-   void *framebuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteFramebuffers;
-
-static void
-_evgl_thread_glDeleteFramebuffers(void *data)
-{
-   EVGL_Thread_Command_glDeleteFramebuffers *thread_data =
-      (EVGL_Thread_Command_glDeleteFramebuffers *)data;
-
-   glDeleteFramebuffers(thread_data->n,
-                        thread_data->framebuffers);
-
-
-   if (thread_data->framebuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteFramebuffers_evgl_thread_cmd(GLsizei n, const GLuint *framebuffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteFramebuffers(n, framebuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteFramebuffers thread_data_local;
-   EVGL_Thread_Command_glDeleteFramebuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteFramebuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteFramebuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
-
-   thread_data->framebuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (framebuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->framebuffers_copied)
-          {
-             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->framebuffers = (const GLuint  *)thread_data->framebuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteFramebuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetFramebufferAttachmentParameteriv;
-
-static void
-_evgl_thread_glGetFramebufferAttachmentParameteriv(void *data)
-{
-   EVGL_Thread_Command_glGetFramebufferAttachmentParameteriv *thread_data =
-      (EVGL_Thread_Command_glGetFramebufferAttachmentParameteriv *)data;
-
-   glGetFramebufferAttachmentParameteriv(thread_data->target,
-                                         thread_data->attachment,
-                                         thread_data->pname,
-                                         thread_data->params);
-
-}
-
-EAPI void
-glGetFramebufferAttachmentParameteriv_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetFramebufferAttachmentParameteriv thread_data_local;
-   EVGL_Thread_Command_glGetFramebufferAttachmentParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetFramebufferAttachmentParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   GLuint *renderbuffers;
-
-} EVGL_Thread_Command_glGenRenderbuffers;
-
-static void
-_evgl_thread_glGenRenderbuffers(void *data)
-{
-   EVGL_Thread_Command_glGenRenderbuffers *thread_data =
-      (EVGL_Thread_Command_glGenRenderbuffers *)data;
-
-   glGenRenderbuffers(thread_data->n,
-                      thread_data->renderbuffers);
-
-}
-
-EAPI void
-glGenRenderbuffers_evgl_thread_cmd(GLsizei n, GLuint *renderbuffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGenRenderbuffers(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGenRenderbuffers thread_data_local;
-   EVGL_Thread_Command_glGenRenderbuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGenRenderbuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glBindRenderbuffer(GLenum target, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_Thread_Command_glBindRenderbuffer;
-
-static void
-_evgl_thread_glBindRenderbuffer(void *data)
-{
-   EVGL_Thread_Command_glBindRenderbuffer *thread_data =
-      (EVGL_Thread_Command_glBindRenderbuffer *)data;
-
-   glBindRenderbuffer(thread_data->target,
-                      thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glBindRenderbuffer_evgl_thread_cmd(GLenum target, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glBindRenderbuffer(target, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glBindRenderbuffer thread_data_local;
-   EVGL_Thread_Command_glBindRenderbuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glBindRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glBindRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glBindRenderbuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
- */
-
-typedef struct
-{
-   GLsizei n;
-   const GLuint *renderbuffers;
-   void *renderbuffers_copied; /* COPIED */
-   int command_allocated;
-
-} EVGL_Thread_Command_glDeleteRenderbuffers;
-
-static void
-_evgl_thread_glDeleteRenderbuffers(void *data)
-{
-   EVGL_Thread_Command_glDeleteRenderbuffers *thread_data =
-      (EVGL_Thread_Command_glDeleteRenderbuffers *)data;
-
-   glDeleteRenderbuffers(thread_data->n,
-                         thread_data->renderbuffers);
-
-
-   if (thread_data->renderbuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glDeleteRenderbuffers_evgl_thread_cmd(GLsizei n, const GLuint *renderbuffers)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glDeleteRenderbuffers(n, renderbuffers);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glDeleteRenderbuffers thread_data_local;
-   EVGL_Thread_Command_glDeleteRenderbuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDeleteRenderbuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDeleteRenderbuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
-
-   thread_data->renderbuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (renderbuffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->renderbuffers_copied)
-          {
-             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->renderbuffers = (const GLuint  *)thread_data->renderbuffers_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glDeleteRenderbuffers,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
-
-} EVGL_Thread_Command_glRenderbufferStorage;
-
-static void
-_evgl_thread_glRenderbufferStorage(void *data)
-{
-   EVGL_Thread_Command_glRenderbufferStorage *thread_data =
-      (EVGL_Thread_Command_glRenderbufferStorage *)data;
-
-   glRenderbufferStorage(thread_data->target,
-                         thread_data->internalformat,
-                         thread_data->width,
-                         thread_data->height);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glRenderbufferStorage_evgl_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glRenderbufferStorage(target, internalformat, width, height);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glRenderbufferStorage thread_data_local;
-   EVGL_Thread_Command_glRenderbufferStorage *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glRenderbufferStorage *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glRenderbufferStorage));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glRenderbufferStorage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum renderbuffertarget;
-   GLuint renderbuffer;
-   int command_allocated;
-
-} EVGL_Thread_Command_glFramebufferRenderbuffer;
-
-static void
-_evgl_thread_glFramebufferRenderbuffer(void *data)
-{
-   EVGL_Thread_Command_glFramebufferRenderbuffer *thread_data =
-      (EVGL_Thread_Command_glFramebufferRenderbuffer *)data;
-
-   glFramebufferRenderbuffer(thread_data->target,
-                             thread_data->attachment,
-                             thread_data->renderbuffertarget,
-                             thread_data->renderbuffer);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferRenderbuffer_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glFramebufferRenderbuffer thread_data_local;
-   EVGL_Thread_Command_glFramebufferRenderbuffer *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glFramebufferRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glFramebufferRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->renderbuffertarget = renderbuffertarget;
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glFramebufferRenderbuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum textarget;
-   GLuint texture;
-   GLint level;
-   int command_allocated;
-
-} EVGL_Thread_Command_glFramebufferTexture2D;
-
-static void
-_evgl_thread_glFramebufferTexture2D(void *data)
-{
-   EVGL_Thread_Command_glFramebufferTexture2D *thread_data =
-      (EVGL_Thread_Command_glFramebufferTexture2D *)data;
-
-   glFramebufferTexture2D(thread_data->target,
-                          thread_data->attachment,
-                          thread_data->textarget,
-                          thread_data->texture,
-                          thread_data->level);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glFramebufferTexture2D_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glFramebufferTexture2D(target, attachment, textarget, texture, level);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glFramebufferTexture2D thread_data_local;
-   EVGL_Thread_Command_glFramebufferTexture2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glFramebufferTexture2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glFramebufferTexture2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
-   thread_data->texture = texture;
-   thread_data->level = level;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glFramebufferTexture2D,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLenum
- * glCheckFramebufferStatus(GLenum target);
- */
-
-typedef struct
-{
-   GLenum return_value;
-   GLenum target;
-
-} EVGL_Thread_Command_glCheckFramebufferStatus;
-
-static void
-_evgl_thread_glCheckFramebufferStatus(void *data)
-{
-   EVGL_Thread_Command_glCheckFramebufferStatus *thread_data =
-      (EVGL_Thread_Command_glCheckFramebufferStatus *)data;
-
-   thread_data->return_value = glCheckFramebufferStatus(thread_data->target);
-
-}
-
-EAPI GLenum
-glCheckFramebufferStatus_evgl_thread_cmd(GLenum target)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glCheckFramebufferStatus(target);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glCheckFramebufferStatus thread_data_local;
-   EVGL_Thread_Command_glCheckFramebufferStatus *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glCheckFramebufferStatus,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glFlush(void);
- */
-
-static void
-_evgl_thread_glFlush(void *data EINA_UNUSED)
-{
-   glFlush();
-
-}
-
-EAPI void
-glFlush_evgl_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glFlush();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glFlush,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glFinish(void);
- */
-
-static void
-_evgl_thread_glFinish(void *data EINA_UNUSED)
-{
-   glFinish();
-
-}
-
-EAPI void
-glFinish_evgl_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glFinish();
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glFinish,
-                              NULL,
-                              thread_mode);
-}
-
-/*
- * void
- * glHint(GLenum target, GLenum mode);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum mode;
-   int command_allocated;
-
-} EVGL_Thread_Command_glHint;
-
-static void
-_evgl_thread_glHint(void *data)
-{
-   EVGL_Thread_Command_glHint *thread_data =
-      (EVGL_Thread_Command_glHint *)data;
-
-   glHint(thread_data->target,
-          thread_data->mode);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
-}
-
-EAPI void
-glHint_evgl_thread_cmd(GLenum target, GLenum mode)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glHint(target, mode);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glHint thread_data_local;
-   EVGL_Thread_Command_glHint *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glHint *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glHint));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->mode = mode;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glHint,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * const GLubyte *
- * glGetString(GLenum name);
- */
-
-typedef struct
-{
-   const GLubyte * return_value;
-   GLenum name;
-
-} EVGL_Thread_Command_glGetString;
-
-static void
-_evgl_thread_glGetString(void *data)
-{
-   EVGL_Thread_Command_glGetString *thread_data =
-      (EVGL_Thread_Command_glGetString *)data;
-
-   thread_data->return_value = glGetString(thread_data->name);
-
-}
-
-EAPI const GLubyte *
-glGetString_evgl_thread_cmd(GLenum name)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glGetString(name);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetString thread_data_local;
-   EVGL_Thread_Command_glGetString *thread_data = &thread_data_local;
-
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetString,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetBooleanv(GLenum pname, GLboolean *data);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLboolean *data;
-
-} EVGL_Thread_Command_glGetBooleanv;
-
-static void
-_evgl_thread_glGetBooleanv(void *data)
-{
-   EVGL_Thread_Command_glGetBooleanv *thread_data =
-      (EVGL_Thread_Command_glGetBooleanv *)data;
-
-   glGetBooleanv(thread_data->pname,
-                 thread_data->data);
-
-}
-
-EAPI void
-glGetBooleanv_evgl_thread_cmd(GLenum pname, GLboolean *data)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetBooleanv(pname, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetBooleanv thread_data_local;
-   EVGL_Thread_Command_glGetBooleanv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetBooleanv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetFloatv(GLenum pname, GLfloat *data);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLfloat *data;
-
-} EVGL_Thread_Command_glGetFloatv;
-
-static void
-_evgl_thread_glGetFloatv(void *data)
-{
-   EVGL_Thread_Command_glGetFloatv *thread_data =
-      (EVGL_Thread_Command_glGetFloatv *)data;
-
-   glGetFloatv(thread_data->pname,
-               thread_data->data);
-
-}
-
-EAPI void
-glGetFloatv_evgl_thread_cmd(GLenum pname, GLfloat *data)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetFloatv(pname, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetFloatv thread_data_local;
-   EVGL_Thread_Command_glGetFloatv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetFloatv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetIntegerv(GLenum pname, GLint *data);
- */
-
-typedef struct
-{
-   GLenum pname;
-   GLint *data;
-
-} EVGL_Thread_Command_glGetIntegerv;
-
-static void
-_evgl_thread_glGetIntegerv(void *data)
-{
-   EVGL_Thread_Command_glGetIntegerv *thread_data =
-      (EVGL_Thread_Command_glGetIntegerv *)data;
-
-   glGetIntegerv(thread_data->pname,
-                 thread_data->data);
-
-}
-
-EAPI void
-glGetIntegerv_evgl_thread_cmd(GLenum pname, GLint *data)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetIntegerv(pname, data);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetIntegerv thread_data_local;
-   EVGL_Thread_Command_glGetIntegerv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetIntegerv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsBuffer(GLint buffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLint buffer;
-
-} EVGL_Thread_Command_glIsBuffer;
-
-static void
-_evgl_thread_glIsBuffer(void *data)
-{
-   EVGL_Thread_Command_glIsBuffer *thread_data =
-      (EVGL_Thread_Command_glIsBuffer *)data;
-
-   thread_data->return_value = glIsBuffer(thread_data->buffer);
-
-}
-
-EAPI GLboolean
-glIsBuffer_evgl_thread_cmd(GLint buffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsBuffer(buffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsBuffer thread_data_local;
-   EVGL_Thread_Command_glIsBuffer *thread_data = &thread_data_local;
-
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsBuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetBufferParameteriv;
-
-static void
-_evgl_thread_glGetBufferParameteriv(void *data)
-{
-   EVGL_Thread_Command_glGetBufferParameteriv *thread_data =
-      (EVGL_Thread_Command_glGetBufferParameteriv *)data;
-
-   glGetBufferParameteriv(thread_data->target,
-                          thread_data->pname,
-                          thread_data->params);
-
-}
-
-EAPI void
-glGetBufferParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetBufferParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetBufferParameteriv thread_data_local;
-   EVGL_Thread_Command_glGetBufferParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetBufferParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsShader(GLuint shader);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint shader;
-
-} EVGL_Thread_Command_glIsShader;
-
-static void
-_evgl_thread_glIsShader(void *data)
-{
-   EVGL_Thread_Command_glIsShader *thread_data =
-      (EVGL_Thread_Command_glIsShader *)data;
-
-   thread_data->return_value = glIsShader(thread_data->shader);
-
-}
-
-EAPI GLboolean
-glIsShader_evgl_thread_cmd(GLuint shader)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsShader(shader);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsShader thread_data_local;
-   EVGL_Thread_Command_glIsShader *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsShader,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetShaderiv;
-
-static void
-_evgl_thread_glGetShaderiv(void *data)
-{
-   EVGL_Thread_Command_glGetShaderiv *thread_data =
-      (EVGL_Thread_Command_glGetShaderiv *)data;
-
-   glGetShaderiv(thread_data->shader,
-                 thread_data->pname,
-                 thread_data->params);
-
-}
-
-EAPI void
-glGetShaderiv_evgl_thread_cmd(GLuint shader, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetShaderiv(shader, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetShaderiv thread_data_local;
-   EVGL_Thread_Command_glGetShaderiv *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetShaderiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei maxCount;
-   GLsizei *count;
-   GLuint *shaders;
-
-} EVGL_Thread_Command_glGetAttachedShaders;
-
-static void
-_evgl_thread_glGetAttachedShaders(void *data)
-{
-   EVGL_Thread_Command_glGetAttachedShaders *thread_data =
-      (EVGL_Thread_Command_glGetAttachedShaders *)data;
-
-   glGetAttachedShaders(thread_data->program,
-                        thread_data->maxCount,
-                        thread_data->count,
-                        thread_data->shaders);
-
-}
-
-EAPI void
-glGetAttachedShaders_evgl_thread_cmd(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetAttachedShaders(program, maxCount, count, shaders);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetAttachedShaders thread_data_local;
-   EVGL_Thread_Command_glGetAttachedShaders *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->maxCount = maxCount;
-   thread_data->count = count;
-   thread_data->shaders = shaders;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetAttachedShaders,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *infoLog;
-
-} EVGL_Thread_Command_glGetShaderInfoLog;
-
-static void
-_evgl_thread_glGetShaderInfoLog(void *data)
-{
-   EVGL_Thread_Command_glGetShaderInfoLog *thread_data =
-      (EVGL_Thread_Command_glGetShaderInfoLog *)data;
-
-   glGetShaderInfoLog(thread_data->shader,
-                      thread_data->bufSize,
-                      thread_data->length,
-                      thread_data->infoLog);
-
-}
-
-EAPI void
-glGetShaderInfoLog_evgl_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetShaderInfoLog(shader, bufSize, length, infoLog);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetShaderInfoLog thread_data_local;
-   EVGL_Thread_Command_glGetShaderInfoLog *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->infoLog = infoLog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetShaderInfoLog,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
- */
-
-typedef struct
-{
-   GLuint shader;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *source;
-
-} EVGL_Thread_Command_glGetShaderSource;
-
-static void
-_evgl_thread_glGetShaderSource(void *data)
-{
-   EVGL_Thread_Command_glGetShaderSource *thread_data =
-      (EVGL_Thread_Command_glGetShaderSource *)data;
-
-   glGetShaderSource(thread_data->shader,
-                     thread_data->bufSize,
-                     thread_data->length,
-                     thread_data->source);
-
-}
-
-EAPI void
-glGetShaderSource_evgl_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetShaderSource(shader, bufSize, length, source);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetShaderSource thread_data_local;
-   EVGL_Thread_Command_glGetShaderSource *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->source = source;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetShaderSource,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
- */
-
-typedef struct
-{
-   GLenum shadertype;
-   GLenum precisiontype;
-   GLint *range;
-   GLint *precision;
-
-} EVGL_Thread_Command_glGetShaderPrecisionFormat;
-
-static void
-_evgl_thread_glGetShaderPrecisionFormat(void *data)
-{
-   EVGL_Thread_Command_glGetShaderPrecisionFormat *thread_data =
-      (EVGL_Thread_Command_glGetShaderPrecisionFormat *)data;
-
-   glGetShaderPrecisionFormat(thread_data->shadertype,
-                              thread_data->precisiontype,
-                              thread_data->range,
-                              thread_data->precision);
-
-}
-
-EAPI void
-glGetShaderPrecisionFormat_evgl_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetShaderPrecisionFormat thread_data_local;
-   EVGL_Thread_Command_glGetShaderPrecisionFormat *thread_data = &thread_data_local;
-
-   thread_data->shadertype = shadertype;
-   thread_data->precisiontype = precisiontype;
-   thread_data->range = range;
-   thread_data->precision = precision;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetShaderPrecisionFormat,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLfloat *params;
-
-} EVGL_Thread_Command_glGetVertexAttribfv;
-
-static void
-_evgl_thread_glGetVertexAttribfv(void *data)
-{
-   EVGL_Thread_Command_glGetVertexAttribfv *thread_data =
-      (EVGL_Thread_Command_glGetVertexAttribfv *)data;
-
-   glGetVertexAttribfv(thread_data->index,
-                       thread_data->pname,
-                       thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribfv_evgl_thread_cmd(GLuint index, GLenum pname, GLfloat *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetVertexAttribfv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetVertexAttribfv thread_data_local;
-   EVGL_Thread_Command_glGetVertexAttribfv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetVertexAttribfv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint index;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetVertexAttribiv;
-
-static void
-_evgl_thread_glGetVertexAttribiv(void *data)
-{
-   EVGL_Thread_Command_glGetVertexAttribiv *thread_data =
-      (EVGL_Thread_Command_glGetVertexAttribiv *)data;
-
-   glGetVertexAttribiv(thread_data->index,
-                       thread_data->pname,
-                       thread_data->params);
-
-}
-
-EAPI void
-glGetVertexAttribiv_evgl_thread_cmd(GLuint index, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetVertexAttribiv(index, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetVertexAttribiv thread_data_local;
-   EVGL_Thread_Command_glGetVertexAttribiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetVertexAttribiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsProgram(GLuint program);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLuint program;
-
-} EVGL_Thread_Command_glIsProgram;
-
-static void
-_evgl_thread_glIsProgram(void *data)
-{
-   EVGL_Thread_Command_glIsProgram *thread_data =
-      (EVGL_Thread_Command_glIsProgram *)data;
-
-   thread_data->return_value = glIsProgram(thread_data->program);
-
-}
-
-EAPI GLboolean
-glIsProgram_evgl_thread_cmd(GLuint program)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsProgram(program);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsProgram thread_data_local;
-   EVGL_Thread_Command_glIsProgram *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsProgram,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *infoLog;
-
-} EVGL_Thread_Command_glGetProgramInfoLog;
-
-static void
-_evgl_thread_glGetProgramInfoLog(void *data)
-{
-   EVGL_Thread_Command_glGetProgramInfoLog *thread_data =
-      (EVGL_Thread_Command_glGetProgramInfoLog *)data;
-
-   glGetProgramInfoLog(thread_data->program,
-                       thread_data->bufSize,
-                       thread_data->length,
-                       thread_data->infoLog);
-
-}
-
-EAPI void
-glGetProgramInfoLog_evgl_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetProgramInfoLog(program, bufSize, length, infoLog);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetProgramInfoLog thread_data_local;
-   EVGL_Thread_Command_glGetProgramInfoLog *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->infoLog = infoLog;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetProgramInfoLog,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * void
- * glGetProgramiv(GLuint program, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLuint program;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetProgramiv;
-
-static void
-_evgl_thread_glGetProgramiv(void *data)
-{
-   EVGL_Thread_Command_glGetProgramiv *thread_data =
-      (EVGL_Thread_Command_glGetProgramiv *)data;
-
-   glGetProgramiv(thread_data->program,
-                  thread_data->pname,
-                  thread_data->params);
-
-}
-
-EAPI void
-glGetProgramiv_evgl_thread_cmd(GLuint program, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetProgramiv(program, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetProgramiv thread_data_local;
-   EVGL_Thread_Command_glGetProgramiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetProgramiv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsFramebuffer(GLint framebuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLint framebuffer;
-
-} EVGL_Thread_Command_glIsFramebuffer;
-
-static void
-_evgl_thread_glIsFramebuffer(void *data)
-{
-   EVGL_Thread_Command_glIsFramebuffer *thread_data =
-      (EVGL_Thread_Command_glIsFramebuffer *)data;
-
-   thread_data->return_value = glIsFramebuffer(thread_data->framebuffer);
-
-}
-
-EAPI GLboolean
-glIsFramebuffer_evgl_thread_cmd(GLint framebuffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsFramebuffer(framebuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsFramebuffer thread_data_local;
-   EVGL_Thread_Command_glIsFramebuffer *thread_data = &thread_data_local;
-
-   thread_data->framebuffer = framebuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsFramebuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * GLboolean
- * glIsRenderbuffer(GLint renderbuffer);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLint renderbuffer;
-
-} EVGL_Thread_Command_glIsRenderbuffer;
-
-static void
-_evgl_thread_glIsRenderbuffer(void *data)
-{
-   EVGL_Thread_Command_glIsRenderbuffer *thread_data =
-      (EVGL_Thread_Command_glIsRenderbuffer *)data;
-
-   thread_data->return_value = glIsRenderbuffer(thread_data->renderbuffer);
-
-}
-
-EAPI GLboolean
-glIsRenderbuffer_evgl_thread_cmd(GLint renderbuffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsRenderbuffer(renderbuffer);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsRenderbuffer thread_data_local;
-   EVGL_Thread_Command_glIsRenderbuffer *thread_data = &thread_data_local;
-
-   thread_data->renderbuffer = renderbuffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsRenderbuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
- * void
- * glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
- */
-
-typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint *params;
-
-} EVGL_Thread_Command_glGetRenderbufferParameteriv;
-
-static void
-_evgl_thread_glGetRenderbufferParameteriv(void *data)
-{
-   EVGL_Thread_Command_glGetRenderbufferParameteriv *thread_data =
-      (EVGL_Thread_Command_glGetRenderbufferParameteriv *)data;
-
-   glGetRenderbufferParameteriv(thread_data->target,
-                                thread_data->pname,
-                                thread_data->params);
-
-}
-
-EAPI void
-glGetRenderbufferParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, GLint *params)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glGetRenderbufferParameteriv(target, pname, params);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glGetRenderbufferParameteriv thread_data_local;
-   EVGL_Thread_Command_glGetRenderbufferParameteriv *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glGetRenderbufferParameteriv,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
- * GLboolean
- * glIsTexture(GLint texture);
- */
-
-typedef struct
-{
-   GLboolean return_value;
-   GLint texture;
-
-} EVGL_Thread_Command_glIsTexture;
-
-static void
-_evgl_thread_glIsTexture(void *data)
-{
-   EVGL_Thread_Command_glIsTexture *thread_data =
-      (EVGL_Thread_Command_glIsTexture *)data;
-
-   thread_data->return_value = glIsTexture(thread_data->texture);
-
-}
-
-EAPI GLboolean
-glIsTexture_evgl_thread_cmd(GLint texture)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glIsTexture(texture);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glIsTexture thread_data_local;
-   EVGL_Thread_Command_glIsTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glIsTexture,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.h b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.h
deleted file mode 100644 (file)
index f678d2e..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-
-#define EVAS_GL_NO_GL_H_CHECK 1
-#include "Evas_GL.h"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-EAPI GLenum glGetError_evgl_thread_cmd(void);
-EAPI void glVertexAttribPointer_evgl_thread_cmd(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-EAPI void glEnableVertexAttribArray_evgl_thread_cmd(GLuint index);
-EAPI void glDisableVertexAttribArray_evgl_thread_cmd(GLuint index);
-EAPI void glDrawArrays_evgl_thread_cmd(GLenum mode, GLint first, GLsizei count);
-EAPI void glDrawElements_evgl_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices);
-EAPI void glGenBuffers_evgl_thread_cmd(GLsizei n, GLuint *buffers);
-EAPI void glDeleteBuffers_evgl_thread_cmd(GLsizei n, const GLuint *buffers);
-EAPI void glBindBuffer_evgl_thread_cmd(GLenum target, GLuint buffer);
-EAPI void glBufferData_evgl_thread_cmd(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-EAPI GLuint glCreateShader_evgl_thread_cmd(GLenum type);
-EAPI void glShaderSource_evgl_thread_cmd(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
-EAPI void glCompileShader_evgl_thread_cmd(GLuint shader);
-EAPI void glDeleteShader_evgl_thread_cmd(GLuint shader);
-EAPI GLuint glCreateProgram_evgl_thread_cmd(void);
-EAPI void glAttachShader_evgl_thread_cmd(GLuint program, GLuint shader);
-EAPI void glDetachShader_evgl_thread_cmd(GLuint program, GLuint shader);
-EAPI void glLinkProgram_evgl_thread_cmd(GLuint program);
-EAPI void glUseProgram_evgl_thread_cmd(GLuint program);
-EAPI void glDeleteProgram_evgl_thread_cmd(GLuint program);
-
-EAPI void glGetProgramBinary_orig_evgl_set(void *func);
-EAPI void *glGetProgramBinary_orig_evgl_get(void);
-EAPI void glGetProgramBinary_evgl_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-EAPI void glProgramBinary_orig_evgl_set(void *func);
-EAPI void *glProgramBinary_orig_evgl_get(void);
-EAPI void glProgramBinary_evgl_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-EAPI void glGetActiveAttrib_evgl_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-EAPI GLint glGetAttribLocation_evgl_thread_cmd(GLuint program, const GLchar *name);
-EAPI void glBindAttribLocation_evgl_thread_cmd(GLuint program, GLuint index, const GLchar *name);
-EAPI GLint glGetUniformLocation_evgl_thread_cmd(GLuint program, const GLchar *name);
-EAPI void glUniform1f_evgl_thread_cmd(GLint location, GLfloat v0);
-EAPI void glUniform1i_evgl_thread_cmd(GLint location, GLint v0);
-EAPI void glUniform2f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1);
-EAPI void glUniform2i_evgl_thread_cmd(GLint location, GLint v0, GLint v1);
-EAPI void glUniform3f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-EAPI void glUniform3i_evgl_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2);
-EAPI void glUniform4f_evgl_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-EAPI void glUniform4i_evgl_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-EAPI void glUniform1fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform1iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform2fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform2iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform3fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform3iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform4fv_evgl_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform4iv_evgl_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniformMatrix2fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix3fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix4fv_evgl_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glViewport_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glEnable_evgl_thread_cmd(GLenum cap);
-EAPI void glDisable_evgl_thread_cmd(GLenum cap);
-EAPI void glLineWidth_evgl_thread_cmd(GLfloat width);
-EAPI void glPolygonOffset_evgl_thread_cmd(GLfloat factor, GLfloat units);
-EAPI void glPixelStorei_evgl_thread_cmd(GLenum pname, GLint param);
-EAPI void glActiveTexture_evgl_thread_cmd(GLenum texture);
-EAPI void glGenTextures_evgl_thread_cmd(GLsizei n, GLuint *textures);
-EAPI void glBindTexture_evgl_thread_cmd(GLenum target, GLuint texture);
-EAPI void glDeleteTextures_evgl_thread_cmd(GLsizei n, const GLuint *textures);
-EAPI void glTexImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-EAPI void glTexSubImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
-EAPI void glCompressedTexImage2D_evgl_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
-EAPI void glCompressedTexSubImage2D_evgl_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
-EAPI void glTexParameterf_evgl_thread_cmd(GLenum target, GLenum pname, GLfloat param);
-EAPI void glTexParameterfv_evgl_thread_cmd(GLenum target, GLenum pname, const GLfloat *params);
-EAPI void glTexParameteri_evgl_thread_cmd(GLenum target, GLenum pname, GLint param);
-EAPI void glTexParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, const GLint *params);
-EAPI void glScissor_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glBlendFunc_evgl_thread_cmd(GLenum sfactor, GLenum dfactor);
-EAPI void glBlendColor_evgl_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-EAPI void glDepthMask_evgl_thread_cmd(GLboolean flag);
-EAPI void glClear_evgl_thread_cmd(GLbitfield mask);
-EAPI void glClearColor_evgl_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-EAPI void glReadPixels_evgl_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-EAPI void glGenFramebuffers_evgl_thread_cmd(GLsizei n, GLuint *framebuffers);
-EAPI void glBindFramebuffer_evgl_thread_cmd(GLenum target, GLuint framebuffer);
-EAPI void glDeleteFramebuffers_evgl_thread_cmd(GLsizei n, const GLuint *framebuffers);
-EAPI void glGetFramebufferAttachmentParameteriv_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-EAPI void glGenRenderbuffers_evgl_thread_cmd(GLsizei n, GLuint *renderbuffers);
-EAPI void glBindRenderbuffer_evgl_thread_cmd(GLenum target, GLuint renderbuffer);
-EAPI void glDeleteRenderbuffers_evgl_thread_cmd(GLsizei n, const GLuint *renderbuffers);
-EAPI void glRenderbufferStorage_evgl_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glFramebufferRenderbuffer_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-EAPI void glFramebufferTexture2D_evgl_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-EAPI GLenum glCheckFramebufferStatus_evgl_thread_cmd(GLenum target);
-EAPI void glFlush_evgl_thread_cmd(void);
-EAPI void glFinish_evgl_thread_cmd(void);
-EAPI void glHint_evgl_thread_cmd(GLenum target, GLenum mode);
-EAPI const GLubyte * glGetString_evgl_thread_cmd(GLenum name);
-EAPI void glGetBooleanv_evgl_thread_cmd(GLenum pname, GLboolean *data);
-EAPI void glGetFloatv_evgl_thread_cmd(GLenum pname, GLfloat *data);
-EAPI void glGetIntegerv_evgl_thread_cmd(GLenum pname, GLint *data);
-EAPI GLboolean glIsBuffer_evgl_thread_cmd(GLint buffer);
-EAPI void glGetBufferParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, GLint *params);
-EAPI GLboolean glIsShader_evgl_thread_cmd(GLuint shader);
-EAPI void glGetShaderiv_evgl_thread_cmd(GLuint shader, GLenum pname, GLint *params);
-EAPI void glGetAttachedShaders_evgl_thread_cmd(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
-EAPI void glGetShaderInfoLog_evgl_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-EAPI void glGetShaderSource_evgl_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-EAPI void glGetShaderPrecisionFormat_evgl_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
-EAPI void glGetVertexAttribfv_evgl_thread_cmd(GLuint index, GLenum pname, GLfloat *params);
-EAPI void glGetVertexAttribiv_evgl_thread_cmd(GLuint index, GLenum pname, GLint *params);
-EAPI GLboolean glIsProgram_evgl_thread_cmd(GLuint program);
-EAPI void glGetProgramInfoLog_evgl_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-EAPI void glGetProgramiv_evgl_thread_cmd(GLuint program, GLenum pname, GLint *params);
-EAPI GLboolean glIsFramebuffer_evgl_thread_cmd(GLint framebuffer);
-EAPI GLboolean glIsRenderbuffer_evgl_thread_cmd(GLint renderbuffer);
-EAPI void glGetRenderbufferParameteriv_evgl_thread_cmd(GLenum target, GLenum pname, GLint *params);
-EAPI GLboolean glIsTexture_evgl_thread_cmd(GLint texture);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.c b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.c
deleted file mode 100644 (file)
index ab71557..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-GLenum (*glGetError_evgl_thread_cmd)(void) = NULL;
-void (*glVertexAttribPointer_evgl_thread_cmd)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) = NULL;
-void (*glEnableVertexAttribArray_evgl_thread_cmd)(GLuint index) = NULL;
-void (*glDisableVertexAttribArray_evgl_thread_cmd)(GLuint index) = NULL;
-void (*glDrawArrays_evgl_thread_cmd)(GLenum mode, GLint first, GLsizei count) = NULL;
-void (*glDrawElements_evgl_thread_cmd)(GLenum mode, GLsizei count, GLenum type, const void *indices) = NULL;
-void (*glGenBuffers_evgl_thread_cmd)(GLsizei n, GLuint *buffers) = NULL;
-void (*glDeleteBuffers_evgl_thread_cmd)(GLsizei n, const GLuint *buffers) = NULL;
-void (*glBindBuffer_evgl_thread_cmd)(GLenum target, GLuint buffer) = NULL;
-void (*glBufferData_evgl_thread_cmd)(GLenum target, GLsizeiptr size, const void *data, GLenum usage) = NULL;
-GLuint (*glCreateShader_evgl_thread_cmd)(GLenum type) = NULL;
-void (*glShaderSource_evgl_thread_cmd)(GLuint shader, GLsizei count, const GLchar **string, const GLint *length) = NULL;
-void (*glCompileShader_evgl_thread_cmd)(GLuint shader) = NULL;
-void (*glDeleteShader_evgl_thread_cmd)(GLuint shader) = NULL;
-GLuint (*glCreateProgram_evgl_thread_cmd)(void) = NULL;
-void (*glAttachShader_evgl_thread_cmd)(GLuint program, GLuint shader) = NULL;
-void (*glDetachShader_evgl_thread_cmd)(GLuint program, GLuint shader) = NULL;
-void (*glLinkProgram_evgl_thread_cmd)(GLuint program) = NULL;
-void (*glUseProgram_evgl_thread_cmd)(GLuint program) = NULL;
-void (*glDeleteProgram_evgl_thread_cmd)(GLuint program) = NULL;
-void (*glGetProgramBinary_orig_evgl_set)(void *func) = NULL;
-void *(*glGetProgramBinary_orig_evgl_get)(void) = NULL;
-void (*glGetProgramBinary_evgl_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
-void (*glProgramBinary_orig_evgl_set)(void *func) = NULL;
-void *(*glProgramBinary_orig_evgl_get)(void) = NULL;
-void (*glProgramBinary_evgl_thread_cmd)(GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL;
-void (*glGetActiveAttrib_evgl_thread_cmd)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) = NULL;
-GLint (*glGetAttribLocation_evgl_thread_cmd)(GLuint program, const GLchar *name) = NULL;
-void (*glBindAttribLocation_evgl_thread_cmd)(GLuint program, GLuint index, const GLchar *name) = NULL;
-GLint (*glGetUniformLocation_evgl_thread_cmd)(GLuint program, const GLchar *name) = NULL;
-void (*glUniform1f_evgl_thread_cmd)(GLint location, GLfloat v0) = NULL;
-void (*glUniform1i_evgl_thread_cmd)(GLint location, GLint v0) = NULL;
-void (*glUniform2f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1) = NULL;
-void (*glUniform2i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1) = NULL;
-void (*glUniform3f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) = NULL;
-void (*glUniform3i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2) = NULL;
-void (*glUniform4f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) = NULL;
-void (*glUniform4i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) = NULL;
-void (*glUniform1fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform1iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform2fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform2iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform3fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform3iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform4fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform4iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniformMatrix2fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glUniformMatrix3fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glUniformMatrix4fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glViewport_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
-void (*glEnable_evgl_thread_cmd)(GLenum cap) = NULL;
-void (*glDisable_evgl_thread_cmd)(GLenum cap) = NULL;
-void (*glLineWidth_evgl_thread_cmd)(GLfloat width) = NULL;
-void (*glPolygonOffset_evgl_thread_cmd)(GLfloat factor, GLfloat units) = NULL;
-void (*glPixelStorei_evgl_thread_cmd)(GLenum pname, GLint param) = NULL;
-void (*glActiveTexture_evgl_thread_cmd)(GLenum texture) = NULL;
-void (*glGenTextures_evgl_thread_cmd)(GLsizei n, GLuint *textures) = NULL;
-void (*glBindTexture_evgl_thread_cmd)(GLenum target, GLuint texture) = NULL;
-void (*glDeleteTextures_evgl_thread_cmd)(GLsizei n, const GLuint *textures) = NULL;
-void (*glTexImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) = NULL;
-void (*glTexSubImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) = NULL;
-void (*glCompressedTexImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) = NULL;
-void (*glCompressedTexSubImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) = NULL;
-void (*glTexParameterf_evgl_thread_cmd)(GLenum target, GLenum pname, GLfloat param) = NULL;
-void (*glTexParameterfv_evgl_thread_cmd)(GLenum target, GLenum pname, const GLfloat *params) = NULL;
-void (*glTexParameteri_evgl_thread_cmd)(GLenum target, GLenum pname, GLint param) = NULL;
-void (*glTexParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, const GLint *params) = NULL;
-void (*glScissor_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
-void (*glBlendFunc_evgl_thread_cmd)(GLenum sfactor, GLenum dfactor) = NULL;
-void (*glBlendColor_evgl_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = NULL;
-void (*glDepthMask_evgl_thread_cmd)(GLboolean flag) = NULL;
-void (*glClear_evgl_thread_cmd)(GLbitfield mask) = NULL;
-void (*glClearColor_evgl_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = NULL;
-void (*glReadPixels_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) = NULL;
-void (*glGenFramebuffers_evgl_thread_cmd)(GLsizei n, GLuint *framebuffers) = NULL;
-void (*glBindFramebuffer_evgl_thread_cmd)(GLenum target, GLuint framebuffer) = NULL;
-void (*glDeleteFramebuffers_evgl_thread_cmd)(GLsizei n, const GLuint *framebuffers) = NULL;
-void (*glGetFramebufferAttachmentParameteriv_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum pname, GLint *params) = NULL;
-void (*glGenRenderbuffers_evgl_thread_cmd)(GLsizei n, GLuint *renderbuffers) = NULL;
-void (*glBindRenderbuffer_evgl_thread_cmd)(GLenum target, GLuint renderbuffer) = NULL;
-void (*glDeleteRenderbuffers_evgl_thread_cmd)(GLsizei n, const GLuint *renderbuffers) = NULL;
-void (*glRenderbufferStorage_evgl_thread_cmd)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
-void (*glFramebufferRenderbuffer_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
-void (*glFramebufferTexture2D_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
-GLenum (*glCheckFramebufferStatus_evgl_thread_cmd)(GLenum target) = NULL;
-void (*glFlush_evgl_thread_cmd)(void) = NULL;
-void (*glFinish_evgl_thread_cmd)(void) = NULL;
-void (*glHint_evgl_thread_cmd)(GLenum target, GLenum mode) = NULL;
-const GLubyte * (*glGetString_evgl_thread_cmd)(GLenum name) = NULL;
-void (*glGetBooleanv_evgl_thread_cmd)(GLenum pname, GLboolean *data) = NULL;
-void (*glGetFloatv_evgl_thread_cmd)(GLenum pname, GLfloat *data) = NULL;
-void (*glGetIntegerv_evgl_thread_cmd)(GLenum pname, GLint *data) = NULL;
-GLboolean (*glIsBuffer_evgl_thread_cmd)(GLint buffer) = NULL;
-void (*glGetBufferParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsShader_evgl_thread_cmd)(GLuint shader) = NULL;
-void (*glGetShaderiv_evgl_thread_cmd)(GLuint shader, GLenum pname, GLint *params) = NULL;
-void (*glGetAttachedShaders_evgl_thread_cmd)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) = NULL;
-void (*glGetShaderInfoLog_evgl_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = NULL;
-void (*glGetShaderSource_evgl_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) = NULL;
-void (*glGetShaderPrecisionFormat_evgl_thread_cmd)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) = NULL;
-void (*glGetVertexAttribfv_evgl_thread_cmd)(GLuint index, GLenum pname, GLfloat *params) = NULL;
-void (*glGetVertexAttribiv_evgl_thread_cmd)(GLuint index, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsProgram_evgl_thread_cmd)(GLuint program) = NULL;
-void (*glGetProgramInfoLog_evgl_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = NULL;
-void (*glGetProgramiv_evgl_thread_cmd)(GLuint program, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsFramebuffer_evgl_thread_cmd)(GLint framebuffer) = NULL;
-GLboolean (*glIsRenderbuffer_evgl_thread_cmd)(GLint renderbuffer) = NULL;
-void (*glGetRenderbufferParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsTexture_evgl_thread_cmd)(GLint texture) = NULL;
-
-
-void
-_gl_thread_link_evgl_generated_init()
-{
-#define LINK2GENERIC(sym) \
-   sym = dlsym(RTLD_DEFAULT, #sym); \
-   if (!sym) ERR("Could not find function '%s'", #sym);
-
-   LINK2GENERIC(glGetError_evgl_thread_cmd);
-   LINK2GENERIC(glVertexAttribPointer_evgl_thread_cmd);
-   LINK2GENERIC(glEnableVertexAttribArray_evgl_thread_cmd);
-   LINK2GENERIC(glDisableVertexAttribArray_evgl_thread_cmd);
-   LINK2GENERIC(glDrawArrays_evgl_thread_cmd);
-   LINK2GENERIC(glDrawElements_evgl_thread_cmd);
-   LINK2GENERIC(glGenBuffers_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteBuffers_evgl_thread_cmd);
-   LINK2GENERIC(glBindBuffer_evgl_thread_cmd);
-   LINK2GENERIC(glBufferData_evgl_thread_cmd);
-   LINK2GENERIC(glCreateShader_evgl_thread_cmd);
-   LINK2GENERIC(glShaderSource_evgl_thread_cmd);
-   LINK2GENERIC(glCompileShader_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteShader_evgl_thread_cmd);
-   LINK2GENERIC(glCreateProgram_evgl_thread_cmd);
-   LINK2GENERIC(glAttachShader_evgl_thread_cmd);
-   LINK2GENERIC(glDetachShader_evgl_thread_cmd);
-   LINK2GENERIC(glLinkProgram_evgl_thread_cmd);
-   LINK2GENERIC(glUseProgram_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteProgram_evgl_thread_cmd);
-   LINK2GENERIC(glGetProgramBinary_orig_evgl_set);
-   LINK2GENERIC(glGetProgramBinary_orig_evgl_get);
-   LINK2GENERIC(glGetProgramBinary_evgl_thread_cmd);
-   LINK2GENERIC(glProgramBinary_orig_evgl_set);
-   LINK2GENERIC(glProgramBinary_orig_evgl_get);
-   LINK2GENERIC(glProgramBinary_evgl_thread_cmd);
-   LINK2GENERIC(glGetActiveAttrib_evgl_thread_cmd);
-   LINK2GENERIC(glGetAttribLocation_evgl_thread_cmd);
-   LINK2GENERIC(glBindAttribLocation_evgl_thread_cmd);
-   LINK2GENERIC(glGetUniformLocation_evgl_thread_cmd);
-   LINK2GENERIC(glUniform1f_evgl_thread_cmd);
-   LINK2GENERIC(glUniform1i_evgl_thread_cmd);
-   LINK2GENERIC(glUniform2f_evgl_thread_cmd);
-   LINK2GENERIC(glUniform2i_evgl_thread_cmd);
-   LINK2GENERIC(glUniform3f_evgl_thread_cmd);
-   LINK2GENERIC(glUniform3i_evgl_thread_cmd);
-   LINK2GENERIC(glUniform4f_evgl_thread_cmd);
-   LINK2GENERIC(glUniform4i_evgl_thread_cmd);
-   LINK2GENERIC(glUniform1fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform1iv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform2fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform2iv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform3fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform3iv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform4fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniform4iv_evgl_thread_cmd);
-   LINK2GENERIC(glUniformMatrix2fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniformMatrix3fv_evgl_thread_cmd);
-   LINK2GENERIC(glUniformMatrix4fv_evgl_thread_cmd);
-   LINK2GENERIC(glViewport_evgl_thread_cmd);
-   LINK2GENERIC(glEnable_evgl_thread_cmd);
-   LINK2GENERIC(glDisable_evgl_thread_cmd);
-   LINK2GENERIC(glLineWidth_evgl_thread_cmd);
-   LINK2GENERIC(glPolygonOffset_evgl_thread_cmd);
-   LINK2GENERIC(glPixelStorei_evgl_thread_cmd);
-   LINK2GENERIC(glActiveTexture_evgl_thread_cmd);
-   LINK2GENERIC(glGenTextures_evgl_thread_cmd);
-   LINK2GENERIC(glBindTexture_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteTextures_evgl_thread_cmd);
-   LINK2GENERIC(glTexImage2D_evgl_thread_cmd);
-   LINK2GENERIC(glTexSubImage2D_evgl_thread_cmd);
-   LINK2GENERIC(glCompressedTexImage2D_evgl_thread_cmd);
-   LINK2GENERIC(glCompressedTexSubImage2D_evgl_thread_cmd);
-   LINK2GENERIC(glTexParameterf_evgl_thread_cmd);
-   LINK2GENERIC(glTexParameterfv_evgl_thread_cmd);
-   LINK2GENERIC(glTexParameteri_evgl_thread_cmd);
-   LINK2GENERIC(glTexParameteriv_evgl_thread_cmd);
-   LINK2GENERIC(glScissor_evgl_thread_cmd);
-   LINK2GENERIC(glBlendFunc_evgl_thread_cmd);
-   LINK2GENERIC(glBlendColor_evgl_thread_cmd);
-   LINK2GENERIC(glDepthMask_evgl_thread_cmd);
-   LINK2GENERIC(glClear_evgl_thread_cmd);
-   LINK2GENERIC(glClearColor_evgl_thread_cmd);
-   LINK2GENERIC(glReadPixels_evgl_thread_cmd);
-   LINK2GENERIC(glGenFramebuffers_evgl_thread_cmd);
-   LINK2GENERIC(glBindFramebuffer_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteFramebuffers_evgl_thread_cmd);
-   LINK2GENERIC(glGetFramebufferAttachmentParameteriv_evgl_thread_cmd);
-   LINK2GENERIC(glGenRenderbuffers_evgl_thread_cmd);
-   LINK2GENERIC(glBindRenderbuffer_evgl_thread_cmd);
-   LINK2GENERIC(glDeleteRenderbuffers_evgl_thread_cmd);
-   LINK2GENERIC(glRenderbufferStorage_evgl_thread_cmd);
-   LINK2GENERIC(glFramebufferRenderbuffer_evgl_thread_cmd);
-   LINK2GENERIC(glFramebufferTexture2D_evgl_thread_cmd);
-   LINK2GENERIC(glCheckFramebufferStatus_evgl_thread_cmd);
-   LINK2GENERIC(glFlush_evgl_thread_cmd);
-   LINK2GENERIC(glFinish_evgl_thread_cmd);
-   LINK2GENERIC(glHint_evgl_thread_cmd);
-   LINK2GENERIC(glGetString_evgl_thread_cmd);
-   LINK2GENERIC(glGetBooleanv_evgl_thread_cmd);
-   LINK2GENERIC(glGetFloatv_evgl_thread_cmd);
-   LINK2GENERIC(glGetIntegerv_evgl_thread_cmd);
-   LINK2GENERIC(glIsBuffer_evgl_thread_cmd);
-   LINK2GENERIC(glGetBufferParameteriv_evgl_thread_cmd);
-   LINK2GENERIC(glIsShader_evgl_thread_cmd);
-   LINK2GENERIC(glGetShaderiv_evgl_thread_cmd);
-   LINK2GENERIC(glGetAttachedShaders_evgl_thread_cmd);
-   LINK2GENERIC(glGetShaderInfoLog_evgl_thread_cmd);
-   LINK2GENERIC(glGetShaderSource_evgl_thread_cmd);
-   LINK2GENERIC(glGetShaderPrecisionFormat_evgl_thread_cmd);
-   LINK2GENERIC(glGetVertexAttribfv_evgl_thread_cmd);
-   LINK2GENERIC(glGetVertexAttribiv_evgl_thread_cmd);
-   LINK2GENERIC(glIsProgram_evgl_thread_cmd);
-   LINK2GENERIC(glGetProgramInfoLog_evgl_thread_cmd);
-   LINK2GENERIC(glGetProgramiv_evgl_thread_cmd);
-   LINK2GENERIC(glIsFramebuffer_evgl_thread_cmd);
-   LINK2GENERIC(glIsRenderbuffer_evgl_thread_cmd);
-   LINK2GENERIC(glGetRenderbufferParameteriv_evgl_thread_cmd);
-   LINK2GENERIC(glIsTexture_evgl_thread_cmd);
-}
diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.h b/src/modules/evas/engines/gl_common/evas_gl_thread_evgl_link_generated.h
deleted file mode 100644 (file)
index 41bdc7b..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * This is an automatically generated file using a python script.
- * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
- * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
- * and make use of scripts if you need to fix them.
- */
-extern GLenum (*glGetError_evgl_thread_cmd)(void);
-extern void (*glVertexAttribPointer_evgl_thread_cmd)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-extern void (*glEnableVertexAttribArray_evgl_thread_cmd)(GLuint index);
-extern void (*glDisableVertexAttribArray_evgl_thread_cmd)(GLuint index);
-extern void (*glDrawArrays_evgl_thread_cmd)(GLenum mode, GLint first, GLsizei count);
-extern void (*glDrawElements_evgl_thread_cmd)(GLenum mode, GLsizei count, GLenum type, const void *indices);
-extern void (*glGenBuffers_evgl_thread_cmd)(GLsizei n, GLuint *buffers);
-extern void (*glDeleteBuffers_evgl_thread_cmd)(GLsizei n, const GLuint *buffers);
-extern void (*glBindBuffer_evgl_thread_cmd)(GLenum target, GLuint buffer);
-extern void (*glBufferData_evgl_thread_cmd)(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-extern GLuint (*glCreateShader_evgl_thread_cmd)(GLenum type);
-extern void (*glShaderSource_evgl_thread_cmd)(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
-extern void (*glCompileShader_evgl_thread_cmd)(GLuint shader);
-extern void (*glDeleteShader_evgl_thread_cmd)(GLuint shader);
-extern GLuint (*glCreateProgram_evgl_thread_cmd)(void);
-extern void (*glAttachShader_evgl_thread_cmd)(GLuint program, GLuint shader);
-extern void (*glDetachShader_evgl_thread_cmd)(GLuint program, GLuint shader);
-extern void (*glLinkProgram_evgl_thread_cmd)(GLuint program);
-extern void (*glUseProgram_evgl_thread_cmd)(GLuint program);
-extern void (*glDeleteProgram_evgl_thread_cmd)(GLuint program);
-extern void (*glGetProgramBinary_orig_evgl_set)(void *func);
-extern void *(*glGetProgramBinary_orig_evgl_get)(void);
-extern void (*glGetProgramBinary_evgl_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-extern void (*glProgramBinary_orig_evgl_set)(void *func);
-extern void *(*glProgramBinary_orig_evgl_get)(void);
-extern void (*glProgramBinary_evgl_thread_cmd)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-extern void (*glGetActiveAttrib_evgl_thread_cmd)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-extern GLint (*glGetAttribLocation_evgl_thread_cmd)(GLuint program, const GLchar *name);
-extern void (*glBindAttribLocation_evgl_thread_cmd)(GLuint program, GLuint index, const GLchar *name);
-extern GLint (*glGetUniformLocation_evgl_thread_cmd)(GLuint program, const GLchar *name);
-extern void (*glUniform1f_evgl_thread_cmd)(GLint location, GLfloat v0);
-extern void (*glUniform1i_evgl_thread_cmd)(GLint location, GLint v0);
-extern void (*glUniform2f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1);
-extern void (*glUniform2i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1);
-extern void (*glUniform3f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-extern void (*glUniform3i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2);
-extern void (*glUniform4f_evgl_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern void (*glUniform4i_evgl_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-extern void (*glUniform1fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform1iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform2fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform2iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform3fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform3iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform4fv_evgl_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform4iv_evgl_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniformMatrix2fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glUniformMatrix3fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glUniformMatrix4fv_evgl_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glViewport_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height);
-extern void (*glEnable_evgl_thread_cmd)(GLenum cap);
-extern void (*glDisable_evgl_thread_cmd)(GLenum cap);
-extern void (*glLineWidth_evgl_thread_cmd)(GLfloat width);
-extern void (*glPolygonOffset_evgl_thread_cmd)(GLfloat factor, GLfloat units);
-extern void (*glPixelStorei_evgl_thread_cmd)(GLenum pname, GLint param);
-extern void (*glActiveTexture_evgl_thread_cmd)(GLenum texture);
-extern void (*glGenTextures_evgl_thread_cmd)(GLsizei n, GLuint *textures);
-extern void (*glBindTexture_evgl_thread_cmd)(GLenum target, GLuint texture);
-extern void (*glDeleteTextures_evgl_thread_cmd)(GLsizei n, const GLuint *textures);
-extern void (*glTexImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-extern void (*glTexSubImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
-extern void (*glCompressedTexImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
-extern void (*glCompressedTexSubImage2D_evgl_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
-extern void (*glTexParameterf_evgl_thread_cmd)(GLenum target, GLenum pname, GLfloat param);
-extern void (*glTexParameterfv_evgl_thread_cmd)(GLenum target, GLenum pname, const GLfloat *params);
-extern void (*glTexParameteri_evgl_thread_cmd)(GLenum target, GLenum pname, GLint param);
-extern void (*glTexParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, const GLint *params);
-extern void (*glScissor_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height);
-extern void (*glBlendFunc_evgl_thread_cmd)(GLenum sfactor, GLenum dfactor);
-extern void (*glBlendColor_evgl_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-extern void (*glDepthMask_evgl_thread_cmd)(GLboolean flag);
-extern void (*glClear_evgl_thread_cmd)(GLbitfield mask);
-extern void (*glClearColor_evgl_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-extern void (*glReadPixels_evgl_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-extern void (*glGenFramebuffers_evgl_thread_cmd)(GLsizei n, GLuint *framebuffers);
-extern void (*glBindFramebuffer_evgl_thread_cmd)(GLenum target, GLuint framebuffer);
-extern void (*glDeleteFramebuffers_evgl_thread_cmd)(GLsizei n, const GLuint *framebuffers);
-extern void (*glGetFramebufferAttachmentParameteriv_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-extern void (*glGenRenderbuffers_evgl_thread_cmd)(GLsizei n, GLuint *renderbuffers);
-extern void (*glBindRenderbuffer_evgl_thread_cmd)(GLenum target, GLuint renderbuffer);
-extern void (*glDeleteRenderbuffers_evgl_thread_cmd)(GLsizei n, const GLuint *renderbuffers);
-extern void (*glRenderbufferStorage_evgl_thread_cmd)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-extern void (*glFramebufferRenderbuffer_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-extern void (*glFramebufferTexture2D_evgl_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-extern GLenum (*glCheckFramebufferStatus_evgl_thread_cmd)(GLenum target);
-extern void (*glFlush_evgl_thread_cmd)(void);
-extern void (*glFinish_evgl_thread_cmd)(void);
-extern void (*glHint_evgl_thread_cmd)(GLenum target, GLenum mode);
-extern const GLubyte * (*glGetString_evgl_thread_cmd)(GLenum name);
-extern void (*glGetBooleanv_evgl_thread_cmd)(GLenum pname, GLboolean *data);
-extern void (*glGetFloatv_evgl_thread_cmd)(GLenum pname, GLfloat *data);
-extern void (*glGetIntegerv_evgl_thread_cmd)(GLenum pname, GLint *data);
-extern GLboolean (*glIsBuffer_evgl_thread_cmd)(GLint buffer);
-extern void (*glGetBufferParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (*glIsShader_evgl_thread_cmd)(GLuint shader);
-extern void (*glGetShaderiv_evgl_thread_cmd)(GLuint shader, GLenum pname, GLint *params);
-extern void (*glGetAttachedShaders_evgl_thread_cmd)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
-extern void (*glGetShaderInfoLog_evgl_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-extern void (*glGetShaderSource_evgl_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-extern void (*glGetShaderPrecisionFormat_evgl_thread_cmd)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
-extern void (*glGetVertexAttribfv_evgl_thread_cmd)(GLuint index, GLenum pname, GLfloat *params);
-extern void (*glGetVertexAttribiv_evgl_thread_cmd)(GLuint index, GLenum pname, GLint *params);
-extern GLboolean (*glIsProgram_evgl_thread_cmd)(GLuint program);
-extern void (*glGetProgramInfoLog_evgl_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-extern void (*glGetProgramiv_evgl_thread_cmd)(GLuint program, GLenum pname, GLint *params);
-extern GLboolean (*glIsFramebuffer_evgl_thread_cmd)(GLint framebuffer);
-extern GLboolean (*glIsRenderbuffer_evgl_thread_cmd)(GLint renderbuffer);
-extern void (*glGetRenderbufferParameteriv_evgl_thread_cmd)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (*glIsTexture_evgl_thread_cmd)(GLint texture);
-
-
-extern void _gl_thread_link_evgl_generated_init();
index f4526a3..2ef54fb 100644 (file)
@@ -1,10 +1,20 @@
 #include "evas_gl_common.h"
 
+typedef struct
+{
+   void *(*gl_generated_func_get)(void);
+
+   void (*EVGL_TH_FN(glTexImage2DEVAS))(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+   void (*GL_TH_FN(glTexSubImage2DEVAS))(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+} Evas_GL_Thread_GL_Func;
 
 #ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
-#define GLSHADERSOURCE_COPY_VARIABLE GLchar **string_copied
-#define GLSHADERSOURCE_COPY_VARIABLE_FREE \
+#define GLSHADERSOURCE_VARIABLE_DECLARE \
+   GLchar **string_copied;
+
+#define GLSHADERSOURCE_GLCALL_BEFORE
+#define GLSHADERSOURCE_GLCALL_AFTER \
    if (thread_data->string_copied) \
      { \
         int i; \
         eina_mempool_free(_mp_default, thread_data->string_copied); \
      }
 
-#define GLSHADERSOURCE_COPY_VARIABLE_INIT \
+#define GLSHADERSOURCE_VARIABLE_INIT \
    thread_data->string_copied = NULL;
 
-#define GLSHADERSOURCE_COPY_TO_MEMPOOL \
+#define GLSHADERSOURCE_ASYNC_PREPARE \
    if (string) \
      { \
         /* 1. check memory size */ \
       thread_data->string = (const GLchar **)thread_data->string_copied; \
    }
 
+#define GLSHADERSOURCE_ENQUEUE_BEFORE
+#define GLSHADERSOURCE_ENQUEUE_AFTER
+
+/* Unpack Caches */
+static GLint   _cache_glPixelStorei_unpack_row_length = 0;
+static GLint   _cache_glPixelStorei_unpack_alignment  = 4;
+
+/* Buffer Cache */
+static GLuint  _cache_glBindBuffer_pixel_unpack_buffer_idx = 0;
+
+/*
+ * n : number of elements in a group (comp)
+ * l : number of groups in the row (width)
+ *     if   UNPACK_ROW_LENGTH is 0, l is width
+ *     else l = UNPACK_ROW_LENGTH
+ * a : value of UNPACK_ALIGNMENT (1,2,4, or 8)
+ * s : size, in units of GL ubytes, of an element (csize)
+ *
+ * if, (s >= a)
+ *    k = n * l
+ * else if (s < a)
+ *    k = (a / s) * ceil( (s * n * l)/a )
+ *
+ */
+
 static int
-get_size(GLenum format, GLenum type)
+get_size(GLenum format, GLenum type, GLsizei width, GLsizei height)
 {
-   int csize = 0, comp = 0;
+   int csize = 0, comp = 0, k =0;
+   int l = _cache_glPixelStorei_unpack_row_length;
+   int a = _cache_glPixelStorei_unpack_alignment;
+
+   if (l == 0) l = width;
+
    switch (type)
      {
 #ifdef GL_UNSIGNED_BYTE_3_3_2
@@ -186,35 +226,78 @@ get_size(GLenum format, GLenum type)
           }
      }
 
-   return csize * comp;
+//   if (csize >= a)
+//      k = comp * l;
+//   else /* csize < a */
+//      k = (a / csize) * ceil( (csize * comp * l) / a);
+//
+//   return k * height;
+
+  return csize * comp;
 }
 
+#define GLPIXELSTOREI_VARIABLE_DECLARE \
+   ;
+#define GLPIXELSTOREI_GLCALL_BEFORE
+#define GLPIXELSTOREI_GLCALL_AFTER
+#define GLPIXELSTOREI_VARIABLE_INIT
+#define GLPIXELSTOREI_ASYNC_PREPARE
+#define GLPIXELSTOREI_ENQUEUE_BEFORE \
+   switch (pname) \
+     { \
+        case GL_UNPACK_ROW_LENGTH: \
+         if (param >= 0) _cache_glPixelStorei_unpack_row_length = param; \
+         break; \
+        case GL_UNPACK_ALIGNMENT: \
+           if (param == 1 || param == 2 || param == 4 || param == 8) \
+              _cache_glPixelStorei_unpack_alignment = param; \
+           break; \
+     }
+
+#define GLPIXELSTOREI_ENQUEUE_AFTER
+
+#define GLBINDBUFFER_VARIABLE_DECLARE \
+   ;
+#define GLBINDBUFFER_GLCALL_BEFORE
+#define GLBINDBUFFER_GLCALL_AFTER
+#define GLBINDBUFFER_VARIABLE_INIT
+#define GLBINDBUFFER_ASYNC_PREPARE
+#define GLBINDBUFFER_ENQUEUE_BEFORE \
+   /* pixel unpack buffer id caching */ \
+   if (target == GL_PIXEL_UNPACK_BUFFER) \
+     { \
+        _cache_glBindBuffer_pixel_unpack_buffer_idx = buffer; \
+     }
+#define GLBINDBUFFER_ENQUEUE_AFTER
+
 
-#define GLTEXIMAGE2D_COPY_VARIABLE void *pixels_copied
-#define GLTEXIMAGE2D_COPY_VARIABLE_FREE \
+
+#define GLTEXIMAGE2D_VARIABLE_DECLARE \
+   void *pixels_copied;
+
+#define GLTEXIMAGE2D_GLCALL_BEFORE
+#define GLTEXIMAGE2D_GLCALL_AFTER \
    if (thread_data->pixels_copied) \
       eina_mempool_free(_mp_texture, thread_data->pixels_copied);
 
-#define GLTEXIMAGE2D_COPY_VARIABLE_INIT \
+#define GLTEXIMAGE2D_VARIABLE_INIT \
    thread_data->pixels_copied = NULL;
 
-#define GLTEXIMAGE2D_COPY_TO_MEMPOOL \
-   int size = get_size(format, type); \
-   if (size < 0) \
+#define GLTEXIMAGE2D_ASYNC_PREPARE \
+   /* 1. check pixel_ubpack_buffer_index */ \
+   if (_cache_glBindBuffer_pixel_unpack_buffer_idx == 0) \
+     { \
+       /* 2. check memory size */ \
+       int size = get_size(format, type, width + (border *2), height + (border *2)); \
+       int copy_size = (width + (border * 2)) * (height + (border * 2)) * size; \
+          if (size < 0 || copy_size < 0 || (unsigned int)copy_size > _mp_texture_memory_size) \
      { \
         thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
         goto finish; \
      } \
    if (pixels) \
      { \
-        /* 1. check memory size */ \
-        unsigned int copy_size = (width + (border * 2)) * (height + (border * 2)) * size; \
-        if (copy_size > _mp_texture_memory_size) \
-          { \
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
-             goto finish; \
-          } \
-        /* 2. malloc & copy */ \
+               /* 3. malloc & copy */ \
         thread_data->pixels_copied = eina_mempool_malloc(_mp_texture, copy_size); \
         if (thread_data->pixels_copied) \
           { \
@@ -227,34 +310,38 @@ get_size(GLenum format, GLenum type)
           } \
         /* 3. replace */ \
         thread_data->pixels = (const void *)thread_data->pixels_copied; \
+            } \
      }
 
+#define GLTEXIMAGE2D_ENQUEUE_BEFORE
+#define GLTEXIMAGE2D_ENQUEUE_AFTER
+
+#define GLTEXSUBIMAGE2D_VARIABLE_DECLARE \
+   void *pixels_copied;
 
-#define GLTEXSUBIMAGE2D_COPY_VARIABLE void *pixels_copied
-#define GLTEXSUBIMAGE2D_COPY_VARIABLE_FREE \
+#define GLTEXSUBIMAGE2D_GLCALL_BEFORE
+#define GLTEXSUBIMAGE2D_GLCALL_AFTER \
    if (thread_data->pixels_copied) \
       eina_mempool_free(_mp_texture, thread_data->pixels_copied);
 
-#define GLTEXSUBIMAGE2D_COPY_VARIABLE_INIT \
+#define GLTEXSUBIMAGE2D_VARIABLE_INIT \
    thread_data->pixels_copied = NULL;
 
-#define GLTEXSUBIMAGE2D_COPY_TO_MEMPOOL \
-   int size = get_size(format, type); \
-   if (size < 0) \
+#define GLTEXSUBIMAGE2D_ASYNC_PREPARE \
+   /* 1. check pixel_ubpack_buffer_index */ \
+   if (_cache_glBindBuffer_pixel_unpack_buffer_idx == 0) \
+     { \
+       /* 2. check memory size */ \
+       int size = get_size(format, type, width, height); \
+       int copy_size = width * height * size; \
+       if (size < 0 || copy_size < 0 || (unsigned int)copy_size > _mp_texture_memory_size) \
      { \
         thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
         goto finish; \
      } \
    if (pixels) \
      { \
-        /* 1. check memory size */ \
-        unsigned int copy_size = width * height * size; \
-        if (copy_size > _mp_texture_memory_size) \
-          { \
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
-             goto finish; \
-          } \
-        /* 2. malloc & copy */ \
+            /* 3. malloc & copy */ \
         thread_data->pixels_copied = eina_mempool_malloc(_mp_texture, copy_size); \
         if (thread_data->pixels_copied) \
           { \
@@ -265,28 +352,38 @@ get_size(GLenum format, GLenum type)
              thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
              goto finish; \
           } \
-        /* 3. replace */ \
+            /* 4. replace */ \
         thread_data->pixels = (const void *)thread_data->pixels_copied; \
+         } \
      }
 
-#define GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE void *data_copied
-#define GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_FREE \
+#define GLTEXSUBIMAGE2D_ENQUEUE_BEFORE
+#define GLTEXSUBIMAGE2D_ENQUEUE_AFTER
+
+#define GLCOMPRESSEDTEXIMAGE2D_VARIABLE_DECLARE \
+   void *data_copied;
+
+#define GLCOMPRESSEDTEXIMAGE2D_GLCALL_BEFORE
+#define GLCOMPRESSEDTEXIMAGE2D_GLCALL_AFTER \
    if (thread_data->data_copied) \
       eina_mempool_free(_mp_texture, thread_data->data_copied);
 
-#define GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_INIT \
+#define GLCOMPRESSEDTEXIMAGE2D_VARIABLE_INIT \
    thread_data->data_copied = NULL;
 
-#define GLCOMPRESSEDTEXIMAGE2D_COPY_TO_MEMPOOL \
-   if (data) \
+#define GLCOMPRESSEDTEXIMAGE2D_ASYNC_PREPARE \
+   /* 1. check pixel_ubpack_buffer_index */ \
+   if (_cache_glBindBuffer_pixel_unpack_buffer_idx == 0) \
      { \
-        /* 1. check memory size */ \
+        /* 2. check memory size */ \
         if ((unsigned int)imageSize > _mp_texture_memory_size) \
           { \
              thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
              goto finish; \
           } \
-        /* 2. malloc & copy */ \
+        if (data) \
+          { \
+             /* 3. malloc & copy */ \
         thread_data->data_copied = eina_mempool_malloc(_mp_texture, imageSize); \
         if (thread_data->data_copied) \
           { \
@@ -297,29 +394,38 @@ get_size(GLenum format, GLenum type)
              thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
              goto finish; \
           } \
-        /* 3. replace */ \
+             /* 4. replace */ \
         thread_data->data = (const void *)thread_data->data_copied; \
+          } \
      }
 
+#define GLCOMPRESSEDTEXIMAGE2D_ENQUEUE_BEFORE
+#define GLCOMPRESSEDTEXIMAGE2D_ENQUEUE_AFTER \
 
-#define GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE void *data_copied
-#define GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_FREE \
+#define GLCOMPRESSEDTEXSUBIMAGE2D_VARIABLE_DECLARE \
+   void *data_copied;
+
+#define GLCOMPRESSEDTEXSUBIMAGE2D_GLCALL_BEFORE
+#define GLCOMPRESSEDTEXSUBIMAGE2D_GLCALL_AFTER \
    if (thread_data->data_copied) \
       eina_mempool_free(_mp_texture, thread_data->data_copied);
 
-#define GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_INIT \
+#define GLCOMPRESSEDTEXSUBIMAGE2D_VARIABLE_INIT \
    thread_data->data_copied = NULL;
 
-#define GLCOMPRESSEDTEXSUBIMAGE2D_COPY_TO_MEMPOOL \
-   if (data) \
+#define GLCOMPRESSEDTEXSUBIMAGE2D_ASYNC_PREPARE \
+   /* 1. check pixel_ubpack_buffer_index */ \
+   if (_cache_glBindBuffer_pixel_unpack_buffer_idx == 0) \
      { \
-        /* 1. check memory size */ \
+        /* 2. check memory size */ \
         if ((unsigned int)imageSize > _mp_texture_memory_size) \
           { \
              thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
              goto finish; \
           } \
-        /* 2. malloc & copy */ \
+        if (data) \
+          { \
+             /* 3. malloc & copy */ \
         thread_data->data_copied = eina_mempool_malloc(_mp_texture, imageSize); \
         if (thread_data->data_copied) \
           { \
@@ -330,98 +436,80 @@ get_size(GLenum format, GLenum type)
              thread_mode = EVAS_GL_THREAD_MODE_FINISH; \
              goto finish; \
           } \
-        /* 3. replace */ \
+             /* 4. replace */ \
         thread_data->data = (const void *)thread_data->data_copied; \
+          } \
      }
 
+#define GLCOMPRESSEDTEXSUBIMAGE2D_ENQUEUE_BEFORE
+#define GLCOMPRESSEDTEXSUBIMAGE2D_ENQUEUE_AFTER
 
-#include "evas_gl_thread_gl_generated.c"
-#include "evas_gl_thread_evgl_generated.c"
-#include "evas_gl_thread_evgl_api_generated.c"
-
-EAPI void
-glTexImage2DEVAS_evgl_thread_cmd(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glTexImage2D thread_data_local;
-   EVGL_Thread_Command_glTexImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish() && !finish_mode)
-     { /* _flush */
-        EVGL_Thread_Command_glTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
 
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+#include "evas_gl_thread_gl_generated.c"
 
-   GLTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glTexImage2D,
-                              thread_data,
-                              thread_mode);
+void
+EVGL_TH_FN(glTexImage2DEVAS)(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+{
+  int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+  GL_TH_ST(glTexImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+  void *thcmd_ref;
+
+  if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_EVGL))
+    {
+      glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+      return;
+    }
+
+
+  thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_EVGL, sizeof(GL_TH_ST(glTexImage2D) *) + sizeof(GL_TH_ST(glTexImage2D)), &thcmd_ref);
+  *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexImage2D) *));
+  thread_data = *thread_data_ptr;
+
+  if (!evas_gl_thread_force_finish() && !finish_mode)
+    thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+  thread_data->target = target;
+  thread_data->level = level;
+  thread_data->internalformat = internalformat;
+  thread_data->width = width;
+  thread_data->height = height;
+  thread_data->format = format;
+  thread_data->type = type;
+  thread_data->pixels = pixels;
+  thread_data->orig_func = glTexImage2D;
+
+  GLTEXIMAGE2D_VARIABLE_INIT; /* TODO */
+
+  evas_gl_thread_cmd_enqueue(thcmd_ref,
+                             GL_TH_CB(glTexImage2D),
+                             thread_mode);
 }
 
-EAPI void
-glTexSubImage2DEVAS_thread_cmd(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+
+void
+GL_TH_FN(glTexSubImage2DEVAS)(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glTexSubImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
      {
         glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glTexSubImage2D thread_data_local;
-   Evas_Thread_Command_glTexSubImage2D *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(glTexSubImage2D) *) + sizeof(GL_TH_ST(glTexSubImage2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexSubImage2D) *));
+   thread_data = *thread_data_ptr;
 
    if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                               sizeof(Evas_Thread_Command_glTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
              thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
 
    thread_data->target = target;
    thread_data->level = level;
@@ -432,8 +520,9 @@ glTexSubImage2DEVAS_thread_cmd(int thread_push, GLenum target, GLint level, GLin
    thread_data->format = format;
    thread_data->type = type;
    thread_data->pixels = pixels;
+   thread_data->orig_func = glTexSubImage2D;
 
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
+   GLTEXSUBIMAGE2D_VARIABLE_INIT; /* TODO */
 
    if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
      goto finish;
@@ -445,38 +534,73 @@ glTexSubImage2DEVAS_thread_cmd(int thread_push, GLenum target, GLint level, GLin
      }
    else
      {
-        GLTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
+        GLTEXSUBIMAGE2D_ASYNC_PREPARE; /* TODO */
      }
 
 finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexSubImage2D,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexSubImage2D),
                               thread_mode);
 }
 
 
+
+static Evas_GL_Thread_GL_Func th_gl_func;
+Eina_Bool th_gl_func_initialized = EINA_FALSE;
+
+void *
+evas_gl_thread_gl_func_get(void)
+{
+   if (!th_gl_func_initialized)
+     {
+#define THREAD_FUNCTION_ASSIGN(func) th_gl_func.func = func;
+
+       THREAD_FUNCTION_ASSIGN(EVGL_TH_FN(glTexImage2DEVAS));
+       THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage2DEVAS));
+
+       THREAD_FUNCTION_ASSIGN(gl_generated_func_get);
+#undef THREAD_FUNCTION_ASSIGN
+
+        th_gl_func_initialized = EINA_TRUE;
+     }
+
+   return &th_gl_func;
+}
+
+
+
 #else  /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
 
 #include <dlfcn.h>
 #include "evas_gl_thread_gl_link_generated.c"
-#include "evas_gl_thread_evgl_link_generated.c"
 
-void (*glTexImage2DEVAS_evgl_thread_cmd)(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) = NULL;
-void (*glTexSubImage2DEVAS_thread_cmd)(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) = NULL;
+void (*EVGL_TH_FN(glTexImage2DEVAS))(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) = NULL;
+void (*GL_TH_FN(glTexSubImage2DEVAS))(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) = NULL;
 
 void
-_gl_thread_link_init()
+_gl_thread_link_init(void *func_ptr)
 {
-#define LINK2GENERIC(sym) \
-   sym = dlsym(RTLD_DEFAULT, #sym); \
-   if (!sym) ERR("Could not find function '%s'", #sym);
+   const Evas_GL_Thread_GL_Func *th_gl_func = func_ptr;
+
+   if (!th_gl_func)
+     {
+        ERR("Thread functions (GL BASE) are not exist");
+        return;
+     }
+
+#define THREAD_FUNCTION_ASSIGN(func) func = th_gl_func->func;
 
-   LINK2GENERIC(glGetError_thread_cmd);
+   THREAD_FUNCTION_ASSIGN(EVGL_TH_FN(glTexImage2DEVAS));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage2DEVAS));
+
+#undef THREAD_FUNCTION_ASSIGN
+
+   if (th_gl_func->gl_generated_func_get)
+      _gl_thread_link_gl_generated_init(th_gl_func->gl_generated_func_get());
+   else
+      ERR("Thread functions (GL-generated) are not exist");
 
-   _gl_thread_link_gl_generated_init();
-   _gl_thread_link_evgl_generated_init();
 }
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
index 242570c..86d4c87 100644 (file)
@@ -1,7 +1,40 @@
 #ifndef EVAS_GL_THREAD_GL_H
 #define EVAS_GL_THREAD_GL_H
 
-#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
+extern void *evas_gl_thread_gl_func_get(void);
+
+/* Declare Evas GL Types */
+typedef struct _Evas_GL               Evas_GL;
+typedef struct _Evas_GL_Surface       Evas_GL_Surface;
+typedef struct _Evas_GL_Context       Evas_GL_Context;
+typedef struct _Evas_GL_Config        Evas_GL_Config;
+typedef struct _Evas_GL_API           Evas_GL_API;
+typedef void                         *Evas_GL_Func;
+typedef void                         *EvasGLImage;
+
+typedef void                          GLvoid;
+typedef char                          GLchar;
+typedef unsigned int                  GLenum;
+typedef unsigned char                 GLboolean;
+typedef unsigned int                  GLbitfield;
+typedef signed char                   GLbyte;       // Changed khronos_int8_t
+typedef short                         GLshort;
+typedef int                           GLint;
+typedef int                           GLsizei;
+typedef unsigned char                 GLubyte;      // Changed khronos_uint8_t
+typedef unsigned short                GLushort;
+typedef unsigned int                  GLuint;
+typedef float                         GLfloat;      // Changed khronos_float_t
+typedef float                         GLclampf;     // Changed khronos_float_t
+typedef signed int                    GLfixed;      // Changed khronos_int32_t
+//typedef ptrdiff_t                     GLintptr;     // Changed khronos_intptr_t
+//typedef ptrdiff_t                     GLsizeiptr;   // Changed khronos_ssize_t
+typedef signed int                    GLclampx;     // Changed khronos_int32_t
+typedef struct __GLsync*              GLsync;
+typedef void *                        EvasGLSync;
+typedef unsigned long long            EvasGLTime;
+
+typedef void (*GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
 
 #ifndef TIZEN
 /* We should clear platform dependencies for Evas_GL.h */
@@ -9,52 +42,25 @@ typedef int64_t EvasGLint64;
 typedef uint64_t EvasGLuint64;
 #endif
 
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
+#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
 # include "evas_gl_thread_gl_generated.h"
-# include "evas_gl_thread_evgl_generated.h"
-# include "evas_gl_thread_evgl_api_generated.h"
 
-EAPI void
-glTexImage2DEVAS_evgl_thread_cmd(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-EAPI void
-glTexSubImage2DEVAS_thread_cmd(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+extern void EVGL_TH_FN(glTexImage2DEVAS)(int finish_mode, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+extern void GL_TH_FN(glTexSubImage2DEVAS)(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
 
 #else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
+/* compiled for GL backend */
 
 
 # include "evas_gl_thread_gl_link_generated.h"
-# include "evas_gl_thread_evgl_link_generated.h"
 
-extern void (*glTexImage2DEVAS_evgl_thread_cmd)(int finish_mode, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-extern void (*glTexSubImage2DEVAS_thread_cmd)(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+extern void (*EVGL_TH_FN(glTexImage2DEVAS))(int finish_mode, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+extern void (*GL_TH_FN(glTexSubImage2DEVAS))(int thread_push, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
 
-extern void _gl_thread_link_init();
+extern void _gl_thread_link_init(void *func_ptr);
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
+
 #endif /* EVAS_GL_THREAD_GL_H */
index 496e54f..3104526 100644 (file)
 /*
+ * ------------------------------------------------------------------------------
  * This is an automatically generated file using a python script.
  * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
  * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
  * and make use of scripts if you need to fix them.
+ * ------------------------------------------------------------------------------
  */
 
 /*
- * GLenum
- * glGetError(void);
+ * void
+ * glActiveTexture(GLenum texture);
  */
 
+typedef void(*GL_TH_FNTYPE(glActiveTexture))(GLenum texture);
+
 typedef struct
 {
-   GLenum return_value;
+   GL_TH_FNTYPE(glActiveTexture) orig_func;
+   GLenum texture;
 
-} Evas_Thread_Command_glGetError;
+} GL_TH_ST(glActiveTexture);
 
 static void
-_gl_thread_glGetError(void *data)
+GL_TH_CB(glActiveTexture)(void *data)
 {
-   Evas_Thread_Command_glGetError *thread_data =
-      (Evas_Thread_Command_glGetError *)data;
+   GL_TH_ST(glActiveTexture) *thread_data =
+      *(void **)data;
+
 
-   thread_data->return_value = glGetError();
+   ((GL_TH_FNTYPE(glActiveTexture))thread_data->orig_func)
+      (thread_data->texture);
 
 }
 
-EAPI GLenum
-glGetError_thread_cmd(void)
+void
+GL_TH_FN(glActiveTexture)(GL_TH_DP, GLenum texture)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glGetError();
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetError thread_data_local;
-   Evas_Thread_Command_glGetError *thread_data = &thread_data_local;
+   GL_TH_ST(glActiveTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetError,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glActiveTexture))orig_func)
+           (texture);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glActiveTexture) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->texture = texture;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glActiveTexture),
+                              thread_mode);
 }
 
 /*
  * void
- * glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+ * glAttachShader(GLuint program, GLuint shader);
  */
 
+typedef void(*GL_TH_FNTYPE(glAttachShader))(GLuint program, GLuint shader);
+
 typedef struct
 {
-   GLuint index;
-   GLint size;
-   GLenum type;
-   GLboolean normalized;
-   GLsizei stride;
-   const void *pointer;
+   GL_TH_FNTYPE(glAttachShader) orig_func;
+   GLuint program;
+   GLuint shader;
 
-} Evas_Thread_Command_glVertexAttribPointer;
+} GL_TH_ST(glAttachShader);
 
 static void
-_gl_thread_glVertexAttribPointer(void *data)
+GL_TH_CB(glAttachShader)(void *data)
 {
-   Evas_Thread_Command_glVertexAttribPointer *thread_data =
-      (Evas_Thread_Command_glVertexAttribPointer *)data;
+   GL_TH_ST(glAttachShader) *thread_data =
+      *(void **)data;
+
 
-   glVertexAttribPointer(thread_data->index,
-                         thread_data->size,
-                         thread_data->type,
-                         thread_data->normalized,
-                         thread_data->stride,
-                         thread_data->pointer);
+   ((GL_TH_FNTYPE(glAttachShader))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->shader);
 
 }
 
-EAPI void
-glVertexAttribPointer_thread_cmd(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)
+void
+GL_TH_FN(glAttachShader)(GL_TH_DP, GLuint program, GLuint shader)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glAttachShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glVertexAttribPointer(index, size, type, normalized, stride, pointer);
+        ((GL_TH_FNTYPE(glAttachShader))orig_func)
+           (program, shader);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glAttachShader) *) + sizeof(GL_TH_ST(glAttachShader)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glAttachShader) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glVertexAttribPointer thread_data_local;
-   Evas_Thread_Command_glVertexAttribPointer *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->index = index;
-   thread_data->size = size;
-   thread_data->type = type;
-   thread_data->normalized = normalized;
-   thread_data->stride = stride;
-   thread_data->pointer = pointer;
+   thread_data->program = program;
+   thread_data->shader = shader;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glVertexAttribPointer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glAttachShader),
                               thread_mode);
 }
 
 /*
  * void
- * glEnableVertexAttribArray(GLuint index);
+ * glBindAttribLocation(GLuint program, GLuint index, const char* name);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindAttribLocation))(GLuint program, GLuint index, const char* name);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glBindAttribLocation) orig_func;
+   GLuint program;
    GLuint index;
+   const char* name;
 
-} Evas_Thread_Command_glEnableVertexAttribArray;
+} GL_TH_ST(glBindAttribLocation);
 
 static void
-_gl_thread_glEnableVertexAttribArray(void *data)
+GL_TH_CB(glBindAttribLocation)(void *data)
 {
-   Evas_Thread_Command_glEnableVertexAttribArray *thread_data =
-      (Evas_Thread_Command_glEnableVertexAttribArray *)data;
+   GL_TH_ST(glBindAttribLocation) *thread_data =
+      *(void **)data;
+
 
-   glEnableVertexAttribArray(thread_data->index);
+   ((GL_TH_FNTYPE(glBindAttribLocation))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->index,
+       thread_data->name);
 
 }
 
-EAPI void
-glEnableVertexAttribArray_thread_cmd(GLuint index)
+void
+GL_TH_FN(glBindAttribLocation)(GL_TH_DP, GLuint program, GLuint index, const char* name)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindAttribLocation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glEnableVertexAttribArray(index);
+        ((GL_TH_FNTYPE(glBindAttribLocation))orig_func)
+           (program, index, name);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindAttribLocation) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glEnableVertexAttribArray thread_data_local;
-   Evas_Thread_Command_glEnableVertexAttribArray *thread_data = &thread_data_local;
-
+   thread_data->program = program;
    thread_data->index = index;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glEnableVertexAttribArray,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindAttribLocation),
                               thread_mode);
 }
 
 /*
  * void
- * glDisableVertexAttribArray(GLuint index);
+ * glBindBuffer(GLenum target, GLuint buffer);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindBuffer))(GLenum target, GLuint buffer);
+
 typedef struct
 {
-   GLuint index;
+   GL_TH_FNTYPE(glBindBuffer) orig_func;
+   GLenum target;
+   GLuint buffer;
 
-} Evas_Thread_Command_glDisableVertexAttribArray;
+} GL_TH_ST(glBindBuffer);
 
 static void
-_gl_thread_glDisableVertexAttribArray(void *data)
+GL_TH_CB(glBindBuffer)(void *data)
 {
-   Evas_Thread_Command_glDisableVertexAttribArray *thread_data =
-      (Evas_Thread_Command_glDisableVertexAttribArray *)data;
+   GL_TH_ST(glBindBuffer) *thread_data =
+      *(void **)data;
 
-   glDisableVertexAttribArray(thread_data->index);
+
+   ((GL_TH_FNTYPE(glBindBuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->buffer);
 
 }
 
-EAPI void
-glDisableVertexAttribArray_thread_cmd(GLuint index)
+void
+GL_TH_FN(glBindBuffer)(GL_TH_DP, GLenum target, GLuint buffer)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glDisableVertexAttribArray(index);
+        ((GL_TH_FNTYPE(glBindBuffer))orig_func)
+           (target, buffer);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glDisableVertexAttribArray thread_data_local;
-   Evas_Thread_Command_glDisableVertexAttribArray *thread_data = &thread_data_local;
-
-   thread_data->index = index;
+   thread_data->target = target;
+   thread_data->buffer = buffer;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDisableVertexAttribArray,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindBuffer),
                               thread_mode);
 }
 
 /*
  * void
- * glDrawArrays(GLenum mode, GLint first, GLsizei count);
+ * glBindFramebuffer(GLenum target, GLuint framebuffer);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindFramebuffer))(GLenum target, GLuint framebuffer);
+
 typedef struct
 {
-   GLenum mode;
-   GLint first;
-   GLsizei count;
+   GL_TH_FNTYPE(glBindFramebuffer) orig_func;
+   GLenum target;
+   GLuint framebuffer;
 
-} Evas_Thread_Command_glDrawArrays;
+} GL_TH_ST(glBindFramebuffer);
 
 static void
-_gl_thread_glDrawArrays(void *data)
+GL_TH_CB(glBindFramebuffer)(void *data)
 {
-   Evas_Thread_Command_glDrawArrays *thread_data =
-      (Evas_Thread_Command_glDrawArrays *)data;
+   GL_TH_ST(glBindFramebuffer) *thread_data =
+      *(void **)data;
 
-   glDrawArrays(thread_data->mode,
-                thread_data->first,
-                thread_data->count);
+
+   ((GL_TH_FNTYPE(glBindFramebuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->framebuffer);
 
 }
 
-EAPI void
-glDrawArrays_thread_cmd(GLenum mode, GLint first, GLsizei count)
+void
+GL_TH_FN(glBindFramebuffer)(GL_TH_DP, GLenum target, GLuint framebuffer)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindFramebuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glDrawArrays(mode, first, count);
+        ((GL_TH_FNTYPE(glBindFramebuffer))orig_func)
+           (target, framebuffer);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindFramebuffer) *) + sizeof(GL_TH_ST(glBindFramebuffer)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBindFramebuffer) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glDrawArrays thread_data_local;
-   Evas_Thread_Command_glDrawArrays *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->mode = mode;
-   thread_data->first = first;
-   thread_data->count = count;
+   thread_data->target = target;
+   thread_data->framebuffer = framebuffer;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDrawArrays,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindFramebuffer),
                               thread_mode);
 }
 
 /*
  * void
- * glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
+ * glBindRenderbuffer(GLenum target, GLuint renderbuffer);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindRenderbuffer))(GLenum target, GLuint renderbuffer);
+
 typedef struct
 {
-   GLenum mode;
-   GLsizei count;
-   GLenum type;
-   const void *indices;
+   GL_TH_FNTYPE(glBindRenderbuffer) orig_func;
+   GLenum target;
+   GLuint renderbuffer;
 
-} Evas_Thread_Command_glDrawElements;
+} GL_TH_ST(glBindRenderbuffer);
 
 static void
-_gl_thread_glDrawElements(void *data)
+GL_TH_CB(glBindRenderbuffer)(void *data)
 {
-   Evas_Thread_Command_glDrawElements *thread_data =
-      (Evas_Thread_Command_glDrawElements *)data;
+   GL_TH_ST(glBindRenderbuffer) *thread_data =
+      *(void **)data;
 
-   glDrawElements(thread_data->mode,
-                  thread_data->count,
-                  thread_data->type,
-                  thread_data->indices);
+
+   ((GL_TH_FNTYPE(glBindRenderbuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->renderbuffer);
 
 }
 
-EAPI void
-glDrawElements_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices)
+void
+GL_TH_FN(glBindRenderbuffer)(GL_TH_DP, GLenum target, GLuint renderbuffer)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindRenderbuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glDrawElements(mode, count, type, indices);
+        ((GL_TH_FNTYPE(glBindRenderbuffer))orig_func)
+           (target, renderbuffer);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindRenderbuffer) *) + sizeof(GL_TH_ST(glBindRenderbuffer)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBindRenderbuffer) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glDrawElements thread_data_local;
-   Evas_Thread_Command_glDrawElements *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->mode = mode;
-   thread_data->count = count;
-   thread_data->type = type;
-   thread_data->indices = indices;
+   thread_data->target = target;
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDrawElements,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindRenderbuffer),
                               thread_mode);
 }
 
 /*
  * void
- * glGenBuffers(GLsizei n, GLuint *buffers);
+ * glBindTexture(GLenum target, GLuint texture);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindTexture))(GLenum target, GLuint texture);
+
 typedef struct
 {
-   GLsizei n;
-   GLuint *buffers;
+   GL_TH_FNTYPE(glBindTexture) orig_func;
+   GLenum target;
+   GLuint texture;
 
-} Evas_Thread_Command_glGenBuffers;
+} GL_TH_ST(glBindTexture);
 
 static void
-_gl_thread_glGenBuffers(void *data)
+GL_TH_CB(glBindTexture)(void *data)
 {
-   Evas_Thread_Command_glGenBuffers *thread_data =
-      (Evas_Thread_Command_glGenBuffers *)data;
+   GL_TH_ST(glBindTexture) *thread_data =
+      *(void **)data;
 
-   glGenBuffers(thread_data->n,
-                thread_data->buffers);
+
+   ((GL_TH_FNTYPE(glBindTexture))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->texture);
 
 }
 
-EAPI void
-glGenBuffers_thread_cmd(GLsizei n, GLuint *buffers)
+void
+GL_TH_FN(glBindTexture)(GL_TH_DP, GLenum target, GLuint texture)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGenBuffers(n, buffers);
+        ((GL_TH_FNTYPE(glBindTexture))orig_func)
+           (target, texture);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindTexture) *) + sizeof(GL_TH_ST(glBindTexture)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBindTexture) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGenBuffers thread_data_local;
-   Evas_Thread_Command_glGenBuffers *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->n = n;
-   thread_data->buffers = buffers;
+   thread_data->target = target;
+   thread_data->texture = texture;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGenBuffers,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindTexture),
                               thread_mode);
 }
 
 /*
  * void
- * glDeleteBuffers(GLsizei n, const GLuint *buffers);
+ * glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendColor))(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+
 typedef struct
 {
-   GLsizei n;
-   const GLuint *buffers;
-   void *buffers_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glBlendColor) orig_func;
+   GLclampf red;
+   GLclampf green;
+   GLclampf blue;
+   GLclampf alpha;
 
-} Evas_Thread_Command_glDeleteBuffers;
+} GL_TH_ST(glBlendColor);
 
 static void
-_gl_thread_glDeleteBuffers(void *data)
+GL_TH_CB(glBlendColor)(void *data)
 {
-   Evas_Thread_Command_glDeleteBuffers *thread_data =
-      (Evas_Thread_Command_glDeleteBuffers *)data;
+   GL_TH_ST(glBlendColor) *thread_data =
+      *(void **)data;
 
-   glDeleteBuffers(thread_data->n,
-                   thread_data->buffers);
 
+   ((GL_TH_FNTYPE(glBlendColor))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
 
-   if (thread_data->buffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->buffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDeleteBuffers_thread_cmd(GLsizei n, const GLuint *buffers)
+void
+GL_TH_FN(glBlendColor)(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDeleteBuffers(n, buffers);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDeleteBuffers thread_data_local;
-   Evas_Thread_Command_glDeleteBuffers *thread_data = &thread_data_local;
+   GL_TH_ST(glBlendColor) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteBuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteBuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendColor))orig_func)
+           (red, green, blue, alpha);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendColor) *) + sizeof(GL_TH_ST(glBlendColor)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBlendColor) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->n = n;
-   thread_data->buffers = buffers;
-
-   thread_data->buffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   /* copy variable */
-   if (buffers)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->buffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->buffers_copied)
-          {
-             memcpy(thread_data->buffers_copied, buffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->buffers = (const GLuint  *)thread_data->buffers_copied;
-     }
-   /* end of copy variable */
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteBuffers,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendColor),
                               thread_mode);
 }
 
 /*
  * void
- * glBindBuffer(GLenum target, GLuint buffer);
+ * glBlendEquation(GLenum mode);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendEquation))(GLenum mode);
+
 typedef struct
 {
-   GLenum target;
-   GLuint buffer;
+   GL_TH_FNTYPE(glBlendEquation) orig_func;
+   GLenum mode;
 
-} Evas_Thread_Command_glBindBuffer;
+} GL_TH_ST(glBlendEquation);
 
 static void
-_gl_thread_glBindBuffer(void *data)
+GL_TH_CB(glBlendEquation)(void *data)
 {
-   Evas_Thread_Command_glBindBuffer *thread_data =
-      (Evas_Thread_Command_glBindBuffer *)data;
+   GL_TH_ST(glBlendEquation) *thread_data =
+      *(void **)data;
 
-   glBindBuffer(thread_data->target,
-                thread_data->buffer);
+
+   ((GL_TH_FNTYPE(glBlendEquation))thread_data->orig_func)
+      (thread_data->mode);
 
 }
 
-EAPI void
-glBindBuffer_thread_cmd(GLenum target, GLuint buffer)
+void
+GL_TH_FN(glBlendEquation)(GL_TH_DP, GLenum mode)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendEquation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glBindBuffer(target, buffer);
+        ((GL_TH_FNTYPE(glBlendEquation))orig_func)
+           (mode);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquation) *) + sizeof(GL_TH_ST(glBlendEquation)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBlendEquation) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glBindBuffer thread_data_local;
-   Evas_Thread_Command_glBindBuffer *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->target = target;
-   thread_data->buffer = buffer;
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBindBuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquation),
                               thread_mode);
 }
 
 /*
  * void
- * glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+ * glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendEquationSeparate))(GLenum modeRGB, GLenum modeAlpha);
+
 typedef struct
 {
-   GLenum target;
-   GLsizeiptr size;
-   const void *data;
-   GLenum usage;
+   GL_TH_FNTYPE(glBlendEquationSeparate) orig_func;
+   GLenum modeRGB;
+   GLenum modeAlpha;
 
-} Evas_Thread_Command_glBufferData;
+} GL_TH_ST(glBlendEquationSeparate);
 
 static void
-_gl_thread_glBufferData(void *data)
+GL_TH_CB(glBlendEquationSeparate)(void *data)
 {
-   Evas_Thread_Command_glBufferData *thread_data =
-      (Evas_Thread_Command_glBufferData *)data;
+   GL_TH_ST(glBlendEquationSeparate) *thread_data =
+      *(void **)data;
 
-   glBufferData(thread_data->target,
-                thread_data->size,
-                thread_data->data,
-                thread_data->usage);
+
+   ((GL_TH_FNTYPE(glBlendEquationSeparate))thread_data->orig_func)
+      (thread_data->modeRGB,
+       thread_data->modeAlpha);
 
 }
 
-EAPI void
-glBufferData_thread_cmd(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
+void
+GL_TH_FN(glBlendEquationSeparate)(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendEquationSeparate) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glBufferData(target, size, data, usage);
+        ((GL_TH_FNTYPE(glBlendEquationSeparate))orig_func)
+           (modeRGB, modeAlpha);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquationSeparate) *) + sizeof(GL_TH_ST(glBlendEquationSeparate)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBlendEquationSeparate) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glBufferData thread_data_local;
-   Evas_Thread_Command_glBufferData *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->target = target;
-   thread_data->size = size;
-   thread_data->data = data;
-   thread_data->usage = usage;
+   thread_data->modeRGB = modeRGB;
+   thread_data->modeAlpha = modeAlpha;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBufferData,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquationSeparate),
                               thread_mode);
 }
 
 /*
- * void *
- * glMapBuffer(GLenum target, GLenum access);
+ * void
+ * glBlendFunc(GLenum sfactor, GLenum dfactor);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendFunc))(GLenum sfactor, GLenum dfactor);
+
 typedef struct
 {
-   void * return_value;
-   GLenum target;
-   GLenum access;
-
-} Evas_Thread_Command_glMapBuffer;
+   GL_TH_FNTYPE(glBlendFunc) orig_func;
+   GLenum sfactor;
+   GLenum dfactor;
 
-void * (*orig_evas_glMapBuffer)(GLenum target, GLenum access);
+} GL_TH_ST(glBlendFunc);
 
-void
-glMapBuffer_orig_evas_set(void *func)
+static void
+GL_TH_CB(glBlendFunc)(void *data)
 {
-   orig_evas_glMapBuffer = func;
-}
+   GL_TH_ST(glBlendFunc) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendFunc))thread_data->orig_func)
+      (thread_data->sfactor,
+       thread_data->dfactor);
 
-void *
-glMapBuffer_orig_evas_get(void)
-{
-   return orig_evas_glMapBuffer;
 }
 
-static void
-_gl_thread_glMapBuffer(void *data)
+void
+GL_TH_FN(glBlendFunc)(GL_TH_DP, GLenum sfactor, GLenum dfactor)
 {
-   Evas_Thread_Command_glMapBuffer *thread_data =
-      (Evas_Thread_Command_glMapBuffer *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   thread_data->return_value = orig_evas_glMapBuffer(thread_data->target,
-                                                     thread_data->access);
+   GL_TH_ST(glBlendFunc) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void *
-glMapBuffer_thread_cmd(GLenum target, GLenum access)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glMapBuffer(target, access);
+        ((GL_TH_FNTYPE(glBlendFunc))orig_func)
+           (sfactor, dfactor);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendFunc) *) + sizeof(GL_TH_ST(glBlendFunc)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBlendFunc) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   Evas_Thread_Command_glMapBuffer thread_data_local;
-   Evas_Thread_Command_glMapBuffer *thread_data = &thread_data_local;
+   thread_data->sfactor = sfactor;
+   thread_data->dfactor = dfactor;
+   thread_data->orig_func = orig_func;
 
-   thread_data->target = target;
-   thread_data->access = access;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glMapBuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendFunc),
                               thread_mode);
-
-   return thread_data->return_value;
 }
 
 /*
- * GLboolean
- * glUnmapBuffer(GLenum target);
+ * void
+ * glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendFuncSeparate))(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLenum target;
-
-} Evas_Thread_Command_glUnmapBuffer;
+   GL_TH_FNTYPE(glBlendFuncSeparate) orig_func;
+   GLenum srcRGB;
+   GLenum dstRGB;
+   GLenum srcAlpha;
+   GLenum dstAlpha;
 
-GLboolean (*orig_evas_glUnmapBuffer)(GLenum target);
+} GL_TH_ST(glBlendFuncSeparate);
 
-void
-glUnmapBuffer_orig_evas_set(void *func)
+static void
+GL_TH_CB(glBlendFuncSeparate)(void *data)
 {
-   orig_evas_glUnmapBuffer = func;
-}
+   GL_TH_ST(glBlendFuncSeparate) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendFuncSeparate))thread_data->orig_func)
+      (thread_data->srcRGB,
+       thread_data->dstRGB,
+       thread_data->srcAlpha,
+       thread_data->dstAlpha);
 
-void *
-glUnmapBuffer_orig_evas_get(void)
-{
-   return orig_evas_glUnmapBuffer;
 }
 
-static void
-_gl_thread_glUnmapBuffer(void *data)
+void
+GL_TH_FN(glBlendFuncSeparate)(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
-   Evas_Thread_Command_glUnmapBuffer *thread_data =
-      (Evas_Thread_Command_glUnmapBuffer *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   thread_data->return_value = orig_evas_glUnmapBuffer(thread_data->target);
+   GL_TH_ST(glBlendFuncSeparate) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI GLboolean
-glUnmapBuffer_thread_cmd(GLenum target)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glUnmapBuffer(target);
+        ((GL_TH_FNTYPE(glBlendFuncSeparate))orig_func)
+           (srcRGB, dstRGB, srcAlpha, dstAlpha);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendFuncSeparate) *) + sizeof(GL_TH_ST(glBlendFuncSeparate)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBlendFuncSeparate) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glUnmapBuffer thread_data_local;
-   Evas_Thread_Command_glUnmapBuffer *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->target = target;
+   thread_data->srcRGB = srcRGB;
+   thread_data->dstRGB = dstRGB;
+   thread_data->srcAlpha = srcAlpha;
+   thread_data->dstAlpha = dstAlpha;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUnmapBuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendFuncSeparate),
                               thread_mode);
-
-   return thread_data->return_value;
 }
 
 /*
- * GLuint
- * glCreateShader(GLenum type);
+ * void
+ * glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
  */
 
+typedef void(*GL_TH_FNTYPE(glBufferData))(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+
 typedef struct
 {
-   GLuint return_value;
-   GLenum type;
+   GL_TH_FNTYPE(glBufferData) orig_func;
+   GLenum target;
+   GLsizeiptr size;
+   const void* data;
+   GLenum usage;
 
-} Evas_Thread_Command_glCreateShader;
+} GL_TH_ST(glBufferData);
 
 static void
-_gl_thread_glCreateShader(void *data)
+GL_TH_CB(glBufferData)(void *data)
 {
-   Evas_Thread_Command_glCreateShader *thread_data =
-      (Evas_Thread_Command_glCreateShader *)data;
+   GL_TH_ST(glBufferData) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glCreateShader(thread_data->type);
+
+   ((GL_TH_FNTYPE(glBufferData))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->size,
+       thread_data->data,
+       thread_data->usage);
 
 }
 
-EAPI GLuint
-glCreateShader_thread_cmd(GLenum type)
+void
+GL_TH_FN(glBufferData)(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glCreateShader(type);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glCreateShader thread_data_local;
-   Evas_Thread_Command_glCreateShader *thread_data = &thread_data_local;
+   GL_TH_ST(glBufferData) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->type = type;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCreateShader,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBufferData))orig_func)
+           (target, size, data, usage);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBufferData) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->target = target;
+   thread_data->size = size;
+   thread_data->data = data;
+   thread_data->usage = usage;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBufferData),
+                              thread_mode);
 }
 
 /*
  * void
- * glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
+ * glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
  */
 
+typedef void(*GL_TH_FNTYPE(glBufferSubData))(GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+
 typedef struct
 {
-   GLuint shader;
-   GLsizei count;
-   const GLchar **string;
-   const GLint *length;
-   int command_allocated;
-   GLSHADERSOURCE_COPY_VARIABLE; /* TODO */
+   GL_TH_FNTYPE(glBufferSubData) orig_func;
+   GLenum target;
+   GLintptr offset;
+   GLsizeiptr size;
+   const void* data;
 
-} Evas_Thread_Command_glShaderSource;
+} GL_TH_ST(glBufferSubData);
 
 static void
-_gl_thread_glShaderSource(void *data)
+GL_TH_CB(glBufferSubData)(void *data)
 {
-   Evas_Thread_Command_glShaderSource *thread_data =
-      (Evas_Thread_Command_glShaderSource *)data;
+   GL_TH_ST(glBufferSubData) *thread_data =
+      *(void **)data;
 
-   glShaderSource(thread_data->shader,
-                  thread_data->count,
-                  thread_data->string,
-                  thread_data->length);
 
-   GLSHADERSOURCE_COPY_VARIABLE_FREE; /* TODO */
+   ((GL_TH_FNTYPE(glBufferSubData))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->offset,
+       thread_data->size,
+       thread_data->data);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glShaderSource_thread_cmd(GLuint shader, GLsizei count, const GLchar **string, const GLint *length)
+void
+GL_TH_FN(glBufferSubData)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glShaderSource(shader, count, string, length);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glShaderSource thread_data_local;
-   Evas_Thread_Command_glShaderSource *thread_data = &thread_data_local;
+   GL_TH_ST(glBufferSubData) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glShaderSource *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glShaderSource));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBufferSubData))orig_func)
+           (target, offset, size, data);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBufferSubData) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->shader = shader;
-   thread_data->count = count;
-   thread_data->string = string;
-   thread_data->length = length;
-
-   GLSHADERSOURCE_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLSHADERSOURCE_COPY_TO_MEMPOOL; /* TODO */
+   thread_data->target = target;
+   thread_data->offset = offset;
+   thread_data->size = size;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glShaderSource,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBufferSubData),
                               thread_mode);
 }
 
 /*
- * void
- * glCompileShader(GLuint shader);
+ * GLenum
+ * glCheckFramebufferStatus(GLenum target);
  */
 
+typedef GLenum(*GL_TH_FNTYPE(glCheckFramebufferStatus))(GLenum target);
+
 typedef struct
 {
-   GLuint shader;
-   int command_allocated;
+   GL_TH_FNTYPE(glCheckFramebufferStatus) orig_func;
+   GLenum return_value;
+   GLenum target;
 
-} Evas_Thread_Command_glCompileShader;
+} GL_TH_ST(glCheckFramebufferStatus);
 
 static void
-_gl_thread_glCompileShader(void *data)
+GL_TH_CB(glCheckFramebufferStatus)(void *data)
 {
-   Evas_Thread_Command_glCompileShader *thread_data =
-      (Evas_Thread_Command_glCompileShader *)data;
+   GL_TH_ST(glCheckFramebufferStatus) *thread_data =
+      *(void **)data;
+
 
-   glCompileShader(thread_data->shader);
+   thread_data->return_value = ((GL_TH_FNTYPE(glCheckFramebufferStatus))thread_data->orig_func)
+      (thread_data->target);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glCompileShader_thread_cmd(GLuint shader)
+GLenum
+GL_TH_FN(glCheckFramebufferStatus)(GL_TH_DP, GLenum target)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glCompileShader(shader);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glCompileShader thread_data_local;
-   Evas_Thread_Command_glCompileShader *thread_data = &thread_data_local;
+   GL_TH_ST(glCheckFramebufferStatus) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glCompileShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glCompileShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glCheckFramebufferStatus))orig_func)
+           (target);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCheckFramebufferStatus) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->shader = shader;
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCompileShader,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCheckFramebufferStatus),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
  * void
- * glReleaseShaderCompiler(void);
+ * glClear(GLbitfield mask);
  */
 
-void (*orig_evas_glReleaseShaderCompiler)(void);
+typedef void(*GL_TH_FNTYPE(glClear))(GLbitfield mask);
 
-void
-glReleaseShaderCompiler_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glReleaseShaderCompiler = func;
-}
+   GL_TH_FNTYPE(glClear) orig_func;
+   GLbitfield mask;
 
-void *
-glReleaseShaderCompiler_orig_evas_get(void)
-{
-   return orig_evas_glReleaseShaderCompiler;
-}
+} GL_TH_ST(glClear);
 
 static void
-_gl_thread_glReleaseShaderCompiler(void *data EINA_UNUSED)
+GL_TH_CB(glClear)(void *data)
 {
-   orig_evas_glReleaseShaderCompiler();
+   GL_TH_ST(glClear) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClear))thread_data->orig_func)
+      (thread_data->mask);
 
 }
 
-EAPI void
-glReleaseShaderCompiler_thread_cmd(void)
+void
+GL_TH_FN(glClear)(GL_TH_DP, GLbitfield mask)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClear) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glReleaseShaderCompiler();
+        ((GL_TH_FNTYPE(glClear))orig_func)
+           (mask);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClear) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glReleaseShaderCompiler,
-                              NULL,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClear),
                               thread_mode);
 }
 
 /*
  * void
- * glDeleteShader(GLuint shader);
+ * glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glClearColor))(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+
 typedef struct
 {
-   GLuint shader;
-   int command_allocated;
+   GL_TH_FNTYPE(glClearColor) orig_func;
+   GLclampf red;
+   GLclampf green;
+   GLclampf blue;
+   GLclampf alpha;
 
-} Evas_Thread_Command_glDeleteShader;
+} GL_TH_ST(glClearColor);
 
 static void
-_gl_thread_glDeleteShader(void *data)
+GL_TH_CB(glClearColor)(void *data)
 {
-   Evas_Thread_Command_glDeleteShader *thread_data =
-      (Evas_Thread_Command_glDeleteShader *)data;
+   GL_TH_ST(glClearColor) *thread_data =
+      *(void **)data;
+
 
-   glDeleteShader(thread_data->shader);
+   ((GL_TH_FNTYPE(glClearColor))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDeleteShader_thread_cmd(GLuint shader)
+void
+GL_TH_FN(glClearColor)(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDeleteShader(shader);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDeleteShader thread_data_local;
-   Evas_Thread_Command_glDeleteShader *thread_data = &thread_data_local;
+   GL_TH_ST(glClearColor) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearColor))orig_func)
+           (red, green, blue, alpha);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearColor) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->shader = shader;
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteShader,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearColor),
                               thread_mode);
 }
 
 /*
- * GLuint
- * glCreateProgram(void);
+ * void
+ * glClearDepthf(GLclampf depth);
  */
 
+typedef void(*GL_TH_FNTYPE(glClearDepthf))(GLclampf depth);
+
 typedef struct
 {
-   GLuint return_value;
+   GL_TH_FNTYPE(glClearDepthf) orig_func;
+   GLclampf depth;
 
-} Evas_Thread_Command_glCreateProgram;
+} GL_TH_ST(glClearDepthf);
 
 static void
-_gl_thread_glCreateProgram(void *data)
+GL_TH_CB(glClearDepthf)(void *data)
 {
-   Evas_Thread_Command_glCreateProgram *thread_data =
-      (Evas_Thread_Command_glCreateProgram *)data;
+   GL_TH_ST(glClearDepthf) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glCreateProgram();
+
+   ((GL_TH_FNTYPE(glClearDepthf))thread_data->orig_func)
+      (thread_data->depth);
 
 }
 
-EAPI GLuint
-glCreateProgram_thread_cmd(void)
+void
+GL_TH_FN(glClearDepthf)(GL_TH_DP, GLclampf depth)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glCreateProgram();
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glCreateProgram thread_data_local;
-   Evas_Thread_Command_glCreateProgram *thread_data = &thread_data_local;
+   GL_TH_ST(glClearDepthf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCreateProgram,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearDepthf))orig_func)
+           (depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearDepthf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearDepthf),
+                              thread_mode);
 }
 
 /*
  * void
- * glAttachShader(GLuint program, GLuint shader);
+ * glClearStencil(GLint s);
  */
 
+typedef void(*GL_TH_FNTYPE(glClearStencil))(GLint s);
+
 typedef struct
 {
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
+   GL_TH_FNTYPE(glClearStencil) orig_func;
+   GLint s;
 
-} Evas_Thread_Command_glAttachShader;
+} GL_TH_ST(glClearStencil);
 
 static void
-_gl_thread_glAttachShader(void *data)
+GL_TH_CB(glClearStencil)(void *data)
 {
-   Evas_Thread_Command_glAttachShader *thread_data =
-      (Evas_Thread_Command_glAttachShader *)data;
+   GL_TH_ST(glClearStencil) *thread_data =
+      *(void **)data;
 
-   glAttachShader(thread_data->program,
-                  thread_data->shader);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glClearStencil))thread_data->orig_func)
+      (thread_data->s);
+
 }
 
-EAPI void
-glAttachShader_thread_cmd(GLuint program, GLuint shader)
+void
+GL_TH_FN(glClearStencil)(GL_TH_DP, GLint s)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glAttachShader(program, shader);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glAttachShader thread_data_local;
-   Evas_Thread_Command_glAttachShader *thread_data = &thread_data_local;
+   GL_TH_ST(glClearStencil) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glAttachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glAttachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearStencil))orig_func)
+           (s);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearStencil) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->program = program;
-   thread_data->shader = shader;
+   thread_data->s = s;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glAttachShader,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearStencil),
                               thread_mode);
 }
 
 /*
  * void
- * glDetachShader(GLuint program, GLuint shader);
+ * glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glColorMask))(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+
 typedef struct
 {
-   GLuint program;
-   GLuint shader;
-   int command_allocated;
+   GL_TH_FNTYPE(glColorMask) orig_func;
+   GLboolean red;
+   GLboolean green;
+   GLboolean blue;
+   GLboolean alpha;
 
-} Evas_Thread_Command_glDetachShader;
+} GL_TH_ST(glColorMask);
 
 static void
-_gl_thread_glDetachShader(void *data)
+GL_TH_CB(glColorMask)(void *data)
 {
-   Evas_Thread_Command_glDetachShader *thread_data =
-      (Evas_Thread_Command_glDetachShader *)data;
+   GL_TH_ST(glColorMask) *thread_data =
+      *(void **)data;
+
 
-   glDetachShader(thread_data->program,
-                  thread_data->shader);
+   ((GL_TH_FNTYPE(glColorMask))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDetachShader_thread_cmd(GLuint program, GLuint shader)
+void
+GL_TH_FN(glColorMask)(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDetachShader(program, shader);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDetachShader thread_data_local;
-   Evas_Thread_Command_glDetachShader *thread_data = &thread_data_local;
+   GL_TH_ST(glColorMask) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDetachShader *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDetachShader));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColorMask))orig_func)
+           (red, green, blue, alpha);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColorMask) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->program = program;
-   thread_data->shader = shader;
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDetachShader,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColorMask),
                               thread_mode);
 }
 
 /*
  * void
- * glLinkProgram(GLuint program);
+ * glCompileShader(GLuint shader);
  */
 
+typedef void(*GL_TH_FNTYPE(glCompileShader))(GLuint shader);
+
 typedef struct
 {
-   GLuint program;
-   int command_allocated;
+   GL_TH_FNTYPE(glCompileShader) orig_func;
+   GLuint shader;
 
-} Evas_Thread_Command_glLinkProgram;
+} GL_TH_ST(glCompileShader);
 
 static void
-_gl_thread_glLinkProgram(void *data)
+GL_TH_CB(glCompileShader)(void *data)
 {
-   Evas_Thread_Command_glLinkProgram *thread_data =
-      (Evas_Thread_Command_glLinkProgram *)data;
+   GL_TH_ST(glCompileShader) *thread_data =
+      *(void **)data;
+
 
-   glLinkProgram(thread_data->program);
+   ((GL_TH_FNTYPE(glCompileShader))thread_data->orig_func)
+      (thread_data->shader);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glLinkProgram_thread_cmd(GLuint program)
+void
+GL_TH_FN(glCompileShader)(GL_TH_DP, GLuint shader)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glLinkProgram(program);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glLinkProgram thread_data_local;
-   Evas_Thread_Command_glLinkProgram *thread_data = &thread_data_local;
+   GL_TH_ST(glCompileShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glLinkProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glLinkProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCompileShader))orig_func)
+           (shader);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompileShader) *) + sizeof(GL_TH_ST(glCompileShader)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glCompileShader) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->program = program;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->shader = shader;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glLinkProgram,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompileShader),
                               thread_mode);
 }
 
 /*
  * void
- * glUseProgram(GLuint program);
+ * glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
  */
 
+typedef void(*GL_TH_FNTYPE(glCompressedTexImage2D))(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+
 typedef struct
 {
-   GLuint program;
-   int command_allocated;
+   GL_TH_FNTYPE(glCompressedTexImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLint border;
+   GLsizei imageSize;
+   const void* data;
+   GLCOMPRESSEDTEXIMAGE2D_VARIABLE_DECLARE /* TODO */
 
-} Evas_Thread_Command_glUseProgram;
+} GL_TH_ST(glCompressedTexImage2D);
 
 static void
-_gl_thread_glUseProgram(void *data)
+GL_TH_CB(glCompressedTexImage2D)(void *data)
 {
-   Evas_Thread_Command_glUseProgram *thread_data =
-      (Evas_Thread_Command_glUseProgram *)data;
+   GL_TH_ST(glCompressedTexImage2D) *thread_data =
+      *(void **)data;
+
+
+   GLCOMPRESSEDTEXIMAGE2D_GLCALL_BEFORE; /* TODO */
 
-   glUseProgram(thread_data->program);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glCompressedTexImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->border,
+       thread_data->imageSize,
+       thread_data->data);
+
+   GLCOMPRESSEDTEXIMAGE2D_GLCALL_AFTER; /* TODO */
+
 }
 
-EAPI void
-glUseProgram_thread_cmd(GLuint program)
+void
+GL_TH_FN(glCompressedTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUseProgram(program);
+        ((GL_TH_FNTYPE(glCompressedTexImage2D))orig_func)
+           (target, level, internalformat, width, height, border, imageSize, data);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexImage2D) *) + sizeof(GL_TH_ST(glCompressedTexImage2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glCompressedTexImage2D) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->border = border;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
 
-   Evas_Thread_Command_glUseProgram thread_data_local;
-   Evas_Thread_Command_glUseProgram *thread_data = &thread_data_local;
+   GLCOMPRESSEDTEXIMAGE2D_VARIABLE_INIT; /* TODO */
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUseProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUseProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+   GLCOMPRESSEDTEXIMAGE2D_ASYNC_PREPARE; /* TODO */
 
-   thread_data->program = program;
+finish:
+   GLCOMPRESSEDTEXIMAGE2D_ENQUEUE_BEFORE; /* TODO */
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUseProgram,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexImage2D),
                               thread_mode);
+
+   GLCOMPRESSEDTEXIMAGE2D_ENQUEUE_AFTER; /* TODO */
 }
 
 /*
  * void
- * glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ * glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
  */
 
+typedef void(*GL_TH_FNTYPE(glCompressedTexSubImage2D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+
 typedef struct
 {
-   GLuint program;
-   GLenum pname;
-   GLint value;
-   int command_allocated;
-
-} Evas_Thread_Command_glProgramParameteri;
+   GL_TH_FNTYPE(glCompressedTexSubImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLsizei width;
+   GLsizei height;
+   GLenum format;
+   GLsizei imageSize;
+   const void* data;
+   GLCOMPRESSEDTEXSUBIMAGE2D_VARIABLE_DECLARE /* TODO */
 
-void (*orig_evas_glProgramParameteri)(GLuint program, GLenum pname, GLint value);
+} GL_TH_ST(glCompressedTexSubImage2D);
 
-void
-glProgramParameteri_orig_evas_set(void *func)
+static void
+GL_TH_CB(glCompressedTexSubImage2D)(void *data)
 {
-   orig_evas_glProgramParameteri = func;
-}
+   GL_TH_ST(glCompressedTexSubImage2D) *thread_data =
+      *(void **)data;
 
-void *
-glProgramParameteri_orig_evas_get(void)
-{
-   return orig_evas_glProgramParameteri;
-}
 
-static void
-_gl_thread_glProgramParameteri(void *data)
-{
-   Evas_Thread_Command_glProgramParameteri *thread_data =
-      (Evas_Thread_Command_glProgramParameteri *)data;
+   GLCOMPRESSEDTEXSUBIMAGE2D_GLCALL_BEFORE; /* TODO */
+
 
-   orig_evas_glProgramParameteri(thread_data->program,
-                                 thread_data->pname,
-                                 thread_data->value);
+   ((GL_TH_FNTYPE(glCompressedTexSubImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->format,
+       thread_data->imageSize,
+       thread_data->data);
+
+   GLCOMPRESSEDTEXSUBIMAGE2D_GLCALL_AFTER; /* TODO */
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glProgramParameteri_thread_cmd(GLuint program, GLenum pname, GLint value)
+void
+GL_TH_FN(glCompressedTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexSubImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glProgramParameteri(program, pname, value);
+        ((GL_TH_FNTYPE(glCompressedTexSubImage2D))orig_func)
+           (target, level, xoffset, yoffset, width, height, format, imageSize, data);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexSubImage2D) *) + sizeof(GL_TH_ST(glCompressedTexSubImage2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glCompressedTexSubImage2D) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->format = format;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
 
-   Evas_Thread_Command_glProgramParameteri thread_data_local;
-   Evas_Thread_Command_glProgramParameteri *thread_data = &thread_data_local;
+   GLCOMPRESSEDTEXSUBIMAGE2D_VARIABLE_INIT; /* TODO */
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glProgramParameteri *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glProgramParameteri));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+   GLCOMPRESSEDTEXSUBIMAGE2D_ASYNC_PREPARE; /* TODO */
 
-   thread_data->program = program;
-   thread_data->pname = pname;
-   thread_data->value = value;
+finish:
+   GLCOMPRESSEDTEXSUBIMAGE2D_ENQUEUE_BEFORE; /* TODO */
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glProgramParameteri,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexSubImage2D),
                               thread_mode);
+
+   GLCOMPRESSEDTEXSUBIMAGE2D_ENQUEUE_AFTER; /* TODO */
 }
 
 /*
  * void
- * glDeleteProgram(GLuint program);
+ * glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
  */
 
+typedef void(*GL_TH_FNTYPE(glCopyTexImage2D))(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+
 typedef struct
 {
-   GLuint program;
-   int command_allocated;
+   GL_TH_FNTYPE(glCopyTexImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum internalformat;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+   GLint border;
 
-} Evas_Thread_Command_glDeleteProgram;
+} GL_TH_ST(glCopyTexImage2D);
 
 static void
-_gl_thread_glDeleteProgram(void *data)
+GL_TH_CB(glCopyTexImage2D)(void *data)
 {
-   Evas_Thread_Command_glDeleteProgram *thread_data =
-      (Evas_Thread_Command_glDeleteProgram *)data;
+   GL_TH_ST(glCopyTexImage2D) *thread_data =
+      *(void **)data;
 
-   glDeleteProgram(thread_data->program);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glCopyTexImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height,
+       thread_data->border);
+
 }
 
-EAPI void
-glDeleteProgram_thread_cmd(GLuint program)
+void
+GL_TH_FN(glCopyTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDeleteProgram(program);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDeleteProgram thread_data_local;
-   Evas_Thread_Command_glDeleteProgram *thread_data = &thread_data_local;
+   GL_TH_ST(glCopyTexImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteProgram *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteProgram));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyTexImage2D))orig_func)
+           (target, level, internalformat, x, y, width, height, border);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyTexImage2D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->program = program;
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->border = border;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteProgram,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyTexImage2D),
                               thread_mode);
 }
 
 /*
  * void
- * glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ * glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
  */
 
+typedef void(*GL_TH_FNTYPE(glCopyTexSubImage2D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
 typedef struct
 {
-   GLuint program;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLenum *binaryFormat;
-   void *binary;
-
-} Evas_Thread_Command_glGetProgramBinary;
+   GL_TH_FNTYPE(glCopyTexSubImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
 
-void (*orig_evas_glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+} GL_TH_ST(glCopyTexSubImage2D);
 
-void
-glGetProgramBinary_orig_evas_set(void *func)
+static void
+GL_TH_CB(glCopyTexSubImage2D)(void *data)
 {
-   orig_evas_glGetProgramBinary = func;
-}
+   GL_TH_ST(glCopyTexSubImage2D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCopyTexSubImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
 
-void *
-glGetProgramBinary_orig_evas_get(void)
-{
-   return orig_evas_glGetProgramBinary;
 }
 
-static void
-_gl_thread_glGetProgramBinary(void *data)
+void
+GL_TH_FN(glCopyTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
 {
-   Evas_Thread_Command_glGetProgramBinary *thread_data =
-      (Evas_Thread_Command_glGetProgramBinary *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   orig_evas_glGetProgramBinary(thread_data->program,
-                                thread_data->bufSize,
-                                thread_data->length,
-                                thread_data->binaryFormat,
-                                thread_data->binary);
+   GL_TH_ST(glCopyTexSubImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glGetProgramBinary_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glGetProgramBinary(program, bufSize, length, binaryFormat, binary);
+        ((GL_TH_FNTYPE(glCopyTexSubImage2D))orig_func)
+           (target, level, xoffset, yoffset, x, y, width, height);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyTexSubImage2D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetProgramBinary thread_data_local;
-   Evas_Thread_Command_glGetProgramBinary *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetProgramBinary,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyTexSubImage2D),
                               thread_mode);
 }
 
 /*
- * void
- * glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+ * GLuint
+ * glCreateProgram(void);
  */
 
-typedef struct
-{
-   GLuint program;
-   GLenum binaryFormat;
-   const void *binary;
-   GLint length;
-   void *binary_copied; /* COPIED */
-   int command_allocated;
-
-} Evas_Thread_Command_glProgramBinary;
+typedef GLuint(*GL_TH_FNTYPE(glCreateProgram))(void);
 
-void (*orig_evas_glProgramBinary)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-
-void
-glProgramBinary_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glProgramBinary = func;
-}
+   GL_TH_FNTYPE(glCreateProgram) orig_func;
+   GLuint return_value;
 
-void *
-glProgramBinary_orig_evas_get(void)
-{
-   return orig_evas_glProgramBinary;
-}
+} GL_TH_ST(glCreateProgram);
 
 static void
-_gl_thread_glProgramBinary(void *data)
+GL_TH_CB(glCreateProgram)(void *data)
 {
-   Evas_Thread_Command_glProgramBinary *thread_data =
-      (Evas_Thread_Command_glProgramBinary *)data;
+   GL_TH_ST(glCreateProgram) *thread_data =
+      *(void **)data;
 
-   orig_evas_glProgramBinary(thread_data->program,
-                             thread_data->binaryFormat,
-                             thread_data->binary,
-                             thread_data->length);
 
+   thread_data->return_value = ((GL_TH_FNTYPE(glCreateProgram))thread_data->orig_func)
+      ();
 
-   if (thread_data->binary_copied)
-     eina_mempool_free(_mp_default, thread_data->binary_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glProgramBinary_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length)
+GLuint
+GL_TH_FN(glCreateProgram)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glProgramBinary(program, binaryFormat, binary, length);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glProgramBinary thread_data_local;
-   Evas_Thread_Command_glProgramBinary *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glProgramBinary *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glProgramBinary));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->program = program;
-   thread_data->binaryFormat = binaryFormat;
-   thread_data->binary = binary;
-   thread_data->length = length;
+   GL_TH_ST(glCreateProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->binary_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (binary)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = length;
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->binary_copied)
-          {
-             memcpy(thread_data->binary_copied, binary, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->binary = (const void  *)thread_data->binary_copied;
+        return ((GL_TH_FNTYPE(glCreateProgram))orig_func)
+           ();
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCreateProgram) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glProgramBinary,
-                              thread_data,
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCreateProgram),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * void
- * glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+ * GLuint
+ * glCreateShader(GLenum type);
  */
 
+typedef GLuint(*GL_TH_FNTYPE(glCreateShader))(GLenum type);
+
 typedef struct
 {
-   GLuint program;
-   GLuint index;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLint *size;
-   GLenum *type;
-   GLchar *name;
+   GL_TH_FNTYPE(glCreateShader) orig_func;
+   GLuint return_value;
+   GLenum type;
 
-} Evas_Thread_Command_glGetActiveAttrib;
+} GL_TH_ST(glCreateShader);
 
 static void
-_gl_thread_glGetActiveAttrib(void *data)
+GL_TH_CB(glCreateShader)(void *data)
 {
-   Evas_Thread_Command_glGetActiveAttrib *thread_data =
-      (Evas_Thread_Command_glGetActiveAttrib *)data;
+   GL_TH_ST(glCreateShader) *thread_data =
+      *(void **)data;
+
 
-   glGetActiveAttrib(thread_data->program,
-                     thread_data->index,
-                     thread_data->bufSize,
-                     thread_data->length,
-                     thread_data->size,
-                     thread_data->type,
-                     thread_data->name);
+   thread_data->return_value = ((GL_TH_FNTYPE(glCreateShader))thread_data->orig_func)
+      (thread_data->type);
 
 }
 
-EAPI void
-glGetActiveAttrib_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
+GLuint
+GL_TH_FN(glCreateShader)(GL_TH_DP, GLenum type)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glGetActiveAttrib(program, index, bufSize, length, size, type, name);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetActiveAttrib thread_data_local;
-   Evas_Thread_Command_glGetActiveAttrib *thread_data = &thread_data_local;
+   GL_TH_ST(glCreateShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glCreateShader))orig_func)
+           (type);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCreateShader) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->size = size;
    thread_data->type = type;
-   thread_data->name = name;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetActiveAttrib,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCreateShader),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * GLint
- * glGetAttribLocation(GLuint program, const GLchar *name);
+ * void
+ * glCullFace(GLenum mode);
  */
 
+typedef void(*GL_TH_FNTYPE(glCullFace))(GLenum mode);
+
 typedef struct
 {
-   GLint return_value;
-   GLuint program;
-   const GLchar *name;
+   GL_TH_FNTYPE(glCullFace) orig_func;
+   GLenum mode;
 
-} Evas_Thread_Command_glGetAttribLocation;
+} GL_TH_ST(glCullFace);
 
 static void
-_gl_thread_glGetAttribLocation(void *data)
+GL_TH_CB(glCullFace)(void *data)
 {
-   Evas_Thread_Command_glGetAttribLocation *thread_data =
-      (Evas_Thread_Command_glGetAttribLocation *)data;
+   GL_TH_ST(glCullFace) *thread_data =
+      *(void **)data;
+
 
-   thread_data->return_value = glGetAttribLocation(thread_data->program,
-                                                   thread_data->name);
+   ((GL_TH_FNTYPE(glCullFace))thread_data->orig_func)
+      (thread_data->mode);
 
 }
 
-EAPI GLint
-glGetAttribLocation_thread_cmd(GLuint program, const GLchar *name)
+void
+GL_TH_FN(glCullFace)(GL_TH_DP, GLenum mode)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glGetAttribLocation(program, name);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetAttribLocation thread_data_local;
-   Evas_Thread_Command_glGetAttribLocation *thread_data = &thread_data_local;
+   GL_TH_ST(glCullFace) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->program = program;
-   thread_data->name = name;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetAttribLocation,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCullFace))orig_func)
+           (mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCullFace) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCullFace),
+                              thread_mode);
 }
 
 /*
  * void
- * glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
+ * glDeleteBuffers(GLsizei n, const GLuint* buffers);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteBuffers))(GLsizei n, const GLuint* buffers);
+
 typedef struct
 {
-   GLuint program;
-   GLuint index;
-   const GLchar *name;
+   GL_TH_FNTYPE(glDeleteBuffers) orig_func;
+   GLsizei n;
+   const GLuint* buffers;
+   void *buffers_copied; /* COPIED */
 
-} Evas_Thread_Command_glBindAttribLocation;
+} GL_TH_ST(glDeleteBuffers);
 
 static void
-_gl_thread_glBindAttribLocation(void *data)
+GL_TH_CB(glDeleteBuffers)(void *data)
 {
-   Evas_Thread_Command_glBindAttribLocation *thread_data =
-      (Evas_Thread_Command_glBindAttribLocation *)data;
+   GL_TH_ST(glDeleteBuffers) *thread_data =
+      *(void **)data;
 
-   glBindAttribLocation(thread_data->program,
-                        thread_data->index,
-                        thread_data->name);
 
-}
+   ((GL_TH_FNTYPE(glDeleteBuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->buffers);
 
-EAPI void
-glBindAttribLocation_thread_cmd(GLuint program, GLuint index, const GLchar *name)
-{
-   if (!evas_gl_thread_enabled())
-     {
-        glBindAttribLocation(program, index, name);
-        return;
-     }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (thread_data->buffers_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->buffers_copied);
 
-   Evas_Thread_Command_glBindAttribLocation thread_data_local;
-   Evas_Thread_Command_glBindAttribLocation *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->index = index;
-   thread_data->name = name;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBindAttribLocation,
-                              thread_data,
-                              thread_mode);
 }
 
-/*
- * GLint
- * glGetUniformLocation(GLuint program, const GLchar *name);
- */
-
-typedef struct
-{
-   GLint return_value;
-   GLuint program;
-   const GLchar *name;
-
-} Evas_Thread_Command_glGetUniformLocation;
-
-static void
-_gl_thread_glGetUniformLocation(void *data)
+void
+GL_TH_FN(glDeleteBuffers)(GL_TH_DP, GLsizei n, const GLuint* buffers)
 {
-   Evas_Thread_Command_glGetUniformLocation *thread_data =
-      (Evas_Thread_Command_glGetUniformLocation *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   thread_data->return_value = glGetUniformLocation(thread_data->program,
-                                                    thread_data->name);
+   GL_TH_ST(glDeleteBuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI GLint
-glGetUniformLocation_thread_cmd(GLuint program, const GLchar *name)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glGetUniformLocation(program, name);
+        ((GL_TH_FNTYPE(glDeleteBuffers))orig_func)
+           (n, buffers);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteBuffers) *) + sizeof(GL_TH_ST(glDeleteBuffers)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteBuffers) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   Evas_Thread_Command_glGetUniformLocation thread_data_local;
-   Evas_Thread_Command_glGetUniformLocation *thread_data = &thread_data_local;
+   thread_data->n = n;
+   thread_data->buffers = buffers;
+   thread_data->orig_func = orig_func;
 
-   thread_data->program = program;
-   thread_data->name = name;
+   thread_data->buffers_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetUniformLocation,
-                              thread_data,
-                              thread_mode);
+   /* copy variable */
+   if (buffers)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->buffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->buffers_copied)
+          {
+             memcpy(thread_data->buffers_copied, buffers, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->buffers = (const GLuint *)thread_data->buffers_copied;
+     }
+   /* end of copy variable */
 
-   return thread_data->return_value;
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteBuffers),
+                              thread_mode);
 }
 
 /*
  * void
- * glUniform1f(GLint location, GLfloat v0);
+ * glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteFramebuffers))(GLsizei n, const GLuint* framebuffers);
+
 typedef struct
 {
-   GLint location;
-   GLfloat v0;
-   int command_allocated;
+   GL_TH_FNTYPE(glDeleteFramebuffers) orig_func;
+   GLsizei n;
+   const GLuint* framebuffers;
+   void *framebuffers_copied; /* COPIED */
 
-} Evas_Thread_Command_glUniform1f;
+} GL_TH_ST(glDeleteFramebuffers);
 
 static void
-_gl_thread_glUniform1f(void *data)
+GL_TH_CB(glDeleteFramebuffers)(void *data)
 {
-   Evas_Thread_Command_glUniform1f *thread_data =
-      (Evas_Thread_Command_glUniform1f *)data;
+   GL_TH_ST(glDeleteFramebuffers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteFramebuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->framebuffers);
+
 
-   glUniform1f(thread_data->location,
-               thread_data->v0);
+   if (thread_data->framebuffers_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform1f_thread_cmd(GLint location, GLfloat v0)
+void
+GL_TH_FN(glDeleteFramebuffers)(GL_TH_DP, GLsizei n, const GLuint* framebuffers)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteFramebuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUniform1f(location, v0);
+        ((GL_TH_FNTYPE(glDeleteFramebuffers))orig_func)
+           (n, framebuffers);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteFramebuffers) *) + sizeof(GL_TH_ST(glDeleteFramebuffers)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteFramebuffers) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   Evas_Thread_Command_glUniform1f thread_data_local;
-   Evas_Thread_Command_glUniform1f *thread_data = &thread_data_local;
+   thread_data->n = n;
+   thread_data->framebuffers = framebuffers;
+   thread_data->orig_func = orig_func;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   thread_data->framebuffers_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform1f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform1f));
-        if (thread_data_new)
+   /* copy variable */
+   if (framebuffers)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->framebuffers_copied)
           {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
           }
+        /* 3. replace */
+        thread_data->framebuffers = (const GLuint *)thread_data->framebuffers_copied;
      }
+   /* end of copy variable */
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform1f,
-                              thread_data,
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteFramebuffers),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform1i(GLint location, GLint v0);
+ * glDeleteProgram(GLuint program);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteProgram))(GLuint program);
+
 typedef struct
 {
-   GLint location;
-   GLint v0;
-   int command_allocated;
+   GL_TH_FNTYPE(glDeleteProgram) orig_func;
+   GLuint program;
 
-} Evas_Thread_Command_glUniform1i;
+} GL_TH_ST(glDeleteProgram);
 
 static void
-_gl_thread_glUniform1i(void *data)
+GL_TH_CB(glDeleteProgram)(void *data)
 {
-   Evas_Thread_Command_glUniform1i *thread_data =
-      (Evas_Thread_Command_glUniform1i *)data;
+   GL_TH_ST(glDeleteProgram) *thread_data =
+      *(void **)data;
+
 
-   glUniform1i(thread_data->location,
-               thread_data->v0);
+   ((GL_TH_FNTYPE(glDeleteProgram))thread_data->orig_func)
+      (thread_data->program);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform1i_thread_cmd(GLint location, GLint v0)
+void
+GL_TH_FN(glDeleteProgram)(GL_TH_DP, GLuint program)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform1i(location, v0);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform1i thread_data_local;
-   Evas_Thread_Command_glUniform1i *thread_data = &thread_data_local;
+   GL_TH_ST(glDeleteProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform1i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform1i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteProgram))orig_func)
+           (program);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteProgram) *) + sizeof(GL_TH_ST(glDeleteProgram)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteProgram) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform1i,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteProgram),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform2f(GLint location, GLfloat v0, GLfloat v1);
+ * glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteRenderbuffers))(GLsizei n, const GLuint* renderbuffers);
+
 typedef struct
 {
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   int command_allocated;
+   GL_TH_FNTYPE(glDeleteRenderbuffers) orig_func;
+   GLsizei n;
+   const GLuint* renderbuffers;
+   void *renderbuffers_copied; /* COPIED */
 
-} Evas_Thread_Command_glUniform2f;
+} GL_TH_ST(glDeleteRenderbuffers);
 
 static void
-_gl_thread_glUniform2f(void *data)
+GL_TH_CB(glDeleteRenderbuffers)(void *data)
 {
-   Evas_Thread_Command_glUniform2f *thread_data =
-      (Evas_Thread_Command_glUniform2f *)data;
+   GL_TH_ST(glDeleteRenderbuffers) *thread_data =
+      *(void **)data;
+
 
-   glUniform2f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1);
+   ((GL_TH_FNTYPE(glDeleteRenderbuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->renderbuffers);
+
+
+   if (thread_data->renderbuffers_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform2f_thread_cmd(GLint location, GLfloat v0, GLfloat v1)
+void
+GL_TH_FN(glDeleteRenderbuffers)(GL_TH_DP, GLsizei n, const GLuint* renderbuffers)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteRenderbuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUniform2f(location, v0, v1);
+        ((GL_TH_FNTYPE(glDeleteRenderbuffers))orig_func)
+           (n, renderbuffers);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteRenderbuffers) *) + sizeof(GL_TH_ST(glDeleteRenderbuffers)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteRenderbuffers) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   Evas_Thread_Command_glUniform2f thread_data_local;
-   Evas_Thread_Command_glUniform2f *thread_data = &thread_data_local;
+   thread_data->n = n;
+   thread_data->renderbuffers = renderbuffers;
+   thread_data->orig_func = orig_func;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   thread_data->renderbuffers_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform2f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform2f));
-        if (thread_data_new)
+   /* copy variable */
+   if (renderbuffers)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->renderbuffers_copied)
+          {
+             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
+          }
+        else
           {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
           }
+        /* 3. replace */
+        thread_data->renderbuffers = (const GLuint *)thread_data->renderbuffers_copied;
      }
+   /* end of copy variable */
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform2f,
-                              thread_data,
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteRenderbuffers),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform2i(GLint location, GLint v0, GLint v1);
+ * glDeleteShader(GLuint shader);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteShader))(GLuint shader);
+
 typedef struct
 {
-   GLint location;
-   GLint v0;
-   GLint v1;
-   int command_allocated;
+   GL_TH_FNTYPE(glDeleteShader) orig_func;
+   GLuint shader;
 
-} Evas_Thread_Command_glUniform2i;
+} GL_TH_ST(glDeleteShader);
 
 static void
-_gl_thread_glUniform2i(void *data)
+GL_TH_CB(glDeleteShader)(void *data)
 {
-   Evas_Thread_Command_glUniform2i *thread_data =
-      (Evas_Thread_Command_glUniform2i *)data;
+   GL_TH_ST(glDeleteShader) *thread_data =
+      *(void **)data;
+
 
-   glUniform2i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1);
+   ((GL_TH_FNTYPE(glDeleteShader))thread_data->orig_func)
+      (thread_data->shader);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform2i_thread_cmd(GLint location, GLint v0, GLint v1)
+void
+GL_TH_FN(glDeleteShader)(GL_TH_DP, GLuint shader)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform2i(location, v0, v1);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform2i thread_data_local;
-   Evas_Thread_Command_glUniform2i *thread_data = &thread_data_local;
+   GL_TH_ST(glDeleteShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform2i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform2i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteShader))orig_func)
+           (shader);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteShader) *) + sizeof(GL_TH_ST(glDeleteShader)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteShader) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform2i,
-                              thread_data,
+   thread_data->shader = shader;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteShader),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ * glDeleteTextures(GLsizei n, const GLuint* textures);
  */
 
+typedef void(*GL_TH_FNTYPE(glDeleteTextures))(GLsizei n, const GLuint* textures);
+
 typedef struct
 {
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-   int command_allocated;
+   GL_TH_FNTYPE(glDeleteTextures) orig_func;
+   GLsizei n;
+   const GLuint* textures;
+   void *textures_copied; /* COPIED */
 
-} Evas_Thread_Command_glUniform3f;
+} GL_TH_ST(glDeleteTextures);
 
 static void
-_gl_thread_glUniform3f(void *data)
+GL_TH_CB(glDeleteTextures)(void *data)
 {
-   Evas_Thread_Command_glUniform3f *thread_data =
-      (Evas_Thread_Command_glUniform3f *)data;
+   GL_TH_ST(glDeleteTextures) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteTextures))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->textures);
+
 
-   glUniform3f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2);
+   if (thread_data->textures_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->textures_copied);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform3f_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+void
+GL_TH_FN(glDeleteTextures)(GL_TH_DP, GLsizei n, const GLuint* textures)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteTextures) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUniform3f(location, v0, v1, v2);
+        ((GL_TH_FNTYPE(glDeleteTextures))orig_func)
+           (n, textures);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteTextures) *) + sizeof(GL_TH_ST(glDeleteTextures)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteTextures) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   Evas_Thread_Command_glUniform3f thread_data_local;
-   Evas_Thread_Command_glUniform3f *thread_data = &thread_data_local;
+   thread_data->n = n;
+   thread_data->textures = textures;
+   thread_data->orig_func = orig_func;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+   thread_data->textures_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform3f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform3f));
-        if (thread_data_new)
+   /* copy variable */
+   if (textures)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->textures_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->textures_copied)
           {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+             memcpy(thread_data->textures_copied, textures, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
           }
+        /* 3. replace */
+        thread_data->textures = (const GLuint *)thread_data->textures_copied;
      }
+   /* end of copy variable */
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform3f,
-                              thread_data,
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteTextures),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform3i(GLint location, GLint v0, GLint v1, GLint v2);
+ * glDepthFunc(GLenum func);
  */
 
+typedef void(*GL_TH_FNTYPE(glDepthFunc))(GLenum func);
+
 typedef struct
 {
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   int command_allocated;
+   GL_TH_FNTYPE(glDepthFunc) orig_func;
+   GLenum func;
 
-} Evas_Thread_Command_glUniform3i;
+} GL_TH_ST(glDepthFunc);
 
 static void
-_gl_thread_glUniform3i(void *data)
+GL_TH_CB(glDepthFunc)(void *data)
 {
-   Evas_Thread_Command_glUniform3i *thread_data =
-      (Evas_Thread_Command_glUniform3i *)data;
+   GL_TH_ST(glDepthFunc) *thread_data =
+      *(void **)data;
 
-   glUniform3i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glDepthFunc))thread_data->orig_func)
+      (thread_data->func);
+
 }
 
-EAPI void
-glUniform3i_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2)
+void
+GL_TH_FN(glDepthFunc)(GL_TH_DP, GLenum func)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform3i(location, v0, v1, v2);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform3i thread_data_local;
-   Evas_Thread_Command_glUniform3i *thread_data = &thread_data_local;
+   GL_TH_ST(glDepthFunc) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform3i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform3i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthFunc))orig_func)
+           (func);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthFunc) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
+   thread_data->func = func;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform3i,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthFunc),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ * glDepthMask(GLboolean flag);
  */
 
+typedef void(*GL_TH_FNTYPE(glDepthMask))(GLboolean flag);
+
 typedef struct
 {
-   GLint location;
-   GLfloat v0;
-   GLfloat v1;
-   GLfloat v2;
-   GLfloat v3;
-   int command_allocated;
+   GL_TH_FNTYPE(glDepthMask) orig_func;
+   GLboolean flag;
 
-} Evas_Thread_Command_glUniform4f;
+} GL_TH_ST(glDepthMask);
 
 static void
-_gl_thread_glUniform4f(void *data)
+GL_TH_CB(glDepthMask)(void *data)
 {
-   Evas_Thread_Command_glUniform4f *thread_data =
-      (Evas_Thread_Command_glUniform4f *)data;
+   GL_TH_ST(glDepthMask) *thread_data =
+      *(void **)data;
 
-   glUniform4f(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2,
-               thread_data->v3);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glDepthMask))thread_data->orig_func)
+      (thread_data->flag);
+
 }
 
-EAPI void
-glUniform4f_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+void
+GL_TH_FN(glDepthMask)(GL_TH_DP, GLboolean flag)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform4f(location, v0, v1, v2, v3);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform4f thread_data_local;
-   Evas_Thread_Command_glUniform4f *thread_data = &thread_data_local;
+   GL_TH_ST(glDepthMask) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform4f *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform4f));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthMask))orig_func)
+           (flag);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthMask) *) + sizeof(GL_TH_ST(glDepthMask)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDepthMask) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->flag = flag;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform4f,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthMask),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ * glDepthRangef(GLclampf zNear, GLclampf zFar);
  */
 
+typedef void(*GL_TH_FNTYPE(glDepthRangef))(GLclampf zNear, GLclampf zFar);
+
 typedef struct
 {
-   GLint location;
-   GLint v0;
-   GLint v1;
-   GLint v2;
-   GLint v3;
-   int command_allocated;
+   GL_TH_FNTYPE(glDepthRangef) orig_func;
+   GLclampf zNear;
+   GLclampf zFar;
 
-} Evas_Thread_Command_glUniform4i;
+} GL_TH_ST(glDepthRangef);
 
 static void
-_gl_thread_glUniform4i(void *data)
+GL_TH_CB(glDepthRangef)(void *data)
 {
-   Evas_Thread_Command_glUniform4i *thread_data =
-      (Evas_Thread_Command_glUniform4i *)data;
+   GL_TH_ST(glDepthRangef) *thread_data =
+      *(void **)data;
+
 
-   glUniform4i(thread_data->location,
-               thread_data->v0,
-               thread_data->v1,
-               thread_data->v2,
-               thread_data->v3);
+   ((GL_TH_FNTYPE(glDepthRangef))thread_data->orig_func)
+      (thread_data->zNear,
+       thread_data->zFar);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform4i_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+void
+GL_TH_FN(glDepthRangef)(GL_TH_DP, GLclampf zNear, GLclampf zFar)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform4i(location, v0, v1, v2, v3);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform4i thread_data_local;
-   Evas_Thread_Command_glUniform4i *thread_data = &thread_data_local;
+   GL_TH_ST(glDepthRangef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform4i *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform4i));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthRangef))orig_func)
+           (zNear, zFar);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthRangef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->location = location;
-   thread_data->v0 = v0;
-   thread_data->v1 = v1;
-   thread_data->v2 = v2;
-   thread_data->v3 = v3;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform4i,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthRangef),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
+ * glDetachShader(GLuint program, GLuint shader);
  */
 
+typedef void(*GL_TH_FNTYPE(glDetachShader))(GLuint program, GLuint shader);
+
 typedef struct
 {
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glDetachShader) orig_func;
+   GLuint program;
+   GLuint shader;
 
-} Evas_Thread_Command_glUniform1fv;
+} GL_TH_ST(glDetachShader);
 
 static void
-_gl_thread_glUniform1fv(void *data)
+GL_TH_CB(glDetachShader)(void *data)
 {
-   Evas_Thread_Command_glUniform1fv *thread_data =
-      (Evas_Thread_Command_glUniform1fv *)data;
-
-   glUniform1fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
+   GL_TH_ST(glDetachShader) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+   ((GL_TH_FNTYPE(glDetachShader))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->shader);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform1fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
+void
+GL_TH_FN(glDetachShader)(GL_TH_DP, GLuint program, GLuint shader)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform1fv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform1fv thread_data_local;
-   Evas_Thread_Command_glUniform1fv *thread_data = &thread_data_local;
+   GL_TH_ST(glDetachShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform1fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform1fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDetachShader))orig_func)
+           (program, shader);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDetachShader) *) + sizeof(GL_TH_ST(glDetachShader)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDetachShader) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
+   thread_data->program = program;
+   thread_data->shader = shader;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform1fv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDetachShader),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform1iv(GLint location, GLsizei count, const GLint *value);
+ * glDisable(GLenum cap);
  */
 
+typedef void(*GL_TH_FNTYPE(glDisable))(GLenum cap);
+
 typedef struct
 {
-   GLint location;
-   GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glDisable) orig_func;
+   GLenum cap;
 
-} Evas_Thread_Command_glUniform1iv;
+} GL_TH_ST(glDisable);
 
 static void
-_gl_thread_glUniform1iv(void *data)
+GL_TH_CB(glDisable)(void *data)
 {
-   Evas_Thread_Command_glUniform1iv *thread_data =
-      (Evas_Thread_Command_glUniform1iv *)data;
+   GL_TH_ST(glDisable) *thread_data =
+      *(void **)data;
 
-   glUniform1iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
 
+   ((GL_TH_FNTYPE(glDisable))thread_data->orig_func)
+      (thread_data->cap);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform1iv_thread_cmd(GLint location, GLsizei count, const GLint *value)
+void
+GL_TH_FN(glDisable)(GL_TH_DP, GLenum cap)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform1iv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform1iv thread_data_local;
-   Evas_Thread_Command_glUniform1iv *thread_data = &thread_data_local;
+   GL_TH_ST(glDisable) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform1iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform1iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDisable))orig_func)
+           (cap);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDisable) *) + sizeof(GL_TH_ST(glDisable)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDisable) *));
+   thread_data = *thread_data_ptr;
 
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
-
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 1 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
+   thread_data->cap = cap;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform1iv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDisable),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform2fv(GLint location, GLsizei count, const GLfloat *value);
+ * glDisableVertexAttribArray(GLuint index);
  */
 
+typedef void(*GL_TH_FNTYPE(glDisableVertexAttribArray))(GLuint index);
+
 typedef struct
 {
-   GLint location;
-   GLsizei count;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glDisableVertexAttribArray) orig_func;
+   GLuint index;
 
-} Evas_Thread_Command_glUniform2fv;
+} GL_TH_ST(glDisableVertexAttribArray);
 
 static void
-_gl_thread_glUniform2fv(void *data)
+GL_TH_CB(glDisableVertexAttribArray)(void *data)
 {
-   Evas_Thread_Command_glUniform2fv *thread_data =
-      (Evas_Thread_Command_glUniform2fv *)data;
+   GL_TH_ST(glDisableVertexAttribArray) *thread_data =
+      *(void **)data;
 
-   glUniform2fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
 
+   ((GL_TH_FNTYPE(glDisableVertexAttribArray))thread_data->orig_func)
+      (thread_data->index);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform2fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
+void
+GL_TH_FN(glDisableVertexAttribArray)(GL_TH_DP, GLuint index)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform2fv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform2fv thread_data_local;
-   Evas_Thread_Command_glUniform2fv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->value = value;
+   GL_TH_ST(glDisableVertexAttribArray) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (value)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glDisableVertexAttribArray))orig_func)
+           (index);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDisableVertexAttribArray) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform2fv,
-                              thread_data,
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDisableVertexAttribArray),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform2iv(GLint location, GLsizei count, const GLint *value);
+ * glDrawArrays(GLenum mode, GLint first, GLsizei count);
  */
 
+typedef void(*GL_TH_FNTYPE(glDrawArrays))(GLenum mode, GLint first, GLsizei count);
+
 typedef struct
 {
-   GLint location;
+   GL_TH_FNTYPE(glDrawArrays) orig_func;
+   GLenum mode;
+   GLint first;
    GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
 
-} Evas_Thread_Command_glUniform2iv;
+} GL_TH_ST(glDrawArrays);
 
 static void
-_gl_thread_glUniform2iv(void *data)
+GL_TH_CB(glDrawArrays)(void *data)
 {
-   Evas_Thread_Command_glUniform2iv *thread_data =
-      (Evas_Thread_Command_glUniform2iv *)data;
+   GL_TH_ST(glDrawArrays) *thread_data =
+      *(void **)data;
 
-   glUniform2iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
 
+   ((GL_TH_FNTYPE(glDrawArrays))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->first,
+       thread_data->count);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform2iv_thread_cmd(GLint location, GLsizei count, const GLint *value)
+void
+GL_TH_FN(glDrawArrays)(GL_TH_DP, GLenum mode, GLint first, GLsizei count)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform2iv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform2iv thread_data_local;
-   Evas_Thread_Command_glUniform2iv *thread_data = &thread_data_local;
+   GL_TH_ST(glDrawArrays) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform2iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform2iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawArrays))orig_func)
+           (mode, first, count);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawArrays) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->location = location;
+   thread_data->mode = mode;
+   thread_data->first = first;
+   thread_data->count = count;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawArrays),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawElements))(GLenum mode, GLsizei count, GLenum type, const void* indices);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawElements) orig_func;
+   GLenum mode;
+   GLsizei count;
+   GLenum type;
+   const void* indices;
+
+} GL_TH_ST(glDrawElements);
+
+static void
+GL_TH_CB(glDrawElements)(void *data)
+{
+   GL_TH_ST(glDrawElements) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawElements))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices);
+
+}
+
+void
+GL_TH_FN(glDrawElements)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawElements) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawElements))orig_func)
+           (mode, count, type, indices);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawElements) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawElements),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEnable(GLenum cap);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEnable))(GLenum cap);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEnable) orig_func;
+   GLenum cap;
+
+} GL_TH_ST(glEnable);
+
+static void
+GL_TH_CB(glEnable)(void *data)
+{
+   GL_TH_ST(glEnable) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEnable))thread_data->orig_func)
+      (thread_data->cap);
+
+}
+
+void
+GL_TH_FN(glEnable)(GL_TH_DP, GLenum cap)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEnable) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEnable))orig_func)
+           (cap);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEnable) *) + sizeof(GL_TH_ST(glEnable)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glEnable) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->cap = cap;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEnable),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEnableVertexAttribArray(GLuint index);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEnableVertexAttribArray))(GLuint index);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEnableVertexAttribArray) orig_func;
+   GLuint index;
+
+} GL_TH_ST(glEnableVertexAttribArray);
+
+static void
+GL_TH_CB(glEnableVertexAttribArray)(void *data)
+{
+   GL_TH_ST(glEnableVertexAttribArray) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEnableVertexAttribArray))thread_data->orig_func)
+      (thread_data->index);
+
+}
+
+void
+GL_TH_FN(glEnableVertexAttribArray)(GL_TH_DP, GLuint index)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEnableVertexAttribArray) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEnableVertexAttribArray))orig_func)
+           (index);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEnableVertexAttribArray) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEnableVertexAttribArray),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFinish(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFinish))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFinish) orig_func;
+
+} GL_TH_ST(glFinish);
+
+static void
+GL_TH_CB(glFinish)(void *data)
+{
+   GL_TH_ST(glFinish) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFinish))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glFinish)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFinish) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFinish))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFinish) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFinish),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFlush(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFlush))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFlush) orig_func;
+
+} GL_TH_ST(glFlush);
+
+static void
+GL_TH_CB(glFlush)(void *data)
+{
+   GL_TH_ST(glFlush) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFlush))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glFlush)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFlush) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFlush))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFlush) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFlush),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferRenderbuffer))(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferRenderbuffer) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum renderbuffertarget;
+   GLuint renderbuffer;
+
+} GL_TH_ST(glFramebufferRenderbuffer);
+
+static void
+GL_TH_CB(glFramebufferRenderbuffer)(void *data)
+{
+   GL_TH_ST(glFramebufferRenderbuffer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferRenderbuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->renderbuffertarget,
+       thread_data->renderbuffer);
+
+}
+
+void
+GL_TH_FN(glFramebufferRenderbuffer)(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferRenderbuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferRenderbuffer))orig_func)
+           (target, attachment, renderbuffertarget, renderbuffer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferRenderbuffer) *) + sizeof(GL_TH_ST(glFramebufferRenderbuffer)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferRenderbuffer) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->renderbuffertarget = renderbuffertarget;
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferRenderbuffer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture2D))(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture2D) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum textarget;
+   GLuint texture;
+   GLint level;
+
+} GL_TH_ST(glFramebufferTexture2D);
+
+static void
+GL_TH_CB(glFramebufferTexture2D)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture2D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->textarget,
+       thread_data->texture,
+       thread_data->level);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture2D)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture2D))orig_func)
+           (target, attachment, textarget, texture, level);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture2D) *) + sizeof(GL_TH_ST(glFramebufferTexture2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferTexture2D) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->textarget = textarget;
+   thread_data->texture = texture;
+   thread_data->level = level;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture2D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFrontFace(GLenum mode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFrontFace))(GLenum mode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFrontFace) orig_func;
+   GLenum mode;
+
+} GL_TH_ST(glFrontFace);
+
+static void
+GL_TH_CB(glFrontFace)(void *data)
+{
+   GL_TH_ST(glFrontFace) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFrontFace))thread_data->orig_func)
+      (thread_data->mode);
+
+}
+
+void
+GL_TH_FN(glFrontFace)(GL_TH_DP, GLenum mode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFrontFace) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFrontFace))orig_func)
+           (mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFrontFace) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFrontFace),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenBuffers(GLsizei n, GLuint* buffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenBuffers))(GLsizei n, GLuint* buffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenBuffers) orig_func;
+   GLsizei n;
+   GLuint* buffers;
+
+} GL_TH_ST(glGenBuffers);
+
+static void
+GL_TH_CB(glGenBuffers)(void *data)
+{
+   GL_TH_ST(glGenBuffers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenBuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->buffers);
+
+}
+
+void
+GL_TH_FN(glGenBuffers)(GL_TH_DP, GLsizei n, GLuint* buffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenBuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenBuffers))orig_func)
+           (n, buffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenBuffers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->buffers = buffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenBuffers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenerateMipmap(GLenum target);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenerateMipmap))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenerateMipmap) orig_func;
+   GLenum target;
+
+} GL_TH_ST(glGenerateMipmap);
+
+static void
+GL_TH_CB(glGenerateMipmap)(void *data)
+{
+   GL_TH_ST(glGenerateMipmap) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenerateMipmap))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+void
+GL_TH_FN(glGenerateMipmap)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenerateMipmap) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenerateMipmap))orig_func)
+           (target);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenerateMipmap) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenerateMipmap),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenFramebuffers(GLsizei n, GLuint* framebuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenFramebuffers))(GLsizei n, GLuint* framebuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenFramebuffers) orig_func;
+   GLsizei n;
+   GLuint* framebuffers;
+
+} GL_TH_ST(glGenFramebuffers);
+
+static void
+GL_TH_CB(glGenFramebuffers)(void *data)
+{
+   GL_TH_ST(glGenFramebuffers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenFramebuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->framebuffers);
+
+}
+
+void
+GL_TH_FN(glGenFramebuffers)(GL_TH_DP, GLsizei n, GLuint* framebuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenFramebuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenFramebuffers))orig_func)
+           (n, framebuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenFramebuffers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->framebuffers = framebuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenFramebuffers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenRenderbuffers(GLsizei n, GLuint* renderbuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenRenderbuffers))(GLsizei n, GLuint* renderbuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenRenderbuffers) orig_func;
+   GLsizei n;
+   GLuint* renderbuffers;
+
+} GL_TH_ST(glGenRenderbuffers);
+
+static void
+GL_TH_CB(glGenRenderbuffers)(void *data)
+{
+   GL_TH_ST(glGenRenderbuffers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenRenderbuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->renderbuffers);
+
+}
+
+void
+GL_TH_FN(glGenRenderbuffers)(GL_TH_DP, GLsizei n, GLuint* renderbuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenRenderbuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenRenderbuffers))orig_func)
+           (n, renderbuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenRenderbuffers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->renderbuffers = renderbuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenRenderbuffers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenTextures(GLsizei n, GLuint* textures);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenTextures))(GLsizei n, GLuint* textures);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenTextures) orig_func;
+   GLsizei n;
+   GLuint* textures;
+
+} GL_TH_ST(glGenTextures);
+
+static void
+GL_TH_CB(glGenTextures)(void *data)
+{
+   GL_TH_ST(glGenTextures) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenTextures))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->textures);
+
+}
+
+void
+GL_TH_FN(glGenTextures)(GL_TH_DP, GLsizei n, GLuint* textures)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenTextures) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenTextures))orig_func)
+           (n, textures);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenTextures) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->textures = textures;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenTextures),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetActiveAttrib))(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetActiveAttrib) orig_func;
+   GLuint program;
+   GLuint index;
+   GLsizei bufsize;
+   GLsizei* length;
+   GLint* size;
+   GLenum* type;
+   char* name;
+
+} GL_TH_ST(glGetActiveAttrib);
+
+static void
+GL_TH_CB(glGetActiveAttrib)(void *data)
+{
+   GL_TH_ST(glGetActiveAttrib) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetActiveAttrib))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->index,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->size,
+       thread_data->type,
+       thread_data->name);
+
+}
+
+void
+GL_TH_FN(glGetActiveAttrib)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetActiveAttrib) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetActiveAttrib))orig_func)
+           (program, index, bufsize, length, size, type, name);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetActiveAttrib) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->index = index;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetActiveAttrib),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetActiveUniform))(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetActiveUniform) orig_func;
+   GLuint program;
+   GLuint index;
+   GLsizei bufsize;
+   GLsizei* length;
+   GLint* size;
+   GLenum* type;
+   char* name;
+
+} GL_TH_ST(glGetActiveUniform);
+
+static void
+GL_TH_CB(glGetActiveUniform)(void *data)
+{
+   GL_TH_ST(glGetActiveUniform) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetActiveUniform))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->index,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->size,
+       thread_data->type,
+       thread_data->name);
+
+}
+
+void
+GL_TH_FN(glGetActiveUniform)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetActiveUniform) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetActiveUniform))orig_func)
+           (program, index, bufsize, length, size, type, name);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetActiveUniform) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->index = index;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetActiveUniform),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetAttachedShaders))(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetAttachedShaders) orig_func;
+   GLuint program;
+   GLsizei maxcount;
+   GLsizei* count;
+   GLuint* shaders;
+
+} GL_TH_ST(glGetAttachedShaders);
+
+static void
+GL_TH_CB(glGetAttachedShaders)(void *data)
+{
+   GL_TH_ST(glGetAttachedShaders) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetAttachedShaders))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->maxcount,
+       thread_data->count,
+       thread_data->shaders);
+
+}
+
+void
+GL_TH_FN(glGetAttachedShaders)(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetAttachedShaders) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetAttachedShaders))orig_func)
+           (program, maxcount, count, shaders);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetAttachedShaders) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->maxcount = maxcount;
+   thread_data->count = count;
+   thread_data->shaders = shaders;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetAttachedShaders),
+                              thread_mode);
+}
+
+/*
+ * int
+ * glGetAttribLocation(GLuint program, const char* name);
+ */
+
+typedef int(*GL_TH_FNTYPE(glGetAttribLocation))(GLuint program, const char* name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetAttribLocation) orig_func;
+   int return_value;
+   GLuint program;
+   const char* name;
+
+} GL_TH_ST(glGetAttribLocation);
+
+static void
+GL_TH_CB(glGetAttribLocation)(void *data)
+{
+   GL_TH_ST(glGetAttribLocation) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetAttribLocation))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->name);
+
+}
+
+int
+GL_TH_FN(glGetAttribLocation)(GL_TH_DP, GLuint program, const char* name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetAttribLocation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetAttribLocation))orig_func)
+           (program, name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetAttribLocation) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetAttribLocation),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetBooleanv(GLenum pname, GLboolean* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetBooleanv))(GLenum pname, GLboolean* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetBooleanv) orig_func;
+   GLenum pname;
+   GLboolean* params;
+
+} GL_TH_ST(glGetBooleanv);
+
+static void
+GL_TH_CB(glGetBooleanv)(void *data)
+{
+   GL_TH_ST(glGetBooleanv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetBooleanv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetBooleanv)(GL_TH_DP, GLenum pname, GLboolean* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetBooleanv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBooleanv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBooleanv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBooleanv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetBufferParameteriv))(GLenum target, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetBufferParameteriv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetBufferParameteriv);
+
+static void
+GL_TH_CB(glGetBufferParameteriv)(void *data)
+{
+   GL_TH_ST(glGetBufferParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetBufferParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetBufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetBufferParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBufferParameteriv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBufferParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBufferParameteriv),
+                              thread_mode);
+}
+
+/*
+ * GLenum
+ * glGetError(void);
+ */
+
+typedef GLenum(*GL_TH_FNTYPE(glGetError))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetError) orig_func;
+   GLenum return_value;
+
+} GL_TH_ST(glGetError);
+
+static void
+GL_TH_CB(glGetError)(void *data)
+{
+   GL_TH_ST(glGetError) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetError))thread_data->orig_func)
+      ();
+
+}
+
+GLenum
+GL_TH_FN(glGetError)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetError) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetError))orig_func)
+           ();
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetError) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetError),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetFloatv(GLenum pname, GLfloat* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFloatv))(GLenum pname, GLfloat* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFloatv) orig_func;
+   GLenum pname;
+   GLfloat* params;
+
+} GL_TH_ST(glGetFloatv);
+
+static void
+GL_TH_CB(glGetFloatv)(void *data)
+{
+   GL_TH_ST(glGetFloatv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFloatv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFloatv)(GL_TH_DP, GLenum pname, GLfloat* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFloatv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFloatv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFloatv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFloatv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFramebufferAttachmentParameteriv))(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFramebufferAttachmentParameteriv) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetFramebufferAttachmentParameteriv);
+
+static void
+GL_TH_CB(glGetFramebufferAttachmentParameteriv)(void *data)
+{
+   GL_TH_ST(glGetFramebufferAttachmentParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFramebufferAttachmentParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFramebufferAttachmentParameteriv)(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFramebufferAttachmentParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFramebufferAttachmentParameteriv))orig_func)
+           (target, attachment, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFramebufferAttachmentParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFramebufferAttachmentParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetIntegerv(GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetIntegerv))(GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetIntegerv) orig_func;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetIntegerv);
+
+static void
+GL_TH_CB(glGetIntegerv)(void *data)
+{
+   GL_TH_ST(glGetIntegerv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetIntegerv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetIntegerv)(GL_TH_DP, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetIntegerv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetIntegerv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetIntegerv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetIntegerv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramiv(GLuint program, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramiv))(GLuint program, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramiv) orig_func;
+   GLuint program;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetProgramiv);
+
+static void
+GL_TH_CB(glGetProgramiv)(void *data)
+{
+   GL_TH_ST(glGetProgramiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetProgramiv)(GL_TH_DP, GLuint program, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramiv))orig_func)
+           (program, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramInfoLog))(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramInfoLog) orig_func;
+   GLuint program;
+   GLsizei bufsize;
+   GLsizei* length;
+   char* infolog;
+
+} GL_TH_ST(glGetProgramInfoLog);
+
+static void
+GL_TH_CB(glGetProgramInfoLog)(void *data)
+{
+   GL_TH_ST(glGetProgramInfoLog) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramInfoLog))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->infolog);
+
+}
+
+void
+GL_TH_FN(glGetProgramInfoLog)(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramInfoLog) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramInfoLog))orig_func)
+           (program, bufsize, length, infolog);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramInfoLog) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->infolog = infolog;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramInfoLog),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetRenderbufferParameteriv))(GLenum target, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetRenderbufferParameteriv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetRenderbufferParameteriv);
+
+static void
+GL_TH_CB(glGetRenderbufferParameteriv)(void *data)
+{
+   GL_TH_ST(glGetRenderbufferParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetRenderbufferParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetRenderbufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetRenderbufferParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetRenderbufferParameteriv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetRenderbufferParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetRenderbufferParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetShaderiv))(GLuint shader, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetShaderiv) orig_func;
+   GLuint shader;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetShaderiv);
+
+static void
+GL_TH_CB(glGetShaderiv)(void *data)
+{
+   GL_TH_ST(glGetShaderiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetShaderiv))thread_data->orig_func)
+      (thread_data->shader,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetShaderiv)(GL_TH_DP, GLuint shader, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetShaderiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetShaderiv))orig_func)
+           (shader, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetShaderiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shader = shader;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetShaderiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetShaderInfoLog))(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetShaderInfoLog) orig_func;
+   GLuint shader;
+   GLsizei bufsize;
+   GLsizei* length;
+   char* infolog;
+
+} GL_TH_ST(glGetShaderInfoLog);
+
+static void
+GL_TH_CB(glGetShaderInfoLog)(void *data)
+{
+   GL_TH_ST(glGetShaderInfoLog) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetShaderInfoLog))thread_data->orig_func)
+      (thread_data->shader,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->infolog);
+
+}
+
+void
+GL_TH_FN(glGetShaderInfoLog)(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetShaderInfoLog) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetShaderInfoLog))orig_func)
+           (shader, bufsize, length, infolog);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetShaderInfoLog) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shader = shader;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->infolog = infolog;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetShaderInfoLog),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetShaderPrecisionFormat))(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetShaderPrecisionFormat) orig_func;
+   GLenum shadertype;
+   GLenum precisiontype;
+   GLint* range;
+   GLint* precision;
+
+} GL_TH_ST(glGetShaderPrecisionFormat);
+
+static void
+GL_TH_CB(glGetShaderPrecisionFormat)(void *data)
+{
+   GL_TH_ST(glGetShaderPrecisionFormat) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetShaderPrecisionFormat))thread_data->orig_func)
+      (thread_data->shadertype,
+       thread_data->precisiontype,
+       thread_data->range,
+       thread_data->precision);
+
+}
+
+void
+GL_TH_FN(glGetShaderPrecisionFormat)(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetShaderPrecisionFormat) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetShaderPrecisionFormat))orig_func)
+           (shadertype, precisiontype, range, precision);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetShaderPrecisionFormat) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shadertype = shadertype;
+   thread_data->precisiontype = precisiontype;
+   thread_data->range = range;
+   thread_data->precision = precision;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetShaderPrecisionFormat),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetShaderSource))(GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetShaderSource) orig_func;
+   GLuint shader;
+   GLsizei bufsize;
+   GLsizei* length;
+   char* source;
+
+} GL_TH_ST(glGetShaderSource);
+
+static void
+GL_TH_CB(glGetShaderSource)(void *data)
+{
+   GL_TH_ST(glGetShaderSource) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetShaderSource))thread_data->orig_func)
+      (thread_data->shader,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->source);
+
+}
+
+void
+GL_TH_FN(glGetShaderSource)(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetShaderSource) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetShaderSource))orig_func)
+           (shader, bufsize, length, source);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetShaderSource) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shader = shader;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->source = source;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetShaderSource),
+                              thread_mode);
+}
+
+/*
+ * const GLubyte*
+ * glGetString(GLenum name);
+ */
+
+typedef const GLubyte*(*GL_TH_FNTYPE(glGetString))(GLenum name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetString) orig_func;
+   const GLubyte* return_value;
+   GLenum name;
+
+} GL_TH_ST(glGetString);
+
+static void
+GL_TH_CB(glGetString)(void *data)
+{
+   GL_TH_ST(glGetString) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetString))thread_data->orig_func)
+      (thread_data->name);
+
+}
+
+const GLubyte*
+GL_TH_FN(glGetString)(GL_TH_DP, GLenum name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetString) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetString))orig_func)
+           (name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetString) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetString),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexParameterfv))(GLenum target, GLenum pname, GLfloat* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexParameterfv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfloat* params;
+
+} GL_TH_ST(glGetTexParameterfv);
+
+static void
+GL_TH_CB(glGetTexParameterfv)(void *data)
+{
+   GL_TH_ST(glGetTexParameterfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexParameterfv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexParameterfv)(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexParameterfv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameterfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameterfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexParameteriv(GLenum target, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexParameteriv))(GLenum target, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexParameteriv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetTexParameteriv);
+
+static void
+GL_TH_CB(glGetTexParameteriv)(void *data)
+{
+   GL_TH_ST(glGetTexParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexParameteriv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetUniformfv(GLuint program, GLint location, GLfloat* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetUniformfv))(GLuint program, GLint location, GLfloat* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformfv) orig_func;
+   GLuint program;
+   GLint location;
+   GLfloat* params;
+
+} GL_TH_ST(glGetUniformfv);
+
+static void
+GL_TH_CB(glGetUniformfv)(void *data)
+{
+   GL_TH_ST(glGetUniformfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetUniformfv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetUniformfv)(GL_TH_DP, GLuint program, GLint location, GLfloat* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetUniformfv))orig_func)
+           (program, location, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetUniformiv(GLuint program, GLint location, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetUniformiv))(GLuint program, GLint location, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLint* params;
+
+} GL_TH_ST(glGetUniformiv);
+
+static void
+GL_TH_CB(glGetUniformiv)(void *data)
+{
+   GL_TH_ST(glGetUniformiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetUniformiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetUniformiv)(GL_TH_DP, GLuint program, GLint location, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetUniformiv))orig_func)
+           (program, location, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformiv),
+                              thread_mode);
+}
+
+/*
+ * int
+ * glGetUniformLocation(GLuint program, const char* name);
+ */
+
+typedef int(*GL_TH_FNTYPE(glGetUniformLocation))(GLuint program, const char* name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformLocation) orig_func;
+   int return_value;
+   GLuint program;
+   const char* name;
+
+} GL_TH_ST(glGetUniformLocation);
+
+static void
+GL_TH_CB(glGetUniformLocation)(void *data)
+{
+   GL_TH_ST(glGetUniformLocation) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetUniformLocation))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->name);
+
+}
+
+int
+GL_TH_FN(glGetUniformLocation)(GL_TH_DP, GLuint program, const char* name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformLocation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetUniformLocation))orig_func)
+           (program, name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformLocation) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformLocation),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetVertexAttribfv))(GLuint index, GLenum pname, GLfloat* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetVertexAttribfv) orig_func;
+   GLuint index;
+   GLenum pname;
+   GLfloat* params;
+
+} GL_TH_ST(glGetVertexAttribfv);
+
+static void
+GL_TH_CB(glGetVertexAttribfv)(void *data)
+{
+   GL_TH_ST(glGetVertexAttribfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetVertexAttribfv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetVertexAttribfv)(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetVertexAttribfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetVertexAttribfv))orig_func)
+           (index, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetVertexAttribfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetVertexAttribfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetVertexAttribiv))(GLuint index, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetVertexAttribiv) orig_func;
+   GLuint index;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetVertexAttribiv);
+
+static void
+GL_TH_CB(glGetVertexAttribiv)(void *data)
+{
+   GL_TH_ST(glGetVertexAttribiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetVertexAttribiv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetVertexAttribiv)(GL_TH_DP, GLuint index, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetVertexAttribiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetVertexAttribiv))orig_func)
+           (index, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetVertexAttribiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetVertexAttribiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetVertexAttribPointerv))(GLuint index, GLenum pname, void** pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetVertexAttribPointerv) orig_func;
+   GLuint index;
+   GLenum pname;
+   void** pointer;
+
+} GL_TH_ST(glGetVertexAttribPointerv);
+
+static void
+GL_TH_CB(glGetVertexAttribPointerv)(void *data)
+{
+   GL_TH_ST(glGetVertexAttribPointerv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetVertexAttribPointerv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->pname,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glGetVertexAttribPointerv)(GL_TH_DP, GLuint index, GLenum pname, void** pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetVertexAttribPointerv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetVertexAttribPointerv))orig_func)
+           (index, pname, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetVertexAttribPointerv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->pname = pname;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetVertexAttribPointerv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glHint(GLenum target, GLenum mode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glHint))(GLenum target, GLenum mode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glHint) orig_func;
+   GLenum target;
+   GLenum mode;
+
+} GL_TH_ST(glHint);
+
+static void
+GL_TH_CB(glHint)(void *data)
+{
+   GL_TH_ST(glHint) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glHint))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->mode);
+
+}
+
+void
+GL_TH_FN(glHint)(GL_TH_DP, GLenum target, GLenum mode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glHint) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glHint))orig_func)
+           (target, mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glHint) *) + sizeof(GL_TH_ST(glHint)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glHint) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glHint),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsBuffer(GLuint buffer);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsBuffer))(GLuint buffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsBuffer) orig_func;
+   GLboolean return_value;
+   GLuint buffer;
+
+} GL_TH_ST(glIsBuffer);
+
+static void
+GL_TH_CB(glIsBuffer)(void *data)
+{
+   GL_TH_ST(glIsBuffer) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsBuffer))thread_data->orig_func)
+      (thread_data->buffer);
+
+}
+
+GLboolean
+GL_TH_FN(glIsBuffer)(GL_TH_DP, GLuint buffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsBuffer))orig_func)
+           (buffer);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffer = buffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsBuffer),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsEnabled(GLenum cap);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsEnabled))(GLenum cap);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsEnabled) orig_func;
+   GLboolean return_value;
+   GLenum cap;
+
+} GL_TH_ST(glIsEnabled);
+
+static void
+GL_TH_CB(glIsEnabled)(void *data)
+{
+   GL_TH_ST(glIsEnabled) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsEnabled))thread_data->orig_func)
+      (thread_data->cap);
+
+}
+
+GLboolean
+GL_TH_FN(glIsEnabled)(GL_TH_DP, GLenum cap)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsEnabled) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsEnabled))orig_func)
+           (cap);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsEnabled) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->cap = cap;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsEnabled),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsFramebuffer(GLuint framebuffer);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsFramebuffer))(GLuint framebuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsFramebuffer) orig_func;
+   GLboolean return_value;
+   GLuint framebuffer;
+
+} GL_TH_ST(glIsFramebuffer);
+
+static void
+GL_TH_CB(glIsFramebuffer)(void *data)
+{
+   GL_TH_ST(glIsFramebuffer) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsFramebuffer))thread_data->orig_func)
+      (thread_data->framebuffer);
+
+}
+
+GLboolean
+GL_TH_FN(glIsFramebuffer)(GL_TH_DP, GLuint framebuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsFramebuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsFramebuffer))orig_func)
+           (framebuffer);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsFramebuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->framebuffer = framebuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsFramebuffer),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsProgram(GLuint program);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsProgram))(GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsProgram) orig_func;
+   GLboolean return_value;
+   GLuint program;
+
+} GL_TH_ST(glIsProgram);
+
+static void
+GL_TH_CB(glIsProgram)(void *data)
+{
+   GL_TH_ST(glIsProgram) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsProgram))thread_data->orig_func)
+      (thread_data->program);
+
+}
+
+GLboolean
+GL_TH_FN(glIsProgram)(GL_TH_DP, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsProgram))orig_func)
+           (program);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsProgram) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsProgram),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsRenderbuffer(GLuint renderbuffer);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsRenderbuffer))(GLuint renderbuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsRenderbuffer) orig_func;
+   GLboolean return_value;
+   GLuint renderbuffer;
+
+} GL_TH_ST(glIsRenderbuffer);
+
+static void
+GL_TH_CB(glIsRenderbuffer)(void *data)
+{
+   GL_TH_ST(glIsRenderbuffer) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsRenderbuffer))thread_data->orig_func)
+      (thread_data->renderbuffer);
+
+}
+
+GLboolean
+GL_TH_FN(glIsRenderbuffer)(GL_TH_DP, GLuint renderbuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsRenderbuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsRenderbuffer))orig_func)
+           (renderbuffer);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsRenderbuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsRenderbuffer),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsShader(GLuint shader);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsShader))(GLuint shader);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsShader) orig_func;
+   GLboolean return_value;
+   GLuint shader;
+
+} GL_TH_ST(glIsShader);
+
+static void
+GL_TH_CB(glIsShader)(void *data)
+{
+   GL_TH_ST(glIsShader) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsShader))thread_data->orig_func)
+      (thread_data->shader);
+
+}
+
+GLboolean
+GL_TH_FN(glIsShader)(GL_TH_DP, GLuint shader)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsShader) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsShader))orig_func)
+           (shader);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsShader) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shader = shader;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsShader),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsTexture(GLuint texture);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsTexture))(GLuint texture);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsTexture) orig_func;
+   GLboolean return_value;
+   GLuint texture;
+
+} GL_TH_ST(glIsTexture);
+
+static void
+GL_TH_CB(glIsTexture)(void *data)
+{
+   GL_TH_ST(glIsTexture) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsTexture))thread_data->orig_func)
+      (thread_data->texture);
+
+}
+
+GLboolean
+GL_TH_FN(glIsTexture)(GL_TH_DP, GLuint texture)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsTexture))orig_func)
+           (texture);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsTexture) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsTexture),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glLineWidth(GLfloat width);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLineWidth))(GLfloat width);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLineWidth) orig_func;
+   GLfloat width;
+
+} GL_TH_ST(glLineWidth);
+
+static void
+GL_TH_CB(glLineWidth)(void *data)
+{
+   GL_TH_ST(glLineWidth) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLineWidth))thread_data->orig_func)
+      (thread_data->width);
+
+}
+
+void
+GL_TH_FN(glLineWidth)(GL_TH_DP, GLfloat width)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLineWidth) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLineWidth))orig_func)
+           (width);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLineWidth) *) + sizeof(GL_TH_ST(glLineWidth)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glLineWidth) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->width = width;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLineWidth),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLinkProgram(GLuint program);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLinkProgram))(GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLinkProgram) orig_func;
+   GLuint program;
+
+} GL_TH_ST(glLinkProgram);
+
+static void
+GL_TH_CB(glLinkProgram)(void *data)
+{
+   GL_TH_ST(glLinkProgram) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLinkProgram))thread_data->orig_func)
+      (thread_data->program);
+
+}
+
+void
+GL_TH_FN(glLinkProgram)(GL_TH_DP, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLinkProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLinkProgram))orig_func)
+           (program);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLinkProgram) *) + sizeof(GL_TH_ST(glLinkProgram)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glLinkProgram) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLinkProgram),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPixelStorei(GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPixelStorei))(GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPixelStorei) orig_func;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glPixelStorei);
+
+static void
+GL_TH_CB(glPixelStorei)(void *data)
+{
+   GL_TH_ST(glPixelStorei) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPixelStorei))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glPixelStorei)(GL_TH_DP, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPixelStorei) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPixelStorei))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPixelStorei) *) + sizeof(GL_TH_ST(glPixelStorei)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glPixelStorei) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPixelStorei),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPolygonOffset(GLfloat factor, GLfloat units);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPolygonOffset))(GLfloat factor, GLfloat units);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPolygonOffset) orig_func;
+   GLfloat factor;
+   GLfloat units;
+
+} GL_TH_ST(glPolygonOffset);
+
+static void
+GL_TH_CB(glPolygonOffset)(void *data)
+{
+   GL_TH_ST(glPolygonOffset) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPolygonOffset))thread_data->orig_func)
+      (thread_data->factor,
+       thread_data->units);
+
+}
+
+void
+GL_TH_FN(glPolygonOffset)(GL_TH_DP, GLfloat factor, GLfloat units)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPolygonOffset) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPolygonOffset))orig_func)
+           (factor, units);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPolygonOffset) *) + sizeof(GL_TH_ST(glPolygonOffset)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glPolygonOffset) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->factor = factor;
+   thread_data->units = units;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPolygonOffset),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glReadPixels))(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glReadPixels) orig_func;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+   GLenum format;
+   GLenum type;
+   void* pixels;
+
+} GL_TH_ST(glReadPixels);
+
+static void
+GL_TH_CB(glReadPixels)(void *data)
+{
+   GL_TH_ST(glReadPixels) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glReadPixels))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height,
+       thread_data->format,
+       thread_data->type,
+       thread_data->pixels);
+
+}
+
+void
+GL_TH_FN(glReadPixels)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glReadPixels) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glReadPixels))orig_func)
+           (x, y, width, height, format, type, pixels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glReadPixels) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->pixels = pixels;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glReadPixels),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glReleaseShaderCompiler(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glReleaseShaderCompiler))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glReleaseShaderCompiler) orig_func;
+
+} GL_TH_ST(glReleaseShaderCompiler);
+
+static void
+GL_TH_CB(glReleaseShaderCompiler)(void *data)
+{
+   GL_TH_ST(glReleaseShaderCompiler) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glReleaseShaderCompiler))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glReleaseShaderCompiler)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glReleaseShaderCompiler) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glReleaseShaderCompiler))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glReleaseShaderCompiler) *) + sizeof(GL_TH_ST(glReleaseShaderCompiler)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glReleaseShaderCompiler) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glReleaseShaderCompiler),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorage))(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorage) orig_func;
+   GLenum target;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glRenderbufferStorage);
+
+static void
+GL_TH_CB(glRenderbufferStorage)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorage) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorage))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorage)(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorage))orig_func)
+           (target, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorage) *) + sizeof(GL_TH_ST(glRenderbufferStorage)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glRenderbufferStorage) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorage),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSampleCoverage(GLclampf value, GLboolean invert);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSampleCoverage))(GLclampf value, GLboolean invert);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSampleCoverage) orig_func;
+   GLclampf value;
+   GLboolean invert;
+
+} GL_TH_ST(glSampleCoverage);
+
+static void
+GL_TH_CB(glSampleCoverage)(void *data)
+{
+   GL_TH_ST(glSampleCoverage) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSampleCoverage))thread_data->orig_func)
+      (thread_data->value,
+       thread_data->invert);
+
+}
+
+void
+GL_TH_FN(glSampleCoverage)(GL_TH_DP, GLclampf value, GLboolean invert)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSampleCoverage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSampleCoverage))orig_func)
+           (value, invert);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSampleCoverage) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->value = value;
+   thread_data->invert = invert;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSampleCoverage),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glScissor))(GLint x, GLint y, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glScissor) orig_func;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glScissor);
+
+static void
+GL_TH_CB(glScissor)(void *data)
+{
+   GL_TH_ST(glScissor) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glScissor))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glScissor)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glScissor) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glScissor))orig_func)
+           (x, y, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glScissor) *) + sizeof(GL_TH_ST(glScissor)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glScissor) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glScissor),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glShaderBinary))(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glShaderBinary) orig_func;
+   GLsizei n;
+   const GLuint* shaders;
+   GLenum binaryformat;
+   const void* binary;
+   GLsizei length;
+
+} GL_TH_ST(glShaderBinary);
+
+static void
+GL_TH_CB(glShaderBinary)(void *data)
+{
+   GL_TH_ST(glShaderBinary) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glShaderBinary))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->shaders,
+       thread_data->binaryformat,
+       thread_data->binary,
+       thread_data->length);
+
+}
+
+void
+GL_TH_FN(glShaderBinary)(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glShaderBinary) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glShaderBinary))orig_func)
+           (n, shaders, binaryformat, binary, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glShaderBinary) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->shaders = shaders;
+   thread_data->binaryformat = binaryformat;
+   thread_data->binary = binary;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glShaderBinary),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glShaderSource(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glShaderSource))(GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glShaderSource) orig_func;
+   GLuint shader;
+   GLsizei count;
+   const char* const * string;
+   const GLint* length;
+   GLSHADERSOURCE_VARIABLE_DECLARE /* TODO */
+
+} GL_TH_ST(glShaderSource);
+
+static void
+GL_TH_CB(glShaderSource)(void *data)
+{
+   GL_TH_ST(glShaderSource) *thread_data =
+      *(void **)data;
+
+
+   GLSHADERSOURCE_GLCALL_BEFORE; /* TODO */
+
+
+   ((GL_TH_FNTYPE(glShaderSource))thread_data->orig_func)
+      (thread_data->shader,
+       thread_data->count,
+       thread_data->string,
+       thread_data->length);
+
+   GLSHADERSOURCE_GLCALL_AFTER; /* TODO */
+
+}
+
+void
+GL_TH_FN(glShaderSource)(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glShaderSource) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glShaderSource))orig_func)
+           (shader, count, string, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glShaderSource) *) + sizeof(GL_TH_ST(glShaderSource)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glShaderSource) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->shader = shader;
+   thread_data->count = count;
+   thread_data->string = string;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   GLSHADERSOURCE_VARIABLE_INIT; /* TODO */
+
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   GLSHADERSOURCE_ASYNC_PREPARE; /* TODO */
+
+finish:
+   GLSHADERSOURCE_ENQUEUE_BEFORE; /* TODO */
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glShaderSource),
+                              thread_mode);
+
+   GLSHADERSOURCE_ENQUEUE_AFTER; /* TODO */
+}
+
+/*
+ * void
+ * glStencilFunc(GLenum func, GLint ref, GLuint mask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilFunc))(GLenum func, GLint ref, GLuint mask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilFunc) orig_func;
+   GLenum func;
+   GLint ref;
+   GLuint mask;
+
+} GL_TH_ST(glStencilFunc);
+
+static void
+GL_TH_CB(glStencilFunc)(void *data)
+{
+   GL_TH_ST(glStencilFunc) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilFunc))thread_data->orig_func)
+      (thread_data->func,
+       thread_data->ref,
+       thread_data->mask);
+
+}
+
+void
+GL_TH_FN(glStencilFunc)(GL_TH_DP, GLenum func, GLint ref, GLuint mask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilFunc) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilFunc))orig_func)
+           (func, ref, mask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilFunc) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->func = func;
+   thread_data->ref = ref;
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilFunc),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilFuncSeparate))(GLenum face, GLenum func, GLint ref, GLuint mask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilFuncSeparate) orig_func;
+   GLenum face;
+   GLenum func;
+   GLint ref;
+   GLuint mask;
+
+} GL_TH_ST(glStencilFuncSeparate);
+
+static void
+GL_TH_CB(glStencilFuncSeparate)(void *data)
+{
+   GL_TH_ST(glStencilFuncSeparate) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilFuncSeparate))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->func,
+       thread_data->ref,
+       thread_data->mask);
+
+}
+
+void
+GL_TH_FN(glStencilFuncSeparate)(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilFuncSeparate) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilFuncSeparate))orig_func)
+           (face, func, ref, mask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilFuncSeparate) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->func = func;
+   thread_data->ref = ref;
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilFuncSeparate),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStencilMask(GLuint mask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilMask))(GLuint mask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilMask) orig_func;
+   GLuint mask;
+
+} GL_TH_ST(glStencilMask);
+
+static void
+GL_TH_CB(glStencilMask)(void *data)
+{
+   GL_TH_ST(glStencilMask) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilMask))thread_data->orig_func)
+      (thread_data->mask);
+
+}
+
+void
+GL_TH_FN(glStencilMask)(GL_TH_DP, GLuint mask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilMask) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilMask))orig_func)
+           (mask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilMask) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilMask),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStencilMaskSeparate(GLenum face, GLuint mask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilMaskSeparate))(GLenum face, GLuint mask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilMaskSeparate) orig_func;
+   GLenum face;
+   GLuint mask;
+
+} GL_TH_ST(glStencilMaskSeparate);
+
+static void
+GL_TH_CB(glStencilMaskSeparate)(void *data)
+{
+   GL_TH_ST(glStencilMaskSeparate) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilMaskSeparate))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->mask);
+
+}
+
+void
+GL_TH_FN(glStencilMaskSeparate)(GL_TH_DP, GLenum face, GLuint mask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilMaskSeparate) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilMaskSeparate))orig_func)
+           (face, mask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilMaskSeparate) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilMaskSeparate),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilOp))(GLenum fail, GLenum zfail, GLenum zpass);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilOp) orig_func;
+   GLenum fail;
+   GLenum zfail;
+   GLenum zpass;
+
+} GL_TH_ST(glStencilOp);
+
+static void
+GL_TH_CB(glStencilOp)(void *data)
+{
+   GL_TH_ST(glStencilOp) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilOp))thread_data->orig_func)
+      (thread_data->fail,
+       thread_data->zfail,
+       thread_data->zpass);
+
+}
+
+void
+GL_TH_FN(glStencilOp)(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilOp) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilOp))orig_func)
+           (fail, zfail, zpass);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilOp) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->fail = fail;
+   thread_data->zfail = zfail;
+   thread_data->zpass = zpass;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilOp),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStencilOpSeparate))(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStencilOpSeparate) orig_func;
+   GLenum face;
+   GLenum fail;
+   GLenum zfail;
+   GLenum zpass;
+
+} GL_TH_ST(glStencilOpSeparate);
+
+static void
+GL_TH_CB(glStencilOpSeparate)(void *data)
+{
+   GL_TH_ST(glStencilOpSeparate) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStencilOpSeparate))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->fail,
+       thread_data->zfail,
+       thread_data->zpass);
+
+}
+
+void
+GL_TH_FN(glStencilOpSeparate)(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStencilOpSeparate) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStencilOpSeparate))orig_func)
+           (face, fail, zfail, zpass);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStencilOpSeparate) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->fail = fail;
+   thread_data->zfail = zfail;
+   thread_data->zpass = zpass;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStencilOpSeparate),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexImage2D))(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLint border;
+   GLenum format;
+   GLenum type;
+   const void* pixels;
+   GLTEXIMAGE2D_VARIABLE_DECLARE /* TODO */
+
+} GL_TH_ST(glTexImage2D);
+
+static void
+GL_TH_CB(glTexImage2D)(void *data)
+{
+   GL_TH_ST(glTexImage2D) *thread_data =
+      *(void **)data;
+
+
+   GLTEXIMAGE2D_GLCALL_BEFORE; /* TODO */
+
+
+   ((GL_TH_FNTYPE(glTexImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->border,
+       thread_data->format,
+       thread_data->type,
+       thread_data->pixels);
+
+   GLTEXIMAGE2D_GLCALL_AFTER; /* TODO */
+
+}
+
+void
+GL_TH_FN(glTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexImage2D))orig_func)
+           (target, level, internalformat, width, height, border, format, type, pixels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexImage2D) *) + sizeof(GL_TH_ST(glTexImage2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexImage2D) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->border = border;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->pixels = pixels;
+   thread_data->orig_func = orig_func;
+
+   GLTEXIMAGE2D_VARIABLE_INIT; /* TODO */
+
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   GLTEXIMAGE2D_ASYNC_PREPARE; /* TODO */
+
+finish:
+   GLTEXIMAGE2D_ENQUEUE_BEFORE; /* TODO */
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexImage2D),
+                              thread_mode);
+
+   GLTEXIMAGE2D_ENQUEUE_AFTER; /* TODO */
+}
+
+/*
+ * void
+ * glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterf))(GLenum target, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterf) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glTexParameterf);
+
+static void
+GL_TH_CB(glTexParameterf)(void *data)
+{
+   GL_TH_ST(glTexParameterf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterf))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexParameterf)(GL_TH_DP, GLenum target, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterf))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterf) *) + sizeof(GL_TH_ST(glTexParameterf)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexParameterf) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterfv))(GLenum target, GLenum pname, const GLfloat* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterfv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfloat* params;
+   void *params_copied; /* COPIED */
+
+} GL_TH_ST(glTexParameterfv);
+
+static void
+GL_TH_CB(glTexParameterfv)(void *data)
+{
+   GL_TH_ST(glTexParameterfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterfv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+
+   if (thread_data->params_copied)
+     eina_mempool_free(_mp_default, thread_data->params_copied);
+
+}
+
+void
+GL_TH_FN(glTexParameterfv)(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterfv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterfv) *) + sizeof(GL_TH_ST(glTexParameterfv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexParameterfv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   thread_data->params_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (params)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = sizeof(GLfloat);
+        if (copy_size > _mp_default_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
+        if (thread_data->params_copied)
+          {
+             memcpy(thread_data->params_copied, params, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->params = (const GLfloat *)thread_data->params_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameteri(GLenum target, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameteri))(GLenum target, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameteri) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glTexParameteri);
+
+static void
+GL_TH_CB(glTexParameteri)(void *data)
+{
+   GL_TH_ST(glTexParameteri) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameteri))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexParameteri)(GL_TH_DP, GLenum target, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameteri) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameteri))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameteri) *) + sizeof(GL_TH_ST(glTexParameteri)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexParameteri) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameteri),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameteriv))(GLenum target, GLenum pname, const GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameteriv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLint* params;
+   void *params_copied; /* COPIED */
+
+} GL_TH_ST(glTexParameteriv);
+
+static void
+GL_TH_CB(glTexParameteriv)(void *data)
+{
+   GL_TH_ST(glTexParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+
+   if (thread_data->params_copied)
+     eina_mempool_free(_mp_default, thread_data->params_copied);
+
+}
+
+void
+GL_TH_FN(glTexParameteriv)(GL_TH_DP, GLenum target, GLenum pname, const GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameteriv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameteriv) *) + sizeof(GL_TH_ST(glTexParameteriv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexParameteriv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   thread_data->params_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (params)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = sizeof(GLint);
+        if (copy_size > _mp_default_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
+        if (thread_data->params_copied)
+          {
+             memcpy(thread_data->params_copied, params, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->params = (const GLint *)thread_data->params_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexSubImage2D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexSubImage2D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLsizei width;
+   GLsizei height;
+   GLenum format;
+   GLenum type;
+   const void* pixels;
+   GLTEXSUBIMAGE2D_VARIABLE_DECLARE /* TODO */
+
+} GL_TH_ST(glTexSubImage2D);
+
+static void
+GL_TH_CB(glTexSubImage2D)(void *data)
+{
+   GL_TH_ST(glTexSubImage2D) *thread_data =
+      *(void **)data;
+
+
+   GLTEXSUBIMAGE2D_GLCALL_BEFORE; /* TODO */
+
+
+   ((GL_TH_FNTYPE(glTexSubImage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->format,
+       thread_data->type,
+       thread_data->pixels);
+
+   GLTEXSUBIMAGE2D_GLCALL_AFTER; /* TODO */
+
+}
+
+void
+GL_TH_FN(glTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexSubImage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexSubImage2D))orig_func)
+           (target, level, xoffset, yoffset, width, height, format, type, pixels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexSubImage2D) *) + sizeof(GL_TH_ST(glTexSubImage2D)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glTexSubImage2D) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->pixels = pixels;
+   thread_data->orig_func = orig_func;
+
+   GLTEXSUBIMAGE2D_VARIABLE_INIT; /* TODO */
+
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   GLTEXSUBIMAGE2D_ASYNC_PREPARE; /* TODO */
+
+finish:
+   GLTEXSUBIMAGE2D_ENQUEUE_BEFORE; /* TODO */
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexSubImage2D),
+                              thread_mode);
+
+   GLTEXSUBIMAGE2D_ENQUEUE_AFTER; /* TODO */
+}
+
+/*
+ * void
+ * glUniform1f(GLint location, GLfloat x);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1f))(GLint location, GLfloat x);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1f) orig_func;
+   GLint location;
+   GLfloat x;
+
+} GL_TH_ST(glUniform1f);
+
+static void
+GL_TH_CB(glUniform1f)(void *data)
+{
+   GL_TH_ST(glUniform1f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1f))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x);
+
+}
+
+void
+GL_TH_FN(glUniform1f)(GL_TH_DP, GLint location, GLfloat x)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1f))orig_func)
+           (location, x);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1f) *) + sizeof(GL_TH_ST(glUniform1f)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform1f) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1fv))(GLint location, GLsizei count, const GLfloat* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1fv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLfloat* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform1fv);
+
+static void
+GL_TH_CB(glUniform1fv)(void *data)
+{
+   GL_TH_ST(glUniform1fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform1fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1fv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1fv) *) + sizeof(GL_TH_ST(glUniform1fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform1fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 1 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLfloat *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform1i(GLint location, GLint x);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1i))(GLint location, GLint x);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1i) orig_func;
+   GLint location;
+   GLint x;
+
+} GL_TH_ST(glUniform1i);
+
+static void
+GL_TH_CB(glUniform1i)(void *data)
+{
+   GL_TH_ST(glUniform1i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1i))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x);
+
+}
+
+void
+GL_TH_FN(glUniform1i)(GL_TH_DP, GLint location, GLint x)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1i))orig_func)
+           (location, x);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1i) *) + sizeof(GL_TH_ST(glUniform1i)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform1i) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform1iv(GLint location, GLsizei count, const GLint* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1iv))(GLint location, GLsizei count, const GLint* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1iv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLint* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform1iv);
+
+static void
+GL_TH_CB(glUniform1iv)(void *data)
+{
+   GL_TH_ST(glUniform1iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1iv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform1iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1iv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1iv) *) + sizeof(GL_TH_ST(glUniform1iv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform1iv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 1 * count * sizeof(GLint);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLint *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2f(GLint location, GLfloat x, GLfloat y);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2f))(GLint location, GLfloat x, GLfloat y);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2f) orig_func;
+   GLint location;
+   GLfloat x;
+   GLfloat y;
+
+} GL_TH_ST(glUniform2f);
+
+static void
+GL_TH_CB(glUniform2f)(void *data)
+{
+   GL_TH_ST(glUniform2f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2f))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y);
+
+}
+
+void
+GL_TH_FN(glUniform2f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2f))orig_func)
+           (location, x, y);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2f) *) + sizeof(GL_TH_ST(glUniform2f)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform2f) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2fv))(GLint location, GLsizei count, const GLfloat* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2fv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLfloat* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform2fv);
+
+static void
+GL_TH_CB(glUniform2fv)(void *data)
+{
+   GL_TH_ST(glUniform2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform2fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2fv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2fv) *) + sizeof(GL_TH_ST(glUniform2fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform2fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 2 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLfloat *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2i(GLint location, GLint x, GLint y);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2i))(GLint location, GLint x, GLint y);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2i) orig_func;
+   GLint location;
+   GLint x;
+   GLint y;
+
+} GL_TH_ST(glUniform2i);
+
+static void
+GL_TH_CB(glUniform2i)(void *data)
+{
+   GL_TH_ST(glUniform2i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2i))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y);
+
+}
+
+void
+GL_TH_FN(glUniform2i)(GL_TH_DP, GLint location, GLint x, GLint y)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2i))orig_func)
+           (location, x, y);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2i) *) + sizeof(GL_TH_ST(glUniform2i)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform2i) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2iv(GLint location, GLsizei count, const GLint* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2iv))(GLint location, GLsizei count, const GLint* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2iv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLint* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform2iv);
+
+static void
+GL_TH_CB(glUniform2iv)(void *data)
+{
+   GL_TH_ST(glUniform2iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2iv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform2iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2iv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2iv) *) + sizeof(GL_TH_ST(glUniform2iv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform2iv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 2 * count * sizeof(GLint);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLint *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3f))(GLint location, GLfloat x, GLfloat y, GLfloat z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3f) orig_func;
+   GLint location;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+
+} GL_TH_ST(glUniform3f);
+
+static void
+GL_TH_CB(glUniform3f)(void *data)
+{
+   GL_TH_ST(glUniform3f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3f))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glUniform3f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3f))orig_func)
+           (location, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3f) *) + sizeof(GL_TH_ST(glUniform3f)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform3f) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3fv))(GLint location, GLsizei count, const GLfloat* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3fv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLfloat* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform3fv);
+
+static void
+GL_TH_CB(glUniform3fv)(void *data)
+{
+   GL_TH_ST(glUniform3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform3fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3fv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3fv) *) + sizeof(GL_TH_ST(glUniform3fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform3fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 3 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLfloat *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3i(GLint location, GLint x, GLint y, GLint z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3i))(GLint location, GLint x, GLint y, GLint z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3i) orig_func;
+   GLint location;
+   GLint x;
+   GLint y;
+   GLint z;
+
+} GL_TH_ST(glUniform3i);
+
+static void
+GL_TH_CB(glUniform3i)(void *data)
+{
+   GL_TH_ST(glUniform3i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3i))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glUniform3i)(GL_TH_DP, GLint location, GLint x, GLint y, GLint z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3i))orig_func)
+           (location, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3i) *) + sizeof(GL_TH_ST(glUniform3i)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform3i) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3iv(GLint location, GLsizei count, const GLint* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3iv))(GLint location, GLsizei count, const GLint* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3iv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLint* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform3iv);
+
+static void
+GL_TH_CB(glUniform3iv)(void *data)
+{
+   GL_TH_ST(glUniform3iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3iv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform3iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3iv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3iv) *) + sizeof(GL_TH_ST(glUniform3iv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform3iv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 3 * count * sizeof(GLint);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLint *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4f))(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4f) orig_func;
+   GLint location;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+   GLfloat w;
+
+} GL_TH_ST(glUniform4f);
+
+static void
+GL_TH_CB(glUniform4f)(void *data)
+{
+   GL_TH_ST(glUniform4f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4f))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->w);
+
+}
+
+void
+GL_TH_FN(glUniform4f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4f))orig_func)
+           (location, x, y, z, w);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4f) *) + sizeof(GL_TH_ST(glUniform4f)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform4f) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->w = w;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4fv))(GLint location, GLsizei count, const GLfloat* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4fv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLfloat* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform4fv);
+
+static void
+GL_TH_CB(glUniform4fv)(void *data)
+{
+   GL_TH_ST(glUniform4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform4fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4fv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4fv) *) + sizeof(GL_TH_ST(glUniform4fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform4fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 4 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLfloat *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4i))(GLint location, GLint x, GLint y, GLint z, GLint w);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4i) orig_func;
+   GLint location;
+   GLint x;
+   GLint y;
+   GLint z;
+   GLint w;
+
+} GL_TH_ST(glUniform4i);
+
+static void
+GL_TH_CB(glUniform4i)(void *data)
+{
+   GL_TH_ST(glUniform4i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4i))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->w);
+
+}
+
+void
+GL_TH_FN(glUniform4i)(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4i))orig_func)
+           (location, x, y, z, w);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4i) *) + sizeof(GL_TH_ST(glUniform4i)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform4i) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->w = w;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4iv(GLint location, GLsizei count, const GLint* v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4iv))(GLint location, GLsizei count, const GLint* v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4iv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLint* v;
+   void *v_copied; /* COPIED */
+
+} GL_TH_ST(glUniform4iv);
+
+static void
+GL_TH_CB(glUniform4iv)(void *data)
+{
+   GL_TH_ST(glUniform4iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4iv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->v);
+
+
+   if (thread_data->v_copied)
+     eina_mempool_free(_mp_uniform, thread_data->v_copied);
+
+}
+
+void
+GL_TH_FN(glUniform4iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4iv))orig_func)
+           (location, count, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4iv) *) + sizeof(GL_TH_ST(glUniform4iv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniform4iv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   thread_data->v_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (v)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 4 * count * sizeof(GLint);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->v_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->v_copied)
+          {
+             memcpy(thread_data->v_copied, v, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->v = (const GLint *)thread_data->v_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix2fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix2fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat* value;
+   void *value_copied; /* COPIED */
+
+} GL_TH_ST(glUniformMatrix2fv);
+
+static void
+GL_TH_CB(glUniformMatrix2fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix2fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+
+   if (thread_data->value_copied)
+     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix2fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix2fv) *) + sizeof(GL_TH_ST(glUniformMatrix2fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniformMatrix2fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   thread_data->value_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (value)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 4 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->value_copied)
+          {
+             memcpy(thread_data->value_copied, value, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->value = (const GLfloat *)thread_data->value_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix3fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix3fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat* value;
+   void *value_copied; /* COPIED */
+
+} GL_TH_ST(glUniformMatrix3fv);
+
+static void
+GL_TH_CB(glUniformMatrix3fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix3fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+
+   if (thread_data->value_copied)
+     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix3fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix3fv) *) + sizeof(GL_TH_ST(glUniformMatrix3fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniformMatrix3fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   thread_data->value_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (value)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 9 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->value_copied)
+          {
+             memcpy(thread_data->value_copied, value, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->value = (const GLfloat *)thread_data->value_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix4fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix4fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat* value;
+   void *value_copied; /* COPIED */
+
+} GL_TH_ST(glUniformMatrix4fv);
+
+static void
+GL_TH_CB(glUniformMatrix4fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix4fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+
+   if (thread_data->value_copied)
+     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix4fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix4fv) *) + sizeof(GL_TH_ST(glUniformMatrix4fv)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUniformMatrix4fv) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   thread_data->value_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (value)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = 16 * count * sizeof(GLfloat);
+        if (copy_size > _mp_uniform_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
+        if (thread_data->value_copied)
+          {
+             memcpy(thread_data->value_copied, value, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->value = (const GLfloat *)thread_data->value_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix4fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUseProgram(GLuint program);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUseProgram))(GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUseProgram) orig_func;
+   GLuint program;
+
+} GL_TH_ST(glUseProgram);
+
+static void
+GL_TH_CB(glUseProgram)(void *data)
+{
+   GL_TH_ST(glUseProgram) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUseProgram))thread_data->orig_func)
+      (thread_data->program);
+
+}
+
+void
+GL_TH_FN(glUseProgram)(GL_TH_DP, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUseProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUseProgram))orig_func)
+           (program);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUseProgram) *) + sizeof(GL_TH_ST(glUseProgram)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glUseProgram) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUseProgram),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glValidateProgram(GLuint program);
+ */
+
+typedef void(*GL_TH_FNTYPE(glValidateProgram))(GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glValidateProgram) orig_func;
+   GLuint program;
+
+} GL_TH_ST(glValidateProgram);
+
+static void
+GL_TH_CB(glValidateProgram)(void *data)
+{
+   GL_TH_ST(glValidateProgram) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glValidateProgram))thread_data->orig_func)
+      (thread_data->program);
+
+}
+
+void
+GL_TH_FN(glValidateProgram)(GL_TH_DP, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glValidateProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glValidateProgram))orig_func)
+           (program);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glValidateProgram) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glValidateProgram),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib1f(GLuint indx, GLfloat x);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib1f))(GLuint indx, GLfloat x);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib1f) orig_func;
+   GLuint indx;
+   GLfloat x;
+
+} GL_TH_ST(glVertexAttrib1f);
+
+static void
+GL_TH_CB(glVertexAttrib1f)(void *data)
+{
+   GL_TH_ST(glVertexAttrib1f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib1f))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->x);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib1f)(GL_TH_DP, GLuint indx, GLfloat x)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib1f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib1f))orig_func)
+           (indx, x);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib1f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->x = x;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib1f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib1fv(GLuint indx, const GLfloat* values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib1fv))(GLuint indx, const GLfloat* values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib1fv) orig_func;
+   GLuint indx;
+   const GLfloat* values;
+
+} GL_TH_ST(glVertexAttrib1fv);
+
+static void
+GL_TH_CB(glVertexAttrib1fv)(void *data)
+{
+   GL_TH_ST(glVertexAttrib1fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib1fv))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib1fv)(GL_TH_DP, GLuint indx, const GLfloat* values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib1fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib1fv))orig_func)
+           (indx, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib1fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib1fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib2f))(GLuint indx, GLfloat x, GLfloat y);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib2f) orig_func;
+   GLuint indx;
+   GLfloat x;
+   GLfloat y;
+
+} GL_TH_ST(glVertexAttrib2f);
+
+static void
+GL_TH_CB(glVertexAttrib2f)(void *data)
+{
+   GL_TH_ST(glVertexAttrib2f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib2f))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->x,
+       thread_data->y);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib2f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib2f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib2f))orig_func)
+           (indx, x, y);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib2f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib2f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib2fv(GLuint indx, const GLfloat* values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib2fv))(GLuint indx, const GLfloat* values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib2fv) orig_func;
+   GLuint indx;
+   const GLfloat* values;
+
+} GL_TH_ST(glVertexAttrib2fv);
+
+static void
+GL_TH_CB(glVertexAttrib2fv)(void *data)
+{
+   GL_TH_ST(glVertexAttrib2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib2fv))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib2fv)(GL_TH_DP, GLuint indx, const GLfloat* values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib2fv))orig_func)
+           (indx, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib3f))(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib3f) orig_func;
+   GLuint indx;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+
+} GL_TH_ST(glVertexAttrib3f);
+
+static void
+GL_TH_CB(glVertexAttrib3f)(void *data)
+{
+   GL_TH_ST(glVertexAttrib3f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib3f))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib3f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib3f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib3f))orig_func)
+           (indx, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib3f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib3f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib3fv(GLuint indx, const GLfloat* values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib3fv))(GLuint indx, const GLfloat* values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib3fv) orig_func;
+   GLuint indx;
+   const GLfloat* values;
+
+} GL_TH_ST(glVertexAttrib3fv);
+
+static void
+GL_TH_CB(glVertexAttrib3fv)(void *data)
+{
+   GL_TH_ST(glVertexAttrib3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib3fv))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib3fv)(GL_TH_DP, GLuint indx, const GLfloat* values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib3fv))orig_func)
+           (indx, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib4f))(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib4f) orig_func;
+   GLuint indx;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+   GLfloat w;
+
+} GL_TH_ST(glVertexAttrib4f);
+
+static void
+GL_TH_CB(glVertexAttrib4f)(void *data)
+{
+   GL_TH_ST(glVertexAttrib4f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib4f))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->w);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib4f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib4f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib4f))orig_func)
+           (indx, x, y, z, w);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib4f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->w = w;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib4f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttrib4fv(GLuint indx, const GLfloat* values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttrib4fv))(GLuint indx, const GLfloat* values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttrib4fv) orig_func;
+   GLuint indx;
+   const GLfloat* values;
+
+} GL_TH_ST(glVertexAttrib4fv);
+
+static void
+GL_TH_CB(glVertexAttrib4fv)(void *data)
+{
+   GL_TH_ST(glVertexAttrib4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttrib4fv))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glVertexAttrib4fv)(GL_TH_DP, GLuint indx, const GLfloat* values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttrib4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttrib4fv))orig_func)
+           (indx, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttrib4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttrib4fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribPointer))(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribPointer) orig_func;
+   GLuint indx;
+   GLint size;
+   GLenum type;
+   GLboolean normalized;
+   GLsizei stride;
+   const void* ptr;
+
+} GL_TH_ST(glVertexAttribPointer);
+
+static void
+GL_TH_CB(glVertexAttribPointer)(void *data)
+{
+   GL_TH_ST(glVertexAttribPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribPointer))thread_data->orig_func)
+      (thread_data->indx,
+       thread_data->size,
+       thread_data->type,
+       thread_data->normalized,
+       thread_data->stride,
+       thread_data->ptr);
+
+}
+
+void
+GL_TH_FN(glVertexAttribPointer)(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribPointer))orig_func)
+           (indx, size, type, normalized, stride, ptr);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indx = indx;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->normalized = normalized;
+   thread_data->stride = stride;
+   thread_data->ptr = ptr;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glViewport))(GLint x, GLint y, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glViewport) orig_func;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glViewport);
+
+static void
+GL_TH_CB(glViewport)(void *data)
+{
+   GL_TH_ST(glViewport) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glViewport))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glViewport)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glViewport) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glViewport))orig_func)
+           (x, y, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glViewport) *) + sizeof(GL_TH_ST(glViewport)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glViewport) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glViewport),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEvasGLImageTargetTexture2DOES(GLenum target, EvasGLImage image);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEvasGLImageTargetTexture2DOES))(GLenum target, EvasGLImage image);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEvasGLImageTargetTexture2DOES) orig_func;
+   GLenum target;
+   EvasGLImage image;
+
+} GL_TH_ST(glEvasGLImageTargetTexture2DOES);
+
+static void
+GL_TH_CB(glEvasGLImageTargetTexture2DOES)(void *data)
+{
+   GL_TH_ST(glEvasGLImageTargetTexture2DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEvasGLImageTargetTexture2DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->image);
+
+}
+
+void
+GL_TH_FN(glEvasGLImageTargetTexture2DOES)(GL_TH_DP, GLenum target, EvasGLImage image)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEvasGLImageTargetTexture2DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEvasGLImageTargetTexture2DOES))orig_func)
+           (target, image);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEvasGLImageTargetTexture2DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->image = image;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEvasGLImageTargetTexture2DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEvasGLImageTargetRenderbufferStorageOES(GLenum target, EvasGLImage image);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEvasGLImageTargetRenderbufferStorageOES))(GLenum target, EvasGLImage image);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEvasGLImageTargetRenderbufferStorageOES) orig_func;
+   GLenum target;
+   EvasGLImage image;
+
+} GL_TH_ST(glEvasGLImageTargetRenderbufferStorageOES);
+
+static void
+GL_TH_CB(glEvasGLImageTargetRenderbufferStorageOES)(void *data)
+{
+   GL_TH_ST(glEvasGLImageTargetRenderbufferStorageOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEvasGLImageTargetRenderbufferStorageOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->image);
+
+}
+
+void
+GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES)(GL_TH_DP, GLenum target, EvasGLImage image)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEvasGLImageTargetRenderbufferStorageOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEvasGLImageTargetRenderbufferStorageOES))orig_func)
+           (target, image);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEvasGLImageTargetRenderbufferStorageOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->image = image;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEvasGLImageTargetRenderbufferStorageOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramBinaryOES))(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramBinaryOES) orig_func;
+   GLuint program;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLenum *binaryFormat;
+   void *binary;
+
+} GL_TH_ST(glGetProgramBinaryOES);
+
+static void
+GL_TH_CB(glGetProgramBinaryOES)(void *data)
+{
+   GL_TH_ST(glGetProgramBinaryOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramBinaryOES))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->binaryFormat,
+       thread_data->binary);
+
+}
+
+void
+GL_TH_FN(glGetProgramBinaryOES)(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramBinaryOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramBinaryOES))orig_func)
+           (program, bufSize, length, binaryFormat, binary);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramBinaryOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->binaryFormat = binaryFormat;
+   thread_data->binary = binary;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramBinaryOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramBinaryOES(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramBinaryOES))(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramBinaryOES) orig_func;
+   GLuint program;
+   GLenum binaryFormat;
+   const void *binary;
+   GLint length;
+   void *binary_copied; /* COPIED */
+
+} GL_TH_ST(glProgramBinaryOES);
+
+static void
+GL_TH_CB(glProgramBinaryOES)(void *data)
+{
+   GL_TH_ST(glProgramBinaryOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramBinaryOES))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->binaryFormat,
+       thread_data->binary,
+       thread_data->length);
+
+
+   if (thread_data->binary_copied)
+     eina_mempool_free(_mp_default, thread_data->binary_copied);
+
+}
+
+void
+GL_TH_FN(glProgramBinaryOES)(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramBinaryOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramBinaryOES))orig_func)
+           (program, binaryFormat, binary, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramBinaryOES) *) + sizeof(GL_TH_ST(glProgramBinaryOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glProgramBinaryOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->binaryFormat = binaryFormat;
+   thread_data->binary = binary;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   thread_data->binary_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (binary)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = length;
+        if (copy_size > _mp_default_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
+        if (thread_data->binary_copied)
+          {
+             memcpy(thread_data->binary_copied, binary, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->binary = (const void  *)thread_data->binary_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramBinaryOES),
+                              thread_mode);
+}
+
+/*
+ * void *
+ * glMapBufferOES(GLenum target, GLenum access);
+ */
+
+typedef void *(*GL_TH_FNTYPE(glMapBufferOES))(GLenum target, GLenum access);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMapBufferOES) orig_func;
+   void * return_value;
+   GLenum target;
+   GLenum access;
+
+} GL_TH_ST(glMapBufferOES);
+
+static void
+GL_TH_CB(glMapBufferOES)(void *data)
+{
+   GL_TH_ST(glMapBufferOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glMapBufferOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->access);
+
+}
+
+void *
+GL_TH_FN(glMapBufferOES)(GL_TH_DP, GLenum target, GLenum access)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMapBufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glMapBufferOES))orig_func)
+           (target, access);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMapBufferOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->access = access;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMapBufferOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glUnmapBufferOES(GLenum target);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glUnmapBufferOES))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUnmapBufferOES) orig_func;
+   GLboolean return_value;
+   GLenum target;
+
+} GL_TH_ST(glUnmapBufferOES);
+
+static void
+GL_TH_CB(glUnmapBufferOES)(void *data)
+{
+   GL_TH_ST(glUnmapBufferOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glUnmapBufferOES))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+GLboolean
+GL_TH_FN(glUnmapBufferOES)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUnmapBufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glUnmapBufferOES))orig_func)
+           (target);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUnmapBufferOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUnmapBufferOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetBufferPointervOES(GLenum target, GLenum pname, void** params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetBufferPointervOES))(GLenum target, GLenum pname, void** params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetBufferPointervOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   void** params;
+
+} GL_TH_ST(glGetBufferPointervOES);
+
+static void
+GL_TH_CB(glGetBufferPointervOES)(void *data)
+{
+   GL_TH_ST(glGetBufferPointervOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetBufferPointervOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetBufferPointervOES)(GL_TH_DP, GLenum target, GLenum pname, void** params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetBufferPointervOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBufferPointervOES))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBufferPointervOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBufferPointervOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexImage3DOES))(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexImage3DOES) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLint border;
+   GLenum format;
+   GLenum type;
+   const void* pixels;
+
+} GL_TH_ST(glTexImage3DOES);
+
+static void
+GL_TH_CB(glTexImage3DOES)(void *data)
+{
+   GL_TH_ST(glTexImage3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexImage3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->border,
+       thread_data->format,
+       thread_data->type,
+       thread_data->pixels);
+
+}
+
+void
+GL_TH_FN(glTexImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexImage3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexImage3DOES))orig_func)
+           (target, level, internalformat, width, height, depth, border, format, type, pixels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexImage3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->border = border;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->pixels = pixels;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexImage3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexSubImage3DOES))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexSubImage3DOES) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLenum format;
+   GLenum type;
+   const void* pixels;
+
+} GL_TH_ST(glTexSubImage3DOES);
+
+static void
+GL_TH_CB(glTexSubImage3DOES)(void *data)
+{
+   GL_TH_ST(glTexSubImage3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexSubImage3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->format,
+       thread_data->type,
+       thread_data->pixels);
+
+}
+
+void
+GL_TH_FN(glTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexSubImage3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexSubImage3DOES))orig_func)
+           (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexSubImage3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->pixels = pixels;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexSubImage3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCopyTexSubImage3DOES))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCopyTexSubImage3DOES) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glCopyTexSubImage3DOES);
+
+static void
+GL_TH_CB(glCopyTexSubImage3DOES)(void *data)
+{
+   GL_TH_ST(glCopyTexSubImage3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCopyTexSubImage3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glCopyTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCopyTexSubImage3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyTexSubImage3DOES))orig_func)
+           (target, level, xoffset, yoffset, zoffset, x, y, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyTexSubImage3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyTexSubImage3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCompressedTexImage3DOES))(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCompressedTexImage3DOES) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLint border;
+   GLsizei imageSize;
+   const void* data;
+
+} GL_TH_ST(glCompressedTexImage3DOES);
+
+static void
+GL_TH_CB(glCompressedTexImage3DOES)(void *data)
+{
+   GL_TH_ST(glCompressedTexImage3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCompressedTexImage3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->border,
+       thread_data->imageSize,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glCompressedTexImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexImage3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCompressedTexImage3DOES))orig_func)
+           (target, level, internalformat, width, height, depth, border, imageSize, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexImage3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->border = border;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexImage3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCompressedTexSubImage3DOES))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCompressedTexSubImage3DOES) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLenum format;
+   GLsizei imageSize;
+   const void* data;
+
+} GL_TH_ST(glCompressedTexSubImage3DOES);
+
+static void
+GL_TH_CB(glCompressedTexSubImage3DOES)(void *data)
+{
+   GL_TH_ST(glCompressedTexSubImage3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCompressedTexSubImage3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->format,
+       thread_data->imageSize,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glCompressedTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexSubImage3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCompressedTexSubImage3DOES))orig_func)
+           (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexSubImage3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->format = format;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexSubImage3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture3DOES))(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture3DOES) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum textarget;
+   GLuint texture;
+   GLint level;
+   GLint zoffset;
+
+} GL_TH_ST(glFramebufferTexture3DOES);
+
+static void
+GL_TH_CB(glFramebufferTexture3DOES)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture3DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture3DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->textarget,
+       thread_data->texture,
+       thread_data->level,
+       thread_data->zoffset);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture3DOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture3DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture3DOES))orig_func)
+           (target, attachment, textarget, texture, level, zoffset);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture3DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->textarget = textarget;
+   thread_data->texture = texture;
+   thread_data->level = level;
+   thread_data->zoffset = zoffset;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture3DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorGroupsAMD))(GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorGroupsAMD) orig_func;
+   GLint* numGroups;
+   GLsizei groupsSize;
+   GLuint* groups;
+
+} GL_TH_ST(glGetPerfMonitorGroupsAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorGroupsAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorGroupsAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorGroupsAMD))thread_data->orig_func)
+      (thread_data->numGroups,
+       thread_data->groupsSize,
+       thread_data->groups);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorGroupsAMD)(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorGroupsAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorGroupsAMD))orig_func)
+           (numGroups, groupsSize, groups);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorGroupsAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->numGroups = numGroups;
+   thread_data->groupsSize = groupsSize;
+   thread_data->groups = groups;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorGroupsAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorCountersAMD))(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorCountersAMD) orig_func;
+   GLuint group;
+   GLint* numCounters;
+   GLint* maxActiveCounters;
+   GLsizei counterSize;
+   GLuint* counters;
+
+} GL_TH_ST(glGetPerfMonitorCountersAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorCountersAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorCountersAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorCountersAMD))thread_data->orig_func)
+      (thread_data->group,
+       thread_data->numCounters,
+       thread_data->maxActiveCounters,
+       thread_data->counterSize,
+       thread_data->counters);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorCountersAMD)(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorCountersAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorCountersAMD))orig_func)
+           (group, numCounters, maxActiveCounters, counterSize, counters);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorCountersAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->group = group;
+   thread_data->numCounters = numCounters;
+   thread_data->maxActiveCounters = maxActiveCounters;
+   thread_data->counterSize = counterSize;
+   thread_data->counters = counters;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorCountersAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorGroupStringAMD))(GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorGroupStringAMD) orig_func;
+   GLuint group;
+   GLsizei bufSize;
+   GLsizei* length;
+   char* groupString;
+
+} GL_TH_ST(glGetPerfMonitorGroupStringAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorGroupStringAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorGroupStringAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorGroupStringAMD))thread_data->orig_func)
+      (thread_data->group,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->groupString);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorGroupStringAMD)(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorGroupStringAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorGroupStringAMD))orig_func)
+           (group, bufSize, length, groupString);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorGroupStringAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->group = group;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->groupString = groupString;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorGroupStringAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorCounterStringAMD))(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorCounterStringAMD) orig_func;
+   GLuint group;
+   GLuint counter;
+   GLsizei bufSize;
+   GLsizei* length;
+   char* counterString;
+
+} GL_TH_ST(glGetPerfMonitorCounterStringAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorCounterStringAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorCounterStringAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorCounterStringAMD))thread_data->orig_func)
+      (thread_data->group,
+       thread_data->counter,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->counterString);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorCounterStringAMD)(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorCounterStringAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorCounterStringAMD))orig_func)
+           (group, counter, bufSize, length, counterString);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorCounterStringAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->group = group;
+   thread_data->counter = counter;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->counterString = counterString;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorCounterStringAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorCounterInfoAMD))(GLuint group, GLuint counter, GLenum pname, void* data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorCounterInfoAMD) orig_func;
+   GLuint group;
+   GLuint counter;
+   GLenum pname;
+   void* data;
+
+} GL_TH_ST(glGetPerfMonitorCounterInfoAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorCounterInfoAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorCounterInfoAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorCounterInfoAMD))thread_data->orig_func)
+      (thread_data->group,
+       thread_data->counter,
+       thread_data->pname,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorCounterInfoAMD)(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorCounterInfoAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorCounterInfoAMD))orig_func)
+           (group, counter, pname, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorCounterInfoAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->group = group;
+   thread_data->counter = counter;
+   thread_data->pname = pname;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorCounterInfoAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenPerfMonitorsAMD))(GLsizei n, GLuint* monitors);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenPerfMonitorsAMD) orig_func;
+   GLsizei n;
+   GLuint* monitors;
+
+} GL_TH_ST(glGenPerfMonitorsAMD);
+
+static void
+GL_TH_CB(glGenPerfMonitorsAMD)(void *data)
+{
+   GL_TH_ST(glGenPerfMonitorsAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenPerfMonitorsAMD))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->monitors);
+
+}
+
+void
+GL_TH_FN(glGenPerfMonitorsAMD)(GL_TH_DP, GLsizei n, GLuint* monitors)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenPerfMonitorsAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenPerfMonitorsAMD))orig_func)
+           (n, monitors);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenPerfMonitorsAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->monitors = monitors;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenPerfMonitorsAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeletePerfMonitorsAMD))(GLsizei n, GLuint* monitors);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeletePerfMonitorsAMD) orig_func;
+   GLsizei n;
+   GLuint* monitors;
+
+} GL_TH_ST(glDeletePerfMonitorsAMD);
+
+static void
+GL_TH_CB(glDeletePerfMonitorsAMD)(void *data)
+{
+   GL_TH_ST(glDeletePerfMonitorsAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeletePerfMonitorsAMD))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->monitors);
+
+}
+
+void
+GL_TH_FN(glDeletePerfMonitorsAMD)(GL_TH_DP, GLsizei n, GLuint* monitors)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeletePerfMonitorsAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeletePerfMonitorsAMD))orig_func)
+           (n, monitors);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeletePerfMonitorsAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->monitors = monitors;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeletePerfMonitorsAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSelectPerfMonitorCountersAMD))(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSelectPerfMonitorCountersAMD) orig_func;
+   GLuint monitor;
+   GLboolean enable;
+   GLuint group;
+   GLint numCounters;
+   GLuint* countersList;
+
+} GL_TH_ST(glSelectPerfMonitorCountersAMD);
+
+static void
+GL_TH_CB(glSelectPerfMonitorCountersAMD)(void *data)
+{
+   GL_TH_ST(glSelectPerfMonitorCountersAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSelectPerfMonitorCountersAMD))thread_data->orig_func)
+      (thread_data->monitor,
+       thread_data->enable,
+       thread_data->group,
+       thread_data->numCounters,
+       thread_data->countersList);
+
+}
+
+void
+GL_TH_FN(glSelectPerfMonitorCountersAMD)(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSelectPerfMonitorCountersAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSelectPerfMonitorCountersAMD))orig_func)
+           (monitor, enable, group, numCounters, countersList);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSelectPerfMonitorCountersAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->monitor = monitor;
+   thread_data->enable = enable;
+   thread_data->group = group;
+   thread_data->numCounters = numCounters;
+   thread_data->countersList = countersList;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSelectPerfMonitorCountersAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBeginPerfMonitorAMD(GLuint monitor);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBeginPerfMonitorAMD))(GLuint monitor);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBeginPerfMonitorAMD) orig_func;
+   GLuint monitor;
+
+} GL_TH_ST(glBeginPerfMonitorAMD);
+
+static void
+GL_TH_CB(glBeginPerfMonitorAMD)(void *data)
+{
+   GL_TH_ST(glBeginPerfMonitorAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBeginPerfMonitorAMD))thread_data->orig_func)
+      (thread_data->monitor);
+
+}
+
+void
+GL_TH_FN(glBeginPerfMonitorAMD)(GL_TH_DP, GLuint monitor)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBeginPerfMonitorAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBeginPerfMonitorAMD))orig_func)
+           (monitor);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBeginPerfMonitorAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->monitor = monitor;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBeginPerfMonitorAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEndPerfMonitorAMD(GLuint monitor);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEndPerfMonitorAMD))(GLuint monitor);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEndPerfMonitorAMD) orig_func;
+   GLuint monitor;
+
+} GL_TH_ST(glEndPerfMonitorAMD);
+
+static void
+GL_TH_CB(glEndPerfMonitorAMD)(void *data)
+{
+   GL_TH_ST(glEndPerfMonitorAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEndPerfMonitorAMD))thread_data->orig_func)
+      (thread_data->monitor);
+
+}
+
+void
+GL_TH_FN(glEndPerfMonitorAMD)(GL_TH_DP, GLuint monitor)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEndPerfMonitorAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEndPerfMonitorAMD))orig_func)
+           (monitor);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEndPerfMonitorAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->monitor = monitor;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEndPerfMonitorAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPerfMonitorCounterDataAMD))(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPerfMonitorCounterDataAMD) orig_func;
+   GLuint monitor;
+   GLenum pname;
+   GLsizei dataSize;
+   GLuint* data;
+   GLint* bytesWritten;
+
+} GL_TH_ST(glGetPerfMonitorCounterDataAMD);
+
+static void
+GL_TH_CB(glGetPerfMonitorCounterDataAMD)(void *data)
+{
+   GL_TH_ST(glGetPerfMonitorCounterDataAMD) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPerfMonitorCounterDataAMD))thread_data->orig_func)
+      (thread_data->monitor,
+       thread_data->pname,
+       thread_data->dataSize,
+       thread_data->data,
+       thread_data->bytesWritten);
+
+}
+
+void
+GL_TH_FN(glGetPerfMonitorCounterDataAMD)(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPerfMonitorCounterDataAMD) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPerfMonitorCounterDataAMD))orig_func)
+           (monitor, pname, dataSize, data, bytesWritten);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPerfMonitorCounterDataAMD) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->monitor = monitor;
+   thread_data->pname = pname;
+   thread_data->dataSize = dataSize;
+   thread_data->data = data;
+   thread_data->bytesWritten = bytesWritten;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPerfMonitorCounterDataAMD),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDiscardFramebufferEXT))(GLenum target, GLsizei numAttachments, const GLenum* attachments);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDiscardFramebufferEXT) orig_func;
+   GLenum target;
+   GLsizei numAttachments;
+   const GLenum* attachments;
+
+} GL_TH_ST(glDiscardFramebufferEXT);
+
+static void
+GL_TH_CB(glDiscardFramebufferEXT)(void *data)
+{
+   GL_TH_ST(glDiscardFramebufferEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDiscardFramebufferEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->numAttachments,
+       thread_data->attachments);
+
+}
+
+void
+GL_TH_FN(glDiscardFramebufferEXT)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDiscardFramebufferEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDiscardFramebufferEXT))orig_func)
+           (target, numAttachments, attachments);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDiscardFramebufferEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->numAttachments = numAttachments;
+   thread_data->attachments = attachments;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDiscardFramebufferEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultiDrawArraysEXT(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultiDrawArraysEXT))(GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultiDrawArraysEXT) orig_func;
+   GLenum mode;
+   GLint* first;
+   GLsizei* count;
+   GLsizei primcount;
+
+} GL_TH_ST(glMultiDrawArraysEXT);
+
+static void
+GL_TH_CB(glMultiDrawArraysEXT)(void *data)
+{
+   GL_TH_ST(glMultiDrawArraysEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultiDrawArraysEXT))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->first,
+       thread_data->count,
+       thread_data->primcount);
+
+}
+
+void
+GL_TH_FN(glMultiDrawArraysEXT)(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultiDrawArraysEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultiDrawArraysEXT))orig_func)
+           (mode, first, count, primcount);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultiDrawArraysEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->first = first;
+   thread_data->count = count;
+   thread_data->primcount = primcount;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultiDrawArraysEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultiDrawElementsEXT(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultiDrawElementsEXT))(GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultiDrawElementsEXT) orig_func;
+   GLenum mode;
+   const GLsizei* count;
+   GLenum type;
+   const GLvoid** indices;
+   GLsizei primcount;
+
+} GL_TH_ST(glMultiDrawElementsEXT);
+
+static void
+GL_TH_CB(glMultiDrawElementsEXT)(void *data)
+{
+   GL_TH_ST(glMultiDrawElementsEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultiDrawElementsEXT))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices,
+       thread_data->primcount);
+
+}
+
+void
+GL_TH_FN(glMultiDrawElementsEXT)(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultiDrawElementsEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultiDrawElementsEXT))orig_func)
+           (mode, count, type, indices, primcount);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultiDrawElementsEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->primcount = primcount;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultiDrawElementsEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteFencesNV(GLsizei n, const GLuint* fences);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteFencesNV))(GLsizei n, const GLuint* fences);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteFencesNV) orig_func;
+   GLsizei n;
+   const GLuint* fences;
+
+} GL_TH_ST(glDeleteFencesNV);
+
+static void
+GL_TH_CB(glDeleteFencesNV)(void *data)
+{
+   GL_TH_ST(glDeleteFencesNV) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteFencesNV))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->fences);
+
+}
+
+void
+GL_TH_FN(glDeleteFencesNV)(GL_TH_DP, GLsizei n, const GLuint* fences)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteFencesNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteFencesNV))orig_func)
+           (n, fences);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteFencesNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->fences = fences;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteFencesNV),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenFencesNV(GLsizei n, GLuint* fences);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenFencesNV))(GLsizei n, GLuint* fences);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenFencesNV) orig_func;
+   GLsizei n;
+   GLuint* fences;
+
+} GL_TH_ST(glGenFencesNV);
+
+static void
+GL_TH_CB(glGenFencesNV)(void *data)
+{
+   GL_TH_ST(glGenFencesNV) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenFencesNV))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->fences);
+
+}
+
+void
+GL_TH_FN(glGenFencesNV)(GL_TH_DP, GLsizei n, GLuint* fences)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenFencesNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenFencesNV))orig_func)
+           (n, fences);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenFencesNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->fences = fences;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenFencesNV),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsFenceNV(GLuint fence);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsFenceNV))(GLuint fence);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsFenceNV) orig_func;
+   GLboolean return_value;
+   GLuint fence;
+
+} GL_TH_ST(glIsFenceNV);
+
+static void
+GL_TH_CB(glIsFenceNV)(void *data)
+{
+   GL_TH_ST(glIsFenceNV) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsFenceNV))thread_data->orig_func)
+      (thread_data->fence);
+
+}
+
+GLboolean
+GL_TH_FN(glIsFenceNV)(GL_TH_DP, GLuint fence)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsFenceNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsFenceNV))orig_func)
+           (fence);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsFenceNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->fence = fence;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsFenceNV),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glTestFenceNV(GLuint fence);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glTestFenceNV))(GLuint fence);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTestFenceNV) orig_func;
+   GLboolean return_value;
+   GLuint fence;
+
+} GL_TH_ST(glTestFenceNV);
+
+static void
+GL_TH_CB(glTestFenceNV)(void *data)
+{
+   GL_TH_ST(glTestFenceNV) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glTestFenceNV))thread_data->orig_func)
+      (thread_data->fence);
+
+}
+
+GLboolean
+GL_TH_FN(glTestFenceNV)(GL_TH_DP, GLuint fence)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTestFenceNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glTestFenceNV))orig_func)
+           (fence);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTestFenceNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->fence = fence;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTestFenceNV),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetFenceivNV(GLuint fence, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFenceivNV))(GLuint fence, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFenceivNV) orig_func;
+   GLuint fence;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetFenceivNV);
+
+static void
+GL_TH_CB(glGetFenceivNV)(void *data)
+{
+   GL_TH_ST(glGetFenceivNV) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFenceivNV))thread_data->orig_func)
+      (thread_data->fence,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFenceivNV)(GL_TH_DP, GLuint fence, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFenceivNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFenceivNV))orig_func)
+           (fence, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFenceivNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->fence = fence;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFenceivNV),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFinishFenceNV(GLuint fence);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFinishFenceNV))(GLuint fence);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFinishFenceNV) orig_func;
+   GLuint fence;
+
+} GL_TH_ST(glFinishFenceNV);
+
+static void
+GL_TH_CB(glFinishFenceNV)(void *data)
+{
+   GL_TH_ST(glFinishFenceNV) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFinishFenceNV))thread_data->orig_func)
+      (thread_data->fence);
+
+}
+
+void
+GL_TH_FN(glFinishFenceNV)(GL_TH_DP, GLuint fence)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFinishFenceNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFinishFenceNV))orig_func)
+           (fence);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFinishFenceNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->fence = fence;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFinishFenceNV),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSetFenceNV(GLuint a, GLenum b);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSetFenceNV))(GLuint a, GLenum b);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSetFenceNV) orig_func;
+   GLuint a;
+   GLenum b;
+
+} GL_TH_ST(glSetFenceNV);
+
+static void
+GL_TH_CB(glSetFenceNV)(void *data)
+{
+   GL_TH_ST(glSetFenceNV) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSetFenceNV))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b);
+
+}
+
+void
+GL_TH_FN(glSetFenceNV)(GL_TH_DP, GLuint a, GLenum b)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSetFenceNV) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSetFenceNV))orig_func)
+           (a, b);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSetFenceNV) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSetFenceNV),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetDriverControlsQCOM(GLint* num, GLsizei size, GLuint* driverControls);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetDriverControlsQCOM))(GLint* num, GLsizei size, GLuint* driverControls);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetDriverControlsQCOM) orig_func;
+   GLint* num;
+   GLsizei size;
+   GLuint* driverControls;
+
+} GL_TH_ST(glGetDriverControlsQCOM);
+
+static void
+GL_TH_CB(glGetDriverControlsQCOM)(void *data)
+{
+   GL_TH_ST(glGetDriverControlsQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetDriverControlsQCOM))thread_data->orig_func)
+      (thread_data->num,
+       thread_data->size,
+       thread_data->driverControls);
+
+}
+
+void
+GL_TH_FN(glGetDriverControlsQCOM)(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetDriverControlsQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetDriverControlsQCOM))orig_func)
+           (num, size, driverControls);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetDriverControlsQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->num = num;
+   thread_data->size = size;
+   thread_data->driverControls = driverControls;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetDriverControlsQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetDriverControlStringQCOM))(GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetDriverControlStringQCOM) orig_func;
+   GLuint driverControl;
+   GLsizei bufSize;
+   GLsizei* length;
+   char* driverControlString;
+
+} GL_TH_ST(glGetDriverControlStringQCOM);
+
+static void
+GL_TH_CB(glGetDriverControlStringQCOM)(void *data)
+{
+   GL_TH_ST(glGetDriverControlStringQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetDriverControlStringQCOM))thread_data->orig_func)
+      (thread_data->driverControl,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->driverControlString);
+
+}
+
+void
+GL_TH_FN(glGetDriverControlStringQCOM)(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetDriverControlStringQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetDriverControlStringQCOM))orig_func)
+           (driverControl, bufSize, length, driverControlString);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetDriverControlStringQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->driverControl = driverControl;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->driverControlString = driverControlString;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetDriverControlStringQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEnableDriverControlQCOM(GLuint driverControl);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEnableDriverControlQCOM))(GLuint driverControl);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEnableDriverControlQCOM) orig_func;
+   GLuint driverControl;
+
+} GL_TH_ST(glEnableDriverControlQCOM);
+
+static void
+GL_TH_CB(glEnableDriverControlQCOM)(void *data)
+{
+   GL_TH_ST(glEnableDriverControlQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEnableDriverControlQCOM))thread_data->orig_func)
+      (thread_data->driverControl);
+
+}
+
+void
+GL_TH_FN(glEnableDriverControlQCOM)(GL_TH_DP, GLuint driverControl)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEnableDriverControlQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEnableDriverControlQCOM))orig_func)
+           (driverControl);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEnableDriverControlQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->driverControl = driverControl;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEnableDriverControlQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDisableDriverControlQCOM(GLuint driverControl);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDisableDriverControlQCOM))(GLuint driverControl);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDisableDriverControlQCOM) orig_func;
+   GLuint driverControl;
+
+} GL_TH_ST(glDisableDriverControlQCOM);
+
+static void
+GL_TH_CB(glDisableDriverControlQCOM)(void *data)
+{
+   GL_TH_ST(glDisableDriverControlQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDisableDriverControlQCOM))thread_data->orig_func)
+      (thread_data->driverControl);
+
+}
+
+void
+GL_TH_FN(glDisableDriverControlQCOM)(GL_TH_DP, GLuint driverControl)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDisableDriverControlQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDisableDriverControlQCOM))orig_func)
+           (driverControl);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDisableDriverControlQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->driverControl = driverControl;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDisableDriverControlQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetTexturesQCOM(GLuint* textures, GLint maxTextures, GLint* numTextures);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetTexturesQCOM))(GLuint* textures, GLint maxTextures, GLint* numTextures);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetTexturesQCOM) orig_func;
+   GLuint* textures;
+   GLint maxTextures;
+   GLint* numTextures;
+
+} GL_TH_ST(glExtGetTexturesQCOM);
+
+static void
+GL_TH_CB(glExtGetTexturesQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetTexturesQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetTexturesQCOM))thread_data->orig_func)
+      (thread_data->textures,
+       thread_data->maxTextures,
+       thread_data->numTextures);
+
+}
+
+void
+GL_TH_FN(glExtGetTexturesQCOM)(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetTexturesQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetTexturesQCOM))orig_func)
+           (textures, maxTextures, numTextures);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetTexturesQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->textures = textures;
+   thread_data->maxTextures = maxTextures;
+   thread_data->numTextures = numTextures;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetTexturesQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetBuffersQCOM(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetBuffersQCOM))(GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetBuffersQCOM) orig_func;
+   GLuint* buffers;
+   GLint maxBuffers;
+   GLint* numBuffers;
+
+} GL_TH_ST(glExtGetBuffersQCOM);
+
+static void
+GL_TH_CB(glExtGetBuffersQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetBuffersQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetBuffersQCOM))thread_data->orig_func)
+      (thread_data->buffers,
+       thread_data->maxBuffers,
+       thread_data->numBuffers);
+
+}
+
+void
+GL_TH_FN(glExtGetBuffersQCOM)(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetBuffersQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetBuffersQCOM))orig_func)
+           (buffers, maxBuffers, numBuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetBuffersQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffers = buffers;
+   thread_data->maxBuffers = maxBuffers;
+   thread_data->numBuffers = numBuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetBuffersQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetRenderbuffersQCOM(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetRenderbuffersQCOM))(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetRenderbuffersQCOM) orig_func;
+   GLuint* renderbuffers;
+   GLint maxRenderbuffers;
+   GLint* numRenderbuffers;
+
+} GL_TH_ST(glExtGetRenderbuffersQCOM);
+
+static void
+GL_TH_CB(glExtGetRenderbuffersQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetRenderbuffersQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetRenderbuffersQCOM))thread_data->orig_func)
+      (thread_data->renderbuffers,
+       thread_data->maxRenderbuffers,
+       thread_data->numRenderbuffers);
+
+}
+
+void
+GL_TH_FN(glExtGetRenderbuffersQCOM)(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetRenderbuffersQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetRenderbuffersQCOM))orig_func)
+           (renderbuffers, maxRenderbuffers, numRenderbuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetRenderbuffersQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->renderbuffers = renderbuffers;
+   thread_data->maxRenderbuffers = maxRenderbuffers;
+   thread_data->numRenderbuffers = numRenderbuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetRenderbuffersQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetFramebuffersQCOM(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetFramebuffersQCOM))(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetFramebuffersQCOM) orig_func;
+   GLuint* framebuffers;
+   GLint maxFramebuffers;
+   GLint* numFramebuffers;
+
+} GL_TH_ST(glExtGetFramebuffersQCOM);
+
+static void
+GL_TH_CB(glExtGetFramebuffersQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetFramebuffersQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetFramebuffersQCOM))thread_data->orig_func)
+      (thread_data->framebuffers,
+       thread_data->maxFramebuffers,
+       thread_data->numFramebuffers);
+
+}
+
+void
+GL_TH_FN(glExtGetFramebuffersQCOM)(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetFramebuffersQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetFramebuffersQCOM))orig_func)
+           (framebuffers, maxFramebuffers, numFramebuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetFramebuffersQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->framebuffers = framebuffers;
+   thread_data->maxFramebuffers = maxFramebuffers;
+   thread_data->numFramebuffers = numFramebuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetFramebuffersQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetTexLevelParameterivQCOM))(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetTexLevelParameterivQCOM) orig_func;
+   GLuint texture;
+   GLenum face;
+   GLint level;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glExtGetTexLevelParameterivQCOM);
+
+static void
+GL_TH_CB(glExtGetTexLevelParameterivQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetTexLevelParameterivQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetTexLevelParameterivQCOM))thread_data->orig_func)
+      (thread_data->texture,
+       thread_data->face,
+       thread_data->level,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glExtGetTexLevelParameterivQCOM)(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetTexLevelParameterivQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetTexLevelParameterivQCOM))orig_func)
+           (texture, face, level, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetTexLevelParameterivQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->face = face;
+   thread_data->level = level;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetTexLevelParameterivQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtTexObjectStateOverrideiQCOM))(GLenum target, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtTexObjectStateOverrideiQCOM) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glExtTexObjectStateOverrideiQCOM);
+
+static void
+GL_TH_CB(glExtTexObjectStateOverrideiQCOM)(void *data)
+{
+   GL_TH_ST(glExtTexObjectStateOverrideiQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtTexObjectStateOverrideiQCOM))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glExtTexObjectStateOverrideiQCOM)(GL_TH_DP, GLenum target, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtTexObjectStateOverrideiQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtTexObjectStateOverrideiQCOM))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtTexObjectStateOverrideiQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtTexObjectStateOverrideiQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetTexSubImageQCOM))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetTexSubImageQCOM) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLenum format;
+   GLenum type;
+   void* texels;
+
+} GL_TH_ST(glExtGetTexSubImageQCOM);
+
+static void
+GL_TH_CB(glExtGetTexSubImageQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetTexSubImageQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetTexSubImageQCOM))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->format,
+       thread_data->type,
+       thread_data->texels);
+
+}
+
+void
+GL_TH_FN(glExtGetTexSubImageQCOM)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetTexSubImageQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetTexSubImageQCOM))orig_func)
+           (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetTexSubImageQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->texels = texels;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetTexSubImageQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetBufferPointervQCOM(GLenum target, void** params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetBufferPointervQCOM))(GLenum target, void** params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetBufferPointervQCOM) orig_func;
+   GLenum target;
+   void** params;
+
+} GL_TH_ST(glExtGetBufferPointervQCOM);
+
+static void
+GL_TH_CB(glExtGetBufferPointervQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetBufferPointervQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetBufferPointervQCOM))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glExtGetBufferPointervQCOM)(GL_TH_DP, GLenum target, void** params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetBufferPointervQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetBufferPointervQCOM))orig_func)
+           (target, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetBufferPointervQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetBufferPointervQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetShadersQCOM(GLuint* shaders, GLint maxShaders, GLint* numShaders);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetShadersQCOM))(GLuint* shaders, GLint maxShaders, GLint* numShaders);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetShadersQCOM) orig_func;
+   GLuint* shaders;
+   GLint maxShaders;
+   GLint* numShaders;
+
+} GL_TH_ST(glExtGetShadersQCOM);
+
+static void
+GL_TH_CB(glExtGetShadersQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetShadersQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetShadersQCOM))thread_data->orig_func)
+      (thread_data->shaders,
+       thread_data->maxShaders,
+       thread_data->numShaders);
+
+}
+
+void
+GL_TH_FN(glExtGetShadersQCOM)(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetShadersQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetShadersQCOM))orig_func)
+           (shaders, maxShaders, numShaders);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetShadersQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->shaders = shaders;
+   thread_data->maxShaders = maxShaders;
+   thread_data->numShaders = numShaders;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetShadersQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glExtGetProgramsQCOM(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetProgramsQCOM))(GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetProgramsQCOM) orig_func;
+   GLuint* programs;
+   GLint maxPrograms;
+   GLint* numPrograms;
+
+} GL_TH_ST(glExtGetProgramsQCOM);
+
+static void
+GL_TH_CB(glExtGetProgramsQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetProgramsQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetProgramsQCOM))thread_data->orig_func)
+      (thread_data->programs,
+       thread_data->maxPrograms,
+       thread_data->numPrograms);
+
+}
+
+void
+GL_TH_FN(glExtGetProgramsQCOM)(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetProgramsQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetProgramsQCOM))orig_func)
+           (programs, maxPrograms, numPrograms);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetProgramsQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->programs = programs;
+   thread_data->maxPrograms = maxPrograms;
+   thread_data->numPrograms = numPrograms;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetProgramsQCOM),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glExtIsProgramBinaryQCOM(GLuint program);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glExtIsProgramBinaryQCOM))(GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtIsProgramBinaryQCOM) orig_func;
+   GLboolean return_value;
+   GLuint program;
+
+} GL_TH_ST(glExtIsProgramBinaryQCOM);
+
+static void
+GL_TH_CB(glExtIsProgramBinaryQCOM)(void *data)
+{
+   GL_TH_ST(glExtIsProgramBinaryQCOM) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glExtIsProgramBinaryQCOM))thread_data->orig_func)
+      (thread_data->program);
+
+}
+
+GLboolean
+GL_TH_FN(glExtIsProgramBinaryQCOM)(GL_TH_DP, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtIsProgramBinaryQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glExtIsProgramBinaryQCOM))orig_func)
+           (program);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtIsProgramBinaryQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtIsProgramBinaryQCOM),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glExtGetProgramBinarySourceQCOM(GLuint program, GLenum shadertype, char* source, GLint* length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glExtGetProgramBinarySourceQCOM))(GLuint program, GLenum shadertype, char* source, GLint* length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glExtGetProgramBinarySourceQCOM) orig_func;
+   GLuint program;
+   GLenum shadertype;
+   char* source;
+   GLint* length;
+
+} GL_TH_ST(glExtGetProgramBinarySourceQCOM);
+
+static void
+GL_TH_CB(glExtGetProgramBinarySourceQCOM)(void *data)
+{
+   GL_TH_ST(glExtGetProgramBinarySourceQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glExtGetProgramBinarySourceQCOM))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->shadertype,
+       thread_data->source,
+       thread_data->length);
+
+}
+
+void
+GL_TH_FN(glExtGetProgramBinarySourceQCOM)(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glExtGetProgramBinarySourceQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glExtGetProgramBinarySourceQCOM))orig_func)
+           (program, shadertype, source, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glExtGetProgramBinarySourceQCOM) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->shadertype = shadertype;
+   thread_data->source = source;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glExtGetProgramBinarySourceQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glAlphaFunc(GLenum func, GLclampf ref);
+ */
+
+typedef void(*GL_TH_FNTYPE(glAlphaFunc))(GLenum func, GLclampf ref);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glAlphaFunc) orig_func;
+   GLenum func;
+   GLclampf ref;
+
+} GL_TH_ST(glAlphaFunc);
+
+static void
+GL_TH_CB(glAlphaFunc)(void *data)
+{
+   GL_TH_ST(glAlphaFunc) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glAlphaFunc))thread_data->orig_func)
+      (thread_data->func,
+       thread_data->ref);
+
+}
+
+void
+GL_TH_FN(glAlphaFunc)(GL_TH_DP, GLenum func, GLclampf ref)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glAlphaFunc) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glAlphaFunc))orig_func)
+           (func, ref);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glAlphaFunc) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->func = func;
+   thread_data->ref = ref;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glAlphaFunc),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanef(GLenum plane, const GLfloat *equation);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanef))(GLenum plane, const GLfloat *equation);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanef) orig_func;
+   GLenum plane;
+   const GLfloat *equation;
+
+} GL_TH_ST(glClipPlanef);
+
+static void
+GL_TH_CB(glClipPlanef)(void *data)
+{
+   GL_TH_ST(glClipPlanef) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanef))thread_data->orig_func)
+      (thread_data->plane,
+       thread_data->equation);
+
+}
+
+void
+GL_TH_FN(glClipPlanef)(GL_TH_DP, GLenum plane, const GLfloat *equation)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanef))orig_func)
+           (plane, equation);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->plane = plane;
+   thread_data->equation = equation;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanef),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glColor4f))(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glColor4f) orig_func;
+   GLfloat red;
+   GLfloat green;
+   GLfloat blue;
+   GLfloat alpha;
+
+} GL_TH_ST(glColor4f);
+
+static void
+GL_TH_CB(glColor4f)(void *data)
+{
+   GL_TH_ST(glColor4f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glColor4f))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glColor4f)(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glColor4f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColor4f))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColor4f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColor4f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogf(GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogf))(GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogf) orig_func;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glFogf);
+
+static void
+GL_TH_CB(glFogf)(void *data)
+{
+   GL_TH_ST(glFogf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogf))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glFogf)(GL_TH_DP, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogf))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogfv(GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogfv))(GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogfv) orig_func;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glFogfv);
+
+static void
+GL_TH_CB(glFogfv)(void *data)
+{
+   GL_TH_ST(glFogfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogfv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glFogfv)(GL_TH_DP, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogfv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFrustumf))(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFrustumf) orig_func;
+   GLfloat left;
+   GLfloat right;
+   GLfloat bottom;
+   GLfloat top;
+   GLfloat zNear;
+   GLfloat zFar;
+
+} GL_TH_ST(glFrustumf);
+
+static void
+GL_TH_CB(glFrustumf)(void *data)
+{
+   GL_TH_ST(glFrustumf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFrustumf))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glFrustumf)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFrustumf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFrustumf))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFrustumf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFrustumf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetClipPlanef(GLenum pname, GLfloat eqn[4]);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetClipPlanef))(GLenum pname, GLfloat eqn[4]);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetClipPlanef) orig_func;
+   GLenum pname;
+   GLfloat eqn[4];
+
+} GL_TH_ST(glGetClipPlanef);
+
+static void
+GL_TH_CB(glGetClipPlanef)(void *data)
+{
+   GL_TH_ST(glGetClipPlanef) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetClipPlanef))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->eqn);
+
+}
+
+void
+GL_TH_FN(glGetClipPlanef)(GL_TH_DP, GLenum pname, GLfloat eqn[4])
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetClipPlanef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetClipPlanef))orig_func)
+           (pname, eqn);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetClipPlanef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   memcpy(thread_data->eqn, &eqn, sizeof(GLfloat) * 4);
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetClipPlanef),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetLightfv))(GLenum light, GLenum pname, GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetLightfv) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfloat *params;
+
+} GL_TH_ST(glGetLightfv);
+
+static void
+GL_TH_CB(glGetLightfv)(void *data)
+{
+   GL_TH_ST(glGetLightfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetLightfv))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetLightfv)(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetLightfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetLightfv))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetLightfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetLightfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetMaterialfv))(GLenum face, GLenum pname, GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetMaterialfv) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfloat *params;
+
+} GL_TH_ST(glGetMaterialfv);
+
+static void
+GL_TH_CB(glGetMaterialfv)(void *data)
+{
+   GL_TH_ST(glGetMaterialfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetMaterialfv))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetMaterialfv)(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetMaterialfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetMaterialfv))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetMaterialfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetMaterialfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexEnvfv))(GLenum env, GLenum pname, GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexEnvfv) orig_func;
+   GLenum env;
+   GLenum pname;
+   GLfloat *params;
+
+} GL_TH_ST(glGetTexEnvfv);
+
+static void
+GL_TH_CB(glGetTexEnvfv)(void *data)
+{
+   GL_TH_ST(glGetTexEnvfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexEnvfv))thread_data->orig_func)
+      (thread_data->env,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexEnvfv)(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexEnvfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexEnvfv))orig_func)
+           (env, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexEnvfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->env = env;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexEnvfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelf(GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelf))(GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelf) orig_func;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glLightModelf);
+
+static void
+GL_TH_CB(glLightModelf)(void *data)
+{
+   GL_TH_ST(glLightModelf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelf))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightModelf)(GL_TH_DP, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelf))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelfv(GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelfv))(GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelfv) orig_func;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glLightModelfv);
+
+static void
+GL_TH_CB(glLightModelfv)(void *data)
+{
+   GL_TH_ST(glLightModelfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelfv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightModelfv)(GL_TH_DP, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelfv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightf(GLenum light, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightf))(GLenum light, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightf) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glLightf);
+
+static void
+GL_TH_CB(glLightf)(void *data)
+{
+   GL_TH_ST(glLightf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightf))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightf)(GL_TH_DP, GLenum light, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightf))orig_func)
+           (light, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightfv))(GLenum light, GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightfv) orig_func;
+   GLenum light;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glLightfv);
+
+static void
+GL_TH_CB(glLightfv)(void *data)
+{
+   GL_TH_ST(glLightfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightfv))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightfv)(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightfv))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLoadMatrixf(const GLfloat *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLoadMatrixf))(const GLfloat *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLoadMatrixf) orig_func;
+   const GLfloat *m;
+
+} GL_TH_ST(glLoadMatrixf);
+
+static void
+GL_TH_CB(glLoadMatrixf)(void *data)
+{
+   GL_TH_ST(glLoadMatrixf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLoadMatrixf))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glLoadMatrixf)(GL_TH_DP, const GLfloat *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLoadMatrixf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLoadMatrixf))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLoadMatrixf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLoadMatrixf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialf(GLenum face, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialf))(GLenum face, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialf) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glMaterialf);
+
+static void
+GL_TH_CB(glMaterialf)(void *data)
+{
+   GL_TH_ST(glMaterialf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialf))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glMaterialf)(GL_TH_DP, GLenum face, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialf))orig_func)
+           (face, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialfv))(GLenum face, GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialfv) orig_func;
+   GLenum face;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glMaterialfv);
+
+static void
+GL_TH_CB(glMaterialfv)(void *data)
+{
+   GL_TH_ST(glMaterialfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialfv))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glMaterialfv)(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialfv))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultMatrixf(const GLfloat *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultMatrixf))(const GLfloat *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultMatrixf) orig_func;
+   const GLfloat *m;
+
+} GL_TH_ST(glMultMatrixf);
+
+static void
+GL_TH_CB(glMultMatrixf)(void *data)
+{
+   GL_TH_ST(glMultMatrixf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultMatrixf))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glMultMatrixf)(GL_TH_DP, const GLfloat *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultMatrixf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultMatrixf))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultMatrixf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultMatrixf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultiTexCoord4f))(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultiTexCoord4f) orig_func;
+   GLenum target;
+   GLfloat s;
+   GLfloat t;
+   GLfloat r;
+   GLfloat q;
+
+} GL_TH_ST(glMultiTexCoord4f);
+
+static void
+GL_TH_CB(glMultiTexCoord4f)(void *data)
+{
+   GL_TH_ST(glMultiTexCoord4f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultiTexCoord4f))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->s,
+       thread_data->t,
+       thread_data->r,
+       thread_data->q);
+
+}
+
+void
+GL_TH_FN(glMultiTexCoord4f)(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultiTexCoord4f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultiTexCoord4f))orig_func)
+           (target, s, t, r, q);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultiTexCoord4f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->s = s;
+   thread_data->t = t;
+   thread_data->r = r;
+   thread_data->q = q;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultiTexCoord4f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+ */
+
+typedef void(*GL_TH_FNTYPE(glNormal3f))(GLfloat nx, GLfloat ny, GLfloat nz);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glNormal3f) orig_func;
+   GLfloat nx;
+   GLfloat ny;
+   GLfloat nz;
+
+} GL_TH_ST(glNormal3f);
+
+static void
+GL_TH_CB(glNormal3f)(void *data)
+{
+   GL_TH_ST(glNormal3f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glNormal3f))thread_data->orig_func)
+      (thread_data->nx,
+       thread_data->ny,
+       thread_data->nz);
+
+}
+
+void
+GL_TH_FN(glNormal3f)(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glNormal3f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glNormal3f))orig_func)
+           (nx, ny, nz);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glNormal3f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->nx = nx;
+   thread_data->ny = ny;
+   thread_data->nz = nz;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glNormal3f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glOrthof))(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glOrthof) orig_func;
+   GLfloat left;
+   GLfloat right;
+   GLfloat bottom;
+   GLfloat top;
+   GLfloat zNear;
+   GLfloat zFar;
+
+} GL_TH_ST(glOrthof);
+
+static void
+GL_TH_CB(glOrthof)(void *data)
+{
+   GL_TH_ST(glOrthof) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glOrthof))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glOrthof)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glOrthof) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glOrthof))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glOrthof) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glOrthof),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterf(GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterf))(GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterf) orig_func;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glPointParameterf);
+
+static void
+GL_TH_CB(glPointParameterf)(void *data)
+{
+   GL_TH_ST(glPointParameterf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterf))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glPointParameterf)(GL_TH_DP, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterf))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterfv(GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterfv))(GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterfv) orig_func;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glPointParameterfv);
+
+static void
+GL_TH_CB(glPointParameterfv)(void *data)
+{
+   GL_TH_ST(glPointParameterfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterfv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glPointParameterfv)(GL_TH_DP, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterfv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointSize(GLfloat size);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointSize))(GLfloat size);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointSize) orig_func;
+   GLfloat size;
+
+} GL_TH_ST(glPointSize);
+
+static void
+GL_TH_CB(glPointSize)(void *data)
+{
+   GL_TH_ST(glPointSize) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointSize))thread_data->orig_func)
+      (thread_data->size);
+
+}
+
+void
+GL_TH_FN(glPointSize)(GL_TH_DP, GLfloat size)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointSize) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointSize))orig_func)
+           (size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointSize) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointSize),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid * pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointSizePointerOES))(GLenum type, GLsizei stride, const GLvoid * pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointSizePointerOES) orig_func;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid * pointer;
+
+} GL_TH_ST(glPointSizePointerOES);
+
+static void
+GL_TH_CB(glPointSizePointerOES)(void *data)
+{
+   GL_TH_ST(glPointSizePointerOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointSizePointerOES))thread_data->orig_func)
+      (thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glPointSizePointerOES)(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointSizePointerOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointSizePointerOES))orig_func)
+           (type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointSizePointerOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointSizePointerOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRotatef))(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRotatef) orig_func;
+   GLfloat angle;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+
+} GL_TH_ST(glRotatef);
+
+static void
+GL_TH_CB(glRotatef)(void *data)
+{
+   GL_TH_ST(glRotatef) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRotatef))thread_data->orig_func)
+      (thread_data->angle,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glRotatef)(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRotatef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRotatef))orig_func)
+           (angle, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRotatef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->angle = angle;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRotatef),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glScalef(GLfloat x, GLfloat y, GLfloat z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glScalef))(GLfloat x, GLfloat y, GLfloat z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glScalef) orig_func;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+
+} GL_TH_ST(glScalef);
+
+static void
+GL_TH_CB(glScalef)(void *data)
+{
+   GL_TH_ST(glScalef) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glScalef))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glScalef)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glScalef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glScalef))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glScalef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glScalef),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvf))(GLenum target, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvf) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glTexEnvf);
+
+static void
+GL_TH_CB(glTexEnvf)(void *data)
+{
+   GL_TH_ST(glTexEnvf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvf))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexEnvf)(GL_TH_DP, GLenum target, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvf))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvfv))(GLenum target, GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvfv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glTexEnvfv);
+
+static void
+GL_TH_CB(glTexEnvfv)(void *data)
+{
+   GL_TH_ST(glTexEnvfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvfv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexEnvfv)(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvfv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTranslatef))(GLfloat x, GLfloat y, GLfloat z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTranslatef) orig_func;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+
+} GL_TH_ST(glTranslatef);
+
+static void
+GL_TH_CB(glTranslatef)(void *data)
+{
+   GL_TH_ST(glTranslatef) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTranslatef))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glTranslatef)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTranslatef) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTranslatef))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTranslatef) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTranslatef),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glAlphaFuncx(GLenum func, GLclampx ref);
+ */
+
+typedef void(*GL_TH_FNTYPE(glAlphaFuncx))(GLenum func, GLclampx ref);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glAlphaFuncx) orig_func;
+   GLenum func;
+   GLclampx ref;
+
+} GL_TH_ST(glAlphaFuncx);
+
+static void
+GL_TH_CB(glAlphaFuncx)(void *data)
+{
+   GL_TH_ST(glAlphaFuncx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glAlphaFuncx))thread_data->orig_func)
+      (thread_data->func,
+       thread_data->ref);
+
+}
+
+void
+GL_TH_FN(glAlphaFuncx)(GL_TH_DP, GLenum func, GLclampx ref)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glAlphaFuncx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glAlphaFuncx))orig_func)
+           (func, ref);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glAlphaFuncx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->func = func;
+   thread_data->ref = ref;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glAlphaFuncx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearColorx))(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearColorx) orig_func;
+   GLclampx red;
+   GLclampx green;
+   GLclampx blue;
+   GLclampx alpha;
+
+} GL_TH_ST(glClearColorx);
+
+static void
+GL_TH_CB(glClearColorx)(void *data)
+{
+   GL_TH_ST(glClearColorx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearColorx))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glClearColorx)(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearColorx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearColorx))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearColorx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearColorx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearDepthx(GLclampx depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearDepthx))(GLclampx depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearDepthx) orig_func;
+   GLclampx depth;
+
+} GL_TH_ST(glClearDepthx);
+
+static void
+GL_TH_CB(glClearDepthx)(void *data)
+{
+   GL_TH_ST(glClearDepthx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearDepthx))thread_data->orig_func)
+      (thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glClearDepthx)(GL_TH_DP, GLclampx depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearDepthx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearDepthx))orig_func)
+           (depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearDepthx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearDepthx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClientActiveTexture(GLenum texture);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClientActiveTexture))(GLenum texture);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClientActiveTexture) orig_func;
+   GLenum texture;
+
+} GL_TH_ST(glClientActiveTexture);
+
+static void
+GL_TH_CB(glClientActiveTexture)(void *data)
+{
+   GL_TH_ST(glClientActiveTexture) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClientActiveTexture))thread_data->orig_func)
+      (thread_data->texture);
+
+}
+
+void
+GL_TH_FN(glClientActiveTexture)(GL_TH_DP, GLenum texture)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClientActiveTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClientActiveTexture))orig_func)
+           (texture);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClientActiveTexture) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClientActiveTexture),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanex(GLenum plane, const GLfixed *equation);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanex))(GLenum plane, const GLfixed *equation);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanex) orig_func;
+   GLenum plane;
+   const GLfixed *equation;
+
+} GL_TH_ST(glClipPlanex);
+
+static void
+GL_TH_CB(glClipPlanex)(void *data)
+{
+   GL_TH_ST(glClipPlanex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanex))thread_data->orig_func)
+      (thread_data->plane,
+       thread_data->equation);
+
+}
+
+void
+GL_TH_FN(glClipPlanex)(GL_TH_DP, GLenum plane, const GLfixed *equation)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanex))orig_func)
+           (plane, equation);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->plane = plane;
+   thread_data->equation = equation;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glColor4ub))(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glColor4ub) orig_func;
+   GLubyte red;
+   GLubyte green;
+   GLubyte blue;
+   GLubyte alpha;
+
+} GL_TH_ST(glColor4ub);
+
+static void
+GL_TH_CB(glColor4ub)(void *data)
+{
+   GL_TH_ST(glColor4ub) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glColor4ub))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glColor4ub)(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glColor4ub) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColor4ub))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColor4ub) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColor4ub),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glColor4x))(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glColor4x) orig_func;
+   GLfixed red;
+   GLfixed green;
+   GLfixed blue;
+   GLfixed alpha;
+
+} GL_TH_ST(glColor4x);
+
+static void
+GL_TH_CB(glColor4x)(void *data)
+{
+   GL_TH_ST(glColor4x) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glColor4x))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glColor4x)(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glColor4x) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColor4x))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColor4x) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColor4x),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glColorPointer))(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glColorPointer) orig_func;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glColorPointer);
+
+static void
+GL_TH_CB(glColorPointer)(void *data)
+{
+   GL_TH_ST(glColorPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glColorPointer))thread_data->orig_func)
+      (thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glColorPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glColorPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColorPointer))orig_func)
+           (size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColorPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColorPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDepthRangex(GLclampx zNear, GLclampx zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDepthRangex))(GLclampx zNear, GLclampx zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDepthRangex) orig_func;
+   GLclampx zNear;
+   GLclampx zFar;
+
+} GL_TH_ST(glDepthRangex);
+
+static void
+GL_TH_CB(glDepthRangex)(void *data)
+{
+   GL_TH_ST(glDepthRangex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDepthRangex))thread_data->orig_func)
+      (thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glDepthRangex)(GL_TH_DP, GLclampx zNear, GLclampx zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDepthRangex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthRangex))orig_func)
+           (zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthRangex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthRangex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDisableClientState(GLenum array);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDisableClientState))(GLenum array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDisableClientState) orig_func;
+   GLenum array;
+
+} GL_TH_ST(glDisableClientState);
+
+static void
+GL_TH_CB(glDisableClientState)(void *data)
+{
+   GL_TH_ST(glDisableClientState) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDisableClientState))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+void
+GL_TH_FN(glDisableClientState)(GL_TH_DP, GLenum array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDisableClientState) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDisableClientState))orig_func)
+           (array);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDisableClientState) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDisableClientState),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEnableClientState(GLenum array);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEnableClientState))(GLenum array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEnableClientState) orig_func;
+   GLenum array;
+
+} GL_TH_ST(glEnableClientState);
+
+static void
+GL_TH_CB(glEnableClientState)(void *data)
+{
+   GL_TH_ST(glEnableClientState) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEnableClientState))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+void
+GL_TH_FN(glEnableClientState)(GL_TH_DP, GLenum array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEnableClientState) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEnableClientState))orig_func)
+           (array);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEnableClientState) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEnableClientState),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogx(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogx))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogx) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glFogx);
+
+static void
+GL_TH_CB(glFogx)(void *data)
+{
+   GL_TH_ST(glFogx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogx))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glFogx)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogx))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogxv(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogxv))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogxv) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glFogxv);
+
+static void
+GL_TH_CB(glFogxv)(void *data)
+{
+   GL_TH_ST(glFogxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogxv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glFogxv)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogxv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFrustumx))(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFrustumx) orig_func;
+   GLfixed left;
+   GLfixed right;
+   GLfixed bottom;
+   GLfixed top;
+   GLfixed zNear;
+   GLfixed zFar;
+
+} GL_TH_ST(glFrustumx);
+
+static void
+GL_TH_CB(glFrustumx)(void *data)
+{
+   GL_TH_ST(glFrustumx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFrustumx))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glFrustumx)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFrustumx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFrustumx))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFrustumx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFrustumx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetClipPlanex(GLenum pname, GLfixed eqn[4]);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetClipPlanex))(GLenum pname, GLfixed eqn[4]);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetClipPlanex) orig_func;
+   GLenum pname;
+   GLfixed eqn[4];
+
+} GL_TH_ST(glGetClipPlanex);
+
+static void
+GL_TH_CB(glGetClipPlanex)(void *data)
+{
+   GL_TH_ST(glGetClipPlanex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetClipPlanex))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->eqn);
+
+}
+
+void
+GL_TH_FN(glGetClipPlanex)(GL_TH_DP, GLenum pname, GLfixed eqn[4])
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetClipPlanex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetClipPlanex))orig_func)
+           (pname, eqn);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetClipPlanex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   memcpy(thread_data->eqn, &eqn, sizeof(GLfixed) * 4);
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetClipPlanex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetFixedv(GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFixedv))(GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFixedv) orig_func;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetFixedv);
+
+static void
+GL_TH_CB(glGetFixedv)(void *data)
+{
+   GL_TH_ST(glGetFixedv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFixedv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFixedv)(GL_TH_DP, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFixedv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFixedv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFixedv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFixedv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetLightxv(GLenum light, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetLightxv))(GLenum light, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetLightxv) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetLightxv);
+
+static void
+GL_TH_CB(glGetLightxv)(void *data)
+{
+   GL_TH_ST(glGetLightxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetLightxv))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetLightxv)(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetLightxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetLightxv))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetLightxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetLightxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetMaterialxv))(GLenum face, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetMaterialxv) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetMaterialxv);
+
+static void
+GL_TH_CB(glGetMaterialxv)(void *data)
+{
+   GL_TH_ST(glGetMaterialxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetMaterialxv))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetMaterialxv)(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetMaterialxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetMaterialxv))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetMaterialxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetMaterialxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetPointerv(GLenum pname, GLvoid **params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetPointerv))(GLenum pname, GLvoid **params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetPointerv) orig_func;
+   GLenum pname;
+   GLvoid **params;
+
+} GL_TH_ST(glGetPointerv);
+
+static void
+GL_TH_CB(glGetPointerv)(void *data)
+{
+   GL_TH_ST(glGetPointerv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetPointerv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetPointerv)(GL_TH_DP, GLenum pname, GLvoid **params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetPointerv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetPointerv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetPointerv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetPointerv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexEnviv(GLenum env, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexEnviv))(GLenum env, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexEnviv) orig_func;
+   GLenum env;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetTexEnviv);
+
+static void
+GL_TH_CB(glGetTexEnviv)(void *data)
+{
+   GL_TH_ST(glGetTexEnviv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexEnviv))thread_data->orig_func)
+      (thread_data->env,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexEnviv)(GL_TH_DP, GLenum env, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexEnviv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexEnviv))orig_func)
+           (env, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexEnviv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->env = env;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexEnviv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexEnvxv))(GLenum env, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexEnvxv) orig_func;
+   GLenum env;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetTexEnvxv);
+
+static void
+GL_TH_CB(glGetTexEnvxv)(void *data)
+{
+   GL_TH_ST(glGetTexEnvxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexEnvxv))thread_data->orig_func)
+      (thread_data->env,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexEnvxv)(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexEnvxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexEnvxv))orig_func)
+           (env, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexEnvxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->env = env;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexEnvxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexParameterxv))(GLenum target, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexParameterxv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetTexParameterxv);
+
+static void
+GL_TH_CB(glGetTexParameterxv)(void *data)
+{
+   GL_TH_ST(glGetTexParameterxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexParameterxv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexParameterxv)(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexParameterxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexParameterxv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameterxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameterxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelx(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelx))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelx) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glLightModelx);
+
+static void
+GL_TH_CB(glLightModelx)(void *data)
+{
+   GL_TH_ST(glLightModelx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelx))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightModelx)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelx))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelxv(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelxv))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelxv) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glLightModelxv);
+
+static void
+GL_TH_CB(glLightModelxv)(void *data)
+{
+   GL_TH_ST(glLightModelxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelxv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightModelxv)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelxv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightx(GLenum light, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightx))(GLenum light, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightx) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glLightx);
+
+static void
+GL_TH_CB(glLightx)(void *data)
+{
+   GL_TH_ST(glLightx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightx))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightx)(GL_TH_DP, GLenum light, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightx))orig_func)
+           (light, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightxv(GLenum light, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightxv))(GLenum light, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightxv) orig_func;
+   GLenum light;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glLightxv);
+
+static void
+GL_TH_CB(glLightxv)(void *data)
+{
+   GL_TH_ST(glLightxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightxv))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightxv)(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightxv))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLineWidthx(GLfixed width);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLineWidthx))(GLfixed width);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLineWidthx) orig_func;
+   GLfixed width;
+
+} GL_TH_ST(glLineWidthx);
+
+static void
+GL_TH_CB(glLineWidthx)(void *data)
+{
+   GL_TH_ST(glLineWidthx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLineWidthx))thread_data->orig_func)
+      (thread_data->width);
+
+}
+
+void
+GL_TH_FN(glLineWidthx)(GL_TH_DP, GLfixed width)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLineWidthx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLineWidthx))orig_func)
+           (width);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLineWidthx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->width = width;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLineWidthx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLoadIdentity(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLoadIdentity))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLoadIdentity) orig_func;
+
+} GL_TH_ST(glLoadIdentity);
+
+static void
+GL_TH_CB(glLoadIdentity)(void *data)
+{
+   GL_TH_ST(glLoadIdentity) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLoadIdentity))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glLoadIdentity)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLoadIdentity) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLoadIdentity))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLoadIdentity) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLoadIdentity),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLoadMatrixx(const GLfixed *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLoadMatrixx))(const GLfixed *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLoadMatrixx) orig_func;
+   const GLfixed *m;
+
+} GL_TH_ST(glLoadMatrixx);
+
+static void
+GL_TH_CB(glLoadMatrixx)(void *data)
+{
+   GL_TH_ST(glLoadMatrixx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLoadMatrixx))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glLoadMatrixx)(GL_TH_DP, const GLfixed *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLoadMatrixx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLoadMatrixx))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLoadMatrixx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLoadMatrixx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLogicOp(GLenum opcode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLogicOp))(GLenum opcode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLogicOp) orig_func;
+   GLenum opcode;
+
+} GL_TH_ST(glLogicOp);
+
+static void
+GL_TH_CB(glLogicOp)(void *data)
+{
+   GL_TH_ST(glLogicOp) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLogicOp))thread_data->orig_func)
+      (thread_data->opcode);
+
+}
+
+void
+GL_TH_FN(glLogicOp)(GL_TH_DP, GLenum opcode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLogicOp) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLogicOp))orig_func)
+           (opcode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLogicOp) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->opcode = opcode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLogicOp),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialx(GLenum face, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialx))(GLenum face, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialx) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glMaterialx);
+
+static void
+GL_TH_CB(glMaterialx)(void *data)
+{
+   GL_TH_ST(glMaterialx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialx))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glMaterialx)(GL_TH_DP, GLenum face, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialx))orig_func)
+           (face, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialxv(GLenum face, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialxv))(GLenum face, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialxv) orig_func;
+   GLenum face;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glMaterialxv);
+
+static void
+GL_TH_CB(glMaterialxv)(void *data)
+{
+   GL_TH_ST(glMaterialxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialxv))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glMaterialxv)(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialxv))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMatrixMode(GLenum mode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMatrixMode))(GLenum mode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMatrixMode) orig_func;
+   GLenum mode;
+
+} GL_TH_ST(glMatrixMode);
+
+static void
+GL_TH_CB(glMatrixMode)(void *data)
+{
+   GL_TH_ST(glMatrixMode) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMatrixMode))thread_data->orig_func)
+      (thread_data->mode);
+
+}
+
+void
+GL_TH_FN(glMatrixMode)(GL_TH_DP, GLenum mode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMatrixMode) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMatrixMode))orig_func)
+           (mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMatrixMode) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMatrixMode),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultMatrixx(const GLfixed *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultMatrixx))(const GLfixed *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultMatrixx) orig_func;
+   const GLfixed *m;
+
+} GL_TH_ST(glMultMatrixx);
+
+static void
+GL_TH_CB(glMultMatrixx)(void *data)
+{
+   GL_TH_ST(glMultMatrixx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultMatrixx))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glMultMatrixx)(GL_TH_DP, const GLfixed *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultMatrixx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultMatrixx))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultMatrixx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultMatrixx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultiTexCoord4x))(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultiTexCoord4x) orig_func;
+   GLenum target;
+   GLfixed s;
+   GLfixed t;
+   GLfixed r;
+   GLfixed q;
+
+} GL_TH_ST(glMultiTexCoord4x);
+
+static void
+GL_TH_CB(glMultiTexCoord4x)(void *data)
+{
+   GL_TH_ST(glMultiTexCoord4x) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultiTexCoord4x))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->s,
+       thread_data->t,
+       thread_data->r,
+       thread_data->q);
+
+}
+
+void
+GL_TH_FN(glMultiTexCoord4x)(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultiTexCoord4x) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultiTexCoord4x))orig_func)
+           (target, s, t, r, q);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultiTexCoord4x) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->s = s;
+   thread_data->t = t;
+   thread_data->r = r;
+   thread_data->q = q;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultiTexCoord4x),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz);
+ */
+
+typedef void(*GL_TH_FNTYPE(glNormal3x))(GLfixed nx, GLfixed ny, GLfixed nz);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glNormal3x) orig_func;
+   GLfixed nx;
+   GLfixed ny;
+   GLfixed nz;
+
+} GL_TH_ST(glNormal3x);
+
+static void
+GL_TH_CB(glNormal3x)(void *data)
+{
+   GL_TH_ST(glNormal3x) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glNormal3x))thread_data->orig_func)
+      (thread_data->nx,
+       thread_data->ny,
+       thread_data->nz);
+
+}
+
+void
+GL_TH_FN(glNormal3x)(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glNormal3x) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glNormal3x))orig_func)
+           (nx, ny, nz);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glNormal3x) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->nx = nx;
+   thread_data->ny = ny;
+   thread_data->nz = nz;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glNormal3x),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glNormalPointer))(GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glNormalPointer) orig_func;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glNormalPointer);
+
+static void
+GL_TH_CB(glNormalPointer)(void *data)
+{
+   GL_TH_ST(glNormalPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glNormalPointer))thread_data->orig_func)
+      (thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glNormalPointer)(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glNormalPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glNormalPointer))orig_func)
+           (type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glNormalPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glNormalPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glOrthox))(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glOrthox) orig_func;
+   GLfixed left;
+   GLfixed right;
+   GLfixed bottom;
+   GLfixed top;
+   GLfixed zNear;
+   GLfixed zFar;
+
+} GL_TH_ST(glOrthox);
+
+static void
+GL_TH_CB(glOrthox)(void *data)
+{
+   GL_TH_ST(glOrthox) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glOrthox))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glOrthox)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glOrthox) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glOrthox))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glOrthox) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glOrthox),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterx(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterx))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterx) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glPointParameterx);
+
+static void
+GL_TH_CB(glPointParameterx)(void *data)
+{
+   GL_TH_ST(glPointParameterx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterx))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glPointParameterx)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterx))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterxv(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterxv))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterxv) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glPointParameterxv);
+
+static void
+GL_TH_CB(glPointParameterxv)(void *data)
+{
+   GL_TH_ST(glPointParameterxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterxv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glPointParameterxv)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterxv))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointSizex(GLfixed size);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointSizex))(GLfixed size);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointSizex) orig_func;
+   GLfixed size;
+
+} GL_TH_ST(glPointSizex);
+
+static void
+GL_TH_CB(glPointSizex)(void *data)
+{
+   GL_TH_ST(glPointSizex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointSizex))thread_data->orig_func)
+      (thread_data->size);
+
+}
+
+void
+GL_TH_FN(glPointSizex)(GL_TH_DP, GLfixed size)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointSizex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointSizex))orig_func)
+           (size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointSizex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointSizex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPolygonOffsetx(GLfixed factor, GLfixed units);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPolygonOffsetx))(GLfixed factor, GLfixed units);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPolygonOffsetx) orig_func;
+   GLfixed factor;
+   GLfixed units;
+
+} GL_TH_ST(glPolygonOffsetx);
+
+static void
+GL_TH_CB(glPolygonOffsetx)(void *data)
+{
+   GL_TH_ST(glPolygonOffsetx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPolygonOffsetx))thread_data->orig_func)
+      (thread_data->factor,
+       thread_data->units);
+
+}
+
+void
+GL_TH_FN(glPolygonOffsetx)(GL_TH_DP, GLfixed factor, GLfixed units)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPolygonOffsetx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPolygonOffsetx))orig_func)
+           (factor, units);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPolygonOffsetx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->factor = factor;
+   thread_data->units = units;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPolygonOffsetx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPopMatrix(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPopMatrix))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPopMatrix) orig_func;
+
+} GL_TH_ST(glPopMatrix);
+
+static void
+GL_TH_CB(glPopMatrix)(void *data)
+{
+   GL_TH_ST(glPopMatrix) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPopMatrix))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glPopMatrix)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPopMatrix) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPopMatrix))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPopMatrix) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPopMatrix),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPushMatrix(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPushMatrix))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPushMatrix) orig_func;
+
+} GL_TH_ST(glPushMatrix);
+
+static void
+GL_TH_CB(glPushMatrix)(void *data)
+{
+   GL_TH_ST(glPushMatrix) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPushMatrix))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glPushMatrix)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPushMatrix) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPushMatrix))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPushMatrix) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPushMatrix),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRotatex))(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRotatex) orig_func;
+   GLfixed angle;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glRotatex);
+
+static void
+GL_TH_CB(glRotatex)(void *data)
+{
+   GL_TH_ST(glRotatex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRotatex))thread_data->orig_func)
+      (thread_data->angle,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glRotatex)(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRotatex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRotatex))orig_func)
+           (angle, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRotatex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->angle = angle;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRotatex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSampleCoveragex(GLclampx value, GLboolean invert);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSampleCoveragex))(GLclampx value, GLboolean invert);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSampleCoveragex) orig_func;
+   GLclampx value;
+   GLboolean invert;
+
+} GL_TH_ST(glSampleCoveragex);
+
+static void
+GL_TH_CB(glSampleCoveragex)(void *data)
+{
+   GL_TH_ST(glSampleCoveragex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSampleCoveragex))thread_data->orig_func)
+      (thread_data->value,
+       thread_data->invert);
+
+}
+
+void
+GL_TH_FN(glSampleCoveragex)(GL_TH_DP, GLclampx value, GLboolean invert)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSampleCoveragex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSampleCoveragex))orig_func)
+           (value, invert);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSampleCoveragex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->value = value;
+   thread_data->invert = invert;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSampleCoveragex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glScalex(GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glScalex))(GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glScalex) orig_func;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glScalex);
+
+static void
+GL_TH_CB(glScalex)(void *data)
+{
+   GL_TH_ST(glScalex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glScalex))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glScalex)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glScalex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glScalex))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glScalex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glScalex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glShadeModel(GLenum mode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glShadeModel))(GLenum mode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glShadeModel) orig_func;
+   GLenum mode;
+
+} GL_TH_ST(glShadeModel);
+
+static void
+GL_TH_CB(glShadeModel)(void *data)
+{
+   GL_TH_ST(glShadeModel) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glShadeModel))thread_data->orig_func)
+      (thread_data->mode);
+
+}
+
+void
+GL_TH_FN(glShadeModel)(GL_TH_DP, GLenum mode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glShadeModel) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glShadeModel))orig_func)
+           (mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glShadeModel) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glShadeModel),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexCoordPointer))(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexCoordPointer) orig_func;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glTexCoordPointer);
+
+static void
+GL_TH_CB(glTexCoordPointer)(void *data)
+{
+   GL_TH_ST(glTexCoordPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexCoordPointer))thread_data->orig_func)
+      (thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glTexCoordPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexCoordPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexCoordPointer))orig_func)
+           (size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexCoordPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexCoordPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvi(GLenum target, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvi))(GLenum target, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvi) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glTexEnvi);
+
+static void
+GL_TH_CB(glTexEnvi)(void *data)
+{
+   GL_TH_ST(glTexEnvi) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvi))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexEnvi)(GL_TH_DP, GLenum target, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvi) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvi))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvi) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvi),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvx(GLenum target, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvx))(GLenum target, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvx) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glTexEnvx);
+
+static void
+GL_TH_CB(glTexEnvx)(void *data)
+{
+   GL_TH_ST(glTexEnvx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvx))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexEnvx)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvx))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnviv))(GLenum target, GLenum pname, const GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnviv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLint *params;
+
+} GL_TH_ST(glTexEnviv);
+
+static void
+GL_TH_CB(glTexEnviv)(void *data)
+{
+   GL_TH_ST(glTexEnviv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnviv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexEnviv)(GL_TH_DP, GLenum target, GLenum pname, const GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnviv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnviv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnviv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnviv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvxv))(GLenum target, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvxv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glTexEnvxv);
+
+static void
+GL_TH_CB(glTexEnvxv)(void *data)
+{
+   GL_TH_ST(glTexEnvxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvxv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexEnvxv)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvxv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameterx(GLenum target, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterx))(GLenum target, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterx) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glTexParameterx);
+
+static void
+GL_TH_CB(glTexParameterx)(void *data)
+{
+   GL_TH_ST(glTexParameterx) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterx))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexParameterx)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterx) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterx))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterx) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterx),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterxv))(GLenum target, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterxv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glTexParameterxv);
+
+static void
+GL_TH_CB(glTexParameterxv)(void *data)
+{
+   GL_TH_ST(glTexParameterxv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterxv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexParameterxv)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterxv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterxv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterxv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterxv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTranslatex(GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTranslatex))(GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTranslatex) orig_func;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glTranslatex);
+
+static void
+GL_TH_CB(glTranslatex)(void *data)
+{
+   GL_TH_ST(glTranslatex) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTranslatex))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glTranslatex)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTranslatex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTranslatex))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTranslatex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTranslatex),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexPointer))(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexPointer) orig_func;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glVertexPointer);
+
+static void
+GL_TH_CB(glVertexPointer)(void *data)
+{
+   GL_TH_ST(glVertexPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexPointer))thread_data->orig_func)
+      (thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glVertexPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexPointer))orig_func)
+           (size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBlendEquationSeparateOES(GLenum modeRGB, GLenum modeAlpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBlendEquationSeparateOES))(GLenum modeRGB, GLenum modeAlpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBlendEquationSeparateOES) orig_func;
+   GLenum modeRGB;
+   GLenum modeAlpha;
+
+} GL_TH_ST(glBlendEquationSeparateOES);
+
+static void
+GL_TH_CB(glBlendEquationSeparateOES)(void *data)
+{
+   GL_TH_ST(glBlendEquationSeparateOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendEquationSeparateOES))thread_data->orig_func)
+      (thread_data->modeRGB,
+       thread_data->modeAlpha);
+
+}
+
+void
+GL_TH_FN(glBlendEquationSeparateOES)(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendEquationSeparateOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendEquationSeparateOES))orig_func)
+           (modeRGB, modeAlpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquationSeparateOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->modeRGB = modeRGB;
+   thread_data->modeAlpha = modeAlpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquationSeparateOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBlendFuncSeparateOES))(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBlendFuncSeparateOES) orig_func;
+   GLenum srcRGB;
+   GLenum dstRGB;
+   GLenum srcAlpha;
+   GLenum dstAlpha;
+
+} GL_TH_ST(glBlendFuncSeparateOES);
+
+static void
+GL_TH_CB(glBlendFuncSeparateOES)(void *data)
+{
+   GL_TH_ST(glBlendFuncSeparateOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendFuncSeparateOES))thread_data->orig_func)
+      (thread_data->srcRGB,
+       thread_data->dstRGB,
+       thread_data->srcAlpha,
+       thread_data->dstAlpha);
+
+}
+
+void
+GL_TH_FN(glBlendFuncSeparateOES)(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendFuncSeparateOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendFuncSeparateOES))orig_func)
+           (srcRGB, dstRGB, srcAlpha, dstAlpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendFuncSeparateOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->srcRGB = srcRGB;
+   thread_data->dstRGB = dstRGB;
+   thread_data->srcAlpha = srcAlpha;
+   thread_data->dstAlpha = dstAlpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendFuncSeparateOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBlendEquationOES(GLenum mode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBlendEquationOES))(GLenum mode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBlendEquationOES) orig_func;
+   GLenum mode;
+
+} GL_TH_ST(glBlendEquationOES);
+
+static void
+GL_TH_CB(glBlendEquationOES)(void *data)
+{
+   GL_TH_ST(glBlendEquationOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendEquationOES))thread_data->orig_func)
+      (thread_data->mode);
+
+}
+
+void
+GL_TH_FN(glBlendEquationOES)(GL_TH_DP, GLenum mode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendEquationOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendEquationOES))orig_func)
+           (mode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquationOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquationOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexsOES))(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexsOES) orig_func;
+   GLshort x;
+   GLshort y;
+   GLshort z;
+   GLshort width;
+   GLshort height;
+
+} GL_TH_ST(glDrawTexsOES);
+
+static void
+GL_TH_CB(glDrawTexsOES)(void *data)
+{
+   GL_TH_ST(glDrawTexsOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexsOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glDrawTexsOES)(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexsOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexsOES))orig_func)
+           (x, y, z, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexsOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexsOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexiOES))(GLint x, GLint y, GLint z, GLint width, GLint height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexiOES) orig_func;
+   GLint x;
+   GLint y;
+   GLint z;
+   GLint width;
+   GLint height;
+
+} GL_TH_ST(glDrawTexiOES);
+
+static void
+GL_TH_CB(glDrawTexiOES)(void *data)
+{
+   GL_TH_ST(glDrawTexiOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexiOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glDrawTexiOES)(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexiOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexiOES))orig_func)
+           (x, y, z, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexiOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexiOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexxOES))(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexxOES) orig_func;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+   GLfixed width;
+   GLfixed height;
+
+} GL_TH_ST(glDrawTexxOES);
+
+static void
+GL_TH_CB(glDrawTexxOES)(void *data)
+{
+   GL_TH_ST(glDrawTexxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexxOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glDrawTexxOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexxOES))orig_func)
+           (x, y, z, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexsvOES(const GLshort *coords);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexsvOES))(const GLshort *coords);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexsvOES) orig_func;
+   const GLshort *coords;
+
+} GL_TH_ST(glDrawTexsvOES);
+
+static void
+GL_TH_CB(glDrawTexsvOES)(void *data)
+{
+   GL_TH_ST(glDrawTexsvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexsvOES))thread_data->orig_func)
+      (thread_data->coords);
+
+}
+
+void
+GL_TH_FN(glDrawTexsvOES)(GL_TH_DP, const GLshort *coords)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexsvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexsvOES))orig_func)
+           (coords);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexsvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coords = coords;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexsvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexivOES(const GLint *coords);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexivOES))(const GLint *coords);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexivOES) orig_func;
+   const GLint *coords;
+
+} GL_TH_ST(glDrawTexivOES);
+
+static void
+GL_TH_CB(glDrawTexivOES)(void *data)
+{
+   GL_TH_ST(glDrawTexivOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexivOES))thread_data->orig_func)
+      (thread_data->coords);
+
+}
+
+void
+GL_TH_FN(glDrawTexivOES)(GL_TH_DP, const GLint *coords)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexivOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexivOES))orig_func)
+           (coords);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexivOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coords = coords;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexivOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexxvOES(const GLfixed *coords);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexxvOES))(const GLfixed *coords);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexxvOES) orig_func;
+   const GLfixed *coords;
+
+} GL_TH_ST(glDrawTexxvOES);
+
+static void
+GL_TH_CB(glDrawTexxvOES)(void *data)
+{
+   GL_TH_ST(glDrawTexxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexxvOES))thread_data->orig_func)
+      (thread_data->coords);
+
+}
+
+void
+GL_TH_FN(glDrawTexxvOES)(GL_TH_DP, const GLfixed *coords)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexxvOES))orig_func)
+           (coords);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coords = coords;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexfOES))(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexfOES) orig_func;
+   GLfloat x;
+   GLfloat y;
+   GLfloat z;
+   GLfloat width;
+   GLfloat height;
+
+} GL_TH_ST(glDrawTexfOES);
+
+static void
+GL_TH_CB(glDrawTexfOES)(void *data)
+{
+   GL_TH_ST(glDrawTexfOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexfOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glDrawTexfOES)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexfOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexfOES))orig_func)
+           (x, y, z, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexfOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexfOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawTexfvOES(const GLfloat *coords);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawTexfvOES))(const GLfloat *coords);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawTexfvOES) orig_func;
+   const GLfloat *coords;
+
+} GL_TH_ST(glDrawTexfvOES);
+
+static void
+GL_TH_CB(glDrawTexfvOES)(void *data)
+{
+   GL_TH_ST(glDrawTexfvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawTexfvOES))thread_data->orig_func)
+      (thread_data->coords);
+
+}
+
+void
+GL_TH_FN(glDrawTexfvOES)(GL_TH_DP, const GLfloat *coords)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawTexfvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawTexfvOES))orig_func)
+           (coords);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawTexfvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coords = coords;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawTexfvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glAlphaFuncxOES(GLenum func, GLclampx ref);
+ */
+
+typedef void(*GL_TH_FNTYPE(glAlphaFuncxOES))(GLenum func, GLclampx ref);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glAlphaFuncxOES) orig_func;
+   GLenum func;
+   GLclampx ref;
+
+} GL_TH_ST(glAlphaFuncxOES);
+
+static void
+GL_TH_CB(glAlphaFuncxOES)(void *data)
+{
+   GL_TH_ST(glAlphaFuncxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glAlphaFuncxOES))thread_data->orig_func)
+      (thread_data->func,
+       thread_data->ref);
+
+}
+
+void
+GL_TH_FN(glAlphaFuncxOES)(GL_TH_DP, GLenum func, GLclampx ref)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glAlphaFuncxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glAlphaFuncxOES))orig_func)
+           (func, ref);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glAlphaFuncxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->func = func;
+   thread_data->ref = ref;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glAlphaFuncxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearColorxOES(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearColorxOES))(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearColorxOES) orig_func;
+   GLclampx red;
+   GLclampx green;
+   GLclampx blue;
+   GLclampx alpha;
+
+} GL_TH_ST(glClearColorxOES);
+
+static void
+GL_TH_CB(glClearColorxOES)(void *data)
+{
+   GL_TH_ST(glClearColorxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearColorxOES))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glClearColorxOES)(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearColorxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearColorxOES))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearColorxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearColorxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearDepthxOES(GLclampx depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearDepthxOES))(GLclampx depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearDepthxOES) orig_func;
+   GLclampx depth;
+
+} GL_TH_ST(glClearDepthxOES);
+
+static void
+GL_TH_CB(glClearDepthxOES)(void *data)
+{
+   GL_TH_ST(glClearDepthxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearDepthxOES))thread_data->orig_func)
+      (thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glClearDepthxOES)(GL_TH_DP, GLclampx depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearDepthxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearDepthxOES))orig_func)
+           (depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearDepthxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearDepthxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanexOES(GLenum plane, const GLfixed *equation);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanexOES))(GLenum plane, const GLfixed *equation);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanexOES) orig_func;
+   GLenum plane;
+   const GLfixed *equation;
+
+} GL_TH_ST(glClipPlanexOES);
+
+static void
+GL_TH_CB(glClipPlanexOES)(void *data)
+{
+   GL_TH_ST(glClipPlanexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanexOES))thread_data->orig_func)
+      (thread_data->plane,
+       thread_data->equation);
+
+}
+
+void
+GL_TH_FN(glClipPlanexOES)(GL_TH_DP, GLenum plane, const GLfixed *equation)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanexOES))orig_func)
+           (plane, equation);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->plane = plane;
+   thread_data->equation = equation;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+ */
+
+typedef void(*GL_TH_FNTYPE(glColor4xOES))(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glColor4xOES) orig_func;
+   GLfixed red;
+   GLfixed green;
+   GLfixed blue;
+   GLfixed alpha;
+
+} GL_TH_ST(glColor4xOES);
+
+static void
+GL_TH_CB(glColor4xOES)(void *data)
+{
+   GL_TH_ST(glColor4xOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glColor4xOES))thread_data->orig_func)
+      (thread_data->red,
+       thread_data->green,
+       thread_data->blue,
+       thread_data->alpha);
+
+}
+
+void
+GL_TH_FN(glColor4xOES)(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glColor4xOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColor4xOES))orig_func)
+           (red, green, blue, alpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColor4xOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->red = red;
+   thread_data->green = green;
+   thread_data->blue = blue;
+   thread_data->alpha = alpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColor4xOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDepthRangexOES(GLclampx zNear, GLclampx zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDepthRangexOES))(GLclampx zNear, GLclampx zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDepthRangexOES) orig_func;
+   GLclampx zNear;
+   GLclampx zFar;
+
+} GL_TH_ST(glDepthRangexOES);
+
+static void
+GL_TH_CB(glDepthRangexOES)(void *data)
+{
+   GL_TH_ST(glDepthRangexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDepthRangexOES))thread_data->orig_func)
+      (thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glDepthRangexOES)(GL_TH_DP, GLclampx zNear, GLclampx zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDepthRangexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthRangexOES))orig_func)
+           (zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthRangexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthRangexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogxOES(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogxOES))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogxOES) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glFogxOES);
+
+static void
+GL_TH_CB(glFogxOES)(void *data)
+{
+   GL_TH_ST(glFogxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogxOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glFogxOES)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogxOES))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFogxvOES(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFogxvOES))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFogxvOES) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glFogxvOES);
+
+static void
+GL_TH_CB(glFogxvOES)(void *data)
+{
+   GL_TH_ST(glFogxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFogxvOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glFogxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFogxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFogxvOES))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFogxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFogxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFrustumxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFrustumxOES))(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFrustumxOES) orig_func;
+   GLfixed left;
+   GLfixed right;
+   GLfixed bottom;
+   GLfixed top;
+   GLfixed zNear;
+   GLfixed zFar;
+
+} GL_TH_ST(glFrustumxOES);
+
+static void
+GL_TH_CB(glFrustumxOES)(void *data)
+{
+   GL_TH_ST(glFrustumxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFrustumxOES))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glFrustumxOES)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFrustumxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFrustumxOES))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFrustumxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFrustumxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetClipPlanexOES(GLenum pname, GLfixed eqn[4]);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetClipPlanexOES))(GLenum pname, GLfixed eqn[4]);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetClipPlanexOES) orig_func;
+   GLenum pname;
+   GLfixed eqn[4];
+
+} GL_TH_ST(glGetClipPlanexOES);
+
+static void
+GL_TH_CB(glGetClipPlanexOES)(void *data)
+{
+   GL_TH_ST(glGetClipPlanexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetClipPlanexOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->eqn);
+
+}
+
+void
+GL_TH_FN(glGetClipPlanexOES)(GL_TH_DP, GLenum pname, GLfixed eqn[4])
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetClipPlanexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetClipPlanexOES))orig_func)
+           (pname, eqn);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetClipPlanexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   memcpy(thread_data->eqn, &eqn, sizeof(GLfixed) * 4);
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetClipPlanexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetFixedvOES(GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFixedvOES))(GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFixedvOES) orig_func;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetFixedvOES);
+
+static void
+GL_TH_CB(glGetFixedvOES)(void *data)
+{
+   GL_TH_ST(glGetFixedvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFixedvOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFixedvOES)(GL_TH_DP, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFixedvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFixedvOES))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFixedvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFixedvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetLightxvOES(GLenum light, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetLightxvOES))(GLenum light, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetLightxvOES) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetLightxvOES);
+
+static void
+GL_TH_CB(glGetLightxvOES)(void *data)
+{
+   GL_TH_ST(glGetLightxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetLightxvOES))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetLightxvOES)(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetLightxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetLightxvOES))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetLightxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetLightxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetMaterialxvOES))(GLenum face, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetMaterialxvOES) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetMaterialxvOES);
+
+static void
+GL_TH_CB(glGetMaterialxvOES)(void *data)
+{
+   GL_TH_ST(glGetMaterialxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetMaterialxvOES))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetMaterialxvOES)(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetMaterialxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetMaterialxvOES))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetMaterialxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetMaterialxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexEnvxvOES(GLenum env, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexEnvxvOES))(GLenum env, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexEnvxvOES) orig_func;
+   GLenum env;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetTexEnvxvOES);
+
+static void
+GL_TH_CB(glGetTexEnvxvOES)(void *data)
+{
+   GL_TH_ST(glGetTexEnvxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexEnvxvOES))thread_data->orig_func)
+      (thread_data->env,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexEnvxvOES)(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexEnvxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexEnvxvOES))orig_func)
+           (env, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexEnvxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->env = env;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexEnvxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexParameterxvOES))(GLenum target, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexParameterxvOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetTexParameterxvOES);
+
+static void
+GL_TH_CB(glGetTexParameterxvOES)(void *data)
+{
+   GL_TH_ST(glGetTexParameterxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexParameterxvOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexParameterxvOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexParameterxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexParameterxvOES))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameterxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameterxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelxOES(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelxOES))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelxOES) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glLightModelxOES);
+
+static void
+GL_TH_CB(glLightModelxOES)(void *data)
+{
+   GL_TH_ST(glLightModelxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelxOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightModelxOES)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelxOES))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightModelxvOES(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightModelxvOES))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightModelxvOES) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glLightModelxvOES);
+
+static void
+GL_TH_CB(glLightModelxvOES)(void *data)
+{
+   GL_TH_ST(glLightModelxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightModelxvOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightModelxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightModelxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightModelxvOES))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightModelxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightModelxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightxOES(GLenum light, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightxOES))(GLenum light, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightxOES) orig_func;
+   GLenum light;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glLightxOES);
+
+static void
+GL_TH_CB(glLightxOES)(void *data)
+{
+   GL_TH_ST(glLightxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightxOES))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glLightxOES)(GL_TH_DP, GLenum light, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightxOES))orig_func)
+           (light, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLightxvOES(GLenum light, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLightxvOES))(GLenum light, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLightxvOES) orig_func;
+   GLenum light;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glLightxvOES);
+
+static void
+GL_TH_CB(glLightxvOES)(void *data)
+{
+   GL_TH_ST(glLightxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLightxvOES))thread_data->orig_func)
+      (thread_data->light,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glLightxvOES)(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLightxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLightxvOES))orig_func)
+           (light, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLightxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->light = light;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLightxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLineWidthxOES(GLfixed width);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLineWidthxOES))(GLfixed width);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLineWidthxOES) orig_func;
+   GLfixed width;
+
+} GL_TH_ST(glLineWidthxOES);
+
+static void
+GL_TH_CB(glLineWidthxOES)(void *data)
+{
+   GL_TH_ST(glLineWidthxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLineWidthxOES))thread_data->orig_func)
+      (thread_data->width);
+
+}
+
+void
+GL_TH_FN(glLineWidthxOES)(GL_TH_DP, GLfixed width)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLineWidthxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLineWidthxOES))orig_func)
+           (width);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLineWidthxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->width = width;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLineWidthxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLoadMatrixxOES(const GLfixed *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLoadMatrixxOES))(const GLfixed *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLoadMatrixxOES) orig_func;
+   const GLfixed *m;
+
+} GL_TH_ST(glLoadMatrixxOES);
+
+static void
+GL_TH_CB(glLoadMatrixxOES)(void *data)
+{
+   GL_TH_ST(glLoadMatrixxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLoadMatrixxOES))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glLoadMatrixxOES)(GL_TH_DP, const GLfixed *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLoadMatrixxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLoadMatrixxOES))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLoadMatrixxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLoadMatrixxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialxOES(GLenum face, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialxOES))(GLenum face, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialxOES) orig_func;
+   GLenum face;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glMaterialxOES);
+
+static void
+GL_TH_CB(glMaterialxOES)(void *data)
+{
+   GL_TH_ST(glMaterialxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialxOES))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glMaterialxOES)(GL_TH_DP, GLenum face, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialxOES))orig_func)
+           (face, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMaterialxvOES(GLenum face, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMaterialxvOES))(GLenum face, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMaterialxvOES) orig_func;
+   GLenum face;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glMaterialxvOES);
+
+static void
+GL_TH_CB(glMaterialxvOES)(void *data)
+{
+   GL_TH_ST(glMaterialxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMaterialxvOES))thread_data->orig_func)
+      (thread_data->face,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glMaterialxvOES)(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMaterialxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMaterialxvOES))orig_func)
+           (face, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMaterialxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->face = face;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMaterialxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultMatrixxOES(const GLfixed *m);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultMatrixxOES))(const GLfixed *m);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultMatrixxOES) orig_func;
+   const GLfixed *m;
+
+} GL_TH_ST(glMultMatrixxOES);
+
+static void
+GL_TH_CB(glMultMatrixxOES)(void *data)
+{
+   GL_TH_ST(glMultMatrixxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultMatrixxOES))thread_data->orig_func)
+      (thread_data->m);
+
+}
+
+void
+GL_TH_FN(glMultMatrixxOES)(GL_TH_DP, const GLfixed *m)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultMatrixxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultMatrixxOES))orig_func)
+           (m);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultMatrixxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->m = m;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultMatrixxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMultiTexCoord4xOES(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMultiTexCoord4xOES))(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMultiTexCoord4xOES) orig_func;
+   GLenum target;
+   GLfixed s;
+   GLfixed t;
+   GLfixed r;
+   GLfixed q;
+
+} GL_TH_ST(glMultiTexCoord4xOES);
+
+static void
+GL_TH_CB(glMultiTexCoord4xOES)(void *data)
+{
+   GL_TH_ST(glMultiTexCoord4xOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMultiTexCoord4xOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->s,
+       thread_data->t,
+       thread_data->r,
+       thread_data->q);
+
+}
+
+void
+GL_TH_FN(glMultiTexCoord4xOES)(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMultiTexCoord4xOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMultiTexCoord4xOES))orig_func)
+           (target, s, t, r, q);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMultiTexCoord4xOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->s = s;
+   thread_data->t = t;
+   thread_data->r = r;
+   thread_data->q = q;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMultiTexCoord4xOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz);
+ */
+
+typedef void(*GL_TH_FNTYPE(glNormal3xOES))(GLfixed nx, GLfixed ny, GLfixed nz);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glNormal3xOES) orig_func;
+   GLfixed nx;
+   GLfixed ny;
+   GLfixed nz;
+
+} GL_TH_ST(glNormal3xOES);
+
+static void
+GL_TH_CB(glNormal3xOES)(void *data)
+{
+   GL_TH_ST(glNormal3xOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glNormal3xOES))thread_data->orig_func)
+      (thread_data->nx,
+       thread_data->ny,
+       thread_data->nz);
+
+}
+
+void
+GL_TH_FN(glNormal3xOES)(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glNormal3xOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glNormal3xOES))orig_func)
+           (nx, ny, nz);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glNormal3xOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->nx = nx;
+   thread_data->ny = ny;
+   thread_data->nz = nz;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glNormal3xOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glOrthoxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glOrthoxOES))(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glOrthoxOES) orig_func;
+   GLfixed left;
+   GLfixed right;
+   GLfixed bottom;
+   GLfixed top;
+   GLfixed zNear;
+   GLfixed zFar;
+
+} GL_TH_ST(glOrthoxOES);
+
+static void
+GL_TH_CB(glOrthoxOES)(void *data)
+{
+   GL_TH_ST(glOrthoxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glOrthoxOES))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glOrthoxOES)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glOrthoxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glOrthoxOES))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glOrthoxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glOrthoxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterxOES(GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterxOES))(GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterxOES) orig_func;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glPointParameterxOES);
+
+static void
+GL_TH_CB(glPointParameterxOES)(void *data)
+{
+   GL_TH_ST(glPointParameterxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterxOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glPointParameterxOES)(GL_TH_DP, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterxOES))orig_func)
+           (pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointParameterxvOES(GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointParameterxvOES))(GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointParameterxvOES) orig_func;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glPointParameterxvOES);
+
+static void
+GL_TH_CB(glPointParameterxvOES)(void *data)
+{
+   GL_TH_ST(glPointParameterxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointParameterxvOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glPointParameterxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointParameterxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointParameterxvOES))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointParameterxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointParameterxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPointSizexOES(GLfixed size);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPointSizexOES))(GLfixed size);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPointSizexOES) orig_func;
+   GLfixed size;
+
+} GL_TH_ST(glPointSizexOES);
+
+static void
+GL_TH_CB(glPointSizexOES)(void *data)
+{
+   GL_TH_ST(glPointSizexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPointSizexOES))thread_data->orig_func)
+      (thread_data->size);
+
+}
+
+void
+GL_TH_FN(glPointSizexOES)(GL_TH_DP, GLfixed size)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPointSizexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPointSizexOES))orig_func)
+           (size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPointSizexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPointSizexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glPolygonOffsetxOES(GLfixed factor, GLfixed units);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPolygonOffsetxOES))(GLfixed factor, GLfixed units);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPolygonOffsetxOES) orig_func;
+   GLfixed factor;
+   GLfixed units;
+
+} GL_TH_ST(glPolygonOffsetxOES);
+
+static void
+GL_TH_CB(glPolygonOffsetxOES)(void *data)
+{
+   GL_TH_ST(glPolygonOffsetxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPolygonOffsetxOES))thread_data->orig_func)
+      (thread_data->factor,
+       thread_data->units);
+
+}
+
+void
+GL_TH_FN(glPolygonOffsetxOES)(GL_TH_DP, GLfixed factor, GLfixed units)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPolygonOffsetxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPolygonOffsetxOES))orig_func)
+           (factor, units);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPolygonOffsetxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->factor = factor;
+   thread_data->units = units;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPolygonOffsetxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRotatexOES))(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRotatexOES) orig_func;
+   GLfixed angle;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glRotatexOES);
+
+static void
+GL_TH_CB(glRotatexOES)(void *data)
+{
+   GL_TH_ST(glRotatexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRotatexOES))thread_data->orig_func)
+      (thread_data->angle,
+       thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glRotatexOES)(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRotatexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRotatexOES))orig_func)
+           (angle, x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRotatexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->angle = angle;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRotatexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSampleCoveragexOES(GLclampx value, GLboolean invert);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSampleCoveragexOES))(GLclampx value, GLboolean invert);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSampleCoveragexOES) orig_func;
+   GLclampx value;
+   GLboolean invert;
+
+} GL_TH_ST(glSampleCoveragexOES);
+
+static void
+GL_TH_CB(glSampleCoveragexOES)(void *data)
+{
+   GL_TH_ST(glSampleCoveragexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSampleCoveragexOES))thread_data->orig_func)
+      (thread_data->value,
+       thread_data->invert);
+
+}
+
+void
+GL_TH_FN(glSampleCoveragexOES)(GL_TH_DP, GLclampx value, GLboolean invert)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSampleCoveragexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSampleCoveragexOES))orig_func)
+           (value, invert);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSampleCoveragexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->value = value;
+   thread_data->invert = invert;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSampleCoveragexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glScalexOES(GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glScalexOES))(GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glScalexOES) orig_func;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glScalexOES);
+
+static void
+GL_TH_CB(glScalexOES)(void *data)
+{
+   GL_TH_ST(glScalexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glScalexOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glScalexOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glScalexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glScalexOES))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glScalexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glScalexOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvxOES(GLenum target, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvxOES))(GLenum target, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvxOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glTexEnvxOES);
+
+static void
+GL_TH_CB(glTexEnvxOES)(void *data)
+{
+   GL_TH_ST(glTexEnvxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvxOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexEnvxOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvxOES))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexEnvxvOES))(GLenum target, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexEnvxvOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glTexEnvxvOES);
+
+static void
+GL_TH_CB(glTexEnvxvOES)(void *data)
+{
+   GL_TH_ST(glTexEnvxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexEnvxvOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexEnvxvOES)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexEnvxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexEnvxvOES))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexEnvxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexEnvxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameterxOES(GLenum target, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterxOES))(GLenum target, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterxOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glTexParameterxOES);
+
+static void
+GL_TH_CB(glTexParameterxOES)(void *data)
+{
+   GL_TH_ST(glTexParameterxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterxOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexParameterxOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterxOES))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexParameterxvOES))(GLenum target, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexParameterxvOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glTexParameterxvOES);
+
+static void
+GL_TH_CB(glTexParameterxvOES)(void *data)
+{
+   GL_TH_ST(glTexParameterxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexParameterxvOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexParameterxvOES)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterxvOES))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTranslatexOES(GLfixed x, GLfixed y, GLfixed z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTranslatexOES))(GLfixed x, GLfixed y, GLfixed z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTranslatexOES) orig_func;
+   GLfixed x;
+   GLfixed y;
+   GLfixed z;
+
+} GL_TH_ST(glTranslatexOES);
+
+static void
+GL_TH_CB(glTranslatexOES)(void *data)
+{
+   GL_TH_ST(glTranslatexOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTranslatexOES))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->z);
+
+}
+
+void
+GL_TH_FN(glTranslatexOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTranslatexOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTranslatexOES))orig_func)
+           (x, y, z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTranslatexOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->z = z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTranslatexOES),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsRenderbufferOES(GLuint renderbuffer);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsRenderbufferOES))(GLuint renderbuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsRenderbufferOES) orig_func;
+   GLboolean return_value;
+   GLuint renderbuffer;
+
+} GL_TH_ST(glIsRenderbufferOES);
+
+static void
+GL_TH_CB(glIsRenderbufferOES)(void *data)
+{
+   GL_TH_ST(glIsRenderbufferOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsRenderbufferOES))thread_data->orig_func)
+      (thread_data->renderbuffer);
+
+}
+
+GLboolean
+GL_TH_FN(glIsRenderbufferOES)(GL_TH_DP, GLuint renderbuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsRenderbufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsRenderbufferOES))orig_func)
+           (renderbuffer);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsRenderbufferOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsRenderbufferOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glBindRenderbufferOES(GLenum target, GLuint renderbuffer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindRenderbufferOES))(GLenum target, GLuint renderbuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindRenderbufferOES) orig_func;
+   GLenum target;
+   GLuint renderbuffer;
+
+} GL_TH_ST(glBindRenderbufferOES);
+
+static void
+GL_TH_CB(glBindRenderbufferOES)(void *data)
+{
+   GL_TH_ST(glBindRenderbufferOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindRenderbufferOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->renderbuffer);
+
+}
+
+void
+GL_TH_FN(glBindRenderbufferOES)(GL_TH_DP, GLenum target, GLuint renderbuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindRenderbufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindRenderbufferOES))orig_func)
+           (target, renderbuffer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindRenderbufferOES) *) + sizeof(GL_TH_ST(glBindRenderbufferOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBindRenderbufferOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindRenderbufferOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteRenderbuffersOES))(GLsizei n, const GLuint* renderbuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteRenderbuffersOES) orig_func;
+   GLsizei n;
+   const GLuint* renderbuffers;
+   void *renderbuffers_copied; /* COPIED */
+
+} GL_TH_ST(glDeleteRenderbuffersOES);
+
+static void
+GL_TH_CB(glDeleteRenderbuffersOES)(void *data)
+{
+   GL_TH_ST(glDeleteRenderbuffersOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteRenderbuffersOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->renderbuffers);
+
+
+   if (thread_data->renderbuffers_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
+
+}
+
+void
+GL_TH_FN(glDeleteRenderbuffersOES)(GL_TH_DP, GLsizei n, const GLuint* renderbuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteRenderbuffersOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteRenderbuffersOES))orig_func)
+           (n, renderbuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteRenderbuffersOES) *) + sizeof(GL_TH_ST(glDeleteRenderbuffersOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteRenderbuffersOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->n = n;
+   thread_data->renderbuffers = renderbuffers;
+   thread_data->orig_func = orig_func;
+
+   thread_data->renderbuffers_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (renderbuffers)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->renderbuffers_copied)
+          {
+             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->renderbuffers = (const GLuint *)thread_data->renderbuffers_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteRenderbuffersOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenRenderbuffersOES(GLsizei n, GLuint* renderbuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenRenderbuffersOES))(GLsizei n, GLuint* renderbuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenRenderbuffersOES) orig_func;
+   GLsizei n;
+   GLuint* renderbuffers;
+
+} GL_TH_ST(glGenRenderbuffersOES);
+
+static void
+GL_TH_CB(glGenRenderbuffersOES)(void *data)
+{
+   GL_TH_ST(glGenRenderbuffersOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenRenderbuffersOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->renderbuffers);
+
+}
+
+void
+GL_TH_FN(glGenRenderbuffersOES)(GL_TH_DP, GLsizei n, GLuint* renderbuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenRenderbuffersOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenRenderbuffersOES))orig_func)
+           (n, renderbuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenRenderbuffersOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->renderbuffers = renderbuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenRenderbuffersOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorageOES))(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorageOES) orig_func;
+   GLenum target;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glRenderbufferStorageOES);
+
+static void
+GL_TH_CB(glRenderbufferStorageOES)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorageOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorageOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorageOES)(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorageOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorageOES))orig_func)
+           (target, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorageOES) *) + sizeof(GL_TH_ST(glRenderbufferStorageOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glRenderbufferStorageOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorageOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetRenderbufferParameterivOES))(GLenum target, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetRenderbufferParameterivOES) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetRenderbufferParameterivOES);
+
+static void
+GL_TH_CB(glGetRenderbufferParameterivOES)(void *data)
+{
+   GL_TH_ST(glGetRenderbufferParameterivOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetRenderbufferParameterivOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetRenderbufferParameterivOES)(GL_TH_DP, GLenum target, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetRenderbufferParameterivOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetRenderbufferParameterivOES))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetRenderbufferParameterivOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetRenderbufferParameterivOES),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsFramebufferOES(GLuint framebuffer);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsFramebufferOES))(GLuint framebuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsFramebufferOES) orig_func;
+   GLboolean return_value;
+   GLuint framebuffer;
+
+} GL_TH_ST(glIsFramebufferOES);
+
+static void
+GL_TH_CB(glIsFramebufferOES)(void *data)
+{
+   GL_TH_ST(glIsFramebufferOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsFramebufferOES))thread_data->orig_func)
+      (thread_data->framebuffer);
+
+}
+
+GLboolean
+GL_TH_FN(glIsFramebufferOES)(GL_TH_DP, GLuint framebuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsFramebufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsFramebufferOES))orig_func)
+           (framebuffer);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsFramebufferOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->framebuffer = framebuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsFramebufferOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glBindFramebufferOES(GLenum target, GLuint framebuffer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindFramebufferOES))(GLenum target, GLuint framebuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindFramebufferOES) orig_func;
+   GLenum target;
+   GLuint framebuffer;
+
+} GL_TH_ST(glBindFramebufferOES);
+
+static void
+GL_TH_CB(glBindFramebufferOES)(void *data)
+{
+   GL_TH_ST(glBindFramebufferOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindFramebufferOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->framebuffer);
+
+}
+
+void
+GL_TH_FN(glBindFramebufferOES)(GL_TH_DP, GLenum target, GLuint framebuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindFramebufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindFramebufferOES))orig_func)
+           (target, framebuffer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindFramebufferOES) *) + sizeof(GL_TH_ST(glBindFramebufferOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glBindFramebufferOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->framebuffer = framebuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindFramebufferOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteFramebuffersOES))(GLsizei n, const GLuint* framebuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteFramebuffersOES) orig_func;
+   GLsizei n;
+   const GLuint* framebuffers;
+   void *framebuffers_copied; /* COPIED */
+
+} GL_TH_ST(glDeleteFramebuffersOES);
+
+static void
+GL_TH_CB(glDeleteFramebuffersOES)(void *data)
+{
+   GL_TH_ST(glDeleteFramebuffersOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteFramebuffersOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->framebuffers);
+
+
+   if (thread_data->framebuffers_copied)
+     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
+
+}
+
+void
+GL_TH_FN(glDeleteFramebuffersOES)(GL_TH_DP, GLsizei n, const GLuint* framebuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteFramebuffersOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteFramebuffersOES))orig_func)
+           (n, framebuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteFramebuffersOES) *) + sizeof(GL_TH_ST(glDeleteFramebuffersOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glDeleteFramebuffersOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->n = n;
+   thread_data->framebuffers = framebuffers;
+   thread_data->orig_func = orig_func;
+
+   thread_data->framebuffers_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (framebuffers)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = n * sizeof(GLuint);
+        if (copy_size > _mp_delete_object_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
+        if (thread_data->framebuffers_copied)
+          {
+             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->framebuffers = (const GLuint *)thread_data->framebuffers_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteFramebuffersOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenFramebuffersOES(GLsizei n, GLuint* framebuffers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenFramebuffersOES))(GLsizei n, GLuint* framebuffers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenFramebuffersOES) orig_func;
+   GLsizei n;
+   GLuint* framebuffers;
+
+} GL_TH_ST(glGenFramebuffersOES);
+
+static void
+GL_TH_CB(glGenFramebuffersOES)(void *data)
+{
+   GL_TH_ST(glGenFramebuffersOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenFramebuffersOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->framebuffers);
+
+}
+
+void
+GL_TH_FN(glGenFramebuffersOES)(GL_TH_DP, GLsizei n, GLuint* framebuffers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenFramebuffersOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenFramebuffersOES))orig_func)
+           (n, framebuffers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenFramebuffersOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->framebuffers = framebuffers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenFramebuffersOES),
+                              thread_mode);
+}
+
+/*
+ * GLenum
+ * glCheckFramebufferStatusOES(GLenum target);
+ */
+
+typedef GLenum(*GL_TH_FNTYPE(glCheckFramebufferStatusOES))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCheckFramebufferStatusOES) orig_func;
+   GLenum return_value;
+   GLenum target;
+
+} GL_TH_ST(glCheckFramebufferStatusOES);
+
+static void
+GL_TH_CB(glCheckFramebufferStatusOES)(void *data)
+{
+   GL_TH_ST(glCheckFramebufferStatusOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glCheckFramebufferStatusOES))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+GLenum
+GL_TH_FN(glCheckFramebufferStatusOES)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCheckFramebufferStatusOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glCheckFramebufferStatusOES))orig_func)
+           (target);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCheckFramebufferStatusOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCheckFramebufferStatusOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glFramebufferRenderbufferOES(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferRenderbufferOES))(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferRenderbufferOES) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum renderbuffertarget;
+   GLuint renderbuffer;
+
+} GL_TH_ST(glFramebufferRenderbufferOES);
+
+static void
+GL_TH_CB(glFramebufferRenderbufferOES)(void *data)
+{
+   GL_TH_ST(glFramebufferRenderbufferOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferRenderbufferOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->renderbuffertarget,
+       thread_data->renderbuffer);
+
+}
+
+void
+GL_TH_FN(glFramebufferRenderbufferOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferRenderbufferOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferRenderbufferOES))orig_func)
+           (target, attachment, renderbuffertarget, renderbuffer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferRenderbufferOES) *) + sizeof(GL_TH_ST(glFramebufferRenderbufferOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferRenderbufferOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->renderbuffertarget = renderbuffertarget;
+   thread_data->renderbuffer = renderbuffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferRenderbufferOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture2DOES))(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture2DOES) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum textarget;
+   GLuint texture;
+   GLint level;
+
+} GL_TH_ST(glFramebufferTexture2DOES);
+
+static void
+GL_TH_CB(glFramebufferTexture2DOES)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture2DOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture2DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->textarget,
+       thread_data->texture,
+       thread_data->level);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture2DOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture2DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture2DOES))orig_func)
+           (target, attachment, textarget, texture, level);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture2DOES) *) + sizeof(GL_TH_ST(glFramebufferTexture2DOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferTexture2DOES) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->textarget = textarget;
+   thread_data->texture = texture;
+   thread_data->level = level;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture2DOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFramebufferAttachmentParameterivOES))(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFramebufferAttachmentParameterivOES) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLenum pname;
+   GLint* params;
+
+} GL_TH_ST(glGetFramebufferAttachmentParameterivOES);
+
+static void
+GL_TH_CB(glGetFramebufferAttachmentParameterivOES)(void *data)
+{
+   GL_TH_ST(glGetFramebufferAttachmentParameterivOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFramebufferAttachmentParameterivOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFramebufferAttachmentParameterivOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFramebufferAttachmentParameterivOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFramebufferAttachmentParameterivOES))orig_func)
+           (target, attachment, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFramebufferAttachmentParameterivOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFramebufferAttachmentParameterivOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenerateMipmapOES(GLenum target);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenerateMipmapOES))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenerateMipmapOES) orig_func;
+   GLenum target;
+
+} GL_TH_ST(glGenerateMipmapOES);
+
+static void
+GL_TH_CB(glGenerateMipmapOES)(void *data)
+{
+   GL_TH_ST(glGenerateMipmapOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenerateMipmapOES))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+void
+GL_TH_FN(glGenerateMipmapOES)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenerateMipmapOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenerateMipmapOES))orig_func)
+           (target);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenerateMipmapOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenerateMipmapOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCurrentPaletteMatrixOES(GLuint matrixpaletteindex);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCurrentPaletteMatrixOES))(GLuint matrixpaletteindex);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCurrentPaletteMatrixOES) orig_func;
+   GLuint matrixpaletteindex;
+
+} GL_TH_ST(glCurrentPaletteMatrixOES);
+
+static void
+GL_TH_CB(glCurrentPaletteMatrixOES)(void *data)
+{
+   GL_TH_ST(glCurrentPaletteMatrixOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCurrentPaletteMatrixOES))thread_data->orig_func)
+      (thread_data->matrixpaletteindex);
+
+}
+
+void
+GL_TH_FN(glCurrentPaletteMatrixOES)(GL_TH_DP, GLuint matrixpaletteindex)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCurrentPaletteMatrixOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCurrentPaletteMatrixOES))orig_func)
+           (matrixpaletteindex);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCurrentPaletteMatrixOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->matrixpaletteindex = matrixpaletteindex;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCurrentPaletteMatrixOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glLoadPaletteFromModelViewMatrixOES(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glLoadPaletteFromModelViewMatrixOES))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glLoadPaletteFromModelViewMatrixOES) orig_func;
+
+} GL_TH_ST(glLoadPaletteFromModelViewMatrixOES);
+
+static void
+GL_TH_CB(glLoadPaletteFromModelViewMatrixOES)(void *data)
+{
+   GL_TH_ST(glLoadPaletteFromModelViewMatrixOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glLoadPaletteFromModelViewMatrixOES))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glLoadPaletteFromModelViewMatrixOES)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glLoadPaletteFromModelViewMatrixOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glLoadPaletteFromModelViewMatrixOES))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glLoadPaletteFromModelViewMatrixOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glLoadPaletteFromModelViewMatrixOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glMatrixIndexPointerOES))(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMatrixIndexPointerOES) orig_func;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glMatrixIndexPointerOES);
+
+static void
+GL_TH_CB(glMatrixIndexPointerOES)(void *data)
+{
+   GL_TH_ST(glMatrixIndexPointerOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glMatrixIndexPointerOES))thread_data->orig_func)
+      (thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glMatrixIndexPointerOES)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMatrixIndexPointerOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMatrixIndexPointerOES))orig_func)
+           (size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMatrixIndexPointerOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMatrixIndexPointerOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glWeightPointerOES))(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glWeightPointerOES) orig_func;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glWeightPointerOES);
+
+static void
+GL_TH_CB(glWeightPointerOES)(void *data)
+{
+   GL_TH_ST(glWeightPointerOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glWeightPointerOES))thread_data->orig_func)
+      (thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glWeightPointerOES)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glWeightPointerOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glWeightPointerOES))orig_func)
+           (size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glWeightPointerOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glWeightPointerOES),
+                              thread_mode);
+}
+
+/*
+ * GLbitfield
+ * glQueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]);
+ */
+
+typedef GLbitfield(*GL_TH_FNTYPE(glQueryMatrixxOES))(GLfixed mantissa[16], GLint exponent[16]);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glQueryMatrixxOES) orig_func;
+   GLbitfield return_value;
+   GLfixed mantissa[16];
+   GLint exponent[16];
+
+} GL_TH_ST(glQueryMatrixxOES);
+
+static void
+GL_TH_CB(glQueryMatrixxOES)(void *data)
+{
+   GL_TH_ST(glQueryMatrixxOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glQueryMatrixxOES))thread_data->orig_func)
+      (thread_data->mantissa,
+       thread_data->exponent);
+
+}
+
+GLbitfield
+GL_TH_FN(glQueryMatrixxOES)(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16])
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glQueryMatrixxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glQueryMatrixxOES))orig_func)
+           (mantissa, exponent);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glQueryMatrixxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   memcpy(thread_data->mantissa, &mantissa, sizeof(GLfixed) * 16);
+   memcpy(thread_data->exponent, &exponent, sizeof(GLint) * 16);
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glQueryMatrixxOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glDepthRangefOES(GLclampf zNear, GLclampf zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDepthRangefOES))(GLclampf zNear, GLclampf zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDepthRangefOES) orig_func;
+   GLclampf zNear;
+   GLclampf zFar;
+
+} GL_TH_ST(glDepthRangefOES);
+
+static void
+GL_TH_CB(glDepthRangefOES)(void *data)
+{
+   GL_TH_ST(glDepthRangefOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDepthRangefOES))thread_data->orig_func)
+      (thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glDepthRangefOES)(GL_TH_DP, GLclampf zNear, GLclampf zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDepthRangefOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDepthRangefOES))orig_func)
+           (zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDepthRangefOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDepthRangefOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFrustumfOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFrustumfOES))(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFrustumfOES) orig_func;
+   GLfloat left;
+   GLfloat right;
+   GLfloat bottom;
+   GLfloat top;
+   GLfloat zNear;
+   GLfloat zFar;
+
+} GL_TH_ST(glFrustumfOES);
+
+static void
+GL_TH_CB(glFrustumfOES)(void *data)
+{
+   GL_TH_ST(glFrustumfOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFrustumfOES))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glFrustumfOES)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFrustumfOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFrustumfOES))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFrustumfOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFrustumfOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glOrthofOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+ */
+
+typedef void(*GL_TH_FNTYPE(glOrthofOES))(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glOrthofOES) orig_func;
+   GLfloat left;
+   GLfloat right;
+   GLfloat bottom;
+   GLfloat top;
+   GLfloat zNear;
+   GLfloat zFar;
+
+} GL_TH_ST(glOrthofOES);
+
+static void
+GL_TH_CB(glOrthofOES)(void *data)
+{
+   GL_TH_ST(glOrthofOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glOrthofOES))thread_data->orig_func)
+      (thread_data->left,
+       thread_data->right,
+       thread_data->bottom,
+       thread_data->top,
+       thread_data->zNear,
+       thread_data->zFar);
+
+}
+
+void
+GL_TH_FN(glOrthofOES)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glOrthofOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glOrthofOES))orig_func)
+           (left, right, bottom, top, zNear, zFar);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glOrthofOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->left = left;
+   thread_data->right = right;
+   thread_data->bottom = bottom;
+   thread_data->top = top;
+   thread_data->zNear = zNear;
+   thread_data->zFar = zFar;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glOrthofOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanefOES(GLenum plane, const GLfloat *equation);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanefOES))(GLenum plane, const GLfloat *equation);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanefOES) orig_func;
+   GLenum plane;
+   const GLfloat *equation;
+
+} GL_TH_ST(glClipPlanefOES);
+
+static void
+GL_TH_CB(glClipPlanefOES)(void *data)
+{
+   GL_TH_ST(glClipPlanefOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanefOES))thread_data->orig_func)
+      (thread_data->plane,
+       thread_data->equation);
+
+}
+
+void
+GL_TH_FN(glClipPlanefOES)(GL_TH_DP, GLenum plane, const GLfloat *equation)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanefOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanefOES))orig_func)
+           (plane, equation);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanefOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->plane = plane;
+   thread_data->equation = equation;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanefOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetClipPlanefOES(GLenum pname, GLfloat eqn[4]);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetClipPlanefOES))(GLenum pname, GLfloat eqn[4]);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetClipPlanefOES) orig_func;
+   GLenum pname;
+   GLfloat eqn[4];
+
+} GL_TH_ST(glGetClipPlanefOES);
+
+static void
+GL_TH_CB(glGetClipPlanefOES)(void *data)
+{
+   GL_TH_ST(glGetClipPlanefOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetClipPlanefOES))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->eqn);
+
+}
+
+void
+GL_TH_FN(glGetClipPlanefOES)(GL_TH_DP, GLenum pname, GLfloat eqn[4])
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetClipPlanefOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetClipPlanefOES))orig_func)
+           (pname, eqn);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetClipPlanefOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   memcpy(thread_data->eqn, &eqn, sizeof(GLfloat) * 4);
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetClipPlanefOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearDepthfOES(GLclampf depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearDepthfOES))(GLclampf depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearDepthfOES) orig_func;
+   GLclampf depth;
+
+} GL_TH_ST(glClearDepthfOES);
+
+static void
+GL_TH_CB(glClearDepthfOES)(void *data)
+{
+   GL_TH_ST(glClearDepthfOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearDepthfOES))thread_data->orig_func)
+      (thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glClearDepthfOES)(GL_TH_DP, GLclampf depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearDepthfOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearDepthfOES))orig_func)
+           (depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearDepthfOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearDepthfOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGenfOES(GLenum coord, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGenfOES))(GLenum coord, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGenfOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glTexGenfOES);
+
+static void
+GL_TH_CB(glTexGenfOES)(void *data)
+{
+   GL_TH_ST(glTexGenfOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGenfOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexGenfOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGenfOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGenfOES))orig_func)
+           (coord, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGenfOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGenfOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGenfvOES))(GLenum coord, GLenum pname, const GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGenfvOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   const GLfloat *params;
+
+} GL_TH_ST(glTexGenfvOES);
+
+static void
+GL_TH_CB(glTexGenfvOES)(void *data)
+{
+   GL_TH_ST(glTexGenfvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGenfvOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexGenfvOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGenfvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGenfvOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGenfvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGenfvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGeniOES(GLenum coord, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGeniOES))(GLenum coord, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGeniOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glTexGeniOES);
+
+static void
+GL_TH_CB(glTexGeniOES)(void *data)
+{
+   GL_TH_ST(glTexGeniOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGeniOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexGeniOES)(GL_TH_DP, GLenum coord, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGeniOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGeniOES))orig_func)
+           (coord, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGeniOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGeniOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGenivOES(GLenum coord, GLenum pname, const GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGenivOES))(GLenum coord, GLenum pname, const GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGenivOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   const GLint *params;
+
+} GL_TH_ST(glTexGenivOES);
+
+static void
+GL_TH_CB(glTexGenivOES)(void *data)
+{
+   GL_TH_ST(glTexGenivOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGenivOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexGenivOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGenivOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGenivOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGenivOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGenivOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGenxOES(GLenum coord, GLenum pname, GLfixed param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGenxOES))(GLenum coord, GLenum pname, GLfixed param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGenxOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLfixed param;
+
+} GL_TH_ST(glTexGenxOES);
+
+static void
+GL_TH_CB(glTexGenxOES)(void *data)
+{
+   GL_TH_ST(glTexGenxOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGenxOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glTexGenxOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGenxOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGenxOES))orig_func)
+           (coord, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGenxOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGenxOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexGenxvOES))(GLenum coord, GLenum pname, const GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexGenxvOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   const GLfixed *params;
+
+} GL_TH_ST(glTexGenxvOES);
+
+static void
+GL_TH_CB(glTexGenxvOES)(void *data)
+{
+   GL_TH_ST(glTexGenxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexGenxvOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glTexGenxvOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexGenxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexGenxvOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexGenxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexGenxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexGenfvOES))(GLenum coord, GLenum pname, GLfloat *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexGenfvOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLfloat *params;
+
+} GL_TH_ST(glGetTexGenfvOES);
+
+static void
+GL_TH_CB(glGetTexGenfvOES)(void *data)
+{
+   GL_TH_ST(glGetTexGenfvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexGenfvOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexGenfvOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexGenfvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexGenfvOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexGenfvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexGenfvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexGenivOES(GLenum coord, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexGenivOES))(GLenum coord, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexGenivOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetTexGenivOES);
+
+static void
+GL_TH_CB(glGetTexGenivOES)(void *data)
+{
+   GL_TH_ST(glGetTexGenivOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexGenivOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexGenivOES)(GL_TH_DP, GLenum coord, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexGenivOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexGenivOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexGenivOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexGenivOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTexGenxvOES))(GLenum coord, GLenum pname, GLfixed *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTexGenxvOES) orig_func;
+   GLenum coord;
+   GLenum pname;
+   GLfixed *params;
+
+} GL_TH_ST(glGetTexGenxvOES);
+
+static void
+GL_TH_CB(glGetTexGenxvOES)(void *data)
+{
+   GL_TH_ST(glGetTexGenxvOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexGenxvOES))thread_data->orig_func)
+      (thread_data->coord,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexGenxvOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexGenxvOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTexGenxvOES))orig_func)
+           (coord, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexGenxvOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->coord = coord;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexGenxvOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindVertexArrayOES(GLuint array);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindVertexArrayOES))(GLuint array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindVertexArrayOES) orig_func;
+   GLuint array;
+
+} GL_TH_ST(glBindVertexArrayOES);
+
+static void
+GL_TH_CB(glBindVertexArrayOES)(void *data)
+{
+   GL_TH_ST(glBindVertexArrayOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindVertexArrayOES))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+void
+GL_TH_FN(glBindVertexArrayOES)(GL_TH_DP, GLuint array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindVertexArrayOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindVertexArrayOES))orig_func)
+           (array);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindVertexArrayOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindVertexArrayOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteVertexArraysOES))(GLsizei n, const GLuint *arrays);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteVertexArraysOES) orig_func;
+   GLsizei n;
+   const GLuint *arrays;
+
+} GL_TH_ST(glDeleteVertexArraysOES);
+
+static void
+GL_TH_CB(glDeleteVertexArraysOES)(void *data)
+{
+   GL_TH_ST(glDeleteVertexArraysOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteVertexArraysOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->arrays);
+
+}
+
+void
+GL_TH_FN(glDeleteVertexArraysOES)(GL_TH_DP, GLsizei n, const GLuint *arrays)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteVertexArraysOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteVertexArraysOES))orig_func)
+           (n, arrays);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteVertexArraysOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->arrays = arrays;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteVertexArraysOES),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenVertexArraysOES(GLsizei n, GLuint *arrays);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenVertexArraysOES))(GLsizei n, GLuint *arrays);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenVertexArraysOES) orig_func;
+   GLsizei n;
+   GLuint *arrays;
+
+} GL_TH_ST(glGenVertexArraysOES);
+
+static void
+GL_TH_CB(glGenVertexArraysOES)(void *data)
+{
+   GL_TH_ST(glGenVertexArraysOES) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenVertexArraysOES))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->arrays);
+
+}
+
+void
+GL_TH_FN(glGenVertexArraysOES)(GL_TH_DP, GLsizei n, GLuint *arrays)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenVertexArraysOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenVertexArraysOES))orig_func)
+           (n, arrays);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenVertexArraysOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->arrays = arrays;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenVertexArraysOES),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsVertexArrayOES(GLuint array);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsVertexArrayOES))(GLuint array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsVertexArrayOES) orig_func;
+   GLboolean return_value;
+   GLuint array;
+
+} GL_TH_ST(glIsVertexArrayOES);
+
+static void
+GL_TH_CB(glIsVertexArrayOES)(void *data)
+{
+   GL_TH_ST(glIsVertexArrayOES) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsVertexArrayOES))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+GLboolean
+GL_TH_FN(glIsVertexArrayOES)(GL_TH_DP, GLuint array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsVertexArrayOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsVertexArrayOES))orig_func)
+           (array);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsVertexArrayOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsVertexArrayOES),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glCopyTextureLevelsAPPLE(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCopyTextureLevelsAPPLE))(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCopyTextureLevelsAPPLE) orig_func;
+   GLuint destinationTexture;
+   GLuint sourceTexture;
+   GLint sourceBaseLevel;
+   GLsizei sourceLevelCount;
+
+} GL_TH_ST(glCopyTextureLevelsAPPLE);
+
+static void
+GL_TH_CB(glCopyTextureLevelsAPPLE)(void *data)
+{
+   GL_TH_ST(glCopyTextureLevelsAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCopyTextureLevelsAPPLE))thread_data->orig_func)
+      (thread_data->destinationTexture,
+       thread_data->sourceTexture,
+       thread_data->sourceBaseLevel,
+       thread_data->sourceLevelCount);
+
+}
+
+void
+GL_TH_FN(glCopyTextureLevelsAPPLE)(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCopyTextureLevelsAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyTextureLevelsAPPLE))orig_func)
+           (destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyTextureLevelsAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->destinationTexture = destinationTexture;
+   thread_data->sourceTexture = sourceTexture;
+   thread_data->sourceBaseLevel = sourceBaseLevel;
+   thread_data->sourceLevelCount = sourceLevelCount;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyTextureLevelsAPPLE),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorageMultisampleAPPLE(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorageMultisampleAPPLE))(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorageMultisampleAPPLE) orig_func;
+   GLenum a;
+   GLsizei b;
+   GLenum c;
+   GLsizei d;
+   GLsizei e;
+
+} GL_TH_ST(glRenderbufferStorageMultisampleAPPLE);
+
+static void
+GL_TH_CB(glRenderbufferStorageMultisampleAPPLE)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorageMultisampleAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleAPPLE))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorageMultisampleAPPLE)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorageMultisampleAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleAPPLE))orig_func)
+           (a, b, c, d, e);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorageMultisampleAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorageMultisampleAPPLE),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glResolveMultisampleFramebufferAPPLE(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glResolveMultisampleFramebufferAPPLE))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glResolveMultisampleFramebufferAPPLE) orig_func;
+
+} GL_TH_ST(glResolveMultisampleFramebufferAPPLE);
+
+static void
+GL_TH_CB(glResolveMultisampleFramebufferAPPLE)(void *data)
+{
+   GL_TH_ST(glResolveMultisampleFramebufferAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glResolveMultisampleFramebufferAPPLE))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glResolveMultisampleFramebufferAPPLE)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glResolveMultisampleFramebufferAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glResolveMultisampleFramebufferAPPLE))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glResolveMultisampleFramebufferAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glResolveMultisampleFramebufferAPPLE),
+                              thread_mode);
+}
+
+/*
+ * GLsync
+ * glFenceSyncAPPLE(GLenum condition, GLbitfield flags);
+ */
+
+typedef GLsync(*GL_TH_FNTYPE(glFenceSyncAPPLE))(GLenum condition, GLbitfield flags);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFenceSyncAPPLE) orig_func;
+   GLsync return_value;
+   GLenum condition;
+   GLbitfield flags;
+
+} GL_TH_ST(glFenceSyncAPPLE);
+
+static void
+GL_TH_CB(glFenceSyncAPPLE)(void *data)
+{
+   GL_TH_ST(glFenceSyncAPPLE) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glFenceSyncAPPLE))thread_data->orig_func)
+      (thread_data->condition,
+       thread_data->flags);
+
+}
+
+GLsync
+GL_TH_FN(glFenceSyncAPPLE)(GL_TH_DP, GLenum condition, GLbitfield flags)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFenceSyncAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glFenceSyncAPPLE))orig_func)
+           (condition, flags);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFenceSyncAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->condition = condition;
+   thread_data->flags = flags;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFenceSyncAPPLE),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsSyncAPPLE(GLsync sync);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsSyncAPPLE))(GLsync sync);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsSyncAPPLE) orig_func;
+   GLboolean return_value;
+   GLsync sync;
+
+} GL_TH_ST(glIsSyncAPPLE);
+
+static void
+GL_TH_CB(glIsSyncAPPLE)(void *data)
+{
+   GL_TH_ST(glIsSyncAPPLE) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsSyncAPPLE))thread_data->orig_func)
+      (thread_data->sync);
+
+}
+
+GLboolean
+GL_TH_FN(glIsSyncAPPLE)(GL_TH_DP, GLsync sync)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsSyncAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsSyncAPPLE))orig_func)
+           (sync);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsSyncAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsSyncAPPLE),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glDeleteSyncAPPLE(GLsync sync);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteSyncAPPLE))(GLsync sync);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteSyncAPPLE) orig_func;
+   GLsync sync;
+
+} GL_TH_ST(glDeleteSyncAPPLE);
+
+static void
+GL_TH_CB(glDeleteSyncAPPLE)(void *data)
+{
+   GL_TH_ST(glDeleteSyncAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteSyncAPPLE))thread_data->orig_func)
+      (thread_data->sync);
+
+}
+
+void
+GL_TH_FN(glDeleteSyncAPPLE)(GL_TH_DP, GLsync sync)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteSyncAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteSyncAPPLE))orig_func)
+           (sync);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteSyncAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteSyncAPPLE),
+                              thread_mode);
+}
+
+/*
+ * GLenum
+ * glClientWaitSyncAPPLE(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+ */
+
+typedef GLenum(*GL_TH_FNTYPE(glClientWaitSyncAPPLE))(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClientWaitSyncAPPLE) orig_func;
+   GLenum return_value;
+   GLsync sync;
+   GLbitfield flags;
+   EvasGLuint64 timeout;
+
+} GL_TH_ST(glClientWaitSyncAPPLE);
+
+static void
+GL_TH_CB(glClientWaitSyncAPPLE)(void *data)
+{
+   GL_TH_ST(glClientWaitSyncAPPLE) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glClientWaitSyncAPPLE))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->flags,
+       thread_data->timeout);
+
+}
+
+GLenum
+GL_TH_FN(glClientWaitSyncAPPLE)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClientWaitSyncAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glClientWaitSyncAPPLE))orig_func)
+           (sync, flags, timeout);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClientWaitSyncAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->timeout = timeout;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClientWaitSyncAPPLE),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glWaitSyncAPPLE(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+ */
+
+typedef void(*GL_TH_FNTYPE(glWaitSyncAPPLE))(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glWaitSyncAPPLE) orig_func;
+   GLsync sync;
+   GLbitfield flags;
+   EvasGLuint64 timeout;
+
+} GL_TH_ST(glWaitSyncAPPLE);
+
+static void
+GL_TH_CB(glWaitSyncAPPLE)(void *data)
+{
+   GL_TH_ST(glWaitSyncAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glWaitSyncAPPLE))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->flags,
+       thread_data->timeout);
+
+}
+
+void
+GL_TH_FN(glWaitSyncAPPLE)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glWaitSyncAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glWaitSyncAPPLE))orig_func)
+           (sync, flags, timeout);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glWaitSyncAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->timeout = timeout;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glWaitSyncAPPLE),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetInteger64vAPPLE(GLenum pname, EvasGLint64 *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetInteger64vAPPLE))(GLenum pname, EvasGLint64 *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetInteger64vAPPLE) orig_func;
+   GLenum pname;
+   EvasGLint64 *params;
+
+} GL_TH_ST(glGetInteger64vAPPLE);
+
+static void
+GL_TH_CB(glGetInteger64vAPPLE)(void *data)
+{
+   GL_TH_ST(glGetInteger64vAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetInteger64vAPPLE))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetInteger64vAPPLE)(GL_TH_DP, GLenum pname, EvasGLint64 *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetInteger64vAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetInteger64vAPPLE))orig_func)
+           (pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetInteger64vAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetInteger64vAPPLE),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetSyncivAPPLE))(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetSyncivAPPLE) orig_func;
+   GLsync sync;
+   GLenum pname;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLint *values;
+
+} GL_TH_ST(glGetSyncivAPPLE);
+
+static void
+GL_TH_CB(glGetSyncivAPPLE)(void *data)
+{
+   GL_TH_ST(glGetSyncivAPPLE) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetSyncivAPPLE))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->pname,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glGetSyncivAPPLE)(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSyncivAPPLE) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetSyncivAPPLE))orig_func)
+           (sync, pname, bufSize, length, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSyncivAPPLE) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->pname = pname;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSyncivAPPLE),
+                              thread_mode);
+}
+
+/*
+ * void *
+ * glMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ */
+
+typedef void *(*GL_TH_FNTYPE(glMapBufferRangeEXT))(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMapBufferRangeEXT) orig_func;
+   void * return_value;
+   GLenum target;
+   GLintptr offset;
+   GLsizeiptr length;
+   GLbitfield access;
+
+} GL_TH_ST(glMapBufferRangeEXT);
+
+static void
+GL_TH_CB(glMapBufferRangeEXT)(void *data)
+{
+   GL_TH_ST(glMapBufferRangeEXT) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glMapBufferRangeEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->offset,
+       thread_data->length,
+       thread_data->access);
+
+}
+
+void *
+GL_TH_FN(glMapBufferRangeEXT)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMapBufferRangeEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glMapBufferRangeEXT))orig_func)
+           (target, offset, length, access);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMapBufferRangeEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->offset = offset;
+   thread_data->length = length;
+   thread_data->access = access;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMapBufferRangeEXT),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFlushMappedBufferRangeEXT))(GLenum target, GLintptr offset, GLsizeiptr length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFlushMappedBufferRangeEXT) orig_func;
+   GLenum target;
+   GLintptr offset;
+   GLsizeiptr length;
+
+} GL_TH_ST(glFlushMappedBufferRangeEXT);
+
+static void
+GL_TH_CB(glFlushMappedBufferRangeEXT)(void *data)
+{
+   GL_TH_ST(glFlushMappedBufferRangeEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFlushMappedBufferRangeEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->offset,
+       thread_data->length);
+
+}
+
+void
+GL_TH_FN(glFlushMappedBufferRangeEXT)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFlushMappedBufferRangeEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFlushMappedBufferRangeEXT))orig_func)
+           (target, offset, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFlushMappedBufferRangeEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->offset = offset;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFlushMappedBufferRangeEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorageMultisampleEXT(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorageMultisampleEXT))(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorageMultisampleEXT) orig_func;
+   GLenum a;
+   GLsizei b;
+   GLenum c;
+   GLsizei d;
+   GLsizei e;
+
+} GL_TH_ST(glRenderbufferStorageMultisampleEXT);
+
+static void
+GL_TH_CB(glRenderbufferStorageMultisampleEXT)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorageMultisampleEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleEXT))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorageMultisampleEXT)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorageMultisampleEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleEXT))orig_func)
+           (a, b, c, d, e);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorageMultisampleEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorageMultisampleEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture2DMultisampleEXT(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture2DMultisampleEXT))(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture2DMultisampleEXT) orig_func;
+   GLenum a;
+   GLenum b;
+   GLenum c;
+   GLuint d;
+   GLint e;
+   GLsizei f;
+
+} GL_TH_ST(glFramebufferTexture2DMultisampleEXT);
+
+static void
+GL_TH_CB(glFramebufferTexture2DMultisampleEXT)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture2DMultisampleEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture2DMultisampleEXT))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e,
+       thread_data->f);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture2DMultisampleEXT)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture2DMultisampleEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture2DMultisampleEXT))orig_func)
+           (a, b, c, d, e, f);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleEXT) *) + sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleEXT)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleEXT) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->f = f;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture2DMultisampleEXT),
+                              thread_mode);
+}
+
+/*
+ * GLenum
+ * glGetGraphicsResetStatusEXT(void);
+ */
+
+typedef GLenum(*GL_TH_FNTYPE(glGetGraphicsResetStatusEXT))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetGraphicsResetStatusEXT) orig_func;
+   GLenum return_value;
+
+} GL_TH_ST(glGetGraphicsResetStatusEXT);
+
+static void
+GL_TH_CB(glGetGraphicsResetStatusEXT)(void *data)
+{
+   GL_TH_ST(glGetGraphicsResetStatusEXT) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetGraphicsResetStatusEXT))thread_data->orig_func)
+      ();
+
+}
+
+GLenum
+GL_TH_FN(glGetGraphicsResetStatusEXT)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetGraphicsResetStatusEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetGraphicsResetStatusEXT))orig_func)
+           ();
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetGraphicsResetStatusEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetGraphicsResetStatusEXT),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glReadnPixelsEXT))(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glReadnPixelsEXT) orig_func;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+   GLenum format;
+   GLenum type;
+   GLsizei bufSize;
+   void *data;
+
+} GL_TH_ST(glReadnPixelsEXT);
+
+static void
+GL_TH_CB(glReadnPixelsEXT)(void *data)
+{
+   GL_TH_ST(glReadnPixelsEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glReadnPixelsEXT))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height,
+       thread_data->format,
+       thread_data->type,
+       thread_data->bufSize,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glReadnPixelsEXT)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glReadnPixelsEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glReadnPixelsEXT))orig_func)
+           (x, y, width, height, format, type, bufSize, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glReadnPixelsEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->bufSize = bufSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glReadnPixelsEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, float *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetnUniformfvEXT))(GLuint program, GLint location, GLsizei bufSize, float *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetnUniformfvEXT) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei bufSize;
+   float *params;
+
+} GL_TH_ST(glGetnUniformfvEXT);
+
+static void
+GL_TH_CB(glGetnUniformfvEXT)(void *data)
+{
+   GL_TH_ST(glGetnUniformfvEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetnUniformfvEXT))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->bufSize,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetnUniformfvEXT)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetnUniformfvEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetnUniformfvEXT))orig_func)
+           (program, location, bufSize, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetnUniformfvEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetnUniformfvEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetnUniformivEXT))(GLuint program, GLint location, GLsizei bufSize, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetnUniformivEXT) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei bufSize;
+   GLint *params;
+
+} GL_TH_ST(glGetnUniformivEXT);
+
+static void
+GL_TH_CB(glGetnUniformivEXT)(void *data)
+{
+   GL_TH_ST(glGetnUniformivEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetnUniformivEXT))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->bufSize,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetnUniformivEXT)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetnUniformivEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetnUniformivEXT))orig_func)
+           (program, location, bufSize, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetnUniformivEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetnUniformivEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexStorage1DEXT))(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexStorage1DEXT) orig_func;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+
+} GL_TH_ST(glTexStorage1DEXT);
+
+static void
+GL_TH_CB(glTexStorage1DEXT)(void *data)
+{
+   GL_TH_ST(glTexStorage1DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexStorage1DEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width);
+
+}
+
+void
+GL_TH_FN(glTexStorage1DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage1DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage1DEXT))orig_func)
+           (target, levels, internalformat, width);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage1DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage1DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexStorage2DEXT))(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexStorage2DEXT) orig_func;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glTexStorage2DEXT);
+
+static void
+GL_TH_CB(glTexStorage2DEXT)(void *data)
+{
+   GL_TH_ST(glTexStorage2DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexStorage2DEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glTexStorage2DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage2DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage2DEXT))orig_func)
+           (target, levels, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage2DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage2DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexStorage3DEXT))(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexStorage3DEXT) orig_func;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+
+} GL_TH_ST(glTexStorage3DEXT);
+
+static void
+GL_TH_CB(glTexStorage3DEXT)(void *data)
+{
+   GL_TH_ST(glTexStorage3DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexStorage3DEXT))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glTexStorage3DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage3DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage3DEXT))orig_func)
+           (target, levels, internalformat, width, height, depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage3DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage3DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTextureStorage1DEXT))(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTextureStorage1DEXT) orig_func;
+   GLuint texture;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+
+} GL_TH_ST(glTextureStorage1DEXT);
+
+static void
+GL_TH_CB(glTextureStorage1DEXT)(void *data)
+{
+   GL_TH_ST(glTextureStorage1DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTextureStorage1DEXT))thread_data->orig_func)
+      (thread_data->texture,
+       thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width);
+
+}
+
+void
+GL_TH_FN(glTextureStorage1DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTextureStorage1DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTextureStorage1DEXT))orig_func)
+           (texture, target, levels, internalformat, width);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTextureStorage1DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTextureStorage1DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTextureStorage2DEXT))(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTextureStorage2DEXT) orig_func;
+   GLuint texture;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glTextureStorage2DEXT);
+
+static void
+GL_TH_CB(glTextureStorage2DEXT)(void *data)
+{
+   GL_TH_ST(glTextureStorage2DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTextureStorage2DEXT))thread_data->orig_func)
+      (thread_data->texture,
+       thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glTextureStorage2DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTextureStorage2DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTextureStorage2DEXT))orig_func)
+           (texture, target, levels, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTextureStorage2DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTextureStorage2DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTextureStorage3DEXT))(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTextureStorage3DEXT) orig_func;
+   GLuint texture;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+
+} GL_TH_ST(glTextureStorage3DEXT);
+
+static void
+GL_TH_CB(glTextureStorage3DEXT)(void *data)
+{
+   GL_TH_ST(glTextureStorage3DEXT) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTextureStorage3DEXT))thread_data->orig_func)
+      (thread_data->texture,
+       thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glTextureStorage3DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTextureStorage3DEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTextureStorage3DEXT))orig_func)
+           (texture, target, levels, internalformat, width, height, depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTextureStorage3DEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->texture = texture;
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTextureStorage3DEXT),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanefIMG(GLenum a, const GLfloat * b);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanefIMG))(GLenum a, const GLfloat * b);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanefIMG) orig_func;
+   GLenum a;
+   const GLfloat * b;
+
+} GL_TH_ST(glClipPlanefIMG);
+
+static void
+GL_TH_CB(glClipPlanefIMG)(void *data)
+{
+   GL_TH_ST(glClipPlanefIMG) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanefIMG))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b);
+
+}
+
+void
+GL_TH_FN(glClipPlanefIMG)(GL_TH_DP, GLenum a, const GLfloat * b)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanefIMG) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanefIMG))orig_func)
+           (a, b);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanefIMG) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanefIMG),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClipPlanexIMG(GLenum a, const GLfixed * b);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClipPlanexIMG))(GLenum a, const GLfixed * b);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClipPlanexIMG) orig_func;
+   GLenum a;
+   const GLfixed * b;
+
+} GL_TH_ST(glClipPlanexIMG);
+
+static void
+GL_TH_CB(glClipPlanexIMG)(void *data)
+{
+   GL_TH_ST(glClipPlanexIMG) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClipPlanexIMG))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b);
+
+}
+
+void
+GL_TH_FN(glClipPlanexIMG)(GL_TH_DP, GLenum a, const GLfixed * b)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClipPlanexIMG) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClipPlanexIMG))orig_func)
+           (a, b);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClipPlanexIMG) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClipPlanexIMG),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorageMultisampleIMG(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorageMultisampleIMG))(GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorageMultisampleIMG) orig_func;
+   GLenum a;
+   GLsizei b;
+   GLenum c;
+   GLsizei d;
+   GLsizei e;
+
+} GL_TH_ST(glRenderbufferStorageMultisampleIMG);
+
+static void
+GL_TH_CB(glRenderbufferStorageMultisampleIMG)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorageMultisampleIMG) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleIMG))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorageMultisampleIMG)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorageMultisampleIMG) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorageMultisampleIMG))orig_func)
+           (a, b, c, d, e);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorageMultisampleIMG) *) + sizeof(GL_TH_ST(glRenderbufferStorageMultisampleIMG)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glRenderbufferStorageMultisampleIMG) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorageMultisampleIMG),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture2DMultisampleIMG(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture2DMultisampleIMG))(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture2DMultisampleIMG) orig_func;
+   GLenum a;
+   GLenum b;
+   GLenum c;
+   GLuint d;
+   GLint e;
+   GLsizei f;
+
+} GL_TH_ST(glFramebufferTexture2DMultisampleIMG);
+
+static void
+GL_TH_CB(glFramebufferTexture2DMultisampleIMG)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture2DMultisampleIMG) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture2DMultisampleIMG))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e,
+       thread_data->f);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture2DMultisampleIMG)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture2DMultisampleIMG) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture2DMultisampleIMG))orig_func)
+           (a, b, c, d, e, f);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleIMG) *) + sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleIMG)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferTexture2DMultisampleIMG) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->f = f;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture2DMultisampleIMG),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glActivateTile(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+ */
+
+typedef void(*GL_TH_FNTYPE(glActivateTile))(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glActivateTile) orig_func;
+   GLuint a;
+   GLuint b;
+   GLuint c;
+   GLuint d;
+   GLuint e;
+
+} GL_TH_ST(glActivateTile);
+
+static void
+GL_TH_CB(glActivateTile)(void *data)
+{
+   GL_TH_ST(glActivateTile) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glActivateTile))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e);
+
+}
+
+void
+GL_TH_FN(glActivateTile)(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glActivateTile) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glActivateTile))orig_func)
+           (a, b, c, d, e);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glActivateTile) *) + sizeof(GL_TH_ST(glActivateTile)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glActivateTile) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glActivateTile),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glStartTilingQCOM))(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glStartTilingQCOM) orig_func;
+   GLuint x;
+   GLuint y;
+   GLuint width;
+   GLuint height;
+   GLbitfield preserveMask;
+
+} GL_TH_ST(glStartTilingQCOM);
+
+static void
+GL_TH_CB(glStartTilingQCOM)(void *data)
+{
+   GL_TH_ST(glStartTilingQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glStartTilingQCOM))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height,
+       thread_data->preserveMask);
+
+}
+
+void
+GL_TH_FN(glStartTilingQCOM)(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glStartTilingQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glStartTilingQCOM))orig_func)
+           (x, y, width, height, preserveMask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glStartTilingQCOM) *) + sizeof(GL_TH_ST(glStartTilingQCOM)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glStartTilingQCOM) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->preserveMask = preserveMask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glStartTilingQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEndTilingQCOM(GLbitfield preserveMask);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEndTilingQCOM))(GLbitfield preserveMask);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEndTilingQCOM) orig_func;
+   GLbitfield preserveMask;
+
+} GL_TH_ST(glEndTilingQCOM);
+
+static void
+GL_TH_CB(glEndTilingQCOM)(void *data)
+{
+   GL_TH_ST(glEndTilingQCOM) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEndTilingQCOM))thread_data->orig_func)
+      (thread_data->preserveMask);
+
+}
+
+void
+GL_TH_FN(glEndTilingQCOM)(GL_TH_DP, GLbitfield preserveMask)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEndTilingQCOM) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEndTilingQCOM))orig_func)
+           (preserveMask);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEndTilingQCOM) *) + sizeof(GL_TH_ST(glEndTilingQCOM)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glEndTilingQCOM) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->preserveMask = preserveMask;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEndTilingQCOM),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferTexture2DMultisample(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture2DMultisample))(GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTexture2DMultisample) orig_func;
+   GLenum a;
+   GLenum b;
+   GLenum c;
+   GLuint d;
+   GLint e;
+   GLsizei f;
+
+} GL_TH_ST(glFramebufferTexture2DMultisample);
+
+static void
+GL_TH_CB(glFramebufferTexture2DMultisample)(void *data)
+{
+   GL_TH_ST(glFramebufferTexture2DMultisample) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTexture2DMultisample))thread_data->orig_func)
+      (thread_data->a,
+       thread_data->b,
+       thread_data->c,
+       thread_data->d,
+       thread_data->e,
+       thread_data->f);
+
+}
+
+void
+GL_TH_FN(glFramebufferTexture2DMultisample)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTexture2DMultisample) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture2DMultisample))orig_func)
+           (a, b, c, d, e, f);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture2DMultisample) *) + sizeof(GL_TH_ST(glFramebufferTexture2DMultisample)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glFramebufferTexture2DMultisample) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->a = a;
+   thread_data->b = b;
+   thread_data->c = c;
+   thread_data->d = d;
+   thread_data->e = e;
+   thread_data->f = f;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture2DMultisample),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBeginQuery(GLenum target, GLuint id);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBeginQuery))(GLenum target, GLuint id);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBeginQuery) orig_func;
+   GLenum target;
+   GLuint id;
+
+} GL_TH_ST(glBeginQuery);
+
+static void
+GL_TH_CB(glBeginQuery)(void *data)
+{
+   GL_TH_ST(glBeginQuery) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBeginQuery))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->id);
+
+}
+
+void
+GL_TH_FN(glBeginQuery)(GL_TH_DP, GLenum target, GLuint id)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBeginQuery) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBeginQuery))orig_func)
+           (target, id);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBeginQuery) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->id = id;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBeginQuery),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBeginTransformFeedback(GLenum primitiveMode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBeginTransformFeedback))(GLenum primitiveMode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBeginTransformFeedback) orig_func;
+   GLenum primitiveMode;
+
+} GL_TH_ST(glBeginTransformFeedback);
+
+static void
+GL_TH_CB(glBeginTransformFeedback)(void *data)
+{
+   GL_TH_ST(glBeginTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBeginTransformFeedback))thread_data->orig_func)
+      (thread_data->primitiveMode);
+
+}
+
+void
+GL_TH_FN(glBeginTransformFeedback)(GL_TH_DP, GLenum primitiveMode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBeginTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBeginTransformFeedback))orig_func)
+           (primitiveMode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBeginTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->primitiveMode = primitiveMode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBeginTransformFeedback),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindBufferBase))(GLenum target, GLuint index, GLuint buffer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindBufferBase) orig_func;
+   GLenum target;
+   GLuint index;
+   GLuint buffer;
+
+} GL_TH_ST(glBindBufferBase);
+
+static void
+GL_TH_CB(glBindBufferBase)(void *data)
+{
+   GL_TH_ST(glBindBufferBase) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindBufferBase))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index,
+       thread_data->buffer);
+
+}
+
+void
+GL_TH_FN(glBindBufferBase)(GL_TH_DP, GLenum target, GLuint index, GLuint buffer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindBufferBase) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindBufferBase))orig_func)
+           (target, index, buffer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindBufferBase) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->buffer = buffer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindBufferBase),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindBufferRange))(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindBufferRange) orig_func;
+   GLenum target;
+   GLuint index;
+   GLuint buffer;
+   GLintptr offset;
+   GLsizeiptr size;
+
+} GL_TH_ST(glBindBufferRange);
+
+static void
+GL_TH_CB(glBindBufferRange)(void *data)
+{
+   GL_TH_ST(glBindBufferRange) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindBufferRange))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index,
+       thread_data->buffer,
+       thread_data->offset,
+       thread_data->size);
+
+}
+
+void
+GL_TH_FN(glBindBufferRange)(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindBufferRange) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindBufferRange))orig_func)
+           (target, index, buffer, offset, size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindBufferRange) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->buffer = buffer;
+   thread_data->offset = offset;
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindBufferRange),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindSampler(GLuint unit, GLuint sampler);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindSampler))(GLuint unit, GLuint sampler);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindSampler) orig_func;
+   GLuint unit;
+   GLuint sampler;
+
+} GL_TH_ST(glBindSampler);
+
+static void
+GL_TH_CB(glBindSampler)(void *data)
+{
+   GL_TH_ST(glBindSampler) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindSampler))thread_data->orig_func)
+      (thread_data->unit,
+       thread_data->sampler);
+
+}
+
+void
+GL_TH_FN(glBindSampler)(GL_TH_DP, GLuint unit, GLuint sampler)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindSampler) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindSampler))orig_func)
+           (unit, sampler);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindSampler) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->unit = unit;
+   thread_data->sampler = sampler;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindSampler),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindTransformFeedback(GLenum target, GLuint id);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindTransformFeedback))(GLenum target, GLuint id);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindTransformFeedback) orig_func;
+   GLenum target;
+   GLuint id;
+
+} GL_TH_ST(glBindTransformFeedback);
+
+static void
+GL_TH_CB(glBindTransformFeedback)(void *data)
+{
+   GL_TH_ST(glBindTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindTransformFeedback))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->id);
+
+}
+
+void
+GL_TH_FN(glBindTransformFeedback)(GL_TH_DP, GLenum target, GLuint id)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindTransformFeedback))orig_func)
+           (target, id);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->id = id;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindTransformFeedback),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBindVertexArray(GLuint array);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindVertexArray))(GLuint array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindVertexArray) orig_func;
+   GLuint array;
+
+} GL_TH_ST(glBindVertexArray);
+
+static void
+GL_TH_CB(glBindVertexArray)(void *data)
+{
+   GL_TH_ST(glBindVertexArray) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindVertexArray))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+void
+GL_TH_FN(glBindVertexArray)(GL_TH_DP, GLuint array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindVertexArray) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindVertexArray))orig_func)
+           (array);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindVertexArray) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindVertexArray),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBlitFramebuffer))(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBlitFramebuffer) orig_func;
+   GLint srcX0;
+   GLint srcY0;
+   GLint srcX1;
+   GLint srcY1;
+   GLint dstX0;
+   GLint dstY0;
+   GLint dstX1;
+   GLint dstY1;
+   GLbitfield mask;
+   GLenum filter;
+
+} GL_TH_ST(glBlitFramebuffer);
+
+static void
+GL_TH_CB(glBlitFramebuffer)(void *data)
+{
+   GL_TH_ST(glBlitFramebuffer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlitFramebuffer))thread_data->orig_func)
+      (thread_data->srcX0,
+       thread_data->srcY0,
+       thread_data->srcX1,
+       thread_data->srcY1,
+       thread_data->dstX0,
+       thread_data->dstY0,
+       thread_data->dstX1,
+       thread_data->dstY1,
+       thread_data->mask,
+       thread_data->filter);
+
+}
+
+void
+GL_TH_FN(glBlitFramebuffer)(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlitFramebuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlitFramebuffer))orig_func)
+           (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlitFramebuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->srcX0 = srcX0;
+   thread_data->srcY0 = srcY0;
+   thread_data->srcX1 = srcX1;
+   thread_data->srcY1 = srcY1;
+   thread_data->dstX0 = dstX0;
+   thread_data->dstY0 = dstY0;
+   thread_data->dstX1 = dstX1;
+   thread_data->dstY1 = dstY1;
+   thread_data->mask = mask;
+   thread_data->filter = filter;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlitFramebuffer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearBufferfi(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearBufferfi))(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearBufferfi) orig_func;
+   GLenum buffer;
+   GLint drawBuffer;
+   GLfloat depth;
+   GLint stencil;
+
+} GL_TH_ST(glClearBufferfi);
+
+static void
+GL_TH_CB(glClearBufferfi)(void *data)
+{
+   GL_TH_ST(glClearBufferfi) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearBufferfi))thread_data->orig_func)
+      (thread_data->buffer,
+       thread_data->drawBuffer,
+       thread_data->depth,
+       thread_data->stencil);
+
+}
+
+void
+GL_TH_FN(glClearBufferfi)(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearBufferfi) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearBufferfi))orig_func)
+           (buffer, drawBuffer, depth, stencil);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearBufferfi) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffer = buffer;
+   thread_data->drawBuffer = drawBuffer;
+   thread_data->depth = depth;
+   thread_data->stencil = stencil;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearBufferfi),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearBufferfv(GLenum buffer, GLint drawBuffer, const GLfloat * value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearBufferfv))(GLenum buffer, GLint drawBuffer, const GLfloat * value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearBufferfv) orig_func;
+   GLenum buffer;
+   GLint drawBuffer;
+   const GLfloat * value;
+
+} GL_TH_ST(glClearBufferfv);
+
+static void
+GL_TH_CB(glClearBufferfv)(void *data)
+{
+   GL_TH_ST(glClearBufferfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearBufferfv))thread_data->orig_func)
+      (thread_data->buffer,
+       thread_data->drawBuffer,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glClearBufferfv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearBufferfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearBufferfv))orig_func)
+           (buffer, drawBuffer, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearBufferfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffer = buffer;
+   thread_data->drawBuffer = drawBuffer;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearBufferfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearBufferiv(GLenum buffer, GLint drawBuffer, const GLint * value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearBufferiv))(GLenum buffer, GLint drawBuffer, const GLint * value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearBufferiv) orig_func;
+   GLenum buffer;
+   GLint drawBuffer;
+   const GLint * value;
+
+} GL_TH_ST(glClearBufferiv);
+
+static void
+GL_TH_CB(glClearBufferiv)(void *data)
+{
+   GL_TH_ST(glClearBufferiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearBufferiv))thread_data->orig_func)
+      (thread_data->buffer,
+       thread_data->drawBuffer,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glClearBufferiv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearBufferiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearBufferiv))orig_func)
+           (buffer, drawBuffer, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearBufferiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffer = buffer;
+   thread_data->drawBuffer = drawBuffer;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearBufferiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glClearBufferuiv(GLenum buffer, GLint drawBuffer, const GLuint * value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glClearBufferuiv))(GLenum buffer, GLint drawBuffer, const GLuint * value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClearBufferuiv) orig_func;
+   GLenum buffer;
+   GLint drawBuffer;
+   const GLuint * value;
+
+} GL_TH_ST(glClearBufferuiv);
+
+static void
+GL_TH_CB(glClearBufferuiv)(void *data)
+{
+   GL_TH_ST(glClearBufferuiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glClearBufferuiv))thread_data->orig_func)
+      (thread_data->buffer,
+       thread_data->drawBuffer,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glClearBufferuiv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClearBufferuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glClearBufferuiv))orig_func)
+           (buffer, drawBuffer, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClearBufferuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buffer = buffer;
+   thread_data->drawBuffer = drawBuffer;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClearBufferuiv),
+                              thread_mode);
+}
+
+/*
+ * GLenum
+ * glClientWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+ */
+
+typedef GLenum(*GL_TH_FNTYPE(glClientWaitSync))(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glClientWaitSync) orig_func;
+   GLenum return_value;
+   GLsync sync;
+   GLbitfield flags;
+   EvasGLuint64 timeout;
+
+} GL_TH_ST(glClientWaitSync);
+
+static void
+GL_TH_CB(glClientWaitSync)(void *data)
+{
+   GL_TH_ST(glClientWaitSync) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glClientWaitSync))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->flags,
+       thread_data->timeout);
+
+}
+
+GLenum
+GL_TH_FN(glClientWaitSync)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glClientWaitSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glClientWaitSync))orig_func)
+           (sync, flags, timeout);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glClientWaitSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->timeout = timeout;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glClientWaitSync),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCompressedTexImage3D))(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCompressedTexImage3D) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLint border;
+   GLsizei imageSize;
+   const GLvoid * data;
+
+} GL_TH_ST(glCompressedTexImage3D);
+
+static void
+GL_TH_CB(glCompressedTexImage3D)(void *data)
+{
+   GL_TH_ST(glCompressedTexImage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCompressedTexImage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->border,
+       thread_data->imageSize,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glCompressedTexImage3D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexImage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCompressedTexImage3D))orig_func)
+           (target, level, internalformat, width, height, depth, border, imageSize, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexImage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->border = border;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexImage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCompressedTexSubImage3D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCompressedTexSubImage3D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLenum format;
+   GLsizei imageSize;
+   const GLvoid * data;
+
+} GL_TH_ST(glCompressedTexSubImage3D);
+
+static void
+GL_TH_CB(glCompressedTexSubImage3D)(void *data)
+{
+   GL_TH_ST(glCompressedTexSubImage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCompressedTexSubImage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->format,
+       thread_data->imageSize,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glCompressedTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCompressedTexSubImage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCompressedTexSubImage3D))orig_func)
+           (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCompressedTexSubImage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->format = format;
+   thread_data->imageSize = imageSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCompressedTexSubImage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCopyBufferSubData))(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCopyBufferSubData) orig_func;
+   GLenum readtarget;
+   GLenum writetarget;
+   GLintptr readoffset;
+   GLintptr writeoffset;
+   GLsizeiptr size;
+
+} GL_TH_ST(glCopyBufferSubData);
+
+static void
+GL_TH_CB(glCopyBufferSubData)(void *data)
+{
+   GL_TH_ST(glCopyBufferSubData) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCopyBufferSubData))thread_data->orig_func)
+      (thread_data->readtarget,
+       thread_data->writetarget,
+       thread_data->readoffset,
+       thread_data->writeoffset,
+       thread_data->size);
+
+}
+
+void
+GL_TH_FN(glCopyBufferSubData)(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCopyBufferSubData) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyBufferSubData))orig_func)
+           (readtarget, writetarget, readoffset, writeoffset, size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyBufferSubData) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->readtarget = readtarget;
+   thread_data->writetarget = writetarget;
+   thread_data->readoffset = readoffset;
+   thread_data->writeoffset = writeoffset;
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyBufferSubData),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glCopyTexSubImage3D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCopyTexSubImage3D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glCopyTexSubImage3D);
+
+static void
+GL_TH_CB(glCopyTexSubImage3D)(void *data)
+{
+   GL_TH_ST(glCopyTexSubImage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glCopyTexSubImage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glCopyTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCopyTexSubImage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyTexSubImage3D))orig_func)
+           (target, level, xoffset, yoffset, zoffset, x, y, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyTexSubImage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyTexSubImage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteQueries(GLsizei n, const GLuint * ids);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteQueries))(GLsizei n, const GLuint * ids);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteQueries) orig_func;
+   GLsizei n;
+   const GLuint * ids;
+
+} GL_TH_ST(glDeleteQueries);
+
+static void
+GL_TH_CB(glDeleteQueries)(void *data)
+{
+   GL_TH_ST(glDeleteQueries) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteQueries))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->ids);
+
+}
+
+void
+GL_TH_FN(glDeleteQueries)(GL_TH_DP, GLsizei n, const GLuint * ids)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteQueries) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteQueries))orig_func)
+           (n, ids);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteQueries) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->ids = ids;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteQueries),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteSamplers(GLsizei n, const GLuint * samplers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteSamplers))(GLsizei n, const GLuint * samplers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteSamplers) orig_func;
+   GLsizei n;
+   const GLuint * samplers;
+
+} GL_TH_ST(glDeleteSamplers);
+
+static void
+GL_TH_CB(glDeleteSamplers)(void *data)
+{
+   GL_TH_ST(glDeleteSamplers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteSamplers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->samplers);
+
+}
+
+void
+GL_TH_FN(glDeleteSamplers)(GL_TH_DP, GLsizei n, const GLuint * samplers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteSamplers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteSamplers))orig_func)
+           (n, samplers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteSamplers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->samplers = samplers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteSamplers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteSync(GLsync sync);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteSync))(GLsync sync);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteSync) orig_func;
+   GLsync sync;
+
+} GL_TH_ST(glDeleteSync);
+
+static void
+GL_TH_CB(glDeleteSync)(void *data)
+{
+   GL_TH_ST(glDeleteSync) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteSync))thread_data->orig_func)
+      (thread_data->sync);
+
+}
+
+void
+GL_TH_FN(glDeleteSync)(GL_TH_DP, GLsync sync)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteSync))orig_func)
+           (sync);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteSync),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteTransformFeedbacks))(GLsizei n, const GLuint *ids);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteTransformFeedbacks) orig_func;
+   GLsizei n;
+   const GLuint *ids;
+
+} GL_TH_ST(glDeleteTransformFeedbacks);
+
+static void
+GL_TH_CB(glDeleteTransformFeedbacks)(void *data)
+{
+   GL_TH_ST(glDeleteTransformFeedbacks) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteTransformFeedbacks))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->ids);
+
+}
+
+void
+GL_TH_FN(glDeleteTransformFeedbacks)(GL_TH_DP, GLsizei n, const GLuint *ids)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteTransformFeedbacks) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteTransformFeedbacks))orig_func)
+           (n, ids);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteTransformFeedbacks) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->ids = ids;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteTransformFeedbacks),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteVertexArrays(GLsizei n, const GLuint *arrays);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteVertexArrays))(GLsizei n, const GLuint *arrays);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteVertexArrays) orig_func;
+   GLsizei n;
+   const GLuint *arrays;
+
+} GL_TH_ST(glDeleteVertexArrays);
+
+static void
+GL_TH_CB(glDeleteVertexArrays)(void *data)
+{
+   GL_TH_ST(glDeleteVertexArrays) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteVertexArrays))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->arrays);
+
+}
+
+void
+GL_TH_FN(glDeleteVertexArrays)(GL_TH_DP, GLsizei n, const GLuint *arrays)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteVertexArrays) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteVertexArrays))orig_func)
+           (n, arrays);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteVertexArrays) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->arrays = arrays;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteVertexArrays),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawArraysInstanced))(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawArraysInstanced) orig_func;
+   GLenum mode;
+   GLint first;
+   GLsizei count;
+   GLsizei primcount;
+
+} GL_TH_ST(glDrawArraysInstanced);
+
+static void
+GL_TH_CB(glDrawArraysInstanced)(void *data)
+{
+   GL_TH_ST(glDrawArraysInstanced) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawArraysInstanced))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->first,
+       thread_data->count,
+       thread_data->primcount);
+
+}
+
+void
+GL_TH_FN(glDrawArraysInstanced)(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawArraysInstanced) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawArraysInstanced))orig_func)
+           (mode, first, count, primcount);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawArraysInstanced) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->first = first;
+   thread_data->count = count;
+   thread_data->primcount = primcount;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawArraysInstanced),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawBuffers(GLsizei n, const GLenum *bufs);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawBuffers))(GLsizei n, const GLenum *bufs);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawBuffers) orig_func;
+   GLsizei n;
+   const GLenum *bufs;
+
+} GL_TH_ST(glDrawBuffers);
+
+static void
+GL_TH_CB(glDrawBuffers)(void *data)
+{
+   GL_TH_ST(glDrawBuffers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawBuffers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->bufs);
+
+}
+
+void
+GL_TH_FN(glDrawBuffers)(GL_TH_DP, GLsizei n, const GLenum *bufs)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawBuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawBuffers))orig_func)
+           (n, bufs);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawBuffers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->bufs = bufs;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawBuffers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawElementsInstanced))(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawElementsInstanced) orig_func;
+   GLenum mode;
+   GLsizei count;
+   GLenum type;
+   const void * indices;
+   GLsizei primcount;
+
+} GL_TH_ST(glDrawElementsInstanced);
+
+static void
+GL_TH_CB(glDrawElementsInstanced)(void *data)
+{
+   GL_TH_ST(glDrawElementsInstanced) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawElementsInstanced))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices,
+       thread_data->primcount);
+
+}
+
+void
+GL_TH_FN(glDrawElementsInstanced)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawElementsInstanced) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawElementsInstanced))orig_func)
+           (mode, count, type, indices, primcount);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawElementsInstanced) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->primcount = primcount;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawElementsInstanced),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawRangeElements))(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawRangeElements) orig_func;
+   GLenum mode;
+   GLuint start;
+   GLuint end;
+   GLsizei count;
+   GLenum type;
+   const GLvoid * indices;
+
+} GL_TH_ST(glDrawRangeElements);
+
+static void
+GL_TH_CB(glDrawRangeElements)(void *data)
+{
+   GL_TH_ST(glDrawRangeElements) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawRangeElements))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->start,
+       thread_data->end,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices);
+
+}
+
+void
+GL_TH_FN(glDrawRangeElements)(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawRangeElements) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawRangeElements))orig_func)
+           (mode, start, end, count, type, indices);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawRangeElements) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->start = start;
+   thread_data->end = end;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawRangeElements),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEndQuery(GLenum target);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEndQuery))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEndQuery) orig_func;
+   GLenum target;
+
+} GL_TH_ST(glEndQuery);
+
+static void
+GL_TH_CB(glEndQuery)(void *data)
+{
+   GL_TH_ST(glEndQuery) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEndQuery))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+void
+GL_TH_FN(glEndQuery)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEndQuery) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEndQuery))orig_func)
+           (target);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEndQuery) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEndQuery),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glEndTransformFeedback(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glEndTransformFeedback))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glEndTransformFeedback) orig_func;
+
+} GL_TH_ST(glEndTransformFeedback);
+
+static void
+GL_TH_CB(glEndTransformFeedback)(void *data)
+{
+   GL_TH_ST(glEndTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glEndTransformFeedback))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glEndTransformFeedback)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEndTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEndTransformFeedback))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEndTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEndTransformFeedback),
+                              thread_mode);
+}
+
+/*
+ * GLsync
+ * glFenceSync(GLenum condition, GLbitfield flags);
+ */
+
+typedef GLsync(*GL_TH_FNTYPE(glFenceSync))(GLenum condition, GLbitfield flags);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFenceSync) orig_func;
+   GLsync return_value;
+   GLenum condition;
+   GLbitfield flags;
+
+} GL_TH_ST(glFenceSync);
+
+static void
+GL_TH_CB(glFenceSync)(void *data)
+{
+   GL_TH_ST(glFenceSync) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glFenceSync))thread_data->orig_func)
+      (thread_data->condition,
+       thread_data->flags);
+
+}
+
+GLsync
+GL_TH_FN(glFenceSync)(GL_TH_DP, GLenum condition, GLbitfield flags)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFenceSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glFenceSync))orig_func)
+           (condition, flags);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFenceSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->condition = condition;
+   thread_data->flags = flags;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFenceSync),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLsync
+ * glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
+ */
+
+typedef GLsync(*GL_TH_FNTYPE(glFlushMappedBufferRange))(GLenum target, GLintptr offset, GLsizeiptr length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFlushMappedBufferRange) orig_func;
+   GLsync return_value;
+   GLenum target;
+   GLintptr offset;
+   GLsizeiptr length;
+
+} GL_TH_ST(glFlushMappedBufferRange);
+
+static void
+GL_TH_CB(glFlushMappedBufferRange)(void *data)
+{
+   GL_TH_ST(glFlushMappedBufferRange) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glFlushMappedBufferRange))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->offset,
+       thread_data->length);
+
+}
+
+GLsync
+GL_TH_FN(glFlushMappedBufferRange)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFlushMappedBufferRange) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glFlushMappedBufferRange))orig_func)
+           (target, offset, length);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFlushMappedBufferRange) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->offset = offset;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFlushMappedBufferRange),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferTextureLayer))(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferTextureLayer) orig_func;
+   GLenum target;
+   GLenum attachment;
+   GLuint texture;
+   GLint level;
+   GLint layer;
+
+} GL_TH_ST(glFramebufferTextureLayer);
+
+static void
+GL_TH_CB(glFramebufferTextureLayer)(void *data)
+{
+   GL_TH_ST(glFramebufferTextureLayer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferTextureLayer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->texture,
+       thread_data->level,
+       thread_data->layer);
+
+}
+
+void
+GL_TH_FN(glFramebufferTextureLayer)(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferTextureLayer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTextureLayer))orig_func)
+           (target, attachment, texture, level, layer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTextureLayer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->attachment = attachment;
+   thread_data->texture = texture;
+   thread_data->level = level;
+   thread_data->layer = layer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTextureLayer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenQueries(GLsizei n, GLuint * ids);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenQueries))(GLsizei n, GLuint * ids);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenQueries) orig_func;
+   GLsizei n;
+   GLuint * ids;
+
+} GL_TH_ST(glGenQueries);
+
+static void
+GL_TH_CB(glGenQueries)(void *data)
+{
+   GL_TH_ST(glGenQueries) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenQueries))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->ids);
+
+}
+
+void
+GL_TH_FN(glGenQueries)(GL_TH_DP, GLsizei n, GLuint * ids)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenQueries) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenQueries))orig_func)
+           (n, ids);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenQueries) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->ids = ids;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenQueries),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenSamplers(GLsizei n, GLuint *samplers);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenSamplers))(GLsizei n, GLuint *samplers);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenSamplers) orig_func;
+   GLsizei n;
+   GLuint *samplers;
+
+} GL_TH_ST(glGenSamplers);
+
+static void
+GL_TH_CB(glGenSamplers)(void *data)
+{
+   GL_TH_ST(glGenSamplers) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenSamplers))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->samplers);
+
+}
+
+void
+GL_TH_FN(glGenSamplers)(GL_TH_DP, GLsizei n, GLuint *samplers)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenSamplers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenSamplers))orig_func)
+           (n, samplers);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenSamplers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->samplers = samplers;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenSamplers),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenTransformFeedbacks(GLsizei n, GLuint *ids);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenTransformFeedbacks))(GLsizei n, GLuint *ids);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenTransformFeedbacks) orig_func;
+   GLsizei n;
+   GLuint *ids;
+
+} GL_TH_ST(glGenTransformFeedbacks);
+
+static void
+GL_TH_CB(glGenTransformFeedbacks)(void *data)
+{
+   GL_TH_ST(glGenTransformFeedbacks) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenTransformFeedbacks))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->ids);
+
+}
+
+void
+GL_TH_FN(glGenTransformFeedbacks)(GL_TH_DP, GLsizei n, GLuint *ids)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenTransformFeedbacks) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenTransformFeedbacks))orig_func)
+           (n, ids);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenTransformFeedbacks) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->ids = ids;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenTransformFeedbacks),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenVertexArrays(GLsizei n, GLuint *arrays);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenVertexArrays))(GLsizei n, GLuint *arrays);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenVertexArrays) orig_func;
+   GLsizei n;
+   GLuint *arrays;
+
+} GL_TH_ST(glGenVertexArrays);
+
+static void
+GL_TH_CB(glGenVertexArrays)(void *data)
+{
+   GL_TH_ST(glGenVertexArrays) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenVertexArrays))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->arrays);
+
+}
+
+void
+GL_TH_FN(glGenVertexArrays)(GL_TH_DP, GLsizei n, GLuint *arrays)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenVertexArrays) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenVertexArrays))orig_func)
+           (n, arrays);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenVertexArrays) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->arrays = arrays;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenVertexArrays),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetActiveUniformBlockiv))(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetActiveUniformBlockiv) orig_func;
+   GLuint program;
+   GLuint uniformBlockIndex;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetActiveUniformBlockiv);
+
+static void
+GL_TH_CB(glGetActiveUniformBlockiv)(void *data)
+{
+   GL_TH_ST(glGetActiveUniformBlockiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetActiveUniformBlockiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformBlockIndex,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetActiveUniformBlockiv)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetActiveUniformBlockiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetActiveUniformBlockiv))orig_func)
+           (program, uniformBlockIndex, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetActiveUniformBlockiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformBlockIndex = uniformBlockIndex;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetActiveUniformBlockiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetActiveUniformBlockName))(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetActiveUniformBlockName) orig_func;
+   GLuint program;
+   GLuint uniformBlockIndex;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLchar *uniformBlockName;
+
+} GL_TH_ST(glGetActiveUniformBlockName);
+
+static void
+GL_TH_CB(glGetActiveUniformBlockName)(void *data)
+{
+   GL_TH_ST(glGetActiveUniformBlockName) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetActiveUniformBlockName))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformBlockIndex,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->uniformBlockName);
+
+}
+
+void
+GL_TH_FN(glGetActiveUniformBlockName)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetActiveUniformBlockName) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetActiveUniformBlockName))orig_func)
+           (program, uniformBlockIndex, bufSize, length, uniformBlockName);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetActiveUniformBlockName) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformBlockIndex = uniformBlockIndex;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->uniformBlockName = uniformBlockName;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetActiveUniformBlockName),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetActiveUniformsiv))(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetActiveUniformsiv) orig_func;
+   GLuint program;
+   GLsizei uniformCount;
+   const GLuint *uniformIndices;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetActiveUniformsiv);
+
+static void
+GL_TH_CB(glGetActiveUniformsiv)(void *data)
+{
+   GL_TH_ST(glGetActiveUniformsiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetActiveUniformsiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformCount,
+       thread_data->uniformIndices,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetActiveUniformsiv)(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetActiveUniformsiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetActiveUniformsiv))orig_func)
+           (program, uniformCount, uniformIndices, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetActiveUniformsiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformCount = uniformCount;
+   thread_data->uniformIndices = uniformIndices;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetActiveUniformsiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetBufferParameteri64v(GLenum target, GLenum value, EvasGLint64 * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetBufferParameteri64v))(GLenum target, GLenum value, EvasGLint64 * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetBufferParameteri64v) orig_func;
+   GLenum target;
+   GLenum value;
+   EvasGLint64 * data;
+
+} GL_TH_ST(glGetBufferParameteri64v);
+
+static void
+GL_TH_CB(glGetBufferParameteri64v)(void *data)
+{
+   GL_TH_ST(glGetBufferParameteri64v) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetBufferParameteri64v))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->value,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glGetBufferParameteri64v)(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetBufferParameteri64v) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBufferParameteri64v))orig_func)
+           (target, value, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBufferParameteri64v) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->value = value;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBufferParameteri64v),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetBufferPointerv(GLenum target, GLenum pname, GLvoid ** params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetBufferPointerv))(GLenum target, GLenum pname, GLvoid ** params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetBufferPointerv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLvoid ** params;
+
+} GL_TH_ST(glGetBufferPointerv);
+
+static void
+GL_TH_CB(glGetBufferPointerv)(void *data)
+{
+   GL_TH_ST(glGetBufferPointerv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetBufferPointerv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetBufferPointerv)(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetBufferPointerv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBufferPointerv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBufferPointerv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBufferPointerv),
+                              thread_mode);
+}
+
+/*
+ * GLint
+ * glGetFragDataLocation(GLuint program, const char * name);
+ */
+
+typedef GLint(*GL_TH_FNTYPE(glGetFragDataLocation))(GLuint program, const char * name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFragDataLocation) orig_func;
+   GLint return_value;
+   GLuint program;
+   const char * name;
+
+} GL_TH_ST(glGetFragDataLocation);
+
+static void
+GL_TH_CB(glGetFragDataLocation)(void *data)
+{
+   GL_TH_ST(glGetFragDataLocation) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetFragDataLocation))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->name);
+
+}
+
+GLint
+GL_TH_FN(glGetFragDataLocation)(GL_TH_DP, GLuint program, const char * name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFragDataLocation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetFragDataLocation))orig_func)
+           (program, name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFragDataLocation) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFragDataLocation),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetInteger64i_v(GLenum target, GLuint index, EvasGLint64 * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetInteger64i_v))(GLenum target, GLuint index, EvasGLint64 * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetInteger64i_v) orig_func;
+   GLenum target;
+   GLuint index;
+   EvasGLint64 * data;
+
+} GL_TH_ST(glGetInteger64i_v);
+
+static void
+GL_TH_CB(glGetInteger64i_v)(void *data)
+{
+   GL_TH_ST(glGetInteger64i_v) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetInteger64i_v))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glGetInteger64i_v)(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetInteger64i_v) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetInteger64i_v))orig_func)
+           (target, index, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetInteger64i_v) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetInteger64i_v),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetInteger64v(GLenum pname, EvasGLint64 * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetInteger64v))(GLenum pname, EvasGLint64 * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetInteger64v) orig_func;
+   GLenum pname;
+   EvasGLint64 * data;
+
+} GL_TH_ST(glGetInteger64v);
+
+static void
+GL_TH_CB(glGetInteger64v)(void *data)
+{
+   GL_TH_ST(glGetInteger64v) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetInteger64v))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glGetInteger64v)(GL_TH_DP, GLenum pname, EvasGLint64 * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetInteger64v) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetInteger64v))orig_func)
+           (pname, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetInteger64v) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pname = pname;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetInteger64v),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetIntegeri_v(GLenum target, GLuint index, GLint * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetIntegeri_v))(GLenum target, GLuint index, GLint * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetIntegeri_v) orig_func;
+   GLenum target;
+   GLuint index;
+   GLint * data;
+
+} GL_TH_ST(glGetIntegeri_v);
+
+static void
+GL_TH_CB(glGetIntegeri_v)(void *data)
+{
+   GL_TH_ST(glGetIntegeri_v) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetIntegeri_v))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glGetIntegeri_v)(GL_TH_DP, GLenum target, GLuint index, GLint * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetIntegeri_v) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetIntegeri_v))orig_func)
+           (target, index, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetIntegeri_v) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetIntegeri_v),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetInternalformativ))(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetInternalformativ) orig_func;
+   GLenum target;
+   GLenum internalformat;
+   GLenum pname;
+   GLsizei bufSize;
+   GLint *params;
+
+} GL_TH_ST(glGetInternalformativ);
+
+static void
+GL_TH_CB(glGetInternalformativ)(void *data)
+{
+   GL_TH_ST(glGetInternalformativ) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetInternalformativ))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->internalformat,
+       thread_data->pname,
+       thread_data->bufSize,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetInternalformativ)(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetInternalformativ) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetInternalformativ))orig_func)
+           (target, internalformat, pname, bufSize, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetInternalformativ) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->internalformat = internalformat;
+   thread_data->pname = pname;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetInternalformativ),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramBinary))(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramBinary) orig_func;
+   GLuint program;
+   GLsizei bufsize;
+   GLsizei *length;
+   GLenum *binaryFormat;
+   void *binary;
+
+} GL_TH_ST(glGetProgramBinary);
+
+static void
+GL_TH_CB(glGetProgramBinary)(void *data)
+{
+   GL_TH_ST(glGetProgramBinary) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramBinary))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->bufsize,
+       thread_data->length,
+       thread_data->binaryFormat,
+       thread_data->binary);
+
+}
+
+void
+GL_TH_FN(glGetProgramBinary)(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramBinary) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramBinary))orig_func)
+           (program, bufsize, length, binaryFormat, binary);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramBinary) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->bufsize = bufsize;
+   thread_data->length = length;
+   thread_data->binaryFormat = binaryFormat;
+   thread_data->binary = binary;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramBinary),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetQueryiv(GLenum target, GLenum pname, GLint * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetQueryiv))(GLenum target, GLenum pname, GLint * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetQueryiv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint * params;
+
+} GL_TH_ST(glGetQueryiv);
+
+static void
+GL_TH_CB(glGetQueryiv)(void *data)
+{
+   GL_TH_ST(glGetQueryiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetQueryiv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetQueryiv)(GL_TH_DP, GLenum target, GLenum pname, GLint * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetQueryiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetQueryiv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetQueryiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetQueryiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetQueryObjectuiv))(GLuint id, GLenum pname, GLuint * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetQueryObjectuiv) orig_func;
+   GLuint id;
+   GLenum pname;
+   GLuint * params;
+
+} GL_TH_ST(glGetQueryObjectuiv);
+
+static void
+GL_TH_CB(glGetQueryObjectuiv)(void *data)
+{
+   GL_TH_ST(glGetQueryObjectuiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetQueryObjectuiv))thread_data->orig_func)
+      (thread_data->id,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetQueryObjectuiv)(GL_TH_DP, GLuint id, GLenum pname, GLuint * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetQueryObjectuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetQueryObjectuiv))orig_func)
+           (id, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetQueryObjectuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->id = id;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetQueryObjectuiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetSamplerParameterfv))(GLuint sampler, GLenum pname, GLfloat * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetSamplerParameterfv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   GLfloat * params;
+
+} GL_TH_ST(glGetSamplerParameterfv);
+
+static void
+GL_TH_CB(glGetSamplerParameterfv)(void *data)
+{
+   GL_TH_ST(glGetSamplerParameterfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetSamplerParameterfv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetSamplerParameterfv)(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSamplerParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetSamplerParameterfv))orig_func)
+           (sampler, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSamplerParameterfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSamplerParameterfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetSamplerParameteriv))(GLuint sampler, GLenum pname, GLint * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetSamplerParameteriv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   GLint * params;
+
+} GL_TH_ST(glGetSamplerParameteriv);
+
+static void
+GL_TH_CB(glGetSamplerParameteriv)(void *data)
+{
+   GL_TH_ST(glGetSamplerParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetSamplerParameteriv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetSamplerParameteriv)(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSamplerParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetSamplerParameteriv))orig_func)
+           (sampler, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSamplerParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSamplerParameteriv),
+                              thread_mode);
+}
+
+/*
+ * const GLubyte *
+ * glGetStringi(GLenum name, GLuint index);
+ */
+
+typedef const GLubyte *(*GL_TH_FNTYPE(glGetStringi))(GLenum name, GLuint index);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetStringi) orig_func;
+   const GLubyte * return_value;
+   GLenum name;
+   GLuint index;
+
+} GL_TH_ST(glGetStringi);
+
+static void
+GL_TH_CB(glGetStringi)(void *data)
+{
+   GL_TH_ST(glGetStringi) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetStringi))thread_data->orig_func)
+      (thread_data->name,
+       thread_data->index);
+
+}
+
+const GLubyte *
+GL_TH_FN(glGetStringi)(GL_TH_DP, GLenum name, GLuint index)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetStringi) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetStringi))orig_func)
+           (name, index);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetStringi) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->name = name;
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetStringi),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetSynciv))(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetSynciv) orig_func;
+   GLsync sync;
+   GLenum pname;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLint *values;
+
+} GL_TH_ST(glGetSynciv);
+
+static void
+GL_TH_CB(glGetSynciv)(void *data)
+{
+   GL_TH_ST(glGetSynciv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetSynciv))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->pname,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->values);
+
+}
+
+void
+GL_TH_FN(glGetSynciv)(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSynciv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetSynciv))orig_func)
+           (sync, pname, bufSize, length, values);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSynciv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->pname = pname;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->values = values;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSynciv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetTransformFeedbackVarying))(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetTransformFeedbackVarying) orig_func;
+   GLuint program;
+   GLuint index;
+   GLsizei bufSize;
+   GLsizei * length;
+   GLsizei * size;
+   GLenum * type;
+   char * name;
+
+} GL_TH_ST(glGetTransformFeedbackVarying);
+
+static void
+GL_TH_CB(glGetTransformFeedbackVarying)(void *data)
+{
+   GL_TH_ST(glGetTransformFeedbackVarying) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTransformFeedbackVarying))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->index,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->size,
+       thread_data->type,
+       thread_data->name);
+
+}
+
+void
+GL_TH_FN(glGetTransformFeedbackVarying)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTransformFeedbackVarying) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetTransformFeedbackVarying))orig_func)
+           (program, index, bufSize, length, size, type, name);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTransformFeedbackVarying) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->index = index;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTransformFeedbackVarying),
+                              thread_mode);
+}
+
+/*
+ * GLuint
+ * glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
+ */
+
+typedef GLuint(*GL_TH_FNTYPE(glGetUniformBlockIndex))(GLuint program, const GLchar *uniformBlockName);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformBlockIndex) orig_func;
+   GLuint return_value;
+   GLuint program;
+   const GLchar *uniformBlockName;
+
+} GL_TH_ST(glGetUniformBlockIndex);
+
+static void
+GL_TH_CB(glGetUniformBlockIndex)(void *data)
+{
+   GL_TH_ST(glGetUniformBlockIndex) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetUniformBlockIndex))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformBlockName);
+
+}
+
+GLuint
+GL_TH_FN(glGetUniformBlockIndex)(GL_TH_DP, GLuint program, const GLchar *uniformBlockName)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformBlockIndex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetUniformBlockIndex))orig_func)
+           (program, uniformBlockName);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformBlockIndex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformBlockName = uniformBlockName;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformBlockIndex),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetUniformIndices))(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformIndices) orig_func;
+   GLuint program;
+   GLsizei uniformCount;
+   const GLchar *const*uniformNames;
+   GLuint *uniformIndices;
+
+} GL_TH_ST(glGetUniformIndices);
+
+static void
+GL_TH_CB(glGetUniformIndices)(void *data)
+{
+   GL_TH_ST(glGetUniformIndices) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetUniformIndices))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformCount,
+       thread_data->uniformNames,
+       thread_data->uniformIndices);
+
+}
+
+void
+GL_TH_FN(glGetUniformIndices)(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformIndices) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetUniformIndices))orig_func)
+           (program, uniformCount, uniformNames, uniformIndices);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformIndices) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformCount = uniformCount;
+   thread_data->uniformNames = uniformNames;
+   thread_data->uniformIndices = uniformIndices;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformIndices),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetUniformuiv(GLuint program, GLint location, GLuint* params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetUniformuiv))(GLuint program, GLint location, GLuint* params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetUniformuiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLuint* params;
+
+} GL_TH_ST(glGetUniformuiv);
+
+static void
+GL_TH_CB(glGetUniformuiv)(void *data)
+{
+   GL_TH_ST(glGetUniformuiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetUniformuiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetUniformuiv)(GL_TH_DP, GLuint program, GLint location, GLuint* params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetUniformuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetUniformuiv))orig_func)
+           (program, location, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetUniformuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetUniformuiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetVertexAttribIiv))(GLuint index, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetVertexAttribIiv) orig_func;
+   GLuint index;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetVertexAttribIiv);
+
+static void
+GL_TH_CB(glGetVertexAttribIiv)(void *data)
+{
+   GL_TH_ST(glGetVertexAttribIiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetVertexAttribIiv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetVertexAttribIiv)(GL_TH_DP, GLuint index, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetVertexAttribIiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetVertexAttribIiv))orig_func)
+           (index, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetVertexAttribIiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetVertexAttribIiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetVertexAttribIuiv))(GLuint index, GLenum pname, GLuint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetVertexAttribIuiv) orig_func;
+   GLuint index;
+   GLenum pname;
+   GLuint *params;
+
+} GL_TH_ST(glGetVertexAttribIuiv);
+
+static void
+GL_TH_CB(glGetVertexAttribIuiv)(void *data)
+{
+   GL_TH_ST(glGetVertexAttribIuiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetVertexAttribIuiv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetVertexAttribIuiv)(GL_TH_DP, GLuint index, GLenum pname, GLuint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetVertexAttribIuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetVertexAttribIuiv))orig_func)
+           (index, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetVertexAttribIuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetVertexAttribIuiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+ */
+
+typedef void(*GL_TH_FNTYPE(glInvalidateFramebuffer))(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glInvalidateFramebuffer) orig_func;
+   GLenum target;
+   GLsizei numAttachments;
+   const GLenum *attachments;
+
+} GL_TH_ST(glInvalidateFramebuffer);
+
+static void
+GL_TH_CB(glInvalidateFramebuffer)(void *data)
+{
+   GL_TH_ST(glInvalidateFramebuffer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glInvalidateFramebuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->numAttachments,
+       thread_data->attachments);
+
+}
+
+void
+GL_TH_FN(glInvalidateFramebuffer)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glInvalidateFramebuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glInvalidateFramebuffer))orig_func)
+           (target, numAttachments, attachments);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glInvalidateFramebuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->numAttachments = numAttachments;
+   thread_data->attachments = attachments;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glInvalidateFramebuffer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glInvalidateSubFramebuffer))(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glInvalidateSubFramebuffer) orig_func;
+   GLenum target;
+   GLsizei numAttachments;
+   const GLenum *attachments;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glInvalidateSubFramebuffer);
+
+static void
+GL_TH_CB(glInvalidateSubFramebuffer)(void *data)
+{
+   GL_TH_ST(glInvalidateSubFramebuffer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glInvalidateSubFramebuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->numAttachments,
+       thread_data->attachments,
+       thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glInvalidateSubFramebuffer)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glInvalidateSubFramebuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glInvalidateSubFramebuffer))orig_func)
+           (target, numAttachments, attachments, x, y, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glInvalidateSubFramebuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->numAttachments = numAttachments;
+   thread_data->attachments = attachments;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glInvalidateSubFramebuffer),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsQuery(GLuint id);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsQuery))(GLuint id);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsQuery) orig_func;
+   GLboolean return_value;
+   GLuint id;
+
+} GL_TH_ST(glIsQuery);
+
+static void
+GL_TH_CB(glIsQuery)(void *data)
+{
+   GL_TH_ST(glIsQuery) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsQuery))thread_data->orig_func)
+      (thread_data->id);
+
+}
+
+GLboolean
+GL_TH_FN(glIsQuery)(GL_TH_DP, GLuint id)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsQuery) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsQuery))orig_func)
+           (id);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsQuery) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->id = id;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsQuery),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsSampler(GLuint id);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsSampler))(GLuint id);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsSampler) orig_func;
+   GLboolean return_value;
+   GLuint id;
+
+} GL_TH_ST(glIsSampler);
+
+static void
+GL_TH_CB(glIsSampler)(void *data)
+{
+   GL_TH_ST(glIsSampler) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsSampler))thread_data->orig_func)
+      (thread_data->id);
+
+}
+
+GLboolean
+GL_TH_FN(glIsSampler)(GL_TH_DP, GLuint id)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsSampler) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsSampler))orig_func)
+           (id);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsSampler) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->id = id;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsSampler),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsSync(GLsync sync);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsSync))(GLsync sync);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsSync) orig_func;
+   GLboolean return_value;
+   GLsync sync;
+
+} GL_TH_ST(glIsSync);
+
+static void
+GL_TH_CB(glIsSync)(void *data)
+{
+   GL_TH_ST(glIsSync) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsSync))thread_data->orig_func)
+      (thread_data->sync);
+
+}
+
+GLboolean
+GL_TH_FN(glIsSync)(GL_TH_DP, GLsync sync)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsSync))orig_func)
+           (sync);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsSync),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsTransformFeedback(GLuint id);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsTransformFeedback))(GLuint id);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsTransformFeedback) orig_func;
+   GLboolean return_value;
+   GLuint id;
+
+} GL_TH_ST(glIsTransformFeedback);
+
+static void
+GL_TH_CB(glIsTransformFeedback)(void *data)
+{
+   GL_TH_ST(glIsTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsTransformFeedback))thread_data->orig_func)
+      (thread_data->id);
+
+}
+
+GLboolean
+GL_TH_FN(glIsTransformFeedback)(GL_TH_DP, GLuint id)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsTransformFeedback))orig_func)
+           (id);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->id = id;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsTransformFeedback),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * GLboolean
+ * glIsVertexArray(GLuint array);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsVertexArray))(GLuint array);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsVertexArray) orig_func;
+   GLboolean return_value;
+   GLuint array;
+
+} GL_TH_ST(glIsVertexArray);
+
+static void
+GL_TH_CB(glIsVertexArray)(void *data)
+{
+   GL_TH_ST(glIsVertexArray) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsVertexArray))thread_data->orig_func)
+      (thread_data->array);
+
+}
+
+GLboolean
+GL_TH_FN(glIsVertexArray)(GL_TH_DP, GLuint array)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsVertexArray) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsVertexArray))orig_func)
+           (array);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsVertexArray) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->array = array;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsVertexArray),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void *
+ * glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+ */
+
+typedef void *(*GL_TH_FNTYPE(glMapBufferRange))(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glMapBufferRange) orig_func;
+   void * return_value;
+   GLenum target;
+   GLintptr offset;
+   GLsizeiptr length;
+   GLbitfield access;
+
+} GL_TH_ST(glMapBufferRange);
+
+static void
+GL_TH_CB(glMapBufferRange)(void *data)
+{
+   GL_TH_ST(glMapBufferRange) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glMapBufferRange))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->offset,
+       thread_data->length,
+       thread_data->access);
+
+}
+
+void *
+GL_TH_FN(glMapBufferRange)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMapBufferRange) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glMapBufferRange))orig_func)
+           (target, offset, length, access);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMapBufferRange) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->offset = offset;
+   thread_data->length = length;
+   thread_data->access = access;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMapBufferRange),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glPauseTransformFeedback(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glPauseTransformFeedback))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glPauseTransformFeedback) orig_func;
+
+} GL_TH_ST(glPauseTransformFeedback);
+
+static void
+GL_TH_CB(glPauseTransformFeedback)(void *data)
+{
+   GL_TH_ST(glPauseTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glPauseTransformFeedback))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glPauseTransformFeedback)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glPauseTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPauseTransformFeedback))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPauseTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPauseTransformFeedback),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramBinary))(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramBinary) orig_func;
+   GLuint program;
+   GLenum binaryFormat;
+   const void *binary;
+   GLsizei length;
+   void *binary_copied; /* COPIED */
+
+} GL_TH_ST(glProgramBinary);
+
+static void
+GL_TH_CB(glProgramBinary)(void *data)
+{
+   GL_TH_ST(glProgramBinary) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramBinary))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->binaryFormat,
+       thread_data->binary,
+       thread_data->length);
+
+
+   if (thread_data->binary_copied)
+     eina_mempool_free(_mp_default, thread_data->binary_copied);
+
+}
+
+void
+GL_TH_FN(glProgramBinary)(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramBinary) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramBinary))orig_func)
+           (program, binaryFormat, binary, length);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramBinary) *) + sizeof(GL_TH_ST(glProgramBinary)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glProgramBinary) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->binaryFormat = binaryFormat;
+   thread_data->binary = binary;
+   thread_data->length = length;
+   thread_data->orig_func = orig_func;
+
+   thread_data->binary_copied = NULL;
+   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
+     goto finish;
+
+   /* copy variable */
+   if (binary)
+     {
+        /* 1. check memory size */
+        unsigned int copy_size = length;
+        if (copy_size > _mp_default_memory_size)
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 2. malloc & copy */
+        thread_data->binary_copied = eina_mempool_malloc(_mp_default, copy_size);
+        if (thread_data->binary_copied)
+          {
+             memcpy(thread_data->binary_copied, binary, copy_size);
+          }
+        else
+          {
+             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+             goto finish;
+          }
+        /* 3. replace */
+        thread_data->binary = (const void  *)thread_data->binary_copied;
+     }
+   /* end of copy variable */
+
+finish:
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramBinary),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramParameteri(GLuint program, GLenum pname, GLint value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramParameteri))(GLuint program, GLenum pname, GLint value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramParameteri) orig_func;
+   GLuint program;
+   GLenum pname;
+   GLint value;
+
+} GL_TH_ST(glProgramParameteri);
+
+static void
+GL_TH_CB(glProgramParameteri)(void *data)
+{
+   GL_TH_ST(glProgramParameteri) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramParameteri))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->pname,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramParameteri)(GL_TH_DP, GLuint program, GLenum pname, GLint value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramParameteri) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramParameteri))orig_func)
+           (program, pname, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramParameteri) *) + sizeof(GL_TH_ST(glProgramParameteri)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glProgramParameteri) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
+
+   thread_data->program = program;
+   thread_data->pname = pname;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramParameteri),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glReadBuffer(GLenum src);
+ */
+
+typedef void(*GL_TH_FNTYPE(glReadBuffer))(GLenum src);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glReadBuffer) orig_func;
+   GLenum src;
+
+} GL_TH_ST(glReadBuffer);
+
+static void
+GL_TH_CB(glReadBuffer)(void *data)
+{
+   GL_TH_ST(glReadBuffer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glReadBuffer))thread_data->orig_func)
+      (thread_data->src);
+
+}
+
+void
+GL_TH_FN(glReadBuffer)(GL_TH_DP, GLenum src)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glReadBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glReadBuffer))orig_func)
+           (src);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glReadBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->src = src;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glReadBuffer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glRenderbufferStorageMultisample))(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glRenderbufferStorageMultisample) orig_func;
+   GLenum target;
+   GLsizei samples;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glRenderbufferStorageMultisample);
+
+static void
+GL_TH_CB(glRenderbufferStorageMultisample)(void *data)
+{
+   GL_TH_ST(glRenderbufferStorageMultisample) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glRenderbufferStorageMultisample))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->samples,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glRenderbufferStorageMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glRenderbufferStorageMultisample) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glRenderbufferStorageMultisample))orig_func)
+           (target, samples, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glRenderbufferStorageMultisample) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->samples = samples;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glRenderbufferStorageMultisample),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glResumeTransformFeedback(void);
+ */
+
+typedef void(*GL_TH_FNTYPE(glResumeTransformFeedback))(void);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glResumeTransformFeedback) orig_func;
+
+} GL_TH_ST(glResumeTransformFeedback);
+
+static void
+GL_TH_CB(glResumeTransformFeedback)(void *data)
+{
+   GL_TH_ST(glResumeTransformFeedback) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glResumeTransformFeedback))thread_data->orig_func)
+      ();
+
+}
+
+void
+GL_TH_FN(glResumeTransformFeedback)(GL_TH_DP)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glResumeTransformFeedback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glResumeTransformFeedback))orig_func)
+           ();
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glResumeTransformFeedback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glResumeTransformFeedback),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSamplerParameterf))(GLuint sampler, GLenum pname, GLfloat param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSamplerParameterf) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   GLfloat param;
+
+} GL_TH_ST(glSamplerParameterf);
+
+static void
+GL_TH_CB(glSamplerParameterf)(void *data)
+{
+   GL_TH_ST(glSamplerParameterf) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSamplerParameterf))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glSamplerParameterf)(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameterf) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSamplerParameterf))orig_func)
+           (sampler, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameterf) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameterf),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSamplerParameterfv))(GLuint sampler, GLenum pname, const GLfloat * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSamplerParameterfv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   const GLfloat * params;
+
+} GL_TH_ST(glSamplerParameterfv);
+
+static void
+GL_TH_CB(glSamplerParameterfv)(void *data)
+{
+   GL_TH_ST(glSamplerParameterfv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSamplerParameterfv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glSamplerParameterfv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSamplerParameterfv))orig_func)
+           (sampler, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameterfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameterfv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSamplerParameteri(GLuint sampler, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSamplerParameteri))(GLuint sampler, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSamplerParameteri) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glSamplerParameteri);
+
+static void
+GL_TH_CB(glSamplerParameteri)(void *data)
+{
+   GL_TH_ST(glSamplerParameteri) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSamplerParameteri))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glSamplerParameteri)(GL_TH_DP, GLuint sampler, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameteri) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSamplerParameteri))orig_func)
+           (sampler, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameteri) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameteri),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint * params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glSamplerParameteriv))(GLuint sampler, GLenum pname, const GLint * params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glSamplerParameteriv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   const GLint * params;
+
+} GL_TH_ST(glSamplerParameteriv);
+
+static void
+GL_TH_CB(glSamplerParameteriv)(void *data)
+{
+   GL_TH_ST(glSamplerParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glSamplerParameteriv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glSamplerParameteriv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSamplerParameteriv))orig_func)
+           (sampler, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexImage3D))(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexImage3D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint internalFormat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLint border;
+   GLenum format;
+   GLenum type;
+   const GLvoid * data;
+
+} GL_TH_ST(glTexImage3D);
+
+static void
+GL_TH_CB(glTexImage3D)(void *data)
+{
+   GL_TH_ST(glTexImage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexImage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->internalFormat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->border,
+       thread_data->format,
+       thread_data->type,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glTexImage3D)(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexImage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexImage3D))orig_func)
+           (target, level, internalFormat, width, height, depth, border, format, type, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexImage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->internalFormat = internalFormat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->border = border;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexImage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexStorage2D))(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexStorage2D) orig_func;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+
+} GL_TH_ST(glTexStorage2D);
+
+static void
+GL_TH_CB(glTexStorage2D)(void *data)
+{
+   GL_TH_ST(glTexStorage2D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexStorage2D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height);
+
+}
+
+void
+GL_TH_FN(glTexStorage2D)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage2D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage2D))orig_func)
+           (target, levels, internalformat, width, height);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage2D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage2D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexStorage3D))(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexStorage3D) orig_func;
+   GLenum target;
+   GLsizei levels;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+
+} GL_TH_ST(glTexStorage3D);
+
+static void
+GL_TH_CB(glTexStorage3D)(void *data)
+{
+   GL_TH_ST(glTexStorage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexStorage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->levels,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth);
+
+}
+
+void
+GL_TH_FN(glTexStorage3D)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage3D))orig_func)
+           (target, levels, internalformat, width, height, depth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->levels = levels;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTexSubImage3D))(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTexSubImage3D) orig_func;
+   GLenum target;
+   GLint level;
+   GLint xoffset;
+   GLint yoffset;
+   GLint zoffset;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLenum format;
+   GLenum type;
+   const GLvoid * data;
+
+} GL_TH_ST(glTexSubImage3D);
+
+static void
+GL_TH_CB(glTexSubImage3D)(void *data)
+{
+   GL_TH_ST(glTexSubImage3D) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTexSubImage3D))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->xoffset,
+       thread_data->yoffset,
+       thread_data->zoffset,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->format,
+       thread_data->type,
+       thread_data->data);
+
+}
+
+void
+GL_TH_FN(glTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexSubImage3D) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexSubImage3D))orig_func)
+           (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexSubImage3D) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->xoffset = xoffset;
+   thread_data->yoffset = yoffset;
+   thread_data->zoffset = zoffset;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexSubImage3D),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+ */
+
+typedef void(*GL_TH_FNTYPE(glTransformFeedbackVaryings))(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glTransformFeedbackVaryings) orig_func;
+   GLuint program;
+   GLsizei count;
+   const GLchar *const* varyings;
+   GLenum bufferMode;
+
+} GL_TH_ST(glTransformFeedbackVaryings);
+
+static void
+GL_TH_CB(glTransformFeedbackVaryings)(void *data)
+{
+   GL_TH_ST(glTransformFeedbackVaryings) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glTransformFeedbackVaryings))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->count,
+       thread_data->varyings,
+       thread_data->bufferMode);
+
+}
+
+void
+GL_TH_FN(glTransformFeedbackVaryings)(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTransformFeedbackVaryings) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTransformFeedbackVaryings))orig_func)
+           (program, count, varyings, bufferMode);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTransformFeedbackVaryings) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->count = count;
+   thread_data->varyings = varyings;
+   thread_data->bufferMode = bufferMode;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTransformFeedbackVaryings),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform1ui(GLint location, GLuint v0);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1ui))(GLint location, GLuint v0);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1ui) orig_func;
+   GLint location;
+   GLuint v0;
+
+} GL_TH_ST(glUniform1ui);
+
+static void
+GL_TH_CB(glUniform1ui)(void *data)
+{
+   GL_TH_ST(glUniform1ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1ui))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->v0);
+
+}
+
+void
+GL_TH_FN(glUniform1ui)(GL_TH_DP, GLint location, GLuint v0)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1ui))orig_func)
+           (location, v0);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform1uiv(GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform1uiv))(GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform1uiv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glUniform1uiv);
+
+static void
+GL_TH_CB(glUniform1uiv)(void *data)
+{
+   GL_TH_ST(glUniform1uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform1uiv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniform1uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform1uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform1uiv))orig_func)
+           (location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform1uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform1uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2ui(GLint location, GLuint v0, GLuint v1);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2ui))(GLint location, GLuint v0, GLuint v1);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2ui) orig_func;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+
+} GL_TH_ST(glUniform2ui);
+
+static void
+GL_TH_CB(glUniform2ui)(void *data)
+{
+   GL_TH_ST(glUniform2ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2ui))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->v0,
+       thread_data->v1);
+
+}
+
+void
+GL_TH_FN(glUniform2ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2ui))orig_func)
+           (location, v0, v1);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform2uiv(GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform2uiv))(GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform2uiv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glUniform2uiv);
+
+static void
+GL_TH_CB(glUniform2uiv)(void *data)
+{
+   GL_TH_ST(glUniform2uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform2uiv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniform2uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform2uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform2uiv))orig_func)
+           (location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform2uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform2uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3ui))(GLint location, GLuint v0, GLuint v1, GLuint v2);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3ui) orig_func;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+   GLuint v2;
+
+} GL_TH_ST(glUniform3ui);
+
+static void
+GL_TH_CB(glUniform3ui)(void *data)
+{
+   GL_TH_ST(glUniform3ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3ui))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2);
+
+}
+
+void
+GL_TH_FN(glUniform3ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3ui))orig_func)
+           (location, v0, v1, v2);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform3uiv(GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform3uiv))(GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform3uiv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glUniform3uiv);
+
+static void
+GL_TH_CB(glUniform3uiv)(void *data)
+{
+   GL_TH_ST(glUniform3uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform3uiv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniform3uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform3uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform3uiv))orig_func)
+           (location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform3uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform3uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4ui))(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4ui) orig_func;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+   GLuint v2;
+   GLuint v3;
+
+} GL_TH_ST(glUniform4ui);
+
+static void
+GL_TH_CB(glUniform4ui)(void *data)
+{
+   GL_TH_ST(glUniform4ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4ui))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glUniform4ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4ui))orig_func)
+           (location, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniform4uiv(GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniform4uiv))(GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniform4uiv) orig_func;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glUniform4uiv);
+
+static void
+GL_TH_CB(glUniform4uiv)(void *data)
+{
+   GL_TH_ST(glUniform4uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniform4uiv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniform4uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniform4uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniform4uiv))orig_func)
+           (location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniform4uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniform4uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformBlockBinding))(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformBlockBinding) orig_func;
+   GLuint program;
+   GLuint uniformBlockIndex;
+   GLuint uniformBlockBinding;
+
+} GL_TH_ST(glUniformBlockBinding);
+
+static void
+GL_TH_CB(glUniformBlockBinding)(void *data)
+{
+   GL_TH_ST(glUniformBlockBinding) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformBlockBinding))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->uniformBlockIndex,
+       thread_data->uniformBlockBinding);
+
+}
+
+void
+GL_TH_FN(glUniformBlockBinding)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformBlockBinding) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformBlockBinding))orig_func)
+           (program, uniformBlockIndex, uniformBlockBinding);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformBlockBinding) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->uniformBlockIndex = uniformBlockIndex;
+   thread_data->uniformBlockBinding = uniformBlockBinding;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformBlockBinding),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix2x3fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix2x3fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix2x3fv);
+
+static void
+GL_TH_CB(glUniformMatrix2x3fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix2x3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix2x3fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix2x3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix2x3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix2x3fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix2x3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix2x3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix3x2fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix3x2fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix3x2fv);
+
+static void
+GL_TH_CB(glUniformMatrix3x2fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix3x2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix3x2fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix3x2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix3x2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix3x2fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix3x2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix3x2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix2x4fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix2x4fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix2x4fv);
+
+static void
+GL_TH_CB(glUniformMatrix2x4fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix2x4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix2x4fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix2x4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix2x4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix2x4fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix2x4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix2x4fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix4x2fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix4x2fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix4x2fv);
+
+static void
+GL_TH_CB(glUniformMatrix4x2fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix4x2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix4x2fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix4x2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix4x2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix4x2fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix4x2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix4x2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix3x4fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix3x4fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix3x4fv);
+
+static void
+GL_TH_CB(glUniformMatrix3x4fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix3x4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix3x4fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix3x4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix3x4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix3x4fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix3x4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix3x4fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUniformMatrix4x3fv))(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUniformMatrix4x3fv) orig_func;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glUniformMatrix4x3fv);
+
+static void
+GL_TH_CB(glUniformMatrix4x3fv)(void *data)
+{
+   GL_TH_ST(glUniformMatrix4x3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUniformMatrix4x3fv))thread_data->orig_func)
+      (thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glUniformMatrix4x3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUniformMatrix4x3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUniformMatrix4x3fv))orig_func)
+           (location, count, transpose, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUniformMatrix4x3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUniformMatrix4x3fv),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glUnmapBuffer(GLenum target);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glUnmapBuffer))(GLenum target);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUnmapBuffer) orig_func;
+   GLboolean return_value;
+   GLenum target;
+
+} GL_TH_ST(glUnmapBuffer);
+
+static void
+GL_TH_CB(glUnmapBuffer)(void *data)
+{
+   GL_TH_ST(glUnmapBuffer) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glUnmapBuffer))thread_data->orig_func)
+      (thread_data->target);
+
+}
+
+GLboolean
+GL_TH_FN(glUnmapBuffer)(GL_TH_DP, GLenum target)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUnmapBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glUnmapBuffer))orig_func)
+           (target);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUnmapBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUnmapBuffer),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glVertexAttribDivisor(GLuint index, GLuint divisor);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribDivisor))(GLuint index, GLuint divisor);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribDivisor) orig_func;
+   GLuint index;
+   GLuint divisor;
+
+} GL_TH_ST(glVertexAttribDivisor);
+
+static void
+GL_TH_CB(glVertexAttribDivisor)(void *data)
+{
+   GL_TH_ST(glVertexAttribDivisor) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribDivisor))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->divisor);
+
+}
+
+void
+GL_TH_FN(glVertexAttribDivisor)(GL_TH_DP, GLuint index, GLuint divisor)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribDivisor) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribDivisor))orig_func)
+           (index, divisor);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribDivisor) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->divisor = divisor;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribDivisor),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribI4i(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribI4i))(GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribI4i) orig_func;
+   GLuint index;
+   GLint v0;
+   GLint v1;
+   GLint v2;
+   GLint v3;
+
+} GL_TH_ST(glVertexAttribI4i);
+
+static void
+GL_TH_CB(glVertexAttribI4i)(void *data)
+{
+   GL_TH_ST(glVertexAttribI4i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribI4i))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glVertexAttribI4i)(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribI4i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribI4i))orig_func)
+           (index, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribI4i) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribI4i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribI4iv(GLuint index, const GLint *v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribI4iv))(GLuint index, const GLint *v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribI4iv) orig_func;
+   GLuint index;
+   const GLint *v;
+
+} GL_TH_ST(glVertexAttribI4iv);
+
+static void
+GL_TH_CB(glVertexAttribI4iv)(void *data)
+{
+   GL_TH_ST(glVertexAttribI4iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribI4iv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->v);
+
+}
+
+void
+GL_TH_FN(glVertexAttribI4iv)(GL_TH_DP, GLuint index, const GLint *v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribI4iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribI4iv))orig_func)
+           (index, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribI4iv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribI4iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribI4ui(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribI4ui))(GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribI4ui) orig_func;
+   GLuint index;
+   GLuint v0;
+   GLuint v1;
+   GLuint v2;
+   GLuint v3;
+
+} GL_TH_ST(glVertexAttribI4ui);
+
+static void
+GL_TH_CB(glVertexAttribI4ui)(void *data)
+{
+   GL_TH_ST(glVertexAttribI4ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribI4ui))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glVertexAttribI4ui)(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribI4ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribI4ui))orig_func)
+           (index, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribI4ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribI4ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribI4uiv(GLuint index, const GLuint *v);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribI4uiv))(GLuint index, const GLuint *v);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribI4uiv) orig_func;
+   GLuint index;
+   const GLuint *v;
+
+} GL_TH_ST(glVertexAttribI4uiv);
+
+static void
+GL_TH_CB(glVertexAttribI4uiv)(void *data)
+{
+   GL_TH_ST(glVertexAttribI4uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribI4uiv))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->v);
+
+}
+
+void
+GL_TH_FN(glVertexAttribI4uiv)(GL_TH_DP, GLuint index, const GLuint *v)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribI4uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribI4uiv))orig_func)
+           (index, v);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribI4uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->v = v;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribI4uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+ */
+
+typedef void(*GL_TH_FNTYPE(glVertexAttribIPointer))(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribIPointer) orig_func;
+   GLuint index;
+   GLint size;
+   GLenum type;
+   GLsizei stride;
+   const GLvoid *pointer;
+
+} GL_TH_ST(glVertexAttribIPointer);
+
+static void
+GL_TH_CB(glVertexAttribIPointer)(void *data)
+{
+   GL_TH_ST(glVertexAttribIPointer) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribIPointer))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->size,
+       thread_data->type,
+       thread_data->stride,
+       thread_data->pointer);
+
+}
+
+void
+GL_TH_FN(glVertexAttribIPointer)(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribIPointer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribIPointer))orig_func)
+           (index, size, type, stride, pointer);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribIPointer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->index = index;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->stride = stride;
+   thread_data->pointer = pointer;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribIPointer),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+ */
+
+typedef void(*GL_TH_FNTYPE(glWaitSync))(GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glWaitSync) orig_func;
+   GLsync sync;
+   GLbitfield flags;
+   EvasGLuint64 timeout;
+
+} GL_TH_ST(glWaitSync);
+
+static void
+GL_TH_CB(glWaitSync)(void *data)
+{
+   GL_TH_ST(glWaitSync) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glWaitSync))thread_data->orig_func)
+      (thread_data->sync,
+       thread_data->flags,
+       thread_data->timeout);
+
+}
+
+void
+GL_TH_FN(glWaitSync)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glWaitSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glWaitSync))orig_func)
+           (sync, flags, timeout);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glWaitSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->timeout = timeout;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glWaitSync),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDispatchCompute))(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDispatchCompute) orig_func;
+   GLuint num_groups_x;
+   GLuint num_groups_y;
+   GLuint num_groups_z;
+
+} GL_TH_ST(glDispatchCompute);
+
+static void
+GL_TH_CB(glDispatchCompute)(void *data)
+{
+   GL_TH_ST(glDispatchCompute) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDispatchCompute))thread_data->orig_func)
+      (thread_data->num_groups_x,
+       thread_data->num_groups_y,
+       thread_data->num_groups_z);
+
+}
+
+void
+GL_TH_FN(glDispatchCompute)(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDispatchCompute) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDispatchCompute))orig_func)
+           (num_groups_x, num_groups_y, num_groups_z);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDispatchCompute) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->num_groups_x = num_groups_x;
+   thread_data->num_groups_y = num_groups_y;
+   thread_data->num_groups_z = num_groups_z;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDispatchCompute),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDispatchComputeIndirect(GLintptr indirect);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDispatchComputeIndirect))(GLintptr indirect);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDispatchComputeIndirect) orig_func;
+   GLintptr indirect;
+
+} GL_TH_ST(glDispatchComputeIndirect);
+
+static void
+GL_TH_CB(glDispatchComputeIndirect)(void *data)
+{
+   GL_TH_ST(glDispatchComputeIndirect) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDispatchComputeIndirect))thread_data->orig_func)
+      (thread_data->indirect);
+
+}
+
+void
+GL_TH_FN(glDispatchComputeIndirect)(GL_TH_DP, GLintptr indirect)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDispatchComputeIndirect) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDispatchComputeIndirect))orig_func)
+           (indirect);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDispatchComputeIndirect) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->indirect = indirect;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDispatchComputeIndirect),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawArraysIndirect(GLenum mode, const void *indirect);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawArraysIndirect))(GLenum mode, const void *indirect);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawArraysIndirect) orig_func;
+   GLenum mode;
+   const void *indirect;
+
+} GL_TH_ST(glDrawArraysIndirect);
+
+static void
+GL_TH_CB(glDrawArraysIndirect)(void *data)
+{
+   GL_TH_ST(glDrawArraysIndirect) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawArraysIndirect))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->indirect);
+
+}
+
+void
+GL_TH_FN(glDrawArraysIndirect)(GL_TH_DP, GLenum mode, const void *indirect)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawArraysIndirect) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawArraysIndirect))orig_func)
+           (mode, indirect);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawArraysIndirect) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->indirect = indirect;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawArraysIndirect),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDrawElementsIndirect))(GLenum mode, GLenum type, const void *indirect);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDrawElementsIndirect) orig_func;
+   GLenum mode;
+   GLenum type;
+   const void *indirect;
+
+} GL_TH_ST(glDrawElementsIndirect);
+
+static void
+GL_TH_CB(glDrawElementsIndirect)(void *data)
+{
+   GL_TH_ST(glDrawElementsIndirect) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDrawElementsIndirect))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->type,
+       thread_data->indirect);
+
+}
+
+void
+GL_TH_FN(glDrawElementsIndirect)(GL_TH_DP, GLenum mode, GLenum type, const void *indirect)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDrawElementsIndirect) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawElementsIndirect))orig_func)
+           (mode, type, indirect);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawElementsIndirect) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->mode = mode;
+   thread_data->type = type;
+   thread_data->indirect = indirect;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawElementsIndirect),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glFramebufferParameteri(GLenum target, GLenum pname, GLint param);
+ */
+
+typedef void(*GL_TH_FNTYPE(glFramebufferParameteri))(GLenum target, GLenum pname, GLint param);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glFramebufferParameteri) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint param;
+
+} GL_TH_ST(glFramebufferParameteri);
+
+static void
+GL_TH_CB(glFramebufferParameteri)(void *data)
+{
+   GL_TH_ST(glFramebufferParameteri) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glFramebufferParameteri))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->param);
+
+}
+
+void
+GL_TH_FN(glFramebufferParameteri)(GL_TH_DP, GLenum target, GLenum pname, GLint param)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glFramebufferParameteri) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferParameteri))orig_func)
+           (target, pname, param);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferParameteri) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferParameteri),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetFramebufferParameteriv))(GLenum target, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetFramebufferParameteriv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetFramebufferParameteriv);
+
+static void
+GL_TH_CB(glGetFramebufferParameteriv)(void *data)
+{
+   GL_TH_ST(glGetFramebufferParameteriv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetFramebufferParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetFramebufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetFramebufferParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetFramebufferParameteriv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetFramebufferParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetFramebufferParameteriv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramInterfaceiv))(GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramInterfaceiv) orig_func;
+   GLuint program;
+   GLenum programInterface;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetProgramInterfaceiv);
+
+static void
+GL_TH_CB(glGetProgramInterfaceiv)(void *data)
+{
+   GL_TH_ST(glGetProgramInterfaceiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramInterfaceiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->programInterface,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetProgramInterfaceiv)(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramInterfaceiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramInterfaceiv))orig_func)
+           (program, programInterface, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramInterfaceiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->programInterface = programInterface;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramInterfaceiv),
+                              thread_mode);
+}
+
+/*
+ * GLuint
+ * glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name);
+ */
+
+typedef GLuint(*GL_TH_FNTYPE(glGetProgramResourceIndex))(GLuint program, GLenum programInterface, const GLchar *name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramResourceIndex) orig_func;
+   GLuint return_value;
+   GLuint program;
+   GLenum programInterface;
+   const GLchar *name;
+
+} GL_TH_ST(glGetProgramResourceIndex);
+
+static void
+GL_TH_CB(glGetProgramResourceIndex)(void *data)
+{
+   GL_TH_ST(glGetProgramResourceIndex) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetProgramResourceIndex))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->programInterface,
+       thread_data->name);
+
+}
+
+GLuint
+GL_TH_FN(glGetProgramResourceIndex)(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramResourceIndex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetProgramResourceIndex))orig_func)
+           (program, programInterface, name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramResourceIndex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->programInterface = programInterface;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramResourceIndex),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramResourceName))(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramResourceName) orig_func;
+   GLuint program;
+   GLenum programInterface;
+   GLuint index;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLchar *name;
+
+} GL_TH_ST(glGetProgramResourceName);
+
+static void
+GL_TH_CB(glGetProgramResourceName)(void *data)
+{
+   GL_TH_ST(glGetProgramResourceName) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramResourceName))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->programInterface,
+       thread_data->index,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->name);
+
+}
+
+void
+GL_TH_FN(glGetProgramResourceName)(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramResourceName) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramResourceName))orig_func)
+           (program, programInterface, index, bufSize, length, name);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramResourceName) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->programInterface = programInterface;
+   thread_data->index = index;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramResourceName),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramResourceiv))(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramResourceiv) orig_func;
+   GLuint program;
+   GLenum programInterface;
+   GLuint index;
+   GLsizei propCount;
+   const GLenum *props;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLint *params;
+
+} GL_TH_ST(glGetProgramResourceiv);
+
+static void
+GL_TH_CB(glGetProgramResourceiv)(void *data)
+{
+   GL_TH_ST(glGetProgramResourceiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramResourceiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->programInterface,
+       thread_data->index,
+       thread_data->propCount,
+       thread_data->props,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetProgramResourceiv)(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramResourceiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramResourceiv))orig_func)
+           (program, programInterface, index, propCount, props, bufSize, length, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramResourceiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->programInterface = programInterface;
+   thread_data->index = index;
+   thread_data->propCount = propCount;
+   thread_data->props = props;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramResourceiv),
+                              thread_mode);
+}
+
+/*
+ * GLint
+ * glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name);
+ */
+
+typedef GLint(*GL_TH_FNTYPE(glGetProgramResourceLocation))(GLuint program, GLenum programInterface, const GLchar *name);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramResourceLocation) orig_func;
+   GLint return_value;
+   GLuint program;
+   GLenum programInterface;
+   const GLchar *name;
+
+} GL_TH_ST(glGetProgramResourceLocation);
+
+static void
+GL_TH_CB(glGetProgramResourceLocation)(void *data)
+{
+   GL_TH_ST(glGetProgramResourceLocation) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetProgramResourceLocation))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->programInterface,
+       thread_data->name);
+
+}
+
+GLint
+GL_TH_FN(glGetProgramResourceLocation)(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramResourceLocation) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetProgramResourceLocation))orig_func)
+           (program, programInterface, name);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramResourceLocation) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->programInterface = programInterface;
+   thread_data->name = name;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramResourceLocation),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program);
+ */
+
+typedef void(*GL_TH_FNTYPE(glUseProgramStages))(GLuint pipeline, GLbitfield stages, GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glUseProgramStages) orig_func;
+   GLuint pipeline;
+   GLbitfield stages;
+   GLuint program;
+
+} GL_TH_ST(glUseProgramStages);
+
+static void
+GL_TH_CB(glUseProgramStages)(void *data)
+{
+   GL_TH_ST(glUseProgramStages) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glUseProgramStages))thread_data->orig_func)
+      (thread_data->pipeline,
+       thread_data->stages,
+       thread_data->program);
+
+}
+
+void
+GL_TH_FN(glUseProgramStages)(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glUseProgramStages) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glUseProgramStages))orig_func)
+           (pipeline, stages, program);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glUseProgramStages) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pipeline = pipeline;
+   thread_data->stages = stages;
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glUseProgramStages),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glActiveShaderProgram(GLuint pipeline, GLuint program);
+ */
+
+typedef void(*GL_TH_FNTYPE(glActiveShaderProgram))(GLuint pipeline, GLuint program);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glActiveShaderProgram) orig_func;
+   GLuint pipeline;
+   GLuint program;
+
+} GL_TH_ST(glActiveShaderProgram);
+
+static void
+GL_TH_CB(glActiveShaderProgram)(void *data)
+{
+   GL_TH_ST(glActiveShaderProgram) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glActiveShaderProgram))thread_data->orig_func)
+      (thread_data->pipeline,
+       thread_data->program);
+
+}
+
+void
+GL_TH_FN(glActiveShaderProgram)(GL_TH_DP, GLuint pipeline, GLuint program)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glActiveShaderProgram) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glActiveShaderProgram))orig_func)
+           (pipeline, program);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glActiveShaderProgram) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pipeline = pipeline;
+   thread_data->program = program;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glActiveShaderProgram),
+                              thread_mode);
+}
+
+/*
+ * GLuint
+ * glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar *const*strings);
+ */
+
+typedef GLuint(*GL_TH_FNTYPE(glCreateShaderProgramv))(GLenum type, GLsizei count, const GLchar *const*strings);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glCreateShaderProgramv) orig_func;
+   GLuint return_value;
+   GLenum type;
+   GLsizei count;
+   const GLchar *const*strings;
+
+} GL_TH_ST(glCreateShaderProgramv);
+
+static void
+GL_TH_CB(glCreateShaderProgramv)(void *data)
+{
+   GL_TH_ST(glCreateShaderProgramv) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glCreateShaderProgramv))thread_data->orig_func)
+      (thread_data->type,
+       thread_data->count,
+       thread_data->strings);
+
+}
+
+GLuint
+GL_TH_FN(glCreateShaderProgramv)(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCreateShaderProgramv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glCreateShaderProgramv))orig_func)
+           (type, count, strings);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCreateShaderProgramv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->type = type;
+   thread_data->count = count;
+   thread_data->strings = strings;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCreateShaderProgramv),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glBindProgramPipeline(GLuint pipeline);
+ */
+
+typedef void(*GL_TH_FNTYPE(glBindProgramPipeline))(GLuint pipeline);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glBindProgramPipeline) orig_func;
+   GLuint pipeline;
+
+} GL_TH_ST(glBindProgramPipeline);
+
+static void
+GL_TH_CB(glBindProgramPipeline)(void *data)
+{
+   GL_TH_ST(glBindProgramPipeline) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindProgramPipeline))thread_data->orig_func)
+      (thread_data->pipeline);
+
+}
+
+void
+GL_TH_FN(glBindProgramPipeline)(GL_TH_DP, GLuint pipeline)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindProgramPipeline) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindProgramPipeline))orig_func)
+           (pipeline);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindProgramPipeline) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pipeline = pipeline;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindProgramPipeline),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines);
+ */
+
+typedef void(*GL_TH_FNTYPE(glDeleteProgramPipelines))(GLsizei n, const GLuint *pipelines);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glDeleteProgramPipelines) orig_func;
+   GLsizei n;
+   const GLuint *pipelines;
+
+} GL_TH_ST(glDeleteProgramPipelines);
+
+static void
+GL_TH_CB(glDeleteProgramPipelines)(void *data)
+{
+   GL_TH_ST(glDeleteProgramPipelines) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glDeleteProgramPipelines))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->pipelines);
+
+}
+
+void
+GL_TH_FN(glDeleteProgramPipelines)(GL_TH_DP, GLsizei n, const GLuint *pipelines)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDeleteProgramPipelines) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDeleteProgramPipelines))orig_func)
+           (n, pipelines);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDeleteProgramPipelines) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->pipelines = pipelines;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDeleteProgramPipelines),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glGenProgramPipelines(GLsizei n, GLuint *pipelines);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGenProgramPipelines))(GLsizei n, GLuint *pipelines);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGenProgramPipelines) orig_func;
+   GLsizei n;
+   GLuint *pipelines;
+
+} GL_TH_ST(glGenProgramPipelines);
+
+static void
+GL_TH_CB(glGenProgramPipelines)(void *data)
+{
+   GL_TH_ST(glGenProgramPipelines) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGenProgramPipelines))thread_data->orig_func)
+      (thread_data->n,
+       thread_data->pipelines);
+
+}
+
+void
+GL_TH_FN(glGenProgramPipelines)(GL_TH_DP, GLsizei n, GLuint *pipelines)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGenProgramPipelines) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGenProgramPipelines))orig_func)
+           (n, pipelines);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGenProgramPipelines) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->n = n;
+   thread_data->pipelines = pipelines;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGenProgramPipelines),
+                              thread_mode);
+}
+
+/*
+ * GLboolean
+ * glIsProgramPipeline(GLuint pipeline);
+ */
+
+typedef GLboolean(*GL_TH_FNTYPE(glIsProgramPipeline))(GLuint pipeline);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glIsProgramPipeline) orig_func;
+   GLboolean return_value;
+   GLuint pipeline;
+
+} GL_TH_ST(glIsProgramPipeline);
+
+static void
+GL_TH_CB(glIsProgramPipeline)(void *data)
+{
+   GL_TH_ST(glIsProgramPipeline) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsProgramPipeline))thread_data->orig_func)
+      (thread_data->pipeline);
+
+}
+
+GLboolean
+GL_TH_FN(glIsProgramPipeline)(GL_TH_DP, GLuint pipeline)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glIsProgramPipeline) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glIsProgramPipeline))orig_func)
+           (pipeline);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsProgramPipeline) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pipeline = pipeline;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsProgramPipeline),
+                              thread_mode);
+
+   return thread_data->return_value;
+}
+
+/*
+ * void
+ * glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params);
+ */
+
+typedef void(*GL_TH_FNTYPE(glGetProgramPipelineiv))(GLuint pipeline, GLenum pname, GLint *params);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glGetProgramPipelineiv) orig_func;
+   GLuint pipeline;
+   GLenum pname;
+   GLint *params;
+
+} GL_TH_ST(glGetProgramPipelineiv);
+
+static void
+GL_TH_CB(glGetProgramPipelineiv)(void *data)
+{
+   GL_TH_ST(glGetProgramPipelineiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetProgramPipelineiv))thread_data->orig_func)
+      (thread_data->pipeline,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetProgramPipelineiv)(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramPipelineiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetProgramPipelineiv))orig_func)
+           (pipeline, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramPipelineiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->pipeline = pipeline;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramPipelineiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1i(GLuint program, GLint location, GLint v0);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1i))(GLuint program, GLint location, GLint v0);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1i) orig_func;
+   GLuint program;
+   GLint location;
+   GLint v0;
+
+} GL_TH_ST(glProgramUniform1i);
+
+static void
+GL_TH_CB(glProgramUniform1i)(void *data)
+{
+   GL_TH_ST(glProgramUniform1i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1i))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1i)(GL_TH_DP, GLuint program, GLint location, GLint v0)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1i))orig_func)
+           (program, location, v0);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1i) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2i))(GLuint program, GLint location, GLint v0, GLint v1);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2i) orig_func;
+   GLuint program;
+   GLint location;
+   GLint v0;
+   GLint v1;
+
+} GL_TH_ST(glProgramUniform2i);
+
+static void
+GL_TH_CB(glProgramUniform2i)(void *data)
+{
+   GL_TH_ST(glProgramUniform2i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2i))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2i))orig_func)
+           (program, location, v0, v1);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2i) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3i))(GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3i) orig_func;
+   GLuint program;
+   GLint location;
+   GLint v0;
+   GLint v1;
+   GLint v2;
+
+} GL_TH_ST(glProgramUniform3i);
+
+static void
+GL_TH_CB(glProgramUniform3i)(void *data)
+{
+   GL_TH_ST(glProgramUniform3i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3i))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform3i))orig_func)
+           (program, location, v0, v1, v2);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3i) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4i))(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4i) orig_func;
+   GLuint program;
+   GLint location;
+   GLint v0;
+   GLint v1;
+   GLint v2;
+   GLint v3;
+
+} GL_TH_ST(glProgramUniform4i);
+
+static void
+GL_TH_CB(glProgramUniform4i)(void *data)
+{
+   GL_TH_ST(glProgramUniform4i) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4i))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4i) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4i))orig_func)
+           (program, location, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4i) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4i),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1ui(GLuint program, GLint location, GLuint v0);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1ui))(GLuint program, GLint location, GLuint v0);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1ui) orig_func;
+   GLuint program;
+   GLint location;
+   GLuint v0;
+
+} GL_TH_ST(glProgramUniform1ui);
+
+static void
+GL_TH_CB(glProgramUniform1ui)(void *data)
+{
+   GL_TH_ST(glProgramUniform1ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1ui))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1ui))orig_func)
+           (program, location, v0);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2ui))(GLuint program, GLint location, GLuint v0, GLuint v1);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2ui) orig_func;
+   GLuint program;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+
+} GL_TH_ST(glProgramUniform2ui);
+
+static void
+GL_TH_CB(glProgramUniform2ui)(void *data)
+{
+   GL_TH_ST(glProgramUniform2ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2ui))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2ui))orig_func)
+           (program, location, v0, v1);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3ui))(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3ui) orig_func;
+   GLuint program;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+   GLuint v2;
+
+} GL_TH_ST(glProgramUniform3ui);
+
+static void
+GL_TH_CB(glProgramUniform3ui)(void *data)
+{
+   GL_TH_ST(glProgramUniform3ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3ui))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform3ui))orig_func)
+           (program, location, v0, v1, v2);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4ui))(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4ui) orig_func;
+   GLuint program;
+   GLint location;
+   GLuint v0;
+   GLuint v1;
+   GLuint v2;
+   GLuint v3;
+
+} GL_TH_ST(glProgramUniform4ui);
+
+static void
+GL_TH_CB(glProgramUniform4ui)(void *data)
+{
+   GL_TH_ST(glProgramUniform4ui) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4ui))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4ui) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4ui))orig_func)
+           (program, location, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4ui) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4ui),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1f(GLuint program, GLint location, GLfloat v0);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1f))(GLuint program, GLint location, GLfloat v0);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1f) orig_func;
+   GLuint program;
+   GLint location;
+   GLfloat v0;
+
+} GL_TH_ST(glProgramUniform1f);
+
+static void
+GL_TH_CB(glProgramUniform1f)(void *data)
+{
+   GL_TH_ST(glProgramUniform1f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1f))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1f))orig_func)
+           (program, location, v0);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2f))(GLuint program, GLint location, GLfloat v0, GLfloat v1);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2f) orig_func;
+   GLuint program;
+   GLint location;
+   GLfloat v0;
+   GLfloat v1;
+
+} GL_TH_ST(glProgramUniform2f);
+
+static void
+GL_TH_CB(glProgramUniform2f)(void *data)
+{
+   GL_TH_ST(glProgramUniform2f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2f))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2f))orig_func)
+           (program, location, v0, v1);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3f))(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3f) orig_func;
+   GLuint program;
+   GLint location;
+   GLfloat v0;
+   GLfloat v1;
+   GLfloat v2;
+
+} GL_TH_ST(glProgramUniform3f);
+
+static void
+GL_TH_CB(glProgramUniform3f)(void *data)
+{
+   GL_TH_ST(glProgramUniform3f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3f))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform3f))orig_func)
+           (program, location, v0, v1, v2);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4f))(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4f) orig_func;
+   GLuint program;
+   GLint location;
+   GLfloat v0;
+   GLfloat v1;
+   GLfloat v2;
+   GLfloat v3;
+
+} GL_TH_ST(glProgramUniform4f);
+
+static void
+GL_TH_CB(glProgramUniform4f)(void *data)
+{
+   GL_TH_ST(glProgramUniform4f) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4f))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->v0,
+       thread_data->v1,
+       thread_data->v2,
+       thread_data->v3);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4f) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4f))orig_func)
+           (program, location, v0, v1, v2, v3);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4f) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->v0 = v0;
+   thread_data->v1 = v1;
+   thread_data->v2 = v2;
+   thread_data->v3 = v3;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4f),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1iv))(GLuint program, GLint location, GLsizei count, const GLint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1iv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLint *value;
+
+} GL_TH_ST(glProgramUniform1iv);
+
+static void
+GL_TH_CB(glProgramUniform1iv)(void *data)
+{
+   GL_TH_ST(glProgramUniform1iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1iv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1iv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1iv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2iv))(GLuint program, GLint location, GLsizei count, const GLint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2iv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLint *value;
+
+} GL_TH_ST(glProgramUniform2iv);
+
+static void
+GL_TH_CB(glProgramUniform2iv)(void *data)
+{
+   GL_TH_ST(glProgramUniform2iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2iv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2iv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2iv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3iv))(GLuint program, GLint location, GLsizei count, const GLint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3iv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLint *value;
+
+} GL_TH_ST(glProgramUniform3iv);
+
+static void
+GL_TH_CB(glProgramUniform3iv)(void *data)
+{
+   GL_TH_ST(glProgramUniform3iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3iv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform3iv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3iv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4iv))(GLuint program, GLint location, GLsizei count, const GLint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4iv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLint *value;
+
+} GL_TH_ST(glProgramUniform4iv);
+
+static void
+GL_TH_CB(glProgramUniform4iv)(void *data)
+{
+   GL_TH_ST(glProgramUniform4iv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4iv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4iv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4iv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4iv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4iv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1uiv))(GLuint program, GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1uiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glProgramUniform1uiv);
+
+static void
+GL_TH_CB(glProgramUniform1uiv)(void *data)
+{
+   GL_TH_ST(glProgramUniform1uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1uiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1uiv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2uiv))(GLuint program, GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2uiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glProgramUniform2uiv);
+
+static void
+GL_TH_CB(glProgramUniform2uiv)(void *data)
+{
+   GL_TH_ST(glProgramUniform2uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2uiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2uiv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
    thread_data->count = count;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2uiv),
+                              thread_mode);
+}
 
-   /* copy variable */
-   if (value)
+/*
+ * void
+ * glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3uiv))(GLuint program, GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3uiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glProgramUniform3uiv);
+
+static void
+GL_TH_CB(glProgramUniform3uiv)(void *data)
+{
+   GL_TH_ST(glProgramUniform3uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3uiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 2 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glProgramUniform3uiv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4uiv))(GLuint program, GLint location, GLsizei count, const GLuint *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4uiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLuint *value;
+
+} GL_TH_ST(glProgramUniform4uiv);
+
+static void
+GL_TH_CB(glProgramUniform4uiv)(void *data)
+{
+   GL_TH_ST(glProgramUniform4uiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4uiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4uiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4uiv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4uiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4uiv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform1fv))(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform1fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniform1fv);
+
+static void
+GL_TH_CB(glProgramUniform1fv)(void *data)
+{
+   GL_TH_ST(glProgramUniform1fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform1fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform1fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform1fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform1fv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform1fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform1fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform2fv))(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform2fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniform2fv);
+
+static void
+GL_TH_CB(glProgramUniform2fv)(void *data)
+{
+   GL_TH_ST(glProgramUniform2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform2fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform2fv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform2fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform3fv))(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform3fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniform3fv);
+
+static void
+GL_TH_CB(glProgramUniform3fv)(void *data)
+{
+   GL_TH_ST(glProgramUniform3fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform3fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform3fv))orig_func)
+           (program, location, count, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniform4fv))(GLuint program, GLint location, GLsizei count, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniform4fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniform4fv);
+
+static void
+GL_TH_CB(glProgramUniform4fv)(void *data)
+{
+   GL_TH_ST(glProgramUniform4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniform4fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniform4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniform4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniform4fv))orig_func)
+           (program, location, count, value);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniform4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform2iv,
-                              thread_data,
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniform4fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform3fv(GLint location, GLsizei count, const GLfloat *value);
+ * glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix2fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix2fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
+   GLboolean transpose;
    const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
 
-} Evas_Thread_Command_glUniform3fv;
+} GL_TH_ST(glProgramUniformMatrix2fv);
 
 static void
-_gl_thread_glUniform3fv(void *data)
+GL_TH_CB(glProgramUniformMatrix2fv)(void *data)
 {
-   Evas_Thread_Command_glUniform3fv *thread_data =
-      (Evas_Thread_Command_glUniform3fv *)data;
-
-   glUniform3fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
+   GL_TH_ST(glProgramUniformMatrix2fv) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+   ((GL_TH_FNTYPE(glProgramUniformMatrix2fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform3fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
+void
+GL_TH_FN(glProgramUniformMatrix2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform3fv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform3fv thread_data_local;
-   Evas_Thread_Command_glUniform3fv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix2fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
+   thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform3fv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix2fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform3iv(GLint location, GLsizei count, const GLint *value);
+ * glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix3fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix3fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GLboolean transpose;
+   const GLfloat *value;
 
-} Evas_Thread_Command_glUniform3iv;
+} GL_TH_ST(glProgramUniformMatrix3fv);
 
 static void
-_gl_thread_glUniform3iv(void *data)
+GL_TH_CB(glProgramUniformMatrix3fv)(void *data)
 {
-   Evas_Thread_Command_glUniform3iv *thread_data =
-      (Evas_Thread_Command_glUniform3iv *)data;
+   GL_TH_ST(glProgramUniformMatrix3fv) *thread_data =
+      *(void **)data;
 
-   glUniform3iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
 
+   ((GL_TH_FNTYPE(glProgramUniformMatrix3fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform3iv_thread_cmd(GLint location, GLsizei count, const GLint *value)
+void
+GL_TH_FN(glProgramUniformMatrix3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform3iv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform3iv thread_data_local;
-   Evas_Thread_Command_glUniform3iv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform3iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform3iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix3fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
+   thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix3fv),
+                              thread_mode);
+}
 
-   /* copy variable */
-   if (value)
+/*
+ * void
+ * glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix4fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniformMatrix4fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniformMatrix4fv);
+
+static void
+GL_TH_CB(glProgramUniformMatrix4fv)(void *data)
+{
+   GL_TH_ST(glProgramUniformMatrix4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniformMatrix4fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniformMatrix4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniformMatrix4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 3 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glProgramUniformMatrix4fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform3iv,
-                              thread_data,
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix4fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform4fv(GLint location, GLsizei count, const GLfloat *value);
+ * glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix2x3fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix2x3fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
+   GLboolean transpose;
    const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
 
-} Evas_Thread_Command_glUniform4fv;
+} GL_TH_ST(glProgramUniformMatrix2x3fv);
 
 static void
-_gl_thread_glUniform4fv(void *data)
+GL_TH_CB(glProgramUniformMatrix2x3fv)(void *data)
 {
-   Evas_Thread_Command_glUniform4fv *thread_data =
-      (Evas_Thread_Command_glUniform4fv *)data;
-
-   glUniform4fv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
+   GL_TH_ST(glProgramUniformMatrix2x3fv) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+   ((GL_TH_FNTYPE(glProgramUniformMatrix2x3fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform4fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value)
+void
+GL_TH_FN(glProgramUniformMatrix2x3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniformMatrix2x3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUniform4fv(location, count, value);
+        ((GL_TH_FNTYPE(glProgramUniformMatrix2x3fv))orig_func)
+           (program, location, count, transpose, value);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix2x3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix2x3fv),
+                              thread_mode);
+}
+
+/*
+ * void
+ * glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix3x2fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniformMatrix3x2fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniformMatrix3x2fv);
+
+static void
+GL_TH_CB(glProgramUniformMatrix3x2fv)(void *data)
+{
+   GL_TH_ST(glProgramUniformMatrix3x2fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniformMatrix3x2fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
 
+void
+GL_TH_FN(glProgramUniformMatrix3x2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform4fv thread_data_local;
-   Evas_Thread_Command_glUniform4fv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix3x2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix3x2fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix3x2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
+   thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix3x2fv),
+                              thread_mode);
+}
 
-   /* copy variable */
-   if (value)
+/*
+ * void
+ * glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ */
+
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix2x4fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glProgramUniformMatrix2x4fv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei count;
+   GLboolean transpose;
+   const GLfloat *value;
+
+} GL_TH_ST(glProgramUniformMatrix2x4fv);
+
+static void
+GL_TH_CB(glProgramUniformMatrix2x4fv)(void *data)
+{
+   GL_TH_ST(glProgramUniformMatrix2x4fv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glProgramUniformMatrix2x4fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
+
+}
+
+void
+GL_TH_FN(glProgramUniformMatrix2x4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glProgramUniformMatrix2x4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glProgramUniformMatrix2x4fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix2x4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->count = count;
+   thread_data->transpose = transpose;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform4fv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix2x4fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniform4iv(GLint location, GLsizei count, const GLint *value);
+ * glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix4x2fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix4x2fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
-   const GLint *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GLboolean transpose;
+   const GLfloat *value;
 
-} Evas_Thread_Command_glUniform4iv;
+} GL_TH_ST(glProgramUniformMatrix4x2fv);
 
 static void
-_gl_thread_glUniform4iv(void *data)
+GL_TH_CB(glProgramUniformMatrix4x2fv)(void *data)
 {
-   Evas_Thread_Command_glUniform4iv *thread_data =
-      (Evas_Thread_Command_glUniform4iv *)data;
+   GL_TH_ST(glProgramUniformMatrix4x2fv) *thread_data =
+      *(void **)data;
 
-   glUniform4iv(thread_data->location,
-                thread_data->count,
-                thread_data->value);
 
+   ((GL_TH_FNTYPE(glProgramUniformMatrix4x2fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniform4iv_thread_cmd(GLint location, GLsizei count, const GLint *value)
+void
+GL_TH_FN(glProgramUniformMatrix4x2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniform4iv(location, count, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniform4iv thread_data_local;
-   Evas_Thread_Command_glUniform4iv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix4x2fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniform4iv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniform4iv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix4x2fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix4x2fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
+   thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLint);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLint  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniform4iv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix4x2fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ * glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix3x4fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix3x4fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
    GLboolean transpose;
    const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
 
-} Evas_Thread_Command_glUniformMatrix2fv;
+} GL_TH_ST(glProgramUniformMatrix3x4fv);
 
 static void
-_gl_thread_glUniformMatrix2fv(void *data)
+GL_TH_CB(glProgramUniformMatrix3x4fv)(void *data)
 {
-   Evas_Thread_Command_glUniformMatrix2fv *thread_data =
-      (Evas_Thread_Command_glUniformMatrix2fv *)data;
+   GL_TH_ST(glProgramUniformMatrix3x4fv) *thread_data =
+      *(void **)data;
 
-   glUniformMatrix2fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
 
+   ((GL_TH_FNTYPE(glProgramUniformMatrix3x4fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniformMatrix2fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+void
+GL_TH_FN(glProgramUniformMatrix3x4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniformMatrix2fv(location, count, transpose, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniformMatrix2fv thread_data_local;
-   Evas_Thread_Command_glUniformMatrix2fv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix3x4fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniformMatrix2fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniformMatrix2fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix3x4fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix3x4fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
    thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   /* copy variable */
-   if (value)
-     {
-        /* 1. check memory size */
-        unsigned int copy_size = 4 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
-     }
-   /* end of copy variable */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniformMatrix2fv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix3x4fv),
                               thread_mode);
 }
 
 /*
  * void
- * glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ * glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  */
 
+typedef void(*GL_TH_FNTYPE(glProgramUniformMatrix4x3fv))(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glProgramUniformMatrix4x3fv) orig_func;
+   GLuint program;
    GLint location;
    GLsizei count;
    GLboolean transpose;
    const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
 
-} Evas_Thread_Command_glUniformMatrix3fv;
+} GL_TH_ST(glProgramUniformMatrix4x3fv);
 
 static void
-_gl_thread_glUniformMatrix3fv(void *data)
+GL_TH_CB(glProgramUniformMatrix4x3fv)(void *data)
 {
-   Evas_Thread_Command_glUniformMatrix3fv *thread_data =
-      (Evas_Thread_Command_glUniformMatrix3fv *)data;
-
-   glUniformMatrix3fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
+   GL_TH_ST(glProgramUniformMatrix4x3fv) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
+   ((GL_TH_FNTYPE(glProgramUniformMatrix4x3fv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->count,
+       thread_data->transpose,
+       thread_data->value);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniformMatrix3fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+void
+GL_TH_FN(glProgramUniformMatrix4x3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glUniformMatrix3fv(location, count, transpose, value);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glUniformMatrix3fv thread_data_local;
-   Evas_Thread_Command_glUniformMatrix3fv *thread_data = &thread_data_local;
+   GL_TH_ST(glProgramUniformMatrix4x3fv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniformMatrix3fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniformMatrix3fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glProgramUniformMatrix4x3fv))orig_func)
+           (program, location, count, transpose, value);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glProgramUniformMatrix4x3fv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->program = program;
    thread_data->location = location;
    thread_data->count = count;
    thread_data->transpose = transpose;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glProgramUniformMatrix4x3fv),
+                              thread_mode);
+}
 
-   /* copy variable */
-   if (value)
+/*
+ * void
+ * glValidateProgramPipeline(GLuint pipeline);
+ */
+
+typedef void(*GL_TH_FNTYPE(glValidateProgramPipeline))(GLuint pipeline);
+
+typedef struct
+{
+   GL_TH_FNTYPE(glValidateProgramPipeline) orig_func;
+   GLuint pipeline;
+
+} GL_TH_ST(glValidateProgramPipeline);
+
+static void
+GL_TH_CB(glValidateProgramPipeline)(void *data)
+{
+   GL_TH_ST(glValidateProgramPipeline) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glValidateProgramPipeline))thread_data->orig_func)
+      (thread_data->pipeline);
+
+}
+
+void
+GL_TH_FN(glValidateProgramPipeline)(GL_TH_DP, GLuint pipeline)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glValidateProgramPipeline) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 9 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glValidateProgramPipeline))orig_func)
+           (pipeline);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glValidateProgramPipeline) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniformMatrix3fv,
-                              thread_data,
+   thread_data->pipeline = pipeline;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glValidateProgramPipeline),
                               thread_mode);
 }
 
 /*
  * void
- * glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+ * glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetProgramPipelineInfoLog))(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+
 typedef struct
 {
-   GLint location;
-   GLsizei count;
-   GLboolean transpose;
-   const GLfloat *value;
-   void *value_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glGetProgramPipelineInfoLog) orig_func;
+   GLuint pipeline;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLchar *infoLog;
 
-} Evas_Thread_Command_glUniformMatrix4fv;
+} GL_TH_ST(glGetProgramPipelineInfoLog);
 
 static void
-_gl_thread_glUniformMatrix4fv(void *data)
+GL_TH_CB(glGetProgramPipelineInfoLog)(void *data)
 {
-   Evas_Thread_Command_glUniformMatrix4fv *thread_data =
-      (Evas_Thread_Command_glUniformMatrix4fv *)data;
+   GL_TH_ST(glGetProgramPipelineInfoLog) *thread_data =
+      *(void **)data;
 
-   glUniformMatrix4fv(thread_data->location,
-                      thread_data->count,
-                      thread_data->transpose,
-                      thread_data->value);
 
+   ((GL_TH_FNTYPE(glGetProgramPipelineInfoLog))thread_data->orig_func)
+      (thread_data->pipeline,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->infoLog);
 
-   if (thread_data->value_copied)
-     eina_mempool_free(_mp_uniform, thread_data->value_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glUniformMatrix4fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+void
+GL_TH_FN(glGetProgramPipelineInfoLog)(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetProgramPipelineInfoLog) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glUniformMatrix4fv(location, count, transpose, value);
+        ((GL_TH_FNTYPE(glGetProgramPipelineInfoLog))orig_func)
+           (pipeline, bufSize, length, infoLog);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetProgramPipelineInfoLog) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   thread_data->pipeline = pipeline;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->infoLog = infoLog;
+   thread_data->orig_func = orig_func;
 
-   Evas_Thread_Command_glUniformMatrix4fv thread_data_local;
-   Evas_Thread_Command_glUniformMatrix4fv *thread_data = &thread_data_local;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetProgramPipelineInfoLog),
+                              thread_mode);
+}
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+/*
+ * void
+ * glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+ */
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glUniformMatrix4fv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glUniformMatrix4fv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+typedef void(*GL_TH_FNTYPE(glBindImageTexture))(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
 
-   thread_data->location = location;
-   thread_data->count = count;
-   thread_data->transpose = transpose;
-   thread_data->value = value;
+typedef struct
+{
+   GL_TH_FNTYPE(glBindImageTexture) orig_func;
+   GLuint unit;
+   GLuint texture;
+   GLint level;
+   GLboolean layered;
+   GLint layer;
+   GLenum access;
+   GLenum format;
 
-   thread_data->value_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+} GL_TH_ST(glBindImageTexture);
 
-   /* copy variable */
-   if (value)
+static void
+GL_TH_CB(glBindImageTexture)(void *data)
+{
+   GL_TH_ST(glBindImageTexture) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBindImageTexture))thread_data->orig_func)
+      (thread_data->unit,
+       thread_data->texture,
+       thread_data->level,
+       thread_data->layered,
+       thread_data->layer,
+       thread_data->access,
+       thread_data->format);
+
+}
+
+void
+GL_TH_FN(glBindImageTexture)(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBindImageTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = 16 * count * sizeof(GLfloat);
-        if (copy_size > _mp_uniform_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->value_copied = eina_mempool_malloc(_mp_uniform, copy_size);
-        if (thread_data->value_copied)
-          {
-             memcpy(thread_data->value_copied, value, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->value = (const GLfloat  *)thread_data->value_copied;
+        ((GL_TH_FNTYPE(glBindImageTexture))orig_func)
+           (unit, texture, level, layered, layer, access, format);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindImageTexture) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glUniformMatrix4fv,
-                              thread_data,
+   thread_data->unit = unit;
+   thread_data->texture = texture;
+   thread_data->level = level;
+   thread_data->layered = layered;
+   thread_data->layer = layer;
+   thread_data->access = access;
+   thread_data->format = format;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindImageTexture),
                               thread_mode);
 }
 
 /*
  * void
- * glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+ * glGetBooleani_v(GLenum target, GLuint index, GLboolean *data);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetBooleani_v))(GLenum target, GLuint index, GLboolean *data);
+
 typedef struct
 {
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
+   GL_TH_FNTYPE(glGetBooleani_v) orig_func;
+   GLenum target;
+   GLuint index;
+   GLboolean *data;
 
-} Evas_Thread_Command_glViewport;
+} GL_TH_ST(glGetBooleani_v);
 
 static void
-_gl_thread_glViewport(void *data)
+GL_TH_CB(glGetBooleani_v)(void *data)
 {
-   Evas_Thread_Command_glViewport *thread_data =
-      (Evas_Thread_Command_glViewport *)data;
+   GL_TH_ST(glGetBooleani_v) *thread_data =
+      *(void **)data;
+
 
-   glViewport(thread_data->x,
-              thread_data->y,
-              thread_data->width,
-              thread_data->height);
+   ((GL_TH_FNTYPE(glGetBooleani_v))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index,
+       thread_data->data);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glViewport_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
+void
+GL_TH_FN(glGetBooleani_v)(GL_TH_DP, GLenum target, GLuint index, GLboolean *data)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glViewport(x, y, width, height);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glViewport thread_data_local;
-   Evas_Thread_Command_glViewport *thread_data = &thread_data_local;
+   GL_TH_ST(glGetBooleani_v) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glViewport *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glViewport));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetBooleani_v))orig_func)
+           (target, index, data);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetBooleani_v) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glViewport,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetBooleani_v),
                               thread_mode);
 }
 
 /*
  * void
- * glEnable(GLenum cap);
+ * glMemoryBarrier(GLbitfield barriers);
  */
 
+typedef void(*GL_TH_FNTYPE(glMemoryBarrier))(GLbitfield barriers);
+
 typedef struct
 {
-   GLenum cap;
-   int command_allocated;
+   GL_TH_FNTYPE(glMemoryBarrier) orig_func;
+   GLbitfield barriers;
 
-} Evas_Thread_Command_glEnable;
+} GL_TH_ST(glMemoryBarrier);
 
 static void
-_gl_thread_glEnable(void *data)
+GL_TH_CB(glMemoryBarrier)(void *data)
 {
-   Evas_Thread_Command_glEnable *thread_data =
-      (Evas_Thread_Command_glEnable *)data;
+   GL_TH_ST(glMemoryBarrier) *thread_data =
+      *(void **)data;
 
-   glEnable(thread_data->cap);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glMemoryBarrier))thread_data->orig_func)
+      (thread_data->barriers);
+
 }
 
-EAPI void
-glEnable_thread_cmd(GLenum cap)
+void
+GL_TH_FN(glMemoryBarrier)(GL_TH_DP, GLbitfield barriers)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glEnable(cap);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glEnable thread_data_local;
-   Evas_Thread_Command_glEnable *thread_data = &thread_data_local;
+   GL_TH_ST(glMemoryBarrier) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glEnable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glEnable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_ENQUEUE;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMemoryBarrier))orig_func)
+           (barriers);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMemoryBarrier) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->cap = cap;
+   thread_data->barriers = barriers;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glEnable,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMemoryBarrier),
                               thread_mode);
 }
 
 /*
  * void
- * glDisable(GLenum cap);
+ * glMemoryBarrierByRegion(GLbitfield barriers);
  */
 
+typedef void(*GL_TH_FNTYPE(glMemoryBarrierByRegion))(GLbitfield barriers);
+
 typedef struct
 {
-   GLenum cap;
-   int command_allocated;
+   GL_TH_FNTYPE(glMemoryBarrierByRegion) orig_func;
+   GLbitfield barriers;
 
-} Evas_Thread_Command_glDisable;
+} GL_TH_ST(glMemoryBarrierByRegion);
 
 static void
-_gl_thread_glDisable(void *data)
+GL_TH_CB(glMemoryBarrierByRegion)(void *data)
 {
-   Evas_Thread_Command_glDisable *thread_data =
-      (Evas_Thread_Command_glDisable *)data;
+   GL_TH_ST(glMemoryBarrierByRegion) *thread_data =
+      *(void **)data;
+
 
-   glDisable(thread_data->cap);
+   ((GL_TH_FNTYPE(glMemoryBarrierByRegion))thread_data->orig_func)
+      (thread_data->barriers);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDisable_thread_cmd(GLenum cap)
+void
+GL_TH_FN(glMemoryBarrierByRegion)(GL_TH_DP, GLbitfield barriers)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDisable(cap);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDisable thread_data_local;
-   Evas_Thread_Command_glDisable *thread_data = &thread_data_local;
+   GL_TH_ST(glMemoryBarrierByRegion) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDisable *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDisable));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_ENQUEUE;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glMemoryBarrierByRegion))orig_func)
+           (barriers);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMemoryBarrierByRegion) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->cap = cap;
+   thread_data->barriers = barriers;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDisable,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMemoryBarrierByRegion),
                               thread_mode);
 }
 
 /*
  * void
- * glLineWidth(GLfloat width);
+ * glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexStorage2DMultisample))(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+
 typedef struct
 {
-   GLfloat width;
-   int command_allocated;
+   GL_TH_FNTYPE(glTexStorage2DMultisample) orig_func;
+   GLenum target;
+   GLsizei samples;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLboolean fixedsamplelocations;
 
-} Evas_Thread_Command_glLineWidth;
+} GL_TH_ST(glTexStorage2DMultisample);
 
 static void
-_gl_thread_glLineWidth(void *data)
+GL_TH_CB(glTexStorage2DMultisample)(void *data)
 {
-   Evas_Thread_Command_glLineWidth *thread_data =
-      (Evas_Thread_Command_glLineWidth *)data;
+   GL_TH_ST(glTexStorage2DMultisample) *thread_data =
+      *(void **)data;
+
 
-   glLineWidth(thread_data->width);
+   ((GL_TH_FNTYPE(glTexStorage2DMultisample))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->samples,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->fixedsamplelocations);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glLineWidth_thread_cmd(GLfloat width)
+void
+GL_TH_FN(glTexStorage2DMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glLineWidth(width);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glLineWidth thread_data_local;
-   Evas_Thread_Command_glLineWidth *thread_data = &thread_data_local;
+   GL_TH_ST(glTexStorage2DMultisample) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glLineWidth *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glLineWidth));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexStorage2DMultisample))orig_func)
+           (target, samples, internalformat, width, height, fixedsamplelocations);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage2DMultisample) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->target = target;
+   thread_data->samples = samples;
+   thread_data->internalformat = internalformat;
    thread_data->width = width;
+   thread_data->height = height;
+   thread_data->fixedsamplelocations = fixedsamplelocations;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glLineWidth,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage2DMultisample),
                               thread_mode);
 }
 
 /*
  * void
- * glPolygonOffset(GLfloat factor, GLfloat units);
+ * glGetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetMultisamplefv))(GLenum pname, GLuint index, GLfloat *val);
+
 typedef struct
 {
-   GLfloat factor;
-   GLfloat units;
-   int command_allocated;
+   GL_TH_FNTYPE(glGetMultisamplefv) orig_func;
+   GLenum pname;
+   GLuint index;
+   GLfloat *val;
 
-} Evas_Thread_Command_glPolygonOffset;
+} GL_TH_ST(glGetMultisamplefv);
 
 static void
-_gl_thread_glPolygonOffset(void *data)
+GL_TH_CB(glGetMultisamplefv)(void *data)
 {
-   Evas_Thread_Command_glPolygonOffset *thread_data =
-      (Evas_Thread_Command_glPolygonOffset *)data;
+   GL_TH_ST(glGetMultisamplefv) *thread_data =
+      *(void **)data;
 
-   glPolygonOffset(thread_data->factor,
-                   thread_data->units);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glGetMultisamplefv))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->index,
+       thread_data->val);
+
 }
 
-EAPI void
-glPolygonOffset_thread_cmd(GLfloat factor, GLfloat units)
+void
+GL_TH_FN(glGetMultisamplefv)(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glPolygonOffset(factor, units);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glPolygonOffset thread_data_local;
-   Evas_Thread_Command_glPolygonOffset *thread_data = &thread_data_local;
+   GL_TH_ST(glGetMultisamplefv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glPolygonOffset *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glPolygonOffset));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetMultisamplefv))orig_func)
+           (pname, index, val);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetMultisamplefv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->factor = factor;
-   thread_data->units = units;
+   thread_data->pname = pname;
+   thread_data->index = index;
+   thread_data->val = val;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glPolygonOffset,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetMultisamplefv),
                               thread_mode);
 }
 
 /*
  * void
- * glPixelStorei(GLenum pname, GLint param);
+ * glSampleMaski(GLuint maskNumber, GLbitfield mask);
  */
 
+typedef void(*GL_TH_FNTYPE(glSampleMaski))(GLuint maskNumber, GLbitfield mask);
+
 typedef struct
 {
-   GLenum pname;
-   GLint param;
-   int command_allocated;
+   GL_TH_FNTYPE(glSampleMaski) orig_func;
+   GLuint maskNumber;
+   GLbitfield mask;
 
-} Evas_Thread_Command_glPixelStorei;
+} GL_TH_ST(glSampleMaski);
 
 static void
-_gl_thread_glPixelStorei(void *data)
+GL_TH_CB(glSampleMaski)(void *data)
 {
-   Evas_Thread_Command_glPixelStorei *thread_data =
-      (Evas_Thread_Command_glPixelStorei *)data;
+   GL_TH_ST(glSampleMaski) *thread_data =
+      *(void **)data;
 
-   glPixelStorei(thread_data->pname,
-                 thread_data->param);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glSampleMaski))thread_data->orig_func)
+      (thread_data->maskNumber,
+       thread_data->mask);
+
 }
 
-EAPI void
-glPixelStorei_thread_cmd(GLenum pname, GLint param)
+void
+GL_TH_FN(glSampleMaski)(GL_TH_DP, GLuint maskNumber, GLbitfield mask)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glPixelStorei(pname, param);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glPixelStorei thread_data_local;
-   Evas_Thread_Command_glPixelStorei *thread_data = &thread_data_local;
+   GL_TH_ST(glSampleMaski) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glPixelStorei *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glPixelStorei));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glSampleMaski))orig_func)
+           (maskNumber, mask);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSampleMaski) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->pname = pname;
-   thread_data->param = param;
+   thread_data->maskNumber = maskNumber;
+   thread_data->mask = mask;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glPixelStorei,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSampleMaski),
                               thread_mode);
 }
 
 /*
  * void
- * glActiveTexture(GLenum texture);
+ * glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetTexLevelParameteriv))(GLenum target, GLint level, GLenum pname, GLint *params);
+
 typedef struct
 {
-   GLenum texture;
+   GL_TH_FNTYPE(glGetTexLevelParameteriv) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum pname;
+   GLint *params;
 
-} Evas_Thread_Command_glActiveTexture;
+} GL_TH_ST(glGetTexLevelParameteriv);
 
 static void
-_gl_thread_glActiveTexture(void *data)
+GL_TH_CB(glGetTexLevelParameteriv)(void *data)
 {
-   Evas_Thread_Command_glActiveTexture *thread_data =
-      (Evas_Thread_Command_glActiveTexture *)data;
+   GL_TH_ST(glGetTexLevelParameteriv) *thread_data =
+      *(void **)data;
 
-   glActiveTexture(thread_data->texture);
+
+   ((GL_TH_FNTYPE(glGetTexLevelParameteriv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glActiveTexture_thread_cmd(GLenum texture)
+void
+GL_TH_FN(glGetTexLevelParameteriv)(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexLevelParameteriv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glActiveTexture(texture);
+        ((GL_TH_FNTYPE(glGetTexLevelParameteriv))orig_func)
+           (target, level, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexLevelParameteriv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glActiveTexture thread_data_local;
-   Evas_Thread_Command_glActiveTexture *thread_data = &thread_data_local;
-
-   thread_data->texture = texture;
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glActiveTexture,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexLevelParameteriv),
                               thread_mode);
 }
 
 /*
  * void
- * glGenTextures(GLsizei n, GLuint *textures);
+ * glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetTexLevelParameterfv))(GLenum target, GLint level, GLenum pname, GLfloat *params);
+
 typedef struct
 {
-   GLsizei n;
-   GLuint *textures;
+   GL_TH_FNTYPE(glGetTexLevelParameterfv) orig_func;
+   GLenum target;
+   GLint level;
+   GLenum pname;
+   GLfloat *params;
 
-} Evas_Thread_Command_glGenTextures;
+} GL_TH_ST(glGetTexLevelParameterfv);
 
 static void
-_gl_thread_glGenTextures(void *data)
+GL_TH_CB(glGetTexLevelParameterfv)(void *data)
 {
-   Evas_Thread_Command_glGenTextures *thread_data =
-      (Evas_Thread_Command_glGenTextures *)data;
+   GL_TH_ST(glGetTexLevelParameterfv) *thread_data =
+      *(void **)data;
 
-   glGenTextures(thread_data->n,
-                 thread_data->textures);
+
+   ((GL_TH_FNTYPE(glGetTexLevelParameterfv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->level,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glGenTextures_thread_cmd(GLsizei n, GLuint *textures)
+void
+GL_TH_FN(glGetTexLevelParameterfv)(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexLevelParameterfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGenTextures(n, textures);
+        ((GL_TH_FNTYPE(glGetTexLevelParameterfv))orig_func)
+           (target, level, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexLevelParameterfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGenTextures thread_data_local;
-   Evas_Thread_Command_glGenTextures *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->textures = textures;
+   thread_data->target = target;
+   thread_data->level = level;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGenTextures,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexLevelParameterfv),
                               thread_mode);
 }
 
 /*
  * void
- * glBindTexture(GLenum target, GLuint texture);
+ * glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
  */
 
+typedef void(*GL_TH_FNTYPE(glBindVertexBuffer))(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+
 typedef struct
 {
-   GLenum target;
-   GLuint texture;
-   int command_allocated;
+   GL_TH_FNTYPE(glBindVertexBuffer) orig_func;
+   GLuint bindingindex;
+   GLuint buffer;
+   GLintptr offset;
+   GLsizei stride;
 
-} Evas_Thread_Command_glBindTexture;
+} GL_TH_ST(glBindVertexBuffer);
 
 static void
-_gl_thread_glBindTexture(void *data)
+GL_TH_CB(glBindVertexBuffer)(void *data)
 {
-   Evas_Thread_Command_glBindTexture *thread_data =
-      (Evas_Thread_Command_glBindTexture *)data;
+   GL_TH_ST(glBindVertexBuffer) *thread_data =
+      *(void **)data;
+
 
-   glBindTexture(thread_data->target,
-                 thread_data->texture);
+   ((GL_TH_FNTYPE(glBindVertexBuffer))thread_data->orig_func)
+      (thread_data->bindingindex,
+       thread_data->buffer,
+       thread_data->offset,
+       thread_data->stride);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glBindTexture_thread_cmd(GLenum target, GLuint texture)
+void
+GL_TH_FN(glBindVertexBuffer)(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glBindTexture(target, texture);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glBindTexture thread_data_local;
-   Evas_Thread_Command_glBindTexture *thread_data = &thread_data_local;
+   GL_TH_ST(glBindVertexBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glBindTexture *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glBindTexture));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBindVertexBuffer))orig_func)
+           (bindingindex, buffer, offset, stride);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBindVertexBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->texture = texture;
+   thread_data->bindingindex = bindingindex;
+   thread_data->buffer = buffer;
+   thread_data->offset = offset;
+   thread_data->stride = stride;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBindTexture,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBindVertexBuffer),
                               thread_mode);
 }
 
 /*
  * void
- * glDeleteTextures(GLsizei n, const GLuint *textures);
+ * glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
  */
 
+typedef void(*GL_TH_FNTYPE(glVertexAttribFormat))(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+
 typedef struct
 {
-   GLsizei n;
-   const GLuint *textures;
-   void *textures_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glVertexAttribFormat) orig_func;
+   GLuint attribindex;
+   GLint size;
+   GLenum type;
+   GLboolean normalized;
+   GLuint relativeoffset;
 
-} Evas_Thread_Command_glDeleteTextures;
+} GL_TH_ST(glVertexAttribFormat);
 
 static void
-_gl_thread_glDeleteTextures(void *data)
+GL_TH_CB(glVertexAttribFormat)(void *data)
 {
-   Evas_Thread_Command_glDeleteTextures *thread_data =
-      (Evas_Thread_Command_glDeleteTextures *)data;
+   GL_TH_ST(glVertexAttribFormat) *thread_data =
+      *(void **)data;
 
-   glDeleteTextures(thread_data->n,
-                    thread_data->textures);
 
+   ((GL_TH_FNTYPE(glVertexAttribFormat))thread_data->orig_func)
+      (thread_data->attribindex,
+       thread_data->size,
+       thread_data->type,
+       thread_data->normalized,
+       thread_data->relativeoffset);
 
-   if (thread_data->textures_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->textures_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDeleteTextures_thread_cmd(GLsizei n, const GLuint *textures)
+void
+GL_TH_FN(glVertexAttribFormat)(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribFormat) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glDeleteTextures(n, textures);
+        ((GL_TH_FNTYPE(glVertexAttribFormat))orig_func)
+           (attribindex, size, type, normalized, relativeoffset);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribFormat) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   thread_data->attribindex = attribindex;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->normalized = normalized;
+   thread_data->relativeoffset = relativeoffset;
+   thread_data->orig_func = orig_func;
 
-   Evas_Thread_Command_glDeleteTextures thread_data_local;
-   Evas_Thread_Command_glDeleteTextures *thread_data = &thread_data_local;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribFormat),
+                              thread_mode);
+}
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+/*
+ * void
+ * glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+ */
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteTextures *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteTextures));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+typedef void(*GL_TH_FNTYPE(glVertexAttribIFormat))(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
 
-   thread_data->n = n;
-   thread_data->textures = textures;
+typedef struct
+{
+   GL_TH_FNTYPE(glVertexAttribIFormat) orig_func;
+   GLuint attribindex;
+   GLint size;
+   GLenum type;
+   GLuint relativeoffset;
 
-   thread_data->textures_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+} GL_TH_ST(glVertexAttribIFormat);
 
-   /* copy variable */
-   if (textures)
+static void
+GL_TH_CB(glVertexAttribIFormat)(void *data)
+{
+   GL_TH_ST(glVertexAttribIFormat) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glVertexAttribIFormat))thread_data->orig_func)
+      (thread_data->attribindex,
+       thread_data->size,
+       thread_data->type,
+       thread_data->relativeoffset);
+
+}
+
+void
+GL_TH_FN(glVertexAttribIFormat)(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glVertexAttribIFormat) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->textures_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->textures_copied)
-          {
-             memcpy(thread_data->textures_copied, textures, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->textures = (const GLuint  *)thread_data->textures_copied;
+        ((GL_TH_FNTYPE(glVertexAttribIFormat))orig_func)
+           (attribindex, size, type, relativeoffset);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribIFormat) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteTextures,
-                              thread_data,
+   thread_data->attribindex = attribindex;
+   thread_data->size = size;
+   thread_data->type = type;
+   thread_data->relativeoffset = relativeoffset;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribIFormat),
                               thread_mode);
 }
 
 /*
  * void
- * glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+ * glVertexAttribBinding(GLuint attribindex, GLuint bindingindex);
  */
 
+typedef void(*GL_TH_FNTYPE(glVertexAttribBinding))(GLuint attribindex, GLuint bindingindex);
+
 typedef struct
 {
-   GLenum target;
-   GLint level;
-   GLint internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLenum format;
-   GLenum type;
-   const void *pixels;
-   int command_allocated;
-   GLTEXIMAGE2D_COPY_VARIABLE; /* TODO */
+   GL_TH_FNTYPE(glVertexAttribBinding) orig_func;
+   GLuint attribindex;
+   GLuint bindingindex;
 
-} Evas_Thread_Command_glTexImage2D;
+} GL_TH_ST(glVertexAttribBinding);
 
 static void
-_gl_thread_glTexImage2D(void *data)
+GL_TH_CB(glVertexAttribBinding)(void *data)
 {
-   Evas_Thread_Command_glTexImage2D *thread_data =
-      (Evas_Thread_Command_glTexImage2D *)data;
+   GL_TH_ST(glVertexAttribBinding) *thread_data =
+      *(void **)data;
 
-   glTexImage2D(thread_data->target,
-                thread_data->level,
-                thread_data->internalformat,
-                thread_data->width,
-                thread_data->height,
-                thread_data->border,
-                thread_data->format,
-                thread_data->type,
-                thread_data->pixels);
 
-   GLTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
+   ((GL_TH_FNTYPE(glVertexAttribBinding))thread_data->orig_func)
+      (thread_data->attribindex,
+       thread_data->bindingindex);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glTexImage2D_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)
+void
+GL_TH_FN(glVertexAttribBinding)(GL_TH_DP, GLuint attribindex, GLuint bindingindex)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexImage2D thread_data_local;
-   Evas_Thread_Command_glTexImage2D *thread_data = &thread_data_local;
+   GL_TH_ST(glVertexAttribBinding) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexAttribBinding))orig_func)
+           (attribindex, bindingindex);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexAttribBinding) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
+   thread_data->attribindex = attribindex;
+   thread_data->bindingindex = bindingindex;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexImage2D,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexAttribBinding),
                               thread_mode);
 }
 
 /*
  * void
- * glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+ * glVertexBindingDivisor(GLuint bindingindex, GLuint divisor);
  */
 
+typedef void(*GL_TH_FNTYPE(glVertexBindingDivisor))(GLuint bindingindex, GLuint divisor);
+
 typedef struct
 {
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   const void *pixels;
-   int command_allocated;
-   GLTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
+   GL_TH_FNTYPE(glVertexBindingDivisor) orig_func;
+   GLuint bindingindex;
+   GLuint divisor;
 
-} Evas_Thread_Command_glTexSubImage2D;
+} GL_TH_ST(glVertexBindingDivisor);
 
 static void
-_gl_thread_glTexSubImage2D(void *data)
+GL_TH_CB(glVertexBindingDivisor)(void *data)
 {
-   Evas_Thread_Command_glTexSubImage2D *thread_data =
-      (Evas_Thread_Command_glTexSubImage2D *)data;
+   GL_TH_ST(glVertexBindingDivisor) *thread_data =
+      *(void **)data;
 
-   glTexSubImage2D(thread_data->target,
-                   thread_data->level,
-                   thread_data->xoffset,
-                   thread_data->yoffset,
-                   thread_data->width,
-                   thread_data->height,
-                   thread_data->format,
-                   thread_data->type,
-                   thread_data->pixels);
 
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
+   ((GL_TH_FNTYPE(glVertexBindingDivisor))thread_data->orig_func)
+      (thread_data->bindingindex,
+       thread_data->divisor);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glTexSubImage2D_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)
+void
+GL_TH_FN(glVertexBindingDivisor)(GL_TH_DP, GLuint bindingindex, GLuint divisor)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexSubImage2D thread_data_local;
-   Evas_Thread_Command_glTexSubImage2D *thread_data = &thread_data_local;
+   GL_TH_ST(glVertexBindingDivisor) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glVertexBindingDivisor))orig_func)
+           (bindingindex, divisor);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glVertexBindingDivisor) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
-
-   GLTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
+   thread_data->bindingindex = bindingindex;
+   thread_data->divisor = divisor;
+   thread_data->orig_func = orig_func;
 
-   GLTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
-
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexSubImage2D,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glVertexBindingDivisor),
                               thread_mode);
 }
 
 /*
  * void
- * glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+ * glBlendBarrier(void);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendBarrier))(void);
+
 typedef struct
 {
-   GLenum target;
-   GLint level;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   GLint border;
-   GLsizei imageSize;
-   const void *data;
-   int command_allocated;
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE; /* TODO */
+   GL_TH_FNTYPE(glBlendBarrier) orig_func;
 
-} Evas_Thread_Command_glCompressedTexImage2D;
+} GL_TH_ST(glBlendBarrier);
 
 static void
-_gl_thread_glCompressedTexImage2D(void *data)
+GL_TH_CB(glBlendBarrier)(void *data)
 {
-   Evas_Thread_Command_glCompressedTexImage2D *thread_data =
-      (Evas_Thread_Command_glCompressedTexImage2D *)data;
+   GL_TH_ST(glBlendBarrier) *thread_data =
+      *(void **)data;
 
-   glCompressedTexImage2D(thread_data->target,
-                          thread_data->level,
-                          thread_data->internalformat,
-                          thread_data->width,
-                          thread_data->height,
-                          thread_data->border,
-                          thread_data->imageSize,
-                          thread_data->data);
 
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
+   ((GL_TH_FNTYPE(glBlendBarrier))thread_data->orig_func)
+      ();
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glCompressedTexImage2D_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data)
+void
+GL_TH_FN(glBlendBarrier)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glBlendBarrier) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+        ((GL_TH_FNTYPE(glBlendBarrier))orig_func)
+           ();
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendBarrier) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   thread_data->orig_func = orig_func;
 
-   Evas_Thread_Command_glCompressedTexImage2D thread_data_local;
-   Evas_Thread_Command_glCompressedTexImage2D *thread_data = &thread_data_local;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendBarrier),
+                              thread_mode);
+}
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
+/*
+ * void
+ * glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+ */
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glCompressedTexImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glCompressedTexImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
+typedef void(*GL_TH_FNTYPE(glCopyImageSubData))(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->border = border;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
+typedef struct
+{
+   GL_TH_FNTYPE(glCopyImageSubData) orig_func;
+   GLuint srcName;
+   GLenum srcTarget;
+   GLint srcLevel;
+   GLint srcX;
+   GLint srcY;
+   GLint srcZ;
+   GLuint dstName;
+   GLenum dstTarget;
+   GLint dstLevel;
+   GLint dstX;
+   GLint dstY;
+   GLint dstZ;
+   GLsizei srcWidth;
+   GLsizei srcHeight;
+   GLsizei srcDepth;
+
+} GL_TH_ST(glCopyImageSubData);
 
-   GLCOMPRESSEDTEXIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
+static void
+GL_TH_CB(glCopyImageSubData)(void *data)
+{
+   GL_TH_ST(glCopyImageSubData) *thread_data =
+      *(void **)data;
 
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   GLCOMPRESSEDTEXIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
+   ((GL_TH_FNTYPE(glCopyImageSubData))thread_data->orig_func)
+      (thread_data->srcName,
+       thread_data->srcTarget,
+       thread_data->srcLevel,
+       thread_data->srcX,
+       thread_data->srcY,
+       thread_data->srcZ,
+       thread_data->dstName,
+       thread_data->dstTarget,
+       thread_data->dstLevel,
+       thread_data->dstX,
+       thread_data->dstY,
+       thread_data->dstZ,
+       thread_data->srcWidth,
+       thread_data->srcHeight,
+       thread_data->srcDepth);
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCompressedTexImage2D,
-                              thread_data,
+}
+
+void
+GL_TH_FN(glCopyImageSubData)(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth)
+{
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glCopyImageSubData) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glCopyImageSubData))orig_func)
+           (srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glCopyImageSubData) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->srcName = srcName;
+   thread_data->srcTarget = srcTarget;
+   thread_data->srcLevel = srcLevel;
+   thread_data->srcX = srcX;
+   thread_data->srcY = srcY;
+   thread_data->srcZ = srcZ;
+   thread_data->dstName = dstName;
+   thread_data->dstTarget = dstTarget;
+   thread_data->dstLevel = dstLevel;
+   thread_data->dstX = dstX;
+   thread_data->dstY = dstY;
+   thread_data->dstZ = dstZ;
+   thread_data->srcWidth = srcWidth;
+   thread_data->srcHeight = srcHeight;
+   thread_data->srcDepth = srcDepth;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glCopyImageSubData),
                               thread_mode);
 }
 
 /*
  * void
- * glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+ * glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
  */
 
+typedef void(*GL_TH_FNTYPE(glDebugMessageControl))(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+
 typedef struct
 {
-   GLenum target;
-   GLint level;
-   GLint xoffset;
-   GLint yoffset;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLsizei imageSize;
-   const void *data;
-   int command_allocated;
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE; /* TODO */
+   GL_TH_FNTYPE(glDebugMessageControl) orig_func;
+   GLenum source;
+   GLenum type;
+   GLenum severity;
+   GLsizei count;
+   const GLuint *ids;
+   GLboolean enabled;
 
-} Evas_Thread_Command_glCompressedTexSubImage2D;
+} GL_TH_ST(glDebugMessageControl);
 
 static void
-_gl_thread_glCompressedTexSubImage2D(void *data)
+GL_TH_CB(glDebugMessageControl)(void *data)
 {
-   Evas_Thread_Command_glCompressedTexSubImage2D *thread_data =
-      (Evas_Thread_Command_glCompressedTexSubImage2D *)data;
+   GL_TH_ST(glDebugMessageControl) *thread_data =
+      *(void **)data;
 
-   glCompressedTexSubImage2D(thread_data->target,
-                             thread_data->level,
-                             thread_data->xoffset,
-                             thread_data->yoffset,
-                             thread_data->width,
-                             thread_data->height,
-                             thread_data->format,
-                             thread_data->imageSize,
-                             thread_data->data);
 
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_FREE; /* TODO */
+   ((GL_TH_FNTYPE(glDebugMessageControl))thread_data->orig_func)
+      (thread_data->source,
+       thread_data->type,
+       thread_data->severity,
+       thread_data->count,
+       thread_data->ids,
+       thread_data->enabled);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glCompressedTexSubImage2D_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data)
+void
+GL_TH_FN(glDebugMessageControl)(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glCompressedTexSubImage2D thread_data_local;
-   Evas_Thread_Command_glCompressedTexSubImage2D *thread_data = &thread_data_local;
+   GL_TH_ST(glDebugMessageControl) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glCompressedTexSubImage2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glCompressedTexSubImage2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDebugMessageControl))orig_func)
+           (source, type, severity, count, ids, enabled);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDebugMessageControl) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->xoffset = xoffset;
-   thread_data->yoffset = yoffset;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->imageSize = imageSize;
-   thread_data->data = data;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_VARIABLE_INIT; /* TODO */
-
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
-
-   GLCOMPRESSEDTEXSUBIMAGE2D_COPY_TO_MEMPOOL; /* TODO */
+   thread_data->source = source;
+   thread_data->type = type;
+   thread_data->severity = severity;
+   thread_data->count = count;
+   thread_data->ids = ids;
+   thread_data->enabled = enabled;
+   thread_data->orig_func = orig_func;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCompressedTexSubImage2D,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDebugMessageControl),
                               thread_mode);
 }
 
 /*
  * void
- * glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+ * glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
  */
 
+typedef void(*GL_TH_FNTYPE(glDebugMessageInsert))(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+
 typedef struct
 {
-   GLenum target;
-   GLenum pname;
-   GLfloat param;
-   int command_allocated;
+   GL_TH_FNTYPE(glDebugMessageInsert) orig_func;
+   GLenum source;
+   GLenum type;
+   GLuint id;
+   GLenum severity;
+   GLsizei length;
+   const GLchar *buf;
 
-} Evas_Thread_Command_glTexParameterf;
+} GL_TH_ST(glDebugMessageInsert);
 
 static void
-_gl_thread_glTexParameterf(void *data)
+GL_TH_CB(glDebugMessageInsert)(void *data)
 {
-   Evas_Thread_Command_glTexParameterf *thread_data =
-      (Evas_Thread_Command_glTexParameterf *)data;
+   GL_TH_ST(glDebugMessageInsert) *thread_data =
+      *(void **)data;
 
-   glTexParameterf(thread_data->target,
-                   thread_data->pname,
-                   thread_data->param);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glDebugMessageInsert))thread_data->orig_func)
+      (thread_data->source,
+       thread_data->type,
+       thread_data->id,
+       thread_data->severity,
+       thread_data->length,
+       thread_data->buf);
+
 }
 
-EAPI void
-glTexParameterf_thread_cmd(GLenum target, GLenum pname, GLfloat param)
+void
+GL_TH_FN(glDebugMessageInsert)(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexParameterf(target, pname, param);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexParameterf thread_data_local;
-   Evas_Thread_Command_glTexParameterf *thread_data = &thread_data_local;
+   GL_TH_ST(glDebugMessageInsert) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexParameterf *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexParameterf));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDebugMessageInsert))orig_func)
+           (source, type, id, severity, length, buf);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDebugMessageInsert) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
+   thread_data->source = source;
+   thread_data->type = type;
+   thread_data->id = id;
+   thread_data->severity = severity;
+   thread_data->length = length;
+   thread_data->buf = buf;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexParameterf,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDebugMessageInsert),
                               thread_mode);
 }
 
 /*
  * void
- * glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+ * glDebugMessageCallback(GLDEBUGPROC callback, const void *userParam);
  */
 
+typedef void(*GL_TH_FNTYPE(glDebugMessageCallback))(GLDEBUGPROC callback, const void *userParam);
+
 typedef struct
 {
-   GLenum target;
-   GLenum pname;
-   const GLfloat *params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glDebugMessageCallback) orig_func;
+   GLDEBUGPROC callback;
+   const void *userParam;
 
-} Evas_Thread_Command_glTexParameterfv;
+} GL_TH_ST(glDebugMessageCallback);
 
 static void
-_gl_thread_glTexParameterfv(void *data)
+GL_TH_CB(glDebugMessageCallback)(void *data)
 {
-   Evas_Thread_Command_glTexParameterfv *thread_data =
-      (Evas_Thread_Command_glTexParameterfv *)data;
+   GL_TH_ST(glDebugMessageCallback) *thread_data =
+      *(void **)data;
 
-   glTexParameterfv(thread_data->target,
-                    thread_data->pname,
-                    thread_data->params);
 
+   ((GL_TH_FNTYPE(glDebugMessageCallback))thread_data->orig_func)
+      (thread_data->callback,
+       thread_data->userParam);
 
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glTexParameterfv_thread_cmd(GLenum target, GLenum pname, const GLfloat *params)
+void
+GL_TH_FN(glDebugMessageCallback)(GL_TH_DP, GLDEBUGPROC callback, const void *userParam)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexParameterfv(target, pname, params);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexParameterfv thread_data_local;
-   Evas_Thread_Command_glTexParameterfv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexParameterfv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexParameterfv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   GL_TH_ST(glDebugMessageCallback) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (params)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLfloat);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLfloat  *)thread_data->params_copied;
+        ((GL_TH_FNTYPE(glDebugMessageCallback))orig_func)
+           (callback, userParam);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDebugMessageCallback) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexParameterfv,
-                              thread_data,
+   thread_data->callback = callback;
+   thread_data->userParam = userParam;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDebugMessageCallback),
                               thread_mode);
 }
 
 /*
- * void
- * glTexParameteri(GLenum target, GLenum pname, GLint param);
+ * GLuint
+ * glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
  */
 
+typedef GLuint(*GL_TH_FNTYPE(glGetDebugMessageLog))(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+
 typedef struct
 {
-   GLenum target;
-   GLenum pname;
-   GLint param;
-   int command_allocated;
+   GL_TH_FNTYPE(glGetDebugMessageLog) orig_func;
+   GLuint return_value;
+   GLuint count;
+   GLsizei bufSize;
+   GLenum *sources;
+   GLenum *types;
+   GLuint *ids;
+   GLenum *severities;
+   GLsizei *lengths;
+   GLchar *messageLog;
 
-} Evas_Thread_Command_glTexParameteri;
+} GL_TH_ST(glGetDebugMessageLog);
 
 static void
-_gl_thread_glTexParameteri(void *data)
+GL_TH_CB(glGetDebugMessageLog)(void *data)
 {
-   Evas_Thread_Command_glTexParameteri *thread_data =
-      (Evas_Thread_Command_glTexParameteri *)data;
+   GL_TH_ST(glGetDebugMessageLog) *thread_data =
+      *(void **)data;
+
 
-   glTexParameteri(thread_data->target,
-                   thread_data->pname,
-                   thread_data->param);
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetDebugMessageLog))thread_data->orig_func)
+      (thread_data->count,
+       thread_data->bufSize,
+       thread_data->sources,
+       thread_data->types,
+       thread_data->ids,
+       thread_data->severities,
+       thread_data->lengths,
+       thread_data->messageLog);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glTexParameteri_thread_cmd(GLenum target, GLenum pname, GLint param)
+GLuint
+GL_TH_FN(glGetDebugMessageLog)(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexParameteri(target, pname, param);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexParameteri thread_data_local;
-   Evas_Thread_Command_glTexParameteri *thread_data = &thread_data_local;
+   GL_TH_ST(glGetDebugMessageLog) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexParameteri *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexParameteri));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(glGetDebugMessageLog))orig_func)
+           (count, bufSize, sources, types, ids, severities, lengths, messageLog);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetDebugMessageLog) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->param = param;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexParameteri,
-                              thread_data,
+   thread_data->count = count;
+   thread_data->bufSize = bufSize;
+   thread_data->sources = sources;
+   thread_data->types = types;
+   thread_data->ids = ids;
+   thread_data->severities = severities;
+   thread_data->lengths = lengths;
+   thread_data->messageLog = messageLog;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetDebugMessageLog),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
  * void
- * glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+ * glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message);
  */
 
+typedef void(*GL_TH_FNTYPE(glPushDebugGroup))(GLenum source, GLuint id, GLsizei length, const GLchar *message);
+
 typedef struct
 {
-   GLenum target;
-   GLenum pname;
-   const GLint *params;
-   void *params_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glPushDebugGroup) orig_func;
+   GLenum source;
+   GLuint id;
+   GLsizei length;
+   const GLchar *message;
 
-} Evas_Thread_Command_glTexParameteriv;
+} GL_TH_ST(glPushDebugGroup);
 
 static void
-_gl_thread_glTexParameteriv(void *data)
+GL_TH_CB(glPushDebugGroup)(void *data)
 {
-   Evas_Thread_Command_glTexParameteriv *thread_data =
-      (Evas_Thread_Command_glTexParameteriv *)data;
-
-   glTexParameteriv(thread_data->target,
-                    thread_data->pname,
-                    thread_data->params);
+   GL_TH_ST(glPushDebugGroup) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->params_copied)
-     eina_mempool_free(_mp_default, thread_data->params_copied);
+   ((GL_TH_FNTYPE(glPushDebugGroup))thread_data->orig_func)
+      (thread_data->source,
+       thread_data->id,
+       thread_data->length,
+       thread_data->message);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glTexParameteriv_thread_cmd(GLenum target, GLenum pname, const GLint *params)
+void
+GL_TH_FN(glPushDebugGroup)(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glTexParameteriv(target, pname, params);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glTexParameteriv thread_data_local;
-   Evas_Thread_Command_glTexParameteriv *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glTexParameteriv *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glTexParameteriv));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   GL_TH_ST(glPushDebugGroup) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->params_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (params)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = sizeof(GLint);
-        if (copy_size > _mp_default_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->params_copied = eina_mempool_malloc(_mp_default, copy_size);
-        if (thread_data->params_copied)
-          {
-             memcpy(thread_data->params_copied, params, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->params = (const GLint  *)thread_data->params_copied;
+        ((GL_TH_FNTYPE(glPushDebugGroup))orig_func)
+           (source, id, length, message);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPushDebugGroup) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glTexParameteriv,
-                              thread_data,
+   thread_data->source = source;
+   thread_data->id = id;
+   thread_data->length = length;
+   thread_data->message = message;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPushDebugGroup),
                               thread_mode);
 }
 
 /*
  * void
- * glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+ * glPopDebugGroup(void);
  */
 
+typedef void(*GL_TH_FNTYPE(glPopDebugGroup))(void);
+
 typedef struct
 {
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
+   GL_TH_FNTYPE(glPopDebugGroup) orig_func;
 
-} Evas_Thread_Command_glScissor;
+} GL_TH_ST(glPopDebugGroup);
 
 static void
-_gl_thread_glScissor(void *data)
+GL_TH_CB(glPopDebugGroup)(void *data)
 {
-   Evas_Thread_Command_glScissor *thread_data =
-      (Evas_Thread_Command_glScissor *)data;
+   GL_TH_ST(glPopDebugGroup) *thread_data =
+      *(void **)data;
+
 
-   glScissor(thread_data->x,
-             thread_data->y,
-             thread_data->width,
-             thread_data->height);
+   ((GL_TH_FNTYPE(glPopDebugGroup))thread_data->orig_func)
+      ();
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glScissor_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height)
+void
+GL_TH_FN(glPopDebugGroup)(GL_TH_DP)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glScissor(x, y, width, height);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glScissor thread_data_local;
-   Evas_Thread_Command_glScissor *thread_data = &thread_data_local;
+   GL_TH_ST(glPopDebugGroup) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glScissor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glScissor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPopDebugGroup))orig_func)
+           ();
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPopDebugGroup) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glScissor,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPopDebugGroup),
                               thread_mode);
 }
 
 /*
  * void
- * glBlendFunc(GLenum sfactor, GLenum dfactor);
+ * glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
  */
 
+typedef void(*GL_TH_FNTYPE(glObjectLabel))(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+
 typedef struct
 {
-   GLenum sfactor;
-   GLenum dfactor;
-   int command_allocated;
+   GL_TH_FNTYPE(glObjectLabel) orig_func;
+   GLenum identifier;
+   GLuint name;
+   GLsizei length;
+   const GLchar *label;
 
-} Evas_Thread_Command_glBlendFunc;
+} GL_TH_ST(glObjectLabel);
 
 static void
-_gl_thread_glBlendFunc(void *data)
+GL_TH_CB(glObjectLabel)(void *data)
 {
-   Evas_Thread_Command_glBlendFunc *thread_data =
-      (Evas_Thread_Command_glBlendFunc *)data;
+   GL_TH_ST(glObjectLabel) *thread_data =
+      *(void **)data;
 
-   glBlendFunc(thread_data->sfactor,
-               thread_data->dfactor);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glObjectLabel))thread_data->orig_func)
+      (thread_data->identifier,
+       thread_data->name,
+       thread_data->length,
+       thread_data->label);
+
 }
 
-EAPI void
-glBlendFunc_thread_cmd(GLenum sfactor, GLenum dfactor)
+void
+GL_TH_FN(glObjectLabel)(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glBlendFunc(sfactor, dfactor);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glBlendFunc thread_data_local;
-   Evas_Thread_Command_glBlendFunc *thread_data = &thread_data_local;
+   GL_TH_ST(glObjectLabel) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glBlendFunc *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glBlendFunc));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glObjectLabel))orig_func)
+           (identifier, name, length, label);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glObjectLabel) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->sfactor = sfactor;
-   thread_data->dfactor = dfactor;
+   thread_data->identifier = identifier;
+   thread_data->name = name;
+   thread_data->length = length;
+   thread_data->label = label;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBlendFunc,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glObjectLabel),
                               thread_mode);
 }
 
 /*
  * void
- * glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ * glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetObjectLabel))(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+
 typedef struct
 {
-   GLfloat red;
-   GLfloat green;
-   GLfloat blue;
-   GLfloat alpha;
-   int command_allocated;
+   GL_TH_FNTYPE(glGetObjectLabel) orig_func;
+   GLenum identifier;
+   GLuint name;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLchar *label;
 
-} Evas_Thread_Command_glBlendColor;
+} GL_TH_ST(glGetObjectLabel);
 
 static void
-_gl_thread_glBlendColor(void *data)
+GL_TH_CB(glGetObjectLabel)(void *data)
 {
-   Evas_Thread_Command_glBlendColor *thread_data =
-      (Evas_Thread_Command_glBlendColor *)data;
+   GL_TH_ST(glGetObjectLabel) *thread_data =
+      *(void **)data;
 
-   glBlendColor(thread_data->red,
-                thread_data->green,
-                thread_data->blue,
-                thread_data->alpha);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glGetObjectLabel))thread_data->orig_func)
+      (thread_data->identifier,
+       thread_data->name,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->label);
+
 }
 
-EAPI void
-glBlendColor_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+void
+GL_TH_FN(glGetObjectLabel)(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glBlendColor(red, green, blue, alpha);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glBlendColor thread_data_local;
-   Evas_Thread_Command_glBlendColor *thread_data = &thread_data_local;
+   GL_TH_ST(glGetObjectLabel) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glBlendColor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glBlendColor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetObjectLabel))orig_func)
+           (identifier, name, bufSize, length, label);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetObjectLabel) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
+   thread_data->identifier = identifier;
+   thread_data->name = name;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->label = label;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBlendColor,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetObjectLabel),
                               thread_mode);
 }
 
 /*
  * void
- * glDepthMask(GLboolean flag);
+ * glObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
  */
 
+typedef void(*GL_TH_FNTYPE(glObjectPtrLabel))(const void *ptr, GLsizei length, const GLchar *label);
+
 typedef struct
 {
-   GLboolean flag;
-   int command_allocated;
+   GL_TH_FNTYPE(glObjectPtrLabel) orig_func;
+   const void *ptr;
+   GLsizei length;
+   const GLchar *label;
 
-} Evas_Thread_Command_glDepthMask;
+} GL_TH_ST(glObjectPtrLabel);
 
 static void
-_gl_thread_glDepthMask(void *data)
+GL_TH_CB(glObjectPtrLabel)(void *data)
 {
-   Evas_Thread_Command_glDepthMask *thread_data =
-      (Evas_Thread_Command_glDepthMask *)data;
+   GL_TH_ST(glObjectPtrLabel) *thread_data =
+      *(void **)data;
+
 
-   glDepthMask(thread_data->flag);
+   ((GL_TH_FNTYPE(glObjectPtrLabel))thread_data->orig_func)
+      (thread_data->ptr,
+       thread_data->length,
+       thread_data->label);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDepthMask_thread_cmd(GLboolean flag)
+void
+GL_TH_FN(glObjectPtrLabel)(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDepthMask(flag);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDepthMask thread_data_local;
-   Evas_Thread_Command_glDepthMask *thread_data = &thread_data_local;
+   GL_TH_ST(glObjectPtrLabel) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDepthMask *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDepthMask));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glObjectPtrLabel))orig_func)
+           (ptr, length, label);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glObjectPtrLabel) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->flag = flag;
+   thread_data->ptr = ptr;
+   thread_data->length = length;
+   thread_data->label = label;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDepthMask,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glObjectPtrLabel),
                               thread_mode);
 }
 
 /*
  * void
- * glClear(GLbitfield mask);
+ * glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetObjectPtrLabel))(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+
 typedef struct
 {
-   GLbitfield mask;
-   int command_allocated;
+   GL_TH_FNTYPE(glGetObjectPtrLabel) orig_func;
+   const void *ptr;
+   GLsizei bufSize;
+   GLsizei *length;
+   GLchar *label;
 
-} Evas_Thread_Command_glClear;
+} GL_TH_ST(glGetObjectPtrLabel);
 
 static void
-_gl_thread_glClear(void *data)
+GL_TH_CB(glGetObjectPtrLabel)(void *data)
 {
-   Evas_Thread_Command_glClear *thread_data =
-      (Evas_Thread_Command_glClear *)data;
+   GL_TH_ST(glGetObjectPtrLabel) *thread_data =
+      *(void **)data;
+
 
-   glClear(thread_data->mask);
+   ((GL_TH_FNTYPE(glGetObjectPtrLabel))thread_data->orig_func)
+      (thread_data->ptr,
+       thread_data->bufSize,
+       thread_data->length,
+       thread_data->label);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glClear_thread_cmd(GLbitfield mask)
+void
+GL_TH_FN(glGetObjectPtrLabel)(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glClear(mask);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glClear thread_data_local;
-   Evas_Thread_Command_glClear *thread_data = &thread_data_local;
+   GL_TH_ST(glGetObjectPtrLabel) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glClear *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glClear));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetObjectPtrLabel))orig_func)
+           (ptr, bufSize, length, label);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetObjectPtrLabel) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->mask = mask;
+   thread_data->ptr = ptr;
+   thread_data->bufSize = bufSize;
+   thread_data->length = length;
+   thread_data->label = label;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glClear,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetObjectPtrLabel),
                               thread_mode);
 }
 
 /*
  * void
- * glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+ * glEnablei(GLenum target, GLuint index);
  */
 
+typedef void(*GL_TH_FNTYPE(glEnablei))(GLenum target, GLuint index);
+
 typedef struct
 {
-   GLfloat red;
-   GLfloat green;
-   GLfloat blue;
-   GLfloat alpha;
-   int command_allocated;
+   GL_TH_FNTYPE(glEnablei) orig_func;
+   GLenum target;
+   GLuint index;
 
-} Evas_Thread_Command_glClearColor;
+} GL_TH_ST(glEnablei);
 
 static void
-_gl_thread_glClearColor(void *data)
+GL_TH_CB(glEnablei)(void *data)
 {
-   Evas_Thread_Command_glClearColor *thread_data =
-      (Evas_Thread_Command_glClearColor *)data;
+   GL_TH_ST(glEnablei) *thread_data =
+      *(void **)data;
 
-   glClearColor(thread_data->red,
-                thread_data->green,
-                thread_data->blue,
-                thread_data->alpha);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glEnablei))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index);
+
 }
 
-EAPI void
-glClearColor_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
+void
+GL_TH_FN(glEnablei)(GL_TH_DP, GLenum target, GLuint index)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glClearColor(red, green, blue, alpha);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glClearColor thread_data_local;
-   Evas_Thread_Command_glClearColor *thread_data = &thread_data_local;
+   GL_TH_ST(glEnablei) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glClearColor *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glClearColor));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glEnablei))orig_func)
+           (target, index);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEnablei) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->red = red;
-   thread_data->green = green;
-   thread_data->blue = blue;
-   thread_data->alpha = alpha;
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glClearColor,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEnablei),
                               thread_mode);
 }
 
 /*
  * void
- * glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+ * glDisablei(GLenum target, GLuint index);
  */
 
+typedef void(*GL_TH_FNTYPE(glDisablei))(GLenum target, GLuint index);
+
 typedef struct
 {
-   GLint x;
-   GLint y;
-   GLsizei width;
-   GLsizei height;
-   GLenum format;
-   GLenum type;
-   void *pixels;
+   GL_TH_FNTYPE(glDisablei) orig_func;
+   GLenum target;
+   GLuint index;
 
-} Evas_Thread_Command_glReadPixels;
+} GL_TH_ST(glDisablei);
 
 static void
-_gl_thread_glReadPixels(void *data)
+GL_TH_CB(glDisablei)(void *data)
 {
-   Evas_Thread_Command_glReadPixels *thread_data =
-      (Evas_Thread_Command_glReadPixels *)data;
+   GL_TH_ST(glDisablei) *thread_data =
+      *(void **)data;
 
-   glReadPixels(thread_data->x,
-                thread_data->y,
-                thread_data->width,
-                thread_data->height,
-                thread_data->format,
-                thread_data->type,
-                thread_data->pixels);
+
+   ((GL_TH_FNTYPE(glDisablei))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index);
 
 }
 
-EAPI void
-glReadPixels_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
+void
+GL_TH_FN(glDisablei)(GL_TH_DP, GLenum target, GLuint index)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glDisablei) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glReadPixels(x, y, width, height, format, type, pixels);
+        ((GL_TH_FNTYPE(glDisablei))orig_func)
+           (target, index);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDisablei) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glReadPixels thread_data_local;
-   Evas_Thread_Command_glReadPixels *thread_data = &thread_data_local;
-
-   thread_data->x = x;
-   thread_data->y = y;
-   thread_data->width = width;
-   thread_data->height = height;
-   thread_data->format = format;
-   thread_data->type = type;
-   thread_data->pixels = pixels;
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glReadPixels,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDisablei),
                               thread_mode);
 }
 
 /*
  * void
- * glGenFramebuffers(GLsizei n, GLuint *framebuffers);
+ * glBlendEquationi(GLuint buf, GLenum mode);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendEquationi))(GLuint buf, GLenum mode);
+
 typedef struct
 {
-   GLsizei n;
-   GLuint *framebuffers;
-
-} Evas_Thread_Command_glGenFramebuffers;
+   GL_TH_FNTYPE(glBlendEquationi) orig_func;
+   GLuint buf;
+   GLenum mode;
 
-void (*orig_evas_glGenFramebuffers)(GLsizei n, GLuint *framebuffers);
+} GL_TH_ST(glBlendEquationi);
 
-void
-glGenFramebuffers_orig_evas_set(void *func)
+static void
+GL_TH_CB(glBlendEquationi)(void *data)
 {
-   orig_evas_glGenFramebuffers = func;
-}
+   GL_TH_ST(glBlendEquationi) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glBlendEquationi))thread_data->orig_func)
+      (thread_data->buf,
+       thread_data->mode);
 
-void *
-glGenFramebuffers_orig_evas_get(void)
-{
-   return orig_evas_glGenFramebuffers;
 }
 
-static void
-_gl_thread_glGenFramebuffers(void *data)
+void
+GL_TH_FN(glBlendEquationi)(GL_TH_DP, GLuint buf, GLenum mode)
 {
-   Evas_Thread_Command_glGenFramebuffers *thread_data =
-      (Evas_Thread_Command_glGenFramebuffers *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   orig_evas_glGenFramebuffers(thread_data->n,
-                               thread_data->framebuffers);
+   GL_TH_ST(glBlendEquationi) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glGenFramebuffers_thread_cmd(GLsizei n, GLuint *framebuffers)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glGenFramebuffers(n, framebuffers);
+        ((GL_TH_FNTYPE(glBlendEquationi))orig_func)
+           (buf, mode);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquationi) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGenFramebuffers thread_data_local;
-   Evas_Thread_Command_glGenFramebuffers *thread_data = &thread_data_local;
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
+   thread_data->buf = buf;
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGenFramebuffers,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquationi),
                               thread_mode);
 }
 
 /*
  * void
- * glBindFramebuffer(GLenum target, GLuint framebuffer);
+ * glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
  */
 
-typedef struct
-{
-   GLenum target;
-   GLuint framebuffer;
-   int command_allocated;
-
-} Evas_Thread_Command_glBindFramebuffer;
+typedef void(*GL_TH_FNTYPE(glBlendEquationSeparatei))(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
 
-void (*orig_evas_glBindFramebuffer)(GLenum target, GLuint framebuffer);
-
-void
-glBindFramebuffer_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glBindFramebuffer = func;
-}
+   GL_TH_FNTYPE(glBlendEquationSeparatei) orig_func;
+   GLuint buf;
+   GLenum modeRGB;
+   GLenum modeAlpha;
 
-void *
-glBindFramebuffer_orig_evas_get(void)
-{
-   return orig_evas_glBindFramebuffer;
-}
+} GL_TH_ST(glBlendEquationSeparatei);
 
 static void
-_gl_thread_glBindFramebuffer(void *data)
+GL_TH_CB(glBlendEquationSeparatei)(void *data)
 {
-   Evas_Thread_Command_glBindFramebuffer *thread_data =
-      (Evas_Thread_Command_glBindFramebuffer *)data;
+   GL_TH_ST(glBlendEquationSeparatei) *thread_data =
+      *(void **)data;
+
 
-   orig_evas_glBindFramebuffer(thread_data->target,
-                               thread_data->framebuffer);
+   ((GL_TH_FNTYPE(glBlendEquationSeparatei))thread_data->orig_func)
+      (thread_data->buf,
+       thread_data->modeRGB,
+       thread_data->modeAlpha);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glBindFramebuffer_thread_cmd(GLenum target, GLuint framebuffer)
+void
+GL_TH_FN(glBlendEquationSeparatei)(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glBindFramebuffer(target, framebuffer);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glBindFramebuffer thread_data_local;
-   Evas_Thread_Command_glBindFramebuffer *thread_data = &thread_data_local;
+   GL_TH_ST(glBlendEquationSeparatei) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glBindFramebuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glBindFramebuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendEquationSeparatei))orig_func)
+           (buf, modeRGB, modeAlpha);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendEquationSeparatei) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->framebuffer = framebuffer;
+   thread_data->buf = buf;
+   thread_data->modeRGB = modeRGB;
+   thread_data->modeAlpha = modeAlpha;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBindFramebuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendEquationSeparatei),
                               thread_mode);
 }
 
 /*
  * void
- * glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+ * glBlendFunci(GLuint buf, GLenum src, GLenum dst);
  */
 
-typedef struct
-{
-   GLsizei n;
-   const GLuint *framebuffers;
-   void *framebuffers_copied; /* COPIED */
-   int command_allocated;
+typedef void(*GL_TH_FNTYPE(glBlendFunci))(GLuint buf, GLenum src, GLenum dst);
 
-} Evas_Thread_Command_glDeleteFramebuffers;
-
-void (*orig_evas_glDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers);
-
-void
-glDeleteFramebuffers_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glDeleteFramebuffers = func;
-}
+   GL_TH_FNTYPE(glBlendFunci) orig_func;
+   GLuint buf;
+   GLenum src;
+   GLenum dst;
 
-void *
-glDeleteFramebuffers_orig_evas_get(void)
-{
-   return orig_evas_glDeleteFramebuffers;
-}
+} GL_TH_ST(glBlendFunci);
 
 static void
-_gl_thread_glDeleteFramebuffers(void *data)
+GL_TH_CB(glBlendFunci)(void *data)
 {
-   Evas_Thread_Command_glDeleteFramebuffers *thread_data =
-      (Evas_Thread_Command_glDeleteFramebuffers *)data;
+   GL_TH_ST(glBlendFunci) *thread_data =
+      *(void **)data;
 
-   orig_evas_glDeleteFramebuffers(thread_data->n,
-                                  thread_data->framebuffers);
 
+   ((GL_TH_FNTYPE(glBlendFunci))thread_data->orig_func)
+      (thread_data->buf,
+       thread_data->src,
+       thread_data->dst);
 
-   if (thread_data->framebuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->framebuffers_copied);
-
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDeleteFramebuffers_thread_cmd(GLsizei n, const GLuint *framebuffers)
+void
+GL_TH_FN(glBlendFunci)(GL_TH_DP, GLuint buf, GLenum src, GLenum dst)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glDeleteFramebuffers(n, framebuffers);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDeleteFramebuffers thread_data_local;
-   Evas_Thread_Command_glDeleteFramebuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteFramebuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteFramebuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->framebuffers = framebuffers;
+   GL_TH_ST(glBlendFunci) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->framebuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (framebuffers)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->framebuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->framebuffers_copied)
-          {
-             memcpy(thread_data->framebuffers_copied, framebuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->framebuffers = (const GLuint  *)thread_data->framebuffers_copied;
+        ((GL_TH_FNTYPE(glBlendFunci))orig_func)
+           (buf, src, dst);
+        return;
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendFunci) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteFramebuffers,
-                              thread_data,
+   thread_data->buf = buf;
+   thread_data->src = src;
+   thread_data->dst = dst;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendFunci),
                               thread_mode);
 }
 
 /*
  * void
- * glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+ * glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
  */
 
+typedef void(*GL_TH_FNTYPE(glBlendFuncSeparatei))(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+
 typedef struct
 {
-   GLsizei n;
-   GLuint *renderbuffers;
+   GL_TH_FNTYPE(glBlendFuncSeparatei) orig_func;
+   GLuint buf;
+   GLenum srcRGB;
+   GLenum dstRGB;
+   GLenum srcAlpha;
+   GLenum dstAlpha;
 
-} Evas_Thread_Command_glGenRenderbuffers;
+} GL_TH_ST(glBlendFuncSeparatei);
 
 static void
-_gl_thread_glGenRenderbuffers(void *data)
+GL_TH_CB(glBlendFuncSeparatei)(void *data)
 {
-   Evas_Thread_Command_glGenRenderbuffers *thread_data =
-      (Evas_Thread_Command_glGenRenderbuffers *)data;
+   GL_TH_ST(glBlendFuncSeparatei) *thread_data =
+      *(void **)data;
+
 
-   glGenRenderbuffers(thread_data->n,
-                      thread_data->renderbuffers);
+   ((GL_TH_FNTYPE(glBlendFuncSeparatei))thread_data->orig_func)
+      (thread_data->buf,
+       thread_data->srcRGB,
+       thread_data->dstRGB,
+       thread_data->srcAlpha,
+       thread_data->dstAlpha);
 
 }
 
-EAPI void
-glGenRenderbuffers_thread_cmd(GLsizei n, GLuint *renderbuffers)
+void
+GL_TH_FN(glBlendFuncSeparatei)(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glGenRenderbuffers(n, renderbuffers);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGenRenderbuffers thread_data_local;
-   Evas_Thread_Command_glGenRenderbuffers *thread_data = &thread_data_local;
+   GL_TH_ST(glBlendFuncSeparatei) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGenRenderbuffers,
-                              thread_data,
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glBlendFuncSeparatei))orig_func)
+           (buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glBlendFuncSeparatei) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->buf = buf;
+   thread_data->srcRGB = srcRGB;
+   thread_data->dstRGB = dstRGB;
+   thread_data->srcAlpha = srcAlpha;
+   thread_data->dstAlpha = dstAlpha;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glBlendFuncSeparatei),
                               thread_mode);
 }
 
 /*
  * void
- * glBindRenderbuffer(GLenum target, GLuint renderbuffer);
+ * glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
  */
 
+typedef void(*GL_TH_FNTYPE(glColorMaski))(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
 typedef struct
 {
-   GLenum target;
-   GLuint renderbuffer;
-   int command_allocated;
+   GL_TH_FNTYPE(glColorMaski) orig_func;
+   GLuint index;
+   GLboolean r;
+   GLboolean g;
+   GLboolean b;
+   GLboolean a;
 
-} Evas_Thread_Command_glBindRenderbuffer;
+} GL_TH_ST(glColorMaski);
 
 static void
-_gl_thread_glBindRenderbuffer(void *data)
+GL_TH_CB(glColorMaski)(void *data)
 {
-   Evas_Thread_Command_glBindRenderbuffer *thread_data =
-      (Evas_Thread_Command_glBindRenderbuffer *)data;
+   GL_TH_ST(glColorMaski) *thread_data =
+      *(void **)data;
+
 
-   glBindRenderbuffer(thread_data->target,
-                      thread_data->renderbuffer);
+   ((GL_TH_FNTYPE(glColorMaski))thread_data->orig_func)
+      (thread_data->index,
+       thread_data->r,
+       thread_data->g,
+       thread_data->b,
+       thread_data->a);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glBindRenderbuffer_thread_cmd(GLenum target, GLuint renderbuffer)
+void
+GL_TH_FN(glColorMaski)(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glBindRenderbuffer(target, renderbuffer);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glBindRenderbuffer thread_data_local;
-   Evas_Thread_Command_glBindRenderbuffer *thread_data = &thread_data_local;
+   GL_TH_ST(glColorMaski) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glBindRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glBindRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glColorMaski))orig_func)
+           (index, r, g, b, a);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glColorMaski) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->renderbuffer = renderbuffer;
+   thread_data->index = index;
+   thread_data->r = r;
+   thread_data->g = g;
+   thread_data->b = b;
+   thread_data->a = a;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glBindRenderbuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glColorMaski),
                               thread_mode);
 }
 
 /*
- * void
- * glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+ * GLboolean
+ * glIsEnabledi(GLenum target, GLuint index);
  */
 
+typedef GLboolean(*GL_TH_FNTYPE(glIsEnabledi))(GLenum target, GLuint index);
+
 typedef struct
 {
-   GLsizei n;
-   const GLuint *renderbuffers;
-   void *renderbuffers_copied; /* COPIED */
-   int command_allocated;
+   GL_TH_FNTYPE(glIsEnabledi) orig_func;
+   GLboolean return_value;
+   GLenum target;
+   GLuint index;
 
-} Evas_Thread_Command_glDeleteRenderbuffers;
+} GL_TH_ST(glIsEnabledi);
 
 static void
-_gl_thread_glDeleteRenderbuffers(void *data)
+GL_TH_CB(glIsEnabledi)(void *data)
 {
-   Evas_Thread_Command_glDeleteRenderbuffers *thread_data =
-      (Evas_Thread_Command_glDeleteRenderbuffers *)data;
-
-   glDeleteRenderbuffers(thread_data->n,
-                         thread_data->renderbuffers);
+   GL_TH_ST(glIsEnabledi) *thread_data =
+      *(void **)data;
 
 
-   if (thread_data->renderbuffers_copied)
-     eina_mempool_free(_mp_delete_object, thread_data->renderbuffers_copied);
+   thread_data->return_value = ((GL_TH_FNTYPE(glIsEnabledi))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glDeleteRenderbuffers_thread_cmd(GLsizei n, const GLuint *renderbuffers)
+GLboolean
+GL_TH_FN(glIsEnabledi)(GL_TH_DP, GLenum target, GLuint index)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glDeleteRenderbuffers(n, renderbuffers);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glDeleteRenderbuffers thread_data_local;
-   Evas_Thread_Command_glDeleteRenderbuffers *thread_data = &thread_data_local;
-
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDeleteRenderbuffers *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDeleteRenderbuffers));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
-   thread_data->n = n;
-   thread_data->renderbuffers = renderbuffers;
+   GL_TH_ST(glIsEnabledi) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->renderbuffers_copied = NULL;
-   if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)
-     goto finish;
 
-   /* copy variable */
-   if (renderbuffers)
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        /* 1. check memory size */
-        unsigned int copy_size = n * sizeof(GLuint);
-        if (copy_size > _mp_delete_object_memory_size)
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 2. malloc & copy */
-        thread_data->renderbuffers_copied = eina_mempool_malloc(_mp_delete_object, copy_size);
-        if (thread_data->renderbuffers_copied)
-          {
-             memcpy(thread_data->renderbuffers_copied, renderbuffers, copy_size);
-          }
-        else
-          {
-             thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-             goto finish;
-          }
-        /* 3. replace */
-        thread_data->renderbuffers = (const GLuint  *)thread_data->renderbuffers_copied;
+        return ((GL_TH_FNTYPE(glIsEnabledi))orig_func)
+           (target, index);
      }
-   /* end of copy variable */
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glIsEnabledi) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-finish:
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glDeleteRenderbuffers,
-                              thread_data,
+   thread_data->target = target;
+   thread_data->index = index;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glIsEnabledi),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
  * void
- * glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ * glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
  */
 
+typedef void(*GL_TH_FNTYPE(glDrawElementsBaseVertex))(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
 typedef struct
 {
-   GLenum target;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-   int command_allocated;
+   GL_TH_FNTYPE(glDrawElementsBaseVertex) orig_func;
+   GLenum mode;
+   GLsizei count;
+   GLenum type;
+   const void *indices;
+   GLint basevertex;
 
-} Evas_Thread_Command_glRenderbufferStorage;
+} GL_TH_ST(glDrawElementsBaseVertex);
 
 static void
-_gl_thread_glRenderbufferStorage(void *data)
+GL_TH_CB(glDrawElementsBaseVertex)(void *data)
 {
-   Evas_Thread_Command_glRenderbufferStorage *thread_data =
-      (Evas_Thread_Command_glRenderbufferStorage *)data;
+   GL_TH_ST(glDrawElementsBaseVertex) *thread_data =
+      *(void **)data;
 
-   glRenderbufferStorage(thread_data->target,
-                         thread_data->internalformat,
-                         thread_data->width,
-                         thread_data->height);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glDrawElementsBaseVertex))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices,
+       thread_data->basevertex);
+
 }
 
-EAPI void
-glRenderbufferStorage_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+void
+GL_TH_FN(glDrawElementsBaseVertex)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glRenderbufferStorage(target, internalformat, width, height);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glRenderbufferStorage thread_data_local;
-   Evas_Thread_Command_glRenderbufferStorage *thread_data = &thread_data_local;
+   GL_TH_ST(glDrawElementsBaseVertex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glRenderbufferStorage *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glRenderbufferStorage));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawElementsBaseVertex))orig_func)
+           (mode, count, type, indices, basevertex);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawElementsBaseVertex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
+   thread_data->mode = mode;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->basevertex = basevertex;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glRenderbufferStorage,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawElementsBaseVertex),
                               thread_mode);
 }
 
 /*
  * void
- * glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ * glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
  */
 
+typedef void(*GL_TH_FNTYPE(glDrawRangeElementsBaseVertex))(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+
 typedef struct
 {
-   GLenum target;
-   GLenum attachment;
-   GLenum renderbuffertarget;
-   GLuint renderbuffer;
-   int command_allocated;
+   GL_TH_FNTYPE(glDrawRangeElementsBaseVertex) orig_func;
+   GLenum mode;
+   GLuint start;
+   GLuint end;
+   GLsizei count;
+   GLenum type;
+   const void *indices;
+   GLint basevertex;
 
-} Evas_Thread_Command_glFramebufferRenderbuffer;
+} GL_TH_ST(glDrawRangeElementsBaseVertex);
 
 static void
-_gl_thread_glFramebufferRenderbuffer(void *data)
+GL_TH_CB(glDrawRangeElementsBaseVertex)(void *data)
 {
-   Evas_Thread_Command_glFramebufferRenderbuffer *thread_data =
-      (Evas_Thread_Command_glFramebufferRenderbuffer *)data;
+   GL_TH_ST(glDrawRangeElementsBaseVertex) *thread_data =
+      *(void **)data;
+
 
-   glFramebufferRenderbuffer(thread_data->target,
-                             thread_data->attachment,
-                             thread_data->renderbuffertarget,
-                             thread_data->renderbuffer);
+   ((GL_TH_FNTYPE(glDrawRangeElementsBaseVertex))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->start,
+       thread_data->end,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices,
+       thread_data->basevertex);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glFramebufferRenderbuffer_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+void
+GL_TH_FN(glDrawRangeElementsBaseVertex)(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glFramebufferRenderbuffer thread_data_local;
-   Evas_Thread_Command_glFramebufferRenderbuffer *thread_data = &thread_data_local;
+   GL_TH_ST(glDrawRangeElementsBaseVertex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glFramebufferRenderbuffer *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glFramebufferRenderbuffer));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawRangeElementsBaseVertex))orig_func)
+           (mode, start, end, count, type, indices, basevertex);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawRangeElementsBaseVertex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->renderbuffertarget = renderbuffertarget;
-   thread_data->renderbuffer = renderbuffer;
+   thread_data->mode = mode;
+   thread_data->start = start;
+   thread_data->end = end;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->basevertex = basevertex;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glFramebufferRenderbuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawRangeElementsBaseVertex),
                               thread_mode);
 }
 
 /*
  * void
- * glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ * glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
  */
 
-typedef struct
-{
-   GLenum target;
-   GLenum attachment;
-   GLenum textarget;
-   GLuint texture;
-   GLint level;
-   int command_allocated;
-
-} Evas_Thread_Command_glFramebufferTexture2D;
-
-void (*orig_evas_glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void(*GL_TH_FNTYPE(glDrawElementsInstancedBaseVertex))(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
 
-void
-glFramebufferTexture2D_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glFramebufferTexture2D = func;
-}
+   GL_TH_FNTYPE(glDrawElementsInstancedBaseVertex) orig_func;
+   GLenum mode;
+   GLsizei count;
+   GLenum type;
+   const void *indices;
+   GLsizei instancecount;
+   GLint basevertex;
 
-void *
-glFramebufferTexture2D_orig_evas_get(void)
-{
-   return orig_evas_glFramebufferTexture2D;
-}
+} GL_TH_ST(glDrawElementsInstancedBaseVertex);
 
 static void
-_gl_thread_glFramebufferTexture2D(void *data)
+GL_TH_CB(glDrawElementsInstancedBaseVertex)(void *data)
 {
-   Evas_Thread_Command_glFramebufferTexture2D *thread_data =
-      (Evas_Thread_Command_glFramebufferTexture2D *)data;
+   GL_TH_ST(glDrawElementsInstancedBaseVertex) *thread_data =
+      *(void **)data;
 
-   orig_evas_glFramebufferTexture2D(thread_data->target,
-                                    thread_data->attachment,
-                                    thread_data->textarget,
-                                    thread_data->texture,
-                                    thread_data->level);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glDrawElementsInstancedBaseVertex))thread_data->orig_func)
+      (thread_data->mode,
+       thread_data->count,
+       thread_data->type,
+       thread_data->indices,
+       thread_data->instancecount,
+       thread_data->basevertex);
+
 }
 
-EAPI void
-glFramebufferTexture2D_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+void
+GL_TH_FN(glDrawElementsInstancedBaseVertex)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glFramebufferTexture2D(target, attachment, textarget, texture, level);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glFramebufferTexture2D thread_data_local;
-   Evas_Thread_Command_glFramebufferTexture2D *thread_data = &thread_data_local;
+   GL_TH_ST(glDrawElementsInstancedBaseVertex) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glFramebufferTexture2D *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glFramebufferTexture2D));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glDrawElementsInstancedBaseVertex))orig_func)
+           (mode, count, type, indices, instancecount, basevertex);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glDrawElementsInstancedBaseVertex) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
-   thread_data->texture = texture;
-   thread_data->level = level;
+   thread_data->mode = mode;
+   thread_data->count = count;
+   thread_data->type = type;
+   thread_data->indices = indices;
+   thread_data->instancecount = instancecount;
+   thread_data->basevertex = basevertex;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glFramebufferTexture2D,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glDrawElementsInstancedBaseVertex),
                               thread_mode);
 }
 
 /*
  * void
- * glFramebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+ * glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level);
  */
 
+typedef void(*GL_TH_FNTYPE(glFramebufferTexture))(GLenum target, GLenum attachment, GLuint texture, GLint level);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glFramebufferTexture) orig_func;
    GLenum target;
    GLenum attachment;
-   GLenum textarget;
    GLuint texture;
    GLint level;
-   GLsizei samples;
-   int command_allocated;
-
-} Evas_Thread_Command_glFramebufferTexture2DMultisample;
 
-void (*orig_evas_glFramebufferTexture2DMultisample)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
-
-void
-glFramebufferTexture2DMultisample_orig_evas_set(void *func)
-{
-   orig_evas_glFramebufferTexture2DMultisample = func;
-}
-
-void *
-glFramebufferTexture2DMultisample_orig_evas_get(void)
-{
-   return orig_evas_glFramebufferTexture2DMultisample;
-}
+} GL_TH_ST(glFramebufferTexture);
 
 static void
-_gl_thread_glFramebufferTexture2DMultisample(void *data)
+GL_TH_CB(glFramebufferTexture)(void *data)
 {
-   Evas_Thread_Command_glFramebufferTexture2DMultisample *thread_data =
-      (Evas_Thread_Command_glFramebufferTexture2DMultisample *)data;
+   GL_TH_ST(glFramebufferTexture) *thread_data =
+      *(void **)data;
 
-   orig_evas_glFramebufferTexture2DMultisample(thread_data->target,
-                                               thread_data->attachment,
-                                               thread_data->textarget,
-                                               thread_data->texture,
-                                               thread_data->level,
-                                               thread_data->samples);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glFramebufferTexture))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->attachment,
+       thread_data->texture,
+       thread_data->level);
+
 }
 
-EAPI void
-glFramebufferTexture2DMultisample_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
+void
+GL_TH_FN(glFramebufferTexture)(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glFramebufferTexture2DMultisample(target, attachment, textarget, texture, level, samples);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glFramebufferTexture2DMultisample thread_data_local;
-   Evas_Thread_Command_glFramebufferTexture2DMultisample *thread_data = &thread_data_local;
+   GL_TH_ST(glFramebufferTexture) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glFramebufferTexture2DMultisample *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glFramebufferTexture2DMultisample));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glFramebufferTexture))orig_func)
+           (target, attachment, texture, level);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glFramebufferTexture) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->target = target;
    thread_data->attachment = attachment;
-   thread_data->textarget = textarget;
    thread_data->texture = texture;
    thread_data->level = level;
-   thread_data->samples = samples;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glFramebufferTexture2DMultisample,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glFramebufferTexture),
                               thread_mode);
 }
 
 /*
- * GLenum
- * glCheckFramebufferStatus(GLenum target);
+ * void
+ * glPrimitiveBoundingBox(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
  */
 
+typedef void(*GL_TH_FNTYPE(glPrimitiveBoundingBox))(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+
 typedef struct
 {
-   GLenum return_value;
-   GLenum target;
+   GL_TH_FNTYPE(glPrimitiveBoundingBox) orig_func;
+   GLfloat minX;
+   GLfloat minY;
+   GLfloat minZ;
+   GLfloat minW;
+   GLfloat maxX;
+   GLfloat maxY;
+   GLfloat maxZ;
+   GLfloat maxW;
 
-} Evas_Thread_Command_glCheckFramebufferStatus;
+} GL_TH_ST(glPrimitiveBoundingBox);
 
 static void
-_gl_thread_glCheckFramebufferStatus(void *data)
+GL_TH_CB(glPrimitiveBoundingBox)(void *data)
 {
-   Evas_Thread_Command_glCheckFramebufferStatus *thread_data =
-      (Evas_Thread_Command_glCheckFramebufferStatus *)data;
+   GL_TH_ST(glPrimitiveBoundingBox) *thread_data =
+      *(void **)data;
+
 
-   thread_data->return_value = glCheckFramebufferStatus(thread_data->target);
+   ((GL_TH_FNTYPE(glPrimitiveBoundingBox))thread_data->orig_func)
+      (thread_data->minX,
+       thread_data->minY,
+       thread_data->minZ,
+       thread_data->minW,
+       thread_data->maxX,
+       thread_data->maxY,
+       thread_data->maxZ,
+       thread_data->maxW);
 
 }
 
-EAPI GLenum
-glCheckFramebufferStatus_thread_cmd(GLenum target)
+void
+GL_TH_FN(glPrimitiveBoundingBox)(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glCheckFramebufferStatus(target);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glCheckFramebufferStatus thread_data_local;
-   Evas_Thread_Command_glCheckFramebufferStatus *thread_data = &thread_data_local;
+   GL_TH_ST(glPrimitiveBoundingBox) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->target = target;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glCheckFramebufferStatus,
-                              thread_data,
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPrimitiveBoundingBox))orig_func)
+           (minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPrimitiveBoundingBox) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->minX = minX;
+   thread_data->minY = minY;
+   thread_data->minZ = minZ;
+   thread_data->minW = minW;
+   thread_data->maxX = maxX;
+   thread_data->maxY = maxY;
+   thread_data->maxZ = maxZ;
+   thread_data->maxW = maxW;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPrimitiveBoundingBox),
                               thread_mode);
-
-   return thread_data->return_value;
 }
 
 /*
- * void
- * glFlush(void);
+ * GLenum
+ * glGetGraphicsResetStatus(void);
  */
 
-static void
-_gl_thread_glFlush(void *data EINA_UNUSED)
+typedef GLenum(*GL_TH_FNTYPE(glGetGraphicsResetStatus))(void);
+
+typedef struct
 {
-   glFlush();
+   GL_TH_FNTYPE(glGetGraphicsResetStatus) orig_func;
+   GLenum return_value;
 
-}
+} GL_TH_ST(glGetGraphicsResetStatus);
 
-EAPI void
-glFlush_thread_cmd(void)
+static void
+GL_TH_CB(glGetGraphicsResetStatus)(void *data)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glFlush();
-        return;
-     }
+   GL_TH_ST(glGetGraphicsResetStatus) *thread_data =
+      *(void **)data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glFlush,
-                              NULL,
-                              thread_mode);
-}
+   thread_data->return_value = ((GL_TH_FNTYPE(glGetGraphicsResetStatus))thread_data->orig_func)
+      ();
 
-/*
- * void
- * glFinish(void);
- */
+}
 
-static void
-_gl_thread_glFinish(void *data EINA_UNUSED)
+GLenum
+GL_TH_FN(glGetGraphicsResetStatus)(GL_TH_DP)
 {
-   glFinish();
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-}
+   GL_TH_ST(glGetGraphicsResetStatus) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-EAPI void
-glFinish_thread_cmd(void)
-{
-   if (!evas_gl_thread_enabled())
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glFinish();
-        return;
+        return ((GL_TH_FNTYPE(glGetGraphicsResetStatus))orig_func)
+           ();
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetGraphicsResetStatus) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glFinish,
-                              NULL,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetGraphicsResetStatus),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
  * void
- * glHint(GLenum target, GLenum mode);
+ * glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
  */
 
+typedef void(*GL_TH_FNTYPE(glReadnPixels))(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+
 typedef struct
 {
-   GLenum target;
-   GLenum mode;
-   int command_allocated;
+   GL_TH_FNTYPE(glReadnPixels) orig_func;
+   GLint x;
+   GLint y;
+   GLsizei width;
+   GLsizei height;
+   GLenum format;
+   GLenum type;
+   GLsizei bufSize;
+   void *data;
 
-} Evas_Thread_Command_glHint;
+} GL_TH_ST(glReadnPixels);
 
 static void
-_gl_thread_glHint(void *data)
+GL_TH_CB(glReadnPixels)(void *data)
 {
-   Evas_Thread_Command_glHint *thread_data =
-      (Evas_Thread_Command_glHint *)data;
+   GL_TH_ST(glReadnPixels) *thread_data =
+      *(void **)data;
 
-   glHint(thread_data->target,
-          thread_data->mode);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   ((GL_TH_FNTYPE(glReadnPixels))thread_data->orig_func)
+      (thread_data->x,
+       thread_data->y,
+       thread_data->width,
+       thread_data->height,
+       thread_data->format,
+       thread_data->type,
+       thread_data->bufSize,
+       thread_data->data);
+
 }
 
-EAPI void
-glHint_thread_cmd(GLenum target, GLenum mode)
+void
+GL_TH_FN(glReadnPixels)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glHint(target, mode);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glHint thread_data_local;
-   Evas_Thread_Command_glHint *thread_data = &thread_data_local;
+   GL_TH_ST(glReadnPixels) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glHint *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glHint));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glReadnPixels))orig_func)
+           (x, y, width, height, format, type, bufSize, data);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glReadnPixels) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->target = target;
-   thread_data->mode = mode;
+   thread_data->x = x;
+   thread_data->y = y;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->format = format;
+   thread_data->type = type;
+   thread_data->bufSize = bufSize;
+   thread_data->data = data;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glHint,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glReadnPixels),
                               thread_mode);
 }
 
 /*
- * const GLubyte *
- * glGetString(GLenum name);
+ * void
+ * glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetnUniformfv))(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+
 typedef struct
 {
-   const GLubyte * return_value;
-   GLenum name;
+   GL_TH_FNTYPE(glGetnUniformfv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei bufSize;
+   GLfloat *params;
 
-} Evas_Thread_Command_glGetString;
+} GL_TH_ST(glGetnUniformfv);
 
 static void
-_gl_thread_glGetString(void *data)
+GL_TH_CB(glGetnUniformfv)(void *data)
 {
-   Evas_Thread_Command_glGetString *thread_data =
-      (Evas_Thread_Command_glGetString *)data;
+   GL_TH_ST(glGetnUniformfv) *thread_data =
+      *(void **)data;
+
 
-   thread_data->return_value = glGetString(thread_data->name);
+   ((GL_TH_FNTYPE(glGetnUniformfv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->bufSize,
+       thread_data->params);
 
 }
 
-EAPI const GLubyte *
-glGetString_thread_cmd(GLenum name)
+void
+GL_TH_FN(glGetnUniformfv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glGetString(name);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetString thread_data_local;
-   Evas_Thread_Command_glGetString *thread_data = &thread_data_local;
+   GL_TH_ST(glGetnUniformfv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->name = name;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetString,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glGetnUniformfv))orig_func)
+           (program, location, bufSize, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetnUniformfv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetnUniformfv),
+                              thread_mode);
 }
 
 /*
  * void
- * glGetBooleanv(GLenum pname, GLboolean *data);
+ * glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetnUniformiv))(GLuint program, GLint location, GLsizei bufSize, GLint *params);
+
 typedef struct
 {
-   GLenum pname;
-   GLboolean *data;
+   GL_TH_FNTYPE(glGetnUniformiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei bufSize;
+   GLint *params;
 
-} Evas_Thread_Command_glGetBooleanv;
+} GL_TH_ST(glGetnUniformiv);
 
 static void
-_gl_thread_glGetBooleanv(void *data)
+GL_TH_CB(glGetnUniformiv)(void *data)
 {
-   Evas_Thread_Command_glGetBooleanv *thread_data =
-      (Evas_Thread_Command_glGetBooleanv *)data;
+   GL_TH_ST(glGetnUniformiv) *thread_data =
+      *(void **)data;
+
 
-   glGetBooleanv(thread_data->pname,
-                 thread_data->data);
+   ((GL_TH_FNTYPE(glGetnUniformiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->bufSize,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetBooleanv_thread_cmd(GLenum pname, GLboolean *data)
+void
+GL_TH_FN(glGetnUniformiv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetnUniformiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetBooleanv(pname, data);
+        ((GL_TH_FNTYPE(glGetnUniformiv))orig_func)
+           (program, location, bufSize, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetnUniformiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetBooleanv thread_data_local;
-   Evas_Thread_Command_glGetBooleanv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetBooleanv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetnUniformiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetFloatv(GLenum pname, GLfloat *data);
+ * glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetnUniformuiv))(GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+
 typedef struct
 {
-   GLenum pname;
-   GLfloat *data;
+   GL_TH_FNTYPE(glGetnUniformuiv) orig_func;
+   GLuint program;
+   GLint location;
+   GLsizei bufSize;
+   GLuint *params;
 
-} Evas_Thread_Command_glGetFloatv;
+} GL_TH_ST(glGetnUniformuiv);
 
 static void
-_gl_thread_glGetFloatv(void *data)
+GL_TH_CB(glGetnUniformuiv)(void *data)
 {
-   Evas_Thread_Command_glGetFloatv *thread_data =
-      (Evas_Thread_Command_glGetFloatv *)data;
+   GL_TH_ST(glGetnUniformuiv) *thread_data =
+      *(void **)data;
+
 
-   glGetFloatv(thread_data->pname,
-               thread_data->data);
+   ((GL_TH_FNTYPE(glGetnUniformuiv))thread_data->orig_func)
+      (thread_data->program,
+       thread_data->location,
+       thread_data->bufSize,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetFloatv_thread_cmd(GLenum pname, GLfloat *data)
+void
+GL_TH_FN(glGetnUniformuiv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetnUniformuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetFloatv(pname, data);
+        ((GL_TH_FNTYPE(glGetnUniformuiv))orig_func)
+           (program, location, bufSize, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetnUniformuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetFloatv thread_data_local;
-   Evas_Thread_Command_glGetFloatv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
+   thread_data->program = program;
+   thread_data->location = location;
+   thread_data->bufSize = bufSize;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetFloatv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetnUniformuiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetIntegerv(GLenum pname, GLint *data);
+ * glMinSampleShading(GLfloat value);
  */
 
+typedef void(*GL_TH_FNTYPE(glMinSampleShading))(GLfloat value);
+
 typedef struct
 {
-   GLenum pname;
-   GLint *data;
+   GL_TH_FNTYPE(glMinSampleShading) orig_func;
+   GLfloat value;
 
-} Evas_Thread_Command_glGetIntegerv;
+} GL_TH_ST(glMinSampleShading);
 
 static void
-_gl_thread_glGetIntegerv(void *data)
+GL_TH_CB(glMinSampleShading)(void *data)
 {
-   Evas_Thread_Command_glGetIntegerv *thread_data =
-      (Evas_Thread_Command_glGetIntegerv *)data;
+   GL_TH_ST(glMinSampleShading) *thread_data =
+      *(void **)data;
 
-   glGetIntegerv(thread_data->pname,
-                 thread_data->data);
+
+   ((GL_TH_FNTYPE(glMinSampleShading))thread_data->orig_func)
+      (thread_data->value);
 
 }
 
-EAPI void
-glGetIntegerv_thread_cmd(GLenum pname, GLint *data)
+void
+GL_TH_FN(glMinSampleShading)(GL_TH_DP, GLfloat value)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glMinSampleShading) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetIntegerv(pname, data);
+        ((GL_TH_FNTYPE(glMinSampleShading))orig_func)
+           (value);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glMinSampleShading) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetIntegerv thread_data_local;
-   Evas_Thread_Command_glGetIntegerv *thread_data = &thread_data_local;
-
-   thread_data->pname = pname;
-   thread_data->data = data;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetIntegerv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glMinSampleShading),
                               thread_mode);
 }
 
 /*
- * GLboolean
- * glIsBuffer(GLint buffer);
+ * void
+ * glPatchParameteri(GLenum pname, GLint value);
  */
 
+typedef void(*GL_TH_FNTYPE(glPatchParameteri))(GLenum pname, GLint value);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLint buffer;
+   GL_TH_FNTYPE(glPatchParameteri) orig_func;
+   GLenum pname;
+   GLint value;
 
-} Evas_Thread_Command_glIsBuffer;
+} GL_TH_ST(glPatchParameteri);
 
 static void
-_gl_thread_glIsBuffer(void *data)
+GL_TH_CB(glPatchParameteri)(void *data)
 {
-   Evas_Thread_Command_glIsBuffer *thread_data =
-      (Evas_Thread_Command_glIsBuffer *)data;
+   GL_TH_ST(glPatchParameteri) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glIsBuffer(thread_data->buffer);
+
+   ((GL_TH_FNTYPE(glPatchParameteri))thread_data->orig_func)
+      (thread_data->pname,
+       thread_data->value);
 
 }
 
-EAPI GLboolean
-glIsBuffer_thread_cmd(GLint buffer)
+void
+GL_TH_FN(glPatchParameteri)(GL_TH_DP, GLenum pname, GLint value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glIsBuffer(buffer);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glIsBuffer thread_data_local;
-   Evas_Thread_Command_glIsBuffer *thread_data = &thread_data_local;
+   GL_TH_ST(glPatchParameteri) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->buffer = buffer;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsBuffer,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glPatchParameteri))orig_func)
+           (pname, value);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glPatchParameteri) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->pname = pname;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glPatchParameteri),
+                              thread_mode);
 }
 
 /*
  * void
- * glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ * glTexParameterIiv(GLenum target, GLenum pname, const GLint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexParameterIiv))(GLenum target, GLenum pname, const GLint *params);
+
 typedef struct
 {
+   GL_TH_FNTYPE(glTexParameterIiv) orig_func;
    GLenum target;
    GLenum pname;
-   GLint *params;
+   const GLint *params;
 
-} Evas_Thread_Command_glGetBufferParameteriv;
+} GL_TH_ST(glTexParameterIiv);
 
 static void
-_gl_thread_glGetBufferParameteriv(void *data)
+GL_TH_CB(glTexParameterIiv)(void *data)
 {
-   Evas_Thread_Command_glGetBufferParameteriv *thread_data =
-      (Evas_Thread_Command_glGetBufferParameteriv *)data;
+   GL_TH_ST(glTexParameterIiv) *thread_data =
+      *(void **)data;
 
-   glGetBufferParameteriv(thread_data->target,
-                          thread_data->pname,
-                          thread_data->params);
+
+   ((GL_TH_FNTYPE(glTexParameterIiv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetBufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params)
+void
+GL_TH_FN(glTexParameterIiv)(GL_TH_DP, GLenum target, GLenum pname, const GLint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexParameterIiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetBufferParameteriv(target, pname, params);
+        ((GL_TH_FNTYPE(glTexParameterIiv))orig_func)
+           (target, pname, params);
         return;
      }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetBufferParameteriv thread_data_local;
-   Evas_Thread_Command_glGetBufferParameteriv *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterIiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->target = target;
    thread_data->pname = pname;
    thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetBufferParameteriv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterIiv),
                               thread_mode);
 }
 
 /*
- * GLboolean
- * glIsShader(GLuint shader);
+ * void
+ * glTexParameterIuiv(GLenum target, GLenum pname, const GLuint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexParameterIuiv))(GLenum target, GLenum pname, const GLuint *params);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLuint shader;
+   GL_TH_FNTYPE(glTexParameterIuiv) orig_func;
+   GLenum target;
+   GLenum pname;
+   const GLuint *params;
 
-} Evas_Thread_Command_glIsShader;
+} GL_TH_ST(glTexParameterIuiv);
 
 static void
-_gl_thread_glIsShader(void *data)
+GL_TH_CB(glTexParameterIuiv)(void *data)
 {
-   Evas_Thread_Command_glIsShader *thread_data =
-      (Evas_Thread_Command_glIsShader *)data;
+   GL_TH_ST(glTexParameterIuiv) *thread_data =
+      *(void **)data;
+
 
-   thread_data->return_value = glIsShader(thread_data->shader);
+   ((GL_TH_FNTYPE(glTexParameterIuiv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI GLboolean
-glIsShader_thread_cmd(GLuint shader)
+void
+GL_TH_FN(glTexParameterIuiv)(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glIsShader(shader);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glIsShader thread_data_local;
-   Evas_Thread_Command_glIsShader *thread_data = &thread_data_local;
+   GL_TH_ST(glTexParameterIuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->shader = shader;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsShader,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexParameterIuiv))orig_func)
+           (target, pname, params);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexParameterIuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexParameterIuiv),
+                              thread_mode);
 }
 
 /*
  * void
- * glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
+ * glGetTexParameterIiv(GLenum target, GLenum pname, GLint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetTexParameterIiv))(GLenum target, GLenum pname, GLint *params);
+
 typedef struct
 {
-   GLuint shader;
+   GL_TH_FNTYPE(glGetTexParameterIiv) orig_func;
+   GLenum target;
    GLenum pname;
    GLint *params;
 
-} Evas_Thread_Command_glGetShaderiv;
+} GL_TH_ST(glGetTexParameterIiv);
 
 static void
-_gl_thread_glGetShaderiv(void *data)
+GL_TH_CB(glGetTexParameterIiv)(void *data)
 {
-   Evas_Thread_Command_glGetShaderiv *thread_data =
-      (Evas_Thread_Command_glGetShaderiv *)data;
+   GL_TH_ST(glGetTexParameterIiv) *thread_data =
+      *(void **)data;
 
-   glGetShaderiv(thread_data->shader,
-                 thread_data->pname,
-                 thread_data->params);
+
+   ((GL_TH_FNTYPE(glGetTexParameterIiv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetShaderiv_thread_cmd(GLuint shader, GLenum pname, GLint *params)
+void
+GL_TH_FN(glGetTexParameterIiv)(GL_TH_DP, GLenum target, GLenum pname, GLint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetTexParameterIiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetShaderiv(shader, pname, params);
+        ((GL_TH_FNTYPE(glGetTexParameterIiv))orig_func)
+           (target, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameterIiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetShaderiv thread_data_local;
-   Evas_Thread_Command_glGetShaderiv *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
+   thread_data->target = target;
    thread_data->pname = pname;
    thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetShaderiv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameterIiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+ * glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetTexParameterIuiv))(GLenum target, GLenum pname, GLuint *params);
+
 typedef struct
 {
-   GLuint program;
-   GLsizei maxCount;
-   GLsizei *count;
-   GLuint *shaders;
+   GL_TH_FNTYPE(glGetTexParameterIuiv) orig_func;
+   GLenum target;
+   GLenum pname;
+   GLuint *params;
 
-} Evas_Thread_Command_glGetAttachedShaders;
+} GL_TH_ST(glGetTexParameterIuiv);
 
 static void
-_gl_thread_glGetAttachedShaders(void *data)
+GL_TH_CB(glGetTexParameterIuiv)(void *data)
+{
+   GL_TH_ST(glGetTexParameterIuiv) *thread_data =
+      *(void **)data;
+
+
+   ((GL_TH_FNTYPE(glGetTexParameterIuiv))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->pname,
+       thread_data->params);
+
+}
+
+void
+GL_TH_FN(glGetTexParameterIuiv)(GL_TH_DP, GLenum target, GLenum pname, GLuint *params)
 {
-   Evas_Thread_Command_glGetAttachedShaders *thread_data =
-      (Evas_Thread_Command_glGetAttachedShaders *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   glGetAttachedShaders(thread_data->program,
-                        thread_data->maxCount,
-                        thread_data->count,
-                        thread_data->shaders);
+   GL_TH_ST(glGetTexParameterIuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glGetAttachedShaders_thread_cmd(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetAttachedShaders(program, maxCount, count, shaders);
+        ((GL_TH_FNTYPE(glGetTexParameterIuiv))orig_func)
+           (target, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetTexParameterIuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetAttachedShaders thread_data_local;
-   Evas_Thread_Command_glGetAttachedShaders *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->maxCount = maxCount;
-   thread_data->count = count;
-   thread_data->shaders = shaders;
+   thread_data->target = target;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetAttachedShaders,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetTexParameterIuiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ * glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param);
  */
 
+typedef void(*GL_TH_FNTYPE(glSamplerParameterIiv))(GLuint sampler, GLenum pname, const GLint *param);
+
 typedef struct
 {
-   GLuint shader;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *infoLog;
+   GL_TH_FNTYPE(glSamplerParameterIiv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   const GLint *param;
 
-} Evas_Thread_Command_glGetShaderInfoLog;
+} GL_TH_ST(glSamplerParameterIiv);
 
 static void
-_gl_thread_glGetShaderInfoLog(void *data)
+GL_TH_CB(glSamplerParameterIiv)(void *data)
 {
-   Evas_Thread_Command_glGetShaderInfoLog *thread_data =
-      (Evas_Thread_Command_glGetShaderInfoLog *)data;
+   GL_TH_ST(glSamplerParameterIiv) *thread_data =
+      *(void **)data;
 
-   glGetShaderInfoLog(thread_data->shader,
-                      thread_data->bufSize,
-                      thread_data->length,
-                      thread_data->infoLog);
+
+   ((GL_TH_FNTYPE(glSamplerParameterIiv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->param);
 
 }
 
-EAPI void
-glGetShaderInfoLog_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+void
+GL_TH_FN(glSamplerParameterIiv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameterIiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetShaderInfoLog(shader, bufSize, length, infoLog);
+        ((GL_TH_FNTYPE(glSamplerParameterIiv))orig_func)
+           (sampler, pname, param);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameterIiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetShaderInfoLog thread_data_local;
-   Evas_Thread_Command_glGetShaderInfoLog *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->infoLog = infoLog;
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetShaderInfoLog,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameterIiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+ * glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param);
  */
 
+typedef void(*GL_TH_FNTYPE(glSamplerParameterIuiv))(GLuint sampler, GLenum pname, const GLuint *param);
+
 typedef struct
 {
-   GLuint shader;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *source;
+   GL_TH_FNTYPE(glSamplerParameterIuiv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   const GLuint *param;
 
-} Evas_Thread_Command_glGetShaderSource;
+} GL_TH_ST(glSamplerParameterIuiv);
 
 static void
-_gl_thread_glGetShaderSource(void *data)
+GL_TH_CB(glSamplerParameterIuiv)(void *data)
 {
-   Evas_Thread_Command_glGetShaderSource *thread_data =
-      (Evas_Thread_Command_glGetShaderSource *)data;
+   GL_TH_ST(glSamplerParameterIuiv) *thread_data =
+      *(void **)data;
 
-   glGetShaderSource(thread_data->shader,
-                     thread_data->bufSize,
-                     thread_data->length,
-                     thread_data->source);
+
+   ((GL_TH_FNTYPE(glSamplerParameterIuiv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->param);
 
 }
 
-EAPI void
-glGetShaderSource_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
+void
+GL_TH_FN(glSamplerParameterIuiv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glSamplerParameterIuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetShaderSource(shader, bufSize, length, source);
+        ((GL_TH_FNTYPE(glSamplerParameterIuiv))orig_func)
+           (sampler, pname, param);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glSamplerParameterIuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetShaderSource thread_data_local;
-   Evas_Thread_Command_glGetShaderSource *thread_data = &thread_data_local;
-
-   thread_data->shader = shader;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->source = source;
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->param = param;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetShaderSource,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glSamplerParameterIuiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+ * glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetSamplerParameterIiv))(GLuint sampler, GLenum pname, GLint *params);
+
 typedef struct
 {
-   GLenum shadertype;
-   GLenum precisiontype;
-   GLint *range;
-   GLint *precision;
+   GL_TH_FNTYPE(glGetSamplerParameterIiv) orig_func;
+   GLuint sampler;
+   GLenum pname;
+   GLint *params;
 
-} Evas_Thread_Command_glGetShaderPrecisionFormat;
+} GL_TH_ST(glGetSamplerParameterIiv);
 
 static void
-_gl_thread_glGetShaderPrecisionFormat(void *data)
+GL_TH_CB(glGetSamplerParameterIiv)(void *data)
 {
-   Evas_Thread_Command_glGetShaderPrecisionFormat *thread_data =
-      (Evas_Thread_Command_glGetShaderPrecisionFormat *)data;
+   GL_TH_ST(glGetSamplerParameterIiv) *thread_data =
+      *(void **)data;
 
-   glGetShaderPrecisionFormat(thread_data->shadertype,
-                              thread_data->precisiontype,
-                              thread_data->range,
-                              thread_data->precision);
+
+   ((GL_TH_FNTYPE(glGetSamplerParameterIiv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetShaderPrecisionFormat_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)
+void
+GL_TH_FN(glGetSamplerParameterIiv)(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSamplerParameterIiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+        ((GL_TH_FNTYPE(glGetSamplerParameterIiv))orig_func)
+           (sampler, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSamplerParameterIiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetShaderPrecisionFormat thread_data_local;
-   Evas_Thread_Command_glGetShaderPrecisionFormat *thread_data = &thread_data_local;
-
-   thread_data->shadertype = shadertype;
-   thread_data->precisiontype = precisiontype;
-   thread_data->range = range;
-   thread_data->precision = precision;
+   thread_data->sampler = sampler;
+   thread_data->pname = pname;
+   thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetShaderPrecisionFormat,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSamplerParameterIiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
+ * glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params);
  */
 
+typedef void(*GL_TH_FNTYPE(glGetSamplerParameterIuiv))(GLuint sampler, GLenum pname, GLuint *params);
+
 typedef struct
 {
-   GLuint index;
+   GL_TH_FNTYPE(glGetSamplerParameterIuiv) orig_func;
+   GLuint sampler;
    GLenum pname;
-   GLfloat *params;
+   GLuint *params;
 
-} Evas_Thread_Command_glGetVertexAttribfv;
+} GL_TH_ST(glGetSamplerParameterIuiv);
 
 static void
-_gl_thread_glGetVertexAttribfv(void *data)
+GL_TH_CB(glGetSamplerParameterIuiv)(void *data)
 {
-   Evas_Thread_Command_glGetVertexAttribfv *thread_data =
-      (Evas_Thread_Command_glGetVertexAttribfv *)data;
+   GL_TH_ST(glGetSamplerParameterIuiv) *thread_data =
+      *(void **)data;
 
-   glGetVertexAttribfv(thread_data->index,
-                       thread_data->pname,
-                       thread_data->params);
+
+   ((GL_TH_FNTYPE(glGetSamplerParameterIuiv))thread_data->orig_func)
+      (thread_data->sampler,
+       thread_data->pname,
+       thread_data->params);
 
 }
 
-EAPI void
-glGetVertexAttribfv_thread_cmd(GLuint index, GLenum pname, GLfloat *params)
+void
+GL_TH_FN(glGetSamplerParameterIuiv)(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glGetSamplerParameterIuiv) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetVertexAttribfv(index, pname, params);
+        ((GL_TH_FNTYPE(glGetSamplerParameterIuiv))orig_func)
+           (sampler, pname, params);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glGetSamplerParameterIuiv) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetVertexAttribfv thread_data_local;
-   Evas_Thread_Command_glGetVertexAttribfv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
+   thread_data->sampler = sampler;
    thread_data->pname = pname;
    thread_data->params = params;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetVertexAttribfv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glGetSamplerParameterIuiv),
                               thread_mode);
 }
 
 /*
  * void
- * glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
+ * glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexBuffer))(GLenum target, GLenum internalformat, GLuint buffer);
+
 typedef struct
 {
-   GLuint index;
-   GLenum pname;
-   GLint *params;
+   GL_TH_FNTYPE(glTexBuffer) orig_func;
+   GLenum target;
+   GLenum internalformat;
+   GLuint buffer;
 
-} Evas_Thread_Command_glGetVertexAttribiv;
+} GL_TH_ST(glTexBuffer);
 
 static void
-_gl_thread_glGetVertexAttribiv(void *data)
+GL_TH_CB(glTexBuffer)(void *data)
 {
-   Evas_Thread_Command_glGetVertexAttribiv *thread_data =
-      (Evas_Thread_Command_glGetVertexAttribiv *)data;
+   GL_TH_ST(glTexBuffer) *thread_data =
+      *(void **)data;
+
 
-   glGetVertexAttribiv(thread_data->index,
-                       thread_data->pname,
-                       thread_data->params);
+   ((GL_TH_FNTYPE(glTexBuffer))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->internalformat,
+       thread_data->buffer);
 
 }
 
-EAPI void
-glGetVertexAttribiv_thread_cmd(GLuint index, GLenum pname, GLint *params)
+void
+GL_TH_FN(glTexBuffer)(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetVertexAttribiv(index, pname, params);
+        ((GL_TH_FNTYPE(glTexBuffer))orig_func)
+           (target, internalformat, buffer);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetVertexAttribiv thread_data_local;
-   Evas_Thread_Command_glGetVertexAttribiv *thread_data = &thread_data_local;
-
-   thread_data->index = index;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   thread_data->target = target;
+   thread_data->internalformat = internalformat;
+   thread_data->buffer = buffer;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetVertexAttribiv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexBuffer),
                               thread_mode);
 }
 
 /*
- * GLboolean
- * glIsProgram(GLuint program);
+ * void
+ * glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexBufferRange))(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLuint program;
+   GL_TH_FNTYPE(glTexBufferRange) orig_func;
+   GLenum target;
+   GLenum internalformat;
+   GLuint buffer;
+   GLintptr offset;
+   GLsizeiptr size;
 
-} Evas_Thread_Command_glIsProgram;
+} GL_TH_ST(glTexBufferRange);
 
 static void
-_gl_thread_glIsProgram(void *data)
+GL_TH_CB(glTexBufferRange)(void *data)
 {
-   Evas_Thread_Command_glIsProgram *thread_data =
-      (Evas_Thread_Command_glIsProgram *)data;
+   GL_TH_ST(glTexBufferRange) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glIsProgram(thread_data->program);
+
+   ((GL_TH_FNTYPE(glTexBufferRange))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->internalformat,
+       thread_data->buffer,
+       thread_data->offset,
+       thread_data->size);
 
 }
 
-EAPI GLboolean
-glIsProgram_thread_cmd(GLuint program)
+void
+GL_TH_FN(glTexBufferRange)(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glIsProgram(program);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glIsProgram thread_data_local;
-   Evas_Thread_Command_glIsProgram *thread_data = &thread_data_local;
+   GL_TH_ST(glTexBufferRange) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->program = program;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsProgram,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(glTexBufferRange))orig_func)
+           (target, internalformat, buffer, offset, size);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexBufferRange) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->target = target;
+   thread_data->internalformat = internalformat;
+   thread_data->buffer = buffer;
+   thread_data->offset = offset;
+   thread_data->size = size;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexBufferRange),
+                              thread_mode);
 }
 
 /*
  * void
- * glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+ * glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
  */
 
+typedef void(*GL_TH_FNTYPE(glTexStorage3DMultisample))(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+
 typedef struct
 {
-   GLuint program;
-   GLsizei bufSize;
-   GLsizei *length;
-   GLchar *infoLog;
+   GL_TH_FNTYPE(glTexStorage3DMultisample) orig_func;
+   GLenum target;
+   GLsizei samples;
+   GLenum internalformat;
+   GLsizei width;
+   GLsizei height;
+   GLsizei depth;
+   GLboolean fixedsamplelocations;
 
-} Evas_Thread_Command_glGetProgramInfoLog;
+} GL_TH_ST(glTexStorage3DMultisample);
 
 static void
-_gl_thread_glGetProgramInfoLog(void *data)
+GL_TH_CB(glTexStorage3DMultisample)(void *data)
 {
-   Evas_Thread_Command_glGetProgramInfoLog *thread_data =
-      (Evas_Thread_Command_glGetProgramInfoLog *)data;
+   GL_TH_ST(glTexStorage3DMultisample) *thread_data =
+      *(void **)data;
+
 
-   glGetProgramInfoLog(thread_data->program,
-                       thread_data->bufSize,
-                       thread_data->length,
-                       thread_data->infoLog);
+   ((GL_TH_FNTYPE(glTexStorage3DMultisample))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->samples,
+       thread_data->internalformat,
+       thread_data->width,
+       thread_data->height,
+       thread_data->depth,
+       thread_data->fixedsamplelocations);
 
 }
 
-EAPI void
-glGetProgramInfoLog_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
+void
+GL_TH_FN(glTexStorage3DMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glTexStorage3DMultisample) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetProgramInfoLog(program, bufSize, length, infoLog);
+        ((GL_TH_FNTYPE(glTexStorage3DMultisample))orig_func)
+           (target, samples, internalformat, width, height, depth, fixedsamplelocations);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glTexStorage3DMultisample) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetProgramInfoLog thread_data_local;
-   Evas_Thread_Command_glGetProgramInfoLog *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->bufSize = bufSize;
-   thread_data->length = length;
-   thread_data->infoLog = infoLog;
+   thread_data->target = target;
+   thread_data->samples = samples;
+   thread_data->internalformat = internalformat;
+   thread_data->width = width;
+   thread_data->height = height;
+   thread_data->depth = depth;
+   thread_data->fixedsamplelocations = fixedsamplelocations;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetProgramInfoLog,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glTexStorage3DMultisample),
                               thread_mode);
 }
 
 /*
  * void
- * glGetProgramiv(GLuint program, GLenum pname, GLint *params);
+ * glEGLImageTargetTexture2DOES(GLenum target, void *image);
  */
 
+typedef void(*GL_TH_FNTYPE(glEGLImageTargetTexture2DOES))(GLenum target, void *image);
+
 typedef struct
 {
-   GLuint program;
-   GLenum pname;
-   GLint *params;
+   GL_TH_FNTYPE(glEGLImageTargetTexture2DOES) orig_func;
+   GLenum target;
+   void *image;
 
-} Evas_Thread_Command_glGetProgramiv;
+} GL_TH_ST(glEGLImageTargetTexture2DOES);
 
 static void
-_gl_thread_glGetProgramiv(void *data)
+GL_TH_CB(glEGLImageTargetTexture2DOES)(void *data)
 {
-   Evas_Thread_Command_glGetProgramiv *thread_data =
-      (Evas_Thread_Command_glGetProgramiv *)data;
+   GL_TH_ST(glEGLImageTargetTexture2DOES) *thread_data =
+      *(void **)data;
 
-   glGetProgramiv(thread_data->program,
-                  thread_data->pname,
-                  thread_data->params);
+
+   ((GL_TH_FNTYPE(glEGLImageTargetTexture2DOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->image);
 
 }
 
-EAPI void
-glGetProgramiv_thread_cmd(GLuint program, GLenum pname, GLint *params)
+void
+GL_TH_FN(glEGLImageTargetTexture2DOES)(GL_TH_DP, GLenum target, void *image)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEGLImageTargetTexture2DOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glGetProgramiv(program, pname, params);
+        ((GL_TH_FNTYPE(glEGLImageTargetTexture2DOES))orig_func)
+           (target, image);
         return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEGLImageTargetTexture2DOES) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetProgramiv thread_data_local;
-   Evas_Thread_Command_glGetProgramiv *thread_data = &thread_data_local;
-
-   thread_data->program = program;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   thread_data->target = target;
+   thread_data->image = image;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetProgramiv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEGLImageTargetTexture2DOES),
                               thread_mode);
 }
 
 /*
- * GLboolean
- * glIsFramebuffer(GLint framebuffer);
+ * void
+ * glEGLImageTargetRenderbufferStorageOES(GLenum target, void *image);
  */
 
+typedef void(*GL_TH_FNTYPE(glEGLImageTargetRenderbufferStorageOES))(GLenum target, void *image);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLint framebuffer;
+   GL_TH_FNTYPE(glEGLImageTargetRenderbufferStorageOES) orig_func;
+   GLenum target;
+   void *image;
 
-} Evas_Thread_Command_glIsFramebuffer;
+} GL_TH_ST(glEGLImageTargetRenderbufferStorageOES);
 
 static void
-_gl_thread_glIsFramebuffer(void *data)
+GL_TH_CB(glEGLImageTargetRenderbufferStorageOES)(void *data)
 {
-   Evas_Thread_Command_glIsFramebuffer *thread_data =
-      (Evas_Thread_Command_glIsFramebuffer *)data;
+   GL_TH_ST(glEGLImageTargetRenderbufferStorageOES) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glIsFramebuffer(thread_data->framebuffer);
+
+   ((GL_TH_FNTYPE(glEGLImageTargetRenderbufferStorageOES))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->image);
 
 }
 
-EAPI GLboolean
-glIsFramebuffer_thread_cmd(GLint framebuffer)
+void
+GL_TH_FN(glEGLImageTargetRenderbufferStorageOES)(GL_TH_DP, GLenum target, void *image)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(glEGLImageTargetRenderbufferStorageOES) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glIsFramebuffer(framebuffer);
+        ((GL_TH_FNTYPE(glEGLImageTargetRenderbufferStorageOES))orig_func)
+           (target, image);
+        return;
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glEGLImageTargetRenderbufferStorageOES) *) + sizeof(GL_TH_ST(glEGLImageTargetRenderbufferStorageOES)), &thcmd_ref);
+   *thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(glEGLImageTargetRenderbufferStorageOES) *));
+   thread_data = *thread_data_ptr;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glIsFramebuffer thread_data_local;
-   Evas_Thread_Command_glIsFramebuffer *thread_data = &thread_data_local;
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_data->framebuffer = framebuffer;
+   thread_data->target = target;
+   thread_data->image = image;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsFramebuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glEGLImageTargetRenderbufferStorageOES),
                               thread_mode);
-
-   return thread_data->return_value;
 }
 
 /*
- * void
- * glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ * EvasGLImage
+ * evasglCreateImage(int target, void* buffer, const int *attrib_list);
  */
 
+typedef EvasGLImage(*GL_TH_FNTYPE(evasglCreateImage))(int target, void* buffer, const int *attrib_list);
+
 typedef struct
 {
-   GLenum target;
-   GLenum pname;
-   GLint *params;
-
-} Evas_Thread_Command_glGetFramebufferParameteriv;
+   GL_TH_FNTYPE(evasglCreateImage) orig_func;
+   EvasGLImage return_value;
+   int target;
+   void* buffer;
+   const int *attrib_list;
 
-void (*orig_evas_glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params);
+} GL_TH_ST(evasglCreateImage);
 
-void
-glGetFramebufferParameteriv_orig_evas_set(void *func)
+static void
+GL_TH_CB(evasglCreateImage)(void *data)
 {
-   orig_evas_glGetFramebufferParameteriv = func;
-}
+   GL_TH_ST(evasglCreateImage) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglCreateImage))thread_data->orig_func)
+      (thread_data->target,
+       thread_data->buffer,
+       thread_data->attrib_list);
 
-void *
-glGetFramebufferParameteriv_orig_evas_get(void)
-{
-   return orig_evas_glGetFramebufferParameteriv;
 }
 
-static void
-_gl_thread_glGetFramebufferParameteriv(void *data)
+EvasGLImage
+GL_TH_FN(evasglCreateImage)(GL_TH_DP, int target, void* buffer, const int *attrib_list)
 {
-   Evas_Thread_Command_glGetFramebufferParameteriv *thread_data =
-      (Evas_Thread_Command_glGetFramebufferParameteriv *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   orig_evas_glGetFramebufferParameteriv(thread_data->target,
-                                         thread_data->pname,
-                                         thread_data->params);
+   GL_TH_ST(evasglCreateImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glGetFramebufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glGetFramebufferParameteriv(target, pname, params);
-        return;
+        return ((GL_TH_FNTYPE(evasglCreateImage))orig_func)
+           (target, buffer, attrib_list);
      }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetFramebufferParameteriv thread_data_local;
-   Evas_Thread_Command_glGetFramebufferParameteriv *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglCreateImage) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   thread_data->buffer = buffer;
+   thread_data->attrib_list = attrib_list;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetFramebufferParameteriv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglCreateImage),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * GLboolean
- * glIsRenderbuffer(GLint renderbuffer);
+ * void
+ * evasglDestroyImage(EvasGLImage image);
  */
 
+typedef void(*GL_TH_FNTYPE(evasglDestroyImage))(EvasGLImage image);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLint renderbuffer;
+   GL_TH_FNTYPE(evasglDestroyImage) orig_func;
+   EvasGLImage image;
 
-} Evas_Thread_Command_glIsRenderbuffer;
+} GL_TH_ST(evasglDestroyImage);
 
 static void
-_gl_thread_glIsRenderbuffer(void *data)
+GL_TH_CB(evasglDestroyImage)(void *data)
 {
-   Evas_Thread_Command_glIsRenderbuffer *thread_data =
-      (Evas_Thread_Command_glIsRenderbuffer *)data;
+   GL_TH_ST(evasglDestroyImage) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glIsRenderbuffer(thread_data->renderbuffer);
+
+   ((GL_TH_FNTYPE(evasglDestroyImage))thread_data->orig_func)
+      (thread_data->image);
 
 }
 
-EAPI GLboolean
-glIsRenderbuffer_thread_cmd(GLint renderbuffer)
+void
+GL_TH_FN(evasglDestroyImage)(GL_TH_DP, EvasGLImage image)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glIsRenderbuffer(renderbuffer);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glIsRenderbuffer thread_data_local;
-   Evas_Thread_Command_glIsRenderbuffer *thread_data = &thread_data_local;
+   GL_TH_ST(evasglDestroyImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->renderbuffer = renderbuffer;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsRenderbuffer,
-                              thread_data,
-                              thread_mode);
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        ((GL_TH_FNTYPE(evasglDestroyImage))orig_func)
+           (image);
+        return;
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglDestroyImage) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   return thread_data->return_value;
+   thread_data->image = image;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglDestroyImage),
+                              thread_mode);
 }
 
 /*
- * void
- * glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
+ * EvasGLImage
+ * evasglCreateImageForContext(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
  */
 
+typedef EvasGLImage(*GL_TH_FNTYPE(evasglCreateImageForContext))(Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
+
 typedef struct
-{
-   GLenum target;
-   GLenum pname;
-   GLint *params;
+{
+   GL_TH_FNTYPE(evasglCreateImageForContext) orig_func;
+   EvasGLImage return_value;
+   Evas_GL *evas_gl;
+   Evas_GL_Context *ctx;
+   int target;
+   void* buffer;
+   const int *attrib_list;
 
-} Evas_Thread_Command_glGetRenderbufferParameteriv;
+} GL_TH_ST(evasglCreateImageForContext);
 
 static void
-_gl_thread_glGetRenderbufferParameteriv(void *data)
+GL_TH_CB(evasglCreateImageForContext)(void *data)
 {
-   Evas_Thread_Command_glGetRenderbufferParameteriv *thread_data =
-      (Evas_Thread_Command_glGetRenderbufferParameteriv *)data;
+   GL_TH_ST(evasglCreateImageForContext) *thread_data =
+      *(void **)data;
+
 
-   glGetRenderbufferParameteriv(thread_data->target,
-                                thread_data->pname,
-                                thread_data->params);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglCreateImageForContext))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->ctx,
+       thread_data->target,
+       thread_data->buffer,
+       thread_data->attrib_list);
 
 }
 
-EAPI void
-glGetRenderbufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params)
+EvasGLImage
+GL_TH_FN(evasglCreateImageForContext)(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glGetRenderbufferParameteriv(target, pname, params);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetRenderbufferParameteriv thread_data_local;
-   Evas_Thread_Command_glGetRenderbufferParameteriv *thread_data = &thread_data_local;
+   GL_TH_ST(evasglCreateImageForContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglCreateImageForContext))orig_func)
+           (evas_gl, ctx, target, buffer, attrib_list);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglCreateImageForContext) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
+   thread_data->evas_gl = evas_gl;
+   thread_data->ctx = ctx;
    thread_data->target = target;
-   thread_data->pname = pname;
-   thread_data->params = params;
+   thread_data->buffer = buffer;
+   thread_data->attrib_list = attrib_list;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetRenderbufferParameteriv,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglCreateImageForContext),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * GLboolean
- * glIsTexture(GLint texture);
+ * EvasGLSync
+ * evasglCreateSync(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
  */
 
+typedef EvasGLSync(*GL_TH_FNTYPE(evasglCreateSync))(Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
+
 typedef struct
 {
-   GLboolean return_value;
-   GLint texture;
+   GL_TH_FNTYPE(evasglCreateSync) orig_func;
+   EvasGLSync return_value;
+   Evas_GL *evas_gl;
+   unsigned int type;
+   const int *attrib_list;
 
-} Evas_Thread_Command_glIsTexture;
+} GL_TH_ST(evasglCreateSync);
 
 static void
-_gl_thread_glIsTexture(void *data)
+GL_TH_CB(evasglCreateSync)(void *data)
 {
-   Evas_Thread_Command_glIsTexture *thread_data =
-      (Evas_Thread_Command_glIsTexture *)data;
+   GL_TH_ST(evasglCreateSync) *thread_data =
+      *(void **)data;
 
-   thread_data->return_value = glIsTexture(thread_data->texture);
+
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglCreateSync))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->type,
+       thread_data->attrib_list);
 
 }
 
-EAPI GLboolean
-glIsTexture_thread_cmd(GLint texture)
+EvasGLSync
+GL_TH_FN(evasglCreateSync)(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        return glIsTexture(texture);
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glIsTexture thread_data_local;
-   Evas_Thread_Command_glIsTexture *thread_data = &thread_data_local;
+   GL_TH_ST(evasglCreateSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->texture = texture;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glIsTexture,
-                              thread_data,
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglCreateSync))orig_func)
+           (evas_gl, type, attrib_list);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglCreateSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->evas_gl = evas_gl;
+   thread_data->type = type;
+   thread_data->attrib_list = attrib_list;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglCreateSync),
                               thread_mode);
 
    return thread_data->return_value;
 }
 
 /*
- * void
- * glStartTiling(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+ * Eina_Bool
+ * evasglDestroySync(Evas_GL *evas_gl, EvasGLSync sync);
  */
 
-typedef struct
-{
-   GLuint a;
-   GLuint b;
-   GLuint c;
-   GLuint d;
-   GLuint e;
-   int command_allocated;
-
-} Evas_Thread_Command_glStartTiling;
-
-void (*orig_evas_glStartTiling)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglDestroySync))(Evas_GL *evas_gl, EvasGLSync sync);
 
-void
-glStartTiling_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glStartTiling = func;
-}
+   GL_TH_FNTYPE(evasglDestroySync) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   EvasGLSync sync;
 
-void *
-glStartTiling_orig_evas_get(void)
-{
-   return orig_evas_glStartTiling;
-}
+} GL_TH_ST(evasglDestroySync);
 
 static void
-_gl_thread_glStartTiling(void *data)
+GL_TH_CB(evasglDestroySync)(void *data)
 {
-   Evas_Thread_Command_glStartTiling *thread_data =
-      (Evas_Thread_Command_glStartTiling *)data;
+   GL_TH_ST(evasglDestroySync) *thread_data =
+      *(void **)data;
 
-   orig_evas_glStartTiling(thread_data->a,
-                           thread_data->b,
-                           thread_data->c,
-                           thread_data->d,
-                           thread_data->e);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglDestroySync))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->sync);
+
 }
 
-EAPI void
-glStartTiling_thread_cmd(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e)
+Eina_Bool
+GL_TH_FN(evasglDestroySync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glStartTiling(a, b, c, d, e);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glStartTiling thread_data_local;
-   Evas_Thread_Command_glStartTiling *thread_data = &thread_data_local;
+   GL_TH_ST(evasglDestroySync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glStartTiling *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glStartTiling));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglDestroySync))orig_func)
+           (evas_gl, sync);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglDestroySync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
+   thread_data->evas_gl = evas_gl;
+   thread_data->sync = sync;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glStartTiling,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglDestroySync),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * void
- * glEndTiling(GLuint a);
+ * int
+ * evasglClientWaitSync(Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
  */
 
-typedef struct
-{
-   GLuint a;
-   int command_allocated;
-
-} Evas_Thread_Command_glEndTiling;
-
-void (*orig_evas_glEndTiling)(GLuint a);
+typedef int(*GL_TH_FNTYPE(evasglClientWaitSync))(Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
 
-void
-glEndTiling_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glEndTiling = func;
-}
+   GL_TH_FNTYPE(evasglClientWaitSync) orig_func;
+   int return_value;
+   Evas_GL *evas_gl;
+   EvasGLSync sync;
+   int flags;
+   EvasGLTime timeout;
 
-void *
-glEndTiling_orig_evas_get(void)
-{
-   return orig_evas_glEndTiling;
-}
+} GL_TH_ST(evasglClientWaitSync);
 
 static void
-_gl_thread_glEndTiling(void *data)
+GL_TH_CB(evasglClientWaitSync)(void *data)
 {
-   Evas_Thread_Command_glEndTiling *thread_data =
-      (Evas_Thread_Command_glEndTiling *)data;
+   GL_TH_ST(evasglClientWaitSync) *thread_data =
+      *(void **)data;
 
-   orig_evas_glEndTiling(thread_data->a);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglClientWaitSync))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->sync,
+       thread_data->flags,
+       thread_data->timeout);
+
 }
 
-EAPI void
-glEndTiling_thread_cmd(GLuint a)
+int
+GL_TH_FN(evasglClientWaitSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glEndTiling(a);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glEndTiling thread_data_local;
-   Evas_Thread_Command_glEndTiling *thread_data = &thread_data_local;
+   GL_TH_ST(evasglClientWaitSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glEndTiling *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glEndTiling));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglClientWaitSync))orig_func)
+           (evas_gl, sync, flags, timeout);
      }
-
-   thread_data->a = a;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glEndTiling,
-                              thread_data,
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglClientWaitSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->evas_gl = evas_gl;
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->timeout = timeout;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglClientWaitSync),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * void
- * glActivateTile(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+ * Eina_Bool
+ * evasglGetSyncAttrib(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
  */
 
-typedef struct
-{
-   GLuint a;
-   GLuint b;
-   GLuint c;
-   GLuint d;
-   GLuint e;
-   int command_allocated;
-
-} Evas_Thread_Command_glActivateTile;
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglGetSyncAttrib))(Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
 
-void (*orig_evas_glActivateTile)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
-
-void
-glActivateTile_orig_evas_set(void *func)
+typedef struct
 {
-   orig_evas_glActivateTile = func;
-}
+   GL_TH_FNTYPE(evasglGetSyncAttrib) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   EvasGLSync sync;
+   int attribute;
+   int *value;
 
-void *
-glActivateTile_orig_evas_get(void)
-{
-   return orig_evas_glActivateTile;
-}
+} GL_TH_ST(evasglGetSyncAttrib);
 
 static void
-_gl_thread_glActivateTile(void *data)
+GL_TH_CB(evasglGetSyncAttrib)(void *data)
 {
-   Evas_Thread_Command_glActivateTile *thread_data =
-      (Evas_Thread_Command_glActivateTile *)data;
+   GL_TH_ST(evasglGetSyncAttrib) *thread_data =
+      *(void **)data;
+
 
-   orig_evas_glActivateTile(thread_data->a,
-                            thread_data->b,
-                            thread_data->c,
-                            thread_data->d,
-                            thread_data->e);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglGetSyncAttrib))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->sync,
+       thread_data->attribute,
+       thread_data->value);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
-EAPI void
-glActivateTile_thread_cmd(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e)
+Eina_Bool
+GL_TH_FN(evasglGetSyncAttrib)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        orig_evas_glActivateTile(a, b, c, d, e);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glActivateTile thread_data_local;
-   Evas_Thread_Command_glActivateTile *thread_data = &thread_data_local;
+   GL_TH_ST(evasglGetSyncAttrib) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glActivateTile *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glActivateTile));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglGetSyncAttrib))orig_func)
+           (evas_gl, sync, attribute, value);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglGetSyncAttrib) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->a = a;
-   thread_data->b = b;
-   thread_data->c = c;
-   thread_data->d = d;
-   thread_data->e = e;
+   thread_data->evas_gl = evas_gl;
+   thread_data->sync = sync;
+   thread_data->attribute = attribute;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glActivateTile,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglGetSyncAttrib),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
- * void
- * glEGLImageTargetTexture2DOES(GLenum target, void *image);
+ * Eina_Bool
+ * evasglSignalSync(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
  */
 
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglSignalSync))(Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
+
 typedef struct
 {
-   GLenum target;
-   void *image;
-
-} Evas_Thread_Command_glEGLImageTargetTexture2DOES;
+   GL_TH_FNTYPE(evasglSignalSync) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   EvasGLSync sync;
+   unsigned mode;
 
-void (*orig_evas_glEGLImageTargetTexture2DOES)(GLenum target, void *image);
+} GL_TH_ST(evasglSignalSync);
 
-void
-glEGLImageTargetTexture2DOES_orig_evas_set(void *func)
+static void
+GL_TH_CB(evasglSignalSync)(void *data)
 {
-   orig_evas_glEGLImageTargetTexture2DOES = func;
-}
+   GL_TH_ST(evasglSignalSync) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglSignalSync))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->sync,
+       thread_data->mode);
 
-void *
-glEGLImageTargetTexture2DOES_orig_evas_get(void)
-{
-   return orig_evas_glEGLImageTargetTexture2DOES;
 }
 
-static void
-_gl_thread_glEGLImageTargetTexture2DOES(void *data)
+Eina_Bool
+GL_TH_FN(evasglSignalSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode)
 {
-   Evas_Thread_Command_glEGLImageTargetTexture2DOES *thread_data =
-      (Evas_Thread_Command_glEGLImageTargetTexture2DOES *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   orig_evas_glEGLImageTargetTexture2DOES(thread_data->target,
-                                          thread_data->image);
+   GL_TH_ST(evasglSignalSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glEGLImageTargetTexture2DOES_thread_cmd(GLenum target, void *image)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glEGLImageTargetTexture2DOES(target, image);
-        return;
+        return ((GL_TH_FNTYPE(evasglSignalSync))orig_func)
+           (evas_gl, sync, mode);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglSignalSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glEGLImageTargetTexture2DOES thread_data_local;
-   Evas_Thread_Command_glEGLImageTargetTexture2DOES *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->image = image;
+   thread_data->evas_gl = evas_gl;
+   thread_data->sync = sync;
+   thread_data->mode = mode;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glEGLImageTargetTexture2DOES,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglSignalSync),
                               thread_mode);
-}
 
-#ifndef GL_GLES
+   return thread_data->return_value;
+}
 
 /*
- * void
- * glAlphaFunc(GLenum func, GLclampf ref);
+ * int
+ * evasglWaitSync(Evas_GL *evas_gl, EvasGLSync sync, int flags);
  */
 
+typedef int(*GL_TH_FNTYPE(evasglWaitSync))(Evas_GL *evas_gl, EvasGLSync sync, int flags);
+
 typedef struct
 {
-   GLenum func;
-   GLclampf ref;
-   int command_allocated;
+   GL_TH_FNTYPE(evasglWaitSync) orig_func;
+   int return_value;
+   Evas_GL *evas_gl;
+   EvasGLSync sync;
+   int flags;
 
-} Evas_Thread_Command_glAlphaFunc;
+} GL_TH_ST(evasglWaitSync);
 
 static void
-_gl_thread_glAlphaFunc(void *data)
+GL_TH_CB(evasglWaitSync)(void *data)
 {
-   Evas_Thread_Command_glAlphaFunc *thread_data =
-      (Evas_Thread_Command_glAlphaFunc *)data;
+   GL_TH_ST(evasglWaitSync) *thread_data =
+      *(void **)data;
 
-   glAlphaFunc(thread_data->func,
-               thread_data->ref);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglWaitSync))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->sync,
+       thread_data->flags);
+
 }
 
-EAPI void
-glAlphaFunc_thread_cmd(GLenum func, GLclampf ref)
+int
+GL_TH_FN(evasglWaitSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glAlphaFunc(func, ref);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glAlphaFunc thread_data_local;
-   Evas_Thread_Command_glAlphaFunc *thread_data = &thread_data_local;
+   GL_TH_ST(evasglWaitSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
 
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glAlphaFunc *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glAlphaFunc));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglWaitSync))orig_func)
+           (evas_gl, sync, flags);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglWaitSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   thread_data->func = func;
-   thread_data->ref = ref;
+   thread_data->evas_gl = evas_gl;
+   thread_data->sync = sync;
+   thread_data->flags = flags;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glAlphaFunc,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglWaitSync),
                               thread_mode);
-}
-#endif
 
-#ifndef GL_GLES
+   return thread_data->return_value;
+}
 
 /*
- * void
- * glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+ * Eina_Bool
+ * evasglBindWaylandDisplay(Evas_GL *evas_gl, void *wl_display);
  */
 
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglBindWaylandDisplay))(Evas_GL *evas_gl, void *wl_display);
+
 typedef struct
 {
-   GLenum target;
-   GLint level;
-   GLenum pname;
-   GLint *params;
+   GL_TH_FNTYPE(evasglBindWaylandDisplay) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   void *wl_display;
 
-} Evas_Thread_Command_glGetTexLevelParameteriv;
+} GL_TH_ST(evasglBindWaylandDisplay);
 
 static void
-_gl_thread_glGetTexLevelParameteriv(void *data)
+GL_TH_CB(evasglBindWaylandDisplay)(void *data)
 {
-   Evas_Thread_Command_glGetTexLevelParameteriv *thread_data =
-      (Evas_Thread_Command_glGetTexLevelParameteriv *)data;
+   GL_TH_ST(evasglBindWaylandDisplay) *thread_data =
+      *(void **)data;
+
 
-   glGetTexLevelParameteriv(thread_data->target,
-                            thread_data->level,
-                            thread_data->pname,
-                            thread_data->params);
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglBindWaylandDisplay))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->wl_display);
 
 }
 
-EAPI void
-glGetTexLevelParameteriv_thread_cmd(GLenum target, GLint level, GLenum pname, GLint *params)
+Eina_Bool
+GL_TH_FN(evasglBindWaylandDisplay)(GL_TH_DP, Evas_GL *evas_gl, void *wl_display)
 {
-   if (!evas_gl_thread_enabled())
-     {
-        glGetTexLevelParameteriv(target, level, pname, params);
-        return;
-     }
-
    int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   Evas_Thread_Command_glGetTexLevelParameteriv thread_data_local;
-   Evas_Thread_Command_glGetTexLevelParameteriv *thread_data = &thread_data_local;
+   GL_TH_ST(evasglBindWaylandDisplay) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-   thread_data->target = target;
-   thread_data->level = level;
-   thread_data->pname = pname;
-   thread_data->params = params;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetTexLevelParameteriv,
-                              thread_data,
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        return ((GL_TH_FNTYPE(evasglBindWaylandDisplay))orig_func)
+           (evas_gl, wl_display);
+     }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglBindWaylandDisplay) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->evas_gl = evas_gl;
+   thread_data->wl_display = wl_display;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglBindWaylandDisplay),
                               thread_mode);
-}
-#endif
 
-#ifndef GL_GLES
+   return thread_data->return_value;
+}
 
 /*
- * void
- * glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+ * Eina_Bool
+ * evasglUnbindWaylandDisplay(Evas_GL *evas_gl, void *wl_display);
  */
 
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglUnbindWaylandDisplay))(Evas_GL *evas_gl, void *wl_display);
+
 typedef struct
 {
-   GLenum target;
-   GLsizei samples;
-   GLenum internalformat;
-   GLsizei width;
-   GLsizei height;
-
-} Evas_Thread_Command_glRenderbufferStorageMultisample;
+   GL_TH_FNTYPE(evasglUnbindWaylandDisplay) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   void *wl_display;
 
-void (*orig_evas_glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+} GL_TH_ST(evasglUnbindWaylandDisplay);
 
-void
-glRenderbufferStorageMultisample_orig_evas_set(void *func)
+static void
+GL_TH_CB(evasglUnbindWaylandDisplay)(void *data)
 {
-   orig_evas_glRenderbufferStorageMultisample = func;
-}
+   GL_TH_ST(evasglUnbindWaylandDisplay) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglUnbindWaylandDisplay))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->wl_display);
 
-void *
-glRenderbufferStorageMultisample_orig_evas_get(void)
-{
-   return orig_evas_glRenderbufferStorageMultisample;
 }
 
-static void
-_gl_thread_glRenderbufferStorageMultisample(void *data)
+Eina_Bool
+GL_TH_FN(evasglUnbindWaylandDisplay)(GL_TH_DP, Evas_GL *evas_gl, void *wl_display)
 {
-   Evas_Thread_Command_glRenderbufferStorageMultisample *thread_data =
-      (Evas_Thread_Command_glRenderbufferStorageMultisample *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   orig_evas_glRenderbufferStorageMultisample(thread_data->target,
-                                              thread_data->samples,
-                                              thread_data->internalformat,
-                                              thread_data->width,
-                                              thread_data->height);
+   GL_TH_ST(evasglUnbindWaylandDisplay) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI void
-glRenderbufferStorageMultisample_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
-        return;
+        return ((GL_TH_FNTYPE(evasglUnbindWaylandDisplay))orig_func)
+           (evas_gl, wl_display);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglUnbindWaylandDisplay) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glRenderbufferStorageMultisample thread_data_local;
-   Evas_Thread_Command_glRenderbufferStorageMultisample *thread_data = &thread_data_local;
-
-   thread_data->target = target;
-   thread_data->samples = samples;
-   thread_data->internalformat = internalformat;
-   thread_data->width = width;
-   thread_data->height = height;
+   thread_data->evas_gl = evas_gl;
+   thread_data->wl_display = wl_display;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glRenderbufferStorageMultisample,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglUnbindWaylandDisplay),
                               thread_mode);
+
+   return thread_data->return_value;
 }
-#endif
 
 /*
- * const GLubyte *
- * glGetStringi(GLenum name, GLuint index);
+ * Eina_Bool
+ * evasglQueryWaylandBuffer(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
  */
 
+typedef Eina_Bool(*GL_TH_FNTYPE(evasglQueryWaylandBuffer))(Evas_GL *evas_gl, void *buffer, int attribute, int *value);
+
 typedef struct
 {
-   const GLubyte * return_value;
-   GLenum name;
-   GLuint index;
+   GL_TH_FNTYPE(evasglQueryWaylandBuffer) orig_func;
+   Eina_Bool return_value;
+   Evas_GL *evas_gl;
+   void *buffer;
+   int attribute;
+   int *value;
 
-} Evas_Thread_Command_glGetStringi;
+} GL_TH_ST(evasglQueryWaylandBuffer);
 
-const GLubyte * (*orig_evas_glGetStringi)(GLenum name, GLuint index);
-
-void
-glGetStringi_orig_evas_set(void *func)
+static void
+GL_TH_CB(evasglQueryWaylandBuffer)(void *data)
 {
-   orig_evas_glGetStringi = func;
-}
+   GL_TH_ST(evasglQueryWaylandBuffer) *thread_data =
+      *(void **)data;
+
+
+   thread_data->return_value = ((GL_TH_FNTYPE(evasglQueryWaylandBuffer))thread_data->orig_func)
+      (thread_data->evas_gl,
+       thread_data->buffer,
+       thread_data->attribute,
+       thread_data->value);
 
-void *
-glGetStringi_orig_evas_get(void)
-{
-   return orig_evas_glGetStringi;
 }
 
-static void
-_gl_thread_glGetStringi(void *data)
+Eina_Bool
+GL_TH_FN(evasglQueryWaylandBuffer)(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value)
 {
-   Evas_Thread_Command_glGetStringi *thread_data =
-      (Evas_Thread_Command_glGetStringi *)data;
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
 
-   thread_data->return_value = orig_evas_glGetStringi(thread_data->name,
-                                                      thread_data->index);
+   GL_TH_ST(evasglQueryWaylandBuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
-}
 
-EAPI const GLubyte *
-glGetStringi_thread_cmd(GLenum name, GLuint index)
-{
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glGetStringi(name, index);
+        return ((GL_TH_FNTYPE(evasglQueryWaylandBuffer))orig_func)
+           (evas_gl, buffer, attribute, value);
      }
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(evasglQueryWaylandBuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glGetStringi thread_data_local;
-   Evas_Thread_Command_glGetStringi *thread_data = &thread_data_local;
-
-   thread_data->name = name;
-   thread_data->index = index;
+   thread_data->evas_gl = evas_gl;
+   thread_data->buffer = buffer;
+   thread_data->attribute = attribute;
+   thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glGetStringi,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(evasglQueryWaylandBuffer),
                               thread_mode);
 
    return thread_data->return_value;
 }
+
+
+typedef struct
+{
+   void (*GL_TH_FN(glActiveTexture))(GL_TH_DP, GLenum texture);
+   void (*GL_TH_FN(glAttachShader))(GL_TH_DP, GLuint program, GLuint shader);
+   void (*GL_TH_FN(glBindAttribLocation))(GL_TH_DP, GLuint program, GLuint index, const char* name);
+   void (*GL_TH_FN(glBindBuffer))(GL_TH_DP, GLenum target, GLuint buffer);
+   void (*GL_TH_FN(glBindFramebuffer))(GL_TH_DP, GLenum target, GLuint framebuffer);
+   void (*GL_TH_FN(glBindRenderbuffer))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+   void (*GL_TH_FN(glBindTexture))(GL_TH_DP, GLenum target, GLuint texture);
+   void (*GL_TH_FN(glBlendColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+   void (*GL_TH_FN(glBlendEquation))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glBlendEquationSeparate))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFunc))(GL_TH_DP, GLenum sfactor, GLenum dfactor);
+   void (*GL_TH_FN(glBlendFuncSeparate))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glBufferData))(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+   void (*GL_TH_FN(glBufferSubData))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+   GLenum (*GL_TH_FN(glCheckFramebufferStatus))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glClear))(GL_TH_DP, GLbitfield mask);
+   void (*GL_TH_FN(glClearColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+   void (*GL_TH_FN(glClearDepthf))(GL_TH_DP, GLclampf depth);
+   void (*GL_TH_FN(glClearStencil))(GL_TH_DP, GLint s);
+   void (*GL_TH_FN(glColorMask))(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+   void (*GL_TH_FN(glCompileShader))(GL_TH_DP, GLuint shader);
+   void (*GL_TH_FN(glCompressedTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCompressedTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCopyTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+   void (*GL_TH_FN(glCopyTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   GLuint (*GL_TH_FN(glCreateProgram))(GL_TH_DP);
+   GLuint (*GL_TH_FN(glCreateShader))(GL_TH_DP, GLenum type);
+   void (*GL_TH_FN(glCullFace))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glDeleteBuffers))(GL_TH_DP, GLsizei n, const GLuint* buffers);
+   void (*GL_TH_FN(glDeleteFramebuffers))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+   void (*GL_TH_FN(glDeleteProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glDeleteRenderbuffers))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+   void (*GL_TH_FN(glDeleteShader))(GL_TH_DP, GLuint shader);
+   void (*GL_TH_FN(glDeleteTextures))(GL_TH_DP, GLsizei n, const GLuint* textures);
+   void (*GL_TH_FN(glDepthFunc))(GL_TH_DP, GLenum func);
+   void (*GL_TH_FN(glDepthMask))(GL_TH_DP, GLboolean flag);
+   void (*GL_TH_FN(glDepthRangef))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+   void (*GL_TH_FN(glDetachShader))(GL_TH_DP, GLuint program, GLuint shader);
+   void (*GL_TH_FN(glDisable))(GL_TH_DP, GLenum cap);
+   void (*GL_TH_FN(glDisableVertexAttribArray))(GL_TH_DP, GLuint index);
+   void (*GL_TH_FN(glDrawArrays))(GL_TH_DP, GLenum mode, GLint first, GLsizei count);
+   void (*GL_TH_FN(glDrawElements))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices);
+   void (*GL_TH_FN(glEnable))(GL_TH_DP, GLenum cap);
+   void (*GL_TH_FN(glEnableVertexAttribArray))(GL_TH_DP, GLuint index);
+   void (*GL_TH_FN(glFinish))(GL_TH_DP);
+   void (*GL_TH_FN(glFlush))(GL_TH_DP);
+   void (*GL_TH_FN(glFramebufferRenderbuffer))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+   void (*GL_TH_FN(glFramebufferTexture2D))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+   void (*GL_TH_FN(glFrontFace))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glGenBuffers))(GL_TH_DP, GLsizei n, GLuint* buffers);
+   void (*GL_TH_FN(glGenerateMipmap))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glGenFramebuffers))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+   void (*GL_TH_FN(glGenRenderbuffers))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+   void (*GL_TH_FN(glGenTextures))(GL_TH_DP, GLsizei n, GLuint* textures);
+   void (*GL_TH_FN(glGetActiveAttrib))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+   void (*GL_TH_FN(glGetActiveUniform))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+   void (*GL_TH_FN(glGetAttachedShaders))(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+   int (*GL_TH_FN(glGetAttribLocation))(GL_TH_DP, GLuint program, const char* name);
+   void (*GL_TH_FN(glGetBooleanv))(GL_TH_DP, GLenum pname, GLboolean* params);
+   void (*GL_TH_FN(glGetBufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   GLenum (*GL_TH_FN(glGetError))(GL_TH_DP);
+   void (*GL_TH_FN(glGetFloatv))(GL_TH_DP, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetFramebufferAttachmentParameteriv))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetIntegerv))(GL_TH_DP, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetProgramiv))(GL_TH_DP, GLuint program, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetProgramInfoLog))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+   void (*GL_TH_FN(glGetRenderbufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetShaderiv))(GL_TH_DP, GLuint shader, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetShaderInfoLog))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+   void (*GL_TH_FN(glGetShaderPrecisionFormat))(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+   void (*GL_TH_FN(glGetShaderSource))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+   const GLubyte* (*GL_TH_FN(glGetString))(GL_TH_DP, GLenum name);
+   void (*GL_TH_FN(glGetTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetUniformfv))(GL_TH_DP, GLuint program, GLint location, GLfloat* params);
+   void (*GL_TH_FN(glGetUniformiv))(GL_TH_DP, GLuint program, GLint location, GLint* params);
+   int (*GL_TH_FN(glGetUniformLocation))(GL_TH_DP, GLuint program, const char* name);
+   void (*GL_TH_FN(glGetVertexAttribfv))(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetVertexAttribiv))(GL_TH_DP, GLuint index, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetVertexAttribPointerv))(GL_TH_DP, GLuint index, GLenum pname, void** pointer);
+   void (*GL_TH_FN(glHint))(GL_TH_DP, GLenum target, GLenum mode);
+   GLboolean (*GL_TH_FN(glIsBuffer))(GL_TH_DP, GLuint buffer);
+   GLboolean (*GL_TH_FN(glIsEnabled))(GL_TH_DP, GLenum cap);
+   GLboolean (*GL_TH_FN(glIsFramebuffer))(GL_TH_DP, GLuint framebuffer);
+   GLboolean (*GL_TH_FN(glIsProgram))(GL_TH_DP, GLuint program);
+   GLboolean (*GL_TH_FN(glIsRenderbuffer))(GL_TH_DP, GLuint renderbuffer);
+   GLboolean (*GL_TH_FN(glIsShader))(GL_TH_DP, GLuint shader);
+   GLboolean (*GL_TH_FN(glIsTexture))(GL_TH_DP, GLuint texture);
+   void (*GL_TH_FN(glLineWidth))(GL_TH_DP, GLfloat width);
+   void (*GL_TH_FN(glLinkProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glPixelStorei))(GL_TH_DP, GLenum pname, GLint param);
+   void (*GL_TH_FN(glPolygonOffset))(GL_TH_DP, GLfloat factor, GLfloat units);
+   void (*GL_TH_FN(glReadPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+   void (*GL_TH_FN(glReleaseShaderCompiler))(GL_TH_DP);
+   void (*GL_TH_FN(glRenderbufferStorage))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glSampleCoverage))(GL_TH_DP, GLclampf value, GLboolean invert);
+   void (*GL_TH_FN(glScissor))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glShaderBinary))(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+   void (*GL_TH_FN(glShaderSource))(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+   void (*GL_TH_FN(glStencilFunc))(GL_TH_DP, GLenum func, GLint ref, GLuint mask);
+   void (*GL_TH_FN(glStencilFuncSeparate))(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask);
+   void (*GL_TH_FN(glStencilMask))(GL_TH_DP, GLuint mask);
+   void (*GL_TH_FN(glStencilMaskSeparate))(GL_TH_DP, GLenum face, GLuint mask);
+   void (*GL_TH_FN(glStencilOp))(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass);
+   void (*GL_TH_FN(glStencilOpSeparate))(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+   void (*GL_TH_FN(glTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glTexParameterf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params);
+   void (*GL_TH_FN(glTexParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, const GLint* params);
+   void (*GL_TH_FN(glTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glUniform1f))(GL_TH_DP, GLint location, GLfloat x);
+   void (*GL_TH_FN(glUniform1fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform1i))(GL_TH_DP, GLint location, GLint x);
+   void (*GL_TH_FN(glUniform1iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform2f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y);
+   void (*GL_TH_FN(glUniform2fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform2i))(GL_TH_DP, GLint location, GLint x, GLint y);
+   void (*GL_TH_FN(glUniform2iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform3f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glUniform3fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform3i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z);
+   void (*GL_TH_FN(glUniform3iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform4f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+   void (*GL_TH_FN(glUniform4fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform4i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w);
+   void (*GL_TH_FN(glUniform4iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniformMatrix2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUniformMatrix3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUniformMatrix4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUseProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glValidateProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glVertexAttrib1f))(GL_TH_DP, GLuint indx, GLfloat x);
+   void (*GL_TH_FN(glVertexAttrib1fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib2f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y);
+   void (*GL_TH_FN(glVertexAttrib2fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib3f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glVertexAttrib3fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib4f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+   void (*GL_TH_FN(glVertexAttrib4fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttribPointer))(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+   void (*GL_TH_FN(glViewport))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glEvasGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+   void (*GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+   void (*GL_TH_FN(glGetProgramBinaryOES))(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+   void (*GL_TH_FN(glProgramBinaryOES))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+   void * (*GL_TH_FN(glMapBufferOES))(GL_TH_DP, GLenum target, GLenum access);
+   GLboolean (*GL_TH_FN(glUnmapBufferOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glGetBufferPointervOES))(GL_TH_DP, GLenum target, GLenum pname, void** params);
+   void (*GL_TH_FN(glTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glCopyTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glCompressedTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCompressedTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glFramebufferTexture3DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+   void (*GL_TH_FN(glGetPerfMonitorGroupsAMD))(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+   void (*GL_TH_FN(glGetPerfMonitorCountersAMD))(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+   void (*GL_TH_FN(glGetPerfMonitorGroupStringAMD))(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+   void (*GL_TH_FN(glGetPerfMonitorCounterStringAMD))(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+   void (*GL_TH_FN(glGetPerfMonitorCounterInfoAMD))(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data);
+   void (*GL_TH_FN(glGenPerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+   void (*GL_TH_FN(glDeletePerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+   void (*GL_TH_FN(glSelectPerfMonitorCountersAMD))(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+   void (*GL_TH_FN(glBeginPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+   void (*GL_TH_FN(glEndPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+   void (*GL_TH_FN(glGetPerfMonitorCounterDataAMD))(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+   void (*GL_TH_FN(glDiscardFramebufferEXT))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments);
+   void (*GL_TH_FN(glMultiDrawArraysEXT))(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+   void (*GL_TH_FN(glMultiDrawElementsEXT))(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+   void (*GL_TH_FN(glDeleteFencesNV))(GL_TH_DP, GLsizei n, const GLuint* fences);
+   void (*GL_TH_FN(glGenFencesNV))(GL_TH_DP, GLsizei n, GLuint* fences);
+   GLboolean (*GL_TH_FN(glIsFenceNV))(GL_TH_DP, GLuint fence);
+   GLboolean (*GL_TH_FN(glTestFenceNV))(GL_TH_DP, GLuint fence);
+   void (*GL_TH_FN(glGetFenceivNV))(GL_TH_DP, GLuint fence, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glFinishFenceNV))(GL_TH_DP, GLuint fence);
+   void (*GL_TH_FN(glSetFenceNV))(GL_TH_DP, GLuint a, GLenum b);
+   void (*GL_TH_FN(glGetDriverControlsQCOM))(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls);
+   void (*GL_TH_FN(glGetDriverControlStringQCOM))(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+   void (*GL_TH_FN(glEnableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+   void (*GL_TH_FN(glDisableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+   void (*GL_TH_FN(glExtGetTexturesQCOM))(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures);
+   void (*GL_TH_FN(glExtGetBuffersQCOM))(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+   void (*GL_TH_FN(glExtGetRenderbuffersQCOM))(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+   void (*GL_TH_FN(glExtGetFramebuffersQCOM))(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+   void (*GL_TH_FN(glExtGetTexLevelParameterivQCOM))(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glExtTexObjectStateOverrideiQCOM))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glExtGetTexSubImageQCOM))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+   void (*GL_TH_FN(glExtGetBufferPointervQCOM))(GL_TH_DP, GLenum target, void** params);
+   void (*GL_TH_FN(glExtGetShadersQCOM))(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders);
+   void (*GL_TH_FN(glExtGetProgramsQCOM))(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+   GLboolean (*GL_TH_FN(glExtIsProgramBinaryQCOM))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glExtGetProgramBinarySourceQCOM))(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length);
+   void (*GL_TH_FN(glAlphaFunc))(GL_TH_DP, GLenum func, GLclampf ref);
+   void (*GL_TH_FN(glClipPlanef))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+   void (*GL_TH_FN(glColor4f))(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+   void (*GL_TH_FN(glFogf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glFogfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glFrustumf))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glGetClipPlanef))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+   void (*GL_TH_FN(glGetLightfv))(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetTexEnvfv))(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glLightModelf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glLightModelfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glLightf))(GL_TH_DP, GLenum light, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glLightfv))(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glLoadMatrixf))(GL_TH_DP, const GLfloat *m);
+   void (*GL_TH_FN(glMaterialf))(GL_TH_DP, GLenum face, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glMultMatrixf))(GL_TH_DP, const GLfloat *m);
+   void (*GL_TH_FN(glMultiTexCoord4f))(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+   void (*GL_TH_FN(glNormal3f))(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz);
+   void (*GL_TH_FN(glOrthof))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glPointParameterf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glPointParameterfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glPointSize))(GL_TH_DP, GLfloat size);
+   void (*GL_TH_FN(glPointSizePointerOES))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer);
+   void (*GL_TH_FN(glRotatef))(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glScalef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glTexEnvf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexEnvfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glTranslatef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glAlphaFuncx))(GL_TH_DP, GLenum func, GLclampx ref);
+   void (*GL_TH_FN(glClearColorx))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+   void (*GL_TH_FN(glClearDepthx))(GL_TH_DP, GLclampx depth);
+   void (*GL_TH_FN(glClientActiveTexture))(GL_TH_DP, GLenum texture);
+   void (*GL_TH_FN(glClipPlanex))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+   void (*GL_TH_FN(glColor4ub))(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+   void (*GL_TH_FN(glColor4x))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+   void (*GL_TH_FN(glColorPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glDepthRangex))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+   void (*GL_TH_FN(glDisableClientState))(GL_TH_DP, GLenum array);
+   void (*GL_TH_FN(glEnableClientState))(GL_TH_DP, GLenum array);
+   void (*GL_TH_FN(glFogx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glFogxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glFrustumx))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glGetClipPlanex))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+   void (*GL_TH_FN(glGetFixedv))(GL_TH_DP, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetLightxv))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetPointerv))(GL_TH_DP, GLenum pname, GLvoid **params);
+   void (*GL_TH_FN(glGetTexEnviv))(GL_TH_DP, GLenum env, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexEnvxv))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glLightModelx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightModelxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLightx))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightxv))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLineWidthx))(GL_TH_DP, GLfixed width);
+   void (*GL_TH_FN(glLoadIdentity))(GL_TH_DP);
+   void (*GL_TH_FN(glLoadMatrixx))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glLogicOp))(GL_TH_DP, GLenum opcode);
+   void (*GL_TH_FN(glMaterialx))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glMatrixMode))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glMultMatrixx))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMultiTexCoord4x))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+   void (*GL_TH_FN(glNormal3x))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+   void (*GL_TH_FN(glNormalPointer))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glOrthox))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glPointParameterx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glPointParameterxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glPointSizex))(GL_TH_DP, GLfixed size);
+   void (*GL_TH_FN(glPolygonOffsetx))(GL_TH_DP, GLfixed factor, GLfixed units);
+   void (*GL_TH_FN(glPopMatrix))(GL_TH_DP);
+   void (*GL_TH_FN(glPushMatrix))(GL_TH_DP);
+   void (*GL_TH_FN(glRotatex))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glSampleCoveragex))(GL_TH_DP, GLclampx value, GLboolean invert);
+   void (*GL_TH_FN(glScalex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glShadeModel))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glTexCoordPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glTexEnvi))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexEnvx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexEnviv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexEnvxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTexParameterx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTranslatex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glVertexPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glBlendEquationSeparateOES))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFuncSeparateOES))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glBlendEquationOES))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glDrawTexsOES))(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+   void (*GL_TH_FN(glDrawTexiOES))(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height);
+   void (*GL_TH_FN(glDrawTexxOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+   void (*GL_TH_FN(glDrawTexsvOES))(GL_TH_DP, const GLshort *coords);
+   void (*GL_TH_FN(glDrawTexivOES))(GL_TH_DP, const GLint *coords);
+   void (*GL_TH_FN(glDrawTexxvOES))(GL_TH_DP, const GLfixed *coords);
+   void (*GL_TH_FN(glDrawTexfOES))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+   void (*GL_TH_FN(glDrawTexfvOES))(GL_TH_DP, const GLfloat *coords);
+   void (*GL_TH_FN(glAlphaFuncxOES))(GL_TH_DP, GLenum func, GLclampx ref);
+   void (*GL_TH_FN(glClearColorxOES))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+   void (*GL_TH_FN(glClearDepthxOES))(GL_TH_DP, GLclampx depth);
+   void (*GL_TH_FN(glClipPlanexOES))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+   void (*GL_TH_FN(glColor4xOES))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+   void (*GL_TH_FN(glDepthRangexOES))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+   void (*GL_TH_FN(glFogxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glFogxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glFrustumxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glGetClipPlanexOES))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+   void (*GL_TH_FN(glGetFixedvOES))(GL_TH_DP, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexEnvxvOES))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glLightModelxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightModelxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLightxOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLineWidthxOES))(GL_TH_DP, GLfixed width);
+   void (*GL_TH_FN(glLoadMatrixxOES))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMaterialxOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glMultMatrixxOES))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMultiTexCoord4xOES))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+   void (*GL_TH_FN(glNormal3xOES))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+   void (*GL_TH_FN(glOrthoxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glPointParameterxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glPointParameterxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glPointSizexOES))(GL_TH_DP, GLfixed size);
+   void (*GL_TH_FN(glPolygonOffsetxOES))(GL_TH_DP, GLfixed factor, GLfixed units);
+   void (*GL_TH_FN(glRotatexOES))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glSampleCoveragexOES))(GL_TH_DP, GLclampx value, GLboolean invert);
+   void (*GL_TH_FN(glScalexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glTexEnvxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexEnvxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTexParameterxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTranslatexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   GLboolean (*GL_TH_FN(glIsRenderbufferOES))(GL_TH_DP, GLuint renderbuffer);
+   void (*GL_TH_FN(glBindRenderbufferOES))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+   void (*GL_TH_FN(glDeleteRenderbuffersOES))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+   void (*GL_TH_FN(glGenRenderbuffersOES))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+   void (*GL_TH_FN(glRenderbufferStorageOES))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glGetRenderbufferParameterivOES))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   GLboolean (*GL_TH_FN(glIsFramebufferOES))(GL_TH_DP, GLuint framebuffer);
+   void (*GL_TH_FN(glBindFramebufferOES))(GL_TH_DP, GLenum target, GLuint framebuffer);
+   void (*GL_TH_FN(glDeleteFramebuffersOES))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+   void (*GL_TH_FN(glGenFramebuffersOES))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+   GLenum (*GL_TH_FN(glCheckFramebufferStatusOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glFramebufferRenderbufferOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+   void (*GL_TH_FN(glFramebufferTexture2DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+   void (*GL_TH_FN(glGetFramebufferAttachmentParameterivOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGenerateMipmapOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glCurrentPaletteMatrixOES))(GL_TH_DP, GLuint matrixpaletteindex);
+   void (*GL_TH_FN(glLoadPaletteFromModelViewMatrixOES))(GL_TH_DP);
+   void (*GL_TH_FN(glMatrixIndexPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glWeightPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   GLbitfield (*GL_TH_FN(glQueryMatrixxOES))(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16]);
+   void (*GL_TH_FN(glDepthRangefOES))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+   void (*GL_TH_FN(glFrustumfOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glOrthofOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glClipPlanefOES))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+   void (*GL_TH_FN(glGetClipPlanefOES))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+   void (*GL_TH_FN(glClearDepthfOES))(GL_TH_DP, GLclampf depth);
+   void (*GL_TH_FN(glTexGenfOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glTexGeniOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexGenxOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glGetTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glBindVertexArrayOES))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glDeleteVertexArraysOES))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+   void (*GL_TH_FN(glGenVertexArraysOES))(GL_TH_DP, GLsizei n, GLuint *arrays);
+   GLboolean (*GL_TH_FN(glIsVertexArrayOES))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glCopyTextureLevelsAPPLE))(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleAPPLE))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glResolveMultisampleFramebufferAPPLE))(GL_TH_DP);
+   GLsync (*GL_TH_FN(glFenceSyncAPPLE))(GL_TH_DP, GLenum condition, GLbitfield flags);
+   GLboolean (*GL_TH_FN(glIsSyncAPPLE))(GL_TH_DP, GLsync sync);
+   void (*GL_TH_FN(glDeleteSyncAPPLE))(GL_TH_DP, GLsync sync);
+   GLenum (*GL_TH_FN(glClientWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glGetInteger64vAPPLE))(GL_TH_DP, GLenum pname, EvasGLint64 *params);
+   void (*GL_TH_FN(glGetSyncivAPPLE))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+   void * (*GL_TH_FN(glMapBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+   void (*GL_TH_FN(glFlushMappedBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleEXT))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisampleEXT))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   GLenum (*GL_TH_FN(glGetGraphicsResetStatusEXT))(GL_TH_DP);
+   void (*GL_TH_FN(glReadnPixelsEXT))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+   void (*GL_TH_FN(glGetnUniformfvEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params);
+   void (*GL_TH_FN(glGetnUniformivEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glTexStorage1DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+   void (*GL_TH_FN(glTexStorage2DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTexStorage3DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glTextureStorage1DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+   void (*GL_TH_FN(glTextureStorage2DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTextureStorage3DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glClipPlanefIMG))(GL_TH_DP, GLenum a, const GLfloat * b);
+   void (*GL_TH_FN(glClipPlanexIMG))(GL_TH_DP, GLenum a, const GLfixed * b);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleIMG))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisampleIMG))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   void (*GL_TH_FN(glActivateTile))(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+   void (*GL_TH_FN(glStartTilingQCOM))(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+   void (*GL_TH_FN(glEndTilingQCOM))(GL_TH_DP, GLbitfield preserveMask);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisample))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   void (*GL_TH_FN(glBeginQuery))(GL_TH_DP, GLenum target, GLuint id);
+   void (*GL_TH_FN(glBeginTransformFeedback))(GL_TH_DP, GLenum primitiveMode);
+   void (*GL_TH_FN(glBindBufferBase))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer);
+   void (*GL_TH_FN(glBindBufferRange))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+   void (*GL_TH_FN(glBindSampler))(GL_TH_DP, GLuint unit, GLuint sampler);
+   void (*GL_TH_FN(glBindTransformFeedback))(GL_TH_DP, GLenum target, GLuint id);
+   void (*GL_TH_FN(glBindVertexArray))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glBlitFramebuffer))(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+   void (*GL_TH_FN(glClearBufferfi))(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+   void (*GL_TH_FN(glClearBufferfv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value);
+   void (*GL_TH_FN(glClearBufferiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value);
+   void (*GL_TH_FN(glClearBufferuiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value);
+   GLenum (*GL_TH_FN(glClientWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glCompressedTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+   void (*GL_TH_FN(glCompressedTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+   void (*GL_TH_FN(glCopyBufferSubData))(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+   void (*GL_TH_FN(glCopyTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glDeleteQueries))(GL_TH_DP, GLsizei n, const GLuint * ids);
+   void (*GL_TH_FN(glDeleteSamplers))(GL_TH_DP, GLsizei n, const GLuint * samplers);
+   void (*GL_TH_FN(glDeleteSync))(GL_TH_DP, GLsync sync);
+   void (*GL_TH_FN(glDeleteTransformFeedbacks))(GL_TH_DP, GLsizei n, const GLuint *ids);
+   void (*GL_TH_FN(glDeleteVertexArrays))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+   void (*GL_TH_FN(glDrawArraysInstanced))(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+   void (*GL_TH_FN(glDrawBuffers))(GL_TH_DP, GLsizei n, const GLenum *bufs);
+   void (*GL_TH_FN(glDrawElementsInstanced))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+   void (*GL_TH_FN(glDrawRangeElements))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+   void (*GL_TH_FN(glEndQuery))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glEndTransformFeedback))(GL_TH_DP);
+   GLsync (*GL_TH_FN(glFenceSync))(GL_TH_DP, GLenum condition, GLbitfield flags);
+   GLsync (*GL_TH_FN(glFlushMappedBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+   void (*GL_TH_FN(glFramebufferTextureLayer))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+   void (*GL_TH_FN(glGenQueries))(GL_TH_DP, GLsizei n, GLuint * ids);
+   void (*GL_TH_FN(glGenSamplers))(GL_TH_DP, GLsizei n, GLuint *samplers);
+   void (*GL_TH_FN(glGenTransformFeedbacks))(GL_TH_DP, GLsizei n, GLuint *ids);
+   void (*GL_TH_FN(glGenVertexArrays))(GL_TH_DP, GLsizei n, GLuint *arrays);
+   void (*GL_TH_FN(glGetActiveUniformBlockiv))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetActiveUniformBlockName))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+   void (*GL_TH_FN(glGetActiveUniformsiv))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetBufferParameteri64v))(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetBufferPointerv))(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params);
+   GLint (*GL_TH_FN(glGetFragDataLocation))(GL_TH_DP, GLuint program, const char * name);
+   void (*GL_TH_FN(glGetInteger64i_v))(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetInteger64v))(GL_TH_DP, GLenum pname, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetIntegeri_v))(GL_TH_DP, GLenum target, GLuint index, GLint * data);
+   void (*GL_TH_FN(glGetInternalformativ))(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glGetProgramBinary))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+   void (*GL_TH_FN(glGetQueryiv))(GL_TH_DP, GLenum target, GLenum pname, GLint * params);
+   void (*GL_TH_FN(glGetQueryObjectuiv))(GL_TH_DP, GLuint id, GLenum pname, GLuint * params);
+   void (*GL_TH_FN(glGetSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params);
+   void (*GL_TH_FN(glGetSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params);
+   const GLubyte * (*GL_TH_FN(glGetStringi))(GL_TH_DP, GLenum name, GLuint index);
+   void (*GL_TH_FN(glGetSynciv))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+   void (*GL_TH_FN(glGetTransformFeedbackVarying))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+   GLuint (*GL_TH_FN(glGetUniformBlockIndex))(GL_TH_DP, GLuint program, const GLchar *uniformBlockName);
+   void (*GL_TH_FN(glGetUniformIndices))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+   void (*GL_TH_FN(glGetUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLuint* params);
+   void (*GL_TH_FN(glGetVertexAttribIiv))(GL_TH_DP, GLuint index, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetVertexAttribIuiv))(GL_TH_DP, GLuint index, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glInvalidateFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments);
+   void (*GL_TH_FN(glInvalidateSubFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+   GLboolean (*GL_TH_FN(glIsQuery))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsSampler))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsSync))(GL_TH_DP, GLsync sync);
+   GLboolean (*GL_TH_FN(glIsTransformFeedback))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsVertexArray))(GL_TH_DP, GLuint array);
+   void * (*GL_TH_FN(glMapBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+   void (*GL_TH_FN(glPauseTransformFeedback))(GL_TH_DP);
+   void (*GL_TH_FN(glProgramBinary))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+   void (*GL_TH_FN(glProgramParameteri))(GL_TH_DP, GLuint program, GLenum pname, GLint value);
+   void (*GL_TH_FN(glReadBuffer))(GL_TH_DP, GLenum src);
+   void (*GL_TH_FN(glRenderbufferStorageMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glResumeTransformFeedback))(GL_TH_DP);
+   void (*GL_TH_FN(glSamplerParameterf))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params);
+   void (*GL_TH_FN(glSamplerParameteri))(GL_TH_DP, GLuint sampler, GLenum pname, GLint param);
+   void (*GL_TH_FN(glSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params);
+   void (*GL_TH_FN(glTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+   void (*GL_TH_FN(glTexStorage2D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTexStorage3D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+   void (*GL_TH_FN(glTransformFeedbackVaryings))(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+   void (*GL_TH_FN(glUniform1ui))(GL_TH_DP, GLint location, GLuint v0);
+   void (*GL_TH_FN(glUniform1uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform2ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1);
+   void (*GL_TH_FN(glUniform2uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform3ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2);
+   void (*GL_TH_FN(glUniform3uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform4ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glUniform4uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniformBlockBinding))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+   void (*GL_TH_FN(glUniformMatrix2x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix3x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix2x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix4x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix3x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix4x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   GLboolean (*GL_TH_FN(glUnmapBuffer))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glVertexAttribDivisor))(GL_TH_DP, GLuint index, GLuint divisor);
+   void (*GL_TH_FN(glVertexAttribI4i))(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+   void (*GL_TH_FN(glVertexAttribI4iv))(GL_TH_DP, GLuint index, const GLint *v);
+   void (*GL_TH_FN(glVertexAttribI4ui))(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glVertexAttribI4uiv))(GL_TH_DP, GLuint index, const GLuint *v);
+   void (*GL_TH_FN(glVertexAttribIPointer))(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glDispatchCompute))(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+   void (*GL_TH_FN(glDispatchComputeIndirect))(GL_TH_DP, GLintptr indirect);
+   void (*GL_TH_FN(glDrawArraysIndirect))(GL_TH_DP, GLenum mode, const void *indirect);
+   void (*GL_TH_FN(glDrawElementsIndirect))(GL_TH_DP, GLenum mode, GLenum type, const void *indirect);
+   void (*GL_TH_FN(glFramebufferParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glGetFramebufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetProgramInterfaceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+   GLuint (*GL_TH_FN(glGetProgramResourceIndex))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+   void (*GL_TH_FN(glGetProgramResourceName))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+   void (*GL_TH_FN(glGetProgramResourceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+   GLint (*GL_TH_FN(glGetProgramResourceLocation))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+   void (*GL_TH_FN(glUseProgramStages))(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program);
+   void (*GL_TH_FN(glActiveShaderProgram))(GL_TH_DP, GLuint pipeline, GLuint program);
+   GLuint (*GL_TH_FN(glCreateShaderProgramv))(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings);
+   void (*GL_TH_FN(glBindProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glDeleteProgramPipelines))(GL_TH_DP, GLsizei n, const GLuint *pipelines);
+   void (*GL_TH_FN(glGenProgramPipelines))(GL_TH_DP, GLsizei n, GLuint *pipelines);
+   GLboolean (*GL_TH_FN(glIsProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glGetProgramPipelineiv))(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glProgramUniform1i))(GL_TH_DP, GLuint program, GLint location, GLint v0);
+   void (*GL_TH_FN(glProgramUniform2i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1);
+   void (*GL_TH_FN(glProgramUniform3i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+   void (*GL_TH_FN(glProgramUniform4i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+   void (*GL_TH_FN(glProgramUniform1ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0);
+   void (*GL_TH_FN(glProgramUniform2ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1);
+   void (*GL_TH_FN(glProgramUniform3ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+   void (*GL_TH_FN(glProgramUniform4ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glProgramUniform1f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0);
+   void (*GL_TH_FN(glProgramUniform2f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1);
+   void (*GL_TH_FN(glProgramUniform3f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+   void (*GL_TH_FN(glProgramUniform4f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+   void (*GL_TH_FN(glProgramUniform1iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform2iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform3iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform4iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform1uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform2uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform3uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform4uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform1fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glValidateProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glGetProgramPipelineInfoLog))(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+   void (*GL_TH_FN(glBindImageTexture))(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+   void (*GL_TH_FN(glGetBooleani_v))(GL_TH_DP, GLenum target, GLuint index, GLboolean *data);
+   void (*GL_TH_FN(glMemoryBarrier))(GL_TH_DP, GLbitfield barriers);
+   void (*GL_TH_FN(glMemoryBarrierByRegion))(GL_TH_DP, GLbitfield barriers);
+   void (*GL_TH_FN(glTexStorage2DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+   void (*GL_TH_FN(glGetMultisamplefv))(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val);
+   void (*GL_TH_FN(glSampleMaski))(GL_TH_DP, GLuint maskNumber, GLbitfield mask);
+   void (*GL_TH_FN(glGetTexLevelParameteriv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexLevelParameterfv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glBindVertexBuffer))(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+   void (*GL_TH_FN(glVertexAttribFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+   void (*GL_TH_FN(glVertexAttribIFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+   void (*GL_TH_FN(glVertexAttribBinding))(GL_TH_DP, GLuint attribindex, GLuint bindingindex);
+   void (*GL_TH_FN(glVertexBindingDivisor))(GL_TH_DP, GLuint bindingindex, GLuint divisor);
+   void (*GL_TH_FN(glBlendBarrier))(GL_TH_DP);
+   void (*GL_TH_FN(glCopyImageSubData))(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+   void (*GL_TH_FN(glDebugMessageControl))(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+   void (*GL_TH_FN(glDebugMessageInsert))(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+   void (*GL_TH_FN(glDebugMessageCallback))(GL_TH_DP, GLDEBUGPROC callback, const void *userParam);
+   GLuint (*GL_TH_FN(glGetDebugMessageLog))(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+   void (*GL_TH_FN(glPushDebugGroup))(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message);
+   void (*GL_TH_FN(glPopDebugGroup))(GL_TH_DP);
+   void (*GL_TH_FN(glObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+   void (*GL_TH_FN(glGetObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+   void (*GL_TH_FN(glObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label);
+   void (*GL_TH_FN(glGetObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+   void (*GL_TH_FN(glEnablei))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glDisablei))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glBlendEquationi))(GL_TH_DP, GLuint buf, GLenum mode);
+   void (*GL_TH_FN(glBlendEquationSeparatei))(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFunci))(GL_TH_DP, GLuint buf, GLenum src, GLenum dst);
+   void (*GL_TH_FN(glBlendFuncSeparatei))(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glColorMaski))(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+   GLboolean (*GL_TH_FN(glIsEnabledi))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glDrawElementsBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+   void (*GL_TH_FN(glDrawRangeElementsBaseVertex))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+   void (*GL_TH_FN(glDrawElementsInstancedBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+   void (*GL_TH_FN(glFramebufferTexture))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level);
+   void (*GL_TH_FN(glPrimitiveBoundingBox))(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+   GLenum (*GL_TH_FN(glGetGraphicsResetStatus))(GL_TH_DP);
+   void (*GL_TH_FN(glReadnPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+   void (*GL_TH_FN(glGetnUniformfv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+   void (*GL_TH_FN(glGetnUniformiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glGetnUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+   void (*GL_TH_FN(glMinSampleShading))(GL_TH_DP, GLfloat value);
+   void (*GL_TH_FN(glPatchParameteri))(GL_TH_DP, GLenum pname, GLint value);
+   void (*GL_TH_FN(glTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params);
+   void (*GL_TH_FN(glGetTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param);
+   void (*GL_TH_FN(glSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param);
+   void (*GL_TH_FN(glGetSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glTexBuffer))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer);
+   void (*GL_TH_FN(glTexBufferRange))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+   void (*GL_TH_FN(glTexStorage3DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+   void (*GL_TH_FN(glEGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, void *image);
+   void (*GL_TH_FN(glEGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, void *image);
+   EvasGLImage (*GL_TH_FN(evasglCreateImage))(GL_TH_DP, int target, void* buffer, const int *attrib_list);
+   void (*GL_TH_FN(evasglDestroyImage))(GL_TH_DP, EvasGLImage image);
+   EvasGLImage (*GL_TH_FN(evasglCreateImageForContext))(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
+   EvasGLSync (*GL_TH_FN(evasglCreateSync))(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
+   Eina_Bool (*GL_TH_FN(evasglDestroySync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync);
+   int (*GL_TH_FN(evasglClientWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
+   Eina_Bool (*GL_TH_FN(evasglGetSyncAttrib))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
+   Eina_Bool (*GL_TH_FN(evasglSignalSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
+   int (*GL_TH_FN(evasglWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags);
+   Eina_Bool (*GL_TH_FN(evasglBindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+   Eina_Bool (*GL_TH_FN(evasglUnbindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+   Eina_Bool (*GL_TH_FN(evasglQueryWaylandBuffer))(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value);
+} Evas_GL_Thread_GL_Generated_Func;
+
+
+static Evas_GL_Thread_GL_Generated_Func th_gl_gen_func;
+Eina_Bool th_gl_gen_func_initialized = EINA_FALSE;
+
+void *
+gl_generated_func_get()
+{
+   if (!th_gl_gen_func_initialized)
+     {
+#define THREAD_FUNCTION_ASSIGN(func) th_gl_gen_func.func = func;
+
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActiveTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAttachShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindAttribLocation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindFramebuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindRenderbuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendColor));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparate));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFunc));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparate));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBufferData));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBufferSubData));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCheckFramebufferStatus));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClear));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColor));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearStencil));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorMask));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompileShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCullFace));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteBuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFramebuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteRenderbuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteTextures));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthFunc));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthMask));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDetachShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisable));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableVertexAttribArray));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArrays));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElements));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnable));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableVertexAttribArray));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFinish));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlush));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferRenderbuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrontFace));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenBuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenerateMipmap));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFramebuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenRenderbuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenTextures));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveAttrib));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniform));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetAttachedShaders));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetAttribLocation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBooleanv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetError));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFloatv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferAttachmentParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetIntegerv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramInfoLog));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetRenderbufferParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderInfoLog));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderPrecisionFormat));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderSource));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetString));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformLocation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribPointerv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glHint));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsEnabled));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFramebuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsRenderbuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsShader));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidth));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLinkProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPixelStorei));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffset));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadPixels));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReleaseShaderCompiler));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorage));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoverage));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScissor));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShaderBinary));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShaderSource));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilFunc));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilFuncSeparate));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilMask));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilMaskSeparate));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilOp));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilOpSeparate));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameteri));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUseProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glValidateProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib1f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib1fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib2f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib3f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib4f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glViewport));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEvasGLImageTargetTexture2DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramBinaryOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramBinaryOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUnmapBufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferPointervOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture3DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorGroupsAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCountersAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorGroupStringAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterStringAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterInfoAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenPerfMonitorsAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeletePerfMonitorsAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSelectPerfMonitorCountersAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginPerfMonitorAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndPerfMonitorAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterDataAMD));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDiscardFramebufferEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiDrawArraysEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiDrawElementsEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFencesNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFencesNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFenceNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTestFenceNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFenceivNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFinishFenceNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSetFenceNV));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDriverControlsQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDriverControlStringQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableDriverControlQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableDriverControlQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexturesQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetBuffersQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetRenderbuffersQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetFramebuffersQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexLevelParameterivQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtTexObjectStateOverrideiQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexSubImageQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetBufferPointervQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetShadersQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetProgramsQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtIsProgramBinaryQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetProgramBinarySourceQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFunc));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthof));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSize));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizePointerOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatef));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFuncx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColorx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientActiveTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4ub));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4x));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableClientState));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableClientState));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFixedv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPointerv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnviv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidthx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadIdentity));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLogicOp));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMatrixMode));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4x));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3x));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormalPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthox));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffsetx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPopMatrix));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPushMatrix));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoveragex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShadeModel));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexCoordPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvi));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnviv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterx));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparateOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparateOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexsOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexiOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexsvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexivOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexfOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexfvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFuncxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColorxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4xOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFixedvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidthxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4xOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3xOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthoxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffsetxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoveragexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatexOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsRenderbufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindRenderbufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteRenderbuffersOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenRenderbuffersOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetRenderbufferParameterivOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFramebufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindFramebufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFramebuffersOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFramebuffersOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCheckFramebufferStatusOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferRenderbufferOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferAttachmentParameterivOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenerateMipmapOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCurrentPaletteMatrixOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadPaletteFromModelViewMatrixOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMatrixIndexPointerOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWeightPointerOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glQueryMatrixxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangefOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumfOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthofOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanefOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanefOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthfOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenfOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenfvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGeniOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenivOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenxOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenfvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenivOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenxvOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexArrayOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteVertexArraysOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenVertexArraysOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsVertexArrayOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTextureLevelsAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glResolveMultisampleFramebufferAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFenceSyncAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSyncAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSyncAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientWaitSyncAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWaitSyncAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64vAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSyncivAPPLE));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferRangeEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlushMappedBufferRangeEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisampleEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetGraphicsResetStatusEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadnPixelsEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformfvEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformivEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage1DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage1DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage2DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage3DEXT));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanefIMG));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanexIMG));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleIMG));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisampleIMG));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActivateTile));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStartTilingQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndTilingQCOM));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisample));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginQuery));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBufferBase));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBufferRange));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindSampler));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexArray));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlitFramebuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferfi));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientWaitSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyBufferSubData));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteQueries));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSamplers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteTransformFeedbacks));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteVertexArrays));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArraysInstanced));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawBuffers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsInstanced));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawRangeElements));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndQuery));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFenceSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlushMappedBufferRange));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTextureLayer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenQueries));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenSamplers));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenTransformFeedbacks));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenVertexArrays));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformBlockiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformBlockName));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformsiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferParameteri64v));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferPointerv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFragDataLocation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64i_v));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64v));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetIntegeri_v));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInternalformativ));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramBinary));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetQueryiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetQueryObjectuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetStringi));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSynciv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTransformFeedbackVarying));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformBlockIndex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformIndices));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribIiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribIuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glInvalidateFramebuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glInvalidateSubFramebuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsQuery));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSampler));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsVertexArray));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferRange));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPauseTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramBinary));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramParameteri));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisample));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glResumeTransformFeedback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterf));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameteri));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage3D));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTransformFeedbackVaryings));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformBlockBinding));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2x3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3x2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2x4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4x2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3x4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4x3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUnmapBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribDivisor));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribIPointer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWaitSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDispatchCompute));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDispatchComputeIndirect));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArraysIndirect));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsIndirect));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferParameteri));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramInterfaceiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceIndex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceName));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceLocation));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUseProgramStages));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActiveShaderProgram));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateShaderProgramv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindProgramPipeline));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteProgramPipelines));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenProgramPipelines));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsProgramPipeline));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramPipelineiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4i));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4ui));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4f));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4iv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4uiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2x3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3x2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2x4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4x2fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3x4fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4x3fv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glValidateProgramPipeline));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramPipelineInfoLog));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindImageTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBooleani_v));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMemoryBarrier));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMemoryBarrierByRegion));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2DMultisample));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMultisamplefv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleMaski));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexLevelParameteriv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexLevelParameterfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribFormat));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribIFormat));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribBinding));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexBindingDivisor));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendBarrier));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyImageSubData));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageControl));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageInsert));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageCallback));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDebugMessageLog));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPushDebugGroup));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPopDebugGroup));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glObjectLabel));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetObjectLabel));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glObjectPtrLabel));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetObjectPtrLabel));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnablei));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisablei));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationi));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparatei));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFunci));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparatei));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorMaski));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsEnabledi));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsBaseVertex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawRangeElementsBaseVertex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsInstancedBaseVertex));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPrimitiveBoundingBox));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetGraphicsResetStatus));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadnPixels));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformfv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMinSampleShading));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPatchParameteri));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterIiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterIuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterIiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterIuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterIiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterIuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterIiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterIuiv));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexBuffer));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexBufferRange));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3DMultisample));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEGLImageTargetTexture2DOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEGLImageTargetRenderbufferStorageOES));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateImage));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglDestroyImage));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateImageForContext));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglDestroySync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglClientWaitSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglGetSyncAttrib));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglSignalSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglWaitSync));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglBindWaylandDisplay));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglUnbindWaylandDisplay));
+        THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglQueryWaylandBuffer));
+
+#undef THREAD_FUNCTION_ASSIGN
+
+        th_gl_gen_func_initialized = EINA_TRUE;
+     }
+
+   return &th_gl_gen_func;
+}
index 2ad06a2..916754e 100644 (file)
 /*
+ * ------------------------------------------------------------------------------
  * This is an automatically generated file using a python script.
  * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
  * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
  * and make use of scripts if you need to fix them.
+ * ------------------------------------------------------------------------------
  */
 
-EAPI GLenum glGetError_thread_cmd(void);
-EAPI void glVertexAttribPointer_thread_cmd(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-EAPI void glEnableVertexAttribArray_thread_cmd(GLuint index);
-EAPI void glDisableVertexAttribArray_thread_cmd(GLuint index);
-EAPI void glDrawArrays_thread_cmd(GLenum mode, GLint first, GLsizei count);
-EAPI void glDrawElements_thread_cmd(GLenum mode, GLsizei count, GLenum type, const void *indices);
-EAPI void glGenBuffers_thread_cmd(GLsizei n, GLuint *buffers);
-EAPI void glDeleteBuffers_thread_cmd(GLsizei n, const GLuint *buffers);
-EAPI void glBindBuffer_thread_cmd(GLenum target, GLuint buffer);
-EAPI void glBufferData_thread_cmd(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+#define EVAS_GL_NO_GL_H_CHECK 1
+#include "Evas_GL.h"
 
-EAPI void glMapBuffer_orig_evas_set(void *func);
-EAPI void *glMapBuffer_orig_evas_get(void);
-EAPI void * glMapBuffer_thread_cmd(GLenum target, GLenum access);
 
-EAPI void glUnmapBuffer_orig_evas_set(void *func);
-EAPI void *glUnmapBuffer_orig_evas_get(void);
-EAPI GLboolean glUnmapBuffer_thread_cmd(GLenum target);
-EAPI GLuint glCreateShader_thread_cmd(GLenum type);
-EAPI void glShaderSource_thread_cmd(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
-EAPI void glCompileShader_thread_cmd(GLuint shader);
-
-EAPI void glReleaseShaderCompiler_orig_evas_set(void *func);
-EAPI void *glReleaseShaderCompiler_orig_evas_get(void);
-EAPI void glReleaseShaderCompiler_thread_cmd(void);
-EAPI void glDeleteShader_thread_cmd(GLuint shader);
-EAPI GLuint glCreateProgram_thread_cmd(void);
-EAPI void glAttachShader_thread_cmd(GLuint program, GLuint shader);
-EAPI void glDetachShader_thread_cmd(GLuint program, GLuint shader);
-EAPI void glLinkProgram_thread_cmd(GLuint program);
-EAPI void glUseProgram_thread_cmd(GLuint program);
-
-EAPI void glProgramParameteri_orig_evas_set(void *func);
-EAPI void *glProgramParameteri_orig_evas_get(void);
-EAPI void glProgramParameteri_thread_cmd(GLuint program, GLenum pname, GLint value);
-EAPI void glDeleteProgram_thread_cmd(GLuint program);
-
-EAPI void glGetProgramBinary_orig_evas_set(void *func);
-EAPI void *glGetProgramBinary_orig_evas_get(void);
-EAPI void glGetProgramBinary_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-
-EAPI void glProgramBinary_orig_evas_set(void *func);
-EAPI void *glProgramBinary_orig_evas_get(void);
-EAPI void glProgramBinary_thread_cmd(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-EAPI void glGetActiveAttrib_thread_cmd(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-EAPI GLint glGetAttribLocation_thread_cmd(GLuint program, const GLchar *name);
-EAPI void glBindAttribLocation_thread_cmd(GLuint program, GLuint index, const GLchar *name);
-EAPI GLint glGetUniformLocation_thread_cmd(GLuint program, const GLchar *name);
-EAPI void glUniform1f_thread_cmd(GLint location, GLfloat v0);
-EAPI void glUniform1i_thread_cmd(GLint location, GLint v0);
-EAPI void glUniform2f_thread_cmd(GLint location, GLfloat v0, GLfloat v1);
-EAPI void glUniform2i_thread_cmd(GLint location, GLint v0, GLint v1);
-EAPI void glUniform3f_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-EAPI void glUniform3i_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2);
-EAPI void glUniform4f_thread_cmd(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-EAPI void glUniform4i_thread_cmd(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-EAPI void glUniform1fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform1iv_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform2fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform2iv_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform3fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform3iv_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniform4fv_thread_cmd(GLint location, GLsizei count, const GLfloat *value);
-EAPI void glUniform4iv_thread_cmd(GLint location, GLsizei count, const GLint *value);
-EAPI void glUniformMatrix2fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix3fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glUniformMatrix4fv_thread_cmd(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-EAPI void glViewport_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glEnable_thread_cmd(GLenum cap);
-EAPI void glDisable_thread_cmd(GLenum cap);
-EAPI void glLineWidth_thread_cmd(GLfloat width);
-EAPI void glPolygonOffset_thread_cmd(GLfloat factor, GLfloat units);
-EAPI void glPixelStorei_thread_cmd(GLenum pname, GLint param);
-EAPI void glActiveTexture_thread_cmd(GLenum texture);
-EAPI void glGenTextures_thread_cmd(GLsizei n, GLuint *textures);
-EAPI void glBindTexture_thread_cmd(GLenum target, GLuint texture);
-EAPI void glDeleteTextures_thread_cmd(GLsizei n, const GLuint *textures);
-EAPI void glTexImage2D_thread_cmd(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-EAPI void glTexSubImage2D_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
-EAPI void glCompressedTexImage2D_thread_cmd(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
-EAPI void glCompressedTexSubImage2D_thread_cmd(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
-EAPI void glTexParameterf_thread_cmd(GLenum target, GLenum pname, GLfloat param);
-EAPI void glTexParameterfv_thread_cmd(GLenum target, GLenum pname, const GLfloat *params);
-EAPI void glTexParameteri_thread_cmd(GLenum target, GLenum pname, GLint param);
-EAPI void glTexParameteriv_thread_cmd(GLenum target, GLenum pname, const GLint *params);
-EAPI void glScissor_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height);
-EAPI void glBlendFunc_thread_cmd(GLenum sfactor, GLenum dfactor);
-EAPI void glBlendColor_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-EAPI void glDepthMask_thread_cmd(GLboolean flag);
-EAPI void glClear_thread_cmd(GLbitfield mask);
-EAPI void glClearColor_thread_cmd(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-EAPI void glReadPixels_thread_cmd(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-
-EAPI void glGenFramebuffers_orig_evas_set(void *func);
-EAPI void *glGenFramebuffers_orig_evas_get(void);
-EAPI void glGenFramebuffers_thread_cmd(GLsizei n, GLuint *framebuffers);
-
-EAPI void glBindFramebuffer_orig_evas_set(void *func);
-EAPI void *glBindFramebuffer_orig_evas_get(void);
-EAPI void glBindFramebuffer_thread_cmd(GLenum target, GLuint framebuffer);
-
-EAPI void glDeleteFramebuffers_orig_evas_set(void *func);
-EAPI void *glDeleteFramebuffers_orig_evas_get(void);
-EAPI void glDeleteFramebuffers_thread_cmd(GLsizei n, const GLuint *framebuffers);
-EAPI void glGenRenderbuffers_thread_cmd(GLsizei n, GLuint *renderbuffers);
-EAPI void glBindRenderbuffer_thread_cmd(GLenum target, GLuint renderbuffer);
-EAPI void glDeleteRenderbuffers_thread_cmd(GLsizei n, const GLuint *renderbuffers);
-EAPI void glRenderbufferStorage_thread_cmd(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-EAPI void glFramebufferRenderbuffer_thread_cmd(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-EAPI void glFramebufferTexture2D_orig_evas_set(void *func);
-EAPI void *glFramebufferTexture2D_orig_evas_get(void);
-EAPI void glFramebufferTexture2D_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-EAPI void glFramebufferTexture2DMultisample_orig_evas_set(void *func);
-EAPI void *glFramebufferTexture2DMultisample_orig_evas_get(void);
-EAPI void glFramebufferTexture2DMultisample_thread_cmd(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
-EAPI GLenum glCheckFramebufferStatus_thread_cmd(GLenum target);
-EAPI void glFlush_thread_cmd(void);
-EAPI void glFinish_thread_cmd(void);
-EAPI void glHint_thread_cmd(GLenum target, GLenum mode);
-EAPI const GLubyte * glGetString_thread_cmd(GLenum name);
-EAPI void glGetBooleanv_thread_cmd(GLenum pname, GLboolean *data);
-EAPI void glGetFloatv_thread_cmd(GLenum pname, GLfloat *data);
-EAPI void glGetIntegerv_thread_cmd(GLenum pname, GLint *data);
-EAPI GLboolean glIsBuffer_thread_cmd(GLint buffer);
-EAPI void glGetBufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params);
-EAPI GLboolean glIsShader_thread_cmd(GLuint shader);
-EAPI void glGetShaderiv_thread_cmd(GLuint shader, GLenum pname, GLint *params);
-EAPI void glGetAttachedShaders_thread_cmd(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
-EAPI void glGetShaderInfoLog_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-EAPI void glGetShaderSource_thread_cmd(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-EAPI void glGetShaderPrecisionFormat_thread_cmd(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
-EAPI void glGetVertexAttribfv_thread_cmd(GLuint index, GLenum pname, GLfloat *params);
-EAPI void glGetVertexAttribiv_thread_cmd(GLuint index, GLenum pname, GLint *params);
-EAPI GLboolean glIsProgram_thread_cmd(GLuint program);
-EAPI void glGetProgramInfoLog_thread_cmd(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-EAPI void glGetProgramiv_thread_cmd(GLuint program, GLenum pname, GLint *params);
-EAPI GLboolean glIsFramebuffer_thread_cmd(GLint framebuffer);
-
-EAPI void glGetFramebufferParameteriv_orig_evas_set(void *func);
-EAPI void *glGetFramebufferParameteriv_orig_evas_get(void);
-EAPI void glGetFramebufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params);
-EAPI GLboolean glIsRenderbuffer_thread_cmd(GLint renderbuffer);
-EAPI void glGetRenderbufferParameteriv_thread_cmd(GLenum target, GLenum pname, GLint *params);
-EAPI GLboolean glIsTexture_thread_cmd(GLint texture);
-
-EAPI void glStartTiling_orig_evas_set(void *func);
-EAPI void *glStartTiling_orig_evas_get(void);
-EAPI void glStartTiling_thread_cmd(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
-
-EAPI void glEndTiling_orig_evas_set(void *func);
-EAPI void *glEndTiling_orig_evas_get(void);
-EAPI void glEndTiling_thread_cmd(GLuint a);
-
-EAPI void glActivateTile_orig_evas_set(void *func);
-EAPI void *glActivateTile_orig_evas_get(void);
-EAPI void glActivateTile_thread_cmd(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
-
-EAPI void glEGLImageTargetTexture2DOES_orig_evas_set(void *func);
-EAPI void *glEGLImageTargetTexture2DOES_orig_evas_get(void);
-EAPI void glEGLImageTargetTexture2DOES_thread_cmd(GLenum target, void *image);
-#ifndef GL_GLES
-
-EAPI void glAlphaFunc_thread_cmd(GLenum func, GLclampf ref);
-#endif
-
-#ifndef GL_GLES
-
-EAPI void glGetTexLevelParameteriv_thread_cmd(GLenum target, GLint level, GLenum pname, GLint *params);
-#endif
-
-#ifndef GL_GLES
-
-
-EAPI void glRenderbufferStorageMultisample_orig_evas_set(void *func);
-EAPI void *glRenderbufferStorageMultisample_orig_evas_get(void);
-EAPI void glRenderbufferStorageMultisample_thread_cmd(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-#endif
-
-
-EAPI void glGetStringi_orig_evas_set(void *func);
-EAPI void *glGetStringi_orig_evas_get(void);
-EAPI const GLubyte * glGetStringi_thread_cmd(GLenum name, GLuint index);
+extern void GL_TH_FN(glActiveTexture)(GL_TH_DP, GLenum texture);
+extern void GL_TH_FN(glAttachShader)(GL_TH_DP, GLuint program, GLuint shader);
+extern void GL_TH_FN(glBindAttribLocation)(GL_TH_DP, GLuint program, GLuint index, const char* name);
+extern void GL_TH_FN(glBindBuffer)(GL_TH_DP, GLenum target, GLuint buffer);
+extern void GL_TH_FN(glBindFramebuffer)(GL_TH_DP, GLenum target, GLuint framebuffer);
+extern void GL_TH_FN(glBindRenderbuffer)(GL_TH_DP, GLenum target, GLuint renderbuffer);
+extern void GL_TH_FN(glBindTexture)(GL_TH_DP, GLenum target, GLuint texture);
+extern void GL_TH_FN(glBlendColor)(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+extern void GL_TH_FN(glBlendEquation)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glBlendEquationSeparate)(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+extern void GL_TH_FN(glBlendFunc)(GL_TH_DP, GLenum sfactor, GLenum dfactor);
+extern void GL_TH_FN(glBlendFuncSeparate)(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void GL_TH_FN(glBufferData)(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+extern void GL_TH_FN(glBufferSubData)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+extern GLenum GL_TH_FN(glCheckFramebufferStatus)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glClear)(GL_TH_DP, GLbitfield mask);
+extern void GL_TH_FN(glClearColor)(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+extern void GL_TH_FN(glClearDepthf)(GL_TH_DP, GLclampf depth);
+extern void GL_TH_FN(glClearStencil)(GL_TH_DP, GLint s);
+extern void GL_TH_FN(glColorMask)(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+extern void GL_TH_FN(glCompileShader)(GL_TH_DP, GLuint shader);
+extern void GL_TH_FN(glCompressedTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+extern void GL_TH_FN(glCompressedTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+extern void GL_TH_FN(glCopyTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+extern void GL_TH_FN(glCopyTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GLuint GL_TH_FN(glCreateProgram)(GL_TH_DP);
+extern GLuint GL_TH_FN(glCreateShader)(GL_TH_DP, GLenum type);
+extern void GL_TH_FN(glCullFace)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glDeleteBuffers)(GL_TH_DP, GLsizei n, const GLuint* buffers);
+extern void GL_TH_FN(glDeleteFramebuffers)(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+extern void GL_TH_FN(glDeleteProgram)(GL_TH_DP, GLuint program);
+extern void GL_TH_FN(glDeleteRenderbuffers)(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+extern void GL_TH_FN(glDeleteShader)(GL_TH_DP, GLuint shader);
+extern void GL_TH_FN(glDeleteTextures)(GL_TH_DP, GLsizei n, const GLuint* textures);
+extern void GL_TH_FN(glDepthFunc)(GL_TH_DP, GLenum func);
+extern void GL_TH_FN(glDepthMask)(GL_TH_DP, GLboolean flag);
+extern void GL_TH_FN(glDepthRangef)(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+extern void GL_TH_FN(glDetachShader)(GL_TH_DP, GLuint program, GLuint shader);
+extern void GL_TH_FN(glDisable)(GL_TH_DP, GLenum cap);
+extern void GL_TH_FN(glDisableVertexAttribArray)(GL_TH_DP, GLuint index);
+extern void GL_TH_FN(glDrawArrays)(GL_TH_DP, GLenum mode, GLint first, GLsizei count);
+extern void GL_TH_FN(glDrawElements)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices);
+extern void GL_TH_FN(glEnable)(GL_TH_DP, GLenum cap);
+extern void GL_TH_FN(glEnableVertexAttribArray)(GL_TH_DP, GLuint index);
+extern void GL_TH_FN(glFinish)(GL_TH_DP);
+extern void GL_TH_FN(glFlush)(GL_TH_DP);
+extern void GL_TH_FN(glFramebufferRenderbuffer)(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+extern void GL_TH_FN(glFramebufferTexture2D)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+extern void GL_TH_FN(glFrontFace)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glGenBuffers)(GL_TH_DP, GLsizei n, GLuint* buffers);
+extern void GL_TH_FN(glGenerateMipmap)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glGenFramebuffers)(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+extern void GL_TH_FN(glGenRenderbuffers)(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+extern void GL_TH_FN(glGenTextures)(GL_TH_DP, GLsizei n, GLuint* textures);
+extern void GL_TH_FN(glGetActiveAttrib)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+extern void GL_TH_FN(glGetActiveUniform)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+extern void GL_TH_FN(glGetAttachedShaders)(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+extern int GL_TH_FN(glGetAttribLocation)(GL_TH_DP, GLuint program, const char* name);
+extern void GL_TH_FN(glGetBooleanv)(GL_TH_DP, GLenum pname, GLboolean* params);
+extern void GL_TH_FN(glGetBufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern GLenum GL_TH_FN(glGetError)(GL_TH_DP);
+extern void GL_TH_FN(glGetFloatv)(GL_TH_DP, GLenum pname, GLfloat* params);
+extern void GL_TH_FN(glGetFramebufferAttachmentParameteriv)(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetIntegerv)(GL_TH_DP, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetProgramiv)(GL_TH_DP, GLuint program, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetProgramInfoLog)(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+extern void GL_TH_FN(glGetRenderbufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetShaderiv)(GL_TH_DP, GLuint shader, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetShaderInfoLog)(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+extern void GL_TH_FN(glGetShaderPrecisionFormat)(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+extern void GL_TH_FN(glGetShaderSource)(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+extern const GLubyte* GL_TH_FN(glGetString)(GL_TH_DP, GLenum name);
+extern void GL_TH_FN(glGetTexParameterfv)(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params);
+extern void GL_TH_FN(glGetTexParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetUniformfv)(GL_TH_DP, GLuint program, GLint location, GLfloat* params);
+extern void GL_TH_FN(glGetUniformiv)(GL_TH_DP, GLuint program, GLint location, GLint* params);
+extern int GL_TH_FN(glGetUniformLocation)(GL_TH_DP, GLuint program, const char* name);
+extern void GL_TH_FN(glGetVertexAttribfv)(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params);
+extern void GL_TH_FN(glGetVertexAttribiv)(GL_TH_DP, GLuint index, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGetVertexAttribPointerv)(GL_TH_DP, GLuint index, GLenum pname, void** pointer);
+extern void GL_TH_FN(glHint)(GL_TH_DP, GLenum target, GLenum mode);
+extern GLboolean GL_TH_FN(glIsBuffer)(GL_TH_DP, GLuint buffer);
+extern GLboolean GL_TH_FN(glIsEnabled)(GL_TH_DP, GLenum cap);
+extern GLboolean GL_TH_FN(glIsFramebuffer)(GL_TH_DP, GLuint framebuffer);
+extern GLboolean GL_TH_FN(glIsProgram)(GL_TH_DP, GLuint program);
+extern GLboolean GL_TH_FN(glIsRenderbuffer)(GL_TH_DP, GLuint renderbuffer);
+extern GLboolean GL_TH_FN(glIsShader)(GL_TH_DP, GLuint shader);
+extern GLboolean GL_TH_FN(glIsTexture)(GL_TH_DP, GLuint texture);
+extern void GL_TH_FN(glLineWidth)(GL_TH_DP, GLfloat width);
+extern void GL_TH_FN(glLinkProgram)(GL_TH_DP, GLuint program);
+extern void GL_TH_FN(glPixelStorei)(GL_TH_DP, GLenum pname, GLint param);
+extern void GL_TH_FN(glPolygonOffset)(GL_TH_DP, GLfloat factor, GLfloat units);
+extern void GL_TH_FN(glReadPixels)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+extern void GL_TH_FN(glReleaseShaderCompiler)(GL_TH_DP);
+extern void GL_TH_FN(glRenderbufferStorage)(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glSampleCoverage)(GL_TH_DP, GLclampf value, GLboolean invert);
+extern void GL_TH_FN(glScissor)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glShaderBinary)(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+extern void GL_TH_FN(glShaderSource)(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+extern void GL_TH_FN(glStencilFunc)(GL_TH_DP, GLenum func, GLint ref, GLuint mask);
+extern void GL_TH_FN(glStencilFuncSeparate)(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask);
+extern void GL_TH_FN(glStencilMask)(GL_TH_DP, GLuint mask);
+extern void GL_TH_FN(glStencilMaskSeparate)(GL_TH_DP, GLenum face, GLuint mask);
+extern void GL_TH_FN(glStencilOp)(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass);
+extern void GL_TH_FN(glStencilOpSeparate)(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+extern void GL_TH_FN(glTexImage2D)(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+extern void GL_TH_FN(glTexParameterf)(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glTexParameterfv)(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params);
+extern void GL_TH_FN(glTexParameteri)(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void GL_TH_FN(glTexParameteriv)(GL_TH_DP, GLenum target, GLenum pname, const GLint* params);
+extern void GL_TH_FN(glTexSubImage2D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+extern void GL_TH_FN(glUniform1f)(GL_TH_DP, GLint location, GLfloat x);
+extern void GL_TH_FN(glUniform1fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void GL_TH_FN(glUniform1i)(GL_TH_DP, GLint location, GLint x);
+extern void GL_TH_FN(glUniform1iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void GL_TH_FN(glUniform2f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y);
+extern void GL_TH_FN(glUniform2fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void GL_TH_FN(glUniform2i)(GL_TH_DP, GLint location, GLint x, GLint y);
+extern void GL_TH_FN(glUniform2iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void GL_TH_FN(glUniform3f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z);
+extern void GL_TH_FN(glUniform3fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void GL_TH_FN(glUniform3i)(GL_TH_DP, GLint location, GLint x, GLint y, GLint z);
+extern void GL_TH_FN(glUniform3iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void GL_TH_FN(glUniform4f)(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+extern void GL_TH_FN(glUniform4fv)(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void GL_TH_FN(glUniform4i)(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w);
+extern void GL_TH_FN(glUniform4iv)(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void GL_TH_FN(glUniformMatrix2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void GL_TH_FN(glUniformMatrix3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void GL_TH_FN(glUniformMatrix4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void GL_TH_FN(glUseProgram)(GL_TH_DP, GLuint program);
+extern void GL_TH_FN(glValidateProgram)(GL_TH_DP, GLuint program);
+extern void GL_TH_FN(glVertexAttrib1f)(GL_TH_DP, GLuint indx, GLfloat x);
+extern void GL_TH_FN(glVertexAttrib1fv)(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void GL_TH_FN(glVertexAttrib2f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y);
+extern void GL_TH_FN(glVertexAttrib2fv)(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void GL_TH_FN(glVertexAttrib3f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+extern void GL_TH_FN(glVertexAttrib3fv)(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void GL_TH_FN(glVertexAttrib4f)(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+extern void GL_TH_FN(glVertexAttrib4fv)(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void GL_TH_FN(glVertexAttribPointer)(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+extern void GL_TH_FN(glViewport)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glEvasGLImageTargetTexture2DOES)(GL_TH_DP, GLenum target, EvasGLImage image);
+extern void GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES)(GL_TH_DP, GLenum target, EvasGLImage image);
+extern void GL_TH_FN(glGetProgramBinaryOES)(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+extern void GL_TH_FN(glProgramBinaryOES)(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+extern void * GL_TH_FN(glMapBufferOES)(GL_TH_DP, GLenum target, GLenum access);
+extern GLboolean GL_TH_FN(glUnmapBufferOES)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glGetBufferPointervOES)(GL_TH_DP, GLenum target, GLenum pname, void** params);
+extern void GL_TH_FN(glTexImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+extern void GL_TH_FN(glTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+extern void GL_TH_FN(glCopyTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glCompressedTexImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+extern void GL_TH_FN(glCompressedTexSubImage3DOES)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+extern void GL_TH_FN(glFramebufferTexture3DOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+extern void GL_TH_FN(glGetPerfMonitorGroupsAMD)(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+extern void GL_TH_FN(glGetPerfMonitorCountersAMD)(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+extern void GL_TH_FN(glGetPerfMonitorGroupStringAMD)(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+extern void GL_TH_FN(glGetPerfMonitorCounterStringAMD)(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+extern void GL_TH_FN(glGetPerfMonitorCounterInfoAMD)(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data);
+extern void GL_TH_FN(glGenPerfMonitorsAMD)(GL_TH_DP, GLsizei n, GLuint* monitors);
+extern void GL_TH_FN(glDeletePerfMonitorsAMD)(GL_TH_DP, GLsizei n, GLuint* monitors);
+extern void GL_TH_FN(glSelectPerfMonitorCountersAMD)(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+extern void GL_TH_FN(glBeginPerfMonitorAMD)(GL_TH_DP, GLuint monitor);
+extern void GL_TH_FN(glEndPerfMonitorAMD)(GL_TH_DP, GLuint monitor);
+extern void GL_TH_FN(glGetPerfMonitorCounterDataAMD)(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+extern void GL_TH_FN(glDiscardFramebufferEXT)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments);
+extern void GL_TH_FN(glMultiDrawArraysEXT)(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+extern void GL_TH_FN(glMultiDrawElementsEXT)(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+extern void GL_TH_FN(glDeleteFencesNV)(GL_TH_DP, GLsizei n, const GLuint* fences);
+extern void GL_TH_FN(glGenFencesNV)(GL_TH_DP, GLsizei n, GLuint* fences);
+extern GLboolean GL_TH_FN(glIsFenceNV)(GL_TH_DP, GLuint fence);
+extern GLboolean GL_TH_FN(glTestFenceNV)(GL_TH_DP, GLuint fence);
+extern void GL_TH_FN(glGetFenceivNV)(GL_TH_DP, GLuint fence, GLenum pname, GLint* params);
+extern void GL_TH_FN(glFinishFenceNV)(GL_TH_DP, GLuint fence);
+extern void GL_TH_FN(glSetFenceNV)(GL_TH_DP, GLuint a, GLenum b);
+extern void GL_TH_FN(glGetDriverControlsQCOM)(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls);
+extern void GL_TH_FN(glGetDriverControlStringQCOM)(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+extern void GL_TH_FN(glEnableDriverControlQCOM)(GL_TH_DP, GLuint driverControl);
+extern void GL_TH_FN(glDisableDriverControlQCOM)(GL_TH_DP, GLuint driverControl);
+extern void GL_TH_FN(glExtGetTexturesQCOM)(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures);
+extern void GL_TH_FN(glExtGetBuffersQCOM)(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+extern void GL_TH_FN(glExtGetRenderbuffersQCOM)(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+extern void GL_TH_FN(glExtGetFramebuffersQCOM)(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+extern void GL_TH_FN(glExtGetTexLevelParameterivQCOM)(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+extern void GL_TH_FN(glExtTexObjectStateOverrideiQCOM)(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void GL_TH_FN(glExtGetTexSubImageQCOM)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+extern void GL_TH_FN(glExtGetBufferPointervQCOM)(GL_TH_DP, GLenum target, void** params);
+extern void GL_TH_FN(glExtGetShadersQCOM)(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders);
+extern void GL_TH_FN(glExtGetProgramsQCOM)(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+extern GLboolean GL_TH_FN(glExtIsProgramBinaryQCOM)(GL_TH_DP, GLuint program);
+extern void GL_TH_FN(glExtGetProgramBinarySourceQCOM)(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length);
+extern void GL_TH_FN(glAlphaFunc)(GL_TH_DP, GLenum func, GLclampf ref);
+extern void GL_TH_FN(glClipPlanef)(GL_TH_DP, GLenum plane, const GLfloat *equation);
+extern void GL_TH_FN(glColor4f)(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+extern void GL_TH_FN(glFogf)(GL_TH_DP, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glFogfv)(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glFrustumf)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void GL_TH_FN(glGetClipPlanef)(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+extern void GL_TH_FN(glGetLightfv)(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params);
+extern void GL_TH_FN(glGetMaterialfv)(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params);
+extern void GL_TH_FN(glGetTexEnvfv)(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params);
+extern void GL_TH_FN(glLightModelf)(GL_TH_DP, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glLightModelfv)(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glLightf)(GL_TH_DP, GLenum light, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glLightfv)(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glLoadMatrixf)(GL_TH_DP, const GLfloat *m);
+extern void GL_TH_FN(glMaterialf)(GL_TH_DP, GLenum face, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glMaterialfv)(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glMultMatrixf)(GL_TH_DP, const GLfloat *m);
+extern void GL_TH_FN(glMultiTexCoord4f)(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+extern void GL_TH_FN(glNormal3f)(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz);
+extern void GL_TH_FN(glOrthof)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void GL_TH_FN(glPointParameterf)(GL_TH_DP, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glPointParameterfv)(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glPointSize)(GL_TH_DP, GLfloat size);
+extern void GL_TH_FN(glPointSizePointerOES)(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer);
+extern void GL_TH_FN(glRotatef)(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+extern void GL_TH_FN(glScalef)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+extern void GL_TH_FN(glTexEnvf)(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glTexEnvfv)(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glTranslatef)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+extern void GL_TH_FN(glAlphaFuncx)(GL_TH_DP, GLenum func, GLclampx ref);
+extern void GL_TH_FN(glClearColorx)(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+extern void GL_TH_FN(glClearDepthx)(GL_TH_DP, GLclampx depth);
+extern void GL_TH_FN(glClientActiveTexture)(GL_TH_DP, GLenum texture);
+extern void GL_TH_FN(glClipPlanex)(GL_TH_DP, GLenum plane, const GLfixed *equation);
+extern void GL_TH_FN(glColor4ub)(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+extern void GL_TH_FN(glColor4x)(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+extern void GL_TH_FN(glColorPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glDepthRangex)(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+extern void GL_TH_FN(glDisableClientState)(GL_TH_DP, GLenum array);
+extern void GL_TH_FN(glEnableClientState)(GL_TH_DP, GLenum array);
+extern void GL_TH_FN(glFogx)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glFogxv)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glFrustumx)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void GL_TH_FN(glGetClipPlanex)(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+extern void GL_TH_FN(glGetFixedv)(GL_TH_DP, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetLightxv)(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetMaterialxv)(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetPointerv)(GL_TH_DP, GLenum pname, GLvoid **params);
+extern void GL_TH_FN(glGetTexEnviv)(GL_TH_DP, GLenum env, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetTexEnvxv)(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetTexParameterxv)(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glLightModelx)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glLightModelxv)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glLightx)(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glLightxv)(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glLineWidthx)(GL_TH_DP, GLfixed width);
+extern void GL_TH_FN(glLoadIdentity)(GL_TH_DP);
+extern void GL_TH_FN(glLoadMatrixx)(GL_TH_DP, const GLfixed *m);
+extern void GL_TH_FN(glLogicOp)(GL_TH_DP, GLenum opcode);
+extern void GL_TH_FN(glMaterialx)(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glMaterialxv)(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glMatrixMode)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glMultMatrixx)(GL_TH_DP, const GLfixed *m);
+extern void GL_TH_FN(glMultiTexCoord4x)(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+extern void GL_TH_FN(glNormal3x)(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+extern void GL_TH_FN(glNormalPointer)(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glOrthox)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void GL_TH_FN(glPointParameterx)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glPointParameterxv)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glPointSizex)(GL_TH_DP, GLfixed size);
+extern void GL_TH_FN(glPolygonOffsetx)(GL_TH_DP, GLfixed factor, GLfixed units);
+extern void GL_TH_FN(glPopMatrix)(GL_TH_DP);
+extern void GL_TH_FN(glPushMatrix)(GL_TH_DP);
+extern void GL_TH_FN(glRotatex)(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+extern void GL_TH_FN(glSampleCoveragex)(GL_TH_DP, GLclampx value, GLboolean invert);
+extern void GL_TH_FN(glScalex)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void GL_TH_FN(glShadeModel)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glTexCoordPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glTexEnvi)(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void GL_TH_FN(glTexEnvx)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glTexEnviv)(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+extern void GL_TH_FN(glTexEnvxv)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glTexParameterx)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glTexParameterxv)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glTranslatex)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void GL_TH_FN(glVertexPointer)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glBlendEquationSeparateOES)(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+extern void GL_TH_FN(glBlendFuncSeparateOES)(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void GL_TH_FN(glBlendEquationOES)(GL_TH_DP, GLenum mode);
+extern void GL_TH_FN(glDrawTexsOES)(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+extern void GL_TH_FN(glDrawTexiOES)(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height);
+extern void GL_TH_FN(glDrawTexxOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+extern void GL_TH_FN(glDrawTexsvOES)(GL_TH_DP, const GLshort *coords);
+extern void GL_TH_FN(glDrawTexivOES)(GL_TH_DP, const GLint *coords);
+extern void GL_TH_FN(glDrawTexxvOES)(GL_TH_DP, const GLfixed *coords);
+extern void GL_TH_FN(glDrawTexfOES)(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+extern void GL_TH_FN(glDrawTexfvOES)(GL_TH_DP, const GLfloat *coords);
+extern void GL_TH_FN(glAlphaFuncxOES)(GL_TH_DP, GLenum func, GLclampx ref);
+extern void GL_TH_FN(glClearColorxOES)(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+extern void GL_TH_FN(glClearDepthxOES)(GL_TH_DP, GLclampx depth);
+extern void GL_TH_FN(glClipPlanexOES)(GL_TH_DP, GLenum plane, const GLfixed *equation);
+extern void GL_TH_FN(glColor4xOES)(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+extern void GL_TH_FN(glDepthRangexOES)(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+extern void GL_TH_FN(glFogxOES)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glFogxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glFrustumxOES)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void GL_TH_FN(glGetClipPlanexOES)(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+extern void GL_TH_FN(glGetFixedvOES)(GL_TH_DP, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetLightxvOES)(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetMaterialxvOES)(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetTexEnvxvOES)(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glGetTexParameterxvOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glLightModelxOES)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glLightModelxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glLightxOES)(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glLightxvOES)(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glLineWidthxOES)(GL_TH_DP, GLfixed width);
+extern void GL_TH_FN(glLoadMatrixxOES)(GL_TH_DP, const GLfixed *m);
+extern void GL_TH_FN(glMaterialxOES)(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glMaterialxvOES)(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glMultMatrixxOES)(GL_TH_DP, const GLfixed *m);
+extern void GL_TH_FN(glMultiTexCoord4xOES)(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+extern void GL_TH_FN(glNormal3xOES)(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+extern void GL_TH_FN(glOrthoxOES)(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void GL_TH_FN(glPointParameterxOES)(GL_TH_DP, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glPointParameterxvOES)(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glPointSizexOES)(GL_TH_DP, GLfixed size);
+extern void GL_TH_FN(glPolygonOffsetxOES)(GL_TH_DP, GLfixed factor, GLfixed units);
+extern void GL_TH_FN(glRotatexOES)(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+extern void GL_TH_FN(glSampleCoveragexOES)(GL_TH_DP, GLclampx value, GLboolean invert);
+extern void GL_TH_FN(glScalexOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void GL_TH_FN(glTexEnvxOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glTexEnvxvOES)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glTexParameterxOES)(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glTexParameterxvOES)(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glTranslatexOES)(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern GLboolean GL_TH_FN(glIsRenderbufferOES)(GL_TH_DP, GLuint renderbuffer);
+extern void GL_TH_FN(glBindRenderbufferOES)(GL_TH_DP, GLenum target, GLuint renderbuffer);
+extern void GL_TH_FN(glDeleteRenderbuffersOES)(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+extern void GL_TH_FN(glGenRenderbuffersOES)(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+extern void GL_TH_FN(glRenderbufferStorageOES)(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glGetRenderbufferParameterivOES)(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern GLboolean GL_TH_FN(glIsFramebufferOES)(GL_TH_DP, GLuint framebuffer);
+extern void GL_TH_FN(glBindFramebufferOES)(GL_TH_DP, GLenum target, GLuint framebuffer);
+extern void GL_TH_FN(glDeleteFramebuffersOES)(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+extern void GL_TH_FN(glGenFramebuffersOES)(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+extern GLenum GL_TH_FN(glCheckFramebufferStatusOES)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glFramebufferRenderbufferOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+extern void GL_TH_FN(glFramebufferTexture2DOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+extern void GL_TH_FN(glGetFramebufferAttachmentParameterivOES)(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+extern void GL_TH_FN(glGenerateMipmapOES)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glCurrentPaletteMatrixOES)(GL_TH_DP, GLuint matrixpaletteindex);
+extern void GL_TH_FN(glLoadPaletteFromModelViewMatrixOES)(GL_TH_DP);
+extern void GL_TH_FN(glMatrixIndexPointerOES)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glWeightPointerOES)(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern GLbitfield GL_TH_FN(glQueryMatrixxOES)(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16]);
+extern void GL_TH_FN(glDepthRangefOES)(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+extern void GL_TH_FN(glFrustumfOES)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void GL_TH_FN(glOrthofOES)(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void GL_TH_FN(glClipPlanefOES)(GL_TH_DP, GLenum plane, const GLfloat *equation);
+extern void GL_TH_FN(glGetClipPlanefOES)(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+extern void GL_TH_FN(glClearDepthfOES)(GL_TH_DP, GLclampf depth);
+extern void GL_TH_FN(glTexGenfOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glTexGenfvOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params);
+extern void GL_TH_FN(glTexGeniOES)(GL_TH_DP, GLenum coord, GLenum pname, GLint param);
+extern void GL_TH_FN(glTexGenivOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params);
+extern void GL_TH_FN(glTexGenxOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param);
+extern void GL_TH_FN(glTexGenxvOES)(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params);
+extern void GL_TH_FN(glGetTexGenfvOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params);
+extern void GL_TH_FN(glGetTexGenivOES)(GL_TH_DP, GLenum coord, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetTexGenxvOES)(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params);
+extern void GL_TH_FN(glBindVertexArrayOES)(GL_TH_DP, GLuint array);
+extern void GL_TH_FN(glDeleteVertexArraysOES)(GL_TH_DP, GLsizei n, const GLuint *arrays);
+extern void GL_TH_FN(glGenVertexArraysOES)(GL_TH_DP, GLsizei n, GLuint *arrays);
+extern GLboolean GL_TH_FN(glIsVertexArrayOES)(GL_TH_DP, GLuint array);
+extern void GL_TH_FN(glCopyTextureLevelsAPPLE)(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+extern void GL_TH_FN(glRenderbufferStorageMultisampleAPPLE)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void GL_TH_FN(glResolveMultisampleFramebufferAPPLE)(GL_TH_DP);
+extern GLsync GL_TH_FN(glFenceSyncAPPLE)(GL_TH_DP, GLenum condition, GLbitfield flags);
+extern GLboolean GL_TH_FN(glIsSyncAPPLE)(GL_TH_DP, GLsync sync);
+extern void GL_TH_FN(glDeleteSyncAPPLE)(GL_TH_DP, GLsync sync);
+extern GLenum GL_TH_FN(glClientWaitSyncAPPLE)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void GL_TH_FN(glWaitSyncAPPLE)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void GL_TH_FN(glGetInteger64vAPPLE)(GL_TH_DP, GLenum pname, EvasGLint64 *params);
+extern void GL_TH_FN(glGetSyncivAPPLE)(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+extern void * GL_TH_FN(glMapBufferRangeEXT)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern void GL_TH_FN(glFlushMappedBufferRangeEXT)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+extern void GL_TH_FN(glRenderbufferStorageMultisampleEXT)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void GL_TH_FN(glFramebufferTexture2DMultisampleEXT)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern GLenum GL_TH_FN(glGetGraphicsResetStatusEXT)(GL_TH_DP);
+extern void GL_TH_FN(glReadnPixelsEXT)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+extern void GL_TH_FN(glGetnUniformfvEXT)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params);
+extern void GL_TH_FN(glGetnUniformivEXT)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+extern void GL_TH_FN(glTexStorage1DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+extern void GL_TH_FN(glTexStorage2DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glTexStorage3DEXT)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void GL_TH_FN(glTextureStorage1DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+extern void GL_TH_FN(glTextureStorage2DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glTextureStorage3DEXT)(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void GL_TH_FN(glClipPlanefIMG)(GL_TH_DP, GLenum a, const GLfloat * b);
+extern void GL_TH_FN(glClipPlanexIMG)(GL_TH_DP, GLenum a, const GLfixed * b);
+extern void GL_TH_FN(glRenderbufferStorageMultisampleIMG)(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void GL_TH_FN(glFramebufferTexture2DMultisampleIMG)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern void GL_TH_FN(glActivateTile)(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+extern void GL_TH_FN(glStartTilingQCOM)(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+extern void GL_TH_FN(glEndTilingQCOM)(GL_TH_DP, GLbitfield preserveMask);
+extern void GL_TH_FN(glFramebufferTexture2DMultisample)(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern void GL_TH_FN(glBeginQuery)(GL_TH_DP, GLenum target, GLuint id);
+extern void GL_TH_FN(glBeginTransformFeedback)(GL_TH_DP, GLenum primitiveMode);
+extern void GL_TH_FN(glBindBufferBase)(GL_TH_DP, GLenum target, GLuint index, GLuint buffer);
+extern void GL_TH_FN(glBindBufferRange)(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern void GL_TH_FN(glBindSampler)(GL_TH_DP, GLuint unit, GLuint sampler);
+extern void GL_TH_FN(glBindTransformFeedback)(GL_TH_DP, GLenum target, GLuint id);
+extern void GL_TH_FN(glBindVertexArray)(GL_TH_DP, GLuint array);
+extern void GL_TH_FN(glBlitFramebuffer)(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+extern void GL_TH_FN(glClearBufferfi)(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+extern void GL_TH_FN(glClearBufferfv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value);
+extern void GL_TH_FN(glClearBufferiv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value);
+extern void GL_TH_FN(glClearBufferuiv)(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value);
+extern GLenum GL_TH_FN(glClientWaitSync)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void GL_TH_FN(glCompressedTexImage3D)(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+extern void GL_TH_FN(glCompressedTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+extern void GL_TH_FN(glCopyBufferSubData)(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+extern void GL_TH_FN(glCopyTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glDeleteQueries)(GL_TH_DP, GLsizei n, const GLuint * ids);
+extern void GL_TH_FN(glDeleteSamplers)(GL_TH_DP, GLsizei n, const GLuint * samplers);
+extern void GL_TH_FN(glDeleteSync)(GL_TH_DP, GLsync sync);
+extern void GL_TH_FN(glDeleteTransformFeedbacks)(GL_TH_DP, GLsizei n, const GLuint *ids);
+extern void GL_TH_FN(glDeleteVertexArrays)(GL_TH_DP, GLsizei n, const GLuint *arrays);
+extern void GL_TH_FN(glDrawArraysInstanced)(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+extern void GL_TH_FN(glDrawBuffers)(GL_TH_DP, GLsizei n, const GLenum *bufs);
+extern void GL_TH_FN(glDrawElementsInstanced)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+extern void GL_TH_FN(glDrawRangeElements)(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+extern void GL_TH_FN(glEndQuery)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glEndTransformFeedback)(GL_TH_DP);
+extern GLsync GL_TH_FN(glFenceSync)(GL_TH_DP, GLenum condition, GLbitfield flags);
+extern GLsync GL_TH_FN(glFlushMappedBufferRange)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+extern void GL_TH_FN(glFramebufferTextureLayer)(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+extern void GL_TH_FN(glGenQueries)(GL_TH_DP, GLsizei n, GLuint * ids);
+extern void GL_TH_FN(glGenSamplers)(GL_TH_DP, GLsizei n, GLuint *samplers);
+extern void GL_TH_FN(glGenTransformFeedbacks)(GL_TH_DP, GLsizei n, GLuint *ids);
+extern void GL_TH_FN(glGenVertexArrays)(GL_TH_DP, GLsizei n, GLuint *arrays);
+extern void GL_TH_FN(glGetActiveUniformBlockiv)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetActiveUniformBlockName)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+extern void GL_TH_FN(glGetActiveUniformsiv)(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetBufferParameteri64v)(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data);
+extern void GL_TH_FN(glGetBufferPointerv)(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params);
+extern GLint GL_TH_FN(glGetFragDataLocation)(GL_TH_DP, GLuint program, const char * name);
+extern void GL_TH_FN(glGetInteger64i_v)(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data);
+extern void GL_TH_FN(glGetInteger64v)(GL_TH_DP, GLenum pname, EvasGLint64 * data);
+extern void GL_TH_FN(glGetIntegeri_v)(GL_TH_DP, GLenum target, GLuint index, GLint * data);
+extern void GL_TH_FN(glGetInternalformativ)(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+extern void GL_TH_FN(glGetProgramBinary)(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+extern void GL_TH_FN(glGetQueryiv)(GL_TH_DP, GLenum target, GLenum pname, GLint * params);
+extern void GL_TH_FN(glGetQueryObjectuiv)(GL_TH_DP, GLuint id, GLenum pname, GLuint * params);
+extern void GL_TH_FN(glGetSamplerParameterfv)(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params);
+extern void GL_TH_FN(glGetSamplerParameteriv)(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params);
+extern const GLubyte * GL_TH_FN(glGetStringi)(GL_TH_DP, GLenum name, GLuint index);
+extern void GL_TH_FN(glGetSynciv)(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+extern void GL_TH_FN(glGetTransformFeedbackVarying)(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+extern GLuint GL_TH_FN(glGetUniformBlockIndex)(GL_TH_DP, GLuint program, const GLchar *uniformBlockName);
+extern void GL_TH_FN(glGetUniformIndices)(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+extern void GL_TH_FN(glGetUniformuiv)(GL_TH_DP, GLuint program, GLint location, GLuint* params);
+extern void GL_TH_FN(glGetVertexAttribIiv)(GL_TH_DP, GLuint index, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetVertexAttribIuiv)(GL_TH_DP, GLuint index, GLenum pname, GLuint *params);
+extern void GL_TH_FN(glInvalidateFramebuffer)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments);
+extern void GL_TH_FN(glInvalidateSubFramebuffer)(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GLboolean GL_TH_FN(glIsQuery)(GL_TH_DP, GLuint id);
+extern GLboolean GL_TH_FN(glIsSampler)(GL_TH_DP, GLuint id);
+extern GLboolean GL_TH_FN(glIsSync)(GL_TH_DP, GLsync sync);
+extern GLboolean GL_TH_FN(glIsTransformFeedback)(GL_TH_DP, GLuint id);
+extern GLboolean GL_TH_FN(glIsVertexArray)(GL_TH_DP, GLuint array);
+extern void * GL_TH_FN(glMapBufferRange)(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern void GL_TH_FN(glPauseTransformFeedback)(GL_TH_DP);
+extern void GL_TH_FN(glProgramBinary)(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+extern void GL_TH_FN(glProgramParameteri)(GL_TH_DP, GLuint program, GLenum pname, GLint value);
+extern void GL_TH_FN(glReadBuffer)(GL_TH_DP, GLenum src);
+extern void GL_TH_FN(glRenderbufferStorageMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glResumeTransformFeedback)(GL_TH_DP);
+extern void GL_TH_FN(glSamplerParameterf)(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param);
+extern void GL_TH_FN(glSamplerParameterfv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params);
+extern void GL_TH_FN(glSamplerParameteri)(GL_TH_DP, GLuint sampler, GLenum pname, GLint param);
+extern void GL_TH_FN(glSamplerParameteriv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params);
+extern void GL_TH_FN(glTexImage3D)(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+extern void GL_TH_FN(glTexStorage2D)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void GL_TH_FN(glTexStorage3D)(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void GL_TH_FN(glTexSubImage3D)(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+extern void GL_TH_FN(glTransformFeedbackVaryings)(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+extern void GL_TH_FN(glUniform1ui)(GL_TH_DP, GLint location, GLuint v0);
+extern void GL_TH_FN(glUniform1uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glUniform2ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1);
+extern void GL_TH_FN(glUniform2uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glUniform3ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern void GL_TH_FN(glUniform3uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glUniform4ui)(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void GL_TH_FN(glUniform4uiv)(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glUniformBlockBinding)(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+extern void GL_TH_FN(glUniformMatrix2x3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glUniformMatrix3x2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glUniformMatrix2x4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glUniformMatrix4x2fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glUniformMatrix3x4fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glUniformMatrix4x3fv)(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern GLboolean GL_TH_FN(glUnmapBuffer)(GL_TH_DP, GLenum target);
+extern void GL_TH_FN(glVertexAttribDivisor)(GL_TH_DP, GLuint index, GLuint divisor);
+extern void GL_TH_FN(glVertexAttribI4i)(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+extern void GL_TH_FN(glVertexAttribI4iv)(GL_TH_DP, GLuint index, const GLint *v);
+extern void GL_TH_FN(glVertexAttribI4ui)(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void GL_TH_FN(glVertexAttribI4uiv)(GL_TH_DP, GLuint index, const GLuint *v);
+extern void GL_TH_FN(glVertexAttribIPointer)(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void GL_TH_FN(glWaitSync)(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void GL_TH_FN(glDispatchCompute)(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+extern void GL_TH_FN(glDispatchComputeIndirect)(GL_TH_DP, GLintptr indirect);
+extern void GL_TH_FN(glDrawArraysIndirect)(GL_TH_DP, GLenum mode, const void *indirect);
+extern void GL_TH_FN(glDrawElementsIndirect)(GL_TH_DP, GLenum mode, GLenum type, const void *indirect);
+extern void GL_TH_FN(glFramebufferParameteri)(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void GL_TH_FN(glGetFramebufferParameteriv)(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetProgramInterfaceiv)(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+extern GLuint GL_TH_FN(glGetProgramResourceIndex)(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+extern void GL_TH_FN(glGetProgramResourceName)(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+extern void GL_TH_FN(glGetProgramResourceiv)(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+extern GLint GL_TH_FN(glGetProgramResourceLocation)(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+extern void GL_TH_FN(glUseProgramStages)(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program);
+extern void GL_TH_FN(glActiveShaderProgram)(GL_TH_DP, GLuint pipeline, GLuint program);
+extern GLuint GL_TH_FN(glCreateShaderProgramv)(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings);
+extern void GL_TH_FN(glBindProgramPipeline)(GL_TH_DP, GLuint pipeline);
+extern void GL_TH_FN(glDeleteProgramPipelines)(GL_TH_DP, GLsizei n, const GLuint *pipelines);
+extern void GL_TH_FN(glGenProgramPipelines)(GL_TH_DP, GLsizei n, GLuint *pipelines);
+extern GLboolean GL_TH_FN(glIsProgramPipeline)(GL_TH_DP, GLuint pipeline);
+extern void GL_TH_FN(glGetProgramPipelineiv)(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params);
+extern void GL_TH_FN(glProgramUniform1i)(GL_TH_DP, GLuint program, GLint location, GLint v0);
+extern void GL_TH_FN(glProgramUniform2i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1);
+extern void GL_TH_FN(glProgramUniform3i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+extern void GL_TH_FN(glProgramUniform4i)(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+extern void GL_TH_FN(glProgramUniform1ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0);
+extern void GL_TH_FN(glProgramUniform2ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1);
+extern void GL_TH_FN(glProgramUniform3ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern void GL_TH_FN(glProgramUniform4ui)(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void GL_TH_FN(glProgramUniform1f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0);
+extern void GL_TH_FN(glProgramUniform2f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1);
+extern void GL_TH_FN(glProgramUniform3f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+extern void GL_TH_FN(glProgramUniform4f)(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+extern void GL_TH_FN(glProgramUniform1iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void GL_TH_FN(glProgramUniform2iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void GL_TH_FN(glProgramUniform3iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void GL_TH_FN(glProgramUniform4iv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void GL_TH_FN(glProgramUniform1uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glProgramUniform2uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glProgramUniform3uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glProgramUniform4uiv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void GL_TH_FN(glProgramUniform1fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniform2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniform3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniform4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix2x3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix3x2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix2x4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix4x2fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix3x4fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glProgramUniformMatrix4x3fv)(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void GL_TH_FN(glValidateProgramPipeline)(GL_TH_DP, GLuint pipeline);
+extern void GL_TH_FN(glGetProgramPipelineInfoLog)(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+extern void GL_TH_FN(glBindImageTexture)(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+extern void GL_TH_FN(glGetBooleani_v)(GL_TH_DP, GLenum target, GLuint index, GLboolean *data);
+extern void GL_TH_FN(glMemoryBarrier)(GL_TH_DP, GLbitfield barriers);
+extern void GL_TH_FN(glMemoryBarrierByRegion)(GL_TH_DP, GLbitfield barriers);
+extern void GL_TH_FN(glTexStorage2DMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+extern void GL_TH_FN(glGetMultisamplefv)(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val);
+extern void GL_TH_FN(glSampleMaski)(GL_TH_DP, GLuint maskNumber, GLbitfield mask);
+extern void GL_TH_FN(glGetTexLevelParameteriv)(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetTexLevelParameterfv)(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params);
+extern void GL_TH_FN(glBindVertexBuffer)(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+extern void GL_TH_FN(glVertexAttribFormat)(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+extern void GL_TH_FN(glVertexAttribIFormat)(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+extern void GL_TH_FN(glVertexAttribBinding)(GL_TH_DP, GLuint attribindex, GLuint bindingindex);
+extern void GL_TH_FN(glVertexBindingDivisor)(GL_TH_DP, GLuint bindingindex, GLuint divisor);
+extern void GL_TH_FN(glBlendBarrier)(GL_TH_DP);
+extern void GL_TH_FN(glCopyImageSubData)(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+extern void GL_TH_FN(glDebugMessageControl)(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+extern void GL_TH_FN(glDebugMessageInsert)(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+extern void GL_TH_FN(glDebugMessageCallback)(GL_TH_DP, GLDEBUGPROC callback, const void *userParam);
+extern GLuint GL_TH_FN(glGetDebugMessageLog)(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+extern void GL_TH_FN(glPushDebugGroup)(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message);
+extern void GL_TH_FN(glPopDebugGroup)(GL_TH_DP);
+extern void GL_TH_FN(glObjectLabel)(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+extern void GL_TH_FN(glGetObjectLabel)(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+extern void GL_TH_FN(glObjectPtrLabel)(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label);
+extern void GL_TH_FN(glGetObjectPtrLabel)(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+extern void GL_TH_FN(glEnablei)(GL_TH_DP, GLenum target, GLuint index);
+extern void GL_TH_FN(glDisablei)(GL_TH_DP, GLenum target, GLuint index);
+extern void GL_TH_FN(glBlendEquationi)(GL_TH_DP, GLuint buf, GLenum mode);
+extern void GL_TH_FN(glBlendEquationSeparatei)(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+extern void GL_TH_FN(glBlendFunci)(GL_TH_DP, GLuint buf, GLenum src, GLenum dst);
+extern void GL_TH_FN(glBlendFuncSeparatei)(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void GL_TH_FN(glColorMaski)(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+extern GLboolean GL_TH_FN(glIsEnabledi)(GL_TH_DP, GLenum target, GLuint index);
+extern void GL_TH_FN(glDrawElementsBaseVertex)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+extern void GL_TH_FN(glDrawRangeElementsBaseVertex)(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+extern void GL_TH_FN(glDrawElementsInstancedBaseVertex)(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+extern void GL_TH_FN(glFramebufferTexture)(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level);
+extern void GL_TH_FN(glPrimitiveBoundingBox)(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+extern GLenum GL_TH_FN(glGetGraphicsResetStatus)(GL_TH_DP);
+extern void GL_TH_FN(glReadnPixels)(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+extern void GL_TH_FN(glGetnUniformfv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+extern void GL_TH_FN(glGetnUniformiv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+extern void GL_TH_FN(glGetnUniformuiv)(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+extern void GL_TH_FN(glMinSampleShading)(GL_TH_DP, GLfloat value);
+extern void GL_TH_FN(glPatchParameteri)(GL_TH_DP, GLenum pname, GLint value);
+extern void GL_TH_FN(glTexParameterIiv)(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+extern void GL_TH_FN(glTexParameterIuiv)(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params);
+extern void GL_TH_FN(glGetTexParameterIiv)(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetTexParameterIuiv)(GL_TH_DP, GLenum target, GLenum pname, GLuint *params);
+extern void GL_TH_FN(glSamplerParameterIiv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param);
+extern void GL_TH_FN(glSamplerParameterIuiv)(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param);
+extern void GL_TH_FN(glGetSamplerParameterIiv)(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params);
+extern void GL_TH_FN(glGetSamplerParameterIuiv)(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params);
+extern void GL_TH_FN(glTexBuffer)(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer);
+extern void GL_TH_FN(glTexBufferRange)(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern void GL_TH_FN(glTexStorage3DMultisample)(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+extern void GL_TH_FN(glEGLImageTargetTexture2DOES)(GL_TH_DP, GLenum target, void *image);
+extern void GL_TH_FN(glEGLImageTargetRenderbufferStorageOES)(GL_TH_DP, GLenum target, void *image);
+extern EvasGLImage GL_TH_FN(evasglCreateImage)(GL_TH_DP, int target, void* buffer, const int *attrib_list);
+extern void GL_TH_FN(evasglDestroyImage)(GL_TH_DP, EvasGLImage image);
+extern EvasGLImage GL_TH_FN(evasglCreateImageForContext)(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
+extern EvasGLSync GL_TH_FN(evasglCreateSync)(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
+extern Eina_Bool GL_TH_FN(evasglDestroySync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync);
+extern int GL_TH_FN(evasglClientWaitSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
+extern Eina_Bool GL_TH_FN(evasglGetSyncAttrib)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
+extern Eina_Bool GL_TH_FN(evasglSignalSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
+extern int GL_TH_FN(evasglWaitSync)(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags);
+extern Eina_Bool GL_TH_FN(evasglBindWaylandDisplay)(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+extern Eina_Bool GL_TH_FN(evasglUnbindWaylandDisplay)(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+extern Eina_Bool GL_TH_FN(evasglQueryWaylandBuffer)(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value);
index 709f6f3..dbdaca8 100644 (file)
 /*
+ * ------------------------------------------------------------------------------
  * This is an automatically generated file using a python script.
  * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
  * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
  * and make use of scripts if you need to fix them.
+ * ------------------------------------------------------------------------------
  */
-GLenum (*glGetError_thread_cmd)(void) = NULL;
-void (*glVertexAttribPointer_thread_cmd)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) = NULL;
-void (*glEnableVertexAttribArray_thread_cmd)(GLuint index) = NULL;
-void (*glDisableVertexAttribArray_thread_cmd)(GLuint index) = NULL;
-void (*glDrawArrays_thread_cmd)(GLenum mode, GLint first, GLsizei count) = NULL;
-void (*glDrawElements_thread_cmd)(GLenum mode, GLsizei count, GLenum type, const void *indices) = NULL;
-void (*glGenBuffers_thread_cmd)(GLsizei n, GLuint *buffers) = NULL;
-void (*glDeleteBuffers_thread_cmd)(GLsizei n, const GLuint *buffers) = NULL;
-void (*glBindBuffer_thread_cmd)(GLenum target, GLuint buffer) = NULL;
-void (*glBufferData_thread_cmd)(GLenum target, GLsizeiptr size, const void *data, GLenum usage) = NULL;
-void (*glMapBuffer_orig_evas_set)(void *func) = NULL;
-void *(*glMapBuffer_orig_evas_get)(void) = NULL;
-void * (*glMapBuffer_thread_cmd)(GLenum target, GLenum access) = NULL;
-void (*glUnmapBuffer_orig_evas_set)(void *func) = NULL;
-void *(*glUnmapBuffer_orig_evas_get)(void) = NULL;
-GLboolean (*glUnmapBuffer_thread_cmd)(GLenum target) = NULL;
-GLuint (*glCreateShader_thread_cmd)(GLenum type) = NULL;
-void (*glShaderSource_thread_cmd)(GLuint shader, GLsizei count, const GLchar **string, const GLint *length) = NULL;
-void (*glCompileShader_thread_cmd)(GLuint shader) = NULL;
-void (*glReleaseShaderCompiler_orig_evas_set)(void *func) = NULL;
-void *(*glReleaseShaderCompiler_orig_evas_get)(void) = NULL;
-void (*glReleaseShaderCompiler_thread_cmd)(void) = NULL;
-void (*glDeleteShader_thread_cmd)(GLuint shader) = NULL;
-GLuint (*glCreateProgram_thread_cmd)(void) = NULL;
-void (*glAttachShader_thread_cmd)(GLuint program, GLuint shader) = NULL;
-void (*glDetachShader_thread_cmd)(GLuint program, GLuint shader) = NULL;
-void (*glLinkProgram_thread_cmd)(GLuint program) = NULL;
-void (*glUseProgram_thread_cmd)(GLuint program) = NULL;
-void (*glProgramParameteri_orig_evas_set)(void *func) = NULL;
-void *(*glProgramParameteri_orig_evas_get)(void) = NULL;
-void (*glProgramParameteri_thread_cmd)(GLuint program, GLenum pname, GLint value) = NULL;
-void (*glDeleteProgram_thread_cmd)(GLuint program) = NULL;
-void (*glGetProgramBinary_orig_evas_set)(void *func) = NULL;
-void *(*glGetProgramBinary_orig_evas_get)(void) = NULL;
-void (*glGetProgramBinary_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
-void (*glProgramBinary_orig_evas_set)(void *func) = NULL;
-void *(*glProgramBinary_orig_evas_get)(void) = NULL;
-void (*glProgramBinary_thread_cmd)(GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL;
-void (*glGetActiveAttrib_thread_cmd)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) = NULL;
-GLint (*glGetAttribLocation_thread_cmd)(GLuint program, const GLchar *name) = NULL;
-void (*glBindAttribLocation_thread_cmd)(GLuint program, GLuint index, const GLchar *name) = NULL;
-GLint (*glGetUniformLocation_thread_cmd)(GLuint program, const GLchar *name) = NULL;
-void (*glUniform1f_thread_cmd)(GLint location, GLfloat v0) = NULL;
-void (*glUniform1i_thread_cmd)(GLint location, GLint v0) = NULL;
-void (*glUniform2f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1) = NULL;
-void (*glUniform2i_thread_cmd)(GLint location, GLint v0, GLint v1) = NULL;
-void (*glUniform3f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) = NULL;
-void (*glUniform3i_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2) = NULL;
-void (*glUniform4f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) = NULL;
-void (*glUniform4i_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) = NULL;
-void (*glUniform1fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform1iv_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform2fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform2iv_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform3fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform3iv_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniform4fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value) = NULL;
-void (*glUniform4iv_thread_cmd)(GLint location, GLsizei count, const GLint *value) = NULL;
-void (*glUniformMatrix2fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glUniformMatrix3fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glUniformMatrix4fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
-void (*glViewport_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
-void (*glEnable_thread_cmd)(GLenum cap) = NULL;
-void (*glDisable_thread_cmd)(GLenum cap) = NULL;
-void (*glLineWidth_thread_cmd)(GLfloat width) = NULL;
-void (*glPolygonOffset_thread_cmd)(GLfloat factor, GLfloat units) = NULL;
-void (*glPixelStorei_thread_cmd)(GLenum pname, GLint param) = NULL;
-void (*glActiveTexture_thread_cmd)(GLenum texture) = NULL;
-void (*glGenTextures_thread_cmd)(GLsizei n, GLuint *textures) = NULL;
-void (*glBindTexture_thread_cmd)(GLenum target, GLuint texture) = NULL;
-void (*glDeleteTextures_thread_cmd)(GLsizei n, const GLuint *textures) = NULL;
-void (*glTexImage2D_thread_cmd)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) = NULL;
-void (*glTexSubImage2D_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) = NULL;
-void (*glCompressedTexImage2D_thread_cmd)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) = NULL;
-void (*glCompressedTexSubImage2D_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) = NULL;
-void (*glTexParameterf_thread_cmd)(GLenum target, GLenum pname, GLfloat param) = NULL;
-void (*glTexParameterfv_thread_cmd)(GLenum target, GLenum pname, const GLfloat *params) = NULL;
-void (*glTexParameteri_thread_cmd)(GLenum target, GLenum pname, GLint param) = NULL;
-void (*glTexParameteriv_thread_cmd)(GLenum target, GLenum pname, const GLint *params) = NULL;
-void (*glScissor_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
-void (*glBlendFunc_thread_cmd)(GLenum sfactor, GLenum dfactor) = NULL;
-void (*glBlendColor_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = NULL;
-void (*glDepthMask_thread_cmd)(GLboolean flag) = NULL;
-void (*glClear_thread_cmd)(GLbitfield mask) = NULL;
-void (*glClearColor_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = NULL;
-void (*glReadPixels_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) = NULL;
-void (*glGenFramebuffers_orig_evas_set)(void *func) = NULL;
-void *(*glGenFramebuffers_orig_evas_get)(void) = NULL;
-void (*glGenFramebuffers_thread_cmd)(GLsizei n, GLuint *framebuffers) = NULL;
-void (*glBindFramebuffer_orig_evas_set)(void *func) = NULL;
-void *(*glBindFramebuffer_orig_evas_get)(void) = NULL;
-void (*glBindFramebuffer_thread_cmd)(GLenum target, GLuint framebuffer) = NULL;
-void (*glDeleteFramebuffers_orig_evas_set)(void *func) = NULL;
-void *(*glDeleteFramebuffers_orig_evas_get)(void) = NULL;
-void (*glDeleteFramebuffers_thread_cmd)(GLsizei n, const GLuint *framebuffers) = NULL;
-void (*glGenRenderbuffers_thread_cmd)(GLsizei n, GLuint *renderbuffers) = NULL;
-void (*glBindRenderbuffer_thread_cmd)(GLenum target, GLuint renderbuffer) = NULL;
-void (*glDeleteRenderbuffers_thread_cmd)(GLsizei n, const GLuint *renderbuffers) = NULL;
-void (*glRenderbufferStorage_thread_cmd)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
-void (*glFramebufferRenderbuffer_thread_cmd)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
-void (*glFramebufferTexture2D_orig_evas_set)(void *func) = NULL;
-void *(*glFramebufferTexture2D_orig_evas_get)(void) = NULL;
-void (*glFramebufferTexture2D_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
-void (*glFramebufferTexture2DMultisample_orig_evas_set)(void *func) = NULL;
-void *(*glFramebufferTexture2DMultisample_orig_evas_get)(void) = NULL;
-void (*glFramebufferTexture2DMultisample_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) = NULL;
-GLenum (*glCheckFramebufferStatus_thread_cmd)(GLenum target) = NULL;
-void (*glFlush_thread_cmd)(void) = NULL;
-void (*glFinish_thread_cmd)(void) = NULL;
-void (*glHint_thread_cmd)(GLenum target, GLenum mode) = NULL;
-const GLubyte * (*glGetString_thread_cmd)(GLenum name) = NULL;
-void (*glGetBooleanv_thread_cmd)(GLenum pname, GLboolean *data) = NULL;
-void (*glGetFloatv_thread_cmd)(GLenum pname, GLfloat *data) = NULL;
-void (*glGetIntegerv_thread_cmd)(GLenum pname, GLint *data) = NULL;
-GLboolean (*glIsBuffer_thread_cmd)(GLint buffer) = NULL;
-void (*glGetBufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsShader_thread_cmd)(GLuint shader) = NULL;
-void (*glGetShaderiv_thread_cmd)(GLuint shader, GLenum pname, GLint *params) = NULL;
-void (*glGetAttachedShaders_thread_cmd)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) = NULL;
-void (*glGetShaderInfoLog_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = NULL;
-void (*glGetShaderSource_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) = NULL;
-void (*glGetShaderPrecisionFormat_thread_cmd)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) = NULL;
-void (*glGetVertexAttribfv_thread_cmd)(GLuint index, GLenum pname, GLfloat *params) = NULL;
-void (*glGetVertexAttribiv_thread_cmd)(GLuint index, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsProgram_thread_cmd)(GLuint program) = NULL;
-void (*glGetProgramInfoLog_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = NULL;
-void (*glGetProgramiv_thread_cmd)(GLuint program, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsFramebuffer_thread_cmd)(GLint framebuffer) = NULL;
-void (*glGetFramebufferParameteriv_orig_evas_set)(void *func) = NULL;
-void *(*glGetFramebufferParameteriv_orig_evas_get)(void) = NULL;
-void (*glGetFramebufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsRenderbuffer_thread_cmd)(GLint renderbuffer) = NULL;
-void (*glGetRenderbufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (*glIsTexture_thread_cmd)(GLint texture) = NULL;
-void (*glStartTiling_orig_evas_set)(void *func) = NULL;
-void *(*glStartTiling_orig_evas_get)(void) = NULL;
-void (*glStartTiling_thread_cmd)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e) = NULL;
-void (*glEndTiling_orig_evas_set)(void *func) = NULL;
-void *(*glEndTiling_orig_evas_get)(void) = NULL;
-void (*glEndTiling_thread_cmd)(GLuint a) = NULL;
-void (*glActivateTile_orig_evas_set)(void *func) = NULL;
-void *(*glActivateTile_orig_evas_get)(void) = NULL;
-void (*glActivateTile_thread_cmd)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e) = NULL;
-void (*glEGLImageTargetTexture2DOES_orig_evas_set)(void *func) = NULL;
-void *(*glEGLImageTargetTexture2DOES_orig_evas_get)(void) = NULL;
-void (*glEGLImageTargetTexture2DOES_thread_cmd)(GLenum target, void *image) = NULL;
 
-#ifndef GL_GLES
-void (*glAlphaFunc_thread_cmd)(GLenum func, GLclampf ref) = NULL;
-#endif
+void (*GL_TH_FN(glActiveTexture))(GL_TH_DP, GLenum texture) = NULL;
+void (*GL_TH_FN(glAttachShader))(GL_TH_DP, GLuint program, GLuint shader) = NULL;
+void (*GL_TH_FN(glBindAttribLocation))(GL_TH_DP, GLuint program, GLuint index, const char* name) = NULL;
+void (*GL_TH_FN(glBindBuffer))(GL_TH_DP, GLenum target, GLuint buffer) = NULL;
+void (*GL_TH_FN(glBindFramebuffer))(GL_TH_DP, GLenum target, GLuint framebuffer) = NULL;
+void (*GL_TH_FN(glBindRenderbuffer))(GL_TH_DP, GLenum target, GLuint renderbuffer) = NULL;
+void (*GL_TH_FN(glBindTexture))(GL_TH_DP, GLenum target, GLuint texture) = NULL;
+void (*GL_TH_FN(glBlendColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL;
+void (*GL_TH_FN(glBlendEquation))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glBlendEquationSeparate))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha) = NULL;
+void (*GL_TH_FN(glBlendFunc))(GL_TH_DP, GLenum sfactor, GLenum dfactor) = NULL;
+void (*GL_TH_FN(glBlendFuncSeparate))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL;
+void (*GL_TH_FN(glBufferData))(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage) = NULL;
+void (*GL_TH_FN(glBufferSubData))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = NULL;
+GLenum (*GL_TH_FN(glCheckFramebufferStatus))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glClear))(GL_TH_DP, GLbitfield mask) = NULL;
+void (*GL_TH_FN(glClearColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL;
+void (*GL_TH_FN(glClearDepthf))(GL_TH_DP, GLclampf depth) = NULL;
+void (*GL_TH_FN(glClearStencil))(GL_TH_DP, GLint s) = NULL;
+void (*GL_TH_FN(glColorMask))(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = NULL;
+void (*GL_TH_FN(glCompileShader))(GL_TH_DP, GLuint shader) = NULL;
+void (*GL_TH_FN(glCompressedTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) = NULL;
+void (*GL_TH_FN(glCompressedTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) = NULL;
+void (*GL_TH_FN(glCopyTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = NULL;
+void (*GL_TH_FN(glCopyTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+GLuint (*GL_TH_FN(glCreateProgram))(GL_TH_DP) = NULL;
+GLuint (*GL_TH_FN(glCreateShader))(GL_TH_DP, GLenum type) = NULL;
+void (*GL_TH_FN(glCullFace))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glDeleteBuffers))(GL_TH_DP, GLsizei n, const GLuint* buffers) = NULL;
+void (*GL_TH_FN(glDeleteFramebuffers))(GL_TH_DP, GLsizei n, const GLuint* framebuffers) = NULL;
+void (*GL_TH_FN(glDeleteProgram))(GL_TH_DP, GLuint program) = NULL;
+void (*GL_TH_FN(glDeleteRenderbuffers))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers) = NULL;
+void (*GL_TH_FN(glDeleteShader))(GL_TH_DP, GLuint shader) = NULL;
+void (*GL_TH_FN(glDeleteTextures))(GL_TH_DP, GLsizei n, const GLuint* textures) = NULL;
+void (*GL_TH_FN(glDepthFunc))(GL_TH_DP, GLenum func) = NULL;
+void (*GL_TH_FN(glDepthMask))(GL_TH_DP, GLboolean flag) = NULL;
+void (*GL_TH_FN(glDepthRangef))(GL_TH_DP, GLclampf zNear, GLclampf zFar) = NULL;
+void (*GL_TH_FN(glDetachShader))(GL_TH_DP, GLuint program, GLuint shader) = NULL;
+void (*GL_TH_FN(glDisable))(GL_TH_DP, GLenum cap) = NULL;
+void (*GL_TH_FN(glDisableVertexAttribArray))(GL_TH_DP, GLuint index) = NULL;
+void (*GL_TH_FN(glDrawArrays))(GL_TH_DP, GLenum mode, GLint first, GLsizei count) = NULL;
+void (*GL_TH_FN(glDrawElements))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices) = NULL;
+void (*GL_TH_FN(glEnable))(GL_TH_DP, GLenum cap) = NULL;
+void (*GL_TH_FN(glEnableVertexAttribArray))(GL_TH_DP, GLuint index) = NULL;
+void (*GL_TH_FN(glFinish))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glFlush))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glFramebufferRenderbuffer))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
+void (*GL_TH_FN(glFramebufferTexture2D))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
+void (*GL_TH_FN(glFrontFace))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glGenBuffers))(GL_TH_DP, GLsizei n, GLuint* buffers) = NULL;
+void (*GL_TH_FN(glGenerateMipmap))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glGenFramebuffers))(GL_TH_DP, GLsizei n, GLuint* framebuffers) = NULL;
+void (*GL_TH_FN(glGenRenderbuffers))(GL_TH_DP, GLsizei n, GLuint* renderbuffers) = NULL;
+void (*GL_TH_FN(glGenTextures))(GL_TH_DP, GLsizei n, GLuint* textures) = NULL;
+void (*GL_TH_FN(glGetActiveAttrib))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL;
+void (*GL_TH_FN(glGetActiveUniform))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL;
+void (*GL_TH_FN(glGetAttachedShaders))(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = NULL;
+int (*GL_TH_FN(glGetAttribLocation))(GL_TH_DP, GLuint program, const char* name) = NULL;
+void (*GL_TH_FN(glGetBooleanv))(GL_TH_DP, GLenum pname, GLboolean* params) = NULL;
+void (*GL_TH_FN(glGetBufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params) = NULL;
+GLenum (*GL_TH_FN(glGetError))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glGetFloatv))(GL_TH_DP, GLenum pname, GLfloat* params) = NULL;
+void (*GL_TH_FN(glGetFramebufferAttachmentParameteriv))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetIntegerv))(GL_TH_DP, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetProgramiv))(GL_TH_DP, GLuint program, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetProgramInfoLog))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = NULL;
+void (*GL_TH_FN(glGetRenderbufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetShaderiv))(GL_TH_DP, GLuint shader, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetShaderInfoLog))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = NULL;
+void (*GL_TH_FN(glGetShaderPrecisionFormat))(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = NULL;
+void (*GL_TH_FN(glGetShaderSource))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = NULL;
+const GLubyte* (*GL_TH_FN(glGetString))(GL_TH_DP, GLenum name) = NULL;
+void (*GL_TH_FN(glGetTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params) = NULL;
+void (*GL_TH_FN(glGetTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetUniformfv))(GL_TH_DP, GLuint program, GLint location, GLfloat* params) = NULL;
+void (*GL_TH_FN(glGetUniformiv))(GL_TH_DP, GLuint program, GLint location, GLint* params) = NULL;
+int (*GL_TH_FN(glGetUniformLocation))(GL_TH_DP, GLuint program, const char* name) = NULL;
+void (*GL_TH_FN(glGetVertexAttribfv))(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params) = NULL;
+void (*GL_TH_FN(glGetVertexAttribiv))(GL_TH_DP, GLuint index, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGetVertexAttribPointerv))(GL_TH_DP, GLuint index, GLenum pname, void** pointer) = NULL;
+void (*GL_TH_FN(glHint))(GL_TH_DP, GLenum target, GLenum mode) = NULL;
+GLboolean (*GL_TH_FN(glIsBuffer))(GL_TH_DP, GLuint buffer) = NULL;
+GLboolean (*GL_TH_FN(glIsEnabled))(GL_TH_DP, GLenum cap) = NULL;
+GLboolean (*GL_TH_FN(glIsFramebuffer))(GL_TH_DP, GLuint framebuffer) = NULL;
+GLboolean (*GL_TH_FN(glIsProgram))(GL_TH_DP, GLuint program) = NULL;
+GLboolean (*GL_TH_FN(glIsRenderbuffer))(GL_TH_DP, GLuint renderbuffer) = NULL;
+GLboolean (*GL_TH_FN(glIsShader))(GL_TH_DP, GLuint shader) = NULL;
+GLboolean (*GL_TH_FN(glIsTexture))(GL_TH_DP, GLuint texture) = NULL;
+void (*GL_TH_FN(glLineWidth))(GL_TH_DP, GLfloat width) = NULL;
+void (*GL_TH_FN(glLinkProgram))(GL_TH_DP, GLuint program) = NULL;
+void (*GL_TH_FN(glPixelStorei))(GL_TH_DP, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glPolygonOffset))(GL_TH_DP, GLfloat factor, GLfloat units) = NULL;
+void (*GL_TH_FN(glReadPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = NULL;
+void (*GL_TH_FN(glReleaseShaderCompiler))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glRenderbufferStorage))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glSampleCoverage))(GL_TH_DP, GLclampf value, GLboolean invert) = NULL;
+void (*GL_TH_FN(glScissor))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glShaderBinary))(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) = NULL;
+void (*GL_TH_FN(glShaderSource))(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length) = NULL;
+void (*GL_TH_FN(glStencilFunc))(GL_TH_DP, GLenum func, GLint ref, GLuint mask) = NULL;
+void (*GL_TH_FN(glStencilFuncSeparate))(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask) = NULL;
+void (*GL_TH_FN(glStencilMask))(GL_TH_DP, GLuint mask) = NULL;
+void (*GL_TH_FN(glStencilMaskSeparate))(GL_TH_DP, GLenum face, GLuint mask) = NULL;
+void (*GL_TH_FN(glStencilOp))(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass) = NULL;
+void (*GL_TH_FN(glStencilOpSeparate))(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = NULL;
+void (*GL_TH_FN(glTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) = NULL;
+void (*GL_TH_FN(glTexParameterf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params) = NULL;
+void (*GL_TH_FN(glTexParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, const GLint* params) = NULL;
+void (*GL_TH_FN(glTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) = NULL;
+void (*GL_TH_FN(glUniform1f))(GL_TH_DP, GLint location, GLfloat x) = NULL;
+void (*GL_TH_FN(glUniform1fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v) = NULL;
+void (*GL_TH_FN(glUniform1i))(GL_TH_DP, GLint location, GLint x) = NULL;
+void (*GL_TH_FN(glUniform1iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v) = NULL;
+void (*GL_TH_FN(glUniform2f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y) = NULL;
+void (*GL_TH_FN(glUniform2fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v) = NULL;
+void (*GL_TH_FN(glUniform2i))(GL_TH_DP, GLint location, GLint x, GLint y) = NULL;
+void (*GL_TH_FN(glUniform2iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v) = NULL;
+void (*GL_TH_FN(glUniform3f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z) = NULL;
+void (*GL_TH_FN(glUniform3fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v) = NULL;
+void (*GL_TH_FN(glUniform3i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z) = NULL;
+void (*GL_TH_FN(glUniform3iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v) = NULL;
+void (*GL_TH_FN(glUniform4f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL;
+void (*GL_TH_FN(glUniform4fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v) = NULL;
+void (*GL_TH_FN(glUniform4i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w) = NULL;
+void (*GL_TH_FN(glUniform4iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v) = NULL;
+void (*GL_TH_FN(glUniformMatrix2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
+void (*GL_TH_FN(glUniformMatrix3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
+void (*GL_TH_FN(glUniformMatrix4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
+void (*GL_TH_FN(glUseProgram))(GL_TH_DP, GLuint program) = NULL;
+void (*GL_TH_FN(glValidateProgram))(GL_TH_DP, GLuint program) = NULL;
+void (*GL_TH_FN(glVertexAttrib1f))(GL_TH_DP, GLuint indx, GLfloat x) = NULL;
+void (*GL_TH_FN(glVertexAttrib1fv))(GL_TH_DP, GLuint indx, const GLfloat* values) = NULL;
+void (*GL_TH_FN(glVertexAttrib2f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y) = NULL;
+void (*GL_TH_FN(glVertexAttrib2fv))(GL_TH_DP, GLuint indx, const GLfloat* values) = NULL;
+void (*GL_TH_FN(glVertexAttrib3f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z) = NULL;
+void (*GL_TH_FN(glVertexAttrib3fv))(GL_TH_DP, GLuint indx, const GLfloat* values) = NULL;
+void (*GL_TH_FN(glVertexAttrib4f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL;
+void (*GL_TH_FN(glVertexAttrib4fv))(GL_TH_DP, GLuint indx, const GLfloat* values) = NULL;
+void (*GL_TH_FN(glVertexAttribPointer))(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) = NULL;
+void (*GL_TH_FN(glViewport))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glEvasGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, EvasGLImage image) = NULL;
+void (*GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, EvasGLImage image) = NULL;
+void (*GL_TH_FN(glGetProgramBinaryOES))(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
+void (*GL_TH_FN(glProgramBinaryOES))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL;
+void * (*GL_TH_FN(glMapBufferOES))(GL_TH_DP, GLenum target, GLenum access) = NULL;
+GLboolean (*GL_TH_FN(glUnmapBufferOES))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glGetBufferPointervOES))(GL_TH_DP, GLenum target, GLenum pname, void** params) = NULL;
+void (*GL_TH_FN(glTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) = NULL;
+void (*GL_TH_FN(glTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) = NULL;
+void (*GL_TH_FN(glCopyTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glCompressedTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) = NULL;
+void (*GL_TH_FN(glCompressedTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) = NULL;
+void (*GL_TH_FN(glFramebufferTexture3DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorGroupsAMD))(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorCountersAMD))(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorGroupStringAMD))(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorCounterStringAMD))(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorCounterInfoAMD))(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data) = NULL;
+void (*GL_TH_FN(glGenPerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors) = NULL;
+void (*GL_TH_FN(glDeletePerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors) = NULL;
+void (*GL_TH_FN(glSelectPerfMonitorCountersAMD))(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList) = NULL;
+void (*GL_TH_FN(glBeginPerfMonitorAMD))(GL_TH_DP, GLuint monitor) = NULL;
+void (*GL_TH_FN(glEndPerfMonitorAMD))(GL_TH_DP, GLuint monitor) = NULL;
+void (*GL_TH_FN(glGetPerfMonitorCounterDataAMD))(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten) = NULL;
+void (*GL_TH_FN(glDiscardFramebufferEXT))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments) = NULL;
+void (*GL_TH_FN(glMultiDrawArraysEXT))(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount) = NULL;
+void (*GL_TH_FN(glMultiDrawElementsEXT))(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount) = NULL;
+void (*GL_TH_FN(glDeleteFencesNV))(GL_TH_DP, GLsizei n, const GLuint* fences) = NULL;
+void (*GL_TH_FN(glGenFencesNV))(GL_TH_DP, GLsizei n, GLuint* fences) = NULL;
+GLboolean (*GL_TH_FN(glIsFenceNV))(GL_TH_DP, GLuint fence) = NULL;
+GLboolean (*GL_TH_FN(glTestFenceNV))(GL_TH_DP, GLuint fence) = NULL;
+void (*GL_TH_FN(glGetFenceivNV))(GL_TH_DP, GLuint fence, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glFinishFenceNV))(GL_TH_DP, GLuint fence) = NULL;
+void (*GL_TH_FN(glSetFenceNV))(GL_TH_DP, GLuint a, GLenum b) = NULL;
+void (*GL_TH_FN(glGetDriverControlsQCOM))(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls) = NULL;
+void (*GL_TH_FN(glGetDriverControlStringQCOM))(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString) = NULL;
+void (*GL_TH_FN(glEnableDriverControlQCOM))(GL_TH_DP, GLuint driverControl) = NULL;
+void (*GL_TH_FN(glDisableDriverControlQCOM))(GL_TH_DP, GLuint driverControl) = NULL;
+void (*GL_TH_FN(glExtGetTexturesQCOM))(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures) = NULL;
+void (*GL_TH_FN(glExtGetBuffersQCOM))(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers) = NULL;
+void (*GL_TH_FN(glExtGetRenderbuffersQCOM))(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers) = NULL;
+void (*GL_TH_FN(glExtGetFramebuffersQCOM))(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers) = NULL;
+void (*GL_TH_FN(glExtGetTexLevelParameterivQCOM))(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glExtTexObjectStateOverrideiQCOM))(GL_TH_DP, GLenum target, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glExtGetTexSubImageQCOM))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels) = NULL;
+void (*GL_TH_FN(glExtGetBufferPointervQCOM))(GL_TH_DP, GLenum target, void** params) = NULL;
+void (*GL_TH_FN(glExtGetShadersQCOM))(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders) = NULL;
+void (*GL_TH_FN(glExtGetProgramsQCOM))(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms) = NULL;
+GLboolean (*GL_TH_FN(glExtIsProgramBinaryQCOM))(GL_TH_DP, GLuint program) = NULL;
+void (*GL_TH_FN(glExtGetProgramBinarySourceQCOM))(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length) = NULL;
+void (*GL_TH_FN(glAlphaFunc))(GL_TH_DP, GLenum func, GLclampf ref) = NULL;
+void (*GL_TH_FN(glClipPlanef))(GL_TH_DP, GLenum plane, const GLfloat *equation) = NULL;
+void (*GL_TH_FN(glColor4f))(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = NULL;
+void (*GL_TH_FN(glFogf))(GL_TH_DP, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glFogfv))(GL_TH_DP, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glFrustumf))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) = NULL;
+void (*GL_TH_FN(glGetClipPlanef))(GL_TH_DP, GLenum pname, GLfloat eqn[4]) = NULL;
+void (*GL_TH_FN(glGetLightfv))(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params) = NULL;
+void (*GL_TH_FN(glGetMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params) = NULL;
+void (*GL_TH_FN(glGetTexEnvfv))(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params) = NULL;
+void (*GL_TH_FN(glLightModelf))(GL_TH_DP, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glLightModelfv))(GL_TH_DP, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glLightf))(GL_TH_DP, GLenum light, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glLightfv))(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glLoadMatrixf))(GL_TH_DP, const GLfloat *m) = NULL;
+void (*GL_TH_FN(glMaterialf))(GL_TH_DP, GLenum face, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glMultMatrixf))(GL_TH_DP, const GLfloat *m) = NULL;
+void (*GL_TH_FN(glMultiTexCoord4f))(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) = NULL;
+void (*GL_TH_FN(glNormal3f))(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz) = NULL;
+void (*GL_TH_FN(glOrthof))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) = NULL;
+void (*GL_TH_FN(glPointParameterf))(GL_TH_DP, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glPointParameterfv))(GL_TH_DP, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glPointSize))(GL_TH_DP, GLfloat size) = NULL;
+void (*GL_TH_FN(glPointSizePointerOES))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer) = NULL;
+void (*GL_TH_FN(glRotatef))(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) = NULL;
+void (*GL_TH_FN(glScalef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z) = NULL;
+void (*GL_TH_FN(glTexEnvf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glTexEnvfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glTranslatef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z) = NULL;
+void (*GL_TH_FN(glAlphaFuncx))(GL_TH_DP, GLenum func, GLclampx ref) = NULL;
+void (*GL_TH_FN(glClearColorx))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) = NULL;
+void (*GL_TH_FN(glClearDepthx))(GL_TH_DP, GLclampx depth) = NULL;
+void (*GL_TH_FN(glClientActiveTexture))(GL_TH_DP, GLenum texture) = NULL;
+void (*GL_TH_FN(glClipPlanex))(GL_TH_DP, GLenum plane, const GLfixed *equation) = NULL;
+void (*GL_TH_FN(glColor4ub))(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) = NULL;
+void (*GL_TH_FN(glColor4x))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) = NULL;
+void (*GL_TH_FN(glColorPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glDepthRangex))(GL_TH_DP, GLclampx zNear, GLclampx zFar) = NULL;
+void (*GL_TH_FN(glDisableClientState))(GL_TH_DP, GLenum array) = NULL;
+void (*GL_TH_FN(glEnableClientState))(GL_TH_DP, GLenum array) = NULL;
+void (*GL_TH_FN(glFogx))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glFogxv))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glFrustumx))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) = NULL;
+void (*GL_TH_FN(glGetClipPlanex))(GL_TH_DP, GLenum pname, GLfixed eqn[4]) = NULL;
+void (*GL_TH_FN(glGetFixedv))(GL_TH_DP, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetLightxv))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetPointerv))(GL_TH_DP, GLenum pname, GLvoid **params) = NULL;
+void (*GL_TH_FN(glGetTexEnviv))(GL_TH_DP, GLenum env, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetTexEnvxv))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glLightModelx))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glLightModelxv))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glLightx))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glLightxv))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glLineWidthx))(GL_TH_DP, GLfixed width) = NULL;
+void (*GL_TH_FN(glLoadIdentity))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glLoadMatrixx))(GL_TH_DP, const GLfixed *m) = NULL;
+void (*GL_TH_FN(glLogicOp))(GL_TH_DP, GLenum opcode) = NULL;
+void (*GL_TH_FN(glMaterialx))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glMatrixMode))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glMultMatrixx))(GL_TH_DP, const GLfixed *m) = NULL;
+void (*GL_TH_FN(glMultiTexCoord4x))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) = NULL;
+void (*GL_TH_FN(glNormal3x))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz) = NULL;
+void (*GL_TH_FN(glNormalPointer))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glOrthox))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) = NULL;
+void (*GL_TH_FN(glPointParameterx))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glPointParameterxv))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glPointSizex))(GL_TH_DP, GLfixed size) = NULL;
+void (*GL_TH_FN(glPolygonOffsetx))(GL_TH_DP, GLfixed factor, GLfixed units) = NULL;
+void (*GL_TH_FN(glPopMatrix))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glPushMatrix))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glRotatex))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z) = NULL;
+void (*GL_TH_FN(glSampleCoveragex))(GL_TH_DP, GLclampx value, GLboolean invert) = NULL;
+void (*GL_TH_FN(glScalex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z) = NULL;
+void (*GL_TH_FN(glShadeModel))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glTexCoordPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glTexEnvi))(GL_TH_DP, GLenum target, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glTexEnvx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glTexEnviv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params) = NULL;
+void (*GL_TH_FN(glTexEnvxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glTexParameterx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glTranslatex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z) = NULL;
+void (*GL_TH_FN(glVertexPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glBlendEquationSeparateOES))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha) = NULL;
+void (*GL_TH_FN(glBlendFuncSeparateOES))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL;
+void (*GL_TH_FN(glBlendEquationOES))(GL_TH_DP, GLenum mode) = NULL;
+void (*GL_TH_FN(glDrawTexsOES))(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height) = NULL;
+void (*GL_TH_FN(glDrawTexiOES))(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height) = NULL;
+void (*GL_TH_FN(glDrawTexxOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height) = NULL;
+void (*GL_TH_FN(glDrawTexsvOES))(GL_TH_DP, const GLshort *coords) = NULL;
+void (*GL_TH_FN(glDrawTexivOES))(GL_TH_DP, const GLint *coords) = NULL;
+void (*GL_TH_FN(glDrawTexxvOES))(GL_TH_DP, const GLfixed *coords) = NULL;
+void (*GL_TH_FN(glDrawTexfOES))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) = NULL;
+void (*GL_TH_FN(glDrawTexfvOES))(GL_TH_DP, const GLfloat *coords) = NULL;
+void (*GL_TH_FN(glAlphaFuncxOES))(GL_TH_DP, GLenum func, GLclampx ref) = NULL;
+void (*GL_TH_FN(glClearColorxOES))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) = NULL;
+void (*GL_TH_FN(glClearDepthxOES))(GL_TH_DP, GLclampx depth) = NULL;
+void (*GL_TH_FN(glClipPlanexOES))(GL_TH_DP, GLenum plane, const GLfixed *equation) = NULL;
+void (*GL_TH_FN(glColor4xOES))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) = NULL;
+void (*GL_TH_FN(glDepthRangexOES))(GL_TH_DP, GLclampx zNear, GLclampx zFar) = NULL;
+void (*GL_TH_FN(glFogxOES))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glFogxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glFrustumxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) = NULL;
+void (*GL_TH_FN(glGetClipPlanexOES))(GL_TH_DP, GLenum pname, GLfixed eqn[4]) = NULL;
+void (*GL_TH_FN(glGetFixedvOES))(GL_TH_DP, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetTexEnvxvOES))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glLightModelxOES))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glLightModelxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glLightxOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glLineWidthxOES))(GL_TH_DP, GLfixed width) = NULL;
+void (*GL_TH_FN(glLoadMatrixxOES))(GL_TH_DP, const GLfixed *m) = NULL;
+void (*GL_TH_FN(glMaterialxOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glMultMatrixxOES))(GL_TH_DP, const GLfixed *m) = NULL;
+void (*GL_TH_FN(glMultiTexCoord4xOES))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) = NULL;
+void (*GL_TH_FN(glNormal3xOES))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz) = NULL;
+void (*GL_TH_FN(glOrthoxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) = NULL;
+void (*GL_TH_FN(glPointParameterxOES))(GL_TH_DP, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glPointParameterxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glPointSizexOES))(GL_TH_DP, GLfixed size) = NULL;
+void (*GL_TH_FN(glPolygonOffsetxOES))(GL_TH_DP, GLfixed factor, GLfixed units) = NULL;
+void (*GL_TH_FN(glRotatexOES))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z) = NULL;
+void (*GL_TH_FN(glSampleCoveragexOES))(GL_TH_DP, GLclampx value, GLboolean invert) = NULL;
+void (*GL_TH_FN(glScalexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z) = NULL;
+void (*GL_TH_FN(glTexEnvxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glTexEnvxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glTexParameterxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glTranslatexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z) = NULL;
+GLboolean (*GL_TH_FN(glIsRenderbufferOES))(GL_TH_DP, GLuint renderbuffer) = NULL;
+void (*GL_TH_FN(glBindRenderbufferOES))(GL_TH_DP, GLenum target, GLuint renderbuffer) = NULL;
+void (*GL_TH_FN(glDeleteRenderbuffersOES))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers) = NULL;
+void (*GL_TH_FN(glGenRenderbuffersOES))(GL_TH_DP, GLsizei n, GLuint* renderbuffers) = NULL;
+void (*GL_TH_FN(glRenderbufferStorageOES))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glGetRenderbufferParameterivOES))(GL_TH_DP, GLenum target, GLenum pname, GLint* params) = NULL;
+GLboolean (*GL_TH_FN(glIsFramebufferOES))(GL_TH_DP, GLuint framebuffer) = NULL;
+void (*GL_TH_FN(glBindFramebufferOES))(GL_TH_DP, GLenum target, GLuint framebuffer) = NULL;
+void (*GL_TH_FN(glDeleteFramebuffersOES))(GL_TH_DP, GLsizei n, const GLuint* framebuffers) = NULL;
+void (*GL_TH_FN(glGenFramebuffersOES))(GL_TH_DP, GLsizei n, GLuint* framebuffers) = NULL;
+GLenum (*GL_TH_FN(glCheckFramebufferStatusOES))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glFramebufferRenderbufferOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
+void (*GL_TH_FN(glFramebufferTexture2DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
+void (*GL_TH_FN(glGetFramebufferAttachmentParameterivOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params) = NULL;
+void (*GL_TH_FN(glGenerateMipmapOES))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glCurrentPaletteMatrixOES))(GL_TH_DP, GLuint matrixpaletteindex) = NULL;
+void (*GL_TH_FN(glLoadPaletteFromModelViewMatrixOES))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glMatrixIndexPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glWeightPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+GLbitfield (*GL_TH_FN(glQueryMatrixxOES))(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16]) = NULL;
+void (*GL_TH_FN(glDepthRangefOES))(GL_TH_DP, GLclampf zNear, GLclampf zFar) = NULL;
+void (*GL_TH_FN(glFrustumfOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) = NULL;
+void (*GL_TH_FN(glOrthofOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) = NULL;
+void (*GL_TH_FN(glClipPlanefOES))(GL_TH_DP, GLenum plane, const GLfloat *equation) = NULL;
+void (*GL_TH_FN(glGetClipPlanefOES))(GL_TH_DP, GLenum pname, GLfloat eqn[4]) = NULL;
+void (*GL_TH_FN(glClearDepthfOES))(GL_TH_DP, GLclampf depth) = NULL;
+void (*GL_TH_FN(glTexGenfOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params) = NULL;
+void (*GL_TH_FN(glTexGeniOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params) = NULL;
+void (*GL_TH_FN(glTexGenxOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param) = NULL;
+void (*GL_TH_FN(glTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params) = NULL;
+void (*GL_TH_FN(glGetTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params) = NULL;
+void (*GL_TH_FN(glGetTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params) = NULL;
+void (*GL_TH_FN(glBindVertexArrayOES))(GL_TH_DP, GLuint array) = NULL;
+void (*GL_TH_FN(glDeleteVertexArraysOES))(GL_TH_DP, GLsizei n, const GLuint *arrays) = NULL;
+void (*GL_TH_FN(glGenVertexArraysOES))(GL_TH_DP, GLsizei n, GLuint *arrays) = NULL;
+GLboolean (*GL_TH_FN(glIsVertexArrayOES))(GL_TH_DP, GLuint array) = NULL;
+void (*GL_TH_FN(glCopyTextureLevelsAPPLE))(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount) = NULL;
+void (*GL_TH_FN(glRenderbufferStorageMultisampleAPPLE))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e) = NULL;
+void (*GL_TH_FN(glResolveMultisampleFramebufferAPPLE))(GL_TH_DP) = NULL;
+GLsync (*GL_TH_FN(glFenceSyncAPPLE))(GL_TH_DP, GLenum condition, GLbitfield flags) = NULL;
+GLboolean (*GL_TH_FN(glIsSyncAPPLE))(GL_TH_DP, GLsync sync) = NULL;
+void (*GL_TH_FN(glDeleteSyncAPPLE))(GL_TH_DP, GLsync sync) = NULL;
+GLenum (*GL_TH_FN(glClientWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout) = NULL;
+void (*GL_TH_FN(glWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout) = NULL;
+void (*GL_TH_FN(glGetInteger64vAPPLE))(GL_TH_DP, GLenum pname, EvasGLint64 *params) = NULL;
+void (*GL_TH_FN(glGetSyncivAPPLE))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) = NULL;
+void * (*GL_TH_FN(glMapBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) = NULL;
+void (*GL_TH_FN(glFlushMappedBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length) = NULL;
+void (*GL_TH_FN(glRenderbufferStorageMultisampleEXT))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e) = NULL;
+void (*GL_TH_FN(glFramebufferTexture2DMultisampleEXT))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f) = NULL;
+GLenum (*GL_TH_FN(glGetGraphicsResetStatusEXT))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glReadnPixelsEXT))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data) = NULL;
+void (*GL_TH_FN(glGetnUniformfvEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params) = NULL;
+void (*GL_TH_FN(glGetnUniformivEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params) = NULL;
+void (*GL_TH_FN(glTexStorage1DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) = NULL;
+void (*GL_TH_FN(glTexStorage2DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glTexStorage3DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) = NULL;
+void (*GL_TH_FN(glTextureStorage1DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) = NULL;
+void (*GL_TH_FN(glTextureStorage2DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glTextureStorage3DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) = NULL;
+void (*GL_TH_FN(glClipPlanefIMG))(GL_TH_DP, GLenum a, const GLfloat * b) = NULL;
+void (*GL_TH_FN(glClipPlanexIMG))(GL_TH_DP, GLenum a, const GLfixed * b) = NULL;
+void (*GL_TH_FN(glRenderbufferStorageMultisampleIMG))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e) = NULL;
+void (*GL_TH_FN(glFramebufferTexture2DMultisampleIMG))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f) = NULL;
+void (*GL_TH_FN(glActivateTile))(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e) = NULL;
+void (*GL_TH_FN(glStartTilingQCOM))(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask) = NULL;
+void (*GL_TH_FN(glEndTilingQCOM))(GL_TH_DP, GLbitfield preserveMask) = NULL;
+void (*GL_TH_FN(glFramebufferTexture2DMultisample))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f) = NULL;
+void (*GL_TH_FN(glBeginQuery))(GL_TH_DP, GLenum target, GLuint id) = NULL;
+void (*GL_TH_FN(glBeginTransformFeedback))(GL_TH_DP, GLenum primitiveMode) = NULL;
+void (*GL_TH_FN(glBindBufferBase))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer) = NULL;
+void (*GL_TH_FN(glBindBufferRange))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) = NULL;
+void (*GL_TH_FN(glBindSampler))(GL_TH_DP, GLuint unit, GLuint sampler) = NULL;
+void (*GL_TH_FN(glBindTransformFeedback))(GL_TH_DP, GLenum target, GLuint id) = NULL;
+void (*GL_TH_FN(glBindVertexArray))(GL_TH_DP, GLuint array) = NULL;
+void (*GL_TH_FN(glBlitFramebuffer))(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) = NULL;
+void (*GL_TH_FN(glClearBufferfi))(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil) = NULL;
+void (*GL_TH_FN(glClearBufferfv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value) = NULL;
+void (*GL_TH_FN(glClearBufferiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value) = NULL;
+void (*GL_TH_FN(glClearBufferuiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value) = NULL;
+GLenum (*GL_TH_FN(glClientWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout) = NULL;
+void (*GL_TH_FN(glCompressedTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data) = NULL;
+void (*GL_TH_FN(glCompressedTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data) = NULL;
+void (*GL_TH_FN(glCopyBufferSubData))(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size) = NULL;
+void (*GL_TH_FN(glCopyTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glDeleteQueries))(GL_TH_DP, GLsizei n, const GLuint * ids) = NULL;
+void (*GL_TH_FN(glDeleteSamplers))(GL_TH_DP, GLsizei n, const GLuint * samplers) = NULL;
+void (*GL_TH_FN(glDeleteSync))(GL_TH_DP, GLsync sync) = NULL;
+void (*GL_TH_FN(glDeleteTransformFeedbacks))(GL_TH_DP, GLsizei n, const GLuint *ids) = NULL;
+void (*GL_TH_FN(glDeleteVertexArrays))(GL_TH_DP, GLsizei n, const GLuint *arrays) = NULL;
+void (*GL_TH_FN(glDrawArraysInstanced))(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount) = NULL;
+void (*GL_TH_FN(glDrawBuffers))(GL_TH_DP, GLsizei n, const GLenum *bufs) = NULL;
+void (*GL_TH_FN(glDrawElementsInstanced))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount) = NULL;
+void (*GL_TH_FN(glDrawRangeElements))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) = NULL;
+void (*GL_TH_FN(glEndQuery))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glEndTransformFeedback))(GL_TH_DP) = NULL;
+GLsync (*GL_TH_FN(glFenceSync))(GL_TH_DP, GLenum condition, GLbitfield flags) = NULL;
+GLsync (*GL_TH_FN(glFlushMappedBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length) = NULL;
+void (*GL_TH_FN(glFramebufferTextureLayer))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) = NULL;
+void (*GL_TH_FN(glGenQueries))(GL_TH_DP, GLsizei n, GLuint * ids) = NULL;
+void (*GL_TH_FN(glGenSamplers))(GL_TH_DP, GLsizei n, GLuint *samplers) = NULL;
+void (*GL_TH_FN(glGenTransformFeedbacks))(GL_TH_DP, GLsizei n, GLuint *ids) = NULL;
+void (*GL_TH_FN(glGenVertexArrays))(GL_TH_DP, GLsizei n, GLuint *arrays) = NULL;
+void (*GL_TH_FN(glGetActiveUniformBlockiv))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetActiveUniformBlockName))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) = NULL;
+void (*GL_TH_FN(glGetActiveUniformsiv))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetBufferParameteri64v))(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data) = NULL;
+void (*GL_TH_FN(glGetBufferPointerv))(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params) = NULL;
+GLint (*GL_TH_FN(glGetFragDataLocation))(GL_TH_DP, GLuint program, const char * name) = NULL;
+void (*GL_TH_FN(glGetInteger64i_v))(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data) = NULL;
+void (*GL_TH_FN(glGetInteger64v))(GL_TH_DP, GLenum pname, EvasGLint64 * data) = NULL;
+void (*GL_TH_FN(glGetIntegeri_v))(GL_TH_DP, GLenum target, GLuint index, GLint * data) = NULL;
+void (*GL_TH_FN(glGetInternalformativ))(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params) = NULL;
+void (*GL_TH_FN(glGetProgramBinary))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
+void (*GL_TH_FN(glGetQueryiv))(GL_TH_DP, GLenum target, GLenum pname, GLint * params) = NULL;
+void (*GL_TH_FN(glGetQueryObjectuiv))(GL_TH_DP, GLuint id, GLenum pname, GLuint * params) = NULL;
+void (*GL_TH_FN(glGetSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params) = NULL;
+void (*GL_TH_FN(glGetSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params) = NULL;
+const GLubyte * (*GL_TH_FN(glGetStringi))(GL_TH_DP, GLenum name, GLuint index) = NULL;
+void (*GL_TH_FN(glGetSynciv))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) = NULL;
+void (*GL_TH_FN(glGetTransformFeedbackVarying))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name) = NULL;
+GLuint (*GL_TH_FN(glGetUniformBlockIndex))(GL_TH_DP, GLuint program, const GLchar *uniformBlockName) = NULL;
+void (*GL_TH_FN(glGetUniformIndices))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices) = NULL;
+void (*GL_TH_FN(glGetUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLuint* params) = NULL;
+void (*GL_TH_FN(glGetVertexAttribIiv))(GL_TH_DP, GLuint index, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetVertexAttribIuiv))(GL_TH_DP, GLuint index, GLenum pname, GLuint *params) = NULL;
+void (*GL_TH_FN(glInvalidateFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments) = NULL;
+void (*GL_TH_FN(glInvalidateSubFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
+GLboolean (*GL_TH_FN(glIsQuery))(GL_TH_DP, GLuint id) = NULL;
+GLboolean (*GL_TH_FN(glIsSampler))(GL_TH_DP, GLuint id) = NULL;
+GLboolean (*GL_TH_FN(glIsSync))(GL_TH_DP, GLsync sync) = NULL;
+GLboolean (*GL_TH_FN(glIsTransformFeedback))(GL_TH_DP, GLuint id) = NULL;
+GLboolean (*GL_TH_FN(glIsVertexArray))(GL_TH_DP, GLuint array) = NULL;
+void * (*GL_TH_FN(glMapBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) = NULL;
+void (*GL_TH_FN(glPauseTransformFeedback))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glProgramBinary))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length) = NULL;
+void (*GL_TH_FN(glProgramParameteri))(GL_TH_DP, GLuint program, GLenum pname, GLint value) = NULL;
+void (*GL_TH_FN(glReadBuffer))(GL_TH_DP, GLenum src) = NULL;
+void (*GL_TH_FN(glRenderbufferStorageMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glResumeTransformFeedback))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glSamplerParameterf))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param) = NULL;
+void (*GL_TH_FN(glSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params) = NULL;
+void (*GL_TH_FN(glSamplerParameteri))(GL_TH_DP, GLuint sampler, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params) = NULL;
+void (*GL_TH_FN(glTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data) = NULL;
+void (*GL_TH_FN(glTexStorage2D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
+void (*GL_TH_FN(glTexStorage3D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) = NULL;
+void (*GL_TH_FN(glTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data) = NULL;
+void (*GL_TH_FN(glTransformFeedbackVaryings))(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode) = NULL;
+void (*GL_TH_FN(glUniform1ui))(GL_TH_DP, GLint location, GLuint v0) = NULL;
+void (*GL_TH_FN(glUniform1uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glUniform2ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1) = NULL;
+void (*GL_TH_FN(glUniform2uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glUniform3ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2) = NULL;
+void (*GL_TH_FN(glUniform3uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glUniform4ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = NULL;
+void (*GL_TH_FN(glUniform4uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glUniformBlockBinding))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) = NULL;
+void (*GL_TH_FN(glUniformMatrix2x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glUniformMatrix3x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glUniformMatrix2x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glUniformMatrix4x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glUniformMatrix3x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glUniformMatrix4x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+GLboolean (*GL_TH_FN(glUnmapBuffer))(GL_TH_DP, GLenum target) = NULL;
+void (*GL_TH_FN(glVertexAttribDivisor))(GL_TH_DP, GLuint index, GLuint divisor) = NULL;
+void (*GL_TH_FN(glVertexAttribI4i))(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3) = NULL;
+void (*GL_TH_FN(glVertexAttribI4iv))(GL_TH_DP, GLuint index, const GLint *v) = NULL;
+void (*GL_TH_FN(glVertexAttribI4ui))(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = NULL;
+void (*GL_TH_FN(glVertexAttribI4uiv))(GL_TH_DP, GLuint index, const GLuint *v) = NULL;
+void (*GL_TH_FN(glVertexAttribIPointer))(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = NULL;
+void (*GL_TH_FN(glWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout) = NULL;
+void (*GL_TH_FN(glDispatchCompute))(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) = NULL;
+void (*GL_TH_FN(glDispatchComputeIndirect))(GL_TH_DP, GLintptr indirect) = NULL;
+void (*GL_TH_FN(glDrawArraysIndirect))(GL_TH_DP, GLenum mode, const void *indirect) = NULL;
+void (*GL_TH_FN(glDrawElementsIndirect))(GL_TH_DP, GLenum mode, GLenum type, const void *indirect) = NULL;
+void (*GL_TH_FN(glFramebufferParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param) = NULL;
+void (*GL_TH_FN(glGetFramebufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetProgramInterfaceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params) = NULL;
+GLuint (*GL_TH_FN(glGetProgramResourceIndex))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name) = NULL;
+void (*GL_TH_FN(glGetProgramResourceName))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) = NULL;
+void (*GL_TH_FN(glGetProgramResourceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params) = NULL;
+GLint (*GL_TH_FN(glGetProgramResourceLocation))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name) = NULL;
+void (*GL_TH_FN(glUseProgramStages))(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program) = NULL;
+void (*GL_TH_FN(glActiveShaderProgram))(GL_TH_DP, GLuint pipeline, GLuint program) = NULL;
+GLuint (*GL_TH_FN(glCreateShaderProgramv))(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings) = NULL;
+void (*GL_TH_FN(glBindProgramPipeline))(GL_TH_DP, GLuint pipeline) = NULL;
+void (*GL_TH_FN(glDeleteProgramPipelines))(GL_TH_DP, GLsizei n, const GLuint *pipelines) = NULL;
+void (*GL_TH_FN(glGenProgramPipelines))(GL_TH_DP, GLsizei n, GLuint *pipelines) = NULL;
+GLboolean (*GL_TH_FN(glIsProgramPipeline))(GL_TH_DP, GLuint pipeline) = NULL;
+void (*GL_TH_FN(glGetProgramPipelineiv))(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glProgramUniform1i))(GL_TH_DP, GLuint program, GLint location, GLint v0) = NULL;
+void (*GL_TH_FN(glProgramUniform2i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1) = NULL;
+void (*GL_TH_FN(glProgramUniform3i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2) = NULL;
+void (*GL_TH_FN(glProgramUniform4i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) = NULL;
+void (*GL_TH_FN(glProgramUniform1ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0) = NULL;
+void (*GL_TH_FN(glProgramUniform2ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1) = NULL;
+void (*GL_TH_FN(glProgramUniform3ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) = NULL;
+void (*GL_TH_FN(glProgramUniform4ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) = NULL;
+void (*GL_TH_FN(glProgramUniform1f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0) = NULL;
+void (*GL_TH_FN(glProgramUniform2f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1) = NULL;
+void (*GL_TH_FN(glProgramUniform3f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) = NULL;
+void (*GL_TH_FN(glProgramUniform4f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) = NULL;
+void (*GL_TH_FN(glProgramUniform1iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform2iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform3iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform4iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform1uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform2uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform3uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform4uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value) = NULL;
+void (*GL_TH_FN(glProgramUniform1fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniform2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniform3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniform4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix2x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix3x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix2x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix4x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix3x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glProgramUniformMatrix4x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = NULL;
+void (*GL_TH_FN(glValidateProgramPipeline))(GL_TH_DP, GLuint pipeline) = NULL;
+void (*GL_TH_FN(glGetProgramPipelineInfoLog))(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog) = NULL;
+void (*GL_TH_FN(glBindImageTexture))(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) = NULL;
+void (*GL_TH_FN(glGetBooleani_v))(GL_TH_DP, GLenum target, GLuint index, GLboolean *data) = NULL;
+void (*GL_TH_FN(glMemoryBarrier))(GL_TH_DP, GLbitfield barriers) = NULL;
+void (*GL_TH_FN(glMemoryBarrierByRegion))(GL_TH_DP, GLbitfield barriers) = NULL;
+void (*GL_TH_FN(glTexStorage2DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) = NULL;
+void (*GL_TH_FN(glGetMultisamplefv))(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val) = NULL;
+void (*GL_TH_FN(glSampleMaski))(GL_TH_DP, GLuint maskNumber, GLbitfield mask) = NULL;
+void (*GL_TH_FN(glGetTexLevelParameteriv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetTexLevelParameterfv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params) = NULL;
+void (*GL_TH_FN(glBindVertexBuffer))(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) = NULL;
+void (*GL_TH_FN(glVertexAttribFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) = NULL;
+void (*GL_TH_FN(glVertexAttribIFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) = NULL;
+void (*GL_TH_FN(glVertexAttribBinding))(GL_TH_DP, GLuint attribindex, GLuint bindingindex) = NULL;
+void (*GL_TH_FN(glVertexBindingDivisor))(GL_TH_DP, GLuint bindingindex, GLuint divisor) = NULL;
+void (*GL_TH_FN(glBlendBarrier))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glCopyImageSubData))(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) = NULL;
+void (*GL_TH_FN(glDebugMessageControl))(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) = NULL;
+void (*GL_TH_FN(glDebugMessageInsert))(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) = NULL;
+void (*GL_TH_FN(glDebugMessageCallback))(GL_TH_DP, GLDEBUGPROC callback, const void *userParam) = NULL;
+GLuint (*GL_TH_FN(glGetDebugMessageLog))(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog) = NULL;
+void (*GL_TH_FN(glPushDebugGroup))(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message) = NULL;
+void (*GL_TH_FN(glPopDebugGroup))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label) = NULL;
+void (*GL_TH_FN(glGetObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label) = NULL;
+void (*GL_TH_FN(glObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label) = NULL;
+void (*GL_TH_FN(glGetObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) = NULL;
+void (*GL_TH_FN(glEnablei))(GL_TH_DP, GLenum target, GLuint index) = NULL;
+void (*GL_TH_FN(glDisablei))(GL_TH_DP, GLenum target, GLuint index) = NULL;
+void (*GL_TH_FN(glBlendEquationi))(GL_TH_DP, GLuint buf, GLenum mode) = NULL;
+void (*GL_TH_FN(glBlendEquationSeparatei))(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha) = NULL;
+void (*GL_TH_FN(glBlendFunci))(GL_TH_DP, GLuint buf, GLenum src, GLenum dst) = NULL;
+void (*GL_TH_FN(glBlendFuncSeparatei))(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL;
+void (*GL_TH_FN(glColorMaski))(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) = NULL;
+GLboolean (*GL_TH_FN(glIsEnabledi))(GL_TH_DP, GLenum target, GLuint index) = NULL;
+void (*GL_TH_FN(glDrawElementsBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) = NULL;
+void (*GL_TH_FN(glDrawRangeElementsBaseVertex))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex) = NULL;
+void (*GL_TH_FN(glDrawElementsInstancedBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex) = NULL;
+void (*GL_TH_FN(glFramebufferTexture))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level) = NULL;
+void (*GL_TH_FN(glPrimitiveBoundingBox))(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) = NULL;
+GLenum (*GL_TH_FN(glGetGraphicsResetStatus))(GL_TH_DP) = NULL;
+void (*GL_TH_FN(glReadnPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data) = NULL;
+void (*GL_TH_FN(glGetnUniformfv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params) = NULL;
+void (*GL_TH_FN(glGetnUniformiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params) = NULL;
+void (*GL_TH_FN(glGetnUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params) = NULL;
+void (*GL_TH_FN(glMinSampleShading))(GL_TH_DP, GLfloat value) = NULL;
+void (*GL_TH_FN(glPatchParameteri))(GL_TH_DP, GLenum pname, GLint value) = NULL;
+void (*GL_TH_FN(glTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params) = NULL;
+void (*GL_TH_FN(glTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params) = NULL;
+void (*GL_TH_FN(glGetTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, GLuint *params) = NULL;
+void (*GL_TH_FN(glSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param) = NULL;
+void (*GL_TH_FN(glSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param) = NULL;
+void (*GL_TH_FN(glGetSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params) = NULL;
+void (*GL_TH_FN(glGetSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params) = NULL;
+void (*GL_TH_FN(glTexBuffer))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer) = NULL;
+void (*GL_TH_FN(glTexBufferRange))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) = NULL;
+void (*GL_TH_FN(glTexStorage3DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) = NULL;
+void (*GL_TH_FN(glEGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, void *image) = NULL;
+void (*GL_TH_FN(glEGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, void *image) = NULL;
+EvasGLImage (*GL_TH_FN(evasglCreateImage))(GL_TH_DP, int target, void* buffer, const int *attrib_list) = NULL;
+void (*GL_TH_FN(evasglDestroyImage))(GL_TH_DP, EvasGLImage image) = NULL;
+EvasGLImage (*GL_TH_FN(evasglCreateImageForContext))(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list) = NULL;
+EvasGLSync (*GL_TH_FN(evasglCreateSync))(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list) = NULL;
+Eina_Bool (*GL_TH_FN(evasglDestroySync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync) = NULL;
+int (*GL_TH_FN(evasglClientWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout) = NULL;
+Eina_Bool (*GL_TH_FN(evasglGetSyncAttrib))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value) = NULL;
+Eina_Bool (*GL_TH_FN(evasglSignalSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode) = NULL;
+int (*GL_TH_FN(evasglWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags) = NULL;
+Eina_Bool (*GL_TH_FN(evasglBindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display) = NULL;
+Eina_Bool (*GL_TH_FN(evasglUnbindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display) = NULL;
+Eina_Bool (*GL_TH_FN(evasglQueryWaylandBuffer))(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value) = NULL;
 
-#ifndef GL_GLES
-void (*glGetTexLevelParameteriv_thread_cmd)(GLenum target, GLint level, GLenum pname, GLint *params) = NULL;
-#endif
-
-#ifndef GL_GLES
-void (*glRenderbufferStorageMultisample_orig_evas_set)(void *func) = NULL;
-void *(*glRenderbufferStorageMultisample_orig_evas_get)(void) = NULL;
-void (*glRenderbufferStorageMultisample_thread_cmd)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
-#endif
-void (*glGetStringi_orig_evas_set)(void *func) = NULL;
-void *(*glGetStringi_orig_evas_get)(void) = NULL;
-const GLubyte * (*glGetStringi_thread_cmd)(GLenum name, GLuint index) = NULL;
+typedef struct
+{
+   void (*GL_TH_FN(glActiveTexture))(GL_TH_DP, GLenum texture);
+   void (*GL_TH_FN(glAttachShader))(GL_TH_DP, GLuint program, GLuint shader);
+   void (*GL_TH_FN(glBindAttribLocation))(GL_TH_DP, GLuint program, GLuint index, const char* name);
+   void (*GL_TH_FN(glBindBuffer))(GL_TH_DP, GLenum target, GLuint buffer);
+   void (*GL_TH_FN(glBindFramebuffer))(GL_TH_DP, GLenum target, GLuint framebuffer);
+   void (*GL_TH_FN(glBindRenderbuffer))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+   void (*GL_TH_FN(glBindTexture))(GL_TH_DP, GLenum target, GLuint texture);
+   void (*GL_TH_FN(glBlendColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+   void (*GL_TH_FN(glBlendEquation))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glBlendEquationSeparate))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFunc))(GL_TH_DP, GLenum sfactor, GLenum dfactor);
+   void (*GL_TH_FN(glBlendFuncSeparate))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glBufferData))(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+   void (*GL_TH_FN(glBufferSubData))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+   GLenum (*GL_TH_FN(glCheckFramebufferStatus))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glClear))(GL_TH_DP, GLbitfield mask);
+   void (*GL_TH_FN(glClearColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+   void (*GL_TH_FN(glClearDepthf))(GL_TH_DP, GLclampf depth);
+   void (*GL_TH_FN(glClearStencil))(GL_TH_DP, GLint s);
+   void (*GL_TH_FN(glColorMask))(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+   void (*GL_TH_FN(glCompileShader))(GL_TH_DP, GLuint shader);
+   void (*GL_TH_FN(glCompressedTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCompressedTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCopyTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+   void (*GL_TH_FN(glCopyTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   GLuint (*GL_TH_FN(glCreateProgram))(GL_TH_DP);
+   GLuint (*GL_TH_FN(glCreateShader))(GL_TH_DP, GLenum type);
+   void (*GL_TH_FN(glCullFace))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glDeleteBuffers))(GL_TH_DP, GLsizei n, const GLuint* buffers);
+   void (*GL_TH_FN(glDeleteFramebuffers))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+   void (*GL_TH_FN(glDeleteProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glDeleteRenderbuffers))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+   void (*GL_TH_FN(glDeleteShader))(GL_TH_DP, GLuint shader);
+   void (*GL_TH_FN(glDeleteTextures))(GL_TH_DP, GLsizei n, const GLuint* textures);
+   void (*GL_TH_FN(glDepthFunc))(GL_TH_DP, GLenum func);
+   void (*GL_TH_FN(glDepthMask))(GL_TH_DP, GLboolean flag);
+   void (*GL_TH_FN(glDepthRangef))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+   void (*GL_TH_FN(glDetachShader))(GL_TH_DP, GLuint program, GLuint shader);
+   void (*GL_TH_FN(glDisable))(GL_TH_DP, GLenum cap);
+   void (*GL_TH_FN(glDisableVertexAttribArray))(GL_TH_DP, GLuint index);
+   void (*GL_TH_FN(glDrawArrays))(GL_TH_DP, GLenum mode, GLint first, GLsizei count);
+   void (*GL_TH_FN(glDrawElements))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices);
+   void (*GL_TH_FN(glEnable))(GL_TH_DP, GLenum cap);
+   void (*GL_TH_FN(glEnableVertexAttribArray))(GL_TH_DP, GLuint index);
+   void (*GL_TH_FN(glFinish))(GL_TH_DP);
+   void (*GL_TH_FN(glFlush))(GL_TH_DP);
+   void (*GL_TH_FN(glFramebufferRenderbuffer))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+   void (*GL_TH_FN(glFramebufferTexture2D))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+   void (*GL_TH_FN(glFrontFace))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glGenBuffers))(GL_TH_DP, GLsizei n, GLuint* buffers);
+   void (*GL_TH_FN(glGenerateMipmap))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glGenFramebuffers))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+   void (*GL_TH_FN(glGenRenderbuffers))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+   void (*GL_TH_FN(glGenTextures))(GL_TH_DP, GLsizei n, GLuint* textures);
+   void (*GL_TH_FN(glGetActiveAttrib))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+   void (*GL_TH_FN(glGetActiveUniform))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+   void (*GL_TH_FN(glGetAttachedShaders))(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+   int (*GL_TH_FN(glGetAttribLocation))(GL_TH_DP, GLuint program, const char* name);
+   void (*GL_TH_FN(glGetBooleanv))(GL_TH_DP, GLenum pname, GLboolean* params);
+   void (*GL_TH_FN(glGetBufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   GLenum (*GL_TH_FN(glGetError))(GL_TH_DP);
+   void (*GL_TH_FN(glGetFloatv))(GL_TH_DP, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetFramebufferAttachmentParameteriv))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetIntegerv))(GL_TH_DP, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetProgramiv))(GL_TH_DP, GLuint program, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetProgramInfoLog))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+   void (*GL_TH_FN(glGetRenderbufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetShaderiv))(GL_TH_DP, GLuint shader, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetShaderInfoLog))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+   void (*GL_TH_FN(glGetShaderPrecisionFormat))(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+   void (*GL_TH_FN(glGetShaderSource))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+   const GLubyte* (*GL_TH_FN(glGetString))(GL_TH_DP, GLenum name);
+   void (*GL_TH_FN(glGetTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetUniformfv))(GL_TH_DP, GLuint program, GLint location, GLfloat* params);
+   void (*GL_TH_FN(glGetUniformiv))(GL_TH_DP, GLuint program, GLint location, GLint* params);
+   int (*GL_TH_FN(glGetUniformLocation))(GL_TH_DP, GLuint program, const char* name);
+   void (*GL_TH_FN(glGetVertexAttribfv))(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params);
+   void (*GL_TH_FN(glGetVertexAttribiv))(GL_TH_DP, GLuint index, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGetVertexAttribPointerv))(GL_TH_DP, GLuint index, GLenum pname, void** pointer);
+   void (*GL_TH_FN(glHint))(GL_TH_DP, GLenum target, GLenum mode);
+   GLboolean (*GL_TH_FN(glIsBuffer))(GL_TH_DP, GLuint buffer);
+   GLboolean (*GL_TH_FN(glIsEnabled))(GL_TH_DP, GLenum cap);
+   GLboolean (*GL_TH_FN(glIsFramebuffer))(GL_TH_DP, GLuint framebuffer);
+   GLboolean (*GL_TH_FN(glIsProgram))(GL_TH_DP, GLuint program);
+   GLboolean (*GL_TH_FN(glIsRenderbuffer))(GL_TH_DP, GLuint renderbuffer);
+   GLboolean (*GL_TH_FN(glIsShader))(GL_TH_DP, GLuint shader);
+   GLboolean (*GL_TH_FN(glIsTexture))(GL_TH_DP, GLuint texture);
+   void (*GL_TH_FN(glLineWidth))(GL_TH_DP, GLfloat width);
+   void (*GL_TH_FN(glLinkProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glPixelStorei))(GL_TH_DP, GLenum pname, GLint param);
+   void (*GL_TH_FN(glPolygonOffset))(GL_TH_DP, GLfloat factor, GLfloat units);
+   void (*GL_TH_FN(glReadPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+   void (*GL_TH_FN(glReleaseShaderCompiler))(GL_TH_DP);
+   void (*GL_TH_FN(glRenderbufferStorage))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glSampleCoverage))(GL_TH_DP, GLclampf value, GLboolean invert);
+   void (*GL_TH_FN(glScissor))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glShaderBinary))(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+   void (*GL_TH_FN(glShaderSource))(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+   void (*GL_TH_FN(glStencilFunc))(GL_TH_DP, GLenum func, GLint ref, GLuint mask);
+   void (*GL_TH_FN(glStencilFuncSeparate))(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask);
+   void (*GL_TH_FN(glStencilMask))(GL_TH_DP, GLuint mask);
+   void (*GL_TH_FN(glStencilMaskSeparate))(GL_TH_DP, GLenum face, GLuint mask);
+   void (*GL_TH_FN(glStencilOp))(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass);
+   void (*GL_TH_FN(glStencilOpSeparate))(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+   void (*GL_TH_FN(glTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glTexParameterf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params);
+   void (*GL_TH_FN(glTexParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, const GLint* params);
+   void (*GL_TH_FN(glTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glUniform1f))(GL_TH_DP, GLint location, GLfloat x);
+   void (*GL_TH_FN(glUniform1fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform1i))(GL_TH_DP, GLint location, GLint x);
+   void (*GL_TH_FN(glUniform1iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform2f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y);
+   void (*GL_TH_FN(glUniform2fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform2i))(GL_TH_DP, GLint location, GLint x, GLint y);
+   void (*GL_TH_FN(glUniform2iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform3f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glUniform3fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform3i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z);
+   void (*GL_TH_FN(glUniform3iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniform4f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+   void (*GL_TH_FN(glUniform4fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+   void (*GL_TH_FN(glUniform4i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w);
+   void (*GL_TH_FN(glUniform4iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+   void (*GL_TH_FN(glUniformMatrix2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUniformMatrix3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUniformMatrix4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+   void (*GL_TH_FN(glUseProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glValidateProgram))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glVertexAttrib1f))(GL_TH_DP, GLuint indx, GLfloat x);
+   void (*GL_TH_FN(glVertexAttrib1fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib2f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y);
+   void (*GL_TH_FN(glVertexAttrib2fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib3f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glVertexAttrib3fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttrib4f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+   void (*GL_TH_FN(glVertexAttrib4fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+   void (*GL_TH_FN(glVertexAttribPointer))(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+   void (*GL_TH_FN(glViewport))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glEvasGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+   void (*GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+   void (*GL_TH_FN(glGetProgramBinaryOES))(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+   void (*GL_TH_FN(glProgramBinaryOES))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+   void * (*GL_TH_FN(glMapBufferOES))(GL_TH_DP, GLenum target, GLenum access);
+   GLboolean (*GL_TH_FN(glUnmapBufferOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glGetBufferPointervOES))(GL_TH_DP, GLenum target, GLenum pname, void** params);
+   void (*GL_TH_FN(glTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+   void (*GL_TH_FN(glCopyTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glCompressedTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glCompressedTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+   void (*GL_TH_FN(glFramebufferTexture3DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+   void (*GL_TH_FN(glGetPerfMonitorGroupsAMD))(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+   void (*GL_TH_FN(glGetPerfMonitorCountersAMD))(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+   void (*GL_TH_FN(glGetPerfMonitorGroupStringAMD))(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+   void (*GL_TH_FN(glGetPerfMonitorCounterStringAMD))(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+   void (*GL_TH_FN(glGetPerfMonitorCounterInfoAMD))(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data);
+   void (*GL_TH_FN(glGenPerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+   void (*GL_TH_FN(glDeletePerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+   void (*GL_TH_FN(glSelectPerfMonitorCountersAMD))(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+   void (*GL_TH_FN(glBeginPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+   void (*GL_TH_FN(glEndPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+   void (*GL_TH_FN(glGetPerfMonitorCounterDataAMD))(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+   void (*GL_TH_FN(glDiscardFramebufferEXT))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments);
+   void (*GL_TH_FN(glMultiDrawArraysEXT))(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+   void (*GL_TH_FN(glMultiDrawElementsEXT))(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+   void (*GL_TH_FN(glDeleteFencesNV))(GL_TH_DP, GLsizei n, const GLuint* fences);
+   void (*GL_TH_FN(glGenFencesNV))(GL_TH_DP, GLsizei n, GLuint* fences);
+   GLboolean (*GL_TH_FN(glIsFenceNV))(GL_TH_DP, GLuint fence);
+   GLboolean (*GL_TH_FN(glTestFenceNV))(GL_TH_DP, GLuint fence);
+   void (*GL_TH_FN(glGetFenceivNV))(GL_TH_DP, GLuint fence, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glFinishFenceNV))(GL_TH_DP, GLuint fence);
+   void (*GL_TH_FN(glSetFenceNV))(GL_TH_DP, GLuint a, GLenum b);
+   void (*GL_TH_FN(glGetDriverControlsQCOM))(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls);
+   void (*GL_TH_FN(glGetDriverControlStringQCOM))(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+   void (*GL_TH_FN(glEnableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+   void (*GL_TH_FN(glDisableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+   void (*GL_TH_FN(glExtGetTexturesQCOM))(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures);
+   void (*GL_TH_FN(glExtGetBuffersQCOM))(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+   void (*GL_TH_FN(glExtGetRenderbuffersQCOM))(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+   void (*GL_TH_FN(glExtGetFramebuffersQCOM))(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+   void (*GL_TH_FN(glExtGetTexLevelParameterivQCOM))(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glExtTexObjectStateOverrideiQCOM))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glExtGetTexSubImageQCOM))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+   void (*GL_TH_FN(glExtGetBufferPointervQCOM))(GL_TH_DP, GLenum target, void** params);
+   void (*GL_TH_FN(glExtGetShadersQCOM))(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders);
+   void (*GL_TH_FN(glExtGetProgramsQCOM))(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+   GLboolean (*GL_TH_FN(glExtIsProgramBinaryQCOM))(GL_TH_DP, GLuint program);
+   void (*GL_TH_FN(glExtGetProgramBinarySourceQCOM))(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length);
+   void (*GL_TH_FN(glAlphaFunc))(GL_TH_DP, GLenum func, GLclampf ref);
+   void (*GL_TH_FN(glClipPlanef))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+   void (*GL_TH_FN(glColor4f))(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+   void (*GL_TH_FN(glFogf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glFogfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glFrustumf))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glGetClipPlanef))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+   void (*GL_TH_FN(glGetLightfv))(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetTexEnvfv))(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glLightModelf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glLightModelfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glLightf))(GL_TH_DP, GLenum light, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glLightfv))(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glLoadMatrixf))(GL_TH_DP, const GLfloat *m);
+   void (*GL_TH_FN(glMaterialf))(GL_TH_DP, GLenum face, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glMultMatrixf))(GL_TH_DP, const GLfloat *m);
+   void (*GL_TH_FN(glMultiTexCoord4f))(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+   void (*GL_TH_FN(glNormal3f))(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz);
+   void (*GL_TH_FN(glOrthof))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glPointParameterf))(GL_TH_DP, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glPointParameterfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glPointSize))(GL_TH_DP, GLfloat size);
+   void (*GL_TH_FN(glPointSizePointerOES))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer);
+   void (*GL_TH_FN(glRotatef))(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glScalef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glTexEnvf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexEnvfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glTranslatef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+   void (*GL_TH_FN(glAlphaFuncx))(GL_TH_DP, GLenum func, GLclampx ref);
+   void (*GL_TH_FN(glClearColorx))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+   void (*GL_TH_FN(glClearDepthx))(GL_TH_DP, GLclampx depth);
+   void (*GL_TH_FN(glClientActiveTexture))(GL_TH_DP, GLenum texture);
+   void (*GL_TH_FN(glClipPlanex))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+   void (*GL_TH_FN(glColor4ub))(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+   void (*GL_TH_FN(glColor4x))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+   void (*GL_TH_FN(glColorPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glDepthRangex))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+   void (*GL_TH_FN(glDisableClientState))(GL_TH_DP, GLenum array);
+   void (*GL_TH_FN(glEnableClientState))(GL_TH_DP, GLenum array);
+   void (*GL_TH_FN(glFogx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glFogxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glFrustumx))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glGetClipPlanex))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+   void (*GL_TH_FN(glGetFixedv))(GL_TH_DP, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetLightxv))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetPointerv))(GL_TH_DP, GLenum pname, GLvoid **params);
+   void (*GL_TH_FN(glGetTexEnviv))(GL_TH_DP, GLenum env, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexEnvxv))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glLightModelx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightModelxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLightx))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightxv))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLineWidthx))(GL_TH_DP, GLfixed width);
+   void (*GL_TH_FN(glLoadIdentity))(GL_TH_DP);
+   void (*GL_TH_FN(glLoadMatrixx))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glLogicOp))(GL_TH_DP, GLenum opcode);
+   void (*GL_TH_FN(glMaterialx))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glMatrixMode))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glMultMatrixx))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMultiTexCoord4x))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+   void (*GL_TH_FN(glNormal3x))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+   void (*GL_TH_FN(glNormalPointer))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glOrthox))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glPointParameterx))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glPointParameterxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glPointSizex))(GL_TH_DP, GLfixed size);
+   void (*GL_TH_FN(glPolygonOffsetx))(GL_TH_DP, GLfixed factor, GLfixed units);
+   void (*GL_TH_FN(glPopMatrix))(GL_TH_DP);
+   void (*GL_TH_FN(glPushMatrix))(GL_TH_DP);
+   void (*GL_TH_FN(glRotatex))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glSampleCoveragex))(GL_TH_DP, GLclampx value, GLboolean invert);
+   void (*GL_TH_FN(glScalex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glShadeModel))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glTexCoordPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glTexEnvi))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexEnvx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexEnviv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexEnvxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTexParameterx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTranslatex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glVertexPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glBlendEquationSeparateOES))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFuncSeparateOES))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glBlendEquationOES))(GL_TH_DP, GLenum mode);
+   void (*GL_TH_FN(glDrawTexsOES))(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+   void (*GL_TH_FN(glDrawTexiOES))(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height);
+   void (*GL_TH_FN(glDrawTexxOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+   void (*GL_TH_FN(glDrawTexsvOES))(GL_TH_DP, const GLshort *coords);
+   void (*GL_TH_FN(glDrawTexivOES))(GL_TH_DP, const GLint *coords);
+   void (*GL_TH_FN(glDrawTexxvOES))(GL_TH_DP, const GLfixed *coords);
+   void (*GL_TH_FN(glDrawTexfOES))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+   void (*GL_TH_FN(glDrawTexfvOES))(GL_TH_DP, const GLfloat *coords);
+   void (*GL_TH_FN(glAlphaFuncxOES))(GL_TH_DP, GLenum func, GLclampx ref);
+   void (*GL_TH_FN(glClearColorxOES))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+   void (*GL_TH_FN(glClearDepthxOES))(GL_TH_DP, GLclampx depth);
+   void (*GL_TH_FN(glClipPlanexOES))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+   void (*GL_TH_FN(glColor4xOES))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+   void (*GL_TH_FN(glDepthRangexOES))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+   void (*GL_TH_FN(glFogxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glFogxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glFrustumxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glGetClipPlanexOES))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+   void (*GL_TH_FN(glGetFixedvOES))(GL_TH_DP, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexEnvxvOES))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glGetTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glLightModelxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightModelxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLightxOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glLineWidthxOES))(GL_TH_DP, GLfixed width);
+   void (*GL_TH_FN(glLoadMatrixxOES))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMaterialxOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glMultMatrixxOES))(GL_TH_DP, const GLfixed *m);
+   void (*GL_TH_FN(glMultiTexCoord4xOES))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+   void (*GL_TH_FN(glNormal3xOES))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+   void (*GL_TH_FN(glOrthoxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+   void (*GL_TH_FN(glPointParameterxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glPointParameterxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glPointSizexOES))(GL_TH_DP, GLfixed size);
+   void (*GL_TH_FN(glPolygonOffsetxOES))(GL_TH_DP, GLfixed factor, GLfixed units);
+   void (*GL_TH_FN(glRotatexOES))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glSampleCoveragexOES))(GL_TH_DP, GLclampx value, GLboolean invert);
+   void (*GL_TH_FN(glScalexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   void (*GL_TH_FN(glTexEnvxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexEnvxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTexParameterxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glTranslatexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+   GLboolean (*GL_TH_FN(glIsRenderbufferOES))(GL_TH_DP, GLuint renderbuffer);
+   void (*GL_TH_FN(glBindRenderbufferOES))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+   void (*GL_TH_FN(glDeleteRenderbuffersOES))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+   void (*GL_TH_FN(glGenRenderbuffersOES))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+   void (*GL_TH_FN(glRenderbufferStorageOES))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glGetRenderbufferParameterivOES))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+   GLboolean (*GL_TH_FN(glIsFramebufferOES))(GL_TH_DP, GLuint framebuffer);
+   void (*GL_TH_FN(glBindFramebufferOES))(GL_TH_DP, GLenum target, GLuint framebuffer);
+   void (*GL_TH_FN(glDeleteFramebuffersOES))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+   void (*GL_TH_FN(glGenFramebuffersOES))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+   GLenum (*GL_TH_FN(glCheckFramebufferStatusOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glFramebufferRenderbufferOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+   void (*GL_TH_FN(glFramebufferTexture2DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+   void (*GL_TH_FN(glGetFramebufferAttachmentParameterivOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+   void (*GL_TH_FN(glGenerateMipmapOES))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glCurrentPaletteMatrixOES))(GL_TH_DP, GLuint matrixpaletteindex);
+   void (*GL_TH_FN(glLoadPaletteFromModelViewMatrixOES))(GL_TH_DP);
+   void (*GL_TH_FN(glMatrixIndexPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glWeightPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   GLbitfield (*GL_TH_FN(glQueryMatrixxOES))(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16]);
+   void (*GL_TH_FN(glDepthRangefOES))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+   void (*GL_TH_FN(glFrustumfOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glOrthofOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+   void (*GL_TH_FN(glClipPlanefOES))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+   void (*GL_TH_FN(glGetClipPlanefOES))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+   void (*GL_TH_FN(glClearDepthfOES))(GL_TH_DP, GLclampf depth);
+   void (*GL_TH_FN(glTexGenfOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params);
+   void (*GL_TH_FN(glTexGeniOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint param);
+   void (*GL_TH_FN(glTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexGenxOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param);
+   void (*GL_TH_FN(glTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params);
+   void (*GL_TH_FN(glGetTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glGetTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params);
+   void (*GL_TH_FN(glBindVertexArrayOES))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glDeleteVertexArraysOES))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+   void (*GL_TH_FN(glGenVertexArraysOES))(GL_TH_DP, GLsizei n, GLuint *arrays);
+   GLboolean (*GL_TH_FN(glIsVertexArrayOES))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glCopyTextureLevelsAPPLE))(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleAPPLE))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glResolveMultisampleFramebufferAPPLE))(GL_TH_DP);
+   GLsync (*GL_TH_FN(glFenceSyncAPPLE))(GL_TH_DP, GLenum condition, GLbitfield flags);
+   GLboolean (*GL_TH_FN(glIsSyncAPPLE))(GL_TH_DP, GLsync sync);
+   void (*GL_TH_FN(glDeleteSyncAPPLE))(GL_TH_DP, GLsync sync);
+   GLenum (*GL_TH_FN(glClientWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glGetInteger64vAPPLE))(GL_TH_DP, GLenum pname, EvasGLint64 *params);
+   void (*GL_TH_FN(glGetSyncivAPPLE))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+   void * (*GL_TH_FN(glMapBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+   void (*GL_TH_FN(glFlushMappedBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleEXT))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisampleEXT))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   GLenum (*GL_TH_FN(glGetGraphicsResetStatusEXT))(GL_TH_DP);
+   void (*GL_TH_FN(glReadnPixelsEXT))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+   void (*GL_TH_FN(glGetnUniformfvEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params);
+   void (*GL_TH_FN(glGetnUniformivEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glTexStorage1DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+   void (*GL_TH_FN(glTexStorage2DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTexStorage3DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glTextureStorage1DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+   void (*GL_TH_FN(glTextureStorage2DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTextureStorage3DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glClipPlanefIMG))(GL_TH_DP, GLenum a, const GLfloat * b);
+   void (*GL_TH_FN(glClipPlanexIMG))(GL_TH_DP, GLenum a, const GLfixed * b);
+   void (*GL_TH_FN(glRenderbufferStorageMultisampleIMG))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisampleIMG))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   void (*GL_TH_FN(glActivateTile))(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+   void (*GL_TH_FN(glStartTilingQCOM))(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+   void (*GL_TH_FN(glEndTilingQCOM))(GL_TH_DP, GLbitfield preserveMask);
+   void (*GL_TH_FN(glFramebufferTexture2DMultisample))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+   void (*GL_TH_FN(glBeginQuery))(GL_TH_DP, GLenum target, GLuint id);
+   void (*GL_TH_FN(glBeginTransformFeedback))(GL_TH_DP, GLenum primitiveMode);
+   void (*GL_TH_FN(glBindBufferBase))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer);
+   void (*GL_TH_FN(glBindBufferRange))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+   void (*GL_TH_FN(glBindSampler))(GL_TH_DP, GLuint unit, GLuint sampler);
+   void (*GL_TH_FN(glBindTransformFeedback))(GL_TH_DP, GLenum target, GLuint id);
+   void (*GL_TH_FN(glBindVertexArray))(GL_TH_DP, GLuint array);
+   void (*GL_TH_FN(glBlitFramebuffer))(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+   void (*GL_TH_FN(glClearBufferfi))(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+   void (*GL_TH_FN(glClearBufferfv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value);
+   void (*GL_TH_FN(glClearBufferiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value);
+   void (*GL_TH_FN(glClearBufferuiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value);
+   GLenum (*GL_TH_FN(glClientWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glCompressedTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+   void (*GL_TH_FN(glCompressedTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+   void (*GL_TH_FN(glCopyBufferSubData))(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+   void (*GL_TH_FN(glCopyTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glDeleteQueries))(GL_TH_DP, GLsizei n, const GLuint * ids);
+   void (*GL_TH_FN(glDeleteSamplers))(GL_TH_DP, GLsizei n, const GLuint * samplers);
+   void (*GL_TH_FN(glDeleteSync))(GL_TH_DP, GLsync sync);
+   void (*GL_TH_FN(glDeleteTransformFeedbacks))(GL_TH_DP, GLsizei n, const GLuint *ids);
+   void (*GL_TH_FN(glDeleteVertexArrays))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+   void (*GL_TH_FN(glDrawArraysInstanced))(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+   void (*GL_TH_FN(glDrawBuffers))(GL_TH_DP, GLsizei n, const GLenum *bufs);
+   void (*GL_TH_FN(glDrawElementsInstanced))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+   void (*GL_TH_FN(glDrawRangeElements))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+   void (*GL_TH_FN(glEndQuery))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glEndTransformFeedback))(GL_TH_DP);
+   GLsync (*GL_TH_FN(glFenceSync))(GL_TH_DP, GLenum condition, GLbitfield flags);
+   GLsync (*GL_TH_FN(glFlushMappedBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+   void (*GL_TH_FN(glFramebufferTextureLayer))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+   void (*GL_TH_FN(glGenQueries))(GL_TH_DP, GLsizei n, GLuint * ids);
+   void (*GL_TH_FN(glGenSamplers))(GL_TH_DP, GLsizei n, GLuint *samplers);
+   void (*GL_TH_FN(glGenTransformFeedbacks))(GL_TH_DP, GLsizei n, GLuint *ids);
+   void (*GL_TH_FN(glGenVertexArrays))(GL_TH_DP, GLsizei n, GLuint *arrays);
+   void (*GL_TH_FN(glGetActiveUniformBlockiv))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetActiveUniformBlockName))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+   void (*GL_TH_FN(glGetActiveUniformsiv))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetBufferParameteri64v))(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetBufferPointerv))(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params);
+   GLint (*GL_TH_FN(glGetFragDataLocation))(GL_TH_DP, GLuint program, const char * name);
+   void (*GL_TH_FN(glGetInteger64i_v))(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetInteger64v))(GL_TH_DP, GLenum pname, EvasGLint64 * data);
+   void (*GL_TH_FN(glGetIntegeri_v))(GL_TH_DP, GLenum target, GLuint index, GLint * data);
+   void (*GL_TH_FN(glGetInternalformativ))(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glGetProgramBinary))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+   void (*GL_TH_FN(glGetQueryiv))(GL_TH_DP, GLenum target, GLenum pname, GLint * params);
+   void (*GL_TH_FN(glGetQueryObjectuiv))(GL_TH_DP, GLuint id, GLenum pname, GLuint * params);
+   void (*GL_TH_FN(glGetSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params);
+   void (*GL_TH_FN(glGetSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params);
+   const GLubyte * (*GL_TH_FN(glGetStringi))(GL_TH_DP, GLenum name, GLuint index);
+   void (*GL_TH_FN(glGetSynciv))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+   void (*GL_TH_FN(glGetTransformFeedbackVarying))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+   GLuint (*GL_TH_FN(glGetUniformBlockIndex))(GL_TH_DP, GLuint program, const GLchar *uniformBlockName);
+   void (*GL_TH_FN(glGetUniformIndices))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+   void (*GL_TH_FN(glGetUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLuint* params);
+   void (*GL_TH_FN(glGetVertexAttribIiv))(GL_TH_DP, GLuint index, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetVertexAttribIuiv))(GL_TH_DP, GLuint index, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glInvalidateFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments);
+   void (*GL_TH_FN(glInvalidateSubFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+   GLboolean (*GL_TH_FN(glIsQuery))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsSampler))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsSync))(GL_TH_DP, GLsync sync);
+   GLboolean (*GL_TH_FN(glIsTransformFeedback))(GL_TH_DP, GLuint id);
+   GLboolean (*GL_TH_FN(glIsVertexArray))(GL_TH_DP, GLuint array);
+   void * (*GL_TH_FN(glMapBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+   void (*GL_TH_FN(glPauseTransformFeedback))(GL_TH_DP);
+   void (*GL_TH_FN(glProgramBinary))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+   void (*GL_TH_FN(glProgramParameteri))(GL_TH_DP, GLuint program, GLenum pname, GLint value);
+   void (*GL_TH_FN(glReadBuffer))(GL_TH_DP, GLenum src);
+   void (*GL_TH_FN(glRenderbufferStorageMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glResumeTransformFeedback))(GL_TH_DP);
+   void (*GL_TH_FN(glSamplerParameterf))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param);
+   void (*GL_TH_FN(glSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params);
+   void (*GL_TH_FN(glSamplerParameteri))(GL_TH_DP, GLuint sampler, GLenum pname, GLint param);
+   void (*GL_TH_FN(glSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params);
+   void (*GL_TH_FN(glTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+   void (*GL_TH_FN(glTexStorage2D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+   void (*GL_TH_FN(glTexStorage3D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+   void (*GL_TH_FN(glTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+   void (*GL_TH_FN(glTransformFeedbackVaryings))(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+   void (*GL_TH_FN(glUniform1ui))(GL_TH_DP, GLint location, GLuint v0);
+   void (*GL_TH_FN(glUniform1uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform2ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1);
+   void (*GL_TH_FN(glUniform2uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform3ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2);
+   void (*GL_TH_FN(glUniform3uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniform4ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glUniform4uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glUniformBlockBinding))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+   void (*GL_TH_FN(glUniformMatrix2x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix3x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix2x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix4x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix3x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glUniformMatrix4x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   GLboolean (*GL_TH_FN(glUnmapBuffer))(GL_TH_DP, GLenum target);
+   void (*GL_TH_FN(glVertexAttribDivisor))(GL_TH_DP, GLuint index, GLuint divisor);
+   void (*GL_TH_FN(glVertexAttribI4i))(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+   void (*GL_TH_FN(glVertexAttribI4iv))(GL_TH_DP, GLuint index, const GLint *v);
+   void (*GL_TH_FN(glVertexAttribI4ui))(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glVertexAttribI4uiv))(GL_TH_DP, GLuint index, const GLuint *v);
+   void (*GL_TH_FN(glVertexAttribIPointer))(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+   void (*GL_TH_FN(glWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   void (*GL_TH_FN(glDispatchCompute))(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+   void (*GL_TH_FN(glDispatchComputeIndirect))(GL_TH_DP, GLintptr indirect);
+   void (*GL_TH_FN(glDrawArraysIndirect))(GL_TH_DP, GLenum mode, const void *indirect);
+   void (*GL_TH_FN(glDrawElementsIndirect))(GL_TH_DP, GLenum mode, GLenum type, const void *indirect);
+   void (*GL_TH_FN(glFramebufferParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+   void (*GL_TH_FN(glGetFramebufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetProgramInterfaceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+   GLuint (*GL_TH_FN(glGetProgramResourceIndex))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+   void (*GL_TH_FN(glGetProgramResourceName))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+   void (*GL_TH_FN(glGetProgramResourceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+   GLint (*GL_TH_FN(glGetProgramResourceLocation))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+   void (*GL_TH_FN(glUseProgramStages))(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program);
+   void (*GL_TH_FN(glActiveShaderProgram))(GL_TH_DP, GLuint pipeline, GLuint program);
+   GLuint (*GL_TH_FN(glCreateShaderProgramv))(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings);
+   void (*GL_TH_FN(glBindProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glDeleteProgramPipelines))(GL_TH_DP, GLsizei n, const GLuint *pipelines);
+   void (*GL_TH_FN(glGenProgramPipelines))(GL_TH_DP, GLsizei n, GLuint *pipelines);
+   GLboolean (*GL_TH_FN(glIsProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glGetProgramPipelineiv))(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glProgramUniform1i))(GL_TH_DP, GLuint program, GLint location, GLint v0);
+   void (*GL_TH_FN(glProgramUniform2i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1);
+   void (*GL_TH_FN(glProgramUniform3i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+   void (*GL_TH_FN(glProgramUniform4i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+   void (*GL_TH_FN(glProgramUniform1ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0);
+   void (*GL_TH_FN(glProgramUniform2ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1);
+   void (*GL_TH_FN(glProgramUniform3ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+   void (*GL_TH_FN(glProgramUniform4ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+   void (*GL_TH_FN(glProgramUniform1f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0);
+   void (*GL_TH_FN(glProgramUniform2f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1);
+   void (*GL_TH_FN(glProgramUniform3f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+   void (*GL_TH_FN(glProgramUniform4f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+   void (*GL_TH_FN(glProgramUniform1iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform2iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform3iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform4iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+   void (*GL_TH_FN(glProgramUniform1uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform2uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform3uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform4uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+   void (*GL_TH_FN(glProgramUniform1fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniform4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix2x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix3x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glProgramUniformMatrix4x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+   void (*GL_TH_FN(glValidateProgramPipeline))(GL_TH_DP, GLuint pipeline);
+   void (*GL_TH_FN(glGetProgramPipelineInfoLog))(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+   void (*GL_TH_FN(glBindImageTexture))(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+   void (*GL_TH_FN(glGetBooleani_v))(GL_TH_DP, GLenum target, GLuint index, GLboolean *data);
+   void (*GL_TH_FN(glMemoryBarrier))(GL_TH_DP, GLbitfield barriers);
+   void (*GL_TH_FN(glMemoryBarrierByRegion))(GL_TH_DP, GLbitfield barriers);
+   void (*GL_TH_FN(glTexStorage2DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+   void (*GL_TH_FN(glGetMultisamplefv))(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val);
+   void (*GL_TH_FN(glSampleMaski))(GL_TH_DP, GLuint maskNumber, GLbitfield mask);
+   void (*GL_TH_FN(glGetTexLevelParameteriv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexLevelParameterfv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params);
+   void (*GL_TH_FN(glBindVertexBuffer))(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+   void (*GL_TH_FN(glVertexAttribFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+   void (*GL_TH_FN(glVertexAttribIFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+   void (*GL_TH_FN(glVertexAttribBinding))(GL_TH_DP, GLuint attribindex, GLuint bindingindex);
+   void (*GL_TH_FN(glVertexBindingDivisor))(GL_TH_DP, GLuint bindingindex, GLuint divisor);
+   void (*GL_TH_FN(glBlendBarrier))(GL_TH_DP);
+   void (*GL_TH_FN(glCopyImageSubData))(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+   void (*GL_TH_FN(glDebugMessageControl))(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+   void (*GL_TH_FN(glDebugMessageInsert))(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+   void (*GL_TH_FN(glDebugMessageCallback))(GL_TH_DP, GLDEBUGPROC callback, const void *userParam);
+   GLuint (*GL_TH_FN(glGetDebugMessageLog))(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+   void (*GL_TH_FN(glPushDebugGroup))(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message);
+   void (*GL_TH_FN(glPopDebugGroup))(GL_TH_DP);
+   void (*GL_TH_FN(glObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+   void (*GL_TH_FN(glGetObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+   void (*GL_TH_FN(glObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label);
+   void (*GL_TH_FN(glGetObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+   void (*GL_TH_FN(glEnablei))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glDisablei))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glBlendEquationi))(GL_TH_DP, GLuint buf, GLenum mode);
+   void (*GL_TH_FN(glBlendEquationSeparatei))(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+   void (*GL_TH_FN(glBlendFunci))(GL_TH_DP, GLuint buf, GLenum src, GLenum dst);
+   void (*GL_TH_FN(glBlendFuncSeparatei))(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+   void (*GL_TH_FN(glColorMaski))(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+   GLboolean (*GL_TH_FN(glIsEnabledi))(GL_TH_DP, GLenum target, GLuint index);
+   void (*GL_TH_FN(glDrawElementsBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+   void (*GL_TH_FN(glDrawRangeElementsBaseVertex))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+   void (*GL_TH_FN(glDrawElementsInstancedBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+   void (*GL_TH_FN(glFramebufferTexture))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level);
+   void (*GL_TH_FN(glPrimitiveBoundingBox))(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+   GLenum (*GL_TH_FN(glGetGraphicsResetStatus))(GL_TH_DP);
+   void (*GL_TH_FN(glReadnPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+   void (*GL_TH_FN(glGetnUniformfv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+   void (*GL_TH_FN(glGetnUniformiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+   void (*GL_TH_FN(glGetnUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+   void (*GL_TH_FN(glMinSampleShading))(GL_TH_DP, GLfloat value);
+   void (*GL_TH_FN(glPatchParameteri))(GL_TH_DP, GLenum pname, GLint value);
+   void (*GL_TH_FN(glTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+   void (*GL_TH_FN(glTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params);
+   void (*GL_TH_FN(glGetTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param);
+   void (*GL_TH_FN(glSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param);
+   void (*GL_TH_FN(glGetSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params);
+   void (*GL_TH_FN(glGetSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params);
+   void (*GL_TH_FN(glTexBuffer))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer);
+   void (*GL_TH_FN(glTexBufferRange))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+   void (*GL_TH_FN(glTexStorage3DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+   void (*GL_TH_FN(glEGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, void *image);
+   void (*GL_TH_FN(glEGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, void *image);
+   EvasGLImage (*GL_TH_FN(evasglCreateImage))(GL_TH_DP, int target, void* buffer, const int *attrib_list);
+   void (*GL_TH_FN(evasglDestroyImage))(GL_TH_DP, EvasGLImage image);
+   EvasGLImage (*GL_TH_FN(evasglCreateImageForContext))(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
+   EvasGLSync (*GL_TH_FN(evasglCreateSync))(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
+   Eina_Bool (*GL_TH_FN(evasglDestroySync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync);
+   int (*GL_TH_FN(evasglClientWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
+   Eina_Bool (*GL_TH_FN(evasglGetSyncAttrib))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
+   Eina_Bool (*GL_TH_FN(evasglSignalSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
+   int (*GL_TH_FN(evasglWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags);
+   Eina_Bool (*GL_TH_FN(evasglBindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+   Eina_Bool (*GL_TH_FN(evasglUnbindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+   Eina_Bool (*GL_TH_FN(evasglQueryWaylandBuffer))(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value);
+} Evas_GL_Thread_GL_Generated_Func;
 
 
 void
-_gl_thread_link_gl_generated_init()
+_gl_thread_link_gl_generated_init(void *func_ptr)
 {
-#define LINK2GENERIC(sym) \
-   sym = dlsym(RTLD_DEFAULT, #sym); \
-   if (!sym) ERR("Could not find function '%s'", #sym);
-
-   LINK2GENERIC(glGetError_thread_cmd);
-   LINK2GENERIC(glVertexAttribPointer_thread_cmd);
-   LINK2GENERIC(glEnableVertexAttribArray_thread_cmd);
-   LINK2GENERIC(glDisableVertexAttribArray_thread_cmd);
-   LINK2GENERIC(glDrawArrays_thread_cmd);
-   LINK2GENERIC(glDrawElements_thread_cmd);
-   LINK2GENERIC(glGenBuffers_thread_cmd);
-   LINK2GENERIC(glDeleteBuffers_thread_cmd);
-   LINK2GENERIC(glBindBuffer_thread_cmd);
-   LINK2GENERIC(glBufferData_thread_cmd);
-   LINK2GENERIC(glMapBuffer_orig_evas_set);
-   LINK2GENERIC(glMapBuffer_orig_evas_get);
-   LINK2GENERIC(glMapBuffer_thread_cmd);
-   LINK2GENERIC(glUnmapBuffer_orig_evas_set);
-   LINK2GENERIC(glUnmapBuffer_orig_evas_get);
-   LINK2GENERIC(glUnmapBuffer_thread_cmd);
-   LINK2GENERIC(glCreateShader_thread_cmd);
-   LINK2GENERIC(glShaderSource_thread_cmd);
-   LINK2GENERIC(glCompileShader_thread_cmd);
-   LINK2GENERIC(glReleaseShaderCompiler_orig_evas_set);
-   LINK2GENERIC(glReleaseShaderCompiler_orig_evas_get);
-   LINK2GENERIC(glReleaseShaderCompiler_thread_cmd);
-   LINK2GENERIC(glDeleteShader_thread_cmd);
-   LINK2GENERIC(glCreateProgram_thread_cmd);
-   LINK2GENERIC(glAttachShader_thread_cmd);
-   LINK2GENERIC(glDetachShader_thread_cmd);
-   LINK2GENERIC(glLinkProgram_thread_cmd);
-   LINK2GENERIC(glUseProgram_thread_cmd);
-   LINK2GENERIC(glProgramParameteri_orig_evas_set);
-   LINK2GENERIC(glProgramParameteri_orig_evas_get);
-   LINK2GENERIC(glProgramParameteri_thread_cmd);
-   LINK2GENERIC(glDeleteProgram_thread_cmd);
-   LINK2GENERIC(glGetProgramBinary_orig_evas_set);
-   LINK2GENERIC(glGetProgramBinary_orig_evas_get);
-   LINK2GENERIC(glGetProgramBinary_thread_cmd);
-   LINK2GENERIC(glProgramBinary_orig_evas_set);
-   LINK2GENERIC(glProgramBinary_orig_evas_get);
-   LINK2GENERIC(glProgramBinary_thread_cmd);
-   LINK2GENERIC(glGetActiveAttrib_thread_cmd);
-   LINK2GENERIC(glGetAttribLocation_thread_cmd);
-   LINK2GENERIC(glBindAttribLocation_thread_cmd);
-   LINK2GENERIC(glGetUniformLocation_thread_cmd);
-   LINK2GENERIC(glUniform1f_thread_cmd);
-   LINK2GENERIC(glUniform1i_thread_cmd);
-   LINK2GENERIC(glUniform2f_thread_cmd);
-   LINK2GENERIC(glUniform2i_thread_cmd);
-   LINK2GENERIC(glUniform3f_thread_cmd);
-   LINK2GENERIC(glUniform3i_thread_cmd);
-   LINK2GENERIC(glUniform4f_thread_cmd);
-   LINK2GENERIC(glUniform4i_thread_cmd);
-   LINK2GENERIC(glUniform1fv_thread_cmd);
-   LINK2GENERIC(glUniform1iv_thread_cmd);
-   LINK2GENERIC(glUniform2fv_thread_cmd);
-   LINK2GENERIC(glUniform2iv_thread_cmd);
-   LINK2GENERIC(glUniform3fv_thread_cmd);
-   LINK2GENERIC(glUniform3iv_thread_cmd);
-   LINK2GENERIC(glUniform4fv_thread_cmd);
-   LINK2GENERIC(glUniform4iv_thread_cmd);
-   LINK2GENERIC(glUniformMatrix2fv_thread_cmd);
-   LINK2GENERIC(glUniformMatrix3fv_thread_cmd);
-   LINK2GENERIC(glUniformMatrix4fv_thread_cmd);
-   LINK2GENERIC(glViewport_thread_cmd);
-   LINK2GENERIC(glEnable_thread_cmd);
-   LINK2GENERIC(glDisable_thread_cmd);
-   LINK2GENERIC(glLineWidth_thread_cmd);
-   LINK2GENERIC(glPolygonOffset_thread_cmd);
-   LINK2GENERIC(glPixelStorei_thread_cmd);
-   LINK2GENERIC(glActiveTexture_thread_cmd);
-   LINK2GENERIC(glGenTextures_thread_cmd);
-   LINK2GENERIC(glBindTexture_thread_cmd);
-   LINK2GENERIC(glDeleteTextures_thread_cmd);
-   LINK2GENERIC(glTexImage2D_thread_cmd);
-   LINK2GENERIC(glTexSubImage2D_thread_cmd);
-   LINK2GENERIC(glCompressedTexImage2D_thread_cmd);
-   LINK2GENERIC(glCompressedTexSubImage2D_thread_cmd);
-   LINK2GENERIC(glTexParameterf_thread_cmd);
-   LINK2GENERIC(glTexParameterfv_thread_cmd);
-   LINK2GENERIC(glTexParameteri_thread_cmd);
-   LINK2GENERIC(glTexParameteriv_thread_cmd);
-   LINK2GENERIC(glScissor_thread_cmd);
-   LINK2GENERIC(glBlendFunc_thread_cmd);
-   LINK2GENERIC(glBlendColor_thread_cmd);
-   LINK2GENERIC(glDepthMask_thread_cmd);
-   LINK2GENERIC(glClear_thread_cmd);
-   LINK2GENERIC(glClearColor_thread_cmd);
-   LINK2GENERIC(glReadPixels_thread_cmd);
-   LINK2GENERIC(glGenFramebuffers_orig_evas_set);
-   LINK2GENERIC(glGenFramebuffers_orig_evas_get);
-   LINK2GENERIC(glGenFramebuffers_thread_cmd);
-   LINK2GENERIC(glBindFramebuffer_orig_evas_set);
-   LINK2GENERIC(glBindFramebuffer_orig_evas_get);
-   LINK2GENERIC(glBindFramebuffer_thread_cmd);
-   LINK2GENERIC(glDeleteFramebuffers_orig_evas_set);
-   LINK2GENERIC(glDeleteFramebuffers_orig_evas_get);
-   LINK2GENERIC(glDeleteFramebuffers_thread_cmd);
-   LINK2GENERIC(glGenRenderbuffers_thread_cmd);
-   LINK2GENERIC(glBindRenderbuffer_thread_cmd);
-   LINK2GENERIC(glDeleteRenderbuffers_thread_cmd);
-   LINK2GENERIC(glRenderbufferStorage_thread_cmd);
-   LINK2GENERIC(glFramebufferRenderbuffer_thread_cmd);
-   LINK2GENERIC(glFramebufferTexture2D_orig_evas_set);
-   LINK2GENERIC(glFramebufferTexture2D_orig_evas_get);
-   LINK2GENERIC(glFramebufferTexture2D_thread_cmd);
-   LINK2GENERIC(glFramebufferTexture2DMultisample_orig_evas_set);
-   LINK2GENERIC(glFramebufferTexture2DMultisample_orig_evas_get);
-   LINK2GENERIC(glFramebufferTexture2DMultisample_thread_cmd);
-   LINK2GENERIC(glCheckFramebufferStatus_thread_cmd);
-   LINK2GENERIC(glFlush_thread_cmd);
-   LINK2GENERIC(glFinish_thread_cmd);
-   LINK2GENERIC(glHint_thread_cmd);
-   LINK2GENERIC(glGetString_thread_cmd);
-   LINK2GENERIC(glGetBooleanv_thread_cmd);
-   LINK2GENERIC(glGetFloatv_thread_cmd);
-   LINK2GENERIC(glGetIntegerv_thread_cmd);
-   LINK2GENERIC(glIsBuffer_thread_cmd);
-   LINK2GENERIC(glGetBufferParameteriv_thread_cmd);
-   LINK2GENERIC(glIsShader_thread_cmd);
-   LINK2GENERIC(glGetShaderiv_thread_cmd);
-   LINK2GENERIC(glGetAttachedShaders_thread_cmd);
-   LINK2GENERIC(glGetShaderInfoLog_thread_cmd);
-   LINK2GENERIC(glGetShaderSource_thread_cmd);
-   LINK2GENERIC(glGetShaderPrecisionFormat_thread_cmd);
-   LINK2GENERIC(glGetVertexAttribfv_thread_cmd);
-   LINK2GENERIC(glGetVertexAttribiv_thread_cmd);
-   LINK2GENERIC(glIsProgram_thread_cmd);
-   LINK2GENERIC(glGetProgramInfoLog_thread_cmd);
-   LINK2GENERIC(glGetProgramiv_thread_cmd);
-   LINK2GENERIC(glIsFramebuffer_thread_cmd);
-   LINK2GENERIC(glGetFramebufferParameteriv_orig_evas_set);
-   LINK2GENERIC(glGetFramebufferParameteriv_orig_evas_get);
-   LINK2GENERIC(glGetFramebufferParameteriv_thread_cmd);
-   LINK2GENERIC(glIsRenderbuffer_thread_cmd);
-   LINK2GENERIC(glGetRenderbufferParameteriv_thread_cmd);
-   LINK2GENERIC(glIsTexture_thread_cmd);
-   LINK2GENERIC(glStartTiling_orig_evas_set);
-   LINK2GENERIC(glStartTiling_orig_evas_get);
-   LINK2GENERIC(glStartTiling_thread_cmd);
-   LINK2GENERIC(glEndTiling_orig_evas_set);
-   LINK2GENERIC(glEndTiling_orig_evas_get);
-   LINK2GENERIC(glEndTiling_thread_cmd);
-   LINK2GENERIC(glActivateTile_orig_evas_set);
-   LINK2GENERIC(glActivateTile_orig_evas_get);
-   LINK2GENERIC(glActivateTile_thread_cmd);
-   LINK2GENERIC(glEGLImageTargetTexture2DOES_orig_evas_set);
-   LINK2GENERIC(glEGLImageTargetTexture2DOES_orig_evas_get);
-   LINK2GENERIC(glEGLImageTargetTexture2DOES_thread_cmd);
-
-#ifndef GL_GLES
-   LINK2GENERIC(glAlphaFunc_thread_cmd);
-#endif
+   const Evas_GL_Thread_GL_Generated_Func *th_gl_gen_func = func_ptr;
 
+   if (!th_gl_gen_func)
+     {
+        ERR("Thread functions (GL-Generated BASE) are not exist");
+        return;
+     }
 
-#ifndef GL_GLES
-   LINK2GENERIC(glGetTexLevelParameteriv_thread_cmd);
-#endif
+#define THREAD_FUNCTION_ASSIGN(func) func = th_gl_gen_func->func;
 
 
-#ifndef GL_GLES
-   LINK2GENERIC(glRenderbufferStorageMultisample_orig_evas_set);
-   LINK2GENERIC(glRenderbufferStorageMultisample_orig_evas_get);
-   LINK2GENERIC(glRenderbufferStorageMultisample_thread_cmd);
-#endif
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActiveTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAttachShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindAttribLocation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindFramebuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindRenderbuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendColor));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparate));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFunc));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparate));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBufferData));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBufferSubData));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCheckFramebufferStatus));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClear));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColor));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearStencil));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorMask));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompileShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCullFace));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteBuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFramebuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteRenderbuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteTextures));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthFunc));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthMask));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDetachShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisable));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableVertexAttribArray));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArrays));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElements));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnable));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableVertexAttribArray));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFinish));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlush));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferRenderbuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrontFace));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenBuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenerateMipmap));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFramebuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenRenderbuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenTextures));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveAttrib));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniform));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetAttachedShaders));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetAttribLocation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBooleanv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetError));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFloatv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferAttachmentParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetIntegerv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramInfoLog));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetRenderbufferParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderInfoLog));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderPrecisionFormat));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetShaderSource));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetString));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformLocation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribPointerv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glHint));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsEnabled));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFramebuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsRenderbuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsShader));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidth));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLinkProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPixelStorei));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffset));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadPixels));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReleaseShaderCompiler));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorage));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoverage));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScissor));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShaderBinary));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShaderSource));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilFunc));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilFuncSeparate));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilMask));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilMaskSeparate));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilOp));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStencilOpSeparate));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameteri));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUseProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glValidateProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib1f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib1fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib2f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib3f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib4f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttrib4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glViewport));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEvasGLImageTargetTexture2DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramBinaryOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramBinaryOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUnmapBufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferPointervOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture3DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorGroupsAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCountersAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorGroupStringAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterStringAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterInfoAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenPerfMonitorsAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeletePerfMonitorsAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSelectPerfMonitorCountersAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginPerfMonitorAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndPerfMonitorAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPerfMonitorCounterDataAMD));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDiscardFramebufferEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiDrawArraysEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiDrawElementsEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFencesNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFencesNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFenceNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTestFenceNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFenceivNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFinishFenceNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSetFenceNV));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDriverControlsQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDriverControlStringQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableDriverControlQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableDriverControlQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexturesQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetBuffersQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetRenderbuffersQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetFramebuffersQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexLevelParameterivQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtTexObjectStateOverrideiQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetTexSubImageQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetBufferPointervQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetShadersQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetProgramsQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtIsProgramBinaryQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glExtGetProgramBinarySourceQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFunc));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthof));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSize));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizePointerOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatef));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFuncx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColorx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientActiveTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4ub));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4x));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisableClientState));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnableClientState));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFixedv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetPointerv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnviv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidthx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadIdentity));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLogicOp));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMatrixMode));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4x));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3x));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormalPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthox));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffsetx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPopMatrix));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPushMatrix));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoveragex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glShadeModel));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexCoordPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvi));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnviv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterx));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparateOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparateOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexsOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexiOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexsvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexivOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexfOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawTexfvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glAlphaFuncxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearColorxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColor4xOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFogxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFixedvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetLightxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMaterialxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexEnvxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightModelxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLightxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLineWidthxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadMatrixxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMaterialxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultMatrixxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMultiTexCoord4xOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glNormal3xOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthoxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointParameterxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPointSizexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPolygonOffsetxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRotatexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleCoveragexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glScalexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexEnvxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTranslatexOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsRenderbufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindRenderbufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteRenderbuffersOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenRenderbuffersOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetRenderbufferParameterivOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsFramebufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindFramebufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteFramebuffersOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenFramebuffersOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCheckFramebufferStatusOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferRenderbufferOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferAttachmentParameterivOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenerateMipmapOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCurrentPaletteMatrixOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glLoadPaletteFromModelViewMatrixOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMatrixIndexPointerOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWeightPointerOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glQueryMatrixxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDepthRangefOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFrustumfOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glOrthofOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanefOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetClipPlanefOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearDepthfOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenfOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenfvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGeniOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenivOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenxOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexGenxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenfvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenivOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexGenxvOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexArrayOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteVertexArraysOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenVertexArraysOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsVertexArrayOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTextureLevelsAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glResolveMultisampleFramebufferAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFenceSyncAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSyncAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSyncAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientWaitSyncAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWaitSyncAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64vAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSyncivAPPLE));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferRangeEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlushMappedBufferRangeEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisampleEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetGraphicsResetStatusEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadnPixelsEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformfvEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformivEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage1DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage1DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage2DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTextureStorage3DEXT));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanefIMG));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClipPlanexIMG));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisampleIMG));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisampleIMG));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActivateTile));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glStartTilingQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndTilingQCOM));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture2DMultisample));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginQuery));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBeginTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBufferBase));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindBufferRange));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindSampler));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexArray));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlitFramebuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferfi));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClearBufferuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glClientWaitSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexImage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCompressedTexSubImage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyBufferSubData));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyTexSubImage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteQueries));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSamplers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteTransformFeedbacks));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteVertexArrays));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArraysInstanced));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawBuffers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsInstanced));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawRangeElements));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndQuery));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEndTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFenceSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFlushMappedBufferRange));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTextureLayer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenQueries));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenSamplers));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenTransformFeedbacks));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenVertexArrays));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformBlockiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformBlockName));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetActiveUniformsiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferParameteri64v));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBufferPointerv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFragDataLocation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64i_v));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInteger64v));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetIntegeri_v));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetInternalformativ));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramBinary));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetQueryiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetQueryObjectuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetStringi));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSynciv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTransformFeedbackVarying));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformBlockIndex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformIndices));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetUniformuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribIiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetVertexAttribIuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glInvalidateFramebuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glInvalidateSubFramebuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsQuery));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSampler));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsVertexArray));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMapBufferRange));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPauseTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramBinary));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramParameteri));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glRenderbufferStorageMultisample));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glResumeTransformFeedback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterf));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameteri));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexImage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexSubImage3D));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTransformFeedbackVaryings));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform1uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform2uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform3uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniform4uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformBlockBinding));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2x3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3x2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix2x4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4x2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix3x4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUniformMatrix4x3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUnmapBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribDivisor));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribI4uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribIPointer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glWaitSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDispatchCompute));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDispatchComputeIndirect));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawArraysIndirect));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsIndirect));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferParameteri));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetFramebufferParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramInterfaceiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceIndex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceName));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramResourceLocation));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glUseProgramStages));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glActiveShaderProgram));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCreateShaderProgramv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindProgramPipeline));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDeleteProgramPipelines));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGenProgramPipelines));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsProgramPipeline));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramPipelineiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4i));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4ui));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4f));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4iv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4uiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform1fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniform4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2x3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3x2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix2x4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4x2fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix3x4fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glProgramUniformMatrix4x3fv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glValidateProgramPipeline));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetProgramPipelineInfoLog));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindImageTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetBooleani_v));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMemoryBarrier));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMemoryBarrierByRegion));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage2DMultisample));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetMultisamplefv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSampleMaski));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexLevelParameteriv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexLevelParameterfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBindVertexBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribFormat));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribIFormat));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexAttribBinding));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glVertexBindingDivisor));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendBarrier));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glCopyImageSubData));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageControl));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageInsert));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDebugMessageCallback));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetDebugMessageLog));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPushDebugGroup));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPopDebugGroup));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glObjectLabel));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetObjectLabel));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glObjectPtrLabel));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetObjectPtrLabel));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEnablei));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDisablei));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationi));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendEquationSeparatei));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFunci));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glBlendFuncSeparatei));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glColorMaski));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glIsEnabledi));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsBaseVertex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawRangeElementsBaseVertex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glDrawElementsInstancedBaseVertex));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glFramebufferTexture));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPrimitiveBoundingBox));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetGraphicsResetStatus));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glReadnPixels));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformfv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetnUniformuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glMinSampleShading));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glPatchParameteri));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterIiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexParameterIuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterIiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetTexParameterIuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterIiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glSamplerParameterIuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterIiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glGetSamplerParameterIuiv));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexBuffer));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexBufferRange));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glTexStorage3DMultisample));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEGLImageTargetTexture2DOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(glEGLImageTargetRenderbufferStorageOES));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateImage));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglDestroyImage));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateImageForContext));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglCreateSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglDestroySync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglClientWaitSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglGetSyncAttrib));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglSignalSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglWaitSync));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglBindWaylandDisplay));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglUnbindWaylandDisplay));
+   THREAD_FUNCTION_ASSIGN(GL_TH_FN(evasglQueryWaylandBuffer));
+#undef THREAD_FUNCTION_ASSIGN
 
-   LINK2GENERIC(glGetStringi_orig_evas_set);
-   LINK2GENERIC(glGetStringi_orig_evas_get);
-   LINK2GENERIC(glGetStringi_thread_cmd);
 }
index 48b3e63..b648873 100644 (file)
 /*
+ * ------------------------------------------------------------------------------
  * This is an automatically generated file using a python script.
  * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
  * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
  * and make use of scripts if you need to fix them.
+ * ------------------------------------------------------------------------------
  */
-extern GLenum (*glGetError_thread_cmd)(void);
-extern void (*glVertexAttribPointer_thread_cmd)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-extern void (*glEnableVertexAttribArray_thread_cmd)(GLuint index);
-extern void (*glDisableVertexAttribArray_thread_cmd)(GLuint index);
-extern void (*glDrawArrays_thread_cmd)(GLenum mode, GLint first, GLsizei count);
-extern void (*glDrawElements_thread_cmd)(GLenum mode, GLsizei count, GLenum type, const void *indices);
-extern void (*glGenBuffers_thread_cmd)(GLsizei n, GLuint *buffers);
-extern void (*glDeleteBuffers_thread_cmd)(GLsizei n, const GLuint *buffers);
-extern void (*glBindBuffer_thread_cmd)(GLenum target, GLuint buffer);
-extern void (*glBufferData_thread_cmd)(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-extern void (*glMapBuffer_orig_evas_set)(void *func);
-extern void *(*glMapBuffer_orig_evas_get)(void);
-extern void * (*glMapBuffer_thread_cmd)(GLenum target, GLenum access);
-extern void (*glUnmapBuffer_orig_evas_set)(void *func);
-extern void *(*glUnmapBuffer_orig_evas_get)(void);
-extern GLboolean (*glUnmapBuffer_thread_cmd)(GLenum target);
-extern GLuint (*glCreateShader_thread_cmd)(GLenum type);
-extern void (*glShaderSource_thread_cmd)(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
-extern void (*glCompileShader_thread_cmd)(GLuint shader);
-extern void (*glReleaseShaderCompiler_orig_evas_set)(void *func);
-extern void *(*glReleaseShaderCompiler_orig_evas_get)(void);
-extern void (*glReleaseShaderCompiler_thread_cmd)(void);
-extern void (*glDeleteShader_thread_cmd)(GLuint shader);
-extern GLuint (*glCreateProgram_thread_cmd)(void);
-extern void (*glAttachShader_thread_cmd)(GLuint program, GLuint shader);
-extern void (*glDetachShader_thread_cmd)(GLuint program, GLuint shader);
-extern void (*glLinkProgram_thread_cmd)(GLuint program);
-extern void (*glUseProgram_thread_cmd)(GLuint program);
-extern void (*glProgramParameteri_orig_evas_set)(void *func);
-extern void *(*glProgramParameteri_orig_evas_get)(void);
-extern void (*glProgramParameteri_thread_cmd)(GLuint program, GLenum pname, GLint value);
-extern void (*glDeleteProgram_thread_cmd)(GLuint program);
-extern void (*glGetProgramBinary_orig_evas_set)(void *func);
-extern void *(*glGetProgramBinary_orig_evas_get)(void);
-extern void (*glGetProgramBinary_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
-extern void (*glProgramBinary_orig_evas_set)(void *func);
-extern void *(*glProgramBinary_orig_evas_get)(void);
-extern void (*glProgramBinary_thread_cmd)(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
-extern void (*glGetActiveAttrib_thread_cmd)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-extern GLint (*glGetAttribLocation_thread_cmd)(GLuint program, const GLchar *name);
-extern void (*glBindAttribLocation_thread_cmd)(GLuint program, GLuint index, const GLchar *name);
-extern GLint (*glGetUniformLocation_thread_cmd)(GLuint program, const GLchar *name);
-extern void (*glUniform1f_thread_cmd)(GLint location, GLfloat v0);
-extern void (*glUniform1i_thread_cmd)(GLint location, GLint v0);
-extern void (*glUniform2f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1);
-extern void (*glUniform2i_thread_cmd)(GLint location, GLint v0, GLint v1);
-extern void (*glUniform3f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-extern void (*glUniform3i_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2);
-extern void (*glUniform4f_thread_cmd)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern void (*glUniform4i_thread_cmd)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-extern void (*glUniform1fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform1iv_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform2fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform2iv_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform3fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform3iv_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniform4fv_thread_cmd)(GLint location, GLsizei count, const GLfloat *value);
-extern void (*glUniform4iv_thread_cmd)(GLint location, GLsizei count, const GLint *value);
-extern void (*glUniformMatrix2fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glUniformMatrix3fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glUniformMatrix4fv_thread_cmd)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-extern void (*glViewport_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height);
-extern void (*glEnable_thread_cmd)(GLenum cap);
-extern void (*glDisable_thread_cmd)(GLenum cap);
-extern void (*glLineWidth_thread_cmd)(GLfloat width);
-extern void (*glPolygonOffset_thread_cmd)(GLfloat factor, GLfloat units);
-extern void (*glPixelStorei_thread_cmd)(GLenum pname, GLint param);
-extern void (*glActiveTexture_thread_cmd)(GLenum texture);
-extern void (*glGenTextures_thread_cmd)(GLsizei n, GLuint *textures);
-extern void (*glBindTexture_thread_cmd)(GLenum target, GLuint texture);
-extern void (*glDeleteTextures_thread_cmd)(GLsizei n, const GLuint *textures);
-extern void (*glTexImage2D_thread_cmd)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-extern void (*glTexSubImage2D_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
-extern void (*glCompressedTexImage2D_thread_cmd)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
-extern void (*glCompressedTexSubImage2D_thread_cmd)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
-extern void (*glTexParameterf_thread_cmd)(GLenum target, GLenum pname, GLfloat param);
-extern void (*glTexParameterfv_thread_cmd)(GLenum target, GLenum pname, const GLfloat *params);
-extern void (*glTexParameteri_thread_cmd)(GLenum target, GLenum pname, GLint param);
-extern void (*glTexParameteriv_thread_cmd)(GLenum target, GLenum pname, const GLint *params);
-extern void (*glScissor_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height);
-extern void (*glBlendFunc_thread_cmd)(GLenum sfactor, GLenum dfactor);
-extern void (*glBlendColor_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-extern void (*glDepthMask_thread_cmd)(GLboolean flag);
-extern void (*glClear_thread_cmd)(GLbitfield mask);
-extern void (*glClearColor_thread_cmd)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-extern void (*glReadPixels_thread_cmd)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-extern void (*glGenFramebuffers_orig_evas_set)(void *func);
-extern void *(*glGenFramebuffers_orig_evas_get)(void);
-extern void (*glGenFramebuffers_thread_cmd)(GLsizei n, GLuint *framebuffers);
-extern void (*glBindFramebuffer_orig_evas_set)(void *func);
-extern void *(*glBindFramebuffer_orig_evas_get)(void);
-extern void (*glBindFramebuffer_thread_cmd)(GLenum target, GLuint framebuffer);
-extern void (*glDeleteFramebuffers_orig_evas_set)(void *func);
-extern void *(*glDeleteFramebuffers_orig_evas_get)(void);
-extern void (*glDeleteFramebuffers_thread_cmd)(GLsizei n, const GLuint *framebuffers);
-extern void (*glGenRenderbuffers_thread_cmd)(GLsizei n, GLuint *renderbuffers);
-extern void (*glBindRenderbuffer_thread_cmd)(GLenum target, GLuint renderbuffer);
-extern void (*glDeleteRenderbuffers_thread_cmd)(GLsizei n, const GLuint *renderbuffers);
-extern void (*glRenderbufferStorage_thread_cmd)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-extern void (*glFramebufferRenderbuffer_thread_cmd)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-extern void (*glFramebufferTexture2D_orig_evas_set)(void *func);
-extern void *(*glFramebufferTexture2D_orig_evas_get)(void);
-extern void (*glFramebufferTexture2D_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-extern void (*glFramebufferTexture2DMultisample_orig_evas_set)(void *func);
-extern void *(*glFramebufferTexture2DMultisample_orig_evas_get)(void);
-extern void (*glFramebufferTexture2DMultisample_thread_cmd)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
-extern GLenum (*glCheckFramebufferStatus_thread_cmd)(GLenum target);
-extern void (*glFlush_thread_cmd)(void);
-extern void (*glFinish_thread_cmd)(void);
-extern void (*glHint_thread_cmd)(GLenum target, GLenum mode);
-extern const GLubyte * (*glGetString_thread_cmd)(GLenum name);
-extern void (*glGetBooleanv_thread_cmd)(GLenum pname, GLboolean *data);
-extern void (*glGetFloatv_thread_cmd)(GLenum pname, GLfloat *data);
-extern void (*glGetIntegerv_thread_cmd)(GLenum pname, GLint *data);
-extern GLboolean (*glIsBuffer_thread_cmd)(GLint buffer);
-extern void (*glGetBufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (*glIsShader_thread_cmd)(GLuint shader);
-extern void (*glGetShaderiv_thread_cmd)(GLuint shader, GLenum pname, GLint *params);
-extern void (*glGetAttachedShaders_thread_cmd)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
-extern void (*glGetShaderInfoLog_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-extern void (*glGetShaderSource_thread_cmd)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-extern void (*glGetShaderPrecisionFormat_thread_cmd)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
-extern void (*glGetVertexAttribfv_thread_cmd)(GLuint index, GLenum pname, GLfloat *params);
-extern void (*glGetVertexAttribiv_thread_cmd)(GLuint index, GLenum pname, GLint *params);
-extern GLboolean (*glIsProgram_thread_cmd)(GLuint program);
-extern void (*glGetProgramInfoLog_thread_cmd)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-extern void (*glGetProgramiv_thread_cmd)(GLuint program, GLenum pname, GLint *params);
-extern GLboolean (*glIsFramebuffer_thread_cmd)(GLint framebuffer);
-extern void (*glGetFramebufferParameteriv_orig_evas_set)(void *func);
-extern void *(*glGetFramebufferParameteriv_orig_evas_get)(void);
-extern void (*glGetFramebufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (*glIsRenderbuffer_thread_cmd)(GLint renderbuffer);
-extern void (*glGetRenderbufferParameteriv_thread_cmd)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (*glIsTexture_thread_cmd)(GLint texture);
-extern void (*glStartTiling_orig_evas_set)(void *func);
-extern void *(*glStartTiling_orig_evas_get)(void);
-extern void (*glStartTiling_thread_cmd)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
-extern void (*glEndTiling_orig_evas_set)(void *func);
-extern void *(*glEndTiling_orig_evas_get)(void);
-extern void (*glEndTiling_thread_cmd)(GLuint a);
-extern void (*glActivateTile_orig_evas_set)(void *func);
-extern void *(*glActivateTile_orig_evas_get)(void);
-extern void (*glActivateTile_thread_cmd)(GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
-extern void (*glEGLImageTargetTexture2DOES_orig_evas_set)(void *func);
-extern void *(*glEGLImageTargetTexture2DOES_orig_evas_get)(void);
-extern void (*glEGLImageTargetTexture2DOES_thread_cmd)(GLenum target, void *image);
 
-#ifndef GL_GLES
-extern void (*glAlphaFunc_thread_cmd)(GLenum func, GLclampf ref);
-#endif
+extern void (*GL_TH_FN(glActiveTexture))(GL_TH_DP, GLenum texture);
+extern void (*GL_TH_FN(glAttachShader))(GL_TH_DP, GLuint program, GLuint shader);
+extern void (*GL_TH_FN(glBindAttribLocation))(GL_TH_DP, GLuint program, GLuint index, const char* name);
+extern void (*GL_TH_FN(glBindBuffer))(GL_TH_DP, GLenum target, GLuint buffer);
+extern void (*GL_TH_FN(glBindFramebuffer))(GL_TH_DP, GLenum target, GLuint framebuffer);
+extern void (*GL_TH_FN(glBindRenderbuffer))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+extern void (*GL_TH_FN(glBindTexture))(GL_TH_DP, GLenum target, GLuint texture);
+extern void (*GL_TH_FN(glBlendColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+extern void (*GL_TH_FN(glBlendEquation))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glBlendEquationSeparate))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+extern void (*GL_TH_FN(glBlendFunc))(GL_TH_DP, GLenum sfactor, GLenum dfactor);
+extern void (*GL_TH_FN(glBlendFuncSeparate))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void (*GL_TH_FN(glBufferData))(GL_TH_DP, GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+extern void (*GL_TH_FN(glBufferSubData))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+extern GLenum (*GL_TH_FN(glCheckFramebufferStatus))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glClear))(GL_TH_DP, GLbitfield mask);
+extern void (*GL_TH_FN(glClearColor))(GL_TH_DP, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+extern void (*GL_TH_FN(glClearDepthf))(GL_TH_DP, GLclampf depth);
+extern void (*GL_TH_FN(glClearStencil))(GL_TH_DP, GLint s);
+extern void (*GL_TH_FN(glColorMask))(GL_TH_DP, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+extern void (*GL_TH_FN(glCompileShader))(GL_TH_DP, GLuint shader);
+extern void (*GL_TH_FN(glCompressedTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+extern void (*GL_TH_FN(glCompressedTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+extern void (*GL_TH_FN(glCopyTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+extern void (*GL_TH_FN(glCopyTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GLuint (*GL_TH_FN(glCreateProgram))(GL_TH_DP);
+extern GLuint (*GL_TH_FN(glCreateShader))(GL_TH_DP, GLenum type);
+extern void (*GL_TH_FN(glCullFace))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glDeleteBuffers))(GL_TH_DP, GLsizei n, const GLuint* buffers);
+extern void (*GL_TH_FN(glDeleteFramebuffers))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+extern void (*GL_TH_FN(glDeleteProgram))(GL_TH_DP, GLuint program);
+extern void (*GL_TH_FN(glDeleteRenderbuffers))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+extern void (*GL_TH_FN(glDeleteShader))(GL_TH_DP, GLuint shader);
+extern void (*GL_TH_FN(glDeleteTextures))(GL_TH_DP, GLsizei n, const GLuint* textures);
+extern void (*GL_TH_FN(glDepthFunc))(GL_TH_DP, GLenum func);
+extern void (*GL_TH_FN(glDepthMask))(GL_TH_DP, GLboolean flag);
+extern void (*GL_TH_FN(glDepthRangef))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+extern void (*GL_TH_FN(glDetachShader))(GL_TH_DP, GLuint program, GLuint shader);
+extern void (*GL_TH_FN(glDisable))(GL_TH_DP, GLenum cap);
+extern void (*GL_TH_FN(glDisableVertexAttribArray))(GL_TH_DP, GLuint index);
+extern void (*GL_TH_FN(glDrawArrays))(GL_TH_DP, GLenum mode, GLint first, GLsizei count);
+extern void (*GL_TH_FN(glDrawElements))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void* indices);
+extern void (*GL_TH_FN(glEnable))(GL_TH_DP, GLenum cap);
+extern void (*GL_TH_FN(glEnableVertexAttribArray))(GL_TH_DP, GLuint index);
+extern void (*GL_TH_FN(glFinish))(GL_TH_DP);
+extern void (*GL_TH_FN(glFlush))(GL_TH_DP);
+extern void (*GL_TH_FN(glFramebufferRenderbuffer))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+extern void (*GL_TH_FN(glFramebufferTexture2D))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+extern void (*GL_TH_FN(glFrontFace))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glGenBuffers))(GL_TH_DP, GLsizei n, GLuint* buffers);
+extern void (*GL_TH_FN(glGenerateMipmap))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glGenFramebuffers))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+extern void (*GL_TH_FN(glGenRenderbuffers))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+extern void (*GL_TH_FN(glGenTextures))(GL_TH_DP, GLsizei n, GLuint* textures);
+extern void (*GL_TH_FN(glGetActiveAttrib))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+extern void (*GL_TH_FN(glGetActiveUniform))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+extern void (*GL_TH_FN(glGetAttachedShaders))(GL_TH_DP, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+extern int (*GL_TH_FN(glGetAttribLocation))(GL_TH_DP, GLuint program, const char* name);
+extern void (*GL_TH_FN(glGetBooleanv))(GL_TH_DP, GLenum pname, GLboolean* params);
+extern void (*GL_TH_FN(glGetBufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern GLenum (*GL_TH_FN(glGetError))(GL_TH_DP);
+extern void (*GL_TH_FN(glGetFloatv))(GL_TH_DP, GLenum pname, GLfloat* params);
+extern void (*GL_TH_FN(glGetFramebufferAttachmentParameteriv))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetIntegerv))(GL_TH_DP, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetProgramiv))(GL_TH_DP, GLuint program, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetProgramInfoLog))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+extern void (*GL_TH_FN(glGetRenderbufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetShaderiv))(GL_TH_DP, GLuint shader, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetShaderInfoLog))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+extern void (*GL_TH_FN(glGetShaderPrecisionFormat))(GL_TH_DP, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+extern void (*GL_TH_FN(glGetShaderSource))(GL_TH_DP, GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+extern const GLubyte* (*GL_TH_FN(glGetString))(GL_TH_DP, GLenum name);
+extern void (*GL_TH_FN(glGetTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, GLfloat* params);
+extern void (*GL_TH_FN(glGetTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetUniformfv))(GL_TH_DP, GLuint program, GLint location, GLfloat* params);
+extern void (*GL_TH_FN(glGetUniformiv))(GL_TH_DP, GLuint program, GLint location, GLint* params);
+extern int (*GL_TH_FN(glGetUniformLocation))(GL_TH_DP, GLuint program, const char* name);
+extern void (*GL_TH_FN(glGetVertexAttribfv))(GL_TH_DP, GLuint index, GLenum pname, GLfloat* params);
+extern void (*GL_TH_FN(glGetVertexAttribiv))(GL_TH_DP, GLuint index, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGetVertexAttribPointerv))(GL_TH_DP, GLuint index, GLenum pname, void** pointer);
+extern void (*GL_TH_FN(glHint))(GL_TH_DP, GLenum target, GLenum mode);
+extern GLboolean (*GL_TH_FN(glIsBuffer))(GL_TH_DP, GLuint buffer);
+extern GLboolean (*GL_TH_FN(glIsEnabled))(GL_TH_DP, GLenum cap);
+extern GLboolean (*GL_TH_FN(glIsFramebuffer))(GL_TH_DP, GLuint framebuffer);
+extern GLboolean (*GL_TH_FN(glIsProgram))(GL_TH_DP, GLuint program);
+extern GLboolean (*GL_TH_FN(glIsRenderbuffer))(GL_TH_DP, GLuint renderbuffer);
+extern GLboolean (*GL_TH_FN(glIsShader))(GL_TH_DP, GLuint shader);
+extern GLboolean (*GL_TH_FN(glIsTexture))(GL_TH_DP, GLuint texture);
+extern void (*GL_TH_FN(glLineWidth))(GL_TH_DP, GLfloat width);
+extern void (*GL_TH_FN(glLinkProgram))(GL_TH_DP, GLuint program);
+extern void (*GL_TH_FN(glPixelStorei))(GL_TH_DP, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glPolygonOffset))(GL_TH_DP, GLfloat factor, GLfloat units);
+extern void (*GL_TH_FN(glReadPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
+extern void (*GL_TH_FN(glReleaseShaderCompiler))(GL_TH_DP);
+extern void (*GL_TH_FN(glRenderbufferStorage))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glSampleCoverage))(GL_TH_DP, GLclampf value, GLboolean invert);
+extern void (*GL_TH_FN(glScissor))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glShaderBinary))(GL_TH_DP, GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+extern void (*GL_TH_FN(glShaderSource))(GL_TH_DP, GLuint shader, GLsizei count, const char* const * string, const GLint* length);
+extern void (*GL_TH_FN(glStencilFunc))(GL_TH_DP, GLenum func, GLint ref, GLuint mask);
+extern void (*GL_TH_FN(glStencilFuncSeparate))(GL_TH_DP, GLenum face, GLenum func, GLint ref, GLuint mask);
+extern void (*GL_TH_FN(glStencilMask))(GL_TH_DP, GLuint mask);
+extern void (*GL_TH_FN(glStencilMaskSeparate))(GL_TH_DP, GLenum face, GLuint mask);
+extern void (*GL_TH_FN(glStencilOp))(GL_TH_DP, GLenum fail, GLenum zfail, GLenum zpass);
+extern void (*GL_TH_FN(glStencilOpSeparate))(GL_TH_DP, GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+extern void (*GL_TH_FN(glTexImage2D))(GL_TH_DP, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
+extern void (*GL_TH_FN(glTexParameterf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glTexParameterfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat* params);
+extern void (*GL_TH_FN(glTexParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glTexParameteriv))(GL_TH_DP, GLenum target, GLenum pname, const GLint* params);
+extern void (*GL_TH_FN(glTexSubImage2D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+extern void (*GL_TH_FN(glUniform1f))(GL_TH_DP, GLint location, GLfloat x);
+extern void (*GL_TH_FN(glUniform1fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void (*GL_TH_FN(glUniform1i))(GL_TH_DP, GLint location, GLint x);
+extern void (*GL_TH_FN(glUniform1iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void (*GL_TH_FN(glUniform2f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y);
+extern void (*GL_TH_FN(glUniform2fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void (*GL_TH_FN(glUniform2i))(GL_TH_DP, GLint location, GLint x, GLint y);
+extern void (*GL_TH_FN(glUniform2iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void (*GL_TH_FN(glUniform3f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z);
+extern void (*GL_TH_FN(glUniform3fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void (*GL_TH_FN(glUniform3i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z);
+extern void (*GL_TH_FN(glUniform3iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void (*GL_TH_FN(glUniform4f))(GL_TH_DP, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+extern void (*GL_TH_FN(glUniform4fv))(GL_TH_DP, GLint location, GLsizei count, const GLfloat* v);
+extern void (*GL_TH_FN(glUniform4i))(GL_TH_DP, GLint location, GLint x, GLint y, GLint z, GLint w);
+extern void (*GL_TH_FN(glUniform4iv))(GL_TH_DP, GLint location, GLsizei count, const GLint* v);
+extern void (*GL_TH_FN(glUniformMatrix2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void (*GL_TH_FN(glUniformMatrix3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void (*GL_TH_FN(glUniformMatrix4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern void (*GL_TH_FN(glUseProgram))(GL_TH_DP, GLuint program);
+extern void (*GL_TH_FN(glValidateProgram))(GL_TH_DP, GLuint program);
+extern void (*GL_TH_FN(glVertexAttrib1f))(GL_TH_DP, GLuint indx, GLfloat x);
+extern void (*GL_TH_FN(glVertexAttrib1fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void (*GL_TH_FN(glVertexAttrib2f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y);
+extern void (*GL_TH_FN(glVertexAttrib2fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void (*GL_TH_FN(glVertexAttrib3f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+extern void (*GL_TH_FN(glVertexAttrib3fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void (*GL_TH_FN(glVertexAttrib4f))(GL_TH_DP, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+extern void (*GL_TH_FN(glVertexAttrib4fv))(GL_TH_DP, GLuint indx, const GLfloat* values);
+extern void (*GL_TH_FN(glVertexAttribPointer))(GL_TH_DP, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+extern void (*GL_TH_FN(glViewport))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glEvasGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+extern void (*GL_TH_FN(glEvasGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, EvasGLImage image);
+extern void (*GL_TH_FN(glGetProgramBinaryOES))(GL_TH_DP, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+extern void (*GL_TH_FN(glProgramBinaryOES))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+extern void * (*GL_TH_FN(glMapBufferOES))(GL_TH_DP, GLenum target, GLenum access);
+extern GLboolean (*GL_TH_FN(glUnmapBufferOES))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glGetBufferPointervOES))(GL_TH_DP, GLenum target, GLenum pname, void** params);
+extern void (*GL_TH_FN(glTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+extern void (*GL_TH_FN(glTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+extern void (*GL_TH_FN(glCopyTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glCompressedTexImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+extern void (*GL_TH_FN(glCompressedTexSubImage3DOES))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+extern void (*GL_TH_FN(glFramebufferTexture3DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+extern void (*GL_TH_FN(glGetPerfMonitorGroupsAMD))(GL_TH_DP, GLint* numGroups, GLsizei groupsSize, GLuint* groups);
+extern void (*GL_TH_FN(glGetPerfMonitorCountersAMD))(GL_TH_DP, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters);
+extern void (*GL_TH_FN(glGetPerfMonitorGroupStringAMD))(GL_TH_DP, GLuint group, GLsizei bufSize, GLsizei* length, char* groupString);
+extern void (*GL_TH_FN(glGetPerfMonitorCounterStringAMD))(GL_TH_DP, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString);
+extern void (*GL_TH_FN(glGetPerfMonitorCounterInfoAMD))(GL_TH_DP, GLuint group, GLuint counter, GLenum pname, void* data);
+extern void (*GL_TH_FN(glGenPerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+extern void (*GL_TH_FN(glDeletePerfMonitorsAMD))(GL_TH_DP, GLsizei n, GLuint* monitors);
+extern void (*GL_TH_FN(glSelectPerfMonitorCountersAMD))(GL_TH_DP, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList);
+extern void (*GL_TH_FN(glBeginPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+extern void (*GL_TH_FN(glEndPerfMonitorAMD))(GL_TH_DP, GLuint monitor);
+extern void (*GL_TH_FN(glGetPerfMonitorCounterDataAMD))(GL_TH_DP, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten);
+extern void (*GL_TH_FN(glDiscardFramebufferEXT))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum* attachments);
+extern void (*GL_TH_FN(glMultiDrawArraysEXT))(GL_TH_DP, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount);
+extern void (*GL_TH_FN(glMultiDrawElementsEXT))(GL_TH_DP, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount);
+extern void (*GL_TH_FN(glDeleteFencesNV))(GL_TH_DP, GLsizei n, const GLuint* fences);
+extern void (*GL_TH_FN(glGenFencesNV))(GL_TH_DP, GLsizei n, GLuint* fences);
+extern GLboolean (*GL_TH_FN(glIsFenceNV))(GL_TH_DP, GLuint fence);
+extern GLboolean (*GL_TH_FN(glTestFenceNV))(GL_TH_DP, GLuint fence);
+extern void (*GL_TH_FN(glGetFenceivNV))(GL_TH_DP, GLuint fence, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glFinishFenceNV))(GL_TH_DP, GLuint fence);
+extern void (*GL_TH_FN(glSetFenceNV))(GL_TH_DP, GLuint a, GLenum b);
+extern void (*GL_TH_FN(glGetDriverControlsQCOM))(GL_TH_DP, GLint* num, GLsizei size, GLuint* driverControls);
+extern void (*GL_TH_FN(glGetDriverControlStringQCOM))(GL_TH_DP, GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString);
+extern void (*GL_TH_FN(glEnableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+extern void (*GL_TH_FN(glDisableDriverControlQCOM))(GL_TH_DP, GLuint driverControl);
+extern void (*GL_TH_FN(glExtGetTexturesQCOM))(GL_TH_DP, GLuint* textures, GLint maxTextures, GLint* numTextures);
+extern void (*GL_TH_FN(glExtGetBuffersQCOM))(GL_TH_DP, GLuint* buffers, GLint maxBuffers, GLint* numBuffers);
+extern void (*GL_TH_FN(glExtGetRenderbuffersQCOM))(GL_TH_DP, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers);
+extern void (*GL_TH_FN(glExtGetFramebuffersQCOM))(GL_TH_DP, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers);
+extern void (*GL_TH_FN(glExtGetTexLevelParameterivQCOM))(GL_TH_DP, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glExtTexObjectStateOverrideiQCOM))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glExtGetTexSubImageQCOM))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels);
+extern void (*GL_TH_FN(glExtGetBufferPointervQCOM))(GL_TH_DP, GLenum target, void** params);
+extern void (*GL_TH_FN(glExtGetShadersQCOM))(GL_TH_DP, GLuint* shaders, GLint maxShaders, GLint* numShaders);
+extern void (*GL_TH_FN(glExtGetProgramsQCOM))(GL_TH_DP, GLuint* programs, GLint maxPrograms, GLint* numPrograms);
+extern GLboolean (*GL_TH_FN(glExtIsProgramBinaryQCOM))(GL_TH_DP, GLuint program);
+extern void (*GL_TH_FN(glExtGetProgramBinarySourceQCOM))(GL_TH_DP, GLuint program, GLenum shadertype, char* source, GLint* length);
+extern void (*GL_TH_FN(glAlphaFunc))(GL_TH_DP, GLenum func, GLclampf ref);
+extern void (*GL_TH_FN(glClipPlanef))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+extern void (*GL_TH_FN(glColor4f))(GL_TH_DP, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+extern void (*GL_TH_FN(glFogf))(GL_TH_DP, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glFogfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glFrustumf))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void (*GL_TH_FN(glGetClipPlanef))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+extern void (*GL_TH_FN(glGetLightfv))(GL_TH_DP, GLenum light, GLenum pname, GLfloat *params);
+extern void (*GL_TH_FN(glGetMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, GLfloat *params);
+extern void (*GL_TH_FN(glGetTexEnvfv))(GL_TH_DP, GLenum env, GLenum pname, GLfloat *params);
+extern void (*GL_TH_FN(glLightModelf))(GL_TH_DP, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glLightModelfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glLightf))(GL_TH_DP, GLenum light, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glLightfv))(GL_TH_DP, GLenum light, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glLoadMatrixf))(GL_TH_DP, const GLfloat *m);
+extern void (*GL_TH_FN(glMaterialf))(GL_TH_DP, GLenum face, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glMaterialfv))(GL_TH_DP, GLenum face, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glMultMatrixf))(GL_TH_DP, const GLfloat *m);
+extern void (*GL_TH_FN(glMultiTexCoord4f))(GL_TH_DP, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+extern void (*GL_TH_FN(glNormal3f))(GL_TH_DP, GLfloat nx, GLfloat ny, GLfloat nz);
+extern void (*GL_TH_FN(glOrthof))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void (*GL_TH_FN(glPointParameterf))(GL_TH_DP, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glPointParameterfv))(GL_TH_DP, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glPointSize))(GL_TH_DP, GLfloat size);
+extern void (*GL_TH_FN(glPointSizePointerOES))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid * pointer);
+extern void (*GL_TH_FN(glRotatef))(GL_TH_DP, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+extern void (*GL_TH_FN(glScalef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+extern void (*GL_TH_FN(glTexEnvf))(GL_TH_DP, GLenum target, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glTexEnvfv))(GL_TH_DP, GLenum target, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glTranslatef))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z);
+extern void (*GL_TH_FN(glAlphaFuncx))(GL_TH_DP, GLenum func, GLclampx ref);
+extern void (*GL_TH_FN(glClearColorx))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+extern void (*GL_TH_FN(glClearDepthx))(GL_TH_DP, GLclampx depth);
+extern void (*GL_TH_FN(glClientActiveTexture))(GL_TH_DP, GLenum texture);
+extern void (*GL_TH_FN(glClipPlanex))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+extern void (*GL_TH_FN(glColor4ub))(GL_TH_DP, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+extern void (*GL_TH_FN(glColor4x))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+extern void (*GL_TH_FN(glColorPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glDepthRangex))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+extern void (*GL_TH_FN(glDisableClientState))(GL_TH_DP, GLenum array);
+extern void (*GL_TH_FN(glEnableClientState))(GL_TH_DP, GLenum array);
+extern void (*GL_TH_FN(glFogx))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glFogxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glFrustumx))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void (*GL_TH_FN(glGetClipPlanex))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+extern void (*GL_TH_FN(glGetFixedv))(GL_TH_DP, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetLightxv))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetPointerv))(GL_TH_DP, GLenum pname, GLvoid **params);
+extern void (*GL_TH_FN(glGetTexEnviv))(GL_TH_DP, GLenum env, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetTexEnvxv))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glLightModelx))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glLightModelxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glLightx))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glLightxv))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glLineWidthx))(GL_TH_DP, GLfixed width);
+extern void (*GL_TH_FN(glLoadIdentity))(GL_TH_DP);
+extern void (*GL_TH_FN(glLoadMatrixx))(GL_TH_DP, const GLfixed *m);
+extern void (*GL_TH_FN(glLogicOp))(GL_TH_DP, GLenum opcode);
+extern void (*GL_TH_FN(glMaterialx))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glMaterialxv))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glMatrixMode))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glMultMatrixx))(GL_TH_DP, const GLfixed *m);
+extern void (*GL_TH_FN(glMultiTexCoord4x))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+extern void (*GL_TH_FN(glNormal3x))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+extern void (*GL_TH_FN(glNormalPointer))(GL_TH_DP, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glOrthox))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void (*GL_TH_FN(glPointParameterx))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glPointParameterxv))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glPointSizex))(GL_TH_DP, GLfixed size);
+extern void (*GL_TH_FN(glPolygonOffsetx))(GL_TH_DP, GLfixed factor, GLfixed units);
+extern void (*GL_TH_FN(glPopMatrix))(GL_TH_DP);
+extern void (*GL_TH_FN(glPushMatrix))(GL_TH_DP);
+extern void (*GL_TH_FN(glRotatex))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+extern void (*GL_TH_FN(glSampleCoveragex))(GL_TH_DP, GLclampx value, GLboolean invert);
+extern void (*GL_TH_FN(glScalex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void (*GL_TH_FN(glShadeModel))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glTexCoordPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glTexEnvi))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glTexEnvx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glTexEnviv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+extern void (*GL_TH_FN(glTexEnvxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glTexParameterx))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glTexParameterxv))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glTranslatex))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void (*GL_TH_FN(glVertexPointer))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glBlendEquationSeparateOES))(GL_TH_DP, GLenum modeRGB, GLenum modeAlpha);
+extern void (*GL_TH_FN(glBlendFuncSeparateOES))(GL_TH_DP, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void (*GL_TH_FN(glBlendEquationOES))(GL_TH_DP, GLenum mode);
+extern void (*GL_TH_FN(glDrawTexsOES))(GL_TH_DP, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+extern void (*GL_TH_FN(glDrawTexiOES))(GL_TH_DP, GLint x, GLint y, GLint z, GLint width, GLint height);
+extern void (*GL_TH_FN(glDrawTexxOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+extern void (*GL_TH_FN(glDrawTexsvOES))(GL_TH_DP, const GLshort *coords);
+extern void (*GL_TH_FN(glDrawTexivOES))(GL_TH_DP, const GLint *coords);
+extern void (*GL_TH_FN(glDrawTexxvOES))(GL_TH_DP, const GLfixed *coords);
+extern void (*GL_TH_FN(glDrawTexfOES))(GL_TH_DP, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+extern void (*GL_TH_FN(glDrawTexfvOES))(GL_TH_DP, const GLfloat *coords);
+extern void (*GL_TH_FN(glAlphaFuncxOES))(GL_TH_DP, GLenum func, GLclampx ref);
+extern void (*GL_TH_FN(glClearColorxOES))(GL_TH_DP, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha);
+extern void (*GL_TH_FN(glClearDepthxOES))(GL_TH_DP, GLclampx depth);
+extern void (*GL_TH_FN(glClipPlanexOES))(GL_TH_DP, GLenum plane, const GLfixed *equation);
+extern void (*GL_TH_FN(glColor4xOES))(GL_TH_DP, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+extern void (*GL_TH_FN(glDepthRangexOES))(GL_TH_DP, GLclampx zNear, GLclampx zFar);
+extern void (*GL_TH_FN(glFogxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glFogxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glFrustumxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void (*GL_TH_FN(glGetClipPlanexOES))(GL_TH_DP, GLenum pname, GLfixed eqn[4]);
+extern void (*GL_TH_FN(glGetFixedvOES))(GL_TH_DP, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetTexEnvxvOES))(GL_TH_DP, GLenum env, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glGetTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glLightModelxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glLightModelxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glLightxOES))(GL_TH_DP, GLenum light, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glLightxvOES))(GL_TH_DP, GLenum light, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glLineWidthxOES))(GL_TH_DP, GLfixed width);
+extern void (*GL_TH_FN(glLoadMatrixxOES))(GL_TH_DP, const GLfixed *m);
+extern void (*GL_TH_FN(glMaterialxOES))(GL_TH_DP, GLenum face, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glMaterialxvOES))(GL_TH_DP, GLenum face, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glMultMatrixxOES))(GL_TH_DP, const GLfixed *m);
+extern void (*GL_TH_FN(glMultiTexCoord4xOES))(GL_TH_DP, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+extern void (*GL_TH_FN(glNormal3xOES))(GL_TH_DP, GLfixed nx, GLfixed ny, GLfixed nz);
+extern void (*GL_TH_FN(glOrthoxOES))(GL_TH_DP, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar);
+extern void (*GL_TH_FN(glPointParameterxOES))(GL_TH_DP, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glPointParameterxvOES))(GL_TH_DP, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glPointSizexOES))(GL_TH_DP, GLfixed size);
+extern void (*GL_TH_FN(glPolygonOffsetxOES))(GL_TH_DP, GLfixed factor, GLfixed units);
+extern void (*GL_TH_FN(glRotatexOES))(GL_TH_DP, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+extern void (*GL_TH_FN(glSampleCoveragexOES))(GL_TH_DP, GLclampx value, GLboolean invert);
+extern void (*GL_TH_FN(glScalexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern void (*GL_TH_FN(glTexEnvxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glTexEnvxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glTexParameterxOES))(GL_TH_DP, GLenum target, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glTexParameterxvOES))(GL_TH_DP, GLenum target, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glTranslatexOES))(GL_TH_DP, GLfixed x, GLfixed y, GLfixed z);
+extern GLboolean (*GL_TH_FN(glIsRenderbufferOES))(GL_TH_DP, GLuint renderbuffer);
+extern void (*GL_TH_FN(glBindRenderbufferOES))(GL_TH_DP, GLenum target, GLuint renderbuffer);
+extern void (*GL_TH_FN(glDeleteRenderbuffersOES))(GL_TH_DP, GLsizei n, const GLuint* renderbuffers);
+extern void (*GL_TH_FN(glGenRenderbuffersOES))(GL_TH_DP, GLsizei n, GLuint* renderbuffers);
+extern void (*GL_TH_FN(glRenderbufferStorageOES))(GL_TH_DP, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glGetRenderbufferParameterivOES))(GL_TH_DP, GLenum target, GLenum pname, GLint* params);
+extern GLboolean (*GL_TH_FN(glIsFramebufferOES))(GL_TH_DP, GLuint framebuffer);
+extern void (*GL_TH_FN(glBindFramebufferOES))(GL_TH_DP, GLenum target, GLuint framebuffer);
+extern void (*GL_TH_FN(glDeleteFramebuffersOES))(GL_TH_DP, GLsizei n, const GLuint* framebuffers);
+extern void (*GL_TH_FN(glGenFramebuffersOES))(GL_TH_DP, GLsizei n, GLuint* framebuffers);
+extern GLenum (*GL_TH_FN(glCheckFramebufferStatusOES))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glFramebufferRenderbufferOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+extern void (*GL_TH_FN(glFramebufferTexture2DOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+extern void (*GL_TH_FN(glGetFramebufferAttachmentParameterivOES))(GL_TH_DP, GLenum target, GLenum attachment, GLenum pname, GLint* params);
+extern void (*GL_TH_FN(glGenerateMipmapOES))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glCurrentPaletteMatrixOES))(GL_TH_DP, GLuint matrixpaletteindex);
+extern void (*GL_TH_FN(glLoadPaletteFromModelViewMatrixOES))(GL_TH_DP);
+extern void (*GL_TH_FN(glMatrixIndexPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glWeightPointerOES))(GL_TH_DP, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern GLbitfield (*GL_TH_FN(glQueryMatrixxOES))(GL_TH_DP, GLfixed mantissa[16], GLint exponent[16]);
+extern void (*GL_TH_FN(glDepthRangefOES))(GL_TH_DP, GLclampf zNear, GLclampf zFar);
+extern void (*GL_TH_FN(glFrustumfOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void (*GL_TH_FN(glOrthofOES))(GL_TH_DP, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);
+extern void (*GL_TH_FN(glClipPlanefOES))(GL_TH_DP, GLenum plane, const GLfloat *equation);
+extern void (*GL_TH_FN(glGetClipPlanefOES))(GL_TH_DP, GLenum pname, GLfloat eqn[4]);
+extern void (*GL_TH_FN(glClearDepthfOES))(GL_TH_DP, GLclampf depth);
+extern void (*GL_TH_FN(glTexGenfOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfloat *params);
+extern void (*GL_TH_FN(glTexGeniOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLint *params);
+extern void (*GL_TH_FN(glTexGenxOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed param);
+extern void (*GL_TH_FN(glTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, const GLfixed *params);
+extern void (*GL_TH_FN(glGetTexGenfvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfloat *params);
+extern void (*GL_TH_FN(glGetTexGenivOES))(GL_TH_DP, GLenum coord, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetTexGenxvOES))(GL_TH_DP, GLenum coord, GLenum pname, GLfixed *params);
+extern void (*GL_TH_FN(glBindVertexArrayOES))(GL_TH_DP, GLuint array);
+extern void (*GL_TH_FN(glDeleteVertexArraysOES))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+extern void (*GL_TH_FN(glGenVertexArraysOES))(GL_TH_DP, GLsizei n, GLuint *arrays);
+extern GLboolean (*GL_TH_FN(glIsVertexArrayOES))(GL_TH_DP, GLuint array);
+extern void (*GL_TH_FN(glCopyTextureLevelsAPPLE))(GL_TH_DP, GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+extern void (*GL_TH_FN(glRenderbufferStorageMultisampleAPPLE))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void (*GL_TH_FN(glResolveMultisampleFramebufferAPPLE))(GL_TH_DP);
+extern GLsync (*GL_TH_FN(glFenceSyncAPPLE))(GL_TH_DP, GLenum condition, GLbitfield flags);
+extern GLboolean (*GL_TH_FN(glIsSyncAPPLE))(GL_TH_DP, GLsync sync);
+extern void (*GL_TH_FN(glDeleteSyncAPPLE))(GL_TH_DP, GLsync sync);
+extern GLenum (*GL_TH_FN(glClientWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void (*GL_TH_FN(glWaitSyncAPPLE))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void (*GL_TH_FN(glGetInteger64vAPPLE))(GL_TH_DP, GLenum pname, EvasGLint64 *params);
+extern void (*GL_TH_FN(glGetSyncivAPPLE))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+extern void * (*GL_TH_FN(glMapBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern void (*GL_TH_FN(glFlushMappedBufferRangeEXT))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+extern void (*GL_TH_FN(glRenderbufferStorageMultisampleEXT))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void (*GL_TH_FN(glFramebufferTexture2DMultisampleEXT))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern GLenum (*GL_TH_FN(glGetGraphicsResetStatusEXT))(GL_TH_DP);
+extern void (*GL_TH_FN(glReadnPixelsEXT))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+extern void (*GL_TH_FN(glGetnUniformfvEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, float *params);
+extern void (*GL_TH_FN(glGetnUniformivEXT))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+extern void (*GL_TH_FN(glTexStorage1DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+extern void (*GL_TH_FN(glTexStorage2DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glTexStorage3DEXT))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void (*GL_TH_FN(glTextureStorage1DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+extern void (*GL_TH_FN(glTextureStorage2DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glTextureStorage3DEXT))(GL_TH_DP, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void (*GL_TH_FN(glClipPlanefIMG))(GL_TH_DP, GLenum a, const GLfloat * b);
+extern void (*GL_TH_FN(glClipPlanexIMG))(GL_TH_DP, GLenum a, const GLfixed * b);
+extern void (*GL_TH_FN(glRenderbufferStorageMultisampleIMG))(GL_TH_DP, GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e);
+extern void (*GL_TH_FN(glFramebufferTexture2DMultisampleIMG))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern void (*GL_TH_FN(glActivateTile))(GL_TH_DP, GLuint a, GLuint b, GLuint c, GLuint d, GLuint e);
+extern void (*GL_TH_FN(glStartTilingQCOM))(GL_TH_DP, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+extern void (*GL_TH_FN(glEndTilingQCOM))(GL_TH_DP, GLbitfield preserveMask);
+extern void (*GL_TH_FN(glFramebufferTexture2DMultisample))(GL_TH_DP, GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f);
+extern void (*GL_TH_FN(glBeginQuery))(GL_TH_DP, GLenum target, GLuint id);
+extern void (*GL_TH_FN(glBeginTransformFeedback))(GL_TH_DP, GLenum primitiveMode);
+extern void (*GL_TH_FN(glBindBufferBase))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer);
+extern void (*GL_TH_FN(glBindBufferRange))(GL_TH_DP, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern void (*GL_TH_FN(glBindSampler))(GL_TH_DP, GLuint unit, GLuint sampler);
+extern void (*GL_TH_FN(glBindTransformFeedback))(GL_TH_DP, GLenum target, GLuint id);
+extern void (*GL_TH_FN(glBindVertexArray))(GL_TH_DP, GLuint array);
+extern void (*GL_TH_FN(glBlitFramebuffer))(GL_TH_DP, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+extern void (*GL_TH_FN(glClearBufferfi))(GL_TH_DP, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+extern void (*GL_TH_FN(glClearBufferfv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLfloat * value);
+extern void (*GL_TH_FN(glClearBufferiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLint * value);
+extern void (*GL_TH_FN(glClearBufferuiv))(GL_TH_DP, GLenum buffer, GLint drawBuffer, const GLuint * value);
+extern GLenum (*GL_TH_FN(glClientWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void (*GL_TH_FN(glCompressedTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+extern void (*GL_TH_FN(glCompressedTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+extern void (*GL_TH_FN(glCopyBufferSubData))(GL_TH_DP, GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+extern void (*GL_TH_FN(glCopyTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glDeleteQueries))(GL_TH_DP, GLsizei n, const GLuint * ids);
+extern void (*GL_TH_FN(glDeleteSamplers))(GL_TH_DP, GLsizei n, const GLuint * samplers);
+extern void (*GL_TH_FN(glDeleteSync))(GL_TH_DP, GLsync sync);
+extern void (*GL_TH_FN(glDeleteTransformFeedbacks))(GL_TH_DP, GLsizei n, const GLuint *ids);
+extern void (*GL_TH_FN(glDeleteVertexArrays))(GL_TH_DP, GLsizei n, const GLuint *arrays);
+extern void (*GL_TH_FN(glDrawArraysInstanced))(GL_TH_DP, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+extern void (*GL_TH_FN(glDrawBuffers))(GL_TH_DP, GLsizei n, const GLenum *bufs);
+extern void (*GL_TH_FN(glDrawElementsInstanced))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+extern void (*GL_TH_FN(glDrawRangeElements))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+extern void (*GL_TH_FN(glEndQuery))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glEndTransformFeedback))(GL_TH_DP);
+extern GLsync (*GL_TH_FN(glFenceSync))(GL_TH_DP, GLenum condition, GLbitfield flags);
+extern GLsync (*GL_TH_FN(glFlushMappedBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length);
+extern void (*GL_TH_FN(glFramebufferTextureLayer))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+extern void (*GL_TH_FN(glGenQueries))(GL_TH_DP, GLsizei n, GLuint * ids);
+extern void (*GL_TH_FN(glGenSamplers))(GL_TH_DP, GLsizei n, GLuint *samplers);
+extern void (*GL_TH_FN(glGenTransformFeedbacks))(GL_TH_DP, GLsizei n, GLuint *ids);
+extern void (*GL_TH_FN(glGenVertexArrays))(GL_TH_DP, GLsizei n, GLuint *arrays);
+extern void (*GL_TH_FN(glGetActiveUniformBlockiv))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetActiveUniformBlockName))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+extern void (*GL_TH_FN(glGetActiveUniformsiv))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetBufferParameteri64v))(GL_TH_DP, GLenum target, GLenum value, EvasGLint64 * data);
+extern void (*GL_TH_FN(glGetBufferPointerv))(GL_TH_DP, GLenum target, GLenum pname, GLvoid ** params);
+extern GLint (*GL_TH_FN(glGetFragDataLocation))(GL_TH_DP, GLuint program, const char * name);
+extern void (*GL_TH_FN(glGetInteger64i_v))(GL_TH_DP, GLenum target, GLuint index, EvasGLint64 * data);
+extern void (*GL_TH_FN(glGetInteger64v))(GL_TH_DP, GLenum pname, EvasGLint64 * data);
+extern void (*GL_TH_FN(glGetIntegeri_v))(GL_TH_DP, GLenum target, GLuint index, GLint * data);
+extern void (*GL_TH_FN(glGetInternalformativ))(GL_TH_DP, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+extern void (*GL_TH_FN(glGetProgramBinary))(GL_TH_DP, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+extern void (*GL_TH_FN(glGetQueryiv))(GL_TH_DP, GLenum target, GLenum pname, GLint * params);
+extern void (*GL_TH_FN(glGetQueryObjectuiv))(GL_TH_DP, GLuint id, GLenum pname, GLuint * params);
+extern void (*GL_TH_FN(glGetSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat * params);
+extern void (*GL_TH_FN(glGetSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint * params);
+extern const GLubyte * (*GL_TH_FN(glGetStringi))(GL_TH_DP, GLenum name, GLuint index);
+extern void (*GL_TH_FN(glGetSynciv))(GL_TH_DP, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+extern void (*GL_TH_FN(glGetTransformFeedbackVarying))(GL_TH_DP, GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+extern GLuint (*GL_TH_FN(glGetUniformBlockIndex))(GL_TH_DP, GLuint program, const GLchar *uniformBlockName);
+extern void (*GL_TH_FN(glGetUniformIndices))(GL_TH_DP, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+extern void (*GL_TH_FN(glGetUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLuint* params);
+extern void (*GL_TH_FN(glGetVertexAttribIiv))(GL_TH_DP, GLuint index, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetVertexAttribIuiv))(GL_TH_DP, GLuint index, GLenum pname, GLuint *params);
+extern void (*GL_TH_FN(glInvalidateFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments);
+extern void (*GL_TH_FN(glInvalidateSubFramebuffer))(GL_TH_DP, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GLboolean (*GL_TH_FN(glIsQuery))(GL_TH_DP, GLuint id);
+extern GLboolean (*GL_TH_FN(glIsSampler))(GL_TH_DP, GLuint id);
+extern GLboolean (*GL_TH_FN(glIsSync))(GL_TH_DP, GLsync sync);
+extern GLboolean (*GL_TH_FN(glIsTransformFeedback))(GL_TH_DP, GLuint id);
+extern GLboolean (*GL_TH_FN(glIsVertexArray))(GL_TH_DP, GLuint array);
+extern void * (*GL_TH_FN(glMapBufferRange))(GL_TH_DP, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern void (*GL_TH_FN(glPauseTransformFeedback))(GL_TH_DP);
+extern void (*GL_TH_FN(glProgramBinary))(GL_TH_DP, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+extern void (*GL_TH_FN(glProgramParameteri))(GL_TH_DP, GLuint program, GLenum pname, GLint value);
+extern void (*GL_TH_FN(glReadBuffer))(GL_TH_DP, GLenum src);
+extern void (*GL_TH_FN(glRenderbufferStorageMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glResumeTransformFeedback))(GL_TH_DP);
+extern void (*GL_TH_FN(glSamplerParameterf))(GL_TH_DP, GLuint sampler, GLenum pname, GLfloat param);
+extern void (*GL_TH_FN(glSamplerParameterfv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLfloat * params);
+extern void (*GL_TH_FN(glSamplerParameteri))(GL_TH_DP, GLuint sampler, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glSamplerParameteriv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint * params);
+extern void (*GL_TH_FN(glTexImage3D))(GL_TH_DP, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+extern void (*GL_TH_FN(glTexStorage2D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern void (*GL_TH_FN(glTexStorage3D))(GL_TH_DP, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern void (*GL_TH_FN(glTexSubImage3D))(GL_TH_DP, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+extern void (*GL_TH_FN(glTransformFeedbackVaryings))(GL_TH_DP, GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+extern void (*GL_TH_FN(glUniform1ui))(GL_TH_DP, GLint location, GLuint v0);
+extern void (*GL_TH_FN(glUniform1uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glUniform2ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1);
+extern void (*GL_TH_FN(glUniform2uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glUniform3ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern void (*GL_TH_FN(glUniform3uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glUniform4ui))(GL_TH_DP, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void (*GL_TH_FN(glUniform4uiv))(GL_TH_DP, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glUniformBlockBinding))(GL_TH_DP, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+extern void (*GL_TH_FN(glUniformMatrix2x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glUniformMatrix3x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glUniformMatrix2x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glUniformMatrix4x2fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glUniformMatrix3x4fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glUniformMatrix4x3fv))(GL_TH_DP, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern GLboolean (*GL_TH_FN(glUnmapBuffer))(GL_TH_DP, GLenum target);
+extern void (*GL_TH_FN(glVertexAttribDivisor))(GL_TH_DP, GLuint index, GLuint divisor);
+extern void (*GL_TH_FN(glVertexAttribI4i))(GL_TH_DP, GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+extern void (*GL_TH_FN(glVertexAttribI4iv))(GL_TH_DP, GLuint index, const GLint *v);
+extern void (*GL_TH_FN(glVertexAttribI4ui))(GL_TH_DP, GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void (*GL_TH_FN(glVertexAttribI4uiv))(GL_TH_DP, GLuint index, const GLuint *v);
+extern void (*GL_TH_FN(glVertexAttribIPointer))(GL_TH_DP, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+extern void (*GL_TH_FN(glWaitSync))(GL_TH_DP, GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+extern void (*GL_TH_FN(glDispatchCompute))(GL_TH_DP, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+extern void (*GL_TH_FN(glDispatchComputeIndirect))(GL_TH_DP, GLintptr indirect);
+extern void (*GL_TH_FN(glDrawArraysIndirect))(GL_TH_DP, GLenum mode, const void *indirect);
+extern void (*GL_TH_FN(glDrawElementsIndirect))(GL_TH_DP, GLenum mode, GLenum type, const void *indirect);
+extern void (*GL_TH_FN(glFramebufferParameteri))(GL_TH_DP, GLenum target, GLenum pname, GLint param);
+extern void (*GL_TH_FN(glGetFramebufferParameteriv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetProgramInterfaceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+extern GLuint (*GL_TH_FN(glGetProgramResourceIndex))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+extern void (*GL_TH_FN(glGetProgramResourceName))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+extern void (*GL_TH_FN(glGetProgramResourceiv))(GL_TH_DP, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+extern GLint (*GL_TH_FN(glGetProgramResourceLocation))(GL_TH_DP, GLuint program, GLenum programInterface, const GLchar *name);
+extern void (*GL_TH_FN(glUseProgramStages))(GL_TH_DP, GLuint pipeline, GLbitfield stages, GLuint program);
+extern void (*GL_TH_FN(glActiveShaderProgram))(GL_TH_DP, GLuint pipeline, GLuint program);
+extern GLuint (*GL_TH_FN(glCreateShaderProgramv))(GL_TH_DP, GLenum type, GLsizei count, const GLchar *const*strings);
+extern void (*GL_TH_FN(glBindProgramPipeline))(GL_TH_DP, GLuint pipeline);
+extern void (*GL_TH_FN(glDeleteProgramPipelines))(GL_TH_DP, GLsizei n, const GLuint *pipelines);
+extern void (*GL_TH_FN(glGenProgramPipelines))(GL_TH_DP, GLsizei n, GLuint *pipelines);
+extern GLboolean (*GL_TH_FN(glIsProgramPipeline))(GL_TH_DP, GLuint pipeline);
+extern void (*GL_TH_FN(glGetProgramPipelineiv))(GL_TH_DP, GLuint pipeline, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glProgramUniform1i))(GL_TH_DP, GLuint program, GLint location, GLint v0);
+extern void (*GL_TH_FN(glProgramUniform2i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1);
+extern void (*GL_TH_FN(glProgramUniform3i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+extern void (*GL_TH_FN(glProgramUniform4i))(GL_TH_DP, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+extern void (*GL_TH_FN(glProgramUniform1ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0);
+extern void (*GL_TH_FN(glProgramUniform2ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1);
+extern void (*GL_TH_FN(glProgramUniform3ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern void (*GL_TH_FN(glProgramUniform4ui))(GL_TH_DP, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern void (*GL_TH_FN(glProgramUniform1f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0);
+extern void (*GL_TH_FN(glProgramUniform2f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1);
+extern void (*GL_TH_FN(glProgramUniform3f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+extern void (*GL_TH_FN(glProgramUniform4f))(GL_TH_DP, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+extern void (*GL_TH_FN(glProgramUniform1iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void (*GL_TH_FN(glProgramUniform2iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void (*GL_TH_FN(glProgramUniform3iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void (*GL_TH_FN(glProgramUniform4iv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLint *value);
+extern void (*GL_TH_FN(glProgramUniform1uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glProgramUniform2uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glProgramUniform3uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glProgramUniform4uiv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLuint *value);
+extern void (*GL_TH_FN(glProgramUniform1fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniform2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniform3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniform4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix2x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix3x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix2x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix4x2fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix3x4fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glProgramUniformMatrix4x3fv))(GL_TH_DP, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+extern void (*GL_TH_FN(glValidateProgramPipeline))(GL_TH_DP, GLuint pipeline);
+extern void (*GL_TH_FN(glGetProgramPipelineInfoLog))(GL_TH_DP, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+extern void (*GL_TH_FN(glBindImageTexture))(GL_TH_DP, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+extern void (*GL_TH_FN(glGetBooleani_v))(GL_TH_DP, GLenum target, GLuint index, GLboolean *data);
+extern void (*GL_TH_FN(glMemoryBarrier))(GL_TH_DP, GLbitfield barriers);
+extern void (*GL_TH_FN(glMemoryBarrierByRegion))(GL_TH_DP, GLbitfield barriers);
+extern void (*GL_TH_FN(glTexStorage2DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+extern void (*GL_TH_FN(glGetMultisamplefv))(GL_TH_DP, GLenum pname, GLuint index, GLfloat *val);
+extern void (*GL_TH_FN(glSampleMaski))(GL_TH_DP, GLuint maskNumber, GLbitfield mask);
+extern void (*GL_TH_FN(glGetTexLevelParameteriv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetTexLevelParameterfv))(GL_TH_DP, GLenum target, GLint level, GLenum pname, GLfloat *params);
+extern void (*GL_TH_FN(glBindVertexBuffer))(GL_TH_DP, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+extern void (*GL_TH_FN(glVertexAttribFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+extern void (*GL_TH_FN(glVertexAttribIFormat))(GL_TH_DP, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+extern void (*GL_TH_FN(glVertexAttribBinding))(GL_TH_DP, GLuint attribindex, GLuint bindingindex);
+extern void (*GL_TH_FN(glVertexBindingDivisor))(GL_TH_DP, GLuint bindingindex, GLuint divisor);
+extern void (*GL_TH_FN(glBlendBarrier))(GL_TH_DP);
+extern void (*GL_TH_FN(glCopyImageSubData))(GL_TH_DP, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+extern void (*GL_TH_FN(glDebugMessageControl))(GL_TH_DP, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+extern void (*GL_TH_FN(glDebugMessageInsert))(GL_TH_DP, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+extern void (*GL_TH_FN(glDebugMessageCallback))(GL_TH_DP, GLDEBUGPROC callback, const void *userParam);
+extern GLuint (*GL_TH_FN(glGetDebugMessageLog))(GL_TH_DP, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+extern void (*GL_TH_FN(glPushDebugGroup))(GL_TH_DP, GLenum source, GLuint id, GLsizei length, const GLchar *message);
+extern void (*GL_TH_FN(glPopDebugGroup))(GL_TH_DP);
+extern void (*GL_TH_FN(glObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+extern void (*GL_TH_FN(glGetObjectLabel))(GL_TH_DP, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+extern void (*GL_TH_FN(glObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei length, const GLchar *label);
+extern void (*GL_TH_FN(glGetObjectPtrLabel))(GL_TH_DP, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+extern void (*GL_TH_FN(glEnablei))(GL_TH_DP, GLenum target, GLuint index);
+extern void (*GL_TH_FN(glDisablei))(GL_TH_DP, GLenum target, GLuint index);
+extern void (*GL_TH_FN(glBlendEquationi))(GL_TH_DP, GLuint buf, GLenum mode);
+extern void (*GL_TH_FN(glBlendEquationSeparatei))(GL_TH_DP, GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+extern void (*GL_TH_FN(glBlendFunci))(GL_TH_DP, GLuint buf, GLenum src, GLenum dst);
+extern void (*GL_TH_FN(glBlendFuncSeparatei))(GL_TH_DP, GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+extern void (*GL_TH_FN(glColorMaski))(GL_TH_DP, GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+extern GLboolean (*GL_TH_FN(glIsEnabledi))(GL_TH_DP, GLenum target, GLuint index);
+extern void (*GL_TH_FN(glDrawElementsBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+extern void (*GL_TH_FN(glDrawRangeElementsBaseVertex))(GL_TH_DP, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+extern void (*GL_TH_FN(glDrawElementsInstancedBaseVertex))(GL_TH_DP, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+extern void (*GL_TH_FN(glFramebufferTexture))(GL_TH_DP, GLenum target, GLenum attachment, GLuint texture, GLint level);
+extern void (*GL_TH_FN(glPrimitiveBoundingBox))(GL_TH_DP, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+extern GLenum (*GL_TH_FN(glGetGraphicsResetStatus))(GL_TH_DP);
+extern void (*GL_TH_FN(glReadnPixels))(GL_TH_DP, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+extern void (*GL_TH_FN(glGetnUniformfv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+extern void (*GL_TH_FN(glGetnUniformiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+extern void (*GL_TH_FN(glGetnUniformuiv))(GL_TH_DP, GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+extern void (*GL_TH_FN(glMinSampleShading))(GL_TH_DP, GLfloat value);
+extern void (*GL_TH_FN(glPatchParameteri))(GL_TH_DP, GLenum pname, GLint value);
+extern void (*GL_TH_FN(glTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, const GLint *params);
+extern void (*GL_TH_FN(glTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, const GLuint *params);
+extern void (*GL_TH_FN(glGetTexParameterIiv))(GL_TH_DP, GLenum target, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetTexParameterIuiv))(GL_TH_DP, GLenum target, GLenum pname, GLuint *params);
+extern void (*GL_TH_FN(glSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLint *param);
+extern void (*GL_TH_FN(glSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, const GLuint *param);
+extern void (*GL_TH_FN(glGetSamplerParameterIiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLint *params);
+extern void (*GL_TH_FN(glGetSamplerParameterIuiv))(GL_TH_DP, GLuint sampler, GLenum pname, GLuint *params);
+extern void (*GL_TH_FN(glTexBuffer))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer);
+extern void (*GL_TH_FN(glTexBufferRange))(GL_TH_DP, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern void (*GL_TH_FN(glTexStorage3DMultisample))(GL_TH_DP, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+extern void (*GL_TH_FN(glEGLImageTargetTexture2DOES))(GL_TH_DP, GLenum target, void *image);
+extern void (*GL_TH_FN(glEGLImageTargetRenderbufferStorageOES))(GL_TH_DP, GLenum target, void *image);
+extern EvasGLImage (*GL_TH_FN(evasglCreateImage))(GL_TH_DP, int target, void* buffer, const int *attrib_list);
+extern void (*GL_TH_FN(evasglDestroyImage))(GL_TH_DP, EvasGLImage image);
+extern EvasGLImage (*GL_TH_FN(evasglCreateImageForContext))(GL_TH_DP, Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list);
+extern EvasGLSync (*GL_TH_FN(evasglCreateSync))(GL_TH_DP, Evas_GL *evas_gl, unsigned int type, const int *attrib_list);
+extern Eina_Bool (*GL_TH_FN(evasglDestroySync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync);
+extern int (*GL_TH_FN(evasglClientWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout);
+extern Eina_Bool (*GL_TH_FN(evasglGetSyncAttrib))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value);
+extern Eina_Bool (*GL_TH_FN(evasglSignalSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, unsigned mode);
+extern int (*GL_TH_FN(evasglWaitSync))(GL_TH_DP, Evas_GL *evas_gl, EvasGLSync sync, int flags);
+extern Eina_Bool (*GL_TH_FN(evasglBindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+extern Eina_Bool (*GL_TH_FN(evasglUnbindWaylandDisplay))(GL_TH_DP, Evas_GL *evas_gl, void *wl_display);
+extern Eina_Bool (*GL_TH_FN(evasglQueryWaylandBuffer))(GL_TH_DP, Evas_GL *evas_gl, void *buffer, int attribute, int *value);
 
-#ifndef GL_GLES
-extern void (*glGetTexLevelParameteriv_thread_cmd)(GLenum target, GLint level, GLenum pname, GLint *params);
-#endif
-
-#ifndef GL_GLES
-extern void (*glRenderbufferStorageMultisample_orig_evas_set)(void *func);
-extern void *(*glRenderbufferStorageMultisample_orig_evas_get)(void);
-extern void (*glRenderbufferStorageMultisample_thread_cmd)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-#endif
-extern void (*glGetStringi_orig_evas_set)(void *func);
-extern void *(*glGetStringi_orig_evas_get)(void);
-extern const GLubyte * (*glGetStringi_thread_cmd)(GLenum name, GLuint index);
-
-
-extern void _gl_thread_link_gl_generated_init();
+extern void _gl_thread_link_gl_generated_init(void *func_ptr);
index bed7aec..0e28942 100644 (file)
@@ -3,6 +3,31 @@
 
 #ifndef GL_GLES
 
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ ret (*GL_TH_FN(name))(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ void *(*GL_TH_FN(name##_begin))(GL_TH_DP, ##__VA_ARGS__); \
+ ret (*GL_TH_FN(name##_end))(void *ref);
+
+typedef struct
+{
+   EVAS_TH_GLX_FN_LIST
+} Evas_GL_Thread_GLX_Func;
+
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
+
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ typedef ret (*GL_TH_FNTYPE(name))(__VA_ARGS__);
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ typedef void *(*GL_TH_FNTYPE(name##_begin))(__VA_ARGS__); \
+ typedef ret (*GL_TH_FNTYPE(name##_end))(void *ref);
+
+EVAS_TH_GLX_FN_LIST
+
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
+
 
 #ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
    void
    glXBindTexImage(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
  */
-
 typedef struct
 {
+   GL_TH_FNTYPE(glXBindTexImage) orig_func;
    Display *dpy;
    GLXDrawable drawable;
    int buffer;
    const int *attrib_list;
 
-} Evas_Thread_Command_glXBindTexImage;
-
-void (*orig_evas_glXBindTexImage)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-
-EAPI void
-glXBindTexImage_orig_evas_set(void *func)
-{
-   orig_evas_glXBindTexImage = func;
-}
-
-EAPI void *
-glXBindTexImage_orig_evas_get(void)
-{
-   return orig_evas_glXBindTexImage;
-}
+} GL_TH_ST(glXBindTexImage);
 
 static void
-_gl_thread_glXBindTexImage(void *data)
+GL_TH_CB(glXBindTexImage)(void *data)
 {
-   Evas_Thread_Command_glXBindTexImage *thread_data =
-       (Evas_Thread_Command_glXBindTexImage *)data;
+   GL_TH_ST(glXBindTexImage) *thread_data = *(void**)data;
 
-   orig_evas_glXBindTexImage(thread_data->dpy,
-                             thread_data->drawable,
-                             thread_data->buffer,
-                             thread_data->attrib_list);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->drawable,
+                          thread_data->buffer,
+                          thread_data->attrib_list);
 
 }
 
-EAPI void
-glXBindTexImage_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list)
+
+void
+GL_TH_FN(glXBindTexImage)(GL_TH_DP, Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXBindTexImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glXBindTexImage(dpy, drawable, buffer, attrib_list);
+        ((GL_TH_FNTYPE(glXBindTexImage))orig_func)(dpy, drawable, buffer, attrib_list);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXBindTexImage thread_data_local;
-   Evas_Thread_Command_glXBindTexImage *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXBindTexImage) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->drawable = drawable;
    thread_data->buffer = buffer;
    thread_data->attrib_list = attrib_list;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXBindTexImage,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXBindTexImage),
                               thread_mode);
 }
 
@@ -80,48 +94,52 @@ glXBindTexImage_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer, const
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXChooseFBConfig) orig_func;
    GLXFBConfig * return_value;
    Display *dpy;
    int screen;
    const int *attribList;
    int *nitems;
 
-} Evas_Thread_Command_glXChooseFBConfig;
+} GL_TH_ST(glXChooseFBConfig);
 
 static void
-_gl_thread_glXChooseFBConfig(void *data)
+GL_TH_CB(glXChooseFBConfig)(void *data)
 {
-   Evas_Thread_Command_glXChooseFBConfig *thread_data =
-       (Evas_Thread_Command_glXChooseFBConfig *)data;
+   GL_TH_ST(glXChooseFBConfig) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXChooseFBConfig(thread_data->dpy,
-                                                 thread_data->screen,
-                                                 thread_data->attribList,
-                                                 thread_data->nitems);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->screen,
+                             thread_data->attribList,
+                             thread_data->nitems);
 
 }
 
-EAPI GLXFBConfig *
-glXChooseFBConfig_thread_cmd(Display *dpy, int screen, const int *attribList, int *nitems)
+GLXFBConfig *
+GL_TH_FN(glXChooseFBConfig)(GL_TH_DP, Display *dpy, int screen, const int *attribList, int *nitems)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXChooseFBConfig) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXChooseFBConfig(dpy, screen, attribList, nitems);
+        return ((GL_TH_FNTYPE(glXChooseFBConfig))orig_func)(dpy, screen, attribList, nitems);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXChooseFBConfig thread_data_local;
-   Evas_Thread_Command_glXChooseFBConfig *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXChooseFBConfig) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->screen = screen;
    thread_data->attribList = attribList;
    thread_data->nitems = nitems;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXChooseFBConfig,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXChooseFBConfig),
                               thread_mode);
 
    return thread_data->return_value;
@@ -134,48 +152,52 @@ glXChooseFBConfig_thread_cmd(Display *dpy, int screen, const int *attribList, in
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXCreateContext) orig_func;
    GLXContext return_value;
    Display *dpy;
    XVisualInfo *vis;
    GLXContext shareList;
    Bool direct;
 
-} Evas_Thread_Command_glXCreateContext;
+} GL_TH_ST(glXCreateContext);
 
 static void
-_gl_thread_glXCreateContext(void *data)
+GL_TH_CB(glXCreateContext)(void *data)
 {
-   Evas_Thread_Command_glXCreateContext *thread_data =
-       (Evas_Thread_Command_glXCreateContext *)data;
+   GL_TH_ST(glXCreateContext) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXCreateContext(thread_data->dpy,
-                                                thread_data->vis,
-                                                thread_data->shareList,
-                                                thread_data->direct);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->vis,
+                             thread_data->shareList,
+                             thread_data->direct);
 
 }
 
-EAPI GLXContext
-glXCreateContext_thread_cmd(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct)
+GLXContext
+GL_TH_FN(glXCreateContext)(GL_TH_DP, Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXCreateContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXCreateContext(dpy, vis, shareList, direct);
+        return ((GL_TH_FNTYPE(glXCreateContext))orig_func)(dpy, vis, shareList, direct);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXCreateContext thread_data_local;
-   Evas_Thread_Command_glXCreateContext *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXCreateContext) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->vis = vis;
    thread_data->shareList = shareList;
    thread_data->direct = direct;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXCreateContext,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXCreateContext),
                               thread_mode);
 
    return thread_data->return_value;
@@ -188,6 +210,7 @@ glXCreateContext_thread_cmd(Display *dpy, XVisualInfo *vis, GLXContext shareList
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXCreateNewContext) orig_func;
    GLXContext return_value;
    Display *dpy;
    GLXFBConfig config;
@@ -195,44 +218,47 @@ typedef struct
    GLXContext shareList;
    Bool direct;
 
-} Evas_Thread_Command_glXCreateNewContext;
+} GL_TH_ST(glXCreateNewContext);
 
 static void
-_gl_thread_glXCreateNewContext(void *data)
+GL_TH_CB(glXCreateNewContext)(void *data)
 {
-   Evas_Thread_Command_glXCreateNewContext *thread_data =
-       (Evas_Thread_Command_glXCreateNewContext *)data;
+   GL_TH_ST(glXCreateNewContext) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXCreateNewContext(thread_data->dpy,
-                                                   thread_data->config,
-                                                   thread_data->renderType,
-                                                   thread_data->shareList,
-                                                   thread_data->direct);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config,
+                             thread_data->renderType,
+                             thread_data->shareList,
+                             thread_data->direct);
 
 }
 
-EAPI GLXContext
-glXCreateNewContext_thread_cmd(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct)
+GLXContext
+GL_TH_FN(glXCreateNewContext)(GL_TH_DP, Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXCreateNewContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXCreateNewContext(dpy, config, renderType, shareList, direct);
+        return ((GL_TH_FNTYPE(glXCreateNewContext))orig_func)(dpy, config, renderType, shareList, direct);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXCreateNewContext thread_data_local;
-   Evas_Thread_Command_glXCreateNewContext *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXCreateNewContext) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
    thread_data->renderType = renderType;
    thread_data->shareList = shareList;
    thread_data->direct = direct;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXCreateNewContext,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXCreateNewContext),
                               thread_mode);
 
    return thread_data->return_value;
@@ -245,45 +271,49 @@ glXCreateNewContext_thread_cmd(Display *dpy, GLXFBConfig config, int renderType,
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXCreatePbuffer) orig_func;
    GLXPbuffer return_value;
    Display *dpy;
    GLXFBConfig config;
    const int *attribList;
 
-} Evas_Thread_Command_glXCreatePbuffer;
+} GL_TH_ST(glXCreatePbuffer);
 
 static void
-_gl_thread_glXCreatePbuffer(void *data)
+GL_TH_CB(glXCreatePbuffer)(void *data)
 {
-   Evas_Thread_Command_glXCreatePbuffer *thread_data =
-       (Evas_Thread_Command_glXCreatePbuffer *)data;
+   GL_TH_ST(glXCreatePbuffer) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXCreatePbuffer(thread_data->dpy,
-                                                thread_data->config,
-                                                thread_data->attribList);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config,
+                             thread_data->attribList);
 
 }
 
-EAPI GLXPbuffer
-glXCreatePbuffer_thread_cmd(Display *dpy, GLXFBConfig config, const int *attribList)
+GLXPbuffer
+GL_TH_FN(glXCreatePbuffer)(GL_TH_DP, Display *dpy, GLXFBConfig config, const int *attribList)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXCreatePbuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXCreatePbuffer(dpy, config, attribList);
+        return ((GL_TH_FNTYPE(glXCreatePbuffer))orig_func)(dpy, config, attribList);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXCreatePbuffer thread_data_local;
-   Evas_Thread_Command_glXCreatePbuffer *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXCreatePbuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
    thread_data->attribList = attribList;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXCreatePbuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXCreatePbuffer),
                               thread_mode);
 
    return thread_data->return_value;
@@ -296,63 +326,52 @@ glXCreatePbuffer_thread_cmd(Display *dpy, GLXFBConfig config, const int *attribL
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXCreatePixmap) orig_func;
    GLXPixmap return_value;
    Display *dpy;
    GLXFBConfig config;
    Pixmap pixmap;
    const int *attribList;
 
-} Evas_Thread_Command_glXCreatePixmap;
-
-GLXPixmap (*orig_evas_glXCreatePixmap)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-
-EAPI void
-glXCreatePixmap_orig_evas_set(void *func)
-{
-   orig_evas_glXCreatePixmap = func;
-}
-
-EAPI void *
-glXCreatePixmap_orig_evas_get(void)
-{
-   return orig_evas_glXCreatePixmap;
-}
-
+} GL_TH_ST(glXCreatePixmap);
 
 static void
-_gl_thread_glXCreatePixmap(void *data)
+GL_TH_CB(glXCreatePixmap)(void *data)
 {
-   Evas_Thread_Command_glXCreatePixmap *thread_data =
-       (Evas_Thread_Command_glXCreatePixmap *)data;
+   GL_TH_ST(glXCreatePixmap) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_glXCreatePixmap(thread_data->dpy,
-                                                         thread_data->config,
-                                                         thread_data->pixmap,
-                                                         thread_data->attribList);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config,
+                             thread_data->pixmap,
+                             thread_data->attribList);
 
 }
 
-EAPI GLXPixmap
-glXCreatePixmap_thread_cmd(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList)
+GLXPixmap
+GL_TH_FN(glXCreatePixmap)(GL_TH_DP, Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXCreatePixmap) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glXCreatePixmap(dpy, config, pixmap, attribList);
+        return ((GL_TH_FNTYPE(glXCreatePixmap))orig_func)(dpy, config, pixmap, attribList);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXCreatePixmap thread_data_local;
-   Evas_Thread_Command_glXCreatePixmap *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXCreatePixmap) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
    thread_data->pixmap = pixmap;
    thread_data->attribList = attribList;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXCreatePixmap,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXCreatePixmap),
                               thread_mode);
 
    return thread_data->return_value;
@@ -365,48 +384,52 @@ glXCreatePixmap_thread_cmd(Display *dpy, GLXFBConfig config, Pixmap pixmap, cons
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXCreateWindow) orig_func;
    GLXWindow return_value;
    Display *dpy;
    GLXFBConfig config;
    Window win;
    const int *attribList;
 
-} Evas_Thread_Command_glXCreateWindow;
+} GL_TH_ST(glXCreateWindow);
 
 static void
-_gl_thread_glXCreateWindow(void *data)
+GL_TH_CB(glXCreateWindow)(void *data)
 {
-   Evas_Thread_Command_glXCreateWindow *thread_data =
-       (Evas_Thread_Command_glXCreateWindow *)data;
+   GL_TH_ST(glXCreateWindow) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXCreateWindow(thread_data->dpy,
-                                               thread_data->config,
-                                               thread_data->win,
-                                               thread_data->attribList);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config,
+                             thread_data->win,
+                             thread_data->attribList);
 
 }
 
-EAPI GLXWindow
-glXCreateWindow_thread_cmd(Display *dpy, GLXFBConfig config, Window win, const int *attribList)
+GLXWindow
+GL_TH_FN(glXCreateWindow)(GL_TH_DP, Display *dpy, GLXFBConfig config, Window win, const int *attribList)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXCreateWindow) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXCreateWindow(dpy, config, win, attribList);
+        return ((GL_TH_FNTYPE(glXCreateWindow))orig_func)(dpy, config, win, attribList);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXCreateWindow thread_data_local;
-   Evas_Thread_Command_glXCreateWindow *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXCreateWindow) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
    thread_data->win = win;
    thread_data->attribList = attribList;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXCreateWindow,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXCreateWindow),
                               thread_mode);
 
    return thread_data->return_value;
@@ -419,42 +442,45 @@ glXCreateWindow_thread_cmd(Display *dpy, GLXFBConfig config, Window win, const i
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXDestroyPbuffer) orig_func;
    Display *dpy;
    GLXPbuffer pbuf;
 
-} Evas_Thread_Command_glXDestroyPbuffer;
+} GL_TH_ST(glXDestroyPbuffer);
 
 static void
-_gl_thread_glXDestroyPbuffer(void *data)
+GL_TH_CB(glXDestroyPbuffer)(void *data)
 {
-   Evas_Thread_Command_glXDestroyPbuffer *thread_data =
-       (Evas_Thread_Command_glXDestroyPbuffer *)data;
+   GL_TH_ST(glXDestroyPbuffer) *thread_data = *(void **)data;
 
-   glXDestroyPbuffer(thread_data->dpy,
-                     thread_data->pbuf);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->pbuf);
 
 }
 
-EAPI void
-glXDestroyPbuffer_thread_cmd(Display *dpy, GLXPbuffer pbuf)
+void
+GL_TH_FN(glXDestroyPbuffer)(GL_TH_DP, Display *dpy, GLXPbuffer pbuf)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXDestroyPbuffer) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glXDestroyPbuffer(dpy, pbuf);
+        ((GL_TH_FNTYPE(glXDestroyPbuffer))orig_func)(dpy, pbuf);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXDestroyPbuffer thread_data_local;
-   Evas_Thread_Command_glXDestroyPbuffer *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXDestroyPbuffer) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->pbuf = pbuf;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXDestroyPbuffer,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXDestroyPbuffer),
                               thread_mode);
 }
 
@@ -465,56 +491,45 @@ glXDestroyPbuffer_thread_cmd(Display *dpy, GLXPbuffer pbuf)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXDestroyPixmap) orig_func;
    Display *dpy;
    GLXPixmap pixmap;
 
-} Evas_Thread_Command_glXDestroyPixmap;
-
-void (*orig_evas_glXDestroyPixmap)(Display *dpy, GLXPixmap pixmap);
-
-EAPI void
-glXDestroyPixmap_orig_evas_set(void *func)
-{
-   orig_evas_glXDestroyPixmap = func;
-}
-
-EAPI void *
-glXDestroyPixmap_orig_evas_get(void)
-{
-   return orig_evas_glXDestroyPixmap;
-}
+} GL_TH_ST(glXDestroyPixmap);
 
 static void
-_gl_thread_glXDestroyPixmap(void *data)
+GL_TH_CB(glXDestroyPixmap)(void *data)
 {
-   Evas_Thread_Command_glXDestroyPixmap *thread_data =
-       (Evas_Thread_Command_glXDestroyPixmap *)data;
+   GL_TH_ST(glXDestroyPixmap) *thread_data = *(void **)data;
 
-   orig_evas_glXDestroyPixmap(thread_data->dpy,
-                              thread_data->pixmap);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->pixmap);
 
 }
 
-EAPI void
-glXDestroyPixmap_thread_cmd(Display *dpy, GLXPixmap pixmap)
+void
+GL_TH_FN(glXDestroyPixmap)(GL_TH_DP, Display *dpy, GLXPixmap pixmap)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXDestroyPixmap) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glXDestroyPixmap(dpy, pixmap);
+        ((GL_TH_FNTYPE(glXDestroyPixmap))orig_func)(dpy, pixmap);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXDestroyPixmap thread_data_local;
-   Evas_Thread_Command_glXDestroyPixmap *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXDestroyPixmap) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->pixmap = pixmap;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXDestroyPixmap,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXDestroyPixmap),
                               thread_mode);
 }
 
@@ -525,42 +540,45 @@ glXDestroyPixmap_thread_cmd(Display *dpy, GLXPixmap pixmap)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXDestroyWindow) orig_func;
    Display *dpy;
    GLXWindow window;
 
-} Evas_Thread_Command_glXDestroyWindow;
+} GL_TH_ST(glXDestroyWindow);
 
 static void
-_gl_thread_glXDestroyWindow(void *data)
+GL_TH_CB(glXDestroyWindow)(void *data)
 {
-   Evas_Thread_Command_glXDestroyWindow *thread_data =
-       (Evas_Thread_Command_glXDestroyWindow *)data;
+   GL_TH_ST(glXDestroyWindow) *thread_data = *(void **)data;
 
-   glXDestroyWindow(thread_data->dpy,
-                    thread_data->window);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->window);
 
 }
 
-EAPI void
-glXDestroyWindow_thread_cmd(Display *dpy, GLXWindow window)
+void
+GL_TH_FN(glXDestroyWindow)(GL_TH_DP, Display *dpy, GLXWindow window)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXDestroyWindow) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glXDestroyWindow(dpy, window);
+        ((GL_TH_FNTYPE(glXDestroyWindow))orig_func)(dpy, window);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXDestroyWindow thread_data_local;
-   Evas_Thread_Command_glXDestroyWindow *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXDestroyWindow) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->window = window;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXDestroyWindow,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXDestroyWindow),
                               thread_mode);
 }
 
@@ -571,48 +589,52 @@ glXDestroyWindow_thread_cmd(Display *dpy, GLXWindow window)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXGetConfig) orig_func;
    int return_value;
    Display *dpy;
    XVisualInfo *visual;
    int attrib;
    int *value;
 
-} Evas_Thread_Command_glXGetConfig;
+} GL_TH_ST(glXGetConfig);
 
 static void
-_gl_thread_glXGetConfig(void *data)
+GL_TH_CB(glXGetConfig)(void *data)
 {
-   Evas_Thread_Command_glXGetConfig *thread_data =
-       (Evas_Thread_Command_glXGetConfig *)data;
+   GL_TH_ST(glXGetConfig) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXGetConfig(thread_data->dpy,
-                                            thread_data->visual,
-                                            thread_data->attrib,
-                                            thread_data->value);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->visual,
+                             thread_data->attrib,
+                             thread_data->value);
 
 }
 
-EAPI int
-glXGetConfig_thread_cmd(Display *dpy, XVisualInfo *visual, int attrib, int *value)
+int
+GL_TH_FN(glXGetConfig)(GL_TH_DP, Display *dpy, XVisualInfo *visual, int attrib, int *value)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXGetConfig) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXGetConfig(dpy, visual, attrib, value);
+        return ((GL_TH_FNTYPE(glXGetConfig))orig_func)(dpy, visual, attrib, value);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXGetConfig thread_data_local;
-   Evas_Thread_Command_glXGetConfig *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXGetConfig) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->visual = visual;
    thread_data->attrib = attrib;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXGetConfig,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXGetConfig),
                               thread_mode);
 
    return thread_data->return_value;
@@ -625,48 +647,52 @@ glXGetConfig_thread_cmd(Display *dpy, XVisualInfo *visual, int attrib, int *valu
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXGetFBConfigAttrib) orig_func;
    int return_value;
    Display *dpy;
    GLXFBConfig config;
    int attribute;
    int *value;
 
-} Evas_Thread_Command_glXGetFBConfigAttrib;
+} GL_TH_ST(glXGetFBConfigAttrib);
 
 static void
-_gl_thread_glXGetFBConfigAttrib(void *data)
+GL_TH_CB(glXGetFBConfigAttrib)(void *data)
 {
-   Evas_Thread_Command_glXGetFBConfigAttrib *thread_data =
-       (Evas_Thread_Command_glXGetFBConfigAttrib *)data;
+   GL_TH_ST(glXGetFBConfigAttrib) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXGetFBConfigAttrib(thread_data->dpy,
-                                                    thread_data->config,
-                                                    thread_data->attribute,
-                                                    thread_data->value);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config,
+                             thread_data->attribute,
+                             thread_data->value);
 
 }
 
-EAPI int
-glXGetFBConfigAttrib_thread_cmd(Display *dpy, GLXFBConfig config, int attribute, int *value)
+int
+GL_TH_FN(glXGetFBConfigAttrib)(GL_TH_DP, Display *dpy, GLXFBConfig config, int attribute, int *value)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXGetFBConfigAttrib) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXGetFBConfigAttrib(dpy, config, attribute, value);
+        return ((GL_TH_FNTYPE(glXGetFBConfigAttrib))orig_func)(dpy, config, attribute, value);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXGetFBConfigAttrib thread_data_local;
-   Evas_Thread_Command_glXGetFBConfigAttrib *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXGetFBConfigAttrib) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
    thread_data->attribute = attribute;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXGetFBConfigAttrib,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXGetFBConfigAttrib),
                               thread_mode);
 
    return thread_data->return_value;
@@ -679,53 +705,43 @@ glXGetFBConfigAttrib_thread_cmd(Display *dpy, GLXFBConfig config, int attribute,
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXGetVideoSync) orig_func;
    int return_value;
    unsigned int *count;
 
-} Evas_Thread_Command_glXGetVideoSync;
-
-int (*orig_evas_glXGetVideoSync)(unsigned int *count);
-
-EAPI void
-glXGetVideoSync_orig_evas_set(void *func)
-{
-   orig_evas_glXGetVideoSync = func;
-}
-
-EAPI void *
-glXGetVideoSync_orig_evas_get(void)
-{
-   return orig_evas_glXGetVideoSync;
-}
+} GL_TH_ST(glXGetVideoSync);
 
 static void
-_gl_thread_glXGetVideoSync(void *data)
+GL_TH_CB(glXGetVideoSync)(void *data)
 {
-   Evas_Thread_Command_glXGetVideoSync *thread_data =
-       (Evas_Thread_Command_glXGetVideoSync *)data;
+   GL_TH_ST(glXGetVideoSync) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_glXGetVideoSync(thread_data->count);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->count);
 
 }
 
-EAPI int
-glXGetVideoSync_thread_cmd(unsigned int *count)
+int
+GL_TH_FN(glXGetVideoSync)(GL_TH_DP, unsigned int *count)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXGetVideoSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glXGetVideoSync(count);
+        return ((GL_TH_FNTYPE(glXGetVideoSync))orig_func)(count);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXGetVideoSync thread_data_local;
-   Evas_Thread_Command_glXGetVideoSync *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXGetVideoSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->count = count;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXGetVideoSync,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXGetVideoSync),
                               thread_mode);
 
    return thread_data->return_value;
@@ -738,42 +754,46 @@ glXGetVideoSync_thread_cmd(unsigned int *count)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXGetVisualFromFBConfig) orig_func;
    XVisualInfo * return_value;
    Display *dpy;
    GLXFBConfig config;
 
-} Evas_Thread_Command_glXGetVisualFromFBConfig;
+} GL_TH_ST(glXGetVisualFromFBConfig);
 
 static void
-_gl_thread_glXGetVisualFromFBConfig(void *data)
+GL_TH_CB(glXGetVisualFromFBConfig)(void *data)
 {
-   Evas_Thread_Command_glXGetVisualFromFBConfig *thread_data =
-       (Evas_Thread_Command_glXGetVisualFromFBConfig *)data;
+   GL_TH_ST(glXGetVisualFromFBConfig) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXGetVisualFromFBConfig(thread_data->dpy,
-                                                        thread_data->config);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->config);
 
 }
 
-EAPI XVisualInfo *
-glXGetVisualFromFBConfig_thread_cmd(Display *dpy, GLXFBConfig config)
+XVisualInfo *
+GL_TH_FN(glXGetVisualFromFBConfig)(GL_TH_DP, Display *dpy, GLXFBConfig config)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXGetVisualFromFBConfig) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXGetVisualFromFBConfig(dpy, config);
+        return ((GL_TH_FNTYPE(glXGetVisualFromFBConfig))orig_func)(dpy, config);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXGetVisualFromFBConfig thread_data_local;
-   Evas_Thread_Command_glXGetVisualFromFBConfig *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXGetVisualFromFBConfig) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->config = config;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXGetVisualFromFBConfig,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXGetVisualFromFBConfig),
                               thread_mode);
 
    return thread_data->return_value;
@@ -786,76 +806,207 @@ glXGetVisualFromFBConfig_thread_cmd(Display *dpy, GLXFBConfig config)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXMakeContextCurrent) orig_func;
    Bool return_value;
    Display *dpy;
    GLXDrawable draw;
    GLXDrawable read;
    GLXContext ctx;
 
-} Evas_Thread_Command_glXMakeContextCurrent;
+} GL_TH_ST(glXMakeContextCurrent);
 
 
+Display*    current_thread_dpy  = (Display*)0;
+GLXDrawable current_thread_draw = (GLXDrawable)0;
+GLXDrawable current_thread_read = (GLXDrawable)0;
 GLXContext  current_thread_ctx  = (GLXContext)0;
 
 static void
-_gl_thread_glXMakeContextCurrent(void *data)
+GL_TH_CB(glXMakeContextCurrent)(void *data)
 {
-   Evas_Thread_Command_glXMakeContextCurrent *thread_data =
-       (Evas_Thread_Command_glXMakeContextCurrent *)data;
+   GL_TH_ST(glXMakeContextCurrent) *thread_data = *(void **)data;
 
    DBG("THREAD >> OTHER THREAD MAKECONTEXTCURRENT : (%p, %p, %p, %p)\n",
            thread_data->dpy, (void *)thread_data->draw,
            (void* )thread_data->read, thread_data->ctx);
 
-   thread_data->return_value = glXMakeContextCurrent(thread_data->dpy,
-                                                     thread_data->draw,
-                                                     thread_data->read,
-                                                     thread_data->ctx);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->draw,
+                             thread_data->read,
+                             thread_data->ctx);
 
    if (thread_data->return_value)
-      current_thread_ctx = thread_data->ctx;
+     {
+        current_thread_dpy = thread_data->dpy;
+        current_thread_draw = thread_data->draw;
+        current_thread_read = thread_data->read;
+        current_thread_ctx = thread_data->ctx;
+     }
 
 }
 
-EAPI Bool
-glXMakeContextCurrent_thread_cmd(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
+Bool
+GL_TH_FN(glXMakeContextCurrent)(GL_TH_DP, Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXMakeContextCurrent) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXMakeContextCurrent(dpy, draw, read, ctx);
+        return ((GL_TH_FNTYPE(glXMakeContextCurrent))orig_func)(dpy, draw, read, ctx);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   /* Skip for noop make-current */
+   if (current_thread_dpy == dpy &&
+       current_thread_draw == draw &&
+       current_thread_read == read &&
+       current_thread_ctx == ctx)
+      return EGL_TRUE;
 
-   Evas_Thread_Command_glXMakeContextCurrent thread_data_local;
-   Evas_Thread_Command_glXMakeContextCurrent *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXMakeContextCurrent) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->draw = draw;
    thread_data->read = read;
    thread_data->ctx = ctx;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXMakeContextCurrent,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXMakeContextCurrent),
                               thread_mode);
 
    return thread_data->return_value;
 }
 
+
+/*
+   Bool
+   glXMakeContextCurrentASYNC(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+ */
+
+typedef struct
+{
+   GL_TH_FNTYPE(glXMakeContextCurrent) orig_func;
+   int thread_type;
+   Bool return_value;
+   Eina_Bool finished;
+
+   Display *dpy;
+   GLXDrawable draw;
+   GLXDrawable read;
+   GLXContext ctx;
+
+} GL_TH_ST(glXMakeContextCurrentASYNC);
+
+
+static void
+GL_TH_CB(glXMakeContextCurrentASYNC)(void *data)
+{
+   GL_TH_ST(glXMakeContextCurrentASYNC) *thread_data = *(void **)data;
+
+   DBG("THREAD >> OTHER THREAD MAKECONTEXTCURRENT(ASYNC) : (%p, %p, %p, %p)\n",
+           thread_data->dpy, (void *)thread_data->draw,
+           (void* )thread_data->read, thread_data->ctx);
+
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->draw,
+                             thread_data->read,
+                             thread_data->ctx);
+
+   if (thread_data->return_value)
+     {
+        current_thread_dpy = thread_data->dpy;
+        current_thread_draw = thread_data->draw;
+        current_thread_read = thread_data->read;
+        current_thread_ctx = thread_data->ctx;
+     }
+
+   thread_data->finished = EINA_TRUE;
+
+}
+
+void *
+GL_TH_FN(glXMakeContextCurrentASYNC_begin)(GL_TH_DP, Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
+{
+   GL_TH_ST(glXMakeContextCurrentASYNC) *thread_data, **thread_data_ptr;
+   void *thcmd_ref;
+
+   thread_data = eina_mempool_malloc(_mp_command,
+                                     sizeof(GL_TH_ST(glXMakeContextCurrentASYNC)));
+   if (!thread_data)
+      return NULL;
+
+   if (!evas_gl_thread_enabled(thread_type))
+     {
+        thread_data->return_value = ((GL_TH_FNTYPE(glXMakeContextCurrent))orig_func)(dpy, draw, read, ctx);
+        thread_data->finished = EINA_TRUE;
+        return thread_data;
+     }
+
+   /* Skip for noop make-current */
+   if (current_thread_dpy == dpy &&
+       current_thread_draw == draw &&
+       current_thread_read == read &&
+       current_thread_ctx == ctx)
+     {
+        thread_data->return_value = True;
+        thread_data->finished = EINA_TRUE;
+        return thread_data;
+     }
+
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXMakeContextCurrentASYNC) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->dpy = dpy;
+   thread_data->draw = draw;
+   thread_data->read = read;
+   thread_data->ctx = ctx;
+   thread_data->finished = EINA_FALSE;
+   thread_data->thread_type = thread_type;
+   thread_data->orig_func = orig_func;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXMakeContextCurrentASYNC),
+                              EVAS_GL_THREAD_MODE_ASYNC_FINISH);
+
+   return thread_data;
+}
+
+Bool
+GL_TH_FN(glXMakeContextCurrentASYNC_end)(void *ref)
+{
+   GL_TH_ST(glXMakeContextCurrentASYNC) *thread_data = (GL_TH_ST(glXMakeContextCurrentASYNC) *)ref;
+
+   if (!thread_data->finished)
+      evas_gl_thread_cmd_wait(thread_data->thread_type, thread_data, &thread_data->finished);
+
+   Bool return_value = thread_data->return_value;
+   eina_mempool_free(_mp_command, thread_data);
+
+   return return_value;
+}
+
+
 /*
    GLXContext
    glXGetCurrentContext(void);
  */
 
-EAPI GLXContext
-glXGetCurrentContext_thread_cmd(void)
+GLXContext
+GL_TH_FN(glXGetCurrentContext)(int thread_type EINA_UNUSED, void *orig_func EINA_UNUSED)
 {
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXGetCurrentContext();
+        return ((GL_TH_FNTYPE(glXGetCurrentContext))orig_func)();
      }
 
+   /* Current context is completely tracked by this variable */
    return current_thread_ctx;
 }
 
@@ -866,110 +1017,105 @@ glXGetCurrentContext_thread_cmd(void)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXDestroyContext) orig_func;
    Display *dpy;
    GLXContext ctx;
 
-} Evas_Thread_Command_glXDestroyContext;
+} GL_TH_ST(glXDestroyContext);
 
 static void
-_gl_thread_glXDestroyContext(void *data)
+GL_TH_CB(glXDestroyContext)(void *data)
 {
-   Evas_Thread_Command_glXDestroyContext *thread_data =
-       (Evas_Thread_Command_glXDestroyContext *)data;
+   GL_TH_ST(glXDestroyContext) *thread_data = *(void **)data;
 
-   glXDestroyContext(thread_data->dpy,
-                     thread_data->ctx);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->ctx);
 
 }
 
-EAPI void
-glXDestroyContext_thread_cmd(Display *dpy, GLXContext ctx)
+void
+GL_TH_FN(glXDestroyContext)(GL_TH_DP, Display *dpy, GLXContext ctx)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXDestroyContext) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glXDestroyContext(dpy, ctx);
+        ((GL_TH_FNTYPE(glXDestroyContext))orig_func)(dpy, ctx);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXDestroyContext thread_data_local;
-   Evas_Thread_Command_glXDestroyContext *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXDestroyContext) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->ctx = ctx;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXDestroyContext,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXDestroyContext),
                               thread_mode);
 }
 
 
 /*
-   void
+   int
    glXQueryDrawable(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
  */
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXQueryDrawable) orig_func;
+   int return_value;
    Display *dpy;
    GLXDrawable draw;
    int attribute;
    unsigned int *value;
 
-} Evas_Thread_Command_glXQueryDrawable;
-
-void (*orig_evas_glXQueryDrawable)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-
-EAPI void
-glXQueryDrawable_orig_evas_set(void *func)
-{
-   orig_evas_glXQueryDrawable = func;
-}
-
-EAPI void *
-glXQueryDrawable_orig_evas_get(void)
-{
-   return orig_evas_glXQueryDrawable;
-}
+} GL_TH_ST(glXQueryDrawable);
 
 static void
-_gl_thread_glXQueryDrawable(void *data)
+GL_TH_CB(glXQueryDrawable)(void *data)
 {
-   Evas_Thread_Command_glXQueryDrawable *thread_data =
-       (Evas_Thread_Command_glXQueryDrawable *)data;
+   GL_TH_ST(glXQueryDrawable) *thread_data = *(void **)data;
 
-   orig_evas_glXQueryDrawable(thread_data->dpy,
-                              thread_data->draw,
-                              thread_data->attribute,
-                              thread_data->value);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->draw,
+                             thread_data->attribute,
+                             thread_data->value);
 
 }
 
-EAPI void
-glXQueryDrawable_thread_cmd(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)
+int
+GL_TH_FN(glXQueryDrawable)(GL_TH_DP, Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXQueryDrawable) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glXQueryDrawable(dpy, draw, attribute, value);
-        return;
+        return ((GL_TH_FNTYPE(glXQueryDrawable))orig_func)(dpy, draw, attribute, value);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXQueryDrawable thread_data_local;
-   Evas_Thread_Command_glXQueryDrawable *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXQueryDrawable) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->draw = draw;
    thread_data->attribute = attribute;
    thread_data->value = value;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXQueryDrawable,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXQueryDrawable),
                               thread_mode);
+
+   return thread_data->return_value;
 }
 
 /*
@@ -979,45 +1125,49 @@ glXQueryDrawable_thread_cmd(Display *dpy, GLXDrawable draw, int attribute, unsig
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXQueryExtension) orig_func;
    Bool return_value;
    Display *dpy;
    int *errorb;
    int *event;
 
-} Evas_Thread_Command_glXQueryExtension;
+} GL_TH_ST(glXQueryExtension);
 
 static void
-_gl_thread_glXQueryExtension(void *data)
+GL_TH_CB(glXQueryExtension)(void *data)
 {
-   Evas_Thread_Command_glXQueryExtension *thread_data =
-       (Evas_Thread_Command_glXQueryExtension *)data;
+   GL_TH_ST(glXQueryExtension) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXQueryExtension(thread_data->dpy,
-                                                 thread_data->errorb,
-                                                 thread_data->event);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->errorb,
+                             thread_data->event);
 
 }
 
-EAPI Bool
-glXQueryExtension_thread_cmd(Display *dpy, int *errorb, int *event)
+Bool
+GL_TH_FN(glXQueryExtension)(GL_TH_DP, Display *dpy, int *errorb, int *event)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXQueryExtension) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXQueryExtension(dpy, errorb, event);
+        return ((GL_TH_FNTYPE(glXQueryExtension))orig_func)(dpy, errorb, event);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXQueryExtension thread_data_local;
-   Evas_Thread_Command_glXQueryExtension *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXQueryExtension) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->errorb = errorb;
    thread_data->event = event;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXQueryExtension,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXQueryExtension),
                               thread_mode);
 
    return thread_data->return_value;
@@ -1030,42 +1180,46 @@ glXQueryExtension_thread_cmd(Display *dpy, int *errorb, int *event)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXQueryExtensionsString) orig_func;
    const char * return_value;
    Display *dpy;
    int screen;
 
-} Evas_Thread_Command_glXQueryExtensionsString;
+} GL_TH_ST(glXQueryExtensionsString);
 
 static void
-_gl_thread_glXQueryExtensionsString(void *data)
+GL_TH_CB(glXQueryExtensionsString)(void *data)
 {
-   Evas_Thread_Command_glXQueryExtensionsString *thread_data =
-       (Evas_Thread_Command_glXQueryExtensionsString *)data;
+   GL_TH_ST(glXQueryExtensionsString) *thread_data = *(void **)data;
 
-   thread_data->return_value = glXQueryExtensionsString(thread_data->dpy,
-                                                        thread_data->screen);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->screen);
 
 }
 
-EAPI const char *
-glXQueryExtensionsString_thread_cmd(Display *dpy, int screen)
+const char *
+GL_TH_FN(glXQueryExtensionsString)(GL_TH_DP, Display *dpy, int screen)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXQueryExtensionsString) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return glXQueryExtensionsString(dpy, screen);
+        return ((GL_TH_FNTYPE(glXQueryExtensionsString))orig_func)(dpy, screen);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXQueryExtensionsString thread_data_local;
-   Evas_Thread_Command_glXQueryExtensionsString *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXQueryExtensionsString) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->screen = screen;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXQueryExtensionsString,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXQueryExtensionsString),
                               thread_mode);
 
    return thread_data->return_value;
@@ -1078,56 +1232,46 @@ glXQueryExtensionsString_thread_cmd(Display *dpy, int screen)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXReleaseBuffersMESA) orig_func;
    Bool return_value;
    Display *dpy;
    GLXDrawable drawable;
 
-} Evas_Thread_Command_glXReleaseBuffersMESA;
-
-Bool (*orig_evas_glXReleaseBuffersMESA)(Display *dpy, GLXDrawable drawable);
-
-EAPI void
-glXReleaseBuffersMESA_orig_evas_set(void *func)
-{
-   orig_evas_glXReleaseBuffersMESA = func;
-}
-
-EAPI void *
-glXReleaseBuffersMESA_orig_evas_get(void)
-{
-   return orig_evas_glXReleaseBuffersMESA;
-}
+} GL_TH_ST(glXReleaseBuffersMESA);
 
 static void
-_gl_thread_glXReleaseBuffersMESA(void *data)
+GL_TH_CB(glXReleaseBuffersMESA)(void *data)
 {
-   Evas_Thread_Command_glXReleaseBuffersMESA *thread_data =
-       (Evas_Thread_Command_glXReleaseBuffersMESA *)data;
+   GL_TH_ST(glXReleaseBuffersMESA) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_glXReleaseBuffersMESA(thread_data->dpy,
-                                                               thread_data->drawable);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->dpy,
+                             thread_data->drawable);
 
 }
 
-EAPI Bool
-glXReleaseBuffersMESA_thread_cmd(Display *dpy, GLXDrawable drawable)
+Bool
+GL_TH_FN(glXReleaseBuffersMESA)(GL_TH_DP, Display *dpy, GLXDrawable drawable)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXReleaseBuffersMESA) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glXReleaseBuffersMESA(dpy, drawable);
+        return ((GL_TH_FNTYPE(glXReleaseBuffersMESA))orig_func)(dpy, drawable);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXReleaseBuffersMESA thread_data_local;
-   Evas_Thread_Command_glXReleaseBuffersMESA *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXReleaseBuffersMESA) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->drawable = drawable;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXReleaseBuffersMESA,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXReleaseBuffersMESA),
                               thread_mode);
 
    return thread_data->return_value;
@@ -1140,59 +1284,48 @@ glXReleaseBuffersMESA_thread_cmd(Display *dpy, GLXDrawable drawable)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXReleaseTexImage) orig_func;
    Display *dpy;
    GLXDrawable drawable;
    int buffer;
 
-} Evas_Thread_Command_glXReleaseTexImage;
-
-void (*orig_evas_glXReleaseTexImage)(Display *dpy, GLXDrawable drawable, int buffer);
-
-EAPI void
-glXReleaseTexImage_orig_evas_set(void *func)
-{
-   orig_evas_glXReleaseTexImage = func;
-}
-
-EAPI void *
-glXReleaseTexImage_orig_evas_get(void)
-{
-   return orig_evas_glXReleaseTexImage;
-}
+} GL_TH_ST(glXReleaseTexImage);
 
 static void
-_gl_thread_glXReleaseTexImage(void *data)
+GL_TH_CB(glXReleaseTexImage)(void *data)
 {
-   Evas_Thread_Command_glXReleaseTexImage *thread_data =
-       (Evas_Thread_Command_glXReleaseTexImage *)data;
+   GL_TH_ST(glXReleaseTexImage) *thread_data = *(void **)data;
 
-   orig_evas_glXReleaseTexImage(thread_data->dpy,
-                                thread_data->drawable,
-                                thread_data->buffer);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->drawable,
+                          thread_data->buffer);
 
 }
 
-EAPI void
-glXReleaseTexImage_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer)
+void
+GL_TH_FN(glXReleaseTexImage)(GL_TH_DP, Display *dpy, GLXDrawable drawable, int buffer)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXReleaseTexImage) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glXReleaseTexImage(dpy, drawable, buffer);
+        ((GL_TH_FNTYPE(glXReleaseTexImage))orig_func)(dpy, drawable, buffer);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXReleaseTexImage thread_data_local;
-   Evas_Thread_Command_glXReleaseTexImage *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXReleaseTexImage) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->drawable = drawable;
    thread_data->buffer = buffer;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXReleaseTexImage,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXReleaseTexImage),
                               thread_mode);
 }
 
@@ -1203,42 +1336,45 @@ glXReleaseTexImage_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXSwapBuffers) orig_func;
    Display *dpy;
    GLXDrawable drawable;
 
-} Evas_Thread_Command_glXSwapBuffers;
+} GL_TH_ST(glXSwapBuffers);
 
 static void
-_gl_thread_glXSwapBuffers(void *data)
+GL_TH_CB(glXSwapBuffers)(void *data)
 {
-   Evas_Thread_Command_glXSwapBuffers *thread_data =
-       (Evas_Thread_Command_glXSwapBuffers *)data;
+   GL_TH_ST(glXSwapBuffers) *thread_data = *(void **)data;
 
-   glXSwapBuffers(thread_data->dpy,
-                  thread_data->drawable);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->drawable);
 
 }
 
-EAPI void
-glXSwapBuffers_thread_cmd(Display *dpy, GLXDrawable drawable)
+void
+GL_TH_FN(glXSwapBuffers)(GL_TH_DP, Display *dpy, GLXDrawable drawable)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXSwapBuffers) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        glXSwapBuffers(dpy, drawable);
+        ((GL_TH_FNTYPE(glXSwapBuffers))orig_func)(dpy, drawable);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXSwapBuffers thread_data_local;
-   Evas_Thread_Command_glXSwapBuffers *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXSwapBuffers) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->drawable = drawable;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXSwapBuffers,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXSwapBuffers),
                               thread_mode);
 }
 
@@ -1249,59 +1385,48 @@ glXSwapBuffers_thread_cmd(Display *dpy, GLXDrawable drawable)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXSwapIntervalEXT) orig_func;
    Display *dpy;
    GLXDrawable drawable;
    int interval;
 
-} Evas_Thread_Command_glXSwapIntervalEXT;
-
-void (*orig_evas_glXSwapIntervalEXT)(Display *dpy, GLXDrawable drawable, int interval);
-
-EAPI void
-glXSwapIntervalEXT_orig_evas_set(void *func)
-{
-   orig_evas_glXSwapIntervalEXT = func;
-}
-
-EAPI void *
-glXSwapIntervalEXT_orig_evas_get(void)
-{
-   return orig_evas_glXSwapIntervalEXT;
-}
+} GL_TH_ST(glXSwapIntervalEXT);
 
 static void
-_gl_thread_glXSwapIntervalEXT(void *data)
+GL_TH_CB(glXSwapIntervalEXT)(void *data)
 {
-   Evas_Thread_Command_glXSwapIntervalEXT *thread_data =
-       (Evas_Thread_Command_glXSwapIntervalEXT *)data;
+   GL_TH_ST(glXSwapIntervalEXT) *thread_data = *(void **)data;
 
-   orig_evas_glXSwapIntervalEXT(thread_data->dpy,
-                                thread_data->drawable,
-                                thread_data->interval);
+   thread_data->orig_func(thread_data->dpy,
+                          thread_data->drawable,
+                          thread_data->interval);
 
 }
 
-EAPI void
-glXSwapIntervalEXT_thread_cmd(Display *dpy, GLXDrawable drawable, int interval)
+void
+GL_TH_FN(glXSwapIntervalEXT)(GL_TH_DP, Display *dpy, GLXDrawable drawable, int interval)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXSwapIntervalEXT) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        orig_evas_glXSwapIntervalEXT(dpy, drawable, interval);
+        ((GL_TH_FNTYPE(glXSwapIntervalEXT))orig_func)(dpy, drawable, interval);
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXSwapIntervalEXT thread_data_local;
-   Evas_Thread_Command_glXSwapIntervalEXT *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXSwapIntervalEXT) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->dpy = dpy;
    thread_data->drawable = drawable;
    thread_data->interval = interval;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXSwapIntervalEXT,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXSwapIntervalEXT),
                               thread_mode);
 }
 
@@ -1312,53 +1437,43 @@ glXSwapIntervalEXT_thread_cmd(Display *dpy, GLXDrawable drawable, int interval)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXSwapIntervalSGI) orig_func;
    int return_value;
    int interval;
 
-} Evas_Thread_Command_glXSwapIntervalSGI;
-
-int (*orig_evas_glXSwapIntervalSGI)(int interval);
-
-EAPI void
-glXSwapIntervalSGI_orig_evas_set(void *func)
-{
-   orig_evas_glXSwapIntervalSGI = func;
-}
-
-EAPI void *
-glXSwapIntervalSGI_orig_evas_get(void)
-{
-   return orig_evas_glXSwapIntervalSGI;
-}
+} GL_TH_ST(glXSwapIntervalSGI);
 
 static void
-_gl_thread_glXSwapIntervalSGI(void *data)
+GL_TH_CB(glXSwapIntervalSGI)(void *data)
 {
-   Evas_Thread_Command_glXSwapIntervalSGI *thread_data =
-       (Evas_Thread_Command_glXSwapIntervalSGI *)data;
+   GL_TH_ST(glXSwapIntervalSGI) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_glXSwapIntervalSGI(thread_data->interval);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->interval);
 
 }
 
-EAPI int
-glXSwapIntervalSGI_thread_cmd(int interval)
+int
+GL_TH_FN(glXSwapIntervalSGI)(GL_TH_DP, int interval)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXSwapIntervalSGI) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glXSwapIntervalSGI(interval);
+        return ((GL_TH_FNTYPE(glXSwapIntervalSGI))orig_func)(interval);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXSwapIntervalSGI thread_data_local;
-   Evas_Thread_Command_glXSwapIntervalSGI *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXSwapIntervalSGI) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->interval = interval;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXSwapIntervalSGI,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXSwapIntervalSGI),
                               thread_mode);
 
    return thread_data->return_value;
@@ -1371,1693 +1486,133 @@ glXSwapIntervalSGI_thread_cmd(int interval)
 
 typedef struct
 {
+   GL_TH_FNTYPE(glXWaitVideoSync) orig_func;
    int return_value;
    int divisor;
    int remainder;
    unsigned int *count;
 
-} Evas_Thread_Command_glXWaitVideoSync;
-
-int (*orig_evas_glXWaitVideoSync)(int divisor, int remainder, unsigned int *count);
-
-EAPI void
-glXWaitVideoSync_orig_evas_set(void *func)
-{
-   orig_evas_glXWaitVideoSync = func;
-}
-
-EAPI void *
-glXWaitVideoSync_orig_evas_get(void)
-{
-   return orig_evas_glXWaitVideoSync;
-}
+} GL_TH_ST(glXWaitVideoSync);
 
 static void
-_gl_thread_glXWaitVideoSync(void *data)
+GL_TH_CB(glXWaitVideoSync)(void *data)
 {
-   Evas_Thread_Command_glXWaitVideoSync *thread_data =
-       (Evas_Thread_Command_glXWaitVideoSync *)data;
+   GL_TH_ST(glXWaitVideoSync) *thread_data = *(void **)data;
 
-   thread_data->return_value = orig_evas_glXWaitVideoSync(thread_data->divisor,
-                                                          thread_data->remainder,
-                                                          thread_data->count);
+   thread_data->return_value =
+      thread_data->orig_func(thread_data->divisor,
+                             thread_data->remainder,
+                             thread_data->count);
 
 }
 
-EAPI int
-glXWaitVideoSync_thread_cmd(int divisor, int remainder, unsigned int *count)
+int
+GL_TH_FN(glXWaitVideoSync)(GL_TH_DP, int divisor, int remainder, unsigned int *count)
 {
-   if (!evas_gl_thread_enabled())
+   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+   GL_TH_ST(glXWaitVideoSync) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(thread_type))
      {
-        return orig_evas_glXWaitVideoSync(divisor, remainder, count);
+        return ((GL_TH_FNTYPE(glXWaitVideoSync))orig_func)(divisor, remainder, count);
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   Evas_Thread_Command_glXWaitVideoSync thread_data_local;
-   Evas_Thread_Command_glXWaitVideoSync *thread_data = &thread_data_local;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(glXWaitVideoSync) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
 
    thread_data->divisor = divisor;
    thread_data->remainder = remainder;
    thread_data->count = count;
+   thread_data->orig_func = orig_func;
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_glXWaitVideoSync,
-                              thread_data,
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(glXWaitVideoSync),
                               thread_mode);
 
    return thread_data->return_value;
 }
 
-/****** EVAS GL ******/
-/*
-   void
-   glXBindTexImage(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
- */
 
-typedef struct
-{
-   Display *dpy;
-   GLXDrawable drawable;
-   int buffer;
-   const int *attrib_list;
-
-} EVGL_Thread_Command_glXBindTexImage;
-
-void (*orig_evgl_glXBindTexImage)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-
-void
-glXBindTexImage_orig_evgl_set(void *func)
-{
-   orig_evgl_glXBindTexImage = func;
-}
-
-void *
-glXBindTexImage_orig_evgl_get(void)
-{
-   return orig_evgl_glXBindTexImage;
-}
-
-static void
-_evgl_thread_glXBindTexImage(void *data)
-{
-   EVGL_Thread_Command_glXBindTexImage *thread_data =
-       (EVGL_Thread_Command_glXBindTexImage *)data;
-
-   orig_evgl_glXBindTexImage(thread_data->dpy,
-                             thread_data->drawable,
-                             thread_data->buffer,
-                             thread_data->attrib_list);
-
-}
-
-EAPI void
-glXBindTexImage_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glXBindTexImage(dpy, drawable, buffer, attrib_list);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXBindTexImage thread_data_local;
-   EVGL_Thread_Command_glXBindTexImage *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->drawable = drawable;
-   thread_data->buffer = buffer;
-   thread_data->attrib_list = attrib_list;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXBindTexImage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   GLXFBConfig *
-   glXChooseFBConfig(Display *dpy, int screen, const int *attribList, int *nitems);
- */
-
-typedef struct
-{
-   GLXFBConfig * return_value;
-   Display *dpy;
-   int screen;
-   const int *attribList;
-   int *nitems;
-
-} EVGL_Thread_Command_glXChooseFBConfig;
-
-static void
-_evgl_thread_glXChooseFBConfig(void *data)
-{
-   EVGL_Thread_Command_glXChooseFBConfig *thread_data =
-       (EVGL_Thread_Command_glXChooseFBConfig *)data;
-
-   thread_data->return_value = glXChooseFBConfig(thread_data->dpy,
-                                                 thread_data->screen,
-                                                 thread_data->attribList,
-                                                 thread_data->nitems);
-
-}
-
-EAPI GLXFBConfig *
-glXChooseFBConfig_evgl_thread_cmd(Display *dpy, int screen, const int *attribList, int *nitems)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXChooseFBConfig(dpy, screen, attribList, nitems);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXChooseFBConfig thread_data_local;
-   EVGL_Thread_Command_glXChooseFBConfig *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->screen = screen;
-   thread_data->attribList = attribList;
-   thread_data->nitems = nitems;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXChooseFBConfig,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXContext
-   glXCreateContext(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
- */
-
-typedef struct
-{
-   GLXContext return_value;
-   Display *dpy;
-   XVisualInfo *vis;
-   GLXContext shareList;
-   Bool direct;
-
-} EVGL_Thread_Command_glXCreateContext;
-
-static void
-_evgl_thread_glXCreateContext(void *data)
-{
-   EVGL_Thread_Command_glXCreateContext *thread_data =
-       (EVGL_Thread_Command_glXCreateContext *)data;
-
-   thread_data->return_value = glXCreateContext(thread_data->dpy,
-                                                thread_data->vis,
-                                                thread_data->shareList,
-                                                thread_data->direct);
-
-}
-
-EAPI GLXContext
-glXCreateContext_evgl_thread_cmd(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXCreateContext(dpy, vis, shareList, direct);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXCreateContext thread_data_local;
-   EVGL_Thread_Command_glXCreateContext *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->vis = vis;
-   thread_data->shareList = shareList;
-   thread_data->direct = direct;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXCreateContext,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXContext
-   glXCreateNewContext(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
- */
-
-typedef struct
-{
-   GLXContext return_value;
-   Display *dpy;
-   GLXFBConfig config;
-   int renderType;
-   GLXContext shareList;
-   Bool direct;
-
-} EVGL_Thread_Command_glXCreateNewContext;
-
-static void
-_evgl_thread_glXCreateNewContext(void *data)
-{
-   EVGL_Thread_Command_glXCreateNewContext *thread_data =
-       (EVGL_Thread_Command_glXCreateNewContext *)data;
-
-   thread_data->return_value = glXCreateNewContext(thread_data->dpy,
-                                                   thread_data->config,
-                                                   thread_data->renderType,
-                                                   thread_data->shareList,
-                                                   thread_data->direct);
-
-}
-
-EAPI GLXContext
-glXCreateNewContext_evgl_thread_cmd(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXCreateNewContext(dpy, config, renderType, shareList, direct);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXCreateNewContext thread_data_local;
-   EVGL_Thread_Command_glXCreateNewContext *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-   thread_data->renderType = renderType;
-   thread_data->shareList = shareList;
-   thread_data->direct = direct;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXCreateNewContext,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXPbuffer
-   glXCreatePbuffer(Display *dpy, GLXFBConfig config, const int *attribList);
- */
-
-typedef struct
-{
-   GLXPbuffer return_value;
-   Display *dpy;
-   GLXFBConfig config;
-   const int *attribList;
-
-} EVGL_Thread_Command_glXCreatePbuffer;
-
-static void
-_evgl_thread_glXCreatePbuffer(void *data)
-{
-   EVGL_Thread_Command_glXCreatePbuffer *thread_data =
-       (EVGL_Thread_Command_glXCreatePbuffer *)data;
-
-   thread_data->return_value = glXCreatePbuffer(thread_data->dpy,
-                                                thread_data->config,
-                                                thread_data->attribList);
-
-}
-
-EAPI GLXPbuffer
-glXCreatePbuffer_evgl_thread_cmd(Display *dpy, GLXFBConfig config, const int *attribList)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXCreatePbuffer(dpy, config, attribList);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXCreatePbuffer thread_data_local;
-   EVGL_Thread_Command_glXCreatePbuffer *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-   thread_data->attribList = attribList;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXCreatePbuffer,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXPixmap
-   glXCreatePixmap(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
- */
-
-typedef struct
-{
-   GLXPixmap return_value;
-   Display *dpy;
-   GLXFBConfig config;
-   Pixmap pixmap;
-   const int *attribList;
-
-} EVGL_Thread_Command_glXCreatePixmap;
-
-GLXPixmap (*orig_evgl_glXCreatePixmap)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-
-void
-glXCreatePixmap_orig_evgl_set(void *func)
-{
-   orig_evgl_glXCreatePixmap = func;
-}
-
-void *
-glXCreatePixmap_orig_evgl_get(void)
-{
-   return orig_evgl_glXCreatePixmap;
-}
-
-static void
-_evgl_thread_glXCreatePixmap(void *data)
-{
-   EVGL_Thread_Command_glXCreatePixmap *thread_data =
-       (EVGL_Thread_Command_glXCreatePixmap *)data;
-
-   thread_data->return_value = orig_evgl_glXCreatePixmap(thread_data->dpy,
-                                                         thread_data->config,
-                                                         thread_data->pixmap,
-                                                         thread_data->attribList);
-
-}
-
-EAPI GLXPixmap
-glXCreatePixmap_evgl_thread_cmd(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return orig_evgl_glXCreatePixmap(dpy, config, pixmap, attribList);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXCreatePixmap thread_data_local;
-   EVGL_Thread_Command_glXCreatePixmap *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-   thread_data->pixmap = pixmap;
-   thread_data->attribList = attribList;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXCreatePixmap,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXWindow
-   glXCreateWindow(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
- */
-
-typedef struct
-{
-   GLXWindow return_value;
-   Display *dpy;
-   GLXFBConfig config;
-   Window win;
-   const int *attribList;
-
-} EVGL_Thread_Command_glXCreateWindow;
-
-static void
-_evgl_thread_glXCreateWindow(void *data)
-{
-   EVGL_Thread_Command_glXCreateWindow *thread_data =
-       (EVGL_Thread_Command_glXCreateWindow *)data;
-
-   thread_data->return_value = glXCreateWindow(thread_data->dpy,
-                                               thread_data->config,
-                                               thread_data->win,
-                                               thread_data->attribList);
-
-}
-
-EAPI GLXWindow
-glXCreateWindow_evgl_thread_cmd(Display *dpy, GLXFBConfig config, Window win, const int *attribList)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXCreateWindow(dpy, config, win, attribList);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXCreateWindow thread_data_local;
-   EVGL_Thread_Command_glXCreateWindow *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-   thread_data->win = win;
-   thread_data->attribList = attribList;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXCreateWindow,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   void
-   glXDestroyContext(Display *dpy, GLXContext ctx);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXContext ctx;
-
-} EVGL_Thread_Command_glXDestroyContext;
-
-static void
-_evgl_thread_glXDestroyContext(void *data)
-{
-   EVGL_Thread_Command_glXDestroyContext *thread_data =
-       (EVGL_Thread_Command_glXDestroyContext *)data;
-
-   glXDestroyContext(thread_data->dpy,
-                     thread_data->ctx);
-
-}
-
-EAPI void
-glXDestroyContext_evgl_thread_cmd(Display *dpy, GLXContext ctx)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glXDestroyContext(dpy, ctx);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXDestroyContext thread_data_local;
-   EVGL_Thread_Command_glXDestroyContext *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->ctx = ctx;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXDestroyContext,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   void
-   glXDestroyPbuffer(Display *dpy, GLXPbuffer pbuf);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXPbuffer pbuf;
-
-} EVGL_Thread_Command_glXDestroyPbuffer;
-
-static void
-_evgl_thread_glXDestroyPbuffer(void *data)
-{
-   EVGL_Thread_Command_glXDestroyPbuffer *thread_data =
-       (EVGL_Thread_Command_glXDestroyPbuffer *)data;
-
-   glXDestroyPbuffer(thread_data->dpy,
-                     thread_data->pbuf);
-
-}
-
-EAPI void
-glXDestroyPbuffer_evgl_thread_cmd(Display *dpy, GLXPbuffer pbuf)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glXDestroyPbuffer(dpy, pbuf);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXDestroyPbuffer thread_data_local;
-   EVGL_Thread_Command_glXDestroyPbuffer *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->pbuf = pbuf;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXDestroyPbuffer,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   void
-   glXDestroyPixmap(Display *dpy, GLXPixmap pixmap);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXPixmap pixmap;
-
-} EVGL_Thread_Command_glXDestroyPixmap;
-
-void (*orig_evgl_glXDestroyPixmap)(Display *dpy, GLXPixmap pixmap);
-
-void
-glXDestroyPixmap_orig_evgl_set(void *func)
-{
-   orig_evgl_glXDestroyPixmap = func;
-}
-
-void *
-glXDestroyPixmap_orig_evgl_get(void)
-{
-   return orig_evgl_glXDestroyPixmap;
-}
-
-static void
-_evgl_thread_glXDestroyPixmap(void *data)
-{
-   EVGL_Thread_Command_glXDestroyPixmap *thread_data =
-       (EVGL_Thread_Command_glXDestroyPixmap *)data;
-
-   orig_evgl_glXDestroyPixmap(thread_data->dpy,
-                              thread_data->pixmap);
-
-}
-
-EAPI void
-glXDestroyPixmap_evgl_thread_cmd(Display *dpy, GLXPixmap pixmap)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glXDestroyPixmap(dpy, pixmap);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXDestroyPixmap thread_data_local;
-   EVGL_Thread_Command_glXDestroyPixmap *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->pixmap = pixmap;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXDestroyPixmap,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   void
-   glXDestroyWindow(Display *dpy, GLXWindow window);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXWindow window;
-
-} EVGL_Thread_Command_glXDestroyWindow;
-
-static void
-_evgl_thread_glXDestroyWindow(void *data)
-{
-   EVGL_Thread_Command_glXDestroyWindow *thread_data =
-       (EVGL_Thread_Command_glXDestroyWindow *)data;
-
-   glXDestroyWindow(thread_data->dpy,
-                    thread_data->window);
-
-}
-
-EAPI void
-glXDestroyWindow_evgl_thread_cmd(Display *dpy, GLXWindow window)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glXDestroyWindow(dpy, window);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXDestroyWindow thread_data_local;
-   EVGL_Thread_Command_glXDestroyWindow *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->window = window;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXDestroyWindow,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   int
-   glXGetConfig(Display *dpy, XVisualInfo *visual, int attrib, int *value);
- */
-
-typedef struct
-{
-   int return_value;
-   Display *dpy;
-   XVisualInfo *visual;
-   int attrib;
-   int *value;
-
-} EVGL_Thread_Command_glXGetConfig;
-
-static void
-_evgl_thread_glXGetConfig(void *data)
-{
-   EVGL_Thread_Command_glXGetConfig *thread_data =
-       (EVGL_Thread_Command_glXGetConfig *)data;
-
-   thread_data->return_value = glXGetConfig(thread_data->dpy,
-                                            thread_data->visual,
-                                            thread_data->attrib,
-                                            thread_data->value);
-
-}
-
-EAPI int
-glXGetConfig_evgl_thread_cmd(Display *dpy, XVisualInfo *visual, int attrib, int *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXGetConfig(dpy, visual, attrib, value);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXGetConfig thread_data_local;
-   EVGL_Thread_Command_glXGetConfig *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->visual = visual;
-   thread_data->attrib = attrib;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXGetConfig,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   int
-   glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config, int attribute, int *value);
- */
-
-typedef struct
-{
-   int return_value;
-   Display *dpy;
-   GLXFBConfig config;
-   int attribute;
-   int *value;
-
-} EVGL_Thread_Command_glXGetFBConfigAttrib;
-
-static void
-_evgl_thread_glXGetFBConfigAttrib(void *data)
-{
-   EVGL_Thread_Command_glXGetFBConfigAttrib *thread_data =
-       (EVGL_Thread_Command_glXGetFBConfigAttrib *)data;
-
-   thread_data->return_value = glXGetFBConfigAttrib(thread_data->dpy,
-                                                    thread_data->config,
-                                                    thread_data->attribute,
-                                                    thread_data->value);
-
-}
-
-EAPI int
-glXGetFBConfigAttrib_evgl_thread_cmd(Display *dpy, GLXFBConfig config, int attribute, int *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXGetFBConfigAttrib(dpy, config, attribute, value);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXGetFBConfigAttrib thread_data_local;
-   EVGL_Thread_Command_glXGetFBConfigAttrib *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-   thread_data->attribute = attribute;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXGetFBConfigAttrib,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   int
-   glXGetVideoSync(unsigned int *count);
- */
-
-typedef struct
-{
-   int return_value;
-   unsigned int *count;
-
-} EVGL_Thread_Command_glXGetVideoSync;
-
-int (*orig_evgl_glXGetVideoSync)(unsigned int *count);
-
-void
-glXGetVideoSync_orig_evgl_set(void *func)
-{
-   orig_evgl_glXGetVideoSync = func;
-}
-
-void *
-glXGetVideoSync_orig_evgl_get(void)
-{
-   return orig_evgl_glXGetVideoSync;
-}
-
-static void
-_evgl_thread_glXGetVideoSync(void *data)
-{
-   EVGL_Thread_Command_glXGetVideoSync *thread_data =
-       (EVGL_Thread_Command_glXGetVideoSync *)data;
-
-   thread_data->return_value = orig_evgl_glXGetVideoSync(thread_data->count);
-
-}
-
-EAPI int
-glXGetVideoSync_evgl_thread_cmd(unsigned int *count)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return orig_evgl_glXGetVideoSync(count);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXGetVideoSync thread_data_local;
-   EVGL_Thread_Command_glXGetVideoSync *thread_data = &thread_data_local;
-
-   thread_data->count = count;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXGetVideoSync,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   XVisualInfo *
-   glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config);
- */
-
-typedef struct
-{
-   XVisualInfo * return_value;
-   Display *dpy;
-   GLXFBConfig config;
-
-} EVGL_Thread_Command_glXGetVisualFromFBConfig;
-
-static void
-_evgl_thread_glXGetVisualFromFBConfig(void *data)
-{
-   EVGL_Thread_Command_glXGetVisualFromFBConfig *thread_data =
-       (EVGL_Thread_Command_glXGetVisualFromFBConfig *)data;
-
-   thread_data->return_value = glXGetVisualFromFBConfig(thread_data->dpy,
-                                                        thread_data->config);
-
-}
-
-EAPI XVisualInfo *
-glXGetVisualFromFBConfig_evgl_thread_cmd(Display *dpy, GLXFBConfig config)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXGetVisualFromFBConfig(dpy, config);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXGetVisualFromFBConfig thread_data_local;
-   EVGL_Thread_Command_glXGetVisualFromFBConfig *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->config = config;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXGetVisualFromFBConfig,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   Bool
-   glXMakeContextCurrent(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
- */
-
-typedef struct
-{
-   Bool return_value;
-   Display *dpy;
-   GLXDrawable draw;
-   GLXDrawable read;
-   GLXContext ctx;
-
-} EVGL_Thread_Command_glXMakeContextCurrent;
-
-GLXContext  current_evgl_thread_ctx  = (GLXContext)0;
-
-static void
-_evgl_thread_glXMakeContextCurrent(void *data)
-{
-   EVGL_Thread_Command_glXMakeContextCurrent *thread_data =
-       (EVGL_Thread_Command_glXMakeContextCurrent *)data;
-
-   DBG("EVGL THREAD >> OTHER THREAD MAKECONTEXTCURRENT : (%p, %p, %p, %p)\n",
-           thread_data->dpy, (void *)thread_data->draw,
-           (void* )thread_data->read, thread_data->ctx);
-
-   thread_data->return_value = glXMakeContextCurrent(thread_data->dpy,
-                                                     thread_data->draw,
-                                                     thread_data->read,
-                                                     thread_data->ctx);
-
-   if (thread_data->return_value)
-      current_evgl_thread_ctx = thread_data->ctx;
-
-}
-
-EAPI Bool
-glXMakeContextCurrent_evgl_thread_cmd(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXMakeContextCurrent(dpy, draw, read, ctx);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXMakeContextCurrent thread_data_local;
-   EVGL_Thread_Command_glXMakeContextCurrent *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->draw = draw;
-   thread_data->read = read;
-   thread_data->ctx = ctx;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXMakeContextCurrent,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   GLXContext
-   glXGetCurrentContext(void);
- */
-
-EAPI GLXContext
-glXGetCurrentContext_evgl_thread_cmd(void)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXGetCurrentContext();
-     }
-
-   return current_evgl_thread_ctx;
-}
-
-
-/*
-   void
-   glXQueryDrawable(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXDrawable draw;
-   int attribute;
-   unsigned int *value;
-
-} EVGL_Thread_Command_glXQueryDrawable;
-
-void (*orig_evgl_glXQueryDrawable)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-
-void
-glXQueryDrawable_orig_evgl_set(void *func)
-{
-   orig_evgl_glXQueryDrawable = func;
-}
-
-void *
-glXQueryDrawable_orig_evgl_get(void)
-{
-   return orig_evgl_glXQueryDrawable;
-}
-
-static void
-_evgl_thread_glXQueryDrawable(void *data)
-{
-   EVGL_Thread_Command_glXQueryDrawable *thread_data =
-       (EVGL_Thread_Command_glXQueryDrawable *)data;
-
-   orig_evgl_glXQueryDrawable(thread_data->dpy,
-                              thread_data->draw,
-                              thread_data->attribute,
-                              thread_data->value);
-
-}
-
-EAPI void
-glXQueryDrawable_evgl_thread_cmd(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glXQueryDrawable(dpy, draw, attribute, value);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXQueryDrawable thread_data_local;
-   EVGL_Thread_Command_glXQueryDrawable *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->draw = draw;
-   thread_data->attribute = attribute;
-   thread_data->value = value;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXQueryDrawable,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   Bool
-   glXQueryExtension(Display *dpy, int *errorb, int *event);
- */
-
-typedef struct
-{
-   Bool return_value;
-   Display *dpy;
-   int *errorb;
-   int *event;
-
-} EVGL_Thread_Command_glXQueryExtension;
-
-static void
-_evgl_thread_glXQueryExtension(void *data)
-{
-   EVGL_Thread_Command_glXQueryExtension *thread_data =
-       (EVGL_Thread_Command_glXQueryExtension *)data;
-
-   thread_data->return_value = glXQueryExtension(thread_data->dpy,
-                                                 thread_data->errorb,
-                                                 thread_data->event);
-
-}
-
-EAPI Bool
-glXQueryExtension_evgl_thread_cmd(Display *dpy, int *errorb, int *event)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXQueryExtension(dpy, errorb, event);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXQueryExtension thread_data_local;
-   EVGL_Thread_Command_glXQueryExtension *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->errorb = errorb;
-   thread_data->event = event;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXQueryExtension,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   const char *
-   glXQueryExtensionsString(Display *dpy, int screen);
- */
-
-typedef struct
-{
-   const char * return_value;
-   Display *dpy;
-   int screen;
-
-} EVGL_Thread_Command_glXQueryExtensionsString;
-
-static void
-_evgl_thread_glXQueryExtensionsString(void *data)
-{
-   EVGL_Thread_Command_glXQueryExtensionsString *thread_data =
-       (EVGL_Thread_Command_glXQueryExtensionsString *)data;
-
-   thread_data->return_value = glXQueryExtensionsString(thread_data->dpy,
-                                                        thread_data->screen);
-
-}
-
-EAPI const char *
-glXQueryExtensionsString_evgl_thread_cmd(Display *dpy, int screen)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return glXQueryExtensionsString(dpy, screen);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXQueryExtensionsString thread_data_local;
-   EVGL_Thread_Command_glXQueryExtensionsString *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->screen = screen;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXQueryExtensionsString,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   Bool
-   glXReleaseBuffersMESA(Display *dpy, GLXDrawable drawable);
- */
-
-typedef struct
-{
-   Bool return_value;
-   Display *dpy;
-   GLXDrawable drawable;
 
-} EVGL_Thread_Command_glXReleaseBuffersMESA;
+/*****************************************************************************/
 
-Bool (*orig_evgl_glXReleaseBuffersMESA)(Display *dpy, GLXDrawable drawable);
 
-void
-glXReleaseBuffersMESA_orig_evgl_set(void *func)
-{
-   orig_evgl_glXReleaseBuffersMESA = func;
-}
+static Evas_GL_Thread_GLX_Func th_glx_func;
+Eina_Bool th_glx_func_initialized = EINA_FALSE;
 
 void *
-glXReleaseBuffersMESA_orig_evgl_get(void)
-{
-   return orig_evgl_glXReleaseBuffersMESA;
-}
-
-static void
-_evgl_thread_glXReleaseBuffersMESA(void *data)
-{
-   EVGL_Thread_Command_glXReleaseBuffersMESA *thread_data =
-       (EVGL_Thread_Command_glXReleaseBuffersMESA *)data;
-
-   thread_data->return_value = orig_evgl_glXReleaseBuffersMESA(thread_data->dpy,
-                                                               thread_data->drawable);
-
-}
-
-EAPI Bool
-glXReleaseBuffersMESA_evgl_thread_cmd(Display *dpy, GLXDrawable drawable)
+evas_gl_thread_glx_func_get()
 {
-   if (!evas_evgl_thread_enabled())
+   if (!th_glx_func_initialized)
      {
-        return orig_evgl_glXReleaseBuffersMESA(dpy, drawable);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXReleaseBuffersMESA thread_data_local;
-   EVGL_Thread_Command_glXReleaseBuffersMESA *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->drawable = drawable;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXReleaseBuffersMESA,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   void
-   glXReleaseTexImage(Display *dpy, GLXDrawable drawable, int buffer);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXDrawable drawable;
-   int buffer;
-
-} EVGL_Thread_Command_glXReleaseTexImage;
-
-void (*orig_evgl_glXReleaseTexImage)(Display *dpy, GLXDrawable drawable, int buffer);
-
-void
-glXReleaseTexImage_orig_evgl_set(void *func)
-{
-   orig_evgl_glXReleaseTexImage = func;
-}
+#define THREAD_FUNCTION_ASSIGN(func) th_glx_func.func = func;
 
-void *
-glXReleaseTexImage_orig_evgl_get(void)
-{
-   return orig_evgl_glXReleaseTexImage;
-}
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name));
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_begin)); \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_end));
 
-static void
-_evgl_thread_glXReleaseTexImage(void *data)
-{
-   EVGL_Thread_Command_glXReleaseTexImage *thread_data =
-       (EVGL_Thread_Command_glXReleaseTexImage *)data;
+   EVAS_TH_GLX_FN_LIST
 
-   orig_evgl_glXReleaseTexImage(thread_data->dpy,
-                                thread_data->drawable,
-                                thread_data->buffer);
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
 
-}
+#undef THREAD_FUNCTION_ASSIGN
 
-EAPI void
-glXReleaseTexImage_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        orig_evgl_glXReleaseTexImage(dpy, drawable, buffer);
-        return;
+        th_glx_func_initialized = EINA_TRUE;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXReleaseTexImage thread_data_local;
-   EVGL_Thread_Command_glXReleaseTexImage *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->drawable = drawable;
-   thread_data->buffer = buffer;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXReleaseTexImage,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   void
-   glXSwapBuffers(Display *dpy, GLXDrawable drawable);
- */
-
-typedef struct
-{
-   Display *dpy;
-   GLXDrawable drawable;
-
-} EVGL_Thread_Command_glXSwapBuffers;
-
-static void
-_evgl_thread_glXSwapBuffers(void *data)
-{
-   EVGL_Thread_Command_glXSwapBuffers *thread_data =
-       (EVGL_Thread_Command_glXSwapBuffers *)data;
-
-   glXSwapBuffers(thread_data->dpy,
-                  thread_data->drawable);
-
+   return &th_glx_func;
 }
 
-EAPI void
-glXSwapBuffers_evgl_thread_cmd(Display *dpy, GLXDrawable drawable)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        glXSwapBuffers(dpy, drawable);
-        return;
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXSwapBuffers thread_data_local;
-   EVGL_Thread_Command_glXSwapBuffers *thread_data = &thread_data_local;
 
-   thread_data->dpy = dpy;
-   thread_data->drawable = drawable;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXSwapBuffers,
-                              thread_data,
-                              thread_mode);
-}
+#else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
+      /* compiled for GL backend */
 
-/*
-   void
-   glXSwapIntervalEXT(Display *dpy, GLXDrawable drawable, int interval);
- */
+#include <dlfcn.h>
 
-typedef struct
-{
-   Display *dpy;
-   GLXDrawable drawable;
  int interval;
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ ret (*GL_TH_FN(name))(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ void *(*GL_TH_FN(name##_begin))(GL_TH_DP, ##__VA_ARGS__); \
ret (*GL_TH_FN(name##_end))(void *ref);
 
-} EVGL_Thread_Command_glXSwapIntervalEXT;
+   EVAS_TH_GLX_FN_LIST
 
-void (*orig_evgl_glXSwapIntervalEXT)(Display *dpy, GLXDrawable drawable, int interval);
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
 
 void
-glXSwapIntervalEXT_orig_evgl_set(void *func)
-{
-   orig_evgl_glXSwapIntervalEXT = func;
-}
-
-void *
-glXSwapIntervalEXT_orig_evgl_get(void)
+_glx_thread_link_init(void *func_ptr)
 {
-   return orig_evgl_glXSwapIntervalEXT;
-}
-
-static void
-_evgl_thread_glXSwapIntervalEXT(void *data)
-{
-   EVGL_Thread_Command_glXSwapIntervalEXT *thread_data =
-       (EVGL_Thread_Command_glXSwapIntervalEXT *)data;
+   const Evas_GL_Thread_GLX_Func *th_glx_func = func_ptr;
 
-   orig_evgl_glXSwapIntervalEXT(thread_data->dpy,
-                                thread_data->drawable,
-                                thread_data->interval);
-
-}
-
-EAPI void
-glXSwapIntervalEXT_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int interval)
-{
-   if (!evas_evgl_thread_enabled())
+   if (!th_glx_func)
      {
-        orig_evgl_glXSwapIntervalEXT(dpy, drawable, interval);
+        ERR("Thread functions (GLX BASE) are not exist");
         return;
      }
 
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXSwapIntervalEXT thread_data_local;
-   EVGL_Thread_Command_glXSwapIntervalEXT *thread_data = &thread_data_local;
-
-   thread_data->dpy = dpy;
-   thread_data->drawable = drawable;
-   thread_data->interval = interval;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXSwapIntervalEXT,
-                              thread_data,
-                              thread_mode);
-}
-
-/*
-   int
-   glXSwapIntervalSGI(int interval);
- */
-
-typedef struct
-{
-   int return_value;
-   int interval;
-
-} EVGL_Thread_Command_glXSwapIntervalSGI;
-
-int (*orig_evgl_glXSwapIntervalSGI)(int interval);
-
-void
-glXSwapIntervalSGI_orig_evgl_set(void *func)
-{
-   orig_evgl_glXSwapIntervalSGI = func;
-}
-
-void *
-glXSwapIntervalSGI_orig_evgl_get(void)
-{
-   return orig_evgl_glXSwapIntervalSGI;
-}
-
-static void
-_evgl_thread_glXSwapIntervalSGI(void *data)
-{
-   EVGL_Thread_Command_glXSwapIntervalSGI *thread_data =
-       (EVGL_Thread_Command_glXSwapIntervalSGI *)data;
-
-   thread_data->return_value = orig_evgl_glXSwapIntervalSGI(thread_data->interval);
-
-}
-
-EAPI int
-glXSwapIntervalSGI_evgl_thread_cmd(int interval)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return orig_evgl_glXSwapIntervalSGI(interval);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
-
-   EVGL_Thread_Command_glXSwapIntervalSGI thread_data_local;
-   EVGL_Thread_Command_glXSwapIntervalSGI *thread_data = &thread_data_local;
-
-   thread_data->interval = interval;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXSwapIntervalSGI,
-                              thread_data,
-                              thread_mode);
-
-   return thread_data->return_value;
-}
-
-/*
-   int
-   glXWaitVideoSync(int divisor, int remainder, unsigned int *count);
- */
-
-typedef struct
-{
-   int return_value;
-   int divisor;
-   int remainder;
-   unsigned int *count;
-
-} EVGL_Thread_Command_glXWaitVideoSync;
-
-int (*orig_evgl_glXWaitVideoSync)(int divisor, int remainder, unsigned int *count);
-
-void
-glXWaitVideoSync_orig_evgl_set(void *func)
-{
-   orig_evgl_glXWaitVideoSync = func;
-}
-
-void *
-glXWaitVideoSync_orig_evgl_get(void)
-{
-   return orig_evgl_glXWaitVideoSync;
-}
-
-static void
-_evgl_thread_glXWaitVideoSync(void *data)
-{
-   EVGL_Thread_Command_glXWaitVideoSync *thread_data =
-       (EVGL_Thread_Command_glXWaitVideoSync *)data;
-
-   thread_data->return_value = orig_evgl_glXWaitVideoSync(thread_data->divisor,
-                                                          thread_data->remainder,
-                                                          thread_data->count);
-
-}
-
-EAPI int
-glXWaitVideoSync_evgl_thread_cmd(int divisor, int remainder, unsigned int *count)
-{
-   if (!evas_evgl_thread_enabled())
-     {
-        return orig_evgl_glXWaitVideoSync(divisor, remainder, count);
-     }
-
-   int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+#define THREAD_FUNCTION_ASSIGN(func) func = th_glx_func->func;
 
-   EVGL_Thread_Command_glXWaitVideoSync thread_data_local;
-   EVGL_Thread_Command_glXWaitVideoSync *thread_data = &thread_data_local;
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name));
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_begin)); \
+ THREAD_FUNCTION_ASSIGN(GL_TH_FN(name##_end));
 
-   thread_data->divisor = divisor;
-   thread_data->remainder = remainder;
-   thread_data->count = count;
+   EVAS_TH_GLX_FN_LIST
 
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_glXWaitVideoSync,
-                              thread_data,
-                              thread_mode);
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
 
-   return thread_data->return_value;
+#undef THREAD_FUNCTION_ASSIGN
 }
 
 
-#else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
-
-#include <dlfcn.h>
-
-
-void          (*glXBindTexImage_orig_evas_set)(void *func) = NULL;
-void         *(*glXBindTexImage_orig_evas_get)(void) = NULL;
-void          (*glXBindTexImage_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list) = NULL;
-GLXFBConfig  *(*glXChooseFBConfig_thread_cmd)(Display *dpy, int screen, const int *attribList, int *nitems) = NULL;
-GLXContext    (*glXCreateContext_thread_cmd)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct) = NULL;
-GLXContext    (*glXCreateNewContext_thread_cmd)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct) = NULL;
-GLXPbuffer    (*glXCreatePbuffer_thread_cmd)(Display *dpy, GLXFBConfig config, const int *attribList) = NULL;
-void          (*glXCreatePixmap_orig_evas_set)(void *func) = NULL;
-void         *(*glXCreatePixmap_orig_evas_get)(void) = NULL;
-GLXPixmap     (*glXCreatePixmap_thread_cmd)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList) = NULL;
-GLXWindow     (*glXCreateWindow_thread_cmd)(Display *dpy, GLXFBConfig config, Window win, const int *attribList) = NULL;
-void          (*glXDestroyContext_thread_cmd)(Display *dpy, GLXContext ctx) = NULL;
-void          (*glXDestroyPbuffer_thread_cmd)(Display *dpy, GLXPbuffer pbuf) = NULL;
-void          (*glXDestroyPixmap_orig_evas_set)(void *func) = NULL;
-void         *(*glXDestroyPixmap_orig_evas_get)(void) = NULL;
-void          (*glXDestroyPixmap_thread_cmd)(Display *dpy, GLXPixmap pixmap) = NULL;
-void          (*glXDestroyWindow_thread_cmd)(Display *dpy, GLXWindow window) = NULL;
-int           (*glXGetConfig_thread_cmd)(Display *dpy, XVisualInfo *visual, int attrib, int *value) = NULL;
-GLXContext    (*glXGetCurrentContext_thread_cmd)(void) = NULL;
-int           (*glXGetFBConfigAttrib_thread_cmd)(Display *dpy, GLXFBConfig config, int attribute, int *value) = NULL;
-void          (*glXGetVideoSync_orig_evas_set)(void *func) = NULL;
-void         *(*glXGetVideoSync_orig_evas_get)(void) = NULL;
-int           (*glXGetVideoSync_thread_cmd)(unsigned int *count) = NULL;
-XVisualInfo  *(*glXGetVisualFromFBConfig_thread_cmd)(Display *dpy, GLXFBConfig config) = NULL;
-Bool          (*glXMakeContextCurrent_thread_cmd)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) = NULL;
-void          (*glXQueryDrawable_orig_evas_set)(void *func) = NULL;
-void         *(*glXQueryDrawable_orig_evas_get)(void) = NULL;
-void          (*glXQueryDrawable_thread_cmd)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value) = NULL;
-Bool          (*glXQueryExtension_thread_cmd)(Display *dpy, int *errorb, int *event) = NULL;
-const char   *(*glXQueryExtensionsString_thread_cmd)(Display *dpy, int screen) = NULL;
-void          (*glXReleaseBuffersMESA_orig_evas_set)(void *func) = NULL;
-void         *(*glXReleaseBuffersMESA_orig_evas_get)(void) = NULL;
-Bool          (*glXReleaseBuffersMESA_thread_cmd)(Display *dpy, GLXDrawable drawable) = NULL;
-void          (*glXReleaseTexImage_orig_evas_set)(void *func) = NULL;
-void         *(*glXReleaseTexImage_orig_evas_get)(void) = NULL;
-void          (*glXReleaseTexImage_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer) = NULL;
-void          (*glXSwapBuffers_thread_cmd)(Display *dpy, GLXDrawable drawable) = NULL;
-void          (*glXSwapIntervalEXT_orig_evas_set)(void *func) = NULL;
-void         *(*glXSwapIntervalEXT_orig_evas_get)(void) = NULL;
-void          (*glXSwapIntervalEXT_thread_cmd)(Display *dpy, GLXDrawable drawable, int interval) = NULL;
-void          (*glXSwapIntervalSGI_orig_evas_set)(void *func) = NULL;
-void         *(*glXSwapIntervalSGI_orig_evas_get)(void) = NULL;
-int           (*glXSwapIntervalSGI_thread_cmd)(int interval) = NULL;
-void          (*glXWaitVideoSync_orig_evas_set)(void *func) = NULL;
-void         *(*glXWaitVideoSync_orig_evas_get)(void) = NULL;
-int           (*glXWaitVideoSync_thread_cmd)(int divisor, int remainder, unsigned int *count) = NULL;
-
-/****** EVAS GL ******/
-
-void          (*glXBindTexImage_orig_evgl_set)(void *func) = NULL;
-void         *(*glXBindTexImage_orig_evgl_get)(void) = NULL;
-void          (*glXBindTexImage_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list) = NULL;
-GLXFBConfig  *(*glXChooseFBConfig_evgl_thread_cmd)(Display *dpy, int screen, const int *attribList, int *nitems) = NULL;
-GLXContext    (*glXCreateContext_evgl_thread_cmd)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct) = NULL;
-GLXContext    (*glXCreateNewContext_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct) = NULL;
-GLXPbuffer    (*glXCreatePbuffer_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, const int *attribList) = NULL;
-void          (*glXCreatePixmap_orig_evgl_set)(void *func) = NULL;
-void         *(*glXCreatePixmap_orig_evgl_get)(void) = NULL;
-GLXPixmap     (*glXCreatePixmap_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList) = NULL;
-GLXWindow     (*glXCreateWindow_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, Window win, const int *attribList) = NULL;
-void          (*glXDestroyContext_evgl_thread_cmd)(Display *dpy, GLXContext ctx) = NULL;
-void          (*glXDestroyPbuffer_evgl_thread_cmd)(Display *dpy, GLXPbuffer pbuf) = NULL;
-void          (*glXDestroyPixmap_orig_evgl_set)(void *func) = NULL;
-void         *(*glXDestroyPixmap_orig_evgl_get)(void) = NULL;
-void          (*glXDestroyPixmap_evgl_thread_cmd)(Display *dpy, GLXPixmap pixmap) = NULL;
-void          (*glXDestroyWindow_evgl_thread_cmd)(Display *dpy, GLXWindow window) = NULL;
-int           (*glXGetConfig_evgl_thread_cmd)(Display *dpy, XVisualInfo *visual, int attrib, int *value) = NULL;
-GLXContext    (*glXGetCurrentContext_evgl_thread_cmd)(void) = NULL;
-int           (*glXGetFBConfigAttrib_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, int attribute, int *value) = NULL;
-void          (*glXGetVideoSync_orig_evgl_set)(void *func) = NULL;
-void         *(*glXGetVideoSync_orig_evgl_get)(void) = NULL;
-int           (*glXGetVideoSync_evgl_thread_cmd)(unsigned int *count) = NULL;
-XVisualInfo  *(*glXGetVisualFromFBConfig_evgl_thread_cmd)(Display *dpy, GLXFBConfig config) = NULL;
-Bool          (*glXMakeContextCurrent_evgl_thread_cmd)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) = NULL;
-void          (*glXQueryDrawable_orig_evgl_set)(void *func) = NULL;
-void         *(*glXQueryDrawable_orig_evgl_get)(void) = NULL;
-void          (*glXQueryDrawable_evgl_thread_cmd)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value) = NULL;
-Bool          (*glXQueryExtension_evgl_thread_cmd)(Display *dpy, int *errorb, int *event) = NULL;
-const char   *(*glXQueryExtensionsString_evgl_thread_cmd)(Display *dpy, int screen) = NULL;
-void          (*glXReleaseBuffersMESA_orig_evgl_set)(void *func) = NULL;
-void         *(*glXReleaseBuffersMESA_orig_evgl_get)(void) = NULL;
-Bool          (*glXReleaseBuffersMESA_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable) = NULL;
-void          (*glXReleaseTexImage_orig_evgl_set)(void *func) = NULL;
-void         *(*glXReleaseTexImage_orig_evgl_get)(void) = NULL;
-void          (*glXReleaseTexImage_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer) = NULL;
-void          (*glXSwapBuffers_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable) = NULL;
-void          (*glXSwapIntervalEXT_orig_evgl_set)(void *func) = NULL;
-void         *(*glXSwapIntervalEXT_orig_evgl_get)(void) = NULL;
-void          (*glXSwapIntervalEXT_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int interval) = NULL;
-void          (*glXSwapIntervalSGI_orig_evgl_set)(void *func) = NULL;
-void         *(*glXSwapIntervalSGI_orig_evgl_get)(void) = NULL;
-int           (*glXSwapIntervalSGI_evgl_thread_cmd)(int interval) = NULL;
-void          (*glXWaitVideoSync_orig_evgl_set)(void *func) = NULL;
-void         *(*glXWaitVideoSync_orig_evgl_get)(void) = NULL;
-int           (*glXWaitVideoSync_evgl_thread_cmd)(int divisor, int remainder, unsigned int *count) = NULL;
-
-
-
-void _glx_thread_link_init()
-{
-#define LINK2GENERIC(sym) \
-   sym = dlsym(RTLD_DEFAULT, #sym); \
-   if (!sym) ERR("Could not find function '%s'", #sym);
-
-   LINK2GENERIC(glXBindTexImage_orig_evas_set);
-   LINK2GENERIC(glXBindTexImage_orig_evas_get);
-   LINK2GENERIC(glXBindTexImage_thread_cmd);
-   LINK2GENERIC(glXChooseFBConfig_thread_cmd);
-   LINK2GENERIC(glXCreateContext_thread_cmd);
-   LINK2GENERIC(glXCreateNewContext_thread_cmd);
-   LINK2GENERIC(glXCreatePbuffer_thread_cmd);
-   LINK2GENERIC(glXCreatePixmap_orig_evas_set);
-   LINK2GENERIC(glXCreatePixmap_orig_evas_get);
-   LINK2GENERIC(glXCreatePixmap_thread_cmd);
-   LINK2GENERIC(glXCreateWindow_thread_cmd);
-   LINK2GENERIC(glXDestroyContext_thread_cmd);
-   LINK2GENERIC(glXDestroyPbuffer_thread_cmd);
-   LINK2GENERIC(glXDestroyPixmap_orig_evas_set);
-   LINK2GENERIC(glXDestroyPixmap_orig_evas_get);
-   LINK2GENERIC(glXDestroyPixmap_thread_cmd);
-   LINK2GENERIC(glXDestroyWindow_thread_cmd);
-   LINK2GENERIC(glXGetConfig_thread_cmd);
-   LINK2GENERIC(glXGetCurrentContext_thread_cmd);
-   LINK2GENERIC(glXGetFBConfigAttrib_thread_cmd);
-   LINK2GENERIC(glXGetVideoSync_orig_evas_set);
-   LINK2GENERIC(glXGetVideoSync_orig_evas_get);
-   LINK2GENERIC(glXGetVideoSync_thread_cmd);
-   LINK2GENERIC(glXGetVisualFromFBConfig_thread_cmd);
-   LINK2GENERIC(glXMakeContextCurrent_thread_cmd);
-   LINK2GENERIC(glXQueryDrawable_orig_evas_set);
-   LINK2GENERIC(glXQueryDrawable_orig_evas_get);
-   LINK2GENERIC(glXQueryDrawable_thread_cmd);
-   LINK2GENERIC(glXQueryExtension_thread_cmd);
-   LINK2GENERIC(glXQueryExtensionsString_thread_cmd);
-   LINK2GENERIC(glXReleaseBuffersMESA_orig_evas_set);
-   LINK2GENERIC(glXReleaseBuffersMESA_orig_evas_get);
-   LINK2GENERIC(glXReleaseBuffersMESA_thread_cmd);
-   LINK2GENERIC(glXReleaseTexImage_orig_evas_set);
-   LINK2GENERIC(glXReleaseTexImage_orig_evas_get);
-   LINK2GENERIC(glXReleaseTexImage_thread_cmd);
-   LINK2GENERIC(glXSwapBuffers_thread_cmd);
-   LINK2GENERIC(glXSwapIntervalEXT_orig_evas_set);
-   LINK2GENERIC(glXSwapIntervalEXT_orig_evas_get);
-   LINK2GENERIC(glXSwapIntervalEXT_thread_cmd);
-   LINK2GENERIC(glXSwapIntervalSGI_orig_evas_set);
-   LINK2GENERIC(glXSwapIntervalSGI_orig_evas_get);
-   LINK2GENERIC(glXSwapIntervalSGI_thread_cmd);
-   LINK2GENERIC(glXWaitVideoSync_orig_evas_set);
-   LINK2GENERIC(glXWaitVideoSync_orig_evas_get);
-   LINK2GENERIC(glXWaitVideoSync_thread_cmd);
-
-   /****** EVAS GL ******/
-
-   LINK2GENERIC(glXBindTexImage_orig_evgl_set);
-   LINK2GENERIC(glXBindTexImage_orig_evgl_get);
-   LINK2GENERIC(glXBindTexImage_evgl_thread_cmd);
-   LINK2GENERIC(glXChooseFBConfig_evgl_thread_cmd);
-   LINK2GENERIC(glXCreateContext_evgl_thread_cmd);
-   LINK2GENERIC(glXCreateNewContext_evgl_thread_cmd);
-   LINK2GENERIC(glXCreatePbuffer_evgl_thread_cmd);
-   LINK2GENERIC(glXCreatePixmap_orig_evgl_set);
-   LINK2GENERIC(glXCreatePixmap_orig_evgl_get);
-   LINK2GENERIC(glXCreatePixmap_evgl_thread_cmd);
-   LINK2GENERIC(glXCreateWindow_evgl_thread_cmd);
-   LINK2GENERIC(glXDestroyContext_evgl_thread_cmd);
-   LINK2GENERIC(glXDestroyPbuffer_evgl_thread_cmd);
-   LINK2GENERIC(glXDestroyPixmap_orig_evgl_set);
-   LINK2GENERIC(glXDestroyPixmap_orig_evgl_get);
-   LINK2GENERIC(glXDestroyPixmap_evgl_thread_cmd);
-   LINK2GENERIC(glXDestroyWindow_evgl_thread_cmd);
-   LINK2GENERIC(glXGetConfig_evgl_thread_cmd);
-   LINK2GENERIC(glXGetCurrentContext_evgl_thread_cmd);
-   LINK2GENERIC(glXGetFBConfigAttrib_evgl_thread_cmd);
-   LINK2GENERIC(glXGetVideoSync_orig_evgl_set);
-   LINK2GENERIC(glXGetVideoSync_orig_evgl_get);
-   LINK2GENERIC(glXGetVideoSync_evgl_thread_cmd);
-   LINK2GENERIC(glXGetVisualFromFBConfig_evgl_thread_cmd);
-   LINK2GENERIC(glXMakeContextCurrent_evgl_thread_cmd);
-   LINK2GENERIC(glXQueryDrawable_orig_evgl_set);
-   LINK2GENERIC(glXQueryDrawable_orig_evgl_get);
-   LINK2GENERIC(glXQueryDrawable_evgl_thread_cmd);
-   LINK2GENERIC(glXQueryExtension_evgl_thread_cmd);
-   LINK2GENERIC(glXQueryExtensionsString_evgl_thread_cmd);
-   LINK2GENERIC(glXReleaseBuffersMESA_orig_evgl_set);
-   LINK2GENERIC(glXReleaseBuffersMESA_orig_evgl_get);
-   LINK2GENERIC(glXReleaseBuffersMESA_evgl_thread_cmd);
-   LINK2GENERIC(glXReleaseTexImage_orig_evgl_set);
-   LINK2GENERIC(glXReleaseTexImage_orig_evgl_get);
-   LINK2GENERIC(glXReleaseTexImage_evgl_thread_cmd);
-   LINK2GENERIC(glXSwapBuffers_evgl_thread_cmd);
-   LINK2GENERIC(glXSwapIntervalEXT_orig_evgl_set);
-   LINK2GENERIC(glXSwapIntervalEXT_orig_evgl_get);
-   LINK2GENERIC(glXSwapIntervalEXT_evgl_thread_cmd);
-   LINK2GENERIC(glXSwapIntervalSGI_orig_evgl_set);
-   LINK2GENERIC(glXSwapIntervalSGI_orig_evgl_get);
-   LINK2GENERIC(glXSwapIntervalSGI_evgl_thread_cmd);
-   LINK2GENERIC(glXWaitVideoSync_orig_evgl_set);
-   LINK2GENERIC(glXWaitVideoSync_orig_evgl_get);
-   LINK2GENERIC(glXWaitVideoSync_evgl_thread_cmd);
-}
-
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
-
 #endif /* ! GL_GLES */
index 56b54f7..ee2325b 100644 (file)
 
 #ifndef GL_GLES
 
-# include <GL/glx.h>
+#include <GL/glx.h>
+
+extern void *evas_gl_thread_glx_func_get(void);
+
+
+#define EVAS_TH_GLX_FN_LIST \
+EVAS_TH_GLX_FN      (void          , glXBindTexImage, Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list) \
+EVAS_TH_GLX_FN      (GLXFBConfig  *, glXChooseFBConfig, Display *dpy, int screen, const int *attribList, int *nitems) \
+EVAS_TH_GLX_FN      (GLXContext    , glXCreateContext, Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct) \
+EVAS_TH_GLX_FN      (GLXContext    , glXCreateNewContext, Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct) \
+EVAS_TH_GLX_FN      (GLXPbuffer    , glXCreatePbuffer, Display *dpy, GLXFBConfig config, const int *attribList) \
+EVAS_TH_GLX_FN      (GLXPixmap     , glXCreatePixmap, Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList) \
+EVAS_TH_GLX_FN      (GLXWindow     , glXCreateWindow, Display *dpy, GLXFBConfig config, Window win, const int *attribList) \
+EVAS_TH_GLX_FN      (void          , glXDestroyContext, Display *dpy, GLXContext ctx) \
+EVAS_TH_GLX_FN      (void          , glXDestroyPbuffer, Display *dpy, GLXPbuffer pbuf) \
+EVAS_TH_GLX_FN      (void          , glXDestroyPixmap, Display *dpy, GLXPixmap pixmap) \
+EVAS_TH_GLX_FN      (void          , glXDestroyWindow, Display *dpy, GLXWindow window) \
+EVAS_TH_GLX_FN      (int           , glXGetConfig, Display *dpy, XVisualInfo *visual, int attrib, int *value) \
+EVAS_TH_GLX_FN      (GLXContext    , glXGetCurrentContext) \
+EVAS_TH_GLX_FN      (int           , glXGetFBConfigAttrib, Display *dpy, GLXFBConfig config, int attribute, int *value) \
+EVAS_TH_GLX_FN      (int           , glXGetVideoSync, unsigned int *count) \
+EVAS_TH_GLX_FN      (XVisualInfo  *, glXGetVisualFromFBConfig, Display *dpy, GLXFBConfig config) \
+EVAS_TH_GLX_FN      (Bool          , glXMakeContextCurrent, Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) \
+EVAS_TH_GLX_FN_ASYNC(Bool          , glXMakeContextCurrentASYNC, Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) \
+EVAS_TH_GLX_FN      (int           , glXQueryDrawable, Display *dpy, GLXDrawable draw, int attribute, unsigned int *value) \
+EVAS_TH_GLX_FN      (Bool          , glXQueryExtension, Display *dpy, int *errorb, int *event) \
+EVAS_TH_GLX_FN      (const char   *, glXQueryExtensionsString, Display *dpy, int screen) \
+EVAS_TH_GLX_FN      (Bool          , glXReleaseBuffersMESA, Display *dpy, GLXDrawable drawable) \
+EVAS_TH_GLX_FN      (void          , glXReleaseTexImage, Display *dpy, GLXDrawable drawable, int buffer) \
+EVAS_TH_GLX_FN      (void          , glXSwapBuffers, Display *dpy, GLXDrawable drawable) \
+EVAS_TH_GLX_FN      (void          , glXSwapIntervalEXT, Display *dpy, GLXDrawable drawable, int interval) \
+EVAS_TH_GLX_FN      (int           , glXSwapIntervalSGI, int interval) \
+EVAS_TH_GLX_FN      (int           , glXWaitVideoSync, int divisor, int remainder, unsigned int *count)
 
-#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
-
-#define GL_GLEXT_PROTOTYPES
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-
-EAPI void         glXBindTexImage_orig_evas_set(void *func);
-EAPI void        *glXBindTexImage_orig_evas_get(void);
-EAPI void         glXBindTexImage_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-EAPI GLXFBConfig *glXChooseFBConfig_thread_cmd(Display *dpy, int screen, const int *attribList, int *nitems);
-EAPI GLXContext   glXCreateContext_thread_cmd(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
-EAPI GLXContext   glXCreateNewContext_thread_cmd(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
-EAPI GLXPbuffer   glXCreatePbuffer_thread_cmd(Display *dpy, GLXFBConfig config, const int *attribList);
-EAPI void         glXCreatePixmap_orig_evas_set(void *func);
-EAPI void        *glXCreatePixmap_orig_evas_get(void);
-EAPI GLXPixmap    glXCreatePixmap_thread_cmd(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-EAPI GLXWindow    glXCreateWindow_thread_cmd(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
-EAPI void         glXDestroyContext_thread_cmd(Display *dpy, GLXContext ctx);
-EAPI void         glXDestroyPbuffer_thread_cmd(Display *dpy, GLXPbuffer pbuf);
-EAPI void         glXDestoyPixmap_orig_evas_set(void *func);
-EAPI void        *glXDestoyPixmap_orig_evas_get(void);
-EAPI void         glXDestroyPixmap_thread_cmd(Display *dpy, GLXPixmap pixmap);
-EAPI void         glXDestroyWindow_thread_cmd(Display *dpy, GLXWindow window);
-EAPI int          glXGetConfig_thread_cmd(Display *dpy, XVisualInfo *visual, int attrib, int *value);
-EAPI GLXContext   glXGetCurrentContext_thread_cmd(void);
-EAPI int          glXGetFBConfigAttrib_thread_cmd(Display *dpy, GLXFBConfig config, int attribute, int *value);
-
-EAPI void         glXGetVideoSync_orig_evas_set(void *func);
-EAPI void        *glXGetVideoSync_orig_evas_get(void);
-EAPI int          glXGetVideoSync_thread_cmd(unsigned int *count);
-EAPI XVisualInfo *glXGetVisualFromFBConfig_thread_cmd(Display *dpy, GLXFBConfig config);
-EAPI Bool         glXMakeContextCurrent_thread_cmd(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
-EAPI void         glXQueryDrawable_orig_evas_set(void *func);
-EAPI void        *glXQueryDrawable_orig_evas_get(void);
-EAPI void         glXQueryDrawable_thread_cmd(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-EAPI Bool         glXQueryExtension_thread_cmd(Display *dpy, int *errorb, int *event);
-EAPI const char  *glXQueryExtensionsString_thread_cmd(Display *dpy, int screen);
-
-EAPI void         glXReleaseBuffersMESA_orig_evas_set(void *func);
-EAPI void        *glXReleaseBuffersMESA_orig_evas_get(void);
-EAPI Bool         glXReleaseBuffersMESA_thread_cmd(Display *dpy, GLXDrawable drawable);
-
-EAPI void         glXReleaseTexImageEXT_orig_evas_set(void *func);
-EAPI void        *glXReleaseTexImageEXT_orig_evas_get(void);
-EAPI void         glXReleaseTexImageEXT_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer);
-EAPI void         glXSwapBuffers_thread_cmd(Display *dpy, GLXDrawable drawable);
 
-EAPI void         glXSwapIntervalEXT_orig_evas_set(void *func);
-EAPI void        *glXSwapIntervalEXT_orig_evas_get(void);
-EAPI void         glXSwapIntervalEXT_thread_cmd(Display *dpy, GLXDrawable drawable, int interval);
-
-EAPI void         glXSwapIntervalSGI_orig_evas_set(void *func);
-EAPI void        *glXSwapIntervalSGI_orig_evas_get(void);
-EAPI int          glXSwapIntervalSGI_thread_cmd(int interval);
-
-EAPI void         glXWaitVideoSync_orig_evas_set(void *func);
-EAPI void        *glXWaitVideoSync_orig_evas_get(void);
-EAPI int          glXWaitVideoSync_thread_cmd(int divisor, int remainder, unsigned int *count);
-
-/****** EVAS GL ******/
-EAPI void         glXBindTexImage_orig_evgl_set(void *func);
-EAPI void        *glXBindTexImage_orig_evgl_get(void);
-EAPI void         glXBindTexImage_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-EAPI GLXFBConfig *glXChooseFBConfig_evgl_thread_cmd(Display *dpy, int screen, const int *attribList, int *nitems);
-EAPI GLXContext   glXCreateContext_evgl_thread_cmd(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
-EAPI GLXContext   glXCreateNewContext_evgl_thread_cmd(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
-EAPI GLXPbuffer   glXCreatePbuffer_evgl_thread_cmd(Display *dpy, GLXFBConfig config, const int *attribList);
-
-EAPI void         glXCreatePixmap_orig_evgl_set(void *func);
-EAPI void        *glXCreatePixmap_orig_evgl_get(void);
-EAPI GLXPixmap    glXCreatePixmap_evgl_thread_cmd(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-EAPI GLXWindow    glXCreateWindow_evgl_thread_cmd(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
-EAPI void         glXDestroyContext_evgl_thread_cmd(Display *dpy, GLXContext ctx);
-EAPI void         glXDestroyPbuffer_evgl_thread_cmd(Display *dpy, GLXPbuffer pbuf);
-
-EAPI void         glXDestroyPixmap_orig_evgl_set(void *func);
-EAPI void        *glXDestroyPixmap_orig_evgl_get(void);
-EAPI void         glXDestroyPixmap_evgl_thread_cmd(Display *dpy, GLXPixmap pixmap);
-EAPI void         glXDestroyWindow_evgl_thread_cmd(Display *dpy, GLXWindow window);
-EAPI int          glXGetConfig_evgl_thread_cmd(Display *dpy, XVisualInfo *visual, int attrib, int *value);
-EAPI GLXContext   glXGetCurrentContext_evgl_thread_cmd(void);
-EAPI int          glXGetFBConfigAttrib_evgl_thread_cmd(Display *dpy, GLXFBConfig config, int attribute, int *value);
-
-EAPI void         glXGetVideoSync_orig_evgl_set(void *func);
-EAPI void        *glXGetVideoSync_orig_evgl_get(void);
-EAPI int          glXGetVideoSync_evgl_thread_cmd(unsigned int *count);
-EAPI XVisualInfo *glXGetVisualFromFBConfig_evgl_thread_cmd(Display *dpy, GLXFBConfig config);
-EAPI Bool         glXMakeContextCurrent_evgl_thread_cmd(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+#ifdef EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC
 
-EAPI void         glXQueryDrawable_orig_evgl_set(void *func);
-EAPI void        *glXQueryDrawable_orig_evgl_get(void);
-EAPI void         glXQueryDrawable_evgl_thread_cmd(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-EAPI Bool         glXQueryExtension_evgl_thread_cmd(Display *dpy, int *errorb, int *event);
-EAPI const char  *glXQueryExtensionsString_evgl_thread_cmd(Display *dpy, int screen);
 
-EAPI void         glXReleaseBuffersMESA_orig_evgl_set(void *func);
-EAPI void        *glXReleaseBuffersMESA_orig_evgl_get(void);
-EAPI Bool         glXReleaseBuffersMESA_evgl_thread_cmd(Display *dpy, GLXDrawable drawable);
+#define GL_GLEXT_PROTOTYPES
 
-EAPI void         glXReleaseTexImage_orig_evgl_set(void *func);
-EAPI void        *glXReleaseTexImage_orig_evgl_get(void);
-EAPI void         glXReleaseTexImage_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int buffer);
-EAPI void         glXSwapBuffers_evgl_thread_cmd(Display *dpy, GLXDrawable drawable);
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ extern ret GL_TH_FN(name)(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ extern void *GL_TH_FN(name##_begin)(GL_TH_DP, ##__VA_ARGS__); \
+ extern ret GL_TH_FN(name##_end)(void *ref);
 
-EAPI void         glXSwapIntervalEXT_orig_evgl_set(void *func);
-EAPI void        *glXSwapIntervalEXT_orig_evgl_get(void);
-EAPI void         glXSwapIntervalEXT_evgl_thread_cmd(Display *dpy, GLXDrawable drawable, int interval);
+EVAS_TH_GLX_FN_LIST
 
-EAPI void         glXSwapIntervalSGI_orig_evgl_set(void *func);
-EAPI void        *glXSwapIntervalSGI_orig_evgl_get(void);
-EAPI int          glXSwapIntervalSGI_evgl_thread_cmd(int interval);
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
 
-EAPI void         glXWaitVideoSync_orig_evgl_set(void *func);
-EAPI void        *glXWaitVideoSync_orig_evgl_get(void);
-EAPI int          glXWaitVideoSync_evgl_thread_cmd(int divisor, int remainder, unsigned int *count);
 
 #else /* ! EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
 
-extern void         (*glXBindTexImage_orig_evas_set)(void *func);
-extern void        *(*glXBindTexImage_orig_evas_get)(void);
-extern void         (*glXBindTexImage_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-extern GLXFBConfig *(*glXChooseFBConfig_thread_cmd)(Display *dpy, int screen, const int *attribList, int *nitems);
-extern GLXContext   (*glXCreateContext_thread_cmd)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
-extern GLXContext   (*glXCreateNewContext_thread_cmd)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
-extern GLXPbuffer   (*glXCreatePbuffer_thread_cmd)(Display *dpy, GLXFBConfig config, const int *attribList);
-extern void         (*glXCreatePixmap_orig_evas_set)(void *func);
-extern void        *(*glXCreatePixmap_orig_evas_get)(void);
-extern GLXPixmap    (*glXCreatePixmap_thread_cmd)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-extern GLXWindow    (*glXCreateWindow_thread_cmd)(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
-extern void         (*glXDestroyContext_thread_cmd)(Display *dpy, GLXContext ctx);
-extern void         (*glXDestroyPbuffer_thread_cmd)(Display *dpy, GLXPbuffer pbuf);
-extern void         (*glXDestroyPixmap_orig_evas_set)(void *func);
-extern void        *(*glXDestroyPixmap_orig_evas_get)(void);
-extern void         (*glXDestroyPixmap_thread_cmd)(Display *dpy, GLXPixmap pixmap);
-extern void         (*glXDestroyWindow_thread_cmd)(Display *dpy, GLXWindow window);
-extern int          (*glXGetConfig_thread_cmd)(Display *dpy, XVisualInfo *visual, int attrib, int *value);
-extern GLXContext   (*glXGetCurrentContext_thread_cmd)(void);
-extern int          (*glXGetFBConfigAttrib_thread_cmd)(Display *dpy, GLXFBConfig config, int attribute, int *value);
-extern void         (*glXGetVideoSync_orig_evas_set)(void *func);
-extern void        *(*glXGetVideoSync_orig_evas_get)(void);
-extern int          (*glXGetVideoSync_thread_cmd)(unsigned int *count);
-extern XVisualInfo *(*glXGetVisualFromFBConfig_thread_cmd)(Display *dpy, GLXFBConfig config);
-extern Bool         (*glXMakeContextCurrent_thread_cmd)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
-extern void         (*glXQueryDrawable_orig_evas_set)(void *func);
-extern void        *(*glXQueryDrawable_orig_evas_get)(void);
-extern void         (*glXQueryDrawable_thread_cmd)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-extern Bool         (*glXQueryExtension_thread_cmd)(Display *dpy, int *errorb, int *event);
-extern const char  *(*glXQueryExtensionsString_thread_cmd)(Display *dpy, int screen);
-extern void         (*glXReleaseBuffersMESA_orig_evas_set)(void *func);
-extern void        *(*glXReleaseBuffersMESA_orig_evas_get)(void);
-extern Bool         (*glXReleaseBuffersMESA_thread_cmd)(Display *dpy, GLXDrawable drawable);
-extern void         (*glXReleaseTexImage_orig_evas_set)(void *func);
-extern void        *(*glXReleaseTexImage_orig_evas_get)(void);
-extern void         (*glXReleaseTexImage_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer);
-extern void         (*glXSwapBuffers_thread_cmd)(Display *dpy, GLXDrawable drawable);
-extern void         (*glXSwapIntervalEXT_orig_evas_set)(void *func);
-extern void        *(*glXSwapIntervalEXT_orig_evas_get)(void);
-extern void         (*glXSwapIntervalEXT_thread_cmd)(Display *dpy, GLXDrawable drawable, int interval);
-extern void         (*glXSwapIntervalSGI_orig_evas_set)(void *func);
-extern void        *(*glXSwapIntervalSGI_orig_evas_get)(void);
-extern int          (*glXSwapIntervalSGI_thread_cmd)(int interval);
-extern void         (*glXWaitVideoSync_orig_evas_set)(void *func);
-extern void        *(*glXWaitVideoSync_orig_evas_get)(void);
-extern int          (*glXWaitVideoSync_thread_cmd)(int divisor, int remainder, unsigned int *count);
+#define EVAS_TH_GLX_FN(ret, name, ...) \
+ extern ret (*GL_TH_FN(name))(GL_TH_DP, ##__VA_ARGS__);
+#define EVAS_TH_GLX_FN_ASYNC(ret, name, ...) \
+ extern void *(*GL_TH_FN(name##_begin))(GL_TH_DP, ##__VA_ARGS__); \
+ extern ret (*GL_TH_FN(name##_end))(void *ref);
 
-/****** EVAS GL ******/
+EVAS_TH_GLX_FN_LIST
 
-extern void         (*glXBindTexImage_orig_evgl_set)(void *func);
-extern void        *(*glXBindTexImage_orig_evgl_get)(void);
-extern void         (*glXBindTexImage_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
-extern GLXFBConfig *(*glXChooseFBConfig_evgl_thread_cmd)(Display *dpy, int screen, const int *attribList, int *nitems);
-extern GLXContext   (*glXCreateContext_evgl_thread_cmd)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
-extern GLXContext   (*glXCreateNewContext_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
-extern GLXPbuffer   (*glXCreatePbuffer_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, const int *attribList);
-extern void         (*glXCreatePixmap_orig_evgl_set)(void *func);
-extern void        *(*glXCreatePixmap_orig_evgl_get)(void);
-extern GLXPixmap    (*glXCreatePixmap_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-extern GLXWindow    (*glXCreateWindow_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
-extern void         (*glXDestroyContext_evgl_thread_cmd)(Display *dpy, GLXContext ctx);
-extern void         (*glXDestroyPbuffer_evgl_thread_cmd)(Display *dpy, GLXPbuffer pbuf);
-extern void         (*glXDestroyPixmap_orig_evgl_set)(void *func);
-extern void        *(*glXDestroyPixmap_orig_evgl_get)(void);
-extern void         (*glXDestroyPixmap_evgl_thread_cmd)(Display *dpy, GLXPixmap pixmap);
-extern void         (*glXDestroyWindow_evgl_thread_cmd)(Display *dpy, GLXWindow window);
-extern int          (*glXGetConfig_evgl_thread_cmd)(Display *dpy, XVisualInfo *visual, int attrib, int *value);
-extern GLXContext   (*glXGetCurrentContext_evgl_thread_cmd)(void);
-extern int          (*glXGetFBConfigAttrib_evgl_thread_cmd)(Display *dpy, GLXFBConfig config, int attribute, int *value);
-extern void         (*glXGetVideoSync_orig_evgl_set)(void *func);
-extern void        *(*glXGetVideoSync_orig_evgl_get)(void);
-extern int          (*glXGetVideoSync_evgl_thread_cmd)(unsigned int *count);
-extern XVisualInfo *(*glXGetVisualFromFBConfig_evgl_thread_cmd)(Display *dpy, GLXFBConfig config);
-extern Bool         (*glXMakeContextCurrent_evgl_thread_cmd)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
-extern void         (*glXQueryDrawable_orig_evgl_set)(void *func);
-extern void        *(*glXQueryDrawable_orig_evgl_get)(void);
-extern void         (*glXQueryDrawable_evgl_thread_cmd)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-extern Bool         (*glXQueryExtension_evgl_thread_cmd)(Display *dpy, int *errorb, int *event);
-extern const char  *(*glXQueryExtensionsString_evgl_thread_cmd)(Display *dpy, int screen);
-extern void         (*glXReleaseBuffersMESA_orig_evgl_set)(void *func);
-extern void        *(*glXReleaseBuffersMESA_orig_evgl_get)(void);
-extern Bool         (*glXReleaseBuffersMESA_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable);
-extern void         (*glXReleaseTexImage_orig_evgl_set)(void *func);
-extern void        *(*glXReleaseTexImage_orig_evgl_get)(void);
-extern void         (*glXReleaseTexImage_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int buffer);
-extern void         (*glXSwapBuffers_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable);
-extern void         (*glXSwapIntervalEXT_orig_evgl_set)(void *func);
-extern void        *(*glXSwapIntervalEXT_orig_evgl_get)(void);
-extern void         (*glXSwapIntervalEXT_evgl_thread_cmd)(Display *dpy, GLXDrawable drawable, int interval);
-extern void         (*glXSwapIntervalSGI_orig_evgl_set)(void *func);
-extern void        *(*glXSwapIntervalSGI_orig_evgl_get)(void);
-extern int          (*glXSwapIntervalSGI_evgl_thread_cmd)(int interval);
-extern void         (*glXWaitVideoSync_orig_evgl_set)(void *func);
-extern void        *(*glXWaitVideoSync_orig_evgl_get)(void);
-extern int          (*glXWaitVideoSync_evgl_thread_cmd)(int divisor, int remainder, unsigned int *count);
+#undef EVAS_TH_GLX_FN_ASYNC
+#undef EVAS_TH_GLX_FN
 
-
-extern void _glx_thread_link_init();
+extern void _glx_thread_link_init(void *func_ptr);
 
 
 #endif /* EVAS_GL_RENDER_THREAD_COMPILE_FOR_GL_GENERIC */
 
+
 #endif /* ! GL_GLES */
 
 #endif /* EVAS_GL_THREAD_GLX_H */
index 6d9f8cc..802749e 100644 (file)
@@ -312,7 +312,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
    Evas_Native_Surface *n = im->native.data;
 
    if (n->type == EVAS_NATIVE_SURFACE_OPENGL)
-     glBindTexture_thread_cmd(GL_TEXTURE_2D, n->data.opengl.texture_id);
+     GL_TH(glBindTexture, GL_TEXTURE_2D, n->data.opengl.texture_id);
 }
 
 static void
@@ -322,7 +322,7 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
   Evas_Native_Surface *n = im->native.data;
 
   if (n->type == EVAS_NATIVE_SURFACE_OPENGL)
-    glBindTexture_thread_cmd(GL_TEXTURE_2D, 0);
+    GL_TH(glBindTexture, GL_TEXTURE_2D, 0);
 }
 
 static void
@@ -1591,8 +1591,6 @@ eng_gl_make_current(void *data, void *surface, void *context)
 
    if ((sfc) && (ctx))
      {
-        if (!sfc->thread_rendering)
-          {
              Evas_Engine_GL_Context *gl_context;
 
              gl_context = re->window_gl_context_get(re->software.ob);
@@ -1605,7 +1603,6 @@ eng_gl_make_current(void *data, void *surface, void *context)
                      evas_gl_common_context_done(gl_context);
                }
           }
-     }
 
    ret = evgl_make_current(data, sfc, ctx);
    CONTEXT_STORE(data, surface, context);
@@ -1718,9 +1715,6 @@ eng_gl_surface_direct_renderable_get(void *data, Evas_Native_Surface *ns, Eina_B
    Evas_Engine_GL_Context *gl_context;
    Evas_GL_Image *sfc = surface;
 
-   if (evas_gl_thread_enabled())
-     return EINA_FALSE;
-
    if (!re) return EINA_FALSE;
    EVGLINIT(data, EINA_FALSE);
    if (!ns) return EINA_FALSE;
@@ -1768,42 +1762,44 @@ typedef struct
    Evas_Object_Image_Pixels_Get_Cb cb;
    void *get_pixels_data;
    Evas_Object *o;
-} Evas_GL_Thread_Command_get_pixels;
+} GL_TH_ST(eng_gl_get_pixels);
 
 static void
-_evgl_thread_get_pixels(void *data)
+GL_TH_CB(eng_gl_get_pixels)(void *data)
 {
-   Evas_GL_Thread_Command_get_pixels *thread_param =
-      (Evas_GL_Thread_Command_get_pixels *)data;
+   GL_TH_ST(eng_gl_get_pixels) *thread_data = *(void **)data;
 
-  evas_evgl_thread_begin();
-  thread_param->cb(thread_param->get_pixels_data, thread_param->o);
-  evas_evgl_thread_end();
-
-  eina_mempool_free(_mp_command, thread_param);
+  thread_data->cb(thread_data->get_pixels_data, thread_data->o);
 }
 
 static void
-get_pixels_evgl_thread_cmd(Evas_Object_Image_Pixels_Get_Cb cb, void *get_pixels_data, Evas_Object *o)
+GL_TH_FN(eng_gl_get_pixels)(Evas_Object_Image_Pixels_Get_Cb cb, void *get_pixels_data, Evas_Object *o)
 {
-   if (!evas_gl_thread_enabled()) /* XXX */
+  int thread_mode = EVAS_GL_THREAD_MODE_FINISH;
+
+   GL_TH_ST(eng_gl_get_pixels) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_EVGL)) /* XXX */
      {
         cb(get_pixels_data, o);
         return;
      }
 
-   Evas_GL_Thread_Command_get_pixels *thread_param;
-   thread_param = eina_mempool_malloc(_mp_command,
-                                      sizeof(Evas_GL_Thread_Command_get_pixels));
-   if (!thread_param) return;
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(eng_gl_get_pixels) *) + sizeof(GL_TH_ST(eng_gl_get_pixels)), &thcmd_ref);
+   *thread_data_ptr = (void *)(thread_data_ptr + sizeof(GL_TH_ST(eng_gl_get_pixels) *));
+   thread_data = *thread_data_ptr;
+
+   if (!evas_gl_thread_force_finish())
+     thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
 
-   thread_param->cb = cb;
-   thread_param->get_pixels_data = get_pixels_data;
-   thread_param->o = o;
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
-                              _evgl_thread_get_pixels,
-                              thread_param,
-                              EVAS_GL_THREAD_MODE_FLUSH);
+   thread_data->cb = cb;
+   thread_data->get_pixels_data = get_pixels_data;
+   thread_data->o = o;
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(eng_gl_get_pixels),
+                              thread_mode);
 }
 
 static void
@@ -1823,7 +1819,7 @@ eng_gl_get_pixels(void *data EINA_UNUSED, Evas_Object_Image_Pixels_Get_Cb cb, vo
                {
                   if (sfc->thread_rendering)
                     {
-                       get_pixels_evgl_thread_cmd(cb, get_pixels_data, o);
+                       GL_TH_FN(eng_gl_get_pixels)(cb, get_pixels_data, o);
                        return;
                     }
                }
@@ -1892,20 +1888,20 @@ eng_gl_surface_read_pixels(void *data EINA_UNUSED, void *surface,
     * But some devices don't support GL_BGRA, so we still need to convert.
     */
 
-   glGetIntegerv_thread_cmd(GL_FRAMEBUFFER_BINDING, &fbo);
+   GL_TH(glGetIntegerv, GL_FRAMEBUFFER_BINDING, &fbo);
    if (fbo != (GLint) im->tex->pt->fb)
-     glsym_glBindFramebuffer(GL_FRAMEBUFFER, im->tex->pt->fb);
-   glPixelStorei_thread_cmd(GL_PACK_ALIGNMENT, 4);
+     GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, im->tex->pt->fb);
+   GL_TH(glPixelStorei, GL_PACK_ALIGNMENT, 4);
 
    // With GLX we will try to read BGRA even if the driver reports RGBA
 #if defined(GL_GLES) && defined(GL_IMPLEMENTATION_COLOR_READ_FORMAT)
-   glGetIntegerv_thread_cmd(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &fmt);
+   GL_TH(glGetIntegerv, GL_IMPLEMENTATION_COLOR_READ_FORMAT, &fmt);
 #endif
 
    if ((im->tex->pt->format == GL_BGRA) && (fmt == GL_BGRA))
      {
-        glReadPixels_thread_cmd(x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
-        done = (glGetError_thread_cmd() == GL_NO_ERROR);
+        GL_TH(glReadPixels, x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
+        done = (GL_TH(glGetError) == GL_NO_ERROR);
      }
 
    if (!done)
@@ -1913,7 +1909,7 @@ eng_gl_surface_read_pixels(void *data EINA_UNUSED, void *surface,
         DATA32 *ptr = pixels;
         int k;
 
-        glReadPixels_thread_cmd(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+        GL_TH(glReadPixels, x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
         for (k = w * h; k; --k)
           {
              const DATA32 v = *ptr;
@@ -1924,7 +1920,7 @@ eng_gl_surface_read_pixels(void *data EINA_UNUSED, void *surface,
      }
 
    if (fbo != (GLint) im->tex->pt->fb)
-     glsym_glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+     GL_TH_CALL(glBindFramebuffer, glsym_glBindFramebuffer, GL_FRAMEBUFFER, fbo);
 
    return EINA_TRUE;
 }
index c5ab85f..32a1f89 100644 (file)
@@ -85,7 +85,7 @@ void     (*glsym_eglDestroyImage)              (EGLDisplay a, void *b) = NULL;
 void     (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b)  = NULL;
 unsigned int   (*glsym_eglSwapBuffersWithDamage) (EGLDisplay a, void *b, const EGLint *d, EGLint c) = NULL;
 unsigned int   (*glsym_eglSetDamageRegion)  (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d) = NULL;
-unsigned int (*glsym_eglQueryWaylandBuffer)(EGLDisplay a, /*struct wl_resource */void *b, EGLint c, EGLint *d) = NULL;
+unsigned int (*glsym_eglQueryWaylandBufferWL)(EGLDisplay a, /*struct wl_resource */void *b, EGLint c, EGLint *d) = NULL;
 
 #else
 
@@ -105,15 +105,6 @@ void     (*glsym_glXReleaseBuffersMESA)   (Display *a, XID b) = NULL;
 
 #endif
 
-#define REPLACE_THREAD(prefix, dst, typ) \
-   if (prefix##dst && (typ)prefix##dst != (typ)dst##_thread_cmd) \
-     { \
-        dst##_orig_evas_set(prefix##dst); \
-        prefix##dst = (typ)dst##_thread_cmd; \
-     }
-
-void (*glsym_evas_gl_common_surface_cache_dump)(void) = NULL;
-
 static inline Outbuf *
 eng_get_ob(Render_Engine *re)
 {
@@ -168,6 +159,110 @@ evgl_eng_evas_surface_get(void *data)
       return NULL;
 }
 
+#ifdef GL_GLES
+static EGLDisplay main_dpy  = EGL_NO_DISPLAY;
+static EGLSurface main_draw = EGL_NO_SURFACE;
+static EGLSurface main_read = EGL_NO_SURFACE;
+static EGLContext main_ctx  = EGL_NO_CONTEXT;
+
+EGLContext
+evas_eglGetCurrentContext(GL_X11_Context_Type type)
+{
+   if (type == GL_X11_CONTEXT_TYPE_EVAS)
+     {
+        return GL_TH(eglGetCurrentContext);
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL)
+     {
+        return EVGL_TH(eglGetCurrentContext);
+     }
+   else
+     {
+        if (eina_main_loop_is())
+           return main_ctx;
+        else
+           return eglGetCurrentContext();
+     }
+}
+
+EGLSurface
+evas_eglGetCurrentSurface(GL_X11_Context_Type type, EGLint readdraw)
+{
+   if (type == GL_X11_CONTEXT_TYPE_EVAS && evas_gl_thread_enabled())
+     {
+        return GL_TH(eglGetCurrentSurface, readdraw);
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL && evas_evgl_thread_enabled())
+     {
+        return EVGL_TH(eglGetCurrentSurface, readdraw);
+     }
+   else
+     {
+        if (eina_main_loop_is())
+           return (readdraw == EGL_READ) ? main_read : main_draw;
+        else
+           return eglGetCurrentSurface(readdraw);
+     }
+}
+
+EGLDisplay
+evas_eglGetCurrentDisplay(GL_X11_Context_Type type)
+{
+   if (type == GL_X11_CONTEXT_TYPE_EVAS && evas_gl_thread_enabled())
+     {
+        return GL_TH(eglGetCurrentDisplay);
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL && evas_evgl_thread_enabled())
+     {
+        return EVGL_TH(eglGetCurrentDisplay);
+     }
+   else
+     {
+        if (eina_main_loop_is())
+           return main_ctx;
+        else
+           return eglGetCurrentDisplay();
+     }
+}
+
+EGLBoolean
+evas_eglMakeCurrent(GL_X11_Context_Type type, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
+{
+   if (type == GL_X11_CONTEXT_TYPE_EVAS && evas_gl_thread_enabled())
+     {
+        return GL_TH(eglMakeCurrent, dpy, draw, read, ctx);
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL && evas_evgl_thread_enabled())
+     {
+        return EVGL_TH(eglMakeCurrent, dpy, draw, read, ctx);
+     }
+   else
+     {
+        if (eina_main_loop_is())
+          {
+             EGLBoolean ret;
+
+             if ((dpy == main_dpy) && (draw == main_draw) &&
+                 (read == main_read) && (ctx == main_ctx))
+               return EGL_TRUE;
+
+             ret = eglMakeCurrent(dpy, draw, read, ctx);
+             if (ret)
+               {
+                  main_dpy  = dpy;
+                  main_draw = draw;
+                  main_read = read;
+                  main_ctx  = ctx;
+               }
+             return ret;
+          }
+        else
+          return eglMakeCurrent(dpy, draw, read, ctx);
+     }
+   return EGL_FALSE;
+}
+#endif
+
 static int
 evgl_eng_make_current(void *data, void *surface, void *context, int flush)
 {
@@ -182,7 +277,6 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
         return 0;
      }
 
-
 #ifdef GL_GLES
    EGLContext ctx = (EGLContext)context;
    EGLSurface sfc = (EGLSurface)surface;
@@ -190,25 +284,21 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
 
    if ((!context) && (!surface))
      {
-        if (!eglGetCurrentContext_thread_cmd() &&
-            !eglGetCurrentSurface_thread_cmd(EGL_READ) &&
-            !eglGetCurrentSurface_thread_cmd(EGL_DRAW))
-          return 1;
-        ret = eglMakeCurrent_thread_cmd(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        ret = evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVGL, dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
         if (!ret)
           {
-             int err = eglGetError_thread_cmd();
+             int err = eglGetError();
              glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
-             ERR("eglMakeCurrent() failed! Error Code=%#x", err);
+             ERR("evas_eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
           }
         return 1;
      }
 
    // FIXME: Check (eglGetCurrentDisplay() != dpy) ?
-   if ((eglGetCurrentContext_thread_cmd() != ctx) ||
-       (eglGetCurrentSurface_thread_cmd(EGL_READ) != sfc) ||
-       (eglGetCurrentSurface_thread_cmd(EGL_DRAW) != sfc) )
+   if ((evas_eglGetCurrentContext(GL_X11_CONTEXT_TYPE_EVGL) != ctx) ||
+       (evas_eglGetCurrentSurface(GL_X11_CONTEXT_TYPE_EVGL, EGL_READ) != sfc) ||
+       (evas_eglGetCurrentSurface(GL_X11_CONTEXT_TYPE_EVGL, EGL_DRAW) != sfc) )
      {
 
         //!!!! Does it need to be flushed with it's set to NULL above??
@@ -216,13 +306,13 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
         if (flush) eng_window_use(NULL);
 
         // Do a make current
-        ret = eglMakeCurrent_thread_cmd(dpy, sfc, sfc, ctx);
+        ret = evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVGL, dpy, sfc, sfc, ctx);
 
         if (!ret)
           {
-             int err = eglGetError_thread_cmd();
+             int err = eglGetError();
              glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
-             ERR("eglMakeCurrent() failed! Error Code=%#x", err);
+             ERR("evas_eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
           }
      }
@@ -234,7 +324,7 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
 
    if ((!context) && (!surface))
      {
-        ret = __glXMakeContextCurrent(eng_get_ob(re)->info->info.display, 0, NULL);
+        ret = __glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVGL, eng_get_ob(re)->info->info.display, 0, NULL);
         if (!ret)
           {
              ERR("glXMakeContextCurrent() failed!");
@@ -254,10 +344,12 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
         // Do a make current
         if ((sfc == eng_get_ob(re)->win) ||
             (sfc == eng_get_ob(re)->glxwin))
-          ret = __glXMakeContextCurrent(eng_get_ob(re)->info->info.display,
+          ret = __glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVGL,
+                                                       eng_get_ob(re)->info->info.display,
                                         eng_get_ob(re)->glxwin, ctx);
         else
-          ret = __glXMakeContextCurrent(eng_get_ob(re)->info->info.display,
+          ret = __glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVGL,
+                                                       eng_get_ob(re)->info->info.display,
                                         sfc, ctx);
         if (!ret)
           {
@@ -1262,9 +1354,8 @@ gl_symbols(void)
    FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn);
    FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn);
 
-   FINDSYM(glsym_eglQueryWaylandBuffer, "eglQueryWaylandBufferWL",
+   FINDSYM(glsym_eglQueryWaylandBufferWL, "eglQueryWaylandBufferWL",
            glsym_func_uint)
-   REPLACE_THREAD(glsym_, eglQueryWaylandBuffer, glsym_func_eng_fn);
 #else
 #define FINDSYM(dst, sym, typ) \
    if (glsym_glXGetProcAddress) { \
@@ -1309,15 +1400,12 @@ eng_gl_symbols(void)
    FINDSYM(glsym_eglDestroyImage, "eglDestroyImage", glsym_func_void);
 
    FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void);
-   REPLACE_THREAD(glsym_, glEGLImageTargetTexture2DOES, glsym_func_void);
 
    FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageEXT", glsym_func_uint);
    FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageINTEL", glsym_func_uint);
    FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamage", glsym_func_uint);
-   REPLACE_THREAD(glsym_, eglSwapBuffersWithDamage, glsym_func_uint);
 
    FINDSYM(glsym_eglSetDamageRegion, "eglSetDamageRegionKHR", glsym_func_uint);
-   REPLACE_THREAD(glsym_, eglSetDamageRegion, glsym_func_uint);
 
 
 #else
@@ -1401,8 +1489,8 @@ gl_extn_veto(Render_Engine *re)
           {
              const GLubyte *vendor, *renderer;
 
-             vendor = glGetString_thread_cmd(GL_VENDOR);
-             renderer = glGetString_thread_cmd(GL_RENDERER);
+             vendor = GL_TH(glGetString, GL_VENDOR);
+             renderer = GL_TH(glGetString, GL_RENDERER);
              // XXX: workaround mesa bug!
              // looking for mesa and intel build which is known to
              // advertise the EGL_NOK_texture_from_pixmap extension
@@ -1833,7 +1921,7 @@ eng_output_free(void *data)
 
 #ifndef GL_GLES
         if (glsym_glXReleaseBuffersMESA)
-          glsym_glXReleaseBuffersMESA(disp, win);
+          GL_TH_CALL(glXReleaseBuffersMESA, glsym_glXReleaseBuffersMESA, disp, win);
 #endif
         gl_wins--;
 
@@ -1858,10 +1946,10 @@ eng_preload_make_current(void *data, void *doit)
    if (doit)
      {
 #ifdef GL_GLES
-        if (!eglMakeCurrent_thread_cmd(ob->egl_disp, ob->egl_surface[0], ob->egl_surface[0], ob->egl_context[0]))
+        if (!evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, ob->egl_disp, ob->egl_surface, ob->egl_surface, ob->egl_context))
           return EINA_FALSE;
 #else
-        if (!__glXMakeContextCurrent(ob->info->info.display, ob->glxwin, ob->context))
+        if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, ob->info->info.display, ob->glxwin, ob->context))
           {
              ERR("glXMakeContextCurrent(%p, %p, %p) failed",
                  ob->info->info.display, (void *)ob->win, (void *)ob->context);
@@ -1873,10 +1961,10 @@ eng_preload_make_current(void *data, void *doit)
    else
      {
 #ifdef GL_GLES
-        if (!eglMakeCurrent_thread_cmd(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
+        if (!evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
           return EINA_FALSE;
 #else
-        if (!__glXMakeContextCurrent(ob->info->info.display, 0, NULL))
+        if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, ob->info->info.display, 0, NULL))
           {
              ERR("glXMakeContextCurrent(%p, None, NULL) failed",
                  ob->info->info.display);
@@ -1921,10 +2009,10 @@ eng_gl_current_context_get(void *data EINA_UNUSED)
    context = glsym_evgl_current_native_context_get(ctx);
 
 #ifdef GL_GLES
-   if (eglGetCurrentContext_thread_cmd() == context)
+   if (evas_eglGetCurrentContext(GL_X11_CONTEXT_TYPE_EVAS) == context)
      return ctx;
 #else
-   if (glXGetCurrentContext() == context)
+   if (GL_TH(glXGetCurrentContext) == context)
      return ctx;
 #endif
 
@@ -1940,7 +2028,7 @@ eng_gl_error_get(void *data)
      goto end;
 
 #ifdef GL_GLES
-   err = eglGetError_thread_cmd() - EGL_SUCCESS;
+   err = GL_TH(eglGetError) - EGL_SUCCESS;
 #else
    Render_Engine *re = data;
 
@@ -1980,7 +2068,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
          {
             if (glsym_glEGLImageTargetTexture2DOES)
               {
-                 glsym_glEGLImageTargetTexture2DOES(im->native.target, n->ns_data.x11.surface);
+                 GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, im->native.target, n->ns_data.x11.surface);
                  GLERRV("glsym_glEGLImageTargetTexture2DOES");
               }
             else
@@ -1992,7 +2080,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
 
        if (glsym_glXBindTexImage)
          {
-            glsym_glXBindTexImage(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
+            GL_TH_CALL(glXBindTexImage, glsym_glXBindTexImage, eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
                                   GLX_FRONT_LEFT_EXT, NULL);
             GLERRV("glsym_glXBindTexImage");
          }
@@ -2003,7 +2091,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
     }
   else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
     {
-       glBindTexture_thread_cmd(im->native.target, n->ns.data.opengl.texture_id);
+       GL_TH(glBindTexture, im->native.target, n->ns.data.opengl.texture_id);
     }
   else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
     {
@@ -2012,7 +2100,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
          {
             if (glsym_glEGLImageTargetTexture2DOES)
               {
-                 glsym_glEGLImageTargetTexture2DOES(im->native.target, n->ns_data.tbm.surface);
+                 GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, im->native.target, n->ns_data.tbm.surface);
                  GLERRV("glsym_glEGLImageTargetTexture2DOES");
               }
              else
@@ -2034,7 +2122,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
 #ifdef GL_GLES
                  if (glsym_glEGLImageTargetTexture2DOES)
                    {
-                      glsym_glEGLImageTargetTexture2DOES(im->native.target, surface);
+                      GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, im->native.target, surface);
                       GLERRV("glsym_glEGLImageTargetTexture2DOES");
                    }
                  else
@@ -2043,7 +2131,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
               }
             else
               {
-                 glBindTexture_thread_cmd(GL_TEXTURE_2D, (GLuint)(uintptr_t)surface);
+                 GL_TH(glBindTexture, GL_TEXTURE_2D, (GLuint)(uintptr_t)surface);
               }
          }
     }
@@ -2055,7 +2143,7 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
           {
              if (glsym_glEGLImageTargetTexture2DOES)
                {
-                  glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->ns_data.wl_surface.surface);
+                  GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_2D, n->ns_data.wl_surface.surface);
                   GLERRV("glsym_glEGLImageTargetTexture2DOES");
                }
              else
@@ -2082,7 +2170,7 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
 
         if (glsym_glXReleaseTexImage)
           {
-             glsym_glXReleaseTexImage(eng_get_ob(re)->disp, (XID)(n->ns_data.x11.surface),
+             GL_TH_CALL(glXReleaseTexImage, glsym_glXReleaseTexImage, eng_get_ob(re)->disp, (XID)(n->ns_data.x11.surface),
                                       GLX_FRONT_LEFT_EXT);
           }
         else
@@ -2092,7 +2180,7 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
      }
    else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
      {
-        glBindTexture_thread_cmd(im->native.target, 0);
+        GL_TH(glBindTexture, im->native.target, 0);
      }
    else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
      {
@@ -2103,7 +2191,7 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
 #ifdef GL_GLES
         // nothing
 #else
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, 0);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, 0);
 #endif
      }
 }
@@ -2133,7 +2221,7 @@ _native_free_cb(void *data, void *image)
               {
                  glsym_eglDestroyImage(eng_get_ob(re)->egl_disp,
                                        n->ns_data.x11.surface);
-                 if ((err = eglGetError()) != EGL_SUCCESS)
+                 if ((err = GL_TH(eglGetError)) != EGL_SUCCESS)
                    {
                       ERR("eglDestroyImage() failed.");
                       glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
@@ -2150,7 +2238,7 @@ _native_free_cb(void *data, void *image)
               {
                  if (glsym_glXReleaseTexImage)
                    {
-                     glsym_glXReleaseTexImage(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
+                     GL_TH_CALL(glXReleaseTexImage, glsym_glXReleaseTexImage, eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
                                               GLX_FRONT_LEFT_EXT);
                    }
                  else
@@ -2158,7 +2246,7 @@ _native_free_cb(void *data, void *image)
               }
             if (glsym_glXDestroyPixmap)
               {
-                 glsym_glXDestroyPixmap(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface);
+                 GL_TH_CALL(glXDestroyPixmap, glsym_glXDestroyPixmap, eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface);
                  GLERRV("glsym_glXDestroyPixmap");
               }
             else
@@ -2184,7 +2272,7 @@ _native_free_cb(void *data, void *image)
               {
                  glsym_eglDestroyImage(eng_get_ob(re)->egl_disp,
                                        n->ns_data.tbm.surface);
-                 if ((err = eglGetError()) != EGL_SUCCESS)
+                 if ((err = GL_TH(eglGetError)) != EGL_SUCCESS)
                    {
                       ERR("eglDestroyImage() failed.");
                       glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
@@ -2210,7 +2298,7 @@ _native_free_cb(void *data, void *image)
              if (glsym_eglDestroyImage)
                {
                   glsym_eglDestroyImage(eng_get_ob(re)->egl_disp, n->ns_data.wl_surface.surface);
-                  if (eglGetError() != EGL_SUCCESS)
+                  if (GL_TH(eglGetError) != EGL_SUCCESS)
                     ERR("eglDestroyImage() failed.");
                }
              else
@@ -2502,7 +2590,7 @@ eng_image_native_set(void *data, void *image, void *native)
                  if (!eglChooseConfig(eng_get_ob(re)->egl_disp, config_attrs,
                                       &egl_config, 1, &num_config))
                    {
-                      int err = eglGetError();
+                      int err = GL_TH(eglGetError);
                       ERR("eglChooseConfig() failed for pixmap 0x%x, num_config = %i with error %d",
                                                              (unsigned int)pm, num_config, err);
                       glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
@@ -2698,7 +2786,8 @@ eng_image_native_set(void *data, void *image, void *native)
                       n->ns_data.x11.pixmap = pm;
                       n->ns_data.x11.visual = vis;
                       if (glsym_glXCreatePixmap)
-                        n->ns_data.x11.surface = (void *)glsym_glXCreatePixmap(eng_get_ob(re)->disp,
+                        n->ns_data.x11.surface = (void *)GL_TH_CALL(glXCreatePixmap, glsym_glXCreatePixmap,
+                                                                   eng_get_ob(re)->disp,
                                                                    n->ns_data.x11.config,
                                                                    n->ns_data.x11.pixmap,
                                                                    pixmap_att);
@@ -2712,7 +2801,8 @@ eng_image_native_set(void *data, void *image, void *native)
                              {
                                 ERR("no target :(");
                                 if (glsym_glXQueryDrawable)
-                                  glsym_glXQueryDrawable(eng_get_ob(re)->disp,
+                                  GL_TH_CALL(glXQueryDrawable, glsym_glXQueryDrawable,
+                                             eng_get_ob(re)->disp,
                                                          n->ns_data.x11.pixmap,
                                                          GLX_TEXTURE_TARGET_EXT,
                                                          &target);
@@ -2861,8 +2951,8 @@ eng_image_native_set(void *data, void *image, void *native)
                   EGLint attribs[3];
                   int format, yinvert = 1;
 
-                  glsym_eglQueryWaylandBuffer(eng_get_ob(re)->egl_disp, wl_buf,
-                                              EGL_TEXTURE_FORMAT, &format); // TODO : THREAD
+                  GL_TH_CALL(eglQueryWaylandBufferWL, glsym_eglQueryWaylandBufferWL, eng_get_ob(re)->egl_disp, wl_buf,
+                             EGL_TEXTURE_FORMAT, &format);
                   if ((format != EGL_TEXTURE_RGB) &&
                       (format != EGL_TEXTURE_RGBA))
                     {
@@ -2877,9 +2967,8 @@ eng_image_native_set(void *data, void *image, void *native)
                   attribs[2] = EGL_NONE;
 
                   memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
-                  if (glsym_eglQueryWaylandBuffer(eng_get_ob(re)->egl_disp, wl_buf,
-                                                    EGL_WAYLAND_Y_INVERTED_WL,
-                                                    &yinvert) == EGL_FALSE)
+                  if (GL_TH_CALL(eglQueryWaylandBufferWL, glsym_eglQueryWaylandBufferWL, eng_get_ob(re)->egl_disp, wl_buf,
+                                 EGL_WAYLAND_Y_INVERTED_WL, &yinvert) == EGL_FALSE)
                     yinvert = 1;
                   eina_hash_add(eng_get_ob(re)->gl_context->shared->native_wl_hash,
                                 &wlid, im);
@@ -2911,7 +3000,7 @@ eng_image_native_set(void *data, void *image, void *native)
                     }
 
                   //XXX: workaround for mesa-10.2.8
-                  // mesa's eglQueryWaylandBuffer() with EGL_WAYLAND_Y_INVERTED_WL works incorrect.
+                  // mesa's eglQueryWaylandBufferWL() with EGL_WAYLAND_Y_INVERTED_WL works incorrect.
                   //im->native.yinvert = yinvert;
                   im->native.yinvert = 1;
                   im->native.loose = 0;
@@ -2981,8 +3070,8 @@ module_open(Evas_Module *em)
    if (!(platform_env = getenv("EGL_PLATFORM")))
       setenv("EGL_PLATFORM", "x11", 0);
 
+   evas_gl_thread_link_init();
    gl_symbols();
-   _init_thread_egl_use();
 
    if (!platform_env)
       unsetenv("EGL_PLATFORM");
index 7fd9367..a86be49 100644 (file)
@@ -115,10 +115,46 @@ _tls_rgba_context_set(GLXContext ctx)
 }
 
 Eina_Bool
-__glXMakeContextCurrent(Display *disp, GLXDrawable glxwin, GLXContext context)
+__glXMakeContextCurrent(GL_X11_Context_Type type, Display *disp, GLXDrawable glxwin, GLXContext context)
 {
+#if 1 // TEST
+   if (type == GL_X11_CONTEXT_TYPE_EVAS)
+     {
+        if (!GL_TH(glXMakeContextCurrent, disp, glxwin, glxwin, context)) return EINA_FALSE;
+        return EINA_TRUE;
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL)
+     {
+        if (!EVGL_TH(glXMakeContextCurrent, disp, glxwin, glxwin, context)) return EINA_FALSE;
+        return EINA_TRUE;
+     }
+   else
+     {
    if (!glXMakeContextCurrent(disp, glxwin, glxwin, context)) return EINA_FALSE;
    return EINA_TRUE;
+     }
+   return EINA_FALSE;
+#else
+   if (type == GL_X11_CONTEXT_TYPE_EVAS && evas_gl_thread_enabled())
+     {
+        void *ret = GL_TH(glXMakeContextCurrentASYNC_begin, disp, glxwin, glxwin, context);
+        if (!ret) ERR("NO ASYNC RETURN!");
+        if (!GL_TH(glXMakeContextCurrentASYNC_end, ret)) return EINA_FALSE;
+        ERR("GOOD ASYNC RETURN TRUE!");
+        return EINA_TRUE;
+     }
+   else if (type == GL_X11_CONTEXT_TYPE_EVGL && evas_evgl_thread_enabled())
+     {
+        if (!EVGL_TH(glXMakeContextCurrent, disp, glxwin, glxwin, context)) return EINA_FALSE;
+        return EINA_TRUE;
+     }
+   else
+     {
+        if (!glXMakeContextCurrent(disp, glxwin, glxwin, context)) return EINA_FALSE;
+        return EINA_TRUE;
+     }
+   return EINA_FALSE;
+#endif
 }
 #endif
 
@@ -219,19 +255,19 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info,
    gw->egl_disp = eglGetDisplay((EGLNativeDisplayType)(gw->disp));
    if (!gw->egl_disp)
      {
-        ERR("eglGetDisplay() fail. code=%#x", eglGetError());
+        ERR("eglGetDisplay() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
    if (!eglInitialize(gw->egl_disp, &major_version, &minor_version))
      {
-        ERR("eglInitialize() fail. code=%#x", eglGetError());
+        ERR("eglInitialize() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
-   if (!eglBindAPI_thread_cmd(EGL_OPENGL_ES_API))
+   if (!GL_TH(eglBindAPI, EGL_OPENGL_ES_API))
      {
-        ERR("eglBindAPI() fail. code=%#x", eglGetError_thread_cmd());
+        ERR("eglBindAPI() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
@@ -243,7 +279,7 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info,
                                                NULL);
    if (gw->egl_surface[0] == EGL_NO_SURFACE)
      {
-        int err = eglGetError();
+        int err = GL_TH(eglGetError);
         printf("surf creat fail! %x\n", err);
         ERR("eglCreateWindowSurface() fail for %#x. code=%#x",
             (unsigned int)gw->win, err);
@@ -261,7 +297,7 @@ try_gles2:
      (gw->egl_disp, gw->egl_config, context, context_attrs);
    if (gw->egl_context[0] == EGL_NO_CONTEXT)
      {
-        ERR("eglCreateContext() fail. code=%#x", eglGetError());
+        ERR("eglCreateContext() fail. code=%#x", GL_TH(eglGetError));
         if (gw->gles3)
           {
              /* Note: this shouldn't happen */
@@ -276,20 +312,20 @@ try_gles2:
      _tls_context_set(gw->egl_context[0]);
    
    SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(gw->egl_disp,
+   if (evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS,
                       gw->egl_surface[0],
                       gw->egl_surface[0],
                       gw->egl_context[0]) == EGL_FALSE)
      {
-        ERR("eglMakeCurrent() fail. code=%#x", eglGetError_thread_cmd());
+        ERR("evas_eglMakeCurrent() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
 
-   vendor = glGetString_thread_cmd(GL_VENDOR);
-   renderer = glGetString_thread_cmd(GL_RENDERER);
-   version = glGetString_thread_cmd(GL_VERSION);
-   glslversion = glGetString_thread_cmd(GL_SHADING_LANGUAGE_VERSION);
+   vendor = GL_TH(glGetString, GL_VENDOR);
+   renderer = GL_TH(glGetString, GL_RENDERER);
+   version = GL_TH(glGetString, GL_VERSION);
+   glslversion = GL_TH(glGetString, GL_SHADING_LANGUAGE_VERSION);
    if (!vendor)   vendor   = (unsigned char *)"-UNKNOWN-";
    if (!renderer) renderer = (unsigned char *)"-UNKNOWN-";
    if (!version)  version  = (unsigned char *)"-UNKNOWN-";
@@ -420,7 +456,7 @@ try_gles2:
         eng_window_free(gw);
         return NULL;
      }
-   if (!__glXMakeContextCurrent(gw->disp, gw->glxwin, gw->context))
+   if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->disp, gw->glxwin, gw->context))
      {
         ERR("glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->win, (void *)gw->context);
         eng_window_free(gw);
@@ -428,10 +464,10 @@ try_gles2:
      }
    // FIXME: move this up to context creation
 
-   vendor = glGetString_thread_cmd(GL_VENDOR);
-   renderer = glGetString_thread_cmd(GL_RENDERER);
-   version = glGetString_thread_cmd(GL_VERSION);
-   glslversion = glGetString_thread_cmd(GL_SHADING_LANGUAGE_VERSION);
+   vendor = GL_TH(glGetString, GL_VENDOR);
+   renderer = GL_TH(glGetString, GL_RENDERER);
+   version = GL_TH(glGetString, GL_VERSION);
+   glslversion = GL_TH(glGetString, GL_SHADING_LANGUAGE_VERSION);
    if (!vendor)   vendor   = (unsigned char *)"-UNKNOWN-";
    if (!renderer) renderer = (unsigned char *)"-UNKNOWN-";
    if (!version)  version  = (unsigned char *)"-UNKNOWN-";
@@ -591,7 +627,7 @@ eng_window_free(Outbuf *gw)
      }
 #ifdef GL_GLES
    SET_RESTORE_CONTEXT();
-   eglMakeCurrent_thread_cmd(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+   evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    if (gw->egl_surface[0] != EGL_NO_SURFACE)
       eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
    if (gw->egl_surface[1] != EGL_NO_SURFACE)
@@ -601,10 +637,10 @@ eng_window_free(Outbuf *gw)
    if (ref == 0)
      {
         if (context) eglDestroyContext(gw->egl_disp, context);
-        eglTerminate(gw->egl_disp);
-        eglReleaseThread();
         eina_hash_free(_evas_gl_visuals);
         _evas_gl_visuals = NULL;
+        eglTerminate(gw->egl_disp);
+        GL_TH(eglReleaseThread);
         _tls_context_set(EGL_NO_CONTEXT);
      }
 #else
@@ -632,18 +668,18 @@ eng_window_make_current(void *data, void *doit)
    SET_RESTORE_CONTEXT();
    if (doit)
      {
-        if (!eglMakeCurrent_thread_cmd(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]))
+        if (!evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]))
           return EINA_FALSE;
      }
    else
      {
-        if (!eglMakeCurrent_thread_cmd(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
+        if (!evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
           return EINA_FALSE;
      }
 #else
    if (doit)
      {
-        if (!__glXMakeContextCurrent(gw->disp, gw->glxwin, gw->context))
+         if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->disp, gw->glxwin, gw->context))
           {
              ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->win, (void *)gw->context);
              return EINA_FALSE;
@@ -651,7 +687,7 @@ eng_window_make_current(void *data, void *doit)
      }
    else
      {
-        if (!__glXMakeContextCurrent(gw->disp, 0, NULL))
+         if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->disp, 0, NULL))
           return EINA_FALSE;
      }
 #endif
@@ -670,24 +706,14 @@ eng_window_use(Outbuf *gw)
 #ifdef GL_GLES
    if (xwin)
      {
-        if ((eglGetCurrentDisplay_thread_cmd() !=
-             xwin->egl_disp) ||
-            (eglGetCurrentContext_thread_cmd() !=
-             xwin->egl_context[0])
-#if 0
-            // FIXME: Figure out what that offscreen thing was about...
-            || (eglGetCurrentSurface_thread_cmd(EGL_READ) !=
-                xwin->egl_surface[xwin->offscreen])
-            || (eglGetCurrentSurface_thread_cmd(EGL_DRAW) !=
-                xwin->egl_surface[xwin->offscreen])
-#endif
-            )
+        if ((evas_eglGetCurrentDisplay(GL_X11_CONTEXT_TYPE_EVAS) != xwin->egl_disp) ||
+            (evas_eglGetCurrentContext(GL_X11_CONTEXT_TYPE_EVAS) != xwin->egl_context[0]))
           force_use = EINA_TRUE;
      }
 #else
    if (xwin)
      {
-        if (glXGetCurrentContext() != xwin->context)
+        if (GL_TH(glXGetCurrentContext) != xwin->context)
            force_use = EINA_TRUE;
      }
 #endif
@@ -706,17 +732,19 @@ eng_window_use(Outbuf *gw)
              if (gw->egl_surface[0] != EGL_NO_SURFACE)
                {
                   SET_RESTORE_CONTEXT();
-                  if (eglMakeCurrent_thread_cmd(gw->egl_disp,
+                  if (evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS,
+                                     gw->egl_disp,
                                      gw->egl_surface[0],
                                      gw->egl_surface[0],
                                      gw->egl_context[0]) == EGL_FALSE)
                     {
-                       ERR("eglMakeCurrent() failed!");
+                       ERR("evas_eglMakeCurrent() failed!");
                     }
                }
 // GLX
 #else
-             if (!__glXMakeContextCurrent(gw->disp, gw->glxwin, gw->context))
+             if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS,
+                                          gw->disp, gw->glxwin, gw->context))
                {
                   ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->win, (void *)gw->context);
                }
@@ -742,7 +770,7 @@ eng_window_unsurf(Outbuf *gw)
    if (xwin == gw)
      {
         SET_RESTORE_CONTEXT();
-        eglMakeCurrent_thread_cmd(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
         if (gw->egl_surface[0] != EGL_NO_SURFACE)
            eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
         gw->egl_surface[0] = EGL_NO_SURFACE;
@@ -773,16 +801,16 @@ eng_window_resurf(Outbuf *gw)
    if (gw->egl_surface[0] == EGL_NO_SURFACE)
      {
         ERR("eglCreateWindowSurface() fail for %#x. code=%#x",
-            (unsigned int)gw->win, eglGetError());
+            (unsigned int)gw->win, GL_TH(eglGetError));
         return;
      }
    SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(gw->egl_disp,
+   if (evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVAS,
                       gw->egl_surface[0],
                       gw->egl_surface[0],
                       gw->egl_context[0]) == EGL_FALSE)
      {
-        ERR("eglMakeCurrent() failed!");
+        ERR("evas_eglMakeCurrent() failed!");
      }
 #else
    Evas_GL_X11_Visual *evis;
@@ -799,7 +827,7 @@ eng_window_resurf(Outbuf *gw)
           }
      }
    gw->glxwin = glXCreateWindow(gw->disp, evis->config, gw->win, NULL);
-   if (!__glXMakeContextCurrent(gw->disp, gw->glxwin, gw->context))
+   if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVAS, gw->disp, gw->glxwin, gw->context))
      {
         ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->win, (void *)gw->context);
      }
@@ -1332,13 +1360,15 @@ eng_gl_context_use(Context_3D *ctx)
 {
 #if GL_GLES
     SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(ctx->display, ctx->surface,
+   if (evas_eglMakeCurrent(GL_X11_CONTEXT_TYPE_EVGL,
+                           ctx->display, ctx->surface,
                       ctx->surface, ctx->context) == EGL_FALSE)
      {
-        ERR("eglMakeCurrent() failed.");
+        ERR("evas_eglMakeCurrent() failed.");
      }
 #else
-   if (!__glXMakeContextCurrent(ctx->display, ctx->glxwin, ctx->context))
+   if (!__glXMakeContextCurrent(GL_X11_CONTEXT_TYPE_EVGL,
+                                ctx->display, ctx->glxwin, ctx->context))
      {
         ERR("glXMakeContextCurrent(%p, %p, %p, %p) faild.",
             (void *)ctx->display, (void *)ctx->glxwin,
@@ -1372,15 +1402,18 @@ eng_outbuf_swap_mode(Outbuf *ob)
 #ifdef GL_GLES
         EGLint age = 0;
 
-        if (!eglQuerySurface_thread_cmd(ob->egl_disp, ob->egl_surface[0],
+        if (!GL_TH(eglQuerySurface, ob->egl_disp, ob->egl_surface[0],
                              EGL_BUFFER_AGE_EXT, &age))
           age = 0;
 #else
         unsigned int age = 0;
 
         if (glsym_glXQueryDrawable)
-          glsym_glXQueryDrawable(ob->disp, ob->glxwin,
-                                 GLX_BACK_BUFFER_AGE_EXT, &age);
+          {
+             if (GL_TH_CALL(glXQueryDrawable, glsym_glXQueryDrawable,
+                            ob->disp, ob->glxwin, GLX_BACK_BUFFER_AGE_EXT, &age) < 1)
+               age = 0;
+          }
 #endif
         if (age == 1) swap_mode = MODE_COPY;
         else if (age == 2) swap_mode = MODE_DOUBLE;
@@ -1418,8 +1451,8 @@ eng_outbuf_region_first_rect(Outbuf *ob)
    glsym_evas_gl_common_context_newframe(ob->gl_context);
    if (partial_render_debug == 1)
      {
-        glClearColor_thread_cmd(0.2, 0.5, 1.0, 1.0);
-        glClear_thread_cmd(GL_COLOR_BUFFER_BIT);
+        GL_TH(glClearColor, 0.2, 0.5, 1.0, 1.0);
+        GL_TH(glClear, GL_COLOR_BUFFER_BIT);
      }
 
    return EINA_FALSE;
@@ -1478,7 +1511,7 @@ _set_damage_rect(Outbuf *ob, int x, int y, int w, int h)
      }
 
    _convert_to_glcoords(rects, ob, x, y, w, h);
-   glsym_eglSetDamageRegion(ob->egl_disp, ob->egl_surface[0], rects, 1);
+   GL_TH_CALL(eglSetDamageRegion, glsym_eglSetDamageRegion, ob->egl_disp, ob->egl_surface[0], rects, 1);
 }
 #endif
 
@@ -1558,8 +1591,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
 #ifdef GL_GLES
    if (!ob->vsync)
      {
-        if (ob->info->vsync) eglSwapInterval_thread_cmd(ob->egl_disp, 1);
-        else eglSwapInterval_thread_cmd(ob->egl_disp, 0);
+        if (ob->info->vsync) GL_TH(eglSwapInterval, ob->egl_disp, 1);
+        else GL_TH(eglSwapInterval, ob->egl_disp, 0);
         ob->vsync = 1;
      }
    if (ob->info->callback.pre_swap)
@@ -1582,13 +1615,12 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
                   _convert_to_glcoords(&result[i], ob, r->x, r->y, r->w, r->h);
                   i += 4;
                }
-             glsym_eglSwapBuffersWithDamage(ob->egl_disp,
-                                            ob->egl_surface[0],
-                                            result, num);
+             GL_TH_CALL(eglSwapBuffersWithDamage, glsym_eglSwapBuffersWithDamage, 
+                                            ob->egl_disp, ob->egl_surface[0], result, num);
           }
      }
    else
-     eglSwapBuffers_thread_cmd(ob->egl_disp, ob->egl_surface[0]);
+     GL_TH(eglSwapBuffers, ob->egl_disp, ob->egl_surface);
 
 //xx   if (!safe_native) eglWaitGL();
    if (ob->info->callback.post_swap)
@@ -1608,8 +1640,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
           {
              if (!ob->vsync)
                {
-                  if (ob->info->vsync) glsym_glXSwapIntervalEXT(ob->disp, ob->win, 1);
-                  else glsym_glXSwapIntervalEXT(ob->disp, ob->win, 0);
+                  if (ob->info->vsync) GL_TH_CALL(glXSwapIntervalEXT, glsym_glXSwapIntervalEXT, ob->disp, ob->win, 1);
+                  else GL_TH_CALL(glXSwapIntervalEXT, glsym_glXSwapIntervalEXT, ob->disp, ob->win, 0);
                   ob->vsync = 1;
                }
           }
@@ -1617,8 +1649,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
           {
              if (!ob->vsync)
                {
-                  if (ob->info->vsync) glsym_glXSwapIntervalSGI(1);
-                  else glsym_glXSwapIntervalSGI(0);
+                  if (ob->info->vsync) GL_TH_CALL(glXSwapIntervalSGI, glsym_glXSwapIntervalSGI, 1);
+                  else GL_TH_CALL(glXSwapIntervalSGI, glsym_glXSwapIntervalSGI, 0);
                   ob->vsync = 1;
                }
           }
@@ -1628,8 +1660,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
                {
                   unsigned int rc;
 
-                  glsym_glXGetVideoSync(&rc);
-                  glsym_glXWaitVideoSync(1, 0, &rc);
+                  GL_TH_CALL(glXGetVideoSync, glsym_glXGetVideoSync, &rc);
+                  GL_TH_CALL(glXWaitVideoSync, glsym_glXWaitVideoSync ,1, 0, &rc);
                }
           }
      }
@@ -1640,7 +1672,7 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
      }
    // XXX: if partial swaps can be done use re->rects
 //   measure(0, "swap");
-   glXSwapBuffers(ob->disp, ob->glxwin);
+   GL_TH(glXSwapBuffers, ob->disp, ob->glxwin);
 //   measure(1, "swap");
    if (ob->info->callback.post_swap)
      {
index 6127d73..ffd8b6a 100644 (file)
@@ -86,18 +86,11 @@ void *(*glsym_eglCreateImage) (EGLDisplay a, EGLContext b, EGLenum c, EGLClientB
 void (*glsym_eglDestroyImage) (EGLDisplay a, void *b) = NULL;
 void (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b)  = NULL;
 unsigned int (*glsym_eglSwapBuffersWithDamage) (EGLDisplay a, void *b, const EGLint *d, EGLint c) = NULL;
-unsigned int (*glsym_eglSetDamageRegion) (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d) = NULL;
-unsigned int (*glsym_eglQueryWaylandBuffer)(EGLDisplay a, struct wl_resource *b, EGLint c, EGLint *d) = NULL;
+unsigned int (*glsym_eglSetDamageRegionKHR) (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d) = NULL;
+unsigned int (*glsym_eglQueryWaylandBufferWL)(EGLDisplay a, struct wl_resource *b, EGLint c, EGLint *d) = NULL;
 
 void (*glsym_evas_gl_common_surface_cache_dump)(void) = NULL;
 
-#define REPLACE_THREAD(prefix, dst, typ) \
-   if (prefix##dst && (typ)prefix##dst != (typ)dst##_thread_cmd) \
-     { \
-        dst##_orig_evas_set(prefix##dst); \
-        prefix##dst = (typ)dst##_thread_cmd; \
-     }
-
 //TIZEN_ONLY(20161121) : Support PreRotation
 ////////////////////////////////////
 //libwayland-client.so.0
@@ -168,6 +161,7 @@ gl_symbols(void)
    LINK2GENERIC(evgl_native_surface_yinvert_get);
    LINK2GENERIC(evgl_engine_shutdown);
    LINK2GENERIC(evas_gl_symbols);
+   LINK2GENERIC(eglGetProcAddress);
    LINK2GENERIC(evas_gl_common_error_get);
    LINK2GENERIC(evas_gl_common_error_set);
    LINK2GENERIC(evas_gl_common_current_context_get);
@@ -177,7 +171,7 @@ gl_symbols(void)
 
 #define FINDSYM(dst, sym, typ) \
    if (glsym_eglGetProcAddress) { \
-      if (!dst) dst = (typ)glsym_eglGetProcAddress(sym); \
+      if (!dst) dst = (typ)EVGL_TH_CALL(eglGetProcAddress, glsym_eglGetProcAddress, sym); \
    } else { \
       if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym); \
    }
@@ -186,7 +180,6 @@ gl_symbols(void)
    FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressEXT", glsym_func_eng_fn);
    FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn);
    FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn);
-   REPLACE_THREAD(glsym_, eglGetProcAddress, glsym_func_eng_fn);
 
    glsym_evas_gl_symbols((void*)glsym_eglGetProcAddress);
 
@@ -202,7 +195,6 @@ gl_symbols(void)
 
    FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES",
            glsym_func_void);
-   REPLACE_THREAD(glsym_, glEGLImageTargetTexture2DOES, glsym_func_void);
 
    FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageEXT",
            glsym_func_uint);
@@ -210,15 +202,11 @@ gl_symbols(void)
            glsym_func_uint);
    FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamage",
            glsym_func_uint);
-   REPLACE_THREAD(glsym_, eglSwapBuffersWithDamage, glsym_func_uint);
-
-   FINDSYM(glsym_eglSetDamageRegion, "eglSetDamageRegionKHR",
+   FINDSYM(glsym_eglSetDamageRegionKHR, "eglSetDamageRegionKHR",
            glsym_func_uint);
-   REPLACE_THREAD(glsym_, eglSetDamageRegion, glsym_func_uint);
 
-   FINDSYM(glsym_eglQueryWaylandBuffer, "eglQueryWaylandBufferWL",
+   FINDSYM(glsym_eglQueryWaylandBufferWL, "eglQueryWaylandBufferWL",
            glsym_func_uint);
-   REPLACE_THREAD(glsym_, eglQueryWaylandBuffer, glsym_func_uint);
 
    done = EINA_TRUE;
 }
@@ -271,7 +259,7 @@ gl_extn_veto(Render_Engine *re)
           {
              extn_have_buffer_age = EINA_FALSE;
              glsym_eglSwapBuffersWithDamage = NULL;
-             glsym_eglSetDamageRegion = NULL;
+             glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!strstr(str, "EGL_EXT_buffer_age"))
           {
@@ -280,7 +268,7 @@ gl_extn_veto(Render_Engine *re)
           }
         if (!strstr(str, "EGL_KHR_partial_update"))
           {
-             glsym_eglSetDamageRegion = NULL;
+             glsym_eglSetDamageRegionKHR = NULL;
           }
         if (!strstr(str, "EGL_NOK_texture_from_pixmap"))
           {
@@ -290,8 +278,8 @@ gl_extn_veto(Render_Engine *re)
           {
              const GLubyte *vendor, *renderer;
 
-             vendor = glGetString_thread_cmd(GL_VENDOR);
-             renderer = glGetString_thread_cmd(GL_RENDERER);
+             vendor = GL_TH(glGetString, GL_VENDOR);
+             renderer = GL_TH(glGetString, GL_RENDERER);
              // XXX: workaround mesa bug!
              // looking for mesa and intel build which is known to
              // advertise the EGL_NOK_texture_from_pixmap extension
@@ -466,11 +454,11 @@ evgl_eng_window_surface_create(void *data, void *win)
    if (!(evgl_surface = (Evgl_wl_Surface *)win)) return NULL;
    if (!(evgl_surface->egl_win)) return NULL;
 
-   surface = eglCreateWindowSurface_evgl_thread_cmd(ob->egl_disp, ob->egl_config,
+   surface = EVGL_TH(eglCreateWindowSurface, ob->egl_disp, ob->egl_config,
                                     (EGLNativeWindowType)evgl_surface->egl_win, NULL);
    if (!surface)
      {
-        int err = eglGetError_evgl_thread_cmd();
+        int err = EVGL_TH(eglGetError);
         glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
         ERR("Could not create egl window surface: %#x", err);
         return NULL;
@@ -499,7 +487,7 @@ evgl_eng_window_surface_destroy(void *data, void *surface)
         glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_SURFACE);
         return 0;
      }
-   eglDestroySurface_evgl_thread_cmd(ob->egl_disp, (EGLSurface)surface);
+   EVGL_TH(eglDestroySurface, ob->egl_disp, (EGLSurface)surface);
    return 1;
 }
 
@@ -570,26 +558,26 @@ evgl_eng_context_create(void *data, void *ctxt, Evas_GL_Context_Version version,
    if (ctxt)
      {
         context =
-            eglCreateContext_evgl_thread_cmd(ob->egl_disp, ob->egl_config,
+            EVGL_TH(eglCreateContext, ob->egl_disp, ob->egl_config,
                                              (EGLContext)ctxt, attrs);
      }
 
    else if (version == EVAS_GL_GLES_1_X || version == EVAS_GL_GLES_3_X)
      {
         context =
-            eglCreateContext_evgl_thread_cmd(ob->egl_disp, ob->egl_config,
+            EVGL_TH(eglCreateContext, ob->egl_disp, ob->egl_config,
                                              NULL, attrs);
      }
    else
      {
         context =
-            eglCreateContext_evgl_thread_cmd(ob->egl_disp, ob->egl_config,
+            EVGL_TH(eglCreateContext, ob->egl_disp, ob->egl_config,
                                              ob->egl_context[0], attrs);
      }
 
    if (!context)
      {
-        int err = eglGetError_evgl_thread_cmd();
+        int err = EVGL_TH(eglGetError);
         ERR("Failed to create egl context: %#x", err);
         glsym_evas_gl_common_error_set(data, err - EGL_SUCCESS);
         return NULL;
@@ -618,7 +606,7 @@ evgl_eng_context_destroy(void *data, void *ctxt)
         return 0;
      }
 
-   eglDestroyContext_evgl_thread_cmd(ob->egl_disp, (EGLContext)ctxt);
+   EVGL_TH(eglDestroyContext, ob->egl_disp, (EGLContext)ctxt);
    return 1;
 }
 
@@ -645,11 +633,11 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
    if ((!ctxt) && (!surface))
      {
         ret =
-          eglMakeCurrent_evgl_thread_cmd(ob->egl_disp, EGL_NO_SURFACE,
+            EVGL_TH(eglMakeCurrent, ob->egl_disp, EGL_NO_SURFACE,
                          EGL_NO_SURFACE, EGL_NO_CONTEXT);
         if (!ret)
           {
-             int err = eglGetError_evgl_thread_cmd();
+             int err = EVGL_TH(eglGetError);
              glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
              ERR("eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
@@ -657,16 +645,16 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
         return 1;
      }
 
-   if ((eglGetCurrentContext_evgl_thread_cmd() != ctx) ||
-       (eglGetCurrentSurface_evgl_thread_cmd(EGL_READ) != surf) ||
-       (eglGetCurrentSurface_evgl_thread_cmd(EGL_DRAW) != surf))
+   if ((EVGL_TH(eglGetCurrentContext) != ctx) ||
+       (EVGL_TH(eglGetCurrentSurface, EGL_READ) != surf) ||
+       (EVGL_TH(eglGetCurrentSurface, EGL_DRAW) != surf))
      {
         if (flush) eng_window_use(NULL);
 
-        ret = eglMakeCurrent_evgl_thread_cmd(ob->egl_disp, surf, surf, ctx);
+        ret = EVGL_TH(eglMakeCurrent,ob->egl_disp, surf, surf, ctx);
         if (!ret)
           {
-             int err = eglGetError_evgl_thread_cmd();
+             int err = EVGL_TH(eglGetError);
              glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
              ERR("eglMakeCurrent() failed! Error Code=%#x", err);
              return 0;
@@ -678,7 +666,7 @@ evgl_eng_make_current(void *data, void *surface, void *ctxt, int flush)
 static void *
 evgl_eng_proc_address_get(const char *name)
 {
-   if (glsym_eglGetProcAddress) return glsym_eglGetProcAddress(name);
+   if (glsym_eglGetProcAddress) return EVGL_TH_CALL(eglGetProcAddress, glsym_eglGetProcAddress, name);
    return dlsym(RTLD_DEFAULT, name);
 }
 
@@ -696,7 +684,7 @@ evgl_eng_string_get(void *data)
      }
    if (!(ob = eng_get_ob(re))) return NULL;
 
-   return eglQueryString_evgl_thread_cmd(ob->egl_disp, EGL_EXTENSIONS);
+   return EVGL_TH(eglQueryString, ob->egl_disp, EGL_EXTENSIONS);
 }
 
 static int
@@ -1293,7 +1281,7 @@ eng_gl_current_context_get(void *data EINA_UNUSED)
      return NULL;
 
 #ifdef GL_GLES
-   if (eglGetCurrentContext_evgl_thread_cmd() == (ctx->context))
+   if (EVGL_TH(eglGetCurrentContext) == (ctx->context))
      return ctx;
    else
      return NULL;
@@ -1313,7 +1301,7 @@ eng_gl_error_get(void *data)
    if (err != EVAS_GL_SUCCESS && err != EVAS_GL_NOT_INITIALIZED)
      goto end;
 
-   err = eglGetError_evgl_thread_cmd() - EGL_SUCCESS;
+   err = EVGL_TH(eglGetError) - EGL_SUCCESS;
 
 end:
    glsym_evas_gl_common_error_set(data, EVAS_GL_SUCCESS);
@@ -1335,7 +1323,7 @@ _native_cb_bind(void *data EINA_UNUSED, void *image)
           {
              if (glsym_glEGLImageTargetTexture2DOES)
                {
-                  glsym_glEGLImageTargetTexture2DOES(img->native.target, n->ns_data.wl_surface.surface);
+                 GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, img->native.target, n->ns_data.wl_surface.surface);
                   GLERRV("glsym_glEGLImageTargetTexture2DOES");
                }
              else
@@ -1344,7 +1332,7 @@ _native_cb_bind(void *data EINA_UNUSED, void *image)
      }
    else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
      {
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, n->ns.data.opengl.texture_id);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, n->ns.data.opengl.texture_id);
      }
    else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
      {
@@ -1360,8 +1348,8 @@ _native_cb_bind(void *data EINA_UNUSED, void *image)
                {
                   if (glsym_glEGLImageTargetTexture2DOES)
                     {
-                       glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, surface);
-                       if (eglGetError_thread_cmd() != EGL_SUCCESS)
+                      GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_2D, surface);
+                       if (GL_TH(eglGetError) != EGL_SUCCESS)
                          ERR("glEGLImageTargetTexture2DOES() failed.");
                     }
                   else
@@ -1369,7 +1357,7 @@ _native_cb_bind(void *data EINA_UNUSED, void *image)
                }
              else
                {
-                  glBindTexture_thread_cmd(GL_TEXTURE_2D, (GLuint)(uintptr_t)surface);
+                  GL_TH(glBindTexture, GL_TEXTURE_2D, (GLuint)(uintptr_t)surface);
                }
           }
     }
@@ -1380,8 +1368,8 @@ _native_cb_bind(void *data EINA_UNUSED, void *image)
         {
            if (glsym_glEGLImageTargetTexture2DOES)
               {
-                glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, n->ns_data.tbm.surface);
-                if (eglGetError_thread_cmd() != EGL_SUCCESS)
+                GL_TH_CALL(glEGLImageTargetTexture2DOES, glsym_glEGLImageTargetTexture2DOES, GL_TEXTURE_EXTERNAL_OES, n->ns_data.tbm.surface);
+                if (GL_TH(eglGetError) != EGL_SUCCESS)
                   ERR("glEGLImageTargetTexture2DOES() failed.");
               }
             else
@@ -1402,11 +1390,11 @@ _native_cb_unbind(void *data EINA_UNUSED, void *image)
 
    if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
      {
-        //glBindTexture(GL_TEXTURE_2D, 0); //really need?
+        //GL_TH(glBindTexture, GL_TEXTURE_2D, 0); //really need?
      }
    else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
      {
-        glBindTexture_thread_cmd(GL_TEXTURE_2D, 0);
+        GL_TH(glBindTexture, GL_TEXTURE_2D, 0);
      }
   else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
     {
@@ -1443,7 +1431,7 @@ _native_cb_free(void *data, void *image)
              if (glsym_eglDestroyImage)
                {
                   glsym_eglDestroyImage(ob->egl_disp, n->ns_data.wl_surface.surface);
-                  if ((err = eglGetError()) != EGL_SUCCESS)
+                  if ((err = GL_TH(eglGetError)) != EGL_SUCCESS)
                     {
                        ERR("eglDestroyImage() failed.");
                        glsym_evas_gl_common_error_set(err - EGL_SUCCESS);
@@ -1473,7 +1461,7 @@ _native_cb_free(void *data, void *image)
              {
                 glsym_eglDestroyImage(ob->egl_disp,
                                       n->ns_data.tbm.surface);
-                if ((err = eglGetError()) != EGL_SUCCESS)
+                if ((err = GL_TH(eglGetError)) != EGL_SUCCESS)
                   {
                      ERR("eglDestroyImage() failed.");
                   }
@@ -1694,8 +1682,8 @@ eng_image_native_set(void *data, void *image, void *native)
                   EGLint attribs[3];
                   int format, yinvert = 1;
 
-                  glsym_eglQueryWaylandBuffer(ob->egl_disp, wl_buf,
-                                                EGL_TEXTURE_FORMAT, &format);
+                  GL_TH_CALL(eglQueryWaylandBufferWL, glsym_eglQueryWaylandBufferWL,
+                             ob->egl_disp, wl_buf, EGL_TEXTURE_FORMAT, &format);
                   if ((format != EGL_TEXTURE_RGB) &&
                       (format != EGL_TEXTURE_RGBA)&&
                       (format != EGL_TEXTURE_Y_U_V_WL) &&
@@ -1712,7 +1700,8 @@ eng_image_native_set(void *data, void *image, void *native)
                   attribs[2] = EGL_NONE;
 
                   memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
-                  if (glsym_eglQueryWaylandBuffer(ob->egl_disp, wl_buf,
+                  if (GL_TH_CALL(eglQueryWaylandBufferWL, glsym_eglQueryWaylandBufferWL,
+                                                    ob->egl_disp, wl_buf,
                                                     EVAS_GL_WAYLAND_Y_INVERTED_WL,
                                                     &yinvert) == EGL_FALSE)
                     yinvert = 1;
@@ -1884,13 +1873,13 @@ eng_preload_make_current(void *data, void *doit)
 
    if (doit)
      {
-        if (!eglMakeCurrent_thread_cmd(ob->egl_disp, ob->egl_surface[0],
+        if (!GL_TH(eglMakeCurrent, ob->egl_disp, ob->egl_surface[0],
                             ob->egl_surface[0], ob->egl_context[0]))
           return EINA_FALSE;
      }
    else
      {
-        if (!eglMakeCurrent_thread_cmd(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE,
+        if (!GL_TH(eglMakeCurrent, ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE,
                             EGL_NO_CONTEXT))
           return EINA_FALSE;
      }
old mode 100755 (executable)
new mode 100644 (file)
index 2d19cb9..d20c275
@@ -119,7 +119,7 @@ extern Evas_GL_Preload_Render_Call glsym_evas_gl_preload_render_lock;
 extern Evas_GL_Preload_Render_Call glsym_evas_gl_preload_render_unlock;
 
 extern unsigned int (*glsym_eglSwapBuffersWithDamage) (EGLDisplay a, void *b, const EGLint *d, EGLint c);
-extern unsigned int (*glsym_eglSetDamageRegion) (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d);
+extern unsigned int (*glsym_eglSetDamageRegionKHR) (EGLDisplay a, EGLSurface b, EGLint *c, EGLint d);
 
 Outbuf *eng_window_new(Evas *evas, Evas_Engine_Info_Wayland_Egl *einfo, int w, int h, Render_Engine_Swap_Mode swap_mode,
                                   int depth_bits, int stencil_bits, int msaa_bits);
index ec2c46a..7b37f5e 100644 (file)
@@ -167,9 +167,9 @@ _orig_eng_window_new(Evas *evas, Evas_Engine_Info_Wayland_Egl *einfo, int w, int
         eng_window_free(gw);
         return NULL;
      }
-   if (!eglBindAPI_thread_cmd(EGL_OPENGL_ES_API))
+   if (!GL_TH(eglBindAPI, EGL_OPENGL_ES_API))
      {
-        ERR("eglBindAPI() fail. code=%#x", eglGetError_thread_cmd());
+        ERR("eglBindAPI() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
@@ -240,17 +240,17 @@ _orig_eng_window_new(Evas *evas, Evas_Engine_Info_Wayland_Egl *einfo, int w, int
      _tls_context_set(gw->egl_context[0]);
 
    SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(gw->egl_disp, gw->egl_surface[0],
+   if (GL_TH(eglMakeCurrent, gw->egl_disp, gw->egl_surface[0],
                       gw->egl_surface[0], gw->egl_context[0]) == EGL_FALSE)
      {
-        ERR("eglMakeCurrent() fail. code=%#x", eglGetError_thread_cmd());
+        ERR("eglMakeCurrent() fail. code=%#x", GL_TH(eglGetError));
         eng_window_free(gw);
         return NULL;
      }
 
-   vendor = glGetString_thread_cmd(GL_VENDOR);
-   renderer = glGetString_thread_cmd(GL_RENDERER);
-   version = glGetString_thread_cmd(GL_VERSION);
+   vendor = GL_TH(glGetString, GL_VENDOR);
+   renderer = GL_TH(glGetString, GL_RENDERER);
+   version = GL_TH(glGetString, GL_VERSION);
    if (!vendor) vendor   = (unsigned char *)"-UNKNOWN-";
    if (!renderer) renderer = (unsigned char *)"-UNKNOWN-";
    if (!version) version  = (unsigned char *)"-UNKNOWN-";
@@ -314,6 +314,7 @@ eng_window_free(Outbuf *gw)
    GLContext context;
    int ref = 0;
 
+   if (!gw) return;
    win_count--;
    eng_window_use(gw);
 
@@ -328,7 +329,7 @@ eng_window_free(Outbuf *gw)
      }
 
    SET_RESTORE_CONTEXT();
-   eglMakeCurrent_thread_cmd(gw->egl_disp, EGL_NO_SURFACE,
+   GL_TH(eglMakeCurrent, gw->egl_disp, EGL_NO_SURFACE,
                   EGL_NO_SURFACE, EGL_NO_CONTEXT);
 
    if (gw->egl_context[0] != context)
@@ -343,7 +344,7 @@ eng_window_free(Outbuf *gw)
      {
         if (context) eglDestroyContext(gw->egl_disp, context);
         eglTerminate(gw->egl_disp);
-        eglReleaseThread_thread_cmd();
+        GL_TH(eglReleaseThread);
         _tls_context_set(EGL_NO_CONTEXT);
      }
 
@@ -361,15 +362,12 @@ typedef struct
    int depth_bits;
    int stencil_bits;
    int msaa_bits;
-} Evas_Thread_Command_eng_window_new;
+} GL_TH_ST(eng_window_new);
 
 static void
-_gl_thread_eng_window_new(void *data)
+GL_TH_CB(eng_window_new)(void *data)
 {
-   Evas_Thread_Command_eng_window_new *thread_param =
-      (Evas_Thread_Command_eng_window_new *)data;
-
-   evas_gl_thread_begin();
+   GL_TH_ST(eng_window_new) *thread_param = *(void **)data;
 
    thread_param->return_value = _orig_eng_window_new(thread_param->evas,
                                                      thread_param->einfo,
@@ -380,15 +378,19 @@ _gl_thread_eng_window_new(void *data)
                                                      thread_param->stencil_bits,
                                                      thread_param->msaa_bits);
 
-   evas_gl_thread_end();
+
 }
 
 Outbuf *
 eng_window_new(Evas *evas, Evas_Engine_Info_Wayland_Egl *einfo, int w, int h, Render_Engine_Swap_Mode swap_mode,
                int depth_bits, int stencil_bits, int msaa_bits)
 {
+
+   GL_TH_ST(eng_window_new) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
+
    /* eng_window_new() is moved into the worker thread that minimizes driver issue with EGL use*/
-   if (!evas_gl_thread_enabled())
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
      {
         return _orig_eng_window_new(evas,
                                     einfo,
@@ -400,23 +402,24 @@ eng_window_new(Evas *evas, Evas_Engine_Info_Wayland_Egl *einfo, int w, int h, Re
                                     msaa_bits);
      }
 
-   Evas_Thread_Command_eng_window_new thread_param_local;
-   Evas_Thread_Command_eng_window_new *thread_param = &thread_param_local;
-   thread_param->evas = evas;
-   thread_param->einfo = einfo;
-   thread_param->w = w;
-   thread_param->h = h;
-   thread_param->swap_mode = swap_mode;
-   thread_param->depth_bits = depth_bits;
-   thread_param->stencil_bits = stencil_bits;
-   thread_param->msaa_bits = msaa_bits;
-
-   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
-                              _gl_thread_eng_window_new,
-                              thread_param,
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(eng_window_new) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->evas = evas;
+   thread_data->einfo = einfo;
+   thread_data->w = w;
+   thread_data->h = h;
+   thread_data->swap_mode = swap_mode;
+   thread_data->depth_bits = depth_bits;
+   thread_data->stencil_bits = stencil_bits;
+   thread_data->msaa_bits = msaa_bits;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(eng_window_new),
                               EVAS_GL_THREAD_MODE_FINISH);
 
-   return thread_param->return_value;
+   return thread_data->return_value;
 
 }
 
@@ -429,17 +432,14 @@ eng_window_use(Outbuf *gw)
    wl_win = _tls_outbuf_get();
 
    glsym_evas_gl_preload_render_lock(eng_preload_make_current, gw);
+   if ((gw) && (!gw->gl_context)) return;
 
    if (wl_win)
      {
-       if ((eglGetCurrentDisplay_thread_cmd() !=
-            wl_win->egl_disp) ||
-           (eglGetCurrentContext_thread_cmd() !=
-            wl_win->egl_context[0])
-           || (eglGetCurrentSurface_thread_cmd(EGL_READ) !=
-               wl_win->egl_surface[0])
-           || (eglGetCurrentSurface_thread_cmd(EGL_DRAW) !=
-               wl_win->egl_surface[0]))
+        if ((GL_TH(eglGetCurrentContext) != wl_win->egl_context[0])
+            || (GL_TH(eglGetCurrentDisplay) != wl_win->egl_disp)
+            || (GL_TH(eglGetCurrentSurface, EGL_READ) != wl_win->egl_surface[0])
+            || (GL_TH(eglGetCurrentSurface, EGL_DRAW) != wl_win->egl_surface[0]))
           force = EINA_TRUE;
      }
 
@@ -457,7 +457,7 @@ eng_window_use(Outbuf *gw)
              if (gw->egl_surface[0] != EGL_NO_SURFACE)
                {
                   SET_RESTORE_CONTEXT();
-                  if (eglMakeCurrent_thread_cmd(gw->egl_disp, gw->egl_surface[0],
+                  if (GL_TH(eglMakeCurrent, gw->egl_disp, gw->egl_surface[0],
                                      gw->egl_surface[0],
                                      gw->egl_context[0]) == EGL_FALSE)
                     ERR("eglMakeCurrent() failed!");
@@ -488,7 +488,7 @@ eng_window_unsurf(Outbuf *gw)
    if (wl_win == gw)
      {
         SET_RESTORE_CONTEXT();
-        eglMakeCurrent_thread_cmd(gw->egl_disp, EGL_NO_SURFACE,
+        GL_TH(eglMakeCurrent, gw->egl_disp, EGL_NO_SURFACE,
                        EGL_NO_SURFACE, EGL_NO_CONTEXT);
         if (gw->egl_surface[0] != EGL_NO_SURFACE)
           eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
@@ -518,7 +518,7 @@ eng_window_resurf(Outbuf *gw)
      }
 
    SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0],
+   if (GL_TH(eglMakeCurrent, gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0],
                       gw->egl_context[0]) == EGL_FALSE)
      ERR("eglMakeCurrent() failed!");
 
@@ -526,57 +526,119 @@ eng_window_resurf(Outbuf *gw)
 }
 
 void 
-eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EINA_UNUSED)
+_orig_eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EINA_UNUSED)
 {
-   ob->w = w;
-   ob->h = h;
-   ob->rot = rot;
-   if (ob->support_pre_rotation && ob->gl_context->pre_rotated)
-     ob->rot = 0;
-   eng_window_use(ob);
-   glsym_evas_gl_common_context_resize(ob->gl_context, w, h, ob->rot,1);
-
-   if (ob->win)
-     {
-        int aw, ah, dx = 0, dy = 0;
+  ob->w = w;
+  ob->h = h;
+  ob->rot = rot;
+  if (ob->support_pre_rotation && ob->gl_context->pre_rotated)
+    ob->rot = 0;
+  eng_window_use(ob);
+  glsym_evas_gl_common_context_resize(ob->gl_context, w, h, ob->rot,1);
+
+  if (ob->win)
+    {
+      int aw, ah, dx = 0, dy = 0;
+
+      if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
+        wl_egl_window_get_attached_size(ob->win, &ah, &aw);
+      else
+        wl_egl_window_get_attached_size(ob->win, &aw, &ah);
+
+      if (ob->info->info.edges & 4) // resize from left
+        {
+          if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
+            dx = ah - h;
+          else
+            dx = aw - w;
+        }
+
+      if (ob->info->info.edges & 1) // resize from top
+        {
+          if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
+            dy = aw - w;
+          else
+            dy = ah - h;
+        }
+
+      /* buffer_transform: screen rotation + window rotation
+       * window_transform: window rotation only
+       * We have to let the display server know the window rotation value
+       * because the display server needs to calcuate the screen rotation value
+       * from buffer_transform value.
+       */
+//      wl_egl_window_set_buffer_transform(ob->win, ob->info->info.rotation / 90);
+//      wl_egl_window_set_window_transform(ob->win, ob->info->window_rotation / 90);
+
+      if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
+        wl_egl_window_resize(ob->win, h, w, dx, dy);
+      else
+        wl_egl_window_resize(ob->win, w, h, dx, dy);
+    }
+}
 
-        if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
-          wl_egl_window_get_attached_size(ob->win, &ah, &aw);
-        else
-          wl_egl_window_get_attached_size(ob->win, &aw, &ah);
+typedef struct
+{
+  Outbuf *ob;
+  int w;
+  int h;
+  int rot;
+  Outbuf_Depth depth;
+} GL_TH_ST(eng_outbuf_reconfigure);
 
-        if (ob->info->info.edges & 4) // resize from left
-          {
-             if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
-               dx = ah - h;
-             else
-               dx = aw - w;
-          }
+static void
+GL_TH_CB(eng_outbuf_reconfigure)(void *data)
+{
+   GL_TH_ST(eng_outbuf_reconfigure) *thread_param = *(void **)data;
 
-        if (ob->info->info.edges & 1) // resize from top
-          {
-             if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
-               dy = aw - w;
-             else
-               dy = ah - h;
-          }
+   _orig_eng_outbuf_reconfigure(thread_param->ob,
+                                thread_param->w,
+                                thread_param->h,
+                                thread_param->rot,
+                                thread_param->depth);
+}
 
-        if ((ob->info->info.rotation == 90) || (ob->info->info.rotation == 270))
-          wl_egl_window_resize(ob->win, h, w, dx, dy);
-        else
-          wl_egl_window_resize(ob->win, w, h, dx, dy);
+void
+eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EINA_UNUSED)
+{
 
+   GL_TH_ST(eng_outbuf_reconfigure) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;
+   void *thcmd_ref;
 
+   /* eng_window_new() is moved into the worker thread that minimizes driver issue with EGL use*/
+   if (!evas_gl_thread_enabled(EVAS_GL_THREAD_TYPE_GL))
+     {
+       return _orig_eng_outbuf_reconfigure(ob,
+                                           w,
+                                           h,
+                                           rot,
+                                           depth);
      }
+
+   thread_data_ptr =
+      evas_gl_thread_cmd_create(EVAS_GL_THREAD_TYPE_GL, sizeof(GL_TH_ST(eng_outbuf_reconfigure) *), &thcmd_ref);
+   *thread_data_ptr = thread_data;
+
+   thread_data->ob = ob;
+   thread_data->w = w;
+   thread_data->h = h;
+   thread_data->rot = rot;
+   thread_data->depth = depth;
+
+   evas_gl_thread_cmd_enqueue(thcmd_ref,
+                              GL_TH_CB(eng_outbuf_reconfigure),
+                              EVAS_GL_THREAD_MODE_FINISH);
+
 }
 
-int 
+
+int
 eng_outbuf_rotation_get(Outbuf *ob)
 {
    return ob->rot;
 }
 
-Render_Engine_Swap_Mode 
+Render_Engine_Swap_Mode
 eng_outbuf_swap_mode_get(Outbuf *ob)
 {
    if ((ob->swap_mode == MODE_AUTO) && (extn_have_buffer_age))
@@ -584,7 +646,7 @@ eng_outbuf_swap_mode_get(Outbuf *ob)
         Render_Engine_Swap_Mode swap_mode;
         EGLint age = 0;
 
-        if (!eglQuerySurface_thread_cmd(ob->egl_disp, ob->egl_surface[0],
+        if (!GL_TH(eglQuerySurface, ob->egl_disp, ob->egl_surface[0],
                              EGL_BUFFER_AGE_EXT, &age))
           age = 0;
 
@@ -655,20 +717,6 @@ _convert_glcoords(int *result, Outbuf *ob, int x, int y, int w, int h)
      }
 }
 
-static void
-_damage_rect_set(Outbuf *ob, int x, int y, int w, int h)
-{
-   int rects[4];
-
-   if ((x == 0) && (y == 0) &&
-       (((w == ob->gl_context->w) && (h == ob->gl_context->h)) ||
-           ((h == ob->gl_context->w) && (w == ob->gl_context->h))))
-     return;
-
-   _convert_glcoords(rects, ob, x, y, w, h);
-   glsym_eglSetDamageRegion(ob->egl_disp, ob->egl_surface[0], rects, 1);
-}
-
 void *
 eng_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx EINA_UNUSED, int *cy EINA_UNUSED, int *cw EINA_UNUSED, int *ch EINA_UNUSED)
 {
@@ -715,8 +763,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
 
    if (!ob->vsync)
      {
-        if (ob->info->vsync) eglSwapInterval_thread_cmd(ob->egl_disp, 1);
-        else eglSwapInterval_thread_cmd(ob->egl_disp, 0);
+        if (ob->info->vsync) GL_TH(eglSwapInterval, ob->egl_disp, 1);
+        else GL_TH(eglSwapInterval, ob->egl_disp, 0);
         ob->vsync = EINA_TRUE;
      }
 
@@ -739,15 +787,15 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
                   _convert_glcoords(&result[i], ob, r->x, r->y, r->w, r->h);
                   i += 4;
                }
-             if (glsym_eglSetDamageRegion)
-                glsym_eglSetDamageRegion(ob->egl_disp, ob->egl_surface[0], result, num);
+             if (glsym_eglSetDamageRegionKHR)
+                GL_TH_CALL(eglSetDamageRegion, glsym_eglSetDamageRegionKHR, ob->egl_disp, ob->egl_surface[0], result, num);
 
-             glsym_eglSwapBuffersWithDamage(ob->egl_disp, ob->egl_surface[0],
+             GL_TH_CALL(eglSwapBuffersWithDamage, glsym_eglSwapBuffersWithDamage, ob->egl_disp, ob->egl_surface[0],
                                             result, num);
           }
      }
    else
-      eglSwapBuffers_thread_cmd(ob->egl_disp, ob->egl_surface[0]);
+      GL_TH(eglSwapBuffers, ob->egl_disp, ob->egl_surface[0]);
 
    if (ob->info->callback.post_swap)
      ob->info->callback.post_swap(ob->info->callback.data, ob->evas);
@@ -761,6 +809,8 @@ eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
 Evas_Engine_GL_Context *
 eng_outbuf_gl_context_get(Outbuf *ob)
 {
+   if (!ob) return NULL;
+
    return ob->gl_context;
 }
 
@@ -788,7 +838,7 @@ eng_gl_context_new(Outbuf *ob)
      eglCreateContext(ob->egl_disp, ob->egl_config, ob->egl_context[0], attrs);
    if (!ctx->context)
      {
-        ERR("Could not create egl context %#x", eglGetError());
+        ERR("Could not create egl context %#x", GL_TH(eglGetError));
         goto err;
      }
 
@@ -813,9 +863,9 @@ void
 eng_gl_context_use(Context_3D *ctx)
 {
    SET_RESTORE_CONTEXT();
-   if (eglMakeCurrent_thread_cmd(ctx->display, ctx->surface,
+   if (GL_TH(eglMakeCurrent, ctx->display, ctx->surface,
                       ctx->surface, ctx->context) == EGL_FALSE)
      {
-        ERR("eglMakeCurrent Failed: %#x", eglGetError_thread_cmd());
+        ERR("eglMakeCurrent Failed: %#x", GL_TH(eglGetError));
      }
 }
old mode 100755 (executable)
new mode 100644 (file)
index a4f58bc..d2fbd60
@@ -7,31 +7,37 @@ import argparse
 global g_verbose
 global g_print_err
 global g_debug_lvl
+global g_no_indent
 
-global g_evas_total
+global g_internal_total
 global g_evgl_total
-global g_evgl_api_total
 
 api_dic_list = list()
 
 _NEWLINE = "\n"
-_MAX_COLUMN = 8
+_MAX_COLUMN = 10
 
 ################################################################################
 # api_def data format:
-# 1.| {EVAS |EVAS GL |EVAS GL API} | : Wrapper API types
-# 2.| {return type} |
-# 3.| {api name} |
-# 4.| {paramter1, 2,..} |
-# 5.| {enqueue|flush|finish} | : queue operation
-# 6.| {ext|noext} | : extension API or not
-# 7.| {memory pool name, size, value| userDefined | ""} |
-# 8.| {GL| GLES} | ""} | : GL types
+#  1.| {INTERNAL|EVAS GL} | : Wrapper API types
+#  2.| {return type} |
+#  3.| {api name} |
+#  4.| {gl api} |
+#  5.| {paramter1, 2,..} |
+#  6.| {enqueue|flush|finish} | : queue operation
+#  7.| {ext|noext} | : extension API or not
+#  8.| {memory pool name, size, value | ""} |
+#  9.| {GL| GLES} | ""} | : GL types
+# 10.| {"NeedMacro" | ""} | : user macro need or not
 
+#--------------------------------------------------------------
+# parse API data (txt -> dictionary)
+# input  : a line of data file, it contains attributes for warpper API generate
 def parse_apidef(api):
        api_dic = {}
-       parse_result = { 'parse_fail':True, 'type':"", 'queue_opr':"", 'ext':False, 'warning':"",
-                            'needCopy':False, 'needUserDefinedCopy':False, 'gl_type':False }
+       parse_result = { 'parse_fail':True, 'type':"", 'queue_opr':"", 'ext':False,
+                                        'warning':list(),
+                            'needCopy':False, 'needMacro':False, 'gl_type':False }
 
        L = api.split('|')
 
@@ -40,8 +46,9 @@ def parse_apidef(api):
                return parse_result # few column, invalid format
 
        api_dic['type'] = L[1].strip()
-       if api_dic['type'] == "EVAS GL API" :
-               api_dic['func_ptr'] = "orig_evgl_api"
+       api_dic['macro'] = "GL_TH_FN"
+       api_dic['qtype'] = "EVAS_GL_THREAD_TYPE_GL"
+       api_dic['env_check'] = "!evas_gl_thread_enabled(thread_type)"
 
        parse_result['type'] = L[1].strip()
 
@@ -70,31 +77,31 @@ def parse_apidef(api):
        parse_result['queue_opr'] = L[5].strip()
 
        api_dic['extYN'] = L[6].strip()
-       if L[6].strip() == "ext":
-               parse_result['ext'] = True
-               if api_dic['type'] == "EVAS" : api_dic['func_ptr'] = "orig_evas"
-               elif api_dic['type'] == "EVAS GL" : api_dic['func_ptr'] = "orig_evgl"
 
        if len(L[7].strip()) > 0 and api_dic['queue_opr'] == "flush": # need copy
                parse_result['needCopy'] = True
                copy_info = L[7].split(',')
 
-               if copy_info[0].strip() == "userDefined" :
-                       api_dic['userDefinedCopy'] = True
-                       parse_result['needUserDefinedCopy'] = True
+               if len(copy_info) is 3 : # {memory pool name, size, val}
+                       api_dic['mp_name'] = copy_info[0].strip()
+                       api_dic['copy_size'] = copy_info[1].strip()
+                       api_dic['copy_val'] = copy_info[2].strip()
                else :
-                       if len(copy_info) is 3 : # {memory pool name, size, val}
-                               api_dic['mp_name'] = copy_info[0].strip()
-                               api_dic['copy_size'] = copy_info[1].strip()
-                               api_dic['copy_val'] = copy_info[2].strip()
-                       else :
-                               parse_result['warning'] = "invalid copy info,..(%s)" %(api_dic['api_name'])
+                       parse_result['warning'].append("invalid copy info,..(%s)" %(api_dic['api_name']))
 
        if len(L[8].strip()) > 0 : #if defiend gl_type
                api_dic['gl_type'] = L[8].strip()
                parse_result['gl_type'] = L[8].strip()
 
+       if len(L[9].strip()) > 0 : #if defined userMacro
+               if api_dic['queue_opr'] == "finish" :
+                       parse_result['warning'].append("user macro defined at aync operation only,..(%s)" %(api_dic['api_name']))
+               else :
+                       api_dic['needMacro'] = True
+                       parse_result['needMacro'] = True
+
        api_dic_list.append(api_dic)
+
        parse_result['parse_fail'] = False
 
        return parse_result
@@ -118,8 +125,8 @@ def add_result(parse_result, result) :
                result['ext'] += 1
        if parse_result['needCopy'] is True:
                result['needCopy'] += 1
-       if parse_result['needUserDefinedCopy'] is True:
-               result['needUserDefinedCopy'] += 1
+       if parse_result['needMacro'] is True:
+               result['needMacro'] += 1
        if parse_result['gl_type']  == "GL" :
                result['gl'] += 1
        if len(parse_result['warning']) > 0:
@@ -132,13 +139,13 @@ def get_api_def(api_list_file) :
        result  = list()
        result_evas = { 'success':0, 'fail':0, 'warning':warning_msgs,
                          'flush':0, 'finish':0, 'enqueue':0,
-                         'ext':0, 'needCopy':0, 'needUserDefinedCopy':0, 'gl':0 }
+                         'ext':0, 'needCopy':0, 'needMacro':0, 'gl':0 }
        result_evgl = { 'success':0, 'fail':0, 'warning':warning_msgs,
                            'flush':0, 'finish':0, 'enqueue':0,
-                           'ext':0, 'needCopy':0, 'needUserDefinedCopy':0, 'gl':0 }
+                           'ext':0, 'needCopy':0, 'needMacro':0, 'gl':0 }
        result_evgl_api = { 'success':0, 'fail':0, 'warning':warning_msgs,
                                'flush':0, 'finish':0, 'enqueue':0,
-                               'ext':0, 'needCopy':0, 'needUserDefinedCopy':0, 'gl':0 }
+                               'ext':0, 'needCopy':0, 'needMacro':0, 'gl':0 }
        f = open(api_list_file, 'r')
 
        lines = f.readlines()
@@ -157,15 +164,7 @@ def get_api_def(api_list_file) :
 
                if api[0] is not '#' : # if not comment line
                        parse_result = parse_apidef(api)
-                       if parse_result['type'] == "EVAS" :
-                               add_result(parse_result, result_evas)
-
-                       elif parse_result['type'] == "EVAS GL" :
-                               add_result(parse_result, result_evgl)
-
-                       elif parse_result['type'] == "EVAS GL API" :
-                               add_result(parse_result, result_evgl_api)
-
+                       add_result(parse_result, result_evas)
 
        result.append(result_evas)
        result.append(result_evgl)
@@ -173,7 +172,9 @@ def get_api_def(api_list_file) :
 
        return result
 
-#--------------------------------------------------------------
+#------------------------------------------------------
+# Utility functions,...
+#------------------------------------------------------
 def list_to_str (name_list) :
        name_str = ""
        for p in name_list:
@@ -183,9 +184,35 @@ def list_to_str (name_list) :
 
        return name_str
 
-# debug_lvl is 1 or 2
-def logging_and_counter (func_name) :
+def LOG (buf) :
+       if g_verbose: print buf
+
+def FWRITE (fp, buf) :
+       fp.write(buf)
 
+# check gl_type, if gl_type is "GL" need "#ifndef GL_GLES ~ #endif"
+def ifdef_stmt (api_dic) :
+       if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
+               return "\n#ifndef GL_GLES"
+       return ""
+
+def endif_stmt (api_dic) :
+       if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
+               return "\n#endif"
+       return ""
+
+# debug lvl is 1 ----------------------------------------------
+def define_counter(api_dic) :
+
+       counter = ifdef_stmt(api_dic)
+       counter += "\nint cb_%s_counter = 1;" %(api_dic['api_name'])
+       counter += "\nint evas_%s_counter = 1;" %(api_dic['api_name'])
+
+       counter += endif_stmt(api_dic)
+
+       return counter
+
+def logging_and_counter (func_name) :
        func_body = _NEWLINE
        if g_print_err : func_body += "ERR(\"(counter:%d)\\n\", "
        else           : func_body += "fprintf(stderr,\" %s(%d)\\n\", __func__, "
@@ -194,7 +221,7 @@ def logging_and_counter (func_name) :
 
        return func_body
 
-# debug_lvl is 2
+# debug lvl is 2 ----------------------------------------------
 def define_timeval() :
        func_body = _NEWLINE
        func_body += "struct timeval tv1, tv2; /* time value 1, 2 */"
@@ -205,7 +232,6 @@ def define_timeval() :
        return func_body
 
 def elapsed_time (tv1, tv2) :
-
        func_body = _NEWLINE
        func_body += "et = (%s.tv_sec - %s.tv_sec) * 1000.0;\n" %(tv1, tv2)
        func_body += "et += (%s.tv_usec - %s.tv_usec) / 1000.0;\n" %(tv1, tv2)
@@ -213,9 +239,8 @@ def elapsed_time (tv1, tv2) :
 
        return func_body
 
-# debug_lvl is 3
+# debug lvl is 3 ----------------------------------------------
 def check_glError() :
-
        func_body = _NEWLINE
        func_body += "/* for debug, check glError */\n"
        func_body += "GLenum err = glGetError();\n"
@@ -225,31 +250,24 @@ def check_glError() :
 
        return func_body
 
-def LOG (buf) :
-       if g_verbose: print buf
+################################################################################
 
-def FWRITE (fp, buf) :
-       fp.write(buf)
+#--------------------------------------------------------------
+def gen_structure(api_def):
 
-################################################################################
-def gen_structure(api_def_dic):
+       return_type = api_def['return_type']
+       api_name = api_def['api_name'].strip()
+       para_list = api_def['para_list']
+       para_name_list = api_def['para_name_list']
+       extYN = api_def['extYN']
+       queue_opr = api_def['queue_opr']
 
-       api_type = api_def_dic['type']
-       return_type = api_def_dic['return_type']
-       api_name = api_def_dic['api_name'].strip()
-       para_list = api_def_dic['para_list']
-       para_name_list = api_def_dic['para_name_list']
-       queue_opr = api_def_dic['queue_opr']
-       if api_type == "EVAS" :
-               struct_name_prefix = "Evas_Thread_Command"
-       elif api_type == "EVAS GL" :
-               struct_name_prefix = "EVGL_Thread_Command"
-       elif api_type == "EVAS GL API" :
-               struct_name_prefix = "EVGL_API_Thread_Command"
+       prototype = "typedef %s(*GL_TH_FNTYPE(%s))(%s);" % (return_type, api_name, list_to_str(para_list))
 
        s_member = ""
-       if (return_type == "void") and (len(para_name_list) == 0) and g_debug_lvl is not 2 :
-                       return ""
+
+       s_member += _NEWLINE
+       s_member += "GL_TH_FNTYPE(%s) orig_func;" % (api_name)
 
        if g_debug_lvl is 2:
                s_member += _NEWLINE
@@ -265,102 +283,79 @@ def gen_structure(api_def_dic):
                        s_member += _NEWLINE
                        s_member += p + ";"
 
-       if 'copy_val' in api_def_dic :
+       if 'copy_val' in api_def :
                s_member += _NEWLINE
-               s_member += "void *%s_copied; /* COPIED */" %(api_def_dic['copy_val'])
+               s_member += "void *%s_copied; /* COPIED */" %(api_def['copy_val'])
 
-       if queue_opr != "finish" :
+       if 'needMacro' in api_def :
                s_member += _NEWLINE
-               s_member += "int command_allocated;"
-
-       if 'userDefinedCopy' in api_def_dic :
-               s_member += _NEWLINE
-               s_member += "%s_COPY_VARIABLE; /* TODO */" %(api_name.upper())
+               s_member += "%s_VARIABLE_DECLARE /* TODO */" %(api_name.upper())
        s_member += _NEWLINE
 
        struct_data = """
+%s
+
 typedef struct
 {%s
-} %s_%s;
-""" %(s_member, struct_name_prefix, api_name)
+} GL_TH_ST(%s);
+""" %(prototype, s_member, api_name)
 
        return struct_data
 
 #--------------------------------------------------------------
 def gen_function_pointer(api_def_dic) :
 
-       if ('func_ptr' in api_def_dic) is False :
-               return ""
-
-       func_ptr = api_def_dic['func_ptr']
-       api_type = api_def_dic['type']
        return_type = api_def_dic['return_type']
        api_name = api_def_dic['api_name']
        para_data = list_to_str(api_def_dic['para_list'])
+       macro = api_def_dic['macro']
 
-       fp_name = "%s_%s" %(func_ptr, api_name)
-       func_body = "\n%s (*%s)(%s);\n" %(return_type, fp_name, para_data)
+       # function pointer name
+       func_body = "\n"
+       fp_name = "ORIG_GL(%s)" %(api_name)
 
-       if api_type == "EVAS GL API" :
-               return func_body
-       else :
+       func_body += "%s (*%s)(%s);\n" %(return_type, fp_name, para_data)
+
+       if api_def_dic['extYN'] == "ext" :
                func_body += """
 void
-%s_%s_set(void *func)
+%s_SET(%s)(void *func)
 {
 %s = func;
 }
 
 void *
-%s_%s_get(void)
+%s_GET(%s)(void)
 {
 return %s;
 }
-""" %(api_name, func_ptr, fp_name,
-         api_name, func_ptr, fp_name)
+""" %(macro, api_name, fp_name,
+         macro, api_name, fp_name)
 
        return func_body
 
 #--------------------------------------------------------------
 def gen_gl_thread_api(api_def_dic) :
 
-       api_type = api_def_dic['type']
        api_name = api_def_dic['api_name']
        return_type = api_def_dic['return_type']
        para_name_list = api_def_dic['para_name_list']
        extYN = api_def_dic['extYN']
        queue_opr = api_def_dic['queue_opr']
-       gl_prefix = ""
-
-       if api_type == "EVAS" :
-               struct_name_prefix = "Evas_Thread_Command"
-               func_name_prefix = "_gl_thread"
-               if extYN == "ext" :     gl_prefix = "orig_evas_" # for extension
-       elif api_type == "EVAS GL" :
-               struct_name_prefix = "EVGL_Thread_Command"
-               func_name_prefix = "_evgl_thread"
-               if extYN == "ext" :     gl_prefix = "orig_evgl_" # for extension
-       elif api_type == "EVAS GL API" :
-               struct_name_prefix = "EVGL_API_Thread_Command"
-               func_name_prefix = "_evgl_api_thread"
-               gl_prefix = "orig_evgl_api_"
 
+       gl_call = "((GL_TH_FNTYPE(%s))thread_data->orig_func)\n" % (api_name)
        para_data = "void *data"
        func_body = ""
 
        # logging & increase counter
        if g_debug_lvl is 1 :
-               func_body += logging_and_counter(func_name_prefix + "_" + api_name)
+               func_body += logging_and_counter("cb_" + api_name)
        elif g_debug_lvl is 2 :
                func_body += define_timeval()
 
-       if (return_type == "void") and (len(para_name_list) == 0) and g_debug_lvl is not 2:
-                       para_data += " EINA_UNUSED"
-
-       else :
-               func_body += _NEWLINE
-               func_body += "%s_%s *thread_data =\n" %(struct_name_prefix, api_name)
-               func_body += "(%s_%s *)data;\n" %(struct_name_prefix, api_name)
+       func_body += _NEWLINE
+       func_body += "GL_TH_ST(%s) *thread_data =\n" %(api_name)
+       func_body += "*(void **)data;\n"
 
        func_body += _NEWLINE
 
@@ -371,13 +366,21 @@ def gen_gl_thread_api(api_def_dic) :
                func_body += "printf(\"[%f] callback(%s)\\n\", et, __func__);"
                func_body += "\n\n"
 
+       # if needMacro
+       if 'needMacro' in api_def_dic :
+               func_body += "\n"
+               func_body += "%s_GLCALL_BEFORE; /* TODO */\n\n" %(api_name.upper())
+
+       func_body += _NEWLINE
+
        if return_type != "void" :
                if g_debug_lvl is 3 :
                        func_body += "%s return_value = " %(return_type)
                else :
                        func_body += "thread_data->return_value = "
-
-       func_body += "%s%s(" %(gl_prefix, api_name) #GL API or function pointer call
+               func_body += "%s(" %(gl_call) #GL API or function pointer call
+       else :
+               func_body += "%s(" %(gl_call) #GL API or function pointer call
 
        for p in para_name_list:
                if (para_name_list.index(p) > 0) :
@@ -401,6 +404,11 @@ def gen_gl_thread_api(api_def_dic) :
                if return_type != "void" :
                        func_body += "thread_data->return_value = return_value;\n"
 
+       # if needMacro
+       if 'needMacro' in api_def_dic :
+               func_body += "\n"
+               func_body += "%s_GLCALL_AFTER; /* TODO */\n" %(api_name.upper())
+
        # if copy variable, free
        if 'copy_val' in api_def_dic:
                func_body += "\n"
@@ -410,78 +418,60 @@ def gen_gl_thread_api(api_def_dic) :
                func_body += "eina_mempool_free(%s, thread_data->%s_copied);\n" %(api_def_dic['mp_name'],
                                                                    api_def_dic['copy_val'])
 
-       # if userDefinedCopy
-       if 'userDefinedCopy' in api_def_dic :
-               func_body += "\n"
-               func_body += "%s_COPY_VARIABLE_FREE; /* TODO */\n" %(api_name.upper())
-
-       # thread_data free
-       if (queue_opr != "finish") and len(para_name_list) > 0:
-               func_body += "\n"
-               func_body += "if (thread_data->command_allocated)\n"
-               func_body += "eina_mempool_free(_mp_command, thread_data);"
-
        return """
 static void
-%s_%s(%s)
+GL_TH_CB(%s)(%s)
 {%s
 }
-""" %(func_name_prefix, api_name, para_data, func_body)
+""" %(api_name, para_data, func_body)
 
 #--------------------------------------------------------------
 def gen_thread_cmd_api(api_def_dic) :
 
-       api_type = api_def_dic['type']
        api_name = api_def_dic['api_name']
        return_type = api_def_dic['return_type']
+       macro = api_def_dic['macro']
        para_list = api_def_dic['para_list']
        para_name_list = api_def_dic['para_name_list']
        queue_opr = api_def_dic['queue_opr']
 #      if queue_opr == "flush" or queue_opr == "enqueue" :
 #              print "(%s)%s:%s" %(api_type, api_name, queue_opr)
        extYN = api_def_dic['extYN']
-       gl_prefix = ""
-       queue_type = ""
+       env_check = api_def_dic['env_check']
+       queue_type = api_def_dic['qtype']
+
+       gl_call = "((GL_TH_FNTYPE(%s))orig_func)\n" % (api_name)
+
        if 'copy_val' in api_def_dic :
                mp_name = api_def_dic['mp_name']
                copy_val = api_def_dic['copy_val']
                copy_size = api_def_dic['copy_size']
 
-       if api_type == "EVAS" :
-               env_check = "!evas_gl_thread_enabled()"
-               struct_name_prefix = "Evas_Thread_Command"
-               func_name_prefix = "_gl_thread"
-               func_suffix = "thread_cmd"
-               queue_type = "EVAS_GL_THREAD_TYPE_GL"
-               if extYN == "ext" :     gl_prefix = "orig_evas_" # for extension
-       elif api_type == "EVAS GL" :
-               env_check = "!evas_evgl_thread_enabled()"
-               struct_name_prefix = "EVGL_Thread_Command"
-               queue_type = "EVAS_GL_THREAD_TYPE_EVGL"
-               func_name_prefix = "_evgl_thread"
-               func_suffix = "evgl_thread_cmd"
-               if extYN == "ext" :     gl_prefix = "orig_evgl_" # for extension
-       elif api_type == "EVAS GL API" :
-               env_check = "!evas_evgl_thread_enabled() || (_main_thread_id != eina_thread_self())"
-               struct_name_prefix = "EVGL_API_Thread_Command"
-               queue_type = "EVAS_GL_THREAD_TYPE_EVGL"
-               func_name_prefix = "_evgl_api_thread"
-               func_suffix = "evgl_api_thread_cmd"
-               gl_prefix = "orig_evgl_api_"
-
        para_data = ""
        func_body = ""
 
        if len(para_name_list) == 0 :
-               para_data += "void"
+               para_data += "GL_TH_DP"
        else :
+               para_data += "GL_TH_DP, "
                para_data += list_to_str(para_list)
 
        para_val = "NULL"
 
+       # thread_mode
+       func_body += _NEWLINE
+       func_body += "int thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
+
+       # Has structure
+       func_body += _NEWLINE
+       func_body += "GL_TH_ST(%s) thread_data_local, *thread_data = &thread_data_local, **thread_data_ptr;\n" %(api_name)
+       func_body += "void *thcmd_ref;\n"
+       func_body += _NEWLINE
+
        # logging & increase counter
        if g_debug_lvl is 1 :
-               func_body += logging_and_counter(api_name + "_" + func_suffix)
+               fp_name = "evas_"
+               func_body += logging_and_counter( fp_name + api_name )
        # if debug level 2, define timeval
        elif g_debug_lvl is 2 :
                func_body += _NEWLINE
@@ -502,8 +492,10 @@ def gen_thread_cmd_api(api_def_dic) :
                if return_type != "void" :
                        func_body += "%s rc;" %(return_type)
                        func_body += _NEWLINE
-                       func_body += "rc = "
-               func_body += "%s%s(%s);\n" %(gl_prefix, api_name, list_to_str(para_name_list))
+                       func_body += "rc = %s(%s);" %(gl_call, list_to_str(para_name_list))
+               else :
+                       func_body += "%s(%s);" %(gl_call, list_to_str(para_name_list))
+
                func_body += _NEWLINE
                func_body += "gettimeofday(&tv2, NULL);\n"
                func_body += elapsed_time("tv2", "tv1")
@@ -518,118 +510,105 @@ def gen_thread_cmd_api(api_def_dic) :
 
        else : # not debug mode
                if return_type == "void" :
-                       func_body += "%s%s(%s);" %(gl_prefix, api_name, list_to_str(para_name_list))
+                       func_body += "%s(%s);" %(gl_call, list_to_str(para_name_list))
                        func_body += _NEWLINE
                        func_body += "return;"
 
                else :
-                       func_body += "return %s%s(%s);" %(gl_prefix, api_name, list_to_str(para_name_list))
+                       func_body += "return %s(%s);" %(gl_call, list_to_str(para_name_list))
                func_body += _NEWLINE
 
        func_body += "}"
        func_body += _NEWLINE
 
-       # thread_mode
-       func_body += _NEWLINE
-       func_body += "int thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
-
        # Has structure
-       if (return_type != "void") or (len(para_name_list) > 0) or (g_debug_lvl is 2):
-               para_val = "thread_data"
+       #if (return_type != "void") or (len(para_name_list) > 0) or (g_debug_lvl is 2):
+       # check force_finish() before malloc
+       func_body += "thread_data_ptr =\n"
+       if queue_opr == "finish" :
+               func_body += "evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(%s) *), &thcmd_ref);\n" %(api_name)
+               func_body += "*thread_data_ptr = thread_data;\n"
+       else :
+               func_body += "evas_gl_thread_cmd_create(thread_type, sizeof(GL_TH_ST(%s) *) + sizeof(GL_TH_ST(%s)), &thcmd_ref);\n" %(api_name, api_name)
+               func_body += "*thread_data_ptr = (void *)((char *)thread_data_ptr + sizeof(GL_TH_ST(%s) *));\n" % (api_name)
+               func_body += "thread_data = *thread_data_ptr;\n"
+
+       if queue_opr != "finish" :
                func_body += _NEWLINE
-               func_body += "%s_%s thread_data_local;\n" %(struct_name_prefix, api_name)
-               func_body += "%s_%s *thread_data = &thread_data_local;\n" %(struct_name_prefix,
-                                                                                                                                               api_name)
+               func_body += "if (!evas_gl_thread_force_finish())\n"
+               func_body += "   thread_mode = EVAS_GL_THREAD_MODE_%s;\n" %(queue_opr.upper())
 
-               # check force_finish() before malloc
-               if queue_opr != "finish" :
-                       func_body += _NEWLINE
-                       func_body += "/* command_allocated flag init. */\n"
-                       func_body += "thread_data->command_allocated = 0;\n"
-                       func_body += _NEWLINE
-                       func_body += "if (!evas_gl_thread_force_finish())\n"
-                       func_body += "{ /* _flush */\n"
-                       func_body += "%s_%s *thread_data_new;\n" %(struct_name_prefix, api_name)
-                       func_body += "thread_data_new = eina_mempool_malloc(_mp_command,\n"
-                       func_body += "sizeof(%s_%s));\n" %(struct_name_prefix, api_name)
-                       func_body += "if (thread_data_new)\n"
-                       func_body += "{\n"
-                       func_body += "thread_data = thread_data_new;\n"
-                       func_body += "thread_data->command_allocated = 1;\n"
-                       func_body += "thread_mode = EVAS_GL_THREAD_MODE_%s;\n" %(queue_opr.upper())
-                       func_body += "}\n"
-                       func_body += "}\n"
-
-               # assign parameter to thread_data
-               for p in para_name_list :
-                       func_body += _NEWLINE
+       # assign parameter to thread_data
+       for p in para_name_list :
+               func_body += _NEWLINE
 
-                       idx = para_list[para_name_list.index(p)].find('[') # if parameter is array
-                       if idx > 0 :
-                               p_dat = para_list[para_name_list.index(p)].split() # type name[size]
-                               p_type = p_dat[0]               # get type
-                               p_temp = p_dat[1].split('[')    # get size
-                               p_size = p_temp[1].split(']')
-                               func_body += "memcpy(thread_data->%s, &%s, sizeof(%s) * %s);" %(p, p, p_type,
-                                                                                                                                                                       p_size[0])
-                       else :
-                               func_body += "thread_data->%s = %s;" %(p, p)
+               idx = para_list[para_name_list.index(p)].find('[') # if parameter is array
+               if idx > 0 :
+                       p_dat = para_list[para_name_list.index(p)].split() # type name[size]
+                       p_type = p_dat[0]               # get type
+                       p_temp = p_dat[1].split('[')    # get size
+                       p_size = p_temp[1].split(']')
+                       func_body += "memcpy(thread_data->%s, &%s, sizeof(%s) * %s);" %(p, p, p_type, p_size[0])
+               else :
+                       func_body += "thread_data->%s = %s;" %(p, p)
 
-               func_body += _NEWLINE
-               # end of assign
+       func_body += _NEWLINE
+       func_body += "thread_data->orig_func = orig_func;"
 
-               if 'copy_val' in api_def_dic :
-                       func_body += _NEWLINE
-                       func_body += "thread_data->%s_copied = NULL;" %(copy_val)
+       func_body += _NEWLINE
+       # end of assign
 
-               if 'userDefinedCopy' in api_def_dic :
-                       func_body += _NEWLINE
-                       func_body += "%s_COPY_VARIABLE_INIT; /* TODO */\n" %(api_name.upper())
+       if 'copy_val' in api_def_dic :
+               func_body += _NEWLINE
+               func_body += "thread_data->%s_copied = NULL;" %(copy_val)
 
-               if queue_opr != "finish" and ('copy_val' in api_def_dic or
-                                                                               'userDefinedCopy' in api_def_dic):
-                       func_body += _NEWLINE
-                       func_body += "if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)\n"
-                       func_body += "goto finish;\n"
+       if 'needMacro' in api_def_dic :
+               func_body += _NEWLINE
+               func_body += "%s_VARIABLE_INIT; /* TODO */\n" %(api_name.upper())
 
-               # if copy_val defined, copy to given memory pool
-               if 'copy_val' in api_def_dic :
-                       param = para_list[para_name_list.index(copy_val)]
-                       idx = param.find('*')
-                       p_type = param[:idx]
+       if queue_opr != "finish" and ('copy_val' in api_def_dic or 'needMacro' in api_def_dic):
+               func_body += _NEWLINE
+               func_body += "if (thread_mode == EVAS_GL_THREAD_MODE_FINISH)\n"
+               func_body += "goto finish;\n"
 
-                       func_body += _NEWLINE
-                       func_body += "/* copy variable */\n"
-                       func_body += "if (%s)\n" %(copy_val)
-                       func_body += "{\n"
-
-                       func_body += "/* 1. check memory size */\n"
-                       func_body += "unsigned int copy_size = %s;\n" %(copy_size)
-                       func_body += "if (copy_size > %s_memory_size)\n" %(mp_name)
-                       func_body += "{\n"
-                       func_body += "thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
-                       func_body += "goto finish;\n"
-                       func_body += "}\n"
-
-                       func_body += "/* 2. malloc & copy */\n"
-                       func_body += "thread_data->%s_copied = " %(copy_val)
-                       func_body += "eina_mempool_malloc(%s, copy_size);\n" %(mp_name)
-                       func_body += "if (thread_data->%s_copied)\n" %(copy_val)
-                       func_body += "{\n"
-                       func_body += "memcpy(thread_data->%s_copied, %s, copy_size);\n" %(copy_val, copy_val)
-                       func_body += "}\n"
-                       func_body += "else\n"
-                       func_body += "{\n"
-                       func_body += "thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
-                       func_body += "goto finish;\n"
-                       func_body += "}\n"
-
-                       func_body += "/* 3. replace */\n"
-                       func_body += "thread_data->%s = (%s *)thread_data->%s_copied;\n" %(copy_val, p_type, copy_val)
-                       func_body += "}\n"
-
-                       func_body += "/* end of copy variable */"
-                       func_body += _NEWLINE
+       # if copy_val defined, copy to given memory pool
+       if 'copy_val' in api_def_dic :
+               param = para_list[para_name_list.index(copy_val)]
+               idx = param.find('*')
+               p_type = param[:idx]
+
+               func_body += _NEWLINE
+               func_body += "/* copy variable */\n"
+               func_body += "if (%s)\n" %(copy_val)
+               func_body += "{\n"
+
+               func_body += "/* 1. check memory size */\n"
+               func_body += "unsigned int copy_size = %s;\n" %(copy_size)
+               func_body += "if (copy_size > %s_memory_size)\n" %(mp_name)
+               func_body += "{\n"
+               func_body += "thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
+               func_body += "goto finish;\n"
+               func_body += "}\n"
+
+               func_body += "/* 2. malloc & copy */\n"
+               func_body += "thread_data->%s_copied = " %(copy_val)
+               func_body += "eina_mempool_malloc(%s, copy_size);\n" %(mp_name)
+               func_body += "if (thread_data->%s_copied)\n" %(copy_val)
+               func_body += "{\n"
+               func_body += "memcpy(thread_data->%s_copied, %s, copy_size);\n" %(copy_val, copy_val)
+               func_body += "}\n"
+               func_body += "else\n"
+               func_body += "{\n"
+               func_body += "thread_mode = EVAS_GL_THREAD_MODE_FINISH;\n"
+               func_body += "goto finish;\n"
+               func_body += "}\n"
+
+               func_body += "/* 3. replace */\n"
+               func_body += "thread_data->%s = (%s *)thread_data->%s_copied;\n" %(copy_val, p_type, copy_val)
+               func_body += "}\n"
+
+               func_body += "/* end of copy variable */"
+               func_body += _NEWLINE
 
        # get time of enqueue
        if g_debug_lvl is 2:
@@ -637,22 +616,28 @@ def gen_thread_cmd_api(api_def_dic) :
                func_body += "memcpy(&(thread_data->tv), &tv1, sizeof(struct timeval));"
                func_body += _NEWLINE
 
-       if 'userDefinedCopy' in api_def_dic :
-               func_body += _NEWLINE
-               func_body += "%s_COPY_TO_MEMPOOL; /* TODO */" %(api_name.upper())
+       if 'needMacro' in api_def_dic :
                func_body += _NEWLINE
+               func_body += "%s_ASYNC_PREPARE; /* TODO */\n" %(api_name.upper())
 
-       if queue_opr != "finish" and ('copy_val' in api_def_dic or 'userDefinedCopy' in api_def_dic):
+       if queue_opr != "finish" and ('copy_val' in api_def_dic or 'needMacro' in api_def_dic):
                func_body += _NEWLINE
                func_body += "finish:"
 
+       if 'needMacro' in api_def_dic :
+               func_body += _NEWLINE
+               func_body += "%s_ENQUEUE_BEFORE; /* TODO */\n" %(api_name.upper())
+
        func_body += _NEWLINE
-       func_body += "evas_gl_thread_cmd_enqueue(%s,\n" %(queue_type)
-       func_body += "%s_%s,\n" %(func_name_prefix, api_name)
-       func_body += "%s,\n" %(para_val)
+       func_body += "evas_gl_thread_cmd_enqueue(thcmd_ref,\n"
+       func_body += "GL_TH_CB(%s),\n" %(api_name)
        func_body += "thread_mode);"
        func_body += _NEWLINE
 
+       if 'needMacro' in api_def_dic :
+               func_body += _NEWLINE
+               func_body += "%s_ENQUEUE_AFTER; /* TODO */\n" %(api_name.upper())
+
        if g_debug_lvl is 2:
                func_body += _NEWLINE
                func_body += "gettimeofday(&tv2, NULL);\n"
@@ -671,68 +656,33 @@ def gen_thread_cmd_api(api_def_dic) :
                func_body += _NEWLINE
 
        return """
-EAPI %s
-%s_%s(%s)
+%s
+%s(%s)(%s)
 {%s}
-""" %(return_type, api_name, func_suffix, para_data, func_body)
+""" %(return_type, macro, api_name, para_data, func_body)
 
 #--------------------------------------------------------------
-def gen_wrapper_api_header(api_def_dic) :
+def gen_wrapper_api_header(macro, need_ext, api_def_dic) :
 
-       api_type = api_def_dic['type']
        api_name = api_def_dic['api_name']
        return_type = api_def_dic['return_type']
        para_data = list_to_str(api_def_dic['para_list'])
        extYN = api_def_dic['extYN']
-       if api_type == "EVAS" :                  api_suffix = "thread_cmd"
-       elif api_type == "EVAS GL" :     api_suffix = "evgl_thread_cmd"
-       elif api_type == "EVAS GL API" : api_suffix = "evgl_api_thread_cmd"
-
-       header_data = ""
-
-       if 'func_ptr' in api_def_dic:
-               func_prefix = api_def_dic['func_ptr']
-               if api_type == "EVAS" or api_type == "EVAS GL" :
-                       header_data += _NEWLINE
-                       header_data += _NEWLINE
-                       header_data += "EAPI void %s_%s_set(void *func);" %(api_name, func_prefix)
-                       header_data += _NEWLINE
-                       header_data += "EAPI void *%s_%s_get(void);" %(api_name, func_prefix)
-               elif api_type == "EVAS GL API" :
-                       header_data += _NEWLINE
-                       header_data += _NEWLINE
-                       header_data += "extern %s (*%s_%s)(%s);" %(return_type, func_prefix,
-                                                                                                       api_name, para_data)
-
-       header_data += _NEWLINE
-       header_data += "EAPI %s %s_%s(%s);" %(return_type, api_name, api_suffix, para_data)
-       if 'gl_type' in api_def_dic and api_def_dic['gl_type'] == "GL" : header_data += _NEWLINE
-
-       return header_data
 
-#--------------------------------------------------------------
-def gen_init_func_data(func_type) :
+       header_data = _NEWLINE
 
-       init_func_data = "\n\nvoid\n_gl_thread_link_%s_generated_init()\n{\n" %(func_type)
-       init_func_data += \
-"""#define LINK2GENERIC(sym) \\
-       sym = dlsym(RTLD_DEFAULT, #sym); \\
-       if (!sym) ERR("Could not find function '%s'", #sym);
-"""
-       return init_func_data
+       func_name = "%s(%s)" %(macro, api_name)
 
-def gen_symload_set_get(api_dic) :
+       if para_data == "void" :
+               para_data = "GL_TH_DP"
+       else :
+               para_data = "GL_TH_DP, " + para_data
 
-       fp_name = "%s_%s" %(api_dic['api_name'], api_dic['func_ptr'])
-       symload_data = "LINK2GENERIC(%s_set);" %(fp_name)
-       symload_data += _NEWLINE
-       symload_data += "LINK2GENERIC(%s_get);" %(fp_name)
-       symload_data += _NEWLINE
+       header_data += "extern %s %s(%s);" %(return_type, func_name, para_data)
 
-       return symload_data
+       return header_data
 
 #--------------------------------------------------------------
-
 # for debug
 def api_define_print(api) :
 
@@ -743,93 +693,183 @@ def api_define_print(api) :
 */
 """ %(api['return_type'], api['api_name'], list_to_str(api['para_list']))
 
+################################################################################
+def function_pointer_structure(macro, need_ext, api_dic):
 
-###############################################################################
-def generate_files(out_fname) :
+       api_name = api_dic['api_name']
+       return_type = api_dic['return_type']
+       para_data = list_to_str(api_dic['para_list'])
+       extYN = api_dic['extYN']
 
-       gen_files = {} # {file name : file pointer}
-       if g_evas_total > 0 :
-               gl_src = out_fname + "_gl_generated.c"
-               gl_hdr = out_fname + "_gl_generated.h"
+       mem_data = ifdef_stmt(api_dic)
+
+       if para_data == "void" :
+               para_data = "GL_TH_DP"
+       else :
+               para_data = "GL_TH_DP, " + para_data
 
-               gen_files[gl_src] = open(gl_src, 'w')
-               gen_files[gl_hdr] = open(gl_hdr, 'w')
+       mem_data += "\n%s (*%s(%s))(%s);" %(return_type, macro, api_name, para_data)
 
-               gl_link_src = out_fname + "_gl_link_generated.c"
-               gl_link_hdr = out_fname + "_gl_link_generated.h"
+       mem_data += endif_stmt(api_dic)
 
-               gen_files[gl_link_src] = open(gl_link_src, 'w')
-               gen_files[gl_link_hdr] = open(gl_link_hdr, 'w')
+       return mem_data
+#--------------------------------------------------------------
+def func_get_header(gl_type) :
 
-       if g_evgl_total > 0 :
-               evgl_src = out_fname + "_evgl_generated.c"
-               evgl_hdr = out_fname + "_evgl_generated.h"
+       return """
+static Evas_GL_Thread_%s_Generated_Func th_%s_gen_func;
+Eina_Bool th_%s_gen_func_initialized = EINA_FALSE;
 
-               gen_files[evgl_src] = open(evgl_src, 'w')
-               gen_files[evgl_hdr] = open(evgl_hdr, 'w')
+void *
+%s_generated_func_get()
+{
+   if (!th_%s_gen_func_initialized)
+     {
+#define THREAD_FUNCTION_ASSIGN(func) th_%s_gen_func.func = func;
+""" %(gl_type.upper(), gl_type, gl_type,
+         gl_type, gl_type, gl_type)
 
-               evgl_link_src = out_fname + "_evgl_link_generated.c"
-               evgl_link_hdr = out_fname + "_evgl_link_generated.h"
+def function_pointer_assign(macro, need_ext, api_dic):
 
-               gen_files[evgl_link_src] = open(evgl_link_src, 'w')
-               gen_files[evgl_link_hdr] = open(evgl_link_hdr, 'w')
+       api_name = api_dic['api_name']
+       return_type = api_dic['return_type']
+       extYN = api_dic['extYN']
 
-       if g_evgl_api_total > 0 :
-               evgl_api_src = out_fname + "_evgl_api_generated.c"
-               evgl_api_hdr = out_fname + "_evgl_api_generated.h"
+       func_body = ifdef_stmt(api_dic)
 
-               gen_files[evgl_api_src] = open(evgl_api_src, 'w')
-               gen_files[evgl_api_hdr] = open(evgl_api_hdr, 'w')
+       func_body += "\nTHREAD_FUNCTION_ASSIGN(%s(%s));" %(macro, api_name)
+       func_body += endif_stmt(api_dic)
+
+       return func_body
+
+def func_get_tail(api_type) :
+
+       return """
+
+#undef THREAD_FUNCTION_ASSIGN
+
+        th_%s_gen_func_initialized = EINA_TRUE;
+     }
+
+   return &th_%s_gen_func;
+}
+""" %(api_type, api_type)
 
-       return gen_files
 #--------------------------------------------------------------
-def generate_code(out_files) :
+# for _link_generate files
+def function_pointer_init(macro, need_ext, api_dic):
 
-       auto_gen_msg = """/*
-* This is an automatically generated file using a python script.
-* ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
-* Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
-* and make use of scripts if you need to fix them.
-*/
-"""
-       evgl_header_file_head = \
+       api_name = api_dic['api_name']
+       return_type = api_dic['return_type']
+       para_data = list_to_str(api_dic['para_list'])
+       extYN = api_dic['extYN']
+
+       fp_init = ifdef_stmt(api_dic)
+
+       if para_data == "void" :
+               para_data = "GL_TH_DP"
+       else :
+               para_data = "GL_TH_DP, " + para_data
+
+       fp_init += "\n%s (*%s(%s))(%s) = NULL;" %(return_type, macro, api_name, para_data)
+
+       fp_init += endif_stmt(api_dic)
+
+       return fp_init
+
+def function_pointer_extern(macro, need_ext, api_dic):
+
+       api_name = api_dic['api_name']
+       return_type = api_dic['return_type']
+       para_data = list_to_str(api_dic['para_list'])
+       extYN = api_dic['extYN']
+
+       fp_extern = ifdef_stmt(api_dic)
+
+       if para_data == "void" :
+               para_data = "GL_TH_DP"
+       else :
+               para_data = "GL_TH_DP, " + para_data
+
+       fp_extern += "\nextern %s (*%s(%s))(%s);" %(return_type, macro, api_name, para_data)
+       fp_extern += endif_stmt(api_dic)
+
+       return fp_extern
+
+def init_function_extern(api_type) :
+
+       return """
+
+extern void _gl_thread_link_%s_generated_init(void *func_ptr);
+""" %(api_type)
+
+#--------------------------------------------------------------
+def func_init_header(api_type) :
+
+       return """
+void
+_gl_thread_link_%s_generated_init(void *func_ptr)
+{
+   const Evas_GL_Thread_%s_Generated_Func *th_%s_gen_func = func_ptr;
+
+   if (!th_%s_gen_func)
+     {
+        ERR("Thread functions (%s-Generated BASE) are not exist");
+        return;
+     }
+
+#define THREAD_FUNCTION_ASSIGN(func) func = th_%s_gen_func->func;
+
+""" %(api_type, api_type.upper(), api_type, api_type, api_type.upper(), api_type)
+
+def func_init_tail() :
+
+       return """
+#undef THREAD_FUNCTION_ASSIGN
+
+}
 """
-#define EVAS_GL_NO_GL_H_CHECK 1
-#include "Evas_GL.h"
 
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EVAS_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EVAS_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
+###############################################################################
+def generate_files(out_fname) :
+
+       gen_files = {} # {file name : file pointer}
+
+       gl_src = out_fname + "_gl_generated.c"
+       gl_hdr = out_fname + "_gl_generated.h"
+
+       gen_files[gl_src] = open(gl_src, 'w')
+       gen_files[gl_hdr] = open(gl_hdr, 'w')
+
+       gl_link_src = out_fname + "_gl_link_generated.c"
+       gl_link_hdr = out_fname + "_gl_link_generated.h"
+
+       gen_files[gl_link_src] = open(gl_link_src, 'w')
+       gen_files[gl_link_hdr] = open(gl_link_hdr, 'w')
+
+       # file truncate & write auto gen message
+       auto_gen_msg = """/*
+ * ------------------------------------------------------------------------------
+ * This is an automatically generated file using a python script.
+ * ($EFL_HOME/src/utils/evas/generate_gl_thread_api.py)
+ * Recommend that you modify data files ($EFL_HOME/src/utils/evas/gl_api_def.txt)
+ * and make use of scripts if you need to fix them.
+ * ------------------------------------------------------------------------------
+ */
 """
+       files = gen_files.keys()
 
-       files = out_files.keys()
+       for f in files :
+               gen_files[f].truncate()
+               gen_files[f].write(auto_gen_msg)
 
-       # get file pointer, init. files...
+       return gen_files
+#--------------------------------------------------------------
+def generate_code(out_files) :
+
+       files = out_files.keys()
+       # get file pointer,...
        for f in files :
-               out_files[f].truncate()
-               out_files[f].write(auto_gen_msg)
 
                # EVAS
                if f.find("_gl_generated.c") > 0 :
@@ -842,97 +882,35 @@ def generate_code(out_files) :
                if f.find("_gl_link_generated.h") > 0 :
                        gl_link_header_file = out_files[f]
 
-               # EVAS GL
-               if f.find("_evgl_generated.c") > 0 :
-                       evgl_source_file = out_files[f]
-                       if g_debug_lvl is 2 : evgl_source_file.write("#include <sys/time.h>\n")
-               if f.find("_evgl_generated.h") > 0 :
-                       evgl_header_file = out_files[f]
-                       evgl_header_file.write(evgl_header_file_head)
-               if f.find("_evgl_link_generated.c") > 0 :
-                       evgl_link_source_file = out_files[f]
-               if f.find("_evgl_link_generated.h") > 0 :
-                       evgl_link_header_file = out_files[f]
-
-               # EVAS GL API
-               if f.find("_evgl_api_generated.c") > 0 :
-                       evgl_api_source_file = out_files[f]
-                       if g_debug_lvl is 2 : evgl_api_source_file.write("#include <sys/time.h>\n")
-               if f.find("_evgl_api_generated.h") > 0 :
-                       evgl_api_header_file = out_files[f]
-                       evgl_api_header_file.write(evgl_header_file_head)
+       # include headers
+       evas_gl_include = """
+#define EVAS_GL_NO_GL_H_CHECK 1
+#include "Evas_GL.h"
+
+"""
+       gl_header_file.write(evas_gl_include)
+       #if g_internal_total > 0        : gl_header_file.write(evas_gl_include)
 
        #print ">>> code generate START >>>"
        #if debug mode, define counter variable
        if g_debug_lvl is 1 :
-               if g_evas_total > 0 : gl_source_file.write("\n\n/* DEBUG */\n\n")
-               if g_evgl_total > 0 : evgl_source_file.write("\n\n/* DEBUG */\n\n")
-               if g_evgl_api_total > 0 : evgl_api_source_file.write("\n\n/* DEBUG */\n\n")
-
                for api_dic in api_dic_list :
-                       if api_dic['type'] == "EVAS" :
-                               api_prefix = "_gl_thread"
-                               api_suffix = "thread_cmd"
-                               fp = gl_source_file
-                       elif api_dic['type'] == "EVAS GL" :
-                               api_prefix = "_evgl_thread"
-                               api_suffix = "evgl_thread_cmd"
-                               fp = evgl_source_file
-                       elif api_dic['type'] == "EVAS GL API" :
-                               api_prefix = "_evgl_api_thread"
-                               api_suffix = "evgl_api_thread_cmd"
-                               fp = evgl_api_source_file
-
-                       # check gl type,..
-                       ifdef_stmt = ""
-                       endif_stmt = ""
-                       if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
-                               ifdef_stmt = "#ifndef GL_GLES\n"
-                               endif_stmt = "\n#endif\n"
-
-                       counter = ifdef_stmt
-                       counter += "int %s_%s_counter = 1;\n" %(api_prefix, api_dic['api_name'])
-                       counter += "int %s_%s_counter = 1;\n" %(api_dic['api_name'], api_suffix)
-                       counter += endif_stmt
-
-                       LOG(counter)
-                       FWRITE(fp, counter)
-
-       # generate wrapper API
-       for api_dic in api_dic_list :
-
-               api_name = api_dic['api_name']
-               return_type = api_dic['return_type']
-               para_data = list_to_str(api_dic['para_list'])
-               api_type = api_dic['type']
 
-               if api_type == "EVAS" :
                        fp_src = gl_source_file
-                       fp_hdr = gl_header_file
-                       fp_link_src = gl_link_source_file
-                       fp_link_hdr = gl_link_header_file
-                       api_suffix = "thread_cmd"
-               elif api_type == "EVAS GL" :
-                       fp_src = evgl_source_file
-                       fp_hdr = evgl_header_file
-                       fp_link_src = evgl_link_source_file
-                       fp_link_hdr = evgl_link_header_file
-                       api_suffix = "evgl_thread_cmd"
-               elif api_type == "EVAS GL API" :
-                       fp_src = evgl_api_source_file
-                       fp_hdr = evgl_api_header_file
-                       api_suffix = "evgl_api_thread_cmd"
-
-               # check gl type,..
-               ifdef_stmt = ""
-               endif_stmt = ""
-               if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
-                       ifdef_stmt = "\n#ifndef GL_GLES\n"
-                       endif_stmt = "#endif\n"
+
+                       def_counter = define_counter(api_dic)
+                       LOG(def_counter)
+                       FWRITE(fp_src, def_counter)
+
+       ### generate *_gl_thread_{gl|evgl|evgl_api}_generated files >>>>
+       for api_dic in api_dic_list :
+
+               fp_src = gl_source_file
+               fp_hdr = gl_header_file
 
                ### ifndef,...
-               LOG(ifdef_stmt)
-               FWRITE(fp_src, ifdef_stmt)
+               LOG(ifdef_stmt(api_dic))
+               FWRITE(fp_src, ifdef_stmt(api_dic))
 
                ### API prototype (for debug)
                debug_msg = api_define_print(api_dic)
@@ -941,16 +919,10 @@ def generate_code(out_files) :
 
                ### data structure
                struct_data = gen_structure(api_dic)
-               LOG(struct_data)
                if len(struct_data) > 0 :
+                       LOG(struct_data)
                        FWRITE(fp_src, struct_data)
 
-               # define function pointer
-               if 'func_ptr' in api_dic :
-                       funcPtr_data = gen_function_pointer(api_dic)
-                       LOG(funcPtr_data)
-                       FWRITE(fp_src, funcPtr_data)
-
                # generate call-back function
                api_data = gen_gl_thread_api(api_dic)
                LOG(api_data)
@@ -962,122 +934,76 @@ def generate_code(out_files) :
                FWRITE(fp_src, api_data)
 
                ###  endif
-               LOG(endif_stmt)
-               FWRITE(fp_src, endif_stmt)
+               LOG(endif_stmt(api_dic))
+               FWRITE(fp_src, endif_stmt(api_dic))
 
                ### header
-               header_data = ifdef_stmt
-               header_data += gen_wrapper_api_header(api_dic)
-               header_data += endif_stmt
+               header_data = ifdef_stmt(api_dic)
+               header_data += gen_wrapper_api_header("GL_TH_FN", True, api_dic)
+               header_data += endif_stmt(api_dic)
 
                LOG(header_data)
                FWRITE(fp_hdr, header_data)
 
-               ### _link file
-               if api_type == "EVAS" or api_type == "EVAS GL" :
+       ### structure Evas_Gl_Thread_{GL|EVGL}_Generated_Func >>
+       FWRITE(gl_source_file, "\n\ntypedef struct\n{")
+
+       for api_dic in api_dic_list :
+
+               struct_member = function_pointer_structure("GL_TH_FN", True, api_dic)
+               LOG(struct_member)
+               FWRITE(gl_source_file, struct_member)
 
-                       LOG(ifdef_stmt)
-                       FWRITE(fp_link_src, ifdef_stmt)
+       FWRITE(gl_source_file, "\n} Evas_GL_Thread_GL_Generated_Func;\n\n")
 
-                       if 'func_ptr' in api_dic :
-                               fp_suffix = api_dic['func_ptr']
-                               set_func = "void (*%s_%s_set)(void *func) = NULL;\n" %(api_name, fp_suffix)
-                               get_func = "void *(*%s_%s_get)(void) = NULL;\n" %(api_name, fp_suffix)
-                               LOG(set_func + get_func)
-                               FWRITE(fp_link_src, set_func + get_func)
+       #### generate gl_generated_func_get() >>
+       FWRITE(gl_source_file, func_get_header("gl"))
 
-                               LOG(ifdef_stmt)
-                               FWRITE(fp_link_hdr, ifdef_stmt)
+       for api_dic in api_dic_list :
 
-                               set_func2 = "extern void (*%s_%s_set)(void *func);\n" %(api_name, fp_suffix)
-                               get_func2 = "extern void *(*%s_%s_get)(void);\n" %(api_name, fp_suffix)
-                               LOG(set_func2 + get_func2)
-                               FWRITE(fp_link_hdr, set_func2 + get_func2)
+               macro_data = function_pointer_assign("GL_TH_FN", True, api_dic)
+               LOG(macro_data)
+               FWRITE(gl_source_file, macro_data)
 
-                       func_ptr_data = "%s (*%s_%s)(%s) = NULL;\n" %(return_type, api_name,
-                                                                                                                 api_suffix, para_data)
-                       LOG(func_ptr_data)
-                       FWRITE(fp_link_src, func_ptr_data)
+       FWRITE(gl_source_file, func_get_tail("gl"))
 
-                       LOG(endif_stmt)
-                       FWRITE(fp_link_src, endif_stmt)
 
-                       # check gl types,...
-                       if not('func_ptr' in api_dic) and 'gl_type' in api_dic :
-                               LOG(ifdef_stmt)
-                               FWRITE(fp_link_hdr, ifdef_stmt)
+       ### generate *_gl_thread_{gl|evgl}_link_generated files >>>>
 
-                       extern_func_ptr_data = "extern %s (*%s_%s)(%s);\n" %(return_type, api_name,
-                                                                                                                                api_suffix, para_data)
-                       LOG(extern_func_ptr_data)
-                       FWRITE(fp_link_hdr, extern_func_ptr_data)
+       ## function pointer init. & extern
+       for api_dic in api_dic_list :
 
-                       LOG(endif_stmt)
-                       FWRITE(fp_link_hdr, endif_stmt)
+               func_init_data = function_pointer_init("GL_TH_FN", True, api_dic)
+               LOG(func_init_data)
+               FWRITE(gl_link_source_file, func_init_data)
 
-       #print "END OF LOOP2"
+               func_ptr_extern = function_pointer_extern("GL_TH_FN", True, api_dic)
+               LOG(func_ptr_extern)
+               FWRITE(gl_link_header_file, func_ptr_extern)
 
+       FWRITE(gl_link_header_file, init_function_extern("gl"))
 
-       ### init_symbol func. @_link file
-       if  g_evas_total > 0 :
-               init_func_data = gen_init_func_data("gl")
-               gl_link_source_file.write(init_func_data)
+       ### structure Evas_Gl_Thread_{GL|EVGL}_Generated_Func >>
+       FWRITE(gl_link_source_file, "\n\ntypedef struct\n{")
 
-               #print "LOOP3-1 START>>>"
-               symload_data = ""
-               for api_dic in api_dic_list :
-                       # check gl type,..
-                       ifdef_stmt = ""
-                       endif_stmt = ""
-                       if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
-                               ifdef_stmt = "\n#ifndef GL_GLES\n"
-                               endif_stmt = "\n#endif\n"
-
-                       if api_dic['type'] == "EVAS" :
-                               symload_data += _NEWLINE
-                               symload_data += ifdef_stmt
-                               if 'func_ptr' in api_dic :
-                                       symload_data += gen_symload_set_get(api_dic)
-
-                               symload_data += "LINK2GENERIC(%s_thread_cmd);" %(api_dic['api_name'])
-                               symload_data += endif_stmt
-               LOG(symload_data)
-               FWRITE(gl_link_source_file, symload_data)
-
-               #print "END OF LOOP3"
-               FWRITE(gl_link_source_file, "\n}")
-               FWRITE(gl_link_header_file, "\n\nextern void _gl_thread_link_gl_generated_init();\n")
-
-       if  g_evgl_total > 0 :
-               init_func_data = gen_init_func_data("evgl")
-               evgl_link_source_file.write(init_func_data)
-
-               #print "LOOP3-2 START>>>"
-               symload_data = ""
-               ifdef_stmt = ""
-               endif_stmt = ""
-               for api_dic in api_dic_list :
-                       # check gl type,..
-                       ifdef_stmt = ""
-                       endif_stmt = ""
-                       if 'gl_type' in api_dic and api_dic['gl_type'] == "GL" :
-                               ifdef_stmt = "\n#ifndef GL_GLES\n"
-                               endif_stmt = "\n#endif\n"
-
-                       if api_dic['type'] == "EVAS GL" :
-                               symload_data += ifdef_stmt
-                               symload_data += _NEWLINE
-                               if 'func_ptr' in api_dic :
-                                       symload_data += gen_symload_set_get(api_dic)
-
-                               symload_data += "LINK2GENERIC(%s_evgl_thread_cmd);" %(api_dic['api_name'])
-                               symload_data += endif_stmt
-               LOG(symload_data)
-               FWRITE(evgl_link_source_file, symload_data)
-
-               #print "END OF LOOP3"
-               FWRITE(evgl_link_source_file, "\n}")
-               FWRITE(evgl_link_header_file, "\n\nextern void _gl_thread_link_evgl_generated_init();\n")
+       for api_dic in api_dic_list :
+
+               struct_member = function_pointer_structure("GL_TH_FN", True, api_dic)
+               LOG(struct_member)
+               FWRITE(gl_link_source_file, struct_member)
+
+       FWRITE(gl_link_source_file, "\n} Evas_GL_Thread_GL_Generated_Func;\n\n")
+
+       #### generate _gl_thread_link_{gl|evgl}_generated_init() >>
+       FWRITE(gl_link_source_file, func_init_header("gl"))
+
+       for api_dic in api_dic_list :
+
+               macro_data = function_pointer_assign("GL_TH_FN", True, api_dic)
+               LOG(macro_data)
+               FWRITE(gl_link_source_file, macro_data)
+
+       FWRITE(gl_link_source_file, func_init_tail())
 
        for f in files :
                out_files[f].close()
@@ -1092,8 +1018,7 @@ def print_result(result):
        print "- enqueue: %d, flush: %d, finish: %d" %(result['enqueue'],
                                                         result['flush'], result['finish'])
        print "- extension API: %d" %(result['ext'])
-       print "- need Copy variable: %d, userDefinedCopy: %d" %(result['needCopy'],
-                                                                                                               result['needUserDefinedCopy'])
+       print "- need Copy variable: %d, userMacro: %d" %(result['needCopy'], result['needMacro'])
        print "- GL types : %d" %(result['gl'])
 
 #-----------------------------------------------------------#
@@ -1122,7 +1047,11 @@ if __name__ == '__main__':
                                                action='store_true',
                                                default=False,
                                                help='use ERR(), when debug level 1')
-
+       parser.add_argument('--no-indent',
+                                               dest='no_indent',
+                                               action='store_true',
+                                               default=False,
+                                               help='No indentation process to make faster')
        parser.add_argument('--deploy',
                                                dest='deploy',
                                                action='store_true',
@@ -1134,15 +1063,15 @@ if __name__ == '__main__':
                                                default=False)
        parser.add_argument('--version',
                                                action='version',
-                                               version='%(prog)s 1.98')
+                                               version='%(prog)s 2.02')
 
        args = parser.parse_args()
        g_verbose = args.verbose
        g_debug_lvl = args.debug_level
        g_print_err = args.print_err
-       g_evas_total = 0
+       g_no_indent = args.no_indent
+       g_internal_total = 0
        g_evgl_total = 0
-       g_evgl_api_total = 0
 
        # parsing data file
        result = get_api_def(args.input_data)
@@ -1151,21 +1080,18 @@ if __name__ == '__main__':
        res_evgl = result[1]
        res_evgl_api = result[2]
 
-       g_evas_total = res_evas['success'] + res_evas['fail']
+       g_internal_total = res_evas['success'] + res_evas['fail']
        g_evgl_total = res_evgl['success'] + res_evgl['fail']
-       g_evgl_api_total = res_evgl_api['success'] + res_evgl_api['fail']
 
-       
-       print "[EVAS:%d]" %(g_evas_total)
-       if g_evas_total > 0 : print_result(res_evas)
+
+       # parsing result >>>
+       print "[INTERNAL:%d]" %(g_internal_total)
+       if g_internal_total > 0 : print_result(res_evas)
 
        print "[EVAS GL:%d]" %(g_evgl_total)
        if g_evgl_total > 0 : print_result(res_evgl)
 
-       print "[EVAS GL API:%d]" %(g_evgl_api_total)
-       if g_evgl_api_total > 0 : print_result(res_evgl_api)
-
-       print "* Total APIs: %d" %(g_evas_total + g_evgl_total + g_evgl_api_total)
+       print "* Total APIs: %d" %(g_internal_total + g_evgl_total)
 
        # generate files
        gen_files = generate_files(args.out_file_name)
@@ -1177,13 +1103,14 @@ if __name__ == '__main__':
        for f in gen_files :
                print f
 
-
        #eflindent
-       indent = """vim -c "set ts=8" -c "set sw=3" -c "set sts=3" -c "set expandtab" """
-       indent += """ -c "set cino=>5n-3f0^-2{2(0W1st0" -c "normal gg=G" -c "wq" """
-       for f in gen_files :
-               os.system(indent + f)
-       print "* eflindent done"
+       if args.no_indent == False :
+               indent = """vim -c "set ts=8" -c "set sw=3" -c "set sts=3" -c "set expandtab" """
+               indent += """ -c "set cino=>5n-3f0^-2{2(0W1st0" -c "normal gg=G" -c "wq" """
+               for f in gen_files :
+                       os.system(indent + f)
+
+               print "* eflindent done"
 
        if args.deploy is True:
                command = "cp %s*_generated.[ch] " %(args.out_file_name)
index 8a81cc4..d617ec6 100644 (file)
-################################################################################
+####################################################################################
 # GL API Data for generate wrapper API
-################################################################################
-# API definition data file format: (Requires at lease 8 columns)
-# 1.| {EVAS |EVAS GL |EVAS GL API} | : Wrapper API types
-# 2.| {return type} |
-# 3.| {api name} |
-# 4.| {paramter1, 2,..} | : parameter type and name (NOTE: it will be used as defined)
-# 5.| {enqueue|flush|finish} | : queue operation
-# 6.| {ext|noext} | : extension API or not
-# 7.| {memory pool name, size, value| userDefined | ""} | : if you need to copy variable
-# 8.| {GL| GLES} | ""} | : GL types
-################################################################################
-####################################################
-#
-# EVAS
-#
-####################################################
-# Errors
-| EVAS | GLenum | glGetError | void | finish | noext | | | |
+####################################################################################
+# API definition data file format: (Requires at lease 10 columns)
+#  1.| {INTERNAL|EVAS GL} | : wrapper API types.
+#                             INTERNAL not exported to EvasGL, used by Evas engine.
+#  2.| {return type} |
+#  3.| {api name} | : wrapper api naming rule as below,
+#                     if api type is "EVAS"       , evas_{api name}_th
+#                     if api type is "EVAS GL"    , evas_{api name}_evgl_th
+#                     if api type is "EVAS GL API", evas_{api name}_evgl_api_th
+#  4.| {paramter1, 2,..} |  : parameter type and name (use ',' to separate)
+
+#                            (NOTE: it will be used as defined)
+#  5.| {enqueue|flush|finish} | : thread mode
+#  6.| {ext|noext} | : extension API or not
+#  7.| {memory pool name, size, value | ""} | : if you need to copy variable
+#  8.| {GL| GLES} | ""} | : GL types
+#  9.| { "NeedMacro" | "" } | : generate macro at each code block.
+#                              if you need own code, descript the code at macro.
+#                 (NOTE: flush and enquene only)
+# 10~14. | | | | | : filler
+####################################################################################
 
-# Vertex Arrays
-## Vertex Array
-| EVAS | void | glVertexAttribPointer | GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const void *pointer | finish | noext | | |
-| EVAS | void | glEnableVertexAttribArray | GLuint index | finish | noext | | |
-| EVAS | void | glDisableVertexAttribArray | GLuint index | finish | noext | | |
-
-## Drawing
-| EVAS | void | glDrawArrays | GLenum mode,GLint first,GLsizei count | finish | noext | | |
-| EVAS | void | glDrawElements | GLenum mode,GLsizei count,GLenum type,const void *indices | finish | noext | | |
-
-# Buffer Objects
-| EVAS | void | glGenBuffers | GLsizei n,GLuint *buffers | finish | noext | | |
-| EVAS | void | glDeleteBuffers | GLsizei n,const GLuint *buffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), buffers | |
-| EVAS | void | glBindBuffer | GLenum target,GLuint buffer | finish | noext | | |
-| EVAS | void | glBufferData | GLenum target,GLsizeiptr size,const void *data,GLenum usage | finish | noext | | |
-| EVAS | void * | glMapBuffer | GLenum target,GLenum access | finish | ext | | |
-| EVAS | GLboolean | glUnmapBuffer | GLenum target | finish | ext | | |
-
-# Vertex Shaders
-## Shader Objects
-| EVAS | GLuint | glCreateShader | GLenum type | finish | noext | | |
-| EVAS | void | glShaderSource | GLuint shader,GLsizei count,const GLchar **string,const GLint *length | flush | noext | userDefined | |
-| EVAS | void | glCompileShader | GLuint shader | flush | noext | | |
-| EVAS | void | glReleaseShaderCompiler | void | flush | ext | | |
-| EVAS | void | glDeleteShader | GLuint shader | flush | noext | | |
-
-## Program Objects
-| EVAS | GLuint | glCreateProgram | void | finish | noext | | |
-| EVAS | void | glAttachShader | GLuint program,GLuint shader | flush | noext | | |
-| EVAS | void | glDetachShader | GLuint program,GLuint shader | flush | noext | | |
-| EVAS | void | glLinkProgram | GLuint program | flush | noext | | |
-| EVAS | void | glUseProgram | GLuint program | flush | noext | | |
-| EVAS | void | glProgramParameteri | GLuint program,GLenum pname,GLint value | flush | ext | | |
-| EVAS | void | glDeleteProgram | GLuint program | flush | noext | | |
-
-## Program Binaries
-| EVAS | void | glGetProgramBinary | GLuint program,GLsizei bufSize,GLsizei *length,GLenum *binaryFormat,void *binary | finish | ext | | |
-| EVAS | void | glProgramBinary | GLuint program,GLenum binaryFormat,const void *binary,GLint length | flush | ext | _mp_default, length, binary | |
-
-## Vertex Attributes
-| EVAS | void | glGetActiveAttrib | GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name | finish | noext | | |
-| EVAS | GLint | glGetAttribLocation | GLuint program,const GLchar *name | finish | noext | | |
-| EVAS | void | glBindAttribLocation | GLuint program,GLuint index,const GLchar *name | finish | noext | _mp_default, strlen(name), name | |
-
-
-## Uniform Variables
-| EVAS | GLint | glGetUniformLocation | GLuint program,const GLchar *name | finish | noext | | |
-| EVAS | void | glUniform1f | GLint location,GLfloat v0 | flush | noext | | |
-| EVAS | void | glUniform1i | GLint location,GLint v0 | flush | noext | | |
-| EVAS | void | glUniform2f | GLint location,GLfloat v0, GLfloat v1 | flush | noext | | |
-| EVAS | void | glUniform2i | GLint location,GLint v0, GLint v1 | flush | noext | | |
-| EVAS | void | glUniform3f | GLint location,GLfloat v0,GLfloat v1,GLfloat v2 | flush | noext | | |
-| EVAS | void | glUniform3i | GLint location,GLint v0, GLint v1, GLint v2 | flush | noext | | |
-| EVAS | void | glUniform4f | GLint location,GLfloat v0,GLfloat v1,GLfloat v2,GLfloat v3 | flush | noext | | |
-| EVAS | void | glUniform4i | GLint location,GLint v0, GLint v1, GLint v2, GLint v3 | flush | noext | | |
-| EVAS | void | glUniform1fv | GLint location,GLsizei count, const GLfloat *value | flush | noext | _mp_uniform, 1 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniform1iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 1 * count * sizeof(GLint), value | |
-| EVAS | void | glUniform2fv | GLint location,GLsizei count,const GLfloat *value | flush | noext | _mp_uniform, 2 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniform2iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 2 * count * sizeof(GLint), value | |
-| EVAS | void | glUniform3fv | GLint location,GLsizei count, const GLfloat *value | flush | noext | _mp_uniform, 3 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniform3iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 3 * count * sizeof(GLint), value | |
-| EVAS | void | glUniform4fv | GLint location,GLsizei count,const GLfloat *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniform4iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLint), value | |
-| EVAS | void | glUniformMatrix2fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniformMatrix3fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 9 * count * sizeof(GLfloat), value | |
-| EVAS | void | glUniformMatrix4fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 16 * count * sizeof(GLfloat),value | |
-
-
-# Viewport
-| EVAS | void | glViewport | GLint x,GLint y,GLsizei width,GLsizei height | flush | noext | | |
-
-# Enable/Disable
-| EVAS | void | glEnable | GLenum cap | enqueue | noext | | |
-| EVAS | void | glDisable | GLenum cap | enqueue | noext | | |
-
-# Line segments
-| EVAS | void | glLineWidth | GLfloat width | flush | noext | | |
-
-# Polygon
-| EVAS | void | glPolygonOffset | GLfloat factor,GLfloat units | flush | noext | | |
-
-# Pixel Rectangles
-| EVAS | void | glPixelStorei | GLenum pname,GLint param | flush | noext | | |
-
-
-# Texturing
-| EVAS | void | glActiveTexture | GLenum texture | finish | noext | | |
-
-# Texture Objects
-| EVAS | void | glGenTextures | GLsizei n,GLuint *textures | finish | noext | | |
-| EVAS | void | glBindTexture | GLenum target,GLuint texture | flush | noext | | |
-| EVAS | void | glDeleteTextures | GLsizei n,const GLuint *textures | flush | noext | _mp_delete_object, n * sizeof(GLuint), textures | |
-
-
-# Texture Image Specification
-| EVAS | void | glTexImage2D | GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const void *pixels | flush | noext | userDefined | |
-| EVAS | void | glTexSubImage2D | GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLenum type,const void *pixels | flush | noext |  userDefined | |
-
-# Compressed Texture Images
-| EVAS | void | glCompressedTexImage2D | GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const void *data | flush | noext | userDefined | |
-| EVAS | void | glCompressedTexSubImage2D | GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLsizei imageSize,const void *data | flush | noext | userDefined | |
-
-
-# Texture parameters
-| EVAS | void | glTexParameterf | GLenum target,GLenum pname,GLfloat param | flush | noext | | |
-| EVAS | void | glTexParameterfv | GLenum target, GLenum pname, const GLfloat *params | flush | noext | _mp_default, sizeof(GLfloat), params | |
-| EVAS | void | glTexParameteri | GLenum target,GLenum pname,GLint param | flush | noext | | |
-| EVAS | void | glTexParameteriv | GLenum target, GLenum pname, const GLint *params | flush | noext | _mp_default, sizeof(GLint), params | |
-
-# Scissor Test
-| EVAS | void | glScissor | GLint x,GLint y,GLsizei width,GLsizei height | flush | noext | | |
-
-## Blending
-| EVAS | void | glBlendFunc | GLenum sfactor,GLenum dfactor | flush | noext | | |
-| EVAS | void | glBlendColor | GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha | flush | noext | | |
-
-
-# Fine Control of Buffer Updates
-| EVAS | void | glDepthMask | GLboolean flag | flush | noext | | |
-
-# Clearing the Buffers
-| EVAS | void | glClear | GLbitfield mask | flush | noext | | |
-| EVAS | void | glClearColor | GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha | flush | noext | | |
-
-# Reading and Copying Pixels
-| EVAS | void | glReadPixels | GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,void *pixels | finish | noext | | |
-
-# Binding & Managing Framebuffer Objects
-| EVAS | void | glGenFramebuffers | GLsizei n,GLuint *framebuffers | finish | ext | | |
-| EVAS | void | glBindFramebuffer | GLenum target,GLuint framebuffer | flush | ext | | |
-| EVAS | void | glDeleteFramebuffers | GLsizei n,const GLuint *framebuffers | flush | ext | _mp_delete_object, n * sizeof(GLuint), framebuffers | |
-
-# Renderbuffer Objects
-| EVAS | void | glGenRenderbuffers | GLsizei n,GLuint *renderbuffers | finish | noext | | |
-| EVAS | void | glBindRenderbuffer | GLenum target,GLuint renderbuffer | flush | noext | | |
-| EVAS | void | glDeleteRenderbuffers | GLsizei n,const GLuint *renderbuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), renderbuffers | |
-| EVAS | void | glRenderbufferStorage | GLenum target,GLenum internalformat,GLsizei width,GLsizei height | flush | noext | | |
-
-# Attaching Renderbuffer Images to Framebuffer
-| EVAS | void | glFramebufferRenderbuffer | GLenum target,GLenum attachment,GLenum renderbuffertarget,GLuint renderbuffer | flush | noext | | |
-
-# Attaching Texture Images to a Framebuffer
-| EVAS | void | glFramebufferTexture2D | GLenum target,GLenum attachment,GLenum textarget,GLuint texture,GLint level | flush | ext | | |
-| EVAS | void | glFramebufferTexture2DMultisample | GLenum target,GLenum attachment,GLenum textarget,GLuint texture,GLint level,GLsizei samples | flush | ext | | |
-
-# Framebuffer Completeness
-| EVAS | GLenum | glCheckFramebufferStatus | GLenum target | finish | noext | | |
-
-
-# Special Functions
-| EVAS | void | glFlush | void | finish | noext | | |
-| EVAS | void | glFinish | void | finish | noext | | |
-| EVAS | void | glHint | GLenum target,GLenum mode | flush | noext | | |
-
-
-# State and State Requests
-| EVAS | const GLubyte * | glGetString | GLenum name | finish | noext | | |
-| EVAS | void | glGetBooleanv | GLenum pname,GLboolean *data | finish | noext | | |
-| EVAS | void | glGetFloatv | GLenum pname,GLfloat *data | finish | noext | | |
-| EVAS | void | glGetIntegerv | GLenum pname,GLint *data | finish | noext | | |
-
-# Buffer Queries
-| EVAS | GLboolean | glIsBuffer | GLint buffer | finish | noext | | |
-| EVAS | void | glGetBufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-
-# Shader and Program Queries
-| EVAS | GLboolean | glIsShader | GLuint shader | finish | noext | | |
-| EVAS | void | glGetShaderiv | GLuint shader,GLenum pname,GLint *params | finish | noext | | |
-| EVAS | void | glGetAttachedShaders | GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders | finish | noext | | |
-| EVAS | void | glGetShaderInfoLog | GLuint shader,GLsizei bufSize,GLsizei *length,GLchar *infoLog | finish | noext | | |
-| EVAS | void | glGetShaderSource | GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source | finish | noext | | |
-| EVAS | void | glGetShaderPrecisionFormat | GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision | finish | noext | | |
-| EVAS | void | glGetVertexAttribfv | GLuint index, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS | void | glGetVertexAttribiv | GLuint index, GLenum pname, GLint *params | finish | noext | | |
-| EVAS | GLboolean | glIsProgram | GLuint program | finish | noext | | |
-| EVAS | void | glGetProgramInfoLog | GLuint program,GLsizei bufSize,GLsizei *length,GLchar *infoLog | finish | noext | | |
-| EVAS | void | glGetProgramiv | GLuint program,GLenum pname,GLint *params | finish | noext | | |
-
-
-# Framebuffer Objects Queries
-| EVAS | GLboolean | glIsFramebuffer | GLint framebuffer | finish | noext | | |
-| EVAS | void | glGetFramebufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | ext | | |
-
-# Renderbuffer Object Queries
-| EVAS | GLboolean | glIsRenderbuffer | GLint renderbuffer | finish | noext | | |
-| EVAS | void | glGetRenderbufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-
-# Texture Queries
-| EVAS | GLboolean | glIsTexture | GLint texture | finish | noext | | |
-
-# Tiling
-| EVAS | void | glStartTiling | GLuint a,GLuint b,GLuint c,GLuint d,GLuint e | flush | ext | | |
-| EVAS | void | glEndTiling | GLuint a | flush | ext | | |
-| EVAS | void | glActivateTile | GLuint a,GLuint b,GLuint c,GLuint d,GLuint e | flush | ext | | |
-
-# EGLImage
-| EVAS | void | glEGLImageTargetTexture2DOES | GLenum target,void *image | finish | ext | | |
-
-# GL
-| EVAS | void | glAlphaFunc | GLenum func,GLclampf ref | flush | noext | | GL |
-| EVAS | void | glGetTexLevelParameteriv | GLenum target,GLint level,GLenum pname,GLint *params | finish | noext | | GL |
-| EVAS | void | glRenderbufferStorageMultisample | GLenum target,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height | finish | ext | | GL |
-
-# GLES3
-| EVAS | const GLubyte * | glGetStringi | GLenum name,GLuint index | finish | ext | | |
-
-####################################################
-#
-# EVAS GL
-#
-####################################################
-# Errors
-| EVAS GL | GLenum | glGetError | void | finish | noext | | | |
-
-# Vertex Arrays
-## Vertex Array
-| EVAS GL | void | glVertexAttribPointer | GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const void *pointer | finish | noext | | |
-| EVAS GL | void | glEnableVertexAttribArray | GLuint index | finish | noext | | |
-| EVAS GL | void | glDisableVertexAttribArray | GLuint index | finish | noext | | |
-
-## Drawing
-| EVAS GL | void | glDrawArrays | GLenum mode,GLint first,GLsizei count | finish | noext | | |
-| EVAS GL | void | glDrawElements | GLenum mode,GLsizei count,GLenum type,const void *indices | finish | noext | | |
-
-# Buffer Objects
-| EVAS GL | void | glGenBuffers | GLsizei n,GLuint *buffers | finish | noext | | |
-| EVAS GL | void | glDeleteBuffers | GLsizei n,const GLuint *buffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), buffers | |
-| EVAS GL | void | glBindBuffer | GLenum target,GLuint buffer | finish | noext | | |
-| EVAS GL | void | glBufferData | GLenum target,GLsizeiptr size,const void *data,GLenum usage | finish | noext | | |
-
-# Vertex Shaders
-## Shader Objects
-| EVAS GL | GLuint | glCreateShader | GLenum type | finish | noext | | |
-| EVAS GL | void | glShaderSource | GLuint shader,GLsizei count,const GLchar **string,const GLint *length | flush | noext | userDefined | |
-| EVAS GL | void | glCompileShader | GLuint shader | flush | noext | | |
-| EVAS GL | void | glDeleteShader | GLuint shader | flush | noext | | |
-
-## Program Objects
-| EVAS GL | GLuint | glCreateProgram | void | finish | noext | | |
-| EVAS GL | void | glAttachShader | GLuint program,GLuint shader | flush | noext | | |
-| EVAS GL | void | glDetachShader | GLuint program,GLuint shader | flush | noext | | |
-| EVAS GL | void | glLinkProgram | GLuint program | flush | noext | | |
-| EVAS GL | void | glUseProgram | GLuint program | flush | noext | | |
-| EVAS GL | void | glDeleteProgram | GLuint program | flush | noext | | |
-
-## Program Binaries
-| EVAS GL | void | glGetProgramBinary | GLuint program,GLsizei bufSize,GLsizei *length,GLenum *binaryFormat,void *binary | finish | ext | | |
-| EVAS GL | void | glProgramBinary | GLuint program,GLenum binaryFormat,const void *binary,GLint length | flush | ext | _mp_default, length, binary | |
-
-## Vertex Attributes
-| EVAS GL | void | glGetActiveAttrib | GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name | finish | noext | | |
-| EVAS GL | GLint | glGetAttribLocation | GLuint program,const GLchar *name | finish | noext | | |
-| EVAS GL | void | glBindAttribLocation | GLuint program,GLuint index,const GLchar *name | finish | noext | _mp_default, strlen(name), name | |
-
-
-## Uniform Variables
-| EVAS GL | GLint | glGetUniformLocation | GLuint program,const GLchar *name | finish | noext | | |
-| EVAS GL | void | glUniform1f | GLint location,GLfloat v0 | flush | noext | | |
-| EVAS GL | void | glUniform1i | GLint location,GLint v0 | flush | noext | | |
-| EVAS GL | void | glUniform2f | GLint location,GLfloat v0, GLfloat v1 | flush | noext | | |
-| EVAS GL | void | glUniform2i | GLint location,GLint v0, GLint v1 | flush | noext | | |
-| EVAS GL | void | glUniform3f | GLint location,GLfloat v0,GLfloat v1,GLfloat v2 | flush | noext | | |
-| EVAS GL | void | glUniform3i | GLint location,GLint v0, GLint v1, GLint v2 | flush | noext | | |
-| EVAS GL | void | glUniform4f | GLint location,GLfloat v0,GLfloat v1,GLfloat v2,GLfloat v3 | flush | noext | | |
-| EVAS GL | void | glUniform4i | GLint location,GLint v0, GLint v1, GLint v2, GLint v3 | flush | noext | | |
-| EVAS GL | void | glUniform1fv | GLint location,GLsizei count, const GLfloat *value | flush | noext | _mp_uniform, 1 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniform1iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 1 * count * sizeof(GLint), value | |
-| EVAS GL | void | glUniform2fv | GLint location,GLsizei count,const GLfloat *value | flush | noext | _mp_uniform, 2 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniform2iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 2 * count * sizeof(GLint), value | |
-| EVAS GL | void | glUniform3fv | GLint location,GLsizei count, const GLfloat *value | flush | noext | _mp_uniform, 3 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniform3iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 3 * count * sizeof(GLint), value | |
-| EVAS GL | void | glUniform4fv | GLint location,GLsizei count,const GLfloat *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniform4iv | GLint location,GLsizei count, const GLint *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLint), value | |
-| EVAS GL | void | glUniformMatrix2fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniformMatrix3fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 9 * count * sizeof(GLfloat), value | |
-| EVAS GL | void | glUniformMatrix4fv | GLint location,GLsizei count,GLboolean transpose,const GLfloat *value | flush | noext | _mp_uniform, 16 * count * sizeof(GLfloat),value | |
-
-
-# Viewport
-| EVAS GL | void | glViewport | GLint x,GLint y,GLsizei width,GLsizei height | flush | noext | | |
-
-# Enable/Disable
-| EVAS GL | void | glEnable | GLenum cap | flush | noext | | |
-| EVAS GL | void | glDisable | GLenum cap | flush | noext | | |
-
-# Line segments
-| EVAS GL | void | glLineWidth | GLfloat width | flush | noext | | |
-
-# Polygon
-| EVAS GL | void | glPolygonOffset | GLfloat factor,GLfloat units | flush | noext | | |
-
-# Pixel Rectangles
-| EVAS GL | void | glPixelStorei | GLenum pname,GLint param | flush | noext | | |
-
-
-# Texturing
-| EVAS GL | void | glActiveTexture | GLenum texture | finish | noext | | |
-
-# Texture Objects
-| EVAS GL | void | glGenTextures | GLsizei n,GLuint *textures | finish | noext | | |
-| EVAS GL | void | glBindTexture | GLenum target,GLuint texture | flush | noext | | |
-| EVAS GL | void | glDeleteTextures | GLsizei n,const GLuint *textures | flush | noext | _mp_delete_object, n * sizeof(GLuint), textures | |
-
-
-# Texture Image Specification
-| EVAS GL | void | glTexImage2D | GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const void *pixels | flush | noext | userDefined | |
-| EVAS GL | void | glTexSubImage2D | GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLenum type,const void *pixels | flush | noext |  userDefined | |
-
-# Compressed Texture Images
-| EVAS GL | void | glCompressedTexImage2D | GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const void *data | flush | noext | userDefined | |
-| EVAS GL | void | glCompressedTexSubImage2D | GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLsizei imageSize,const void *data | flush | noext | userDefined | |
-
-
-# Texture parameters
-| EVAS GL | void | glTexParameterf | GLenum target,GLenum pname,GLfloat param | flush | noext | | |
-| EVAS GL | void | glTexParameterfv | GLenum target, GLenum pname, const GLfloat *params | flush | noext | _mp_default, sizeof(GLfloat), params | |
-| EVAS GL | void | glTexParameteri | GLenum target,GLenum pname,GLint param | flush | noext | | |
-| EVAS GL | void | glTexParameteriv | GLenum target, GLenum pname, const GLint *params | flush | noext | _mp_default, sizeof(GLint), params | |
-
-# Scissor Test
-| EVAS GL | void | glScissor | GLint x,GLint y,GLsizei width,GLsizei height | flush | noext | | |
-
-## Blending
-| EVAS GL | void | glBlendFunc | GLenum sfactor,GLenum dfactor | flush | noext | | |
-| EVAS GL | void | glBlendColor | GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha | flush | noext | | |
-
-
-# Fine Control of Buffer Updates
-| EVAS GL | void | glDepthMask | GLboolean flag | flush | noext | | |
-
-# Clearing the Buffers
-| EVAS GL | void | glClear | GLbitfield mask | flush | noext | | |
-| EVAS GL | void | glClearColor | GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha | flush | noext | | |
-
-# Reading and Copying Pixels
-| EVAS GL | void | glReadPixels | GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,void *pixels | finish | noext | | |
-
-# Binding & Managing Framebuffer Objects (GLES2_XX)
-| EVAS GL | void | glGenFramebuffers | GLsizei n,GLuint *framebuffers | finish | noext | | |
-| EVAS GL | void | glBindFramebuffer | GLenum target,GLuint framebuffer | flush | noext | | |
-| EVAS GL | void | glDeleteFramebuffers | GLsizei n,const GLuint *framebuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), framebuffers | |
-| EVAS GL | void | glGetFramebufferAttachmentParameteriv | GLenum target, GLenum attachment, GLenum pname, GLint *params | finish | noext | | |
-
-# Renderbuffer Objects
-| EVAS GL | void | glGenRenderbuffers | GLsizei n,GLuint *renderbuffers | finish | noext | | |
-| EVAS GL | void | glBindRenderbuffer | GLenum target,GLuint renderbuffer | flush | noext | | |
-| EVAS GL | void | glDeleteRenderbuffers | GLsizei n,const GLuint *renderbuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), renderbuffers | |
-| EVAS GL | void | glRenderbufferStorage | GLenum target,GLenum internalformat,GLsizei width,GLsizei height | flush | noext | | |
-
-# Attaching Renderbuffer Images to Framebuffer
-| EVAS GL | void | glFramebufferRenderbuffer | GLenum target,GLenum attachment,GLenum renderbuffertarget,GLuint renderbuffer | flush | noext | | |
-
-# Attaching Texture Images to a Framebuffer (GLES2_XX)
-| EVAS GL | void | glFramebufferTexture2D | GLenum target,GLenum attachment,GLenum textarget,GLuint texture,GLint level | flush | noext | | |
-# Framebuffer Completeness (GLES2_XX)
-| EVAS GL | GLenum | glCheckFramebufferStatus | GLenum target | finish | noext | | |
-
-
-# Special Functions
-| EVAS GL | void | glFlush | void | finish | noext | | |
-| EVAS GL | void | glFinish | void | finish | noext | | |
-| EVAS GL | void | glHint | GLenum target,GLenum mode | flush | noext | | |
-
-
-# State and State Requests
-| EVAS GL | const GLubyte * | glGetString | GLenum name | finish | noext | | |
-| EVAS GL | void | glGetBooleanv | GLenum pname,GLboolean *data | finish | noext | | |
-| EVAS GL | void | glGetFloatv | GLenum pname,GLfloat *data | finish | noext | | |
-| EVAS GL | void | glGetIntegerv | GLenum pname,GLint *data | finish | noext | | |
-
-# Buffer Queries
-| EVAS GL | GLboolean | glIsBuffer | GLint buffer | finish | noext | | |
-| EVAS GL | void | glGetBufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-
-# Shader and Program Queries
-| EVAS GL | GLboolean | glIsShader | GLuint shader | finish | noext | | |
-| EVAS GL | void | glGetShaderiv | GLuint shader,GLenum pname,GLint *params | finish | noext | | |
-| EVAS GL | void | glGetAttachedShaders | GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders | finish | noext | | |
-| EVAS GL | void | glGetShaderInfoLog | GLuint shader,GLsizei bufSize,GLsizei *length,GLchar *infoLog | finish | noext | | |
-| EVAS GL | void | glGetShaderSource | GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source | finish | noext | | |
-| EVAS GL | void | glGetShaderPrecisionFormat | GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision | finish | noext | | |
-| EVAS GL | void | glGetVertexAttribfv | GLuint index, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL | void | glGetVertexAttribiv | GLuint index, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL | GLboolean | glIsProgram | GLuint program | finish | noext | | |
-| EVAS GL | void | glGetProgramInfoLog | GLuint program,GLsizei bufSize,GLsizei *length,GLchar *infoLog | finish | noext | | |
-| EVAS GL | void | glGetProgramiv | GLuint program,GLenum pname,GLint *params | finish | noext | | |
-
-
-# Framebuffer Objects Queries
-| EVAS GL | GLboolean | glIsFramebuffer | GLint framebuffer | finish | noext | | |
-
-# Renderbuffer Object Queries
-| EVAS GL | GLboolean | glIsRenderbuffer | GLint renderbuffer | finish | noext | | |
-| EVAS GL | void | glGetRenderbufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-
-# Texture Queries
-| EVAS GL | GLboolean | glIsTexture | GLint texture | finish | noext | | |
-
-##################################################
-#
-# Evas GL APIs
-#
-##################################################
 # OpenGL-ES 2.0
-| EVAS GL API | void | glActiveTexture | GLenum texture | finish | noext | | |
-| EVAS GL API | void | glAttachShader | GLuint program, GLuint shader | flush | noext | | |
-| EVAS GL API | void | glBindAttribLocation | GLuint program, GLuint index, const char* name | finish | noext | _mp_default, strlen(name), name | |
-| EVAS GL API | void | glBindBuffer | GLenum target, GLuint buffer | finish | noext | | |
-| EVAS GL API | void | glBindFramebuffer | GLenum target, GLuint framebuffer | flush | noext | | |
-| EVAS GL API | void | glBindRenderbuffer | GLenum target, GLuint renderbuffer | flush | noext | | |
-| EVAS GL API | void | glBindTexture | GLenum target, GLuint texture | flush | noext | | |
-| EVAS GL API | void | glBlendColor | GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha | flush | noext | | |
-| EVAS GL API | void | glBlendEquation |  GLenum mode  | flush | noext | | |
-| EVAS GL API | void | glBlendEquationSeparate | GLenum modeRGB, GLenum modeAlpha | flush | noext | | |
-| EVAS GL API | void | glBlendFunc | GLenum sfactor, GLenum dfactor | flush | noext | | |
-| EVAS GL API | void | glBlendFuncSeparate | GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | flush | noext | | |
-| EVAS GL API | void | glBufferData | GLenum target, GLsizeiptr size, const void* data, GLenum usage | finish | noext | | |
-| EVAS GL API | void | glBufferSubData | GLenum target, GLintptr offset, GLsizeiptr size, const void* data | finish | noext | | |
-| EVAS GL API | GLenum | glCheckFramebufferStatus | GLenum target | finish | noext | | |
-| EVAS GL API | void | glClear | GLbitfield mask | finish | noext | | |
-| EVAS GL API | void | glClearColor | GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha | finish | noext | | |
-| EVAS GL API | void | glClearDepthf | GLclampf depth | finish | noext | | |
-| EVAS GL API | void | glClearStencil | GLint s | finish | noext | | |
-| EVAS GL API | void | glColorMask | GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha | finish | noext | | |
-| EVAS GL API | void | glCompileShader | GLuint shader | flush | noext | | |
-| EVAS GL API | void | glCompressedTexImage2D | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data | flush | noext | userDefined | |
-| EVAS GL API | void | glCompressedTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data | flush | noext | userDefined | |
-| EVAS GL API | void | glCopyTexImage2D | GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border | finish | noext | | |
-| EVAS GL API | void | glCopyTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | GLuint | glCreateProgram | void | finish | noext | | |
-| EVAS GL API | GLuint | glCreateShader | GLenum type | finish | noext | | |
-| EVAS GL API | void | glCullFace | GLenum mode | finish | noext | | |
-| EVAS GL API | void | glDeleteBuffers | GLsizei n, const GLuint* buffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), buffers | |
-| EVAS GL API | void | glDeleteFramebuffers | GLsizei n, const GLuint* framebuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), framebuffers | |
-| EVAS GL API | void | glDeleteProgram | GLuint program | finish | noext | | |
-| EVAS GL API | void | glDeleteRenderbuffers | GLsizei n, const GLuint* renderbuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), renderbuffers | |
-| EVAS GL API | void | glDeleteShader | GLuint shader | flush | noext | | |
-| EVAS GL API | void | glDeleteTextures | GLsizei n, const GLuint* textures | flush | noext | _mp_delete_object, n * sizeof(GLuint), textures | |
-| EVAS GL API | void | glDepthFunc | GLenum func | finish | noext | | |
-| EVAS GL API | void | glDepthMask | GLboolean flag | flush | noext | | |
-| EVAS GL API | void | glDepthRangef | GLclampf zNear, GLclampf zFar | finish | noext | | |
-| EVAS GL API | void | glDetachShader | GLuint program, GLuint shader | flush | noext | | |
-| EVAS GL API | void | glDisable | GLenum cap | flush | noext | | |
-| EVAS GL API | void | glDisableVertexAttribArray | GLuint index | finish | noext | | |
-| EVAS GL API | void | glDrawArrays | GLenum mode, GLint first, GLsizei count | finish | noext | | |
-| EVAS GL API | void | glDrawElements | GLenum mode, GLsizei count, GLenum type, const void* indices | finish | noext | | |
-| EVAS GL API | void | glEnable | GLenum cap | flush | noext | | |
-| EVAS GL API | void | glEnableVertexAttribArray | GLuint index | finish | noext | | |
-| EVAS GL API | void | glFinish | void | finish | noext | | |
-| EVAS GL API | void | glFlush | void | finish | noext | | |
-| EVAS GL API | void | glFramebufferRenderbuffer | GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer | flush | noext | | |
-| EVAS GL API | void | glFramebufferTexture2D | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level | flush | noext | | |
-| EVAS GL API | void | glFrontFace | GLenum mode | finish | noext | | |
-| EVAS GL API | void | glGenBuffers | GLsizei n, GLuint* buffers | finish | noext | | |
-| EVAS GL API | void | glGenerateMipmap | GLenum target | finish | noext | | |
-| EVAS GL API | void | glGenFramebuffers | GLsizei n, GLuint* framebuffers | finish | noext | | |
-| EVAS GL API | void | glGenRenderbuffers | GLsizei n, GLuint* renderbuffers | finish | noext | | |
-| EVAS GL API | void | glGenTextures | GLsizei n, GLuint* textures | finish | noext | | |
-| EVAS GL API | void | glGetActiveAttrib | GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name | finish | noext | | |
-| EVAS GL API | void | glGetActiveUniform | GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name | finish | noext | | |
-| EVAS GL API | void | glGetAttachedShaders | GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders | finish | noext | | |
-| EVAS GL API | int  | glGetAttribLocation | GLuint program, const char* name | finish | noext | | |
-| EVAS GL API | void | glGetBooleanv | GLenum pname, GLboolean* params | finish | noext | | |
-| EVAS GL API | void | glGetBufferParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | GLenum | glGetError | void | finish | noext | | |
-| EVAS GL API | void | glGetFloatv | GLenum pname, GLfloat* params | finish | noext | | |
-| EVAS GL API | void | glGetFramebufferAttachmentParameteriv | GLenum target, GLenum attachment, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetIntegerv | GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetProgramiv | GLuint program, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetProgramInfoLog | GLuint program, GLsizei bufsize, GLsizei* length, char* infolog | finish | noext | | |
-| EVAS GL API | void | glGetRenderbufferParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetShaderiv | GLuint shader, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetShaderInfoLog | GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog | finish | noext | | |
-| EVAS GL API | void | glGetShaderPrecisionFormat | GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision | finish | noext | | |
-| EVAS GL API | void | glGetShaderSource | GLuint shader, GLsizei bufsize, GLsizei* length, char* source | finish | noext | | |
-| EVAS GL API | const GLubyte* | glGetString | GLenum name | finish | noext | | |
-| EVAS GL API | void | glGetTexParameterfv | GLenum target, GLenum pname, GLfloat* params | finish | noext | | |
-| EVAS GL API | void | glGetTexParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetUniformfv | GLuint program, GLint location, GLfloat* params | finish | noext | | |
-| EVAS GL API | void | glGetUniformiv | GLuint program, GLint location, GLint* params | finish | noext | | |
-| EVAS GL API | int | glGetUniformLocation | GLuint program, const char* name | finish | noext | | |
-| EVAS GL API | void | glGetVertexAttribfv | GLuint index, GLenum pname, GLfloat* params | finish | noext | | |
-| EVAS GL API | void | glGetVertexAttribiv | GLuint index, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGetVertexAttribPointerv | GLuint index, GLenum pname, void** pointer | finish | noext | | |
-| EVAS GL API | void | glHint | GLenum target, GLenum mode | flush | noext | | |
-| EVAS GL API | GLboolean | glIsBuffer | GLuint buffer | finish | noext | | |
-| EVAS GL API | GLboolean | glIsEnabled | GLenum cap | finish | noext | | |
-| EVAS GL API | GLboolean | glIsFramebuffer | GLuint framebuffer | finish | noext | | |
-| EVAS GL API | GLboolean | glIsProgram | GLuint program | finish | noext | | |
-| EVAS GL API | GLboolean | glIsRenderbuffer | GLuint renderbuffer | finish | noext | | |
-| EVAS GL API | GLboolean | glIsShader | GLuint shader | finish | noext | | |
-| EVAS GL API | GLboolean | glIsTexture | GLuint texture | finish | noext | | |
-| EVAS GL API | void | glLineWidth | GLfloat width | flush | noext | | |
-| EVAS GL API | void | glLinkProgram | GLuint program | flush | noext | | |
-| EVAS GL API | void | glPixelStorei | GLenum pname, GLint param | flush | noext | | |
-| EVAS GL API | void | glPolygonOffset | GLfloat factor, GLfloat units | flush | noext | | |
-| EVAS GL API | void | glReadPixels | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels | finish | noext | | |
-| EVAS GL API | void | glReleaseShaderCompiler | void | flush | noext | | |
-| EVAS GL API | void | glRenderbufferStorage | GLenum target, GLenum internalformat, GLsizei width, GLsizei height | flush | noext | | |
-| EVAS GL API | void | glSampleCoverage | GLclampf value, GLboolean invert | finish | noext | | |
-| EVAS GL API | void | glScissor | GLint x, GLint y, GLsizei width, GLsizei height | flush | noext | | |
-| EVAS GL API | void | glShaderBinary | GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length | finish | noext | | |
-| EVAS GL API | void | glShaderSource | GLuint shader, GLsizei count, const char* const * string, const GLint* length | flush | noext | userDefined | |
-| EVAS GL API | void | glStencilFunc | GLenum func, GLint ref, GLuint mask | finish | noext | | |
-| EVAS GL API | void | glStencilFuncSeparate | GLenum face, GLenum func, GLint ref, GLuint mask | finish | noext | | |
-| EVAS GL API | void | glStencilMask | GLuint mask | finish | noext | | |
-| EVAS GL API | void | glStencilMaskSeparate | GLenum face, GLuint mask | finish | noext | | |
-| EVAS GL API | void | glStencilOp | GLenum fail, GLenum zfail, GLenum zpass | finish | noext | | |
-| EVAS GL API | void | glStencilOpSeparate | GLenum face, GLenum fail, GLenum zfail, GLenum zpass | finish | noext | | |
-| EVAS GL API | void | glTexImage2D | GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels | flush | noext | userDefined | |
-| EVAS GL API | void | glTexParameterf | GLenum target, GLenum pname, GLfloat param | flush | noext | | |
-| EVAS GL API | void | glTexParameterfv | GLenum target, GLenum pname, const GLfloat* params | flush | noext | _mp_default, sizeof(GLfloat), params | |
-| EVAS GL API | void | glTexParameteri | GLenum target, GLenum pname, GLint param | flush | noext | | |
-| EVAS GL API | void | glTexParameteriv | GLenum target, GLenum pname, const GLint* params | flush | noext | _mp_default, sizeof(GLint), params | |
-| EVAS GL API | void | glTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels | flush | noext | userDefined | |
-| EVAS GL API | void | glUniform1f | GLint location, GLfloat x | flush | noext | | |
-| EVAS GL API | void | glUniform1fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 1 * count * sizeof(GLfloat), v | |
-| EVAS GL API | void | glUniform1i | GLint location, GLint x | flush | noext | | |
-| EVAS GL API | void | glUniform1iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 1 * count * sizeof(GLint), v | |
-| EVAS GL API | void | glUniform2f | GLint location, GLfloat x, GLfloat y | flush | noext | | |
-| EVAS GL API | void | glUniform2fv | GLint location, GLsizei count, const GLfloat* v | flush | noext |_mp_uniform, 2 * count * sizeof(GLfloat), v  | |
-| EVAS GL API | void | glUniform2i | GLint location, GLint x, GLint y | flush | noext | | |
-| EVAS GL API | void | glUniform2iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 2 * count * sizeof(GLint), v | |
-| EVAS GL API | void | glUniform3f | GLint location, GLfloat x, GLfloat y, GLfloat z | flush | noext | | |
-| EVAS GL API | void | glUniform3fv | GLint location, GLsizei count, const GLfloat* v | flush | noext |_mp_uniform, 3 * count * sizeof(GLfloat), v  | |
-| EVAS GL API | void | glUniform3i | GLint location, GLint x, GLint y, GLint z | flush | noext | | |
-| EVAS GL API | void | glUniform3iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 3 * count * sizeof(GLint), v | |
-| EVAS GL API | void | glUniform4f | GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w | flush | noext | | |
-| EVAS GL API | void | glUniform4fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), v | |
-| EVAS GL API | void | glUniform4i | GLint location, GLint x, GLint y, GLint z, GLint w | flush | noext | | |
-| EVAS GL API | void | glUniform4iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 4 * count * sizeof(GLint), v | |
-| EVAS GL API | void | glUniformMatrix2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value | |
-| EVAS GL API | void | glUniformMatrix3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext |  _mp_uniform, 9 * count * sizeof(GLfloat), value| |
-| EVAS GL API | void | glUniformMatrix4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext |  _mp_uniform, 16 * count * sizeof(GLfloat), value| |
-| EVAS GL API | void | glUseProgram | GLuint program | flush | noext | | |
-| EVAS GL API | void | glValidateProgram | GLuint program | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib1f | GLuint indx, GLfloat x | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib1fv | GLuint indx, const GLfloat* values | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib2f | GLuint indx, GLfloat x, GLfloat y | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib2fv | GLuint indx, const GLfloat* values | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib3f | GLuint indx, GLfloat x, GLfloat y, GLfloat z | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib3fv | GLuint indx, const GLfloat* values | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib4f | GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w | finish | noext | | |
-| EVAS GL API | void | glVertexAttrib4fv | GLuint indx, const GLfloat* values | finish | noext | | |
-| EVAS GL API | void | glVertexAttribPointer | GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr | finish | noext | | |
-| EVAS GL API | void | glViewport | GLint x, GLint y, GLsizei width, GLsizei height | flush | noext | | |
+| EVAS GL | void | glActiveTexture | GLenum texture | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glAttachShader | GLuint program, GLuint shader | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBindAttribLocation | GLuint program, GLuint index, const char* name | finish | noext | _mp_default, strlen(name), name |  |  | | | | | |
+| EVAS GL | void | glBindBuffer | GLenum target, GLuint buffer | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBindFramebuffer | GLenum target, GLuint framebuffer | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindRenderbuffer | GLenum target, GLuint renderbuffer | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBindTexture | GLenum target, GLuint texture | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendColor | GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendEquation | GLenum mode | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendEquationSeparate | GLenum modeRGB, GLenum modeAlpha | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendFunc | GLenum sfactor, GLenum dfactor | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendFuncSeparate | GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glBufferData | GLenum target, GLsizeiptr size, const void* data, GLenum usage | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBufferSubData | GLenum target, GLintptr offset, GLsizeiptr size, const void* data | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLenum | glCheckFramebufferStatus | GLenum target | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glClear | GLbitfield mask | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glClearColor | GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha | finish | noext |  |  |  | | | | | |
+##| INTERNAL | void | glClearDepth | GLclampf depth | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glClearDepthf | GLclampf depth | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glClearStencil | GLint s | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glColorMask | GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glCompileShader | GLuint shader | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glCompressedTexImage2D | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data | flush | noext |  |  | NeedMacro | | | | | |
+| EVAS GL | void | glCompressedTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data | flush | noext |  |  | NeedMacro | | | | | |
+| EVAS GL | void | glCopyTexImage2D | GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glCopyTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLuint | glCreateProgram | void | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLuint | glCreateShader | GLenum type | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glCullFace | GLenum mode | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteBuffers | GLsizei n, const GLuint* buffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), buffers |  |  | | | | | |
+| EVAS GL | void | glDeleteFramebuffers | GLsizei n, const GLuint* framebuffers | flush | ext | _mp_delete_object, n * sizeof(GLuint), framebuffers |  |  | | | | | |
+| EVAS GL | void | glDeleteProgram | GLuint program | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteRenderbuffers | GLsizei n, const GLuint* renderbuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), renderbuffers |  |  | | | | | |
+| EVAS GL | void | glDeleteShader | GLuint shader | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteTextures | GLsizei n, const GLuint* textures | flush | noext | _mp_delete_object, n * sizeof(GLuint), textures |  |  | | | | | |
+| EVAS GL | void | glDepthFunc | GLenum func | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDepthMask | GLboolean flag | flush | noext |  |  |  | | | | | |
+##| INTERNAL | void | glDepthRange | GLclampd zNear, GLclampd zFar | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDepthRangef | GLclampf zNear, GLclampf zFar | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDetachShader | GLuint program, GLuint shader | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glDisable | GLenum cap | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glDisableVertexAttribArray | GLuint index | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDrawArrays | GLenum mode, GLint first, GLsizei count | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDrawElements | GLenum mode, GLsizei count, GLenum type, const void* indices | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glEnable | GLenum cap | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glEnableVertexAttribArray | GLuint index | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glFinish | void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glFlush | void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferRenderbuffer | GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture2D | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glFrontFace | GLenum mode | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGenBuffers | GLsizei n, GLuint* buffers | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGenerateMipmap | GLenum target | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGenFramebuffers | GLsizei n, GLuint* framebuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenRenderbuffers | GLsizei n, GLuint* renderbuffers | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGenTextures | GLsizei n, GLuint* textures | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetActiveAttrib | GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetActiveUniform | GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetAttachedShaders | GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders | finish | noext |  |  |  | | | | | |
+| EVAS GL | int | glGetAttribLocation | GLuint program, const char* name | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetBooleanv | GLenum pname, GLboolean* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetBufferParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLenum | glGetError | void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetFloatv | GLenum pname, GLfloat* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetFramebufferAttachmentParameteriv | GLenum target, GLenum attachment, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetIntegerv | GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramiv | GLuint program, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramInfoLog | GLuint program, GLsizei bufsize, GLsizei* length, char* infolog | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetRenderbufferParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetShaderiv | GLuint shader, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetShaderInfoLog | GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetShaderPrecisionFormat | GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetShaderSource | GLuint shader, GLsizei bufsize, GLsizei* length, char* source | finish | noext |  |  |  | | | | | |
+| EVAS GL | const GLubyte* | glGetString | GLenum name | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameterfv | GLenum target, GLenum pname, GLfloat* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameteriv | GLenum target, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetUniformfv | GLuint program, GLint location, GLfloat* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetUniformiv | GLuint program, GLint location, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | int | glGetUniformLocation | GLuint program, const char* name | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetVertexAttribfv | GLuint index, GLenum pname, GLfloat* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetVertexAttribiv | GLuint index, GLenum pname, GLint* params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetVertexAttribPointerv | GLuint index, GLenum pname, void** pointer | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glHint | GLenum target, GLenum mode | flush | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsBuffer | GLuint buffer | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsEnabled | GLenum cap | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsFramebuffer | GLuint framebuffer | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsProgram | GLuint program | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsRenderbuffer | GLuint renderbuffer | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsShader | GLuint shader | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsTexture | GLuint texture | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glLineWidth | GLfloat width | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glLinkProgram | GLuint program | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glPixelStorei | GLenum pname, GLint param | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glPolygonOffset | GLfloat factor, GLfloat units | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glReadPixels | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glReleaseShaderCompiler | void | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glRenderbufferStorage | GLenum target, GLenum internalformat, GLsizei width, GLsizei height | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glSampleCoverage | GLclampf value, GLboolean invert | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glScissor | GLint x, GLint y, GLsizei width, GLsizei height | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glShaderBinary | GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glShaderSource | GLuint shader, GLsizei count, const char* const * string, const GLint* length | flush | noext |  |  | NeedMacro | | | | | |
+| EVAS GL | void | glStencilFunc | GLenum func, GLint ref, GLuint mask | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glStencilFuncSeparate | GLenum face, GLenum func, GLint ref, GLuint mask | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glStencilMask | GLuint mask | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glStencilMaskSeparate | GLenum face, GLuint mask | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glStencilOp | GLenum fail, GLenum zfail, GLenum zpass | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glStencilOpSeparate | GLenum face, GLenum fail, GLenum zfail, GLenum zpass | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexImage2D | GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels | flush | noext |  |  | NeedMacro | | | | | |
+| EVAS GL | void | glTexParameterf | GLenum target, GLenum pname, GLfloat param | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterfv | GLenum target, GLenum pname, const GLfloat* params | flush | noext | _mp_default, sizeof(GLfloat), params |  |  | | | | | |
+| EVAS GL | void | glTexParameteri | GLenum target, GLenum pname, GLint param | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameteriv | GLenum target, GLenum pname, const GLint* params | flush | noext | _mp_default, sizeof(GLint), params |  |  | | | | | |
+| EVAS GL | void | glTexSubImage2D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels | flush | noext |  |  | NeedMacro | | | | | |
+| EVAS GL | void | glUniform1f | GLint location, GLfloat x | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform1fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 1 * count * sizeof(GLfloat), v |  |  | | | | | |
+| EVAS GL | void | glUniform1i | GLint location, GLint x | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform1iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 1 * count * sizeof(GLint), v |  |  | | | | | |
+| EVAS GL | void | glUniform2f | GLint location, GLfloat x, GLfloat y | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform2fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 2 * count * sizeof(GLfloat), v |  |  | | | | | |
+| EVAS GL | void | glUniform2i | GLint location, GLint x, GLint y | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform2iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 2 * count * sizeof(GLint), v |  |  | | | | | |
+| EVAS GL | void | glUniform3f | GLint location, GLfloat x, GLfloat y, GLfloat z | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform3fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 3 * count * sizeof(GLfloat), v |  |  | | | | | |
+| EVAS GL | void | glUniform3i | GLint location, GLint x, GLint y, GLint z | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform3iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 3 * count * sizeof(GLint), v |  |  | | | | | |
+| EVAS GL | void | glUniform4f | GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform4fv | GLint location, GLsizei count, const GLfloat* v | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), v |  |  | | | | | |
+| EVAS GL | void | glUniform4i | GLint location, GLint x, GLint y, GLint z, GLint w | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glUniform4iv | GLint location, GLsizei count, const GLint* v | flush | noext | _mp_uniform, 4 * count * sizeof(GLint), v |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext | _mp_uniform, 4 * count * sizeof(GLfloat), value |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext | _mp_uniform, 9 * count * sizeof(GLfloat), value |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat* value | flush | noext | _mp_uniform, 16 * count * sizeof(GLfloat), value |  |  | | | | | |
+| EVAS GL | void | glUseProgram | GLuint program | flush | noext |  |  |  | | | | | |
+| EVAS GL | void | glValidateProgram | GLuint program | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib1f | GLuint indx, GLfloat x | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib1fv | GLuint indx, const GLfloat* values | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib2f | GLuint indx, GLfloat x, GLfloat y | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib2fv | GLuint indx, const GLfloat* values | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib3f | GLuint indx, GLfloat x, GLfloat y, GLfloat z | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib3fv | GLuint indx, const GLfloat* values | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib4f | GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttrib4fv | GLuint indx, const GLfloat* values | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribPointer | GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glViewport | GLint x, GLint y, GLsizei width, GLsizei height | flush | noext |  |  |  | | | | | |
+
 # OpenGL-ES 2.0 extensions
 /* GL_OES_EGL_image */
-| EVAS GL API | void | glEvasGLImageTargetTexture2DOES | GLenum target, EvasGLImage image | finish | noext | | |
-| EVAS GL API | void | glEvasGLImageTargetRenderbufferStorageOES | GLenum target, EvasGLImage image | finish | noext | | |
+| EVAS GL | void | glEvasGLImageTargetTexture2DOES | GLenum target, EvasGLImage image | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEvasGLImageTargetRenderbufferStorageOES | GLenum target, EvasGLImage image | finish | ext |  |  |  | | | | | |
 /* GL_OES_get_program_binary */
-| EVAS GL API | void | glGetProgramBinaryOES | GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary | finish | noext | | |
-| EVAS GL API | void | glProgramBinaryOES | GLuint program, GLenum binaryFormat, const void *binary, GLint length | flush | noext | _mp_default, length, binary | |
+| EVAS GL | void | glGetProgramBinaryOES | GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramBinaryOES | GLuint program, GLenum binaryFormat, const void *binary, GLint length | flush | ext | _mp_default, length, binary |  |  | | | | | |
 /* GL_OES_mapbuffer */
-| EVAS GL API | void * | glMapBufferOES | GLenum target, GLenum access | finish | noext | | |
-| EVAS GL API | GLboolean | glUnmapBufferOES | GLenum target | finish | noext | | |
-| EVAS GL API | void | glGetBufferPointervOES | GLenum target, GLenum pname, void** params | finish | noext | | |
+| EVAS GL | void * | glMapBufferOES | GLenum target, GLenum access | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glUnmapBufferOES | GLenum target | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetBufferPointervOES | GLenum target, GLenum pname, void** params | finish | ext |  |  |  | | | | | |
 /* GL_OES_texture_3D */
-| EVAS GL API | void | glTexImage3DOES | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels | finish | noext | | |
-| EVAS GL API | void | glTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels | finish | noext | | |
-| EVAS GL API | void | glCopyTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glCompressedTexImage3DOES | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data | finish | noext | | |
-| EVAS GL API | void | glCompressedTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data | finish | noext | | |
-| EVAS GL API | void | glFramebufferTexture3DOES | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset | finish | noext | | |
+| EVAS GL | void | glTexImage3DOES | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCopyTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCompressedTexImage3DOES | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCompressedTexSubImage3DOES | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture3DOES | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset | finish | ext |  |  |  | | | | | |
 /* AMD_performance_monitor */
-| EVAS GL API | void | glGetPerfMonitorGroupsAMD | GLint* numGroups, GLsizei groupsSize, GLuint* groups | finish | noext | | |
-| EVAS GL API | void | glGetPerfMonitorCountersAMD | GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters | finish | noext | | |
-| EVAS GL API | void | glGetPerfMonitorGroupStringAMD | GLuint group, GLsizei bufSize, GLsizei* length, char* groupString | finish | noext | | |
-| EVAS GL API | void | glGetPerfMonitorCounterStringAMD | GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString | finish | noext | | |
-| EVAS GL API | void | glGetPerfMonitorCounterInfoAMD | GLuint group, GLuint counter, GLenum pname, void* data | finish | noext | | |
-| EVAS GL API | void | glGenPerfMonitorsAMD | GLsizei n, GLuint* monitors | finish | noext | | |
-| EVAS GL API | void | glDeletePerfMonitorsAMD | GLsizei n, GLuint* monitors | finish | noext | | |
-| EVAS GL API | void | glSelectPerfMonitorCountersAMD | GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList | finish | noext | | |
-| EVAS GL API | void | glBeginPerfMonitorAMD | GLuint monitor | finish | noext | | |
-| EVAS GL API | void | glEndPerfMonitorAMD | GLuint monitor | finish | noext | | |
-| EVAS GL API | void | glGetPerfMonitorCounterDataAMD | GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten | finish | noext | | |
+| EVAS GL | void | glGetPerfMonitorGroupsAMD | GLint* numGroups, GLsizei groupsSize, GLuint* groups | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPerfMonitorCountersAMD | GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPerfMonitorGroupStringAMD | GLuint group, GLsizei bufSize, GLsizei* length, char* groupString | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPerfMonitorCounterStringAMD | GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPerfMonitorCounterInfoAMD | GLuint group, GLuint counter, GLenum pname, void* data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenPerfMonitorsAMD | GLsizei n, GLuint* monitors | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeletePerfMonitorsAMD | GLsizei n, GLuint* monitors | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSelectPerfMonitorCountersAMD | GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBeginPerfMonitorAMD | GLuint monitor | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEndPerfMonitorAMD | GLuint monitor | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPerfMonitorCounterDataAMD | GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten | finish | ext |  |  |  | | | | | |
 /* GL_EXT_discard_framebuffer */
-| EVAS GL API | void | glDiscardFramebuffer | GLenum target, GLsizei numAttachments, const GLenum* attachments | finish | noext | | |
-| EVAS GL API | void | glDiscardFramebufferEXT | GLenum target, GLsizei numAttachments, const GLenum* attachments | finish | noext | | |
+| EVAS GL | void | glDiscardFramebufferEXT | GLenum target, GLsizei numAttachments, const GLenum* attachments | finish | ext |  |  |  | | | | | |
+
 /* GL_EXT_multi_draw_arrays */
-| EVAS GL API | void | glMultiDrawArrays | GLenum mode, GLint* first, GLsizei* count, GLsizei primcount | finish | noext | | |
-| EVAS GL API | void | glMultiDrawArraysEXT | GLenum mode, GLint* first, GLsizei* count, GLsizei primcount | finish | noext | | |
-| EVAS GL API | void | glMultiDrawElements | GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount | finish | noext | | |
-| EVAS GL API | void | glMultiDrawElementsEXT | GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount | finish | noext | | |
+| EVAS GL | void | glMultiDrawArraysEXT | GLenum mode, GLint* first, GLsizei* count, GLsizei primcount | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultiDrawElementsEXT | GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount | finish | ext |  |  |  | | | | | |
+
+
 /* GL_NV_fence */
-| EVAS GL API | void | glDeleteFencesNV | GLsizei n, const GLuint* fences | finish | noext | | |
-| EVAS GL API | void | glGenFencesNV | GLsizei n, GLuint* fences | finish | noext | | |
-| EVAS GL API | GLboolean | glIsFenceNV | GLuint fence | finish | noext | | |
-| EVAS GL API | GLboolean | glTestFenceNV | GLuint fence | finish | noext | | |
-| EVAS GL API | void | glGetFenceivNV | GLuint fence, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glFinishFenceNV | GLuint fence | finish | noext | | |
-| EVAS GL API | void | glSetFenceNV | GLuint a, GLenum b | finish | noext | | |
+| EVAS GL | void | glDeleteFencesNV | GLsizei n, const GLuint* fences | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenFencesNV | GLsizei n, GLuint* fences | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsFenceNV | GLuint fence | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glTestFenceNV | GLuint fence | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetFenceivNV | GLuint fence, GLenum pname, GLint* params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFinishFenceNV | GLuint fence | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSetFenceNV | GLuint a, GLenum b | finish | ext |  |  |  | | | | | |
 /* GL_QCOM_driver_control */
-| EVAS GL API | void | glGetDriverControlsQCOM | GLint* num, GLsizei size, GLuint* driverControls | finish | noext | | |
-| EVAS GL API | void | glGetDriverControlStringQCOM | GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString | finish | noext | | |
-| EVAS GL API | void | glEnableDriverControlQCOM | GLuint driverControl | finish | noext | | |
-| EVAS GL API | void | glDisableDriverControlQCOM | GLuint driverControl | finish | noext | | |
+| EVAS GL | void | glGetDriverControlsQCOM | GLint* num, GLsizei size, GLuint* driverControls | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetDriverControlStringQCOM | GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEnableDriverControlQCOM | GLuint driverControl | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDisableDriverControlQCOM | GLuint driverControl | finish | ext |  |  |  | | | | | |
 /* GL_QCOM_extended_get */
-| EVAS GL API | void | glExtGetTexturesQCOM | GLuint* textures, GLint maxTextures, GLint* numTextures | finish | noext | | |
-| EVAS GL API | void | glExtGetBuffersQCOM | GLuint* buffers, GLint maxBuffers, GLint* numBuffers | finish | noext | | |
-| EVAS GL API | void | glExtGetRenderbuffersQCOM | GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers | finish | noext | | |
-| EVAS GL API | void | glExtGetFramebuffersQCOM | GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers | finish | noext | | |
-| EVAS GL API | void | glExtGetTexLevelParameterivQCOM | GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glExtTexObjectStateOverrideiQCOM | GLenum target, GLenum pname, GLint param | finish | noext | | |
-| EVAS GL API | void | glExtGetTexSubImageQCOM | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels | finish | noext | | |
-| EVAS GL API | void | glExtGetBufferPointervQCOM | GLenum target, void** params | finish | noext | | |
+| EVAS GL | void | glExtGetTexturesQCOM | GLuint* textures, GLint maxTextures, GLint* numTextures | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetBuffersQCOM | GLuint* buffers, GLint maxBuffers, GLint* numBuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetRenderbuffersQCOM | GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetFramebuffersQCOM | GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetTexLevelParameterivQCOM | GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtTexObjectStateOverrideiQCOM | GLenum target, GLenum pname, GLint param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetTexSubImageQCOM | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetBufferPointervQCOM | GLenum target, void** params | finish | ext |  |  |  | | | | | |
 /* GL_QCOM_extended_get2 */
-| EVAS GL API | void | glExtGetShadersQCOM | GLuint* shaders, GLint maxShaders, GLint* numShaders | finish | noext | | |
-| EVAS GL API | void | glExtGetProgramsQCOM | GLuint* programs, GLint maxPrograms, GLint* numPrograms | finish | noext | | |
-| EVAS GL API | GLboolean | glExtIsProgramBinaryQCOM | GLuint program | finish | noext | | |
-| EVAS GL API | void | glExtGetProgramBinarySourceQCOM | GLuint program, GLenum shadertype, char* source, GLint* length | finish | noext | | |
+| EVAS GL | void | glExtGetShadersQCOM | GLuint* shaders, GLint maxShaders, GLint* numShaders | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetProgramsQCOM | GLuint* programs, GLint maxPrograms, GLint* numPrograms | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glExtIsProgramBinaryQCOM | GLuint program | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glExtGetProgramBinarySourceQCOM | GLuint program, GLenum shadertype, char* source, GLint* length | finish | ext |  |  |  | | | | | |
+
 # OpenGL-ES 1.1
 /* Available only in Common profile */
-| EVAS GL API | void | glAlphaFunc | GLenum func, GLclampf ref | finish | noext | | |
-| EVAS GL API | void | glClipPlanef | GLenum plane, const GLfloat *equation | finish | noext | | |
-| EVAS GL API | void | glColor4f | GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha | finish | noext | | |
-| EVAS GL API | void | glFogf | GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glFogfv | GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glFrustumf | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | noext | | |
-| EVAS GL API | void | glGetClipPlanef | GLenum pname, GLfloat eqn[4] | finish | noext | | |
-| EVAS GL API | void | glGetLightfv | GLenum light, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glGetMaterialfv | GLenum face, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glGetTexEnvfv | GLenum env, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glLightModelf | GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glLightModelfv | GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glLightf | GLenum light, GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glLightfv | GLenum light, GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glLoadMatrixf | const GLfloat *m | finish | noext | | |
-| EVAS GL API | void | glMaterialf | GLenum face, GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glMaterialfv | GLenum face, GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glMultMatrixf | const GLfloat *m | finish | noext | | |
-| EVAS GL API | void | glMultiTexCoord4f | GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q | finish | noext | | |
-| EVAS GL API | void | glNormal3f | GLfloat nx, GLfloat ny, GLfloat nz | finish | noext | | |
-| EVAS GL API | void | glOrthof | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | noext | | |
-| EVAS GL API | void | glPointParameterf | GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glPointParameterfv | GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glPointSize | GLfloat size | finish | noext | | |
-| EVAS GL API | void | glPointSizePointerOES | GLenum type, GLsizei stride, const GLvoid * pointer | finish | noext | | |
-| EVAS GL API | void | glRotatef | GLfloat angle, GLfloat x, GLfloat y, GLfloat z | finish | noext | | |
-| EVAS GL API | void | glScalef | GLfloat x, GLfloat y, GLfloat z | finish | noext | | |
-| EVAS GL API | void | glTexEnvf | GLenum target, GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glTexEnvfv | GLenum target, GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glTranslatef | GLfloat x, GLfloat y, GLfloat z | finish | noext | | |
+| EVAS GL | void | glAlphaFunc | GLenum func, GLclampf ref | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClipPlanef | GLenum plane, const GLfloat *equation | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glColor4f | GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogf | GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogfv | GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFrustumf | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetClipPlanef | GLenum pname, GLfloat eqn[4] | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetLightfv | GLenum light, GLenum pname, GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetMaterialfv | GLenum face, GLenum pname, GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexEnvfv | GLenum env, GLenum pname, GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelf | GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelfv | GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightf | GLenum light, GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightfv | GLenum light, GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLoadMatrixf | const GLfloat *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialf | GLenum face, GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialfv | GLenum face, GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultMatrixf | const GLfloat *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultiTexCoord4f | GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glNormal3f | GLfloat nx, GLfloat ny, GLfloat nz | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glOrthof | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterf | GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterfv | GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointSize | GLfloat size | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointSizePointerOES | GLenum type, GLsizei stride, const GLvoid * pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRotatef | GLfloat angle, GLfloat x, GLfloat y, GLfloat z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glScalef | GLfloat x, GLfloat y, GLfloat z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvf | GLenum target, GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvfv | GLenum target, GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTranslatef | GLfloat x, GLfloat y, GLfloat z | finish | ext |  |  |  | | | | | |
 /* Available in both Common and Common-Lite profiles */
-| EVAS GL API | void | glAlphaFuncx | GLenum func, GLclampx ref | finish | noext | | |
-| EVAS GL API | void | glClearColorx | GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha | finish | noext | | |
-| EVAS GL API | void | glClearDepthx | GLclampx depth | finish | noext | | |
-| EVAS GL API | void | glClientActiveTexture | GLenum texture | finish | noext | | |
-| EVAS GL API | void | glClipPlanex | GLenum plane, const GLfixed *equation | finish | noext | | |
-| EVAS GL API | void | glColor4ub | GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha | finish | noext | | |
-| EVAS GL API | void | glColor4x | GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha | finish | noext | | |
-| EVAS GL API | void | glColorPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
-| EVAS GL API | void | glDepthRangex | GLclampx zNear, GLclampx zFar | finish | noext | | |
-| EVAS GL API | void | glDisableClientState | GLenum array | finish | noext | | |
-| EVAS GL API | void | glEnableClientState | GLenum array | finish | noext | | |
-| EVAS GL API | void | glFogx | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glFogxv | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glFrustumx | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | noext | | |
-| EVAS GL API | void | glGetClipPlanex | GLenum pname, GLfixed eqn[4] | finish | noext | | |
-| EVAS GL API | void | glGetFixedv | GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetLightxv | GLenum light, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetMaterialxv | GLenum face, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetPointerv | GLenum pname, GLvoid **params | finish | noext | | |
-| EVAS GL API | void | glGetTexEnviv | GLenum env, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetTexEnvxv | GLenum env, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetTexParameterxv | GLenum target, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLightModelx | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glLightModelxv | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLightx | GLenum light, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glLightxv | GLenum light, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLineWidthx | GLfixed width | finish | noext | | |
-| EVAS GL API | void | glLoadIdentity | void | finish | noext | | |
-| EVAS GL API | void | glLoadMatrixx | const GLfixed *m | finish | noext | | |
-| EVAS GL API | void | glLogicOp | GLenum opcode | finish | noext | | |
-| EVAS GL API | void | glMaterialx | GLenum face, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glMaterialxv | GLenum face, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glMatrixMode | GLenum mode | finish | noext | | |
-| EVAS GL API | void | glMultMatrixx | const GLfixed *m | finish | noext | | |
-| EVAS GL API | void | glMultiTexCoord4x | GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q | finish | noext | | |
-| EVAS GL API | void | glNormal3x | GLfixed nx, GLfixed ny, GLfixed nz | finish | noext | | |
-| EVAS GL API | void | glNormalPointer | GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
-| EVAS GL API | void | glOrthox | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | noext | | |
-| EVAS GL API | void | glPointParameterx | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glPointParameterxv | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glPointSizex | GLfixed size | finish | noext | | |
-| EVAS GL API | void | glPolygonOffsetx | GLfixed factor, GLfixed units | finish | noext | | |
-| EVAS GL API | void | glPopMatrix | void | finish | noext | | |
-| EVAS GL API | void | glPushMatrix | void | finish | noext | | |
-| EVAS GL API | void | glRotatex | GLfixed angle, GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
-| EVAS GL API | void | glSampleCoveragex | GLclampx value, GLboolean invert | finish | noext | | |
-| EVAS GL API | void | glScalex | GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
-| EVAS GL API | void | glShadeModel | GLenum mode | finish | noext | | |
-| EVAS GL API | void | glTexCoordPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
-| EVAS GL API | void | glTexEnvi | GLenum target, GLenum pname, GLint param | finish | noext | | |
-| EVAS GL API | void | glTexEnvx | GLenum target, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glTexEnviv | GLenum target, GLenum pname, const GLint *params | finish | noext | | |
-| EVAS GL API | void | glTexEnvxv | GLenum target, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glTexParameterx | GLenum target, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glTexParameterxv | GLenum target, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glTranslatex | GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
-| EVAS GL API | void | glVertexPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
+| EVAS GL | void | glAlphaFuncx | GLenum func, GLclampx ref | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearColorx | GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearDepthx | GLclampx depth | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClientActiveTexture | GLenum texture | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClipPlanex | GLenum plane, const GLfixed *equation | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glColor4ub | GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glColor4x | GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glColorPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDepthRangex | GLclampx zNear, GLclampx zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDisableClientState | GLenum array | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEnableClientState | GLenum array | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogx | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogxv | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFrustumx | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetClipPlanex | GLenum pname, GLfixed eqn[4] | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetFixedv | GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetLightxv | GLenum light, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetMaterialxv | GLenum face, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetPointerv | GLenum pname, GLvoid **params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexEnviv | GLenum env, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexEnvxv | GLenum env, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameterxv | GLenum target, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelx | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelxv | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightx | GLenum light, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightxv | GLenum light, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLineWidthx | GLfixed width | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLoadIdentity | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLoadMatrixx | const GLfixed *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLogicOp | GLenum opcode | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialx | GLenum face, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialxv | GLenum face, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMatrixMode | GLenum mode | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultMatrixx | const GLfixed *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultiTexCoord4x | GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glNormal3x | GLfixed nx, GLfixed ny, GLfixed nz | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glNormalPointer | GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glOrthox | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterx | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterxv | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointSizex | GLfixed size | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPolygonOffsetx | GLfixed factor, GLfixed units | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPopMatrix | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPushMatrix | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRotatex | GLfixed angle, GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSampleCoveragex | GLclampx value, GLboolean invert | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glScalex | GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glShadeModel | GLenum mode | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexCoordPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvi | GLenum target, GLenum pname, GLint param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvx | GLenum target, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnviv | GLenum target, GLenum pname, const GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvxv | GLenum target, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterx | GLenum target, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterxv | GLenum target, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTranslatex | GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexPointer | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+
 # OpenGL-ES 1.0
 /* GL_OES_blend_equation_separate */
-| EVAS GL API | void | glBlendEquationSeparateOES | GLenum modeRGB, GLenum modeAlpha | finish | noext | | |
+| EVAS GL | void | glBlendEquationSeparateOES | GLenum modeRGB, GLenum modeAlpha | finish | ext |  |  |  | | | | | |
 /* GL_OES_blend_func_separate */
-| EVAS GL API | void | glBlendFuncSeparateOES | GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | finish | noext | | |
+| EVAS GL | void | glBlendFuncSeparateOES | GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | finish | ext |  |  |  | | | | | |
 /* GL_OES_blend_subtract */
-| EVAS GL API | void | glBlendEquationOES | GLenum mode | finish | noext | | |
+| EVAS GL | void | glBlendEquationOES | GLenum mode | finish | ext |  |  |  | | | | | |
 /* GL_OES_draw_texture */
-| EVAS GL API | void | glDrawTexsOES | GLshort x, GLshort y, GLshort z, GLshort width, GLshort height | finish | noext | | |
-| EVAS GL API | void | glDrawTexiOES | GLint x, GLint y, GLint z, GLint width, GLint height | finish | noext | | |
-| EVAS GL API | void | glDrawTexxOES | GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height | finish | noext | | |
-| EVAS GL API | void | glDrawTexsvOES | const GLshort *coords | finish | noext | | |
-| EVAS GL API | void | glDrawTexivOES | const GLint *coords | finish | noext | | |
-| EVAS GL API | void | glDrawTexxvOES | const GLfixed *coords | finish | noext | | |
-| EVAS GL API | void | glDrawTexfOES | GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height | finish | noext | | |
-| EVAS GL API | void | glDrawTexfvOES | const GLfloat *coords | finish | noext | | |
+| EVAS GL | void | glDrawTexsOES | GLshort x, GLshort y, GLshort z, GLshort width, GLshort height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexiOES | GLint x, GLint y, GLint z, GLint width, GLint height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexxOES | GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexsvOES | const GLshort *coords | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexivOES | const GLint *coords | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexxvOES | const GLfixed *coords | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexfOES | GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawTexfvOES | const GLfloat *coords | finish | ext |  |  |  | | | | | |
 /* GL_OES_fixed_point */
-| EVAS GL API | void | glAlphaFuncxOES | GLenum func, GLclampx ref | finish | noext | | |
-| EVAS GL API | void | glClearColorxOES | GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha | finish | noext | | |
-| EVAS GL API | void | glClearDepthxOES | GLclampx depth | finish | noext | | |
-| EVAS GL API | void | glClipPlanexOES | GLenum plane, const GLfixed *equation | finish | noext | | |
-| EVAS GL API | void | glColor4xOES | GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha | finish | noext | | |
-| EVAS GL API | void | glDepthRangexOES | GLclampx zNear, GLclampx zFar | finish | noext | | |
-| EVAS GL API | void | glFogxOES | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glFogxvOES | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glFrustumxOES | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | noext | | |
-| EVAS GL API | void | glGetClipPlanexOES | GLenum pname, GLfixed eqn[4] | finish | noext | | |
-| EVAS GL API | void | glGetFixedvOES | GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetLightxvOES | GLenum light, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetMaterialxvOES | GLenum face, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetTexEnvxvOES | GLenum env, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetTexParameterxvOES | GLenum target, GLenum pname, GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLightModelxOES | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glLightModelxvOES | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLightxOES | GLenum light, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glLightxvOES | GLenum light, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glLineWidthxOES | GLfixed width | finish | noext | | |
-| EVAS GL API | void | glLoadMatrixxOES | const GLfixed *m | finish | noext | | |
-| EVAS GL API | void | glMaterialxOES | GLenum face, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glMaterialxvOES | GLenum face, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glMultMatrixxOES | const GLfixed *m | finish | noext | | |
-| EVAS GL API | void | glMultiTexCoord4xOES | GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q | finish | noext | | |
-| EVAS GL API | void | glNormal3xOES | GLfixed nx, GLfixed ny, GLfixed nz | finish | noext | | |
-| EVAS GL API | void | glOrthoxOES | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | noext | | |
-| EVAS GL API | void | glPointParameterxOES | GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glPointParameterxvOES | GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glPointSizexOES | GLfixed size | finish | noext | | |
-| EVAS GL API | void | glPolygonOffsetxOES | GLfixed factor, GLfixed units | finish | noext | | |
-| EVAS GL API | void | glRotatexOES | GLfixed angle, GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
-| EVAS GL API | void | glSampleCoveragexOES | GLclampx value, GLboolean invert | finish | noext | | |
-| EVAS GL API | void | glScalexOES | GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
-| EVAS GL API | void | glTexEnvxOES | GLenum target, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glTexEnvxvOES | GLenum target, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glTexParameterxOES | GLenum target, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glTexParameterxvOES | GLenum target, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glTranslatexOES | GLfixed x, GLfixed y, GLfixed z | finish | noext | | |
+| EVAS GL | void | glAlphaFuncxOES | GLenum func, GLclampx ref | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearColorxOES | GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearDepthxOES | GLclampx depth | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClipPlanexOES | GLenum plane, const GLfixed *equation | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glColor4xOES | GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDepthRangexOES | GLclampx zNear, GLclampx zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogxOES | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFogxvOES | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFrustumxOES | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetClipPlanexOES | GLenum pname, GLfixed eqn[4] | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetFixedvOES | GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetLightxvOES | GLenum light, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetMaterialxvOES | GLenum face, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexEnvxvOES | GLenum env, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameterxvOES | GLenum target, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelxOES | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightModelxvOES | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightxOES | GLenum light, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLightxvOES | GLenum light, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLineWidthxOES | GLfixed width | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLoadMatrixxOES | const GLfixed *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialxOES | GLenum face, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMaterialxvOES | GLenum face, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultMatrixxOES | const GLfixed *m | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMultiTexCoord4xOES | GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glNormal3xOES | GLfixed nx, GLfixed ny, GLfixed nz | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glOrthoxOES | GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterxOES | GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointParameterxvOES | GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPointSizexOES | GLfixed size | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPolygonOffsetxOES | GLfixed factor, GLfixed units | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRotatexOES | GLfixed angle, GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSampleCoveragexOES | GLclampx value, GLboolean invert | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glScalexOES | GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvxOES | GLenum target, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexEnvxvOES | GLenum target, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterxOES | GLenum target, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterxvOES | GLenum target, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTranslatexOES | GLfixed x, GLfixed y, GLfixed z | finish | ext |  |  |  | | | | | |
 /* GL_OES_framebuffer_object */
-| EVAS GL API | GLboolean | glIsRenderbufferOES | GLuint renderbuffer | finish | noext | | |
-| EVAS GL API | void | glBindRenderbufferOES | GLenum target, GLuint renderbuffer | flush | noext | | |
-| EVAS GL API | void | glDeleteRenderbuffersOES | GLsizei n, const GLuint* renderbuffers | flush | noext | _mp_delete_object, n * sizeof(GLuint), renderbuffers | |
-| EVAS GL API | void | glGenRenderbuffersOES | GLsizei n, GLuint* renderbuffers | finish | noext | | |
-| EVAS GL API | void | glRenderbufferStorageOES | GLenum target, GLenum internalformat, GLsizei width, GLsizei height | flush | noext | | |
-| EVAS GL API | void | glGetRenderbufferParameterivOES | GLenum target, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | GLboolean | glIsFramebufferOES | GLuint framebuffer | finish | noext | | |
-| EVAS GL API | void | glBindFramebufferOES | GLenum target, GLuint framebuffer | flush | noext | | |
-| EVAS GL API | void | glDeleteFramebuffersOES | GLsizei n, const GLuint* framebuffers | flush | noext |  _mp_delete_object, n * sizeof(GLuint), framebuffers| |
-| EVAS GL API | void | glGenFramebuffersOES | GLsizei n, GLuint* framebuffers | finish | noext | | |
-| EVAS GL API | GLenum | glCheckFramebufferStatusOES | GLenum target | finish | noext | | |
-| EVAS GL API | void | glFramebufferRenderbufferOES | GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer | flush | noext | | |
-| EVAS GL API | void | glFramebufferTexture2DOES | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level | flush | noext | | |
-| EVAS GL API | void | glGetFramebufferAttachmentParameterivOES | GLenum target, GLenum attachment, GLenum pname, GLint* params | finish | noext | | |
-| EVAS GL API | void | glGenerateMipmapOES | GLenum target | finish | noext | | |
+| EVAS GL | GLboolean | glIsRenderbufferOES | GLuint renderbuffer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindRenderbufferOES | GLenum target, GLuint renderbuffer | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteRenderbuffersOES | GLsizei n, const GLuint* renderbuffers | flush | ext | _mp_delete_object, n * sizeof(GLuint), renderbuffers |  |  | | | | | |
+| EVAS GL | void | glGenRenderbuffersOES | GLsizei n, GLuint* renderbuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRenderbufferStorageOES | GLenum target, GLenum internalformat, GLsizei width, GLsizei height | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetRenderbufferParameterivOES | GLenum target, GLenum pname, GLint* params | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsFramebufferOES | GLuint framebuffer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindFramebufferOES | GLenum target, GLuint framebuffer | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteFramebuffersOES | GLsizei n, const GLuint* framebuffers | flush | ext | _mp_delete_object, n * sizeof(GLuint), framebuffers |  |  | | | | | |
+| EVAS GL | void | glGenFramebuffersOES | GLsizei n, GLuint* framebuffers | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLenum | glCheckFramebufferStatusOES | GLenum target | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferRenderbufferOES | GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture2DOES | GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetFramebufferAttachmentParameterivOES | GLenum target, GLenum attachment, GLenum pname, GLint* params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenerateMipmapOES | GLenum target | finish | ext |  |  |  | | | | | |
 /* GL_OES_matrix_palette */
-| EVAS GL API | void | glCurrentPaletteMatrixOES | GLuint matrixpaletteindex | finish | noext | | |
-| EVAS GL API | void | glLoadPaletteFromModelViewMatrixOES | void | finish | noext | | |
-| EVAS GL API | void | glMatrixIndexPointerOES | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
-| EVAS GL API | void | glWeightPointerOES | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
+| EVAS GL | void | glCurrentPaletteMatrixOES | GLuint matrixpaletteindex | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glLoadPaletteFromModelViewMatrixOES | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMatrixIndexPointerOES | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glWeightPointerOES | GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
 /* GL_OES_query_matrix */
-| EVAS GL API | GLbitfield | glQueryMatrixxOES | GLfixed mantissa[16], GLint exponent[16] | finish | noext | | |
+| EVAS GL | GLbitfield | glQueryMatrixxOES | GLfixed mantissa[16], GLint exponent[16] | finish | ext |  |  |  | | | | | |
 /* GL_OES_single_precision */
-| EVAS GL API | void | glDepthRangefOES | GLclampf zNear, GLclampf zFar | finish | noext | | |
-| EVAS GL API | void | glFrustumfOES | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | noext | | |
-| EVAS GL API | void | glOrthofOES | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | noext | | |
-| EVAS GL API | void | glClipPlanefOES | GLenum plane, const GLfloat *equation | finish | noext | | |
-| EVAS GL API | void | glGetClipPlanefOES | GLenum pname, GLfloat eqn[4] | finish | noext | | |
-| EVAS GL API | void | glClearDepthfOES | GLclampf depth | finish | noext | | |
+| EVAS GL | void | glDepthRangefOES | GLclampf zNear, GLclampf zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFrustumfOES | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glOrthofOES | GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClipPlanefOES | GLenum plane, const GLfloat *equation | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetClipPlanefOES | GLenum pname, GLfloat eqn[4] | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearDepthfOES | GLclampf depth | finish | ext |  |  |  | | | | | |
 /* GL_OES_texture_cube_map */
-| EVAS GL API | void | glTexGenfOES | GLenum coord, GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glTexGenfvOES | GLenum coord, GLenum pname, const GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glTexGeniOES | GLenum coord, GLenum pname, GLint param | finish | noext | | |
-| EVAS GL API | void | glTexGenivOES | GLenum coord, GLenum pname, const GLint *params | finish | noext | | |
-| EVAS GL API | void | glTexGenxOES | GLenum coord, GLenum pname, GLfixed param | finish | noext | | |
-| EVAS GL API | void | glTexGenxvOES | GLenum coord, GLenum pname, const GLfixed *params | finish | noext | | |
-| EVAS GL API | void | glGetTexGenfvOES | GLenum coord, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glGetTexGenivOES | GLenum coord, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetTexGenxvOES | GLenum coord, GLenum pname, GLfixed *params | finish | noext | | |
+| EVAS GL | void | glTexGenfOES | GLenum coord, GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexGenfvOES | GLenum coord, GLenum pname, const GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexGeniOES | GLenum coord, GLenum pname, GLint param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexGenivOES | GLenum coord, GLenum pname, const GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexGenxOES | GLenum coord, GLenum pname, GLfixed param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexGenxvOES | GLenum coord, GLenum pname, const GLfixed *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexGenfvOES | GLenum coord, GLenum pname, GLfloat *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexGenivOES | GLenum coord, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexGenxvOES | GLenum coord, GLenum pname, GLfixed *params | finish | ext |  |  |  | | | | | |
 /* GL_OES_vertex_array_object */
-| EVAS GL API | void | glBindVertexArrayOES | GLuint array | finish | noext | | |
-| EVAS GL API | void | glDeleteVertexArraysOES | GLsizei n, const GLuint *arrays | finish | noext | | |
-| EVAS GL API | void | glGenVertexArraysOES | GLsizei n, GLuint *arrays | finish | noext | | |
-| EVAS GL API | GLboolean | glIsVertexArrayOES | GLuint array | finish | noext | | |
+| EVAS GL | void | glBindVertexArrayOES | GLuint array | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteVertexArraysOES | GLsizei n, const GLuint *arrays | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenVertexArraysOES | GLsizei n, GLuint *arrays | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsVertexArrayOES | GLuint array | finish | ext |  |  |  | | | | | |
 /* GL_APPLE_copy_texture_levels */
-| EVAS GL API | void | glCopyTextureLevelsAPPLE | GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount | finish | noext | | |
-| EVAS GL API | void | glRenderbufferStorageMultisampleAPPLE | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e | finish | noext | | |
-| EVAS GL API | void | glResolveMultisampleFramebufferAPPLE | void | finish | noext | | |
-| EVAS GL API | GLsync | glFenceSyncAPPLE | GLenum condition, GLbitfield flags | finish | noext | | |
-| EVAS GL API | GLboolean | glIsSyncAPPLE | GLsync sync | finish | noext | | |
-| EVAS GL API | void | glDeleteSyncAPPLE | GLsync sync | finish | noext | | |
-| EVAS GL API | GLenum | glClientWaitSyncAPPLE | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | noext | | |
-| EVAS GL API | void | glWaitSyncAPPLE | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | noext | | |
-| EVAS GL API | void | glGetInteger64vAPPLE | GLenum pname, EvasGLint64 *params | finish | noext | | |
-| EVAS GL API | void | glGetSyncivAPPLE | GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values | finish | noext | | |
+| EVAS GL | void | glCopyTextureLevelsAPPLE | GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRenderbufferStorageMultisampleAPPLE | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glResolveMultisampleFramebufferAPPLE | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLsync | glFenceSyncAPPLE | GLenum condition, GLbitfield flags | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsSyncAPPLE | GLsync sync | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteSyncAPPLE | GLsync sync | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLenum | glClientWaitSyncAPPLE | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glWaitSyncAPPLE | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetInteger64vAPPLE | GLenum pname, EvasGLint64 *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetSyncivAPPLE | GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values | finish | ext |  |  |  | | | | | |
 /* GL_EXT_map_buffer_range */
-| EVAS GL API | void * | glMapBufferRangeEXT | GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access | finish | noext | | |
-| EVAS GL API | void | glFlushMappedBufferRangeEXT | GLenum target, GLintptr offset, GLsizeiptr length | finish | noext | | |
+| EVAS GL | void * | glMapBufferRangeEXT | GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFlushMappedBufferRangeEXT | GLenum target, GLintptr offset, GLsizeiptr length | finish | ext |  |  |  | | | | | |
 /* GL_EXT_multisampled_render_to_texture */
-| EVAS GL API | void | glRenderbufferStorageMultisampleEXT | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e| finish | noext | | |
-| EVAS GL API | void | glFramebufferTexture2DMultisample | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | noext | | |
-| EVAS GL API | void | glFramebufferTexture2DMultisampleEXT | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | noext | | |
+| EVAS GL | void | glRenderbufferStorageMultisampleEXT | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture2DMultisampleEXT | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | ext |  |  |  | | | | | |
+
 /* GL_EXT_robustness */
-| EVAS GL API | GLenum | glGetGraphicsResetStatus | void | finish | noext | | |
-| EVAS GL API | GLenum | glGetGraphicsResetStatusEXT | void | finish | noext | | |
-| EVAS GL API | void | glReadnPixels | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data | finish | noext | | |
-| EVAS GL API | void | glReadnPixelsEXT | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data | finish | noext | | |
-| EVAS GL API | void | glGetnUniformfv | GLuint program, GLint location, GLsizei bufSize, float *params | finish | noext | | |
-| EVAS GL API | void | glGetnUniformfvEXT | GLuint program, GLint location, GLsizei bufSize, float *params | finish | noext | | |
-| EVAS GL API | void | glGetnUniformiv | GLuint program, GLint location, GLsizei bufSize, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetnUniformivEXT | GLuint program, GLint location, GLsizei bufSize, GLint *params | finish | noext | | |
+| EVAS GL | GLenum | glGetGraphicsResetStatusEXT | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glReadnPixelsEXT | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetnUniformfvEXT | GLuint program, GLint location, GLsizei bufSize, float *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetnUniformivEXT | GLuint program, GLint location, GLsizei bufSize, GLint *params | finish | ext |  |  |  | | | | | |
+
+
+
+
 /* GL_EXT_texture_storage */
-| EVAS GL API | void | glTexStorage1DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width | finish | noext | | |
-| EVAS GL API | void | glTexStorage2DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glTexStorage3DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | noext | | |
-| EVAS GL API | void | glTextureStorage1DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width | finish | noext | | |
-| EVAS GL API | void | glTextureStorage2DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glTextureStorage3DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | noext | | |
+| EVAS GL | void | glTexStorage1DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage2DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage3DEXT | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTextureStorage1DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTextureStorage2DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTextureStorage3DEXT | GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | ext |  |  |  | | | | | |
 /* GL_IMG_user_clip_plane */
-| EVAS GL API | void | glClipPlanefIMG | GLenum a, const GLfloat * b | finish | noext | | |
-| EVAS GL API | void | glClipPlanexIMG | GLenum a, const GLfixed * b | finish | noext | | |
+| EVAS GL | void | glClipPlanefIMG | GLenum a, const GLfloat * b | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClipPlanexIMG | GLenum a, const GLfixed * b | finish | ext |  |  |  | | | | | |
 /* GL_IMG_multisampled_render_to_texture */
-| EVAS GL API | void | glRenderbufferStorageMultisampleIMG | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e | flush | noext | | |
-| EVAS GL API | void | glFramebufferTexture2DMultisampleIMG | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | noext | | |
+| EVAS GL | void | glRenderbufferStorageMultisampleIMG | GLenum a, GLsizei b, GLenum c, GLsizei d, GLsizei e | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture2DMultisampleIMG | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | ext |  |  |  | | | | | |
 /* GL_QCOM_tiled_rendering */
-| EVAS GL API | void | glStartTilingQCOM | GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask | flush | noext | | |
-| EVAS GL API | void | glEndTilingQCOM | GLbitfield preserveMask | flush | noext | | |
+| EVAS | void | glActivateTile | GLuint a,GLuint b,GLuint c,GLuint d,GLuint e | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glStartTilingQCOM | GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glEndTilingQCOM | GLbitfield preserveMask | flush | ext |  |  |  | | | | | |
+
+| EVAS GL | void | glFramebufferTexture2DMultisample | GLenum a, GLenum b, GLenum c, GLuint d, GLint e, GLsizei f | flush | ext |  |  |  | | | | | |
+
 # OpenGL-ES 3.0
-| EVAS GL API | void | glBeginQuery | GLenum target, GLuint id | finish | noext | | |
-| EVAS GL API | void | glBeginTransformFeedback | GLenum primitiveMode | finish | noext | | |
-| EVAS GL API | void | glBindBufferBase | GLenum target, GLuint index, GLuint buffer | finish | noext | | |
-| EVAS GL API | void | glBindBufferRange | GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size | finish | noext | | |
-| EVAS GL API | void | glBindSampler | GLuint unit, GLuint sampler | finish | noext | | |
-| EVAS GL API | void | glBindTransformFeedback | GLenum target, GLuint id | finish | noext | | |
-| EVAS GL API | void | glBindVertexArray | GLuint array | finish | noext | | |
-| EVAS GL API | void | glBlitFramebuffer | GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter | finish | noext | | |
-| EVAS GL API | void | glClearBufferfi | GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil | finish | noext | | |
-| EVAS GL API | void | glClearBufferfv | GLenum buffer, GLint drawBuffer, const GLfloat * value | finish | noext | | |
-| EVAS GL API | void | glClearBufferiv | GLenum buffer, GLint drawBuffer, const GLint * value | finish | noext | | |
-| EVAS GL API | void | glClearBufferuiv | GLenum buffer, GLint drawBuffer, const GLuint * value | finish | noext | | |
-| EVAS GL API | GLenum | glClientWaitSync | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | noext | | |
-| EVAS GL API | void | glCompressedTexImage3D | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data | finish | noext | | |
-| EVAS GL API | void | glCompressedTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data | finish | noext | | |
-| EVAS GL API | void | glCopyBufferSubData | GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size | finish | noext | | |
-| EVAS GL API | void | glCopyTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glDeleteQueries | GLsizei n, const GLuint * ids | finish | noext | | |
-| EVAS GL API | void | glDeleteSamplers | GLsizei n, const GLuint * samplers | finish | noext | | |
-| EVAS GL API | void | glDeleteSync | GLsync sync | finish | noext | | |
-| EVAS GL API | void | glDeleteTransformFeedbacks | GLsizei n, const GLuint *ids | finish | noext | | |
-| EVAS GL API | void | glDeleteVertexArrays | GLsizei n, const GLuint *arrays | finish | noext | | |
-| EVAS GL API | void | glDrawArraysInstanced | GLenum mode, GLint first, GLsizei count, GLsizei primcount | finish | noext | | |
-| EVAS GL API | void | glDrawBuffers | GLsizei n, const GLenum *bufs | finish | noext | | |
-| EVAS GL API | void | glDrawElementsInstanced | GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount | finish | noext | | |
-| EVAS GL API | void | glDrawRangeElements | GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices | finish | noext | | |
-| EVAS GL API | void | glEndQuery | GLenum target | finish | noext | | |
-| EVAS GL API | void | glEndTransformFeedback | void | finish | noext | | |
-| EVAS GL API | GLsync | glFenceSync | GLenum condition, GLbitfield flags | finish | noext | | |
-| EVAS GL API | GLsync | glFlushMappedBufferRange | GLenum target, GLintptr offset, GLsizeiptr length | finish | noext | | |
-| EVAS GL API | void | glFramebufferTextureLayer | GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer | finish | noext | | |
-| EVAS GL API | void | glGenQueries | GLsizei n, GLuint * ids | finish | noext | | |
-| EVAS GL API | void | glGenSamplers | GLsizei n, GLuint *samplers | finish | noext | | |
-| EVAS GL API | void | glGenTransformFeedbacks | GLsizei n, GLuint *ids | finish | noext | | |
-| EVAS GL API | void | glGenVertexArrays | GLsizei n, GLuint *arrays | finish | noext | | |
-| EVAS GL API | void | glGetActiveUniformBlockiv | GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetActiveUniformBlockName | GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName | finish | noext | | |
-| EVAS GL API | void | glGetActiveUniformsiv | GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetBufferParameteri64v | GLenum target, GLenum value, EvasGLint64 * data | finish | noext | | |
-| EVAS GL API | void | glGetBufferPointerv | GLenum target, GLenum pname, GLvoid ** params | finish | noext | | |
-| EVAS GL API | GLint | glGetFragDataLocation | GLuint program, const char * name | finish | noext | | |
-| EVAS GL API | void | glGetInteger64i_v | GLenum target, GLuint index, EvasGLint64 * data | finish | noext | | |
-| EVAS GL API | void | glGetInteger64v | GLenum pname, EvasGLint64 * data | finish | noext | | |
-| EVAS GL API | void | glGetIntegeri_v | GLenum target, GLuint index, GLint * data | finish | noext | | |
-| EVAS GL API | void | glGetInternalformativ | GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetProgramBinary | GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary | finish | noext | | |
-| EVAS GL API | void | glGetQueryiv | GLenum target, GLenum pname, GLint * params | finish | noext | | |
-| EVAS GL API | void | glGetQueryObjectuiv | GLuint id, GLenum pname, GLuint * params | finish | noext | | |
-| EVAS GL API | void | glGetSamplerParameterfv | GLuint sampler, GLenum pname, GLfloat * params | finish | noext | | |
-| EVAS GL API | void | glGetSamplerParameteriv | GLuint sampler, GLenum pname, GLint * params | finish | noext | | |
-| EVAS GL API | const GLubyte * | glGetStringi | GLenum name, GLuint index | finish | noext | | |
-| EVAS GL API | void | glGetSynciv | GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values | finish | noext | | |
-| EVAS GL API | void | glGetTransformFeedbackVarying | GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name | finish | noext | | |
-| EVAS GL API | GLuint | glGetUniformBlockIndex | GLuint program, const GLchar *uniformBlockName | finish | noext | | |
-| EVAS GL API | void | glGetUniformIndices | GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices | finish | noext | | |
-| EVAS GL API | void | glGetUniformuiv | GLuint program, GLint location, GLuint* params | finish | noext | | |
-| EVAS GL API | void | glGetVertexAttribIiv | GLuint index, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetVertexAttribIuiv | GLuint index, GLenum pname, GLuint *params | finish | noext | | |
-| EVAS GL API | void | glInvalidateFramebuffer | GLenum target, GLsizei numAttachments, const GLenum *attachments | finish | noext | | |
-| EVAS GL API | void | glInvalidateSubFramebuffer | GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | GLboolean | glIsQuery | GLuint id | finish | noext | | |
-| EVAS GL API | GLboolean | glIsSampler | GLuint id | finish | noext | | |
-| EVAS GL API | GLboolean | glIsSync | GLsync sync | finish | noext | | |
-| EVAS GL API | GLboolean | glIsTransformFeedback | GLuint id | finish | noext | | |
-| EVAS GL API | GLboolean | glIsVertexArray | GLuint array | finish | noext | | |
-| EVAS GL API | void * | glMapBufferRange | GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access | finish | noext | | |
-| EVAS GL API | void | glPauseTransformFeedback | void | finish | noext | | |
-| EVAS GL API | void | glProgramBinary | GLuint program, GLenum binaryFormat, const void *binary, GLsizei length | flush | noext | _mp_default, length, binary | |
-| EVAS GL API | void | glProgramParameteri | GLuint program, GLenum pname, GLint value | finish | noext | | |
-| EVAS GL API | void | glReadBuffer | GLenum src | finish | noext | | |
-| EVAS GL API | void | glRenderbufferStorageMultisample | GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glResumeTransformFeedback | void | finish | noext | | |
-| EVAS GL API | void | glSamplerParameterf | GLuint sampler, GLenum pname, GLfloat param | finish | noext | | |
-| EVAS GL API | void | glSamplerParameterfv | GLuint sampler, GLenum pname, const GLfloat * params | finish | noext | | |
-| EVAS GL API | void | glSamplerParameteri | GLuint sampler, GLenum pname, GLint param | finish | noext | | |
-| EVAS GL API | void | glSamplerParameteriv | GLuint sampler, GLenum pname, const GLint * params | finish | noext | | |
-| EVAS GL API | void | glTexImage3D | GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data | finish | noext | | |
-| EVAS GL API | void | glTexStorage2D | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | noext | | |
-| EVAS GL API | void | glTexStorage3D | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | noext | | |
-| EVAS GL API | void | glTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data | finish | noext | | |
-| EVAS GL API | void | glTransformFeedbackVaryings | GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode | finish | noext | | |
-| EVAS GL API | void | glUniform1ui | GLint location, GLuint v0 | finish | noext | | |
-| EVAS GL API | void | glUniform1uiv | GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glUniform2ui | GLint location, GLuint v0, GLuint v1 | finish | noext | | |
-| EVAS GL API | void | glUniform2uiv | GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glUniform3ui | GLint location, GLuint v0, GLuint v1, GLuint v2 | finish | noext | | |
-| EVAS GL API | void | glUniform3uiv | GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glUniform4ui | GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | noext | | |
-| EVAS GL API | void | glUniform4uiv | GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glUniformBlockBinding | GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix2x3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix3x2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix2x4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix4x2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix3x4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glUniformMatrix4x3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | GLboolean | glUnmapBuffer | GLenum target | finish | noext | | |
-| EVAS GL API | void | glVertexAttribDivisor | GLuint index, GLuint divisor | finish | noext | | |
-| EVAS GL API | void | glVertexAttribI4i | GLuint index, GLint v0, GLint v1, GLint v2, GLint v3 | finish | noext | | |
-| EVAS GL API | void | glVertexAttribI4iv | GLuint index, const GLint *v | finish | noext | | |
-| EVAS GL API | void | glVertexAttribI4ui | GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | noext | | |
-| EVAS GL API | void | glVertexAttribI4uiv | GLuint index, const GLuint *v | finish | noext | | |
-| EVAS GL API | void | glVertexAttribIPointer | GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | noext | | |
-| EVAS GL API | void | glWaitSync | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | noext | | |
+| EVAS GL | void | glBeginQuery | GLenum target, GLuint id | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBeginTransformFeedback | GLenum primitiveMode | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindBufferBase | GLenum target, GLuint index, GLuint buffer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindBufferRange | GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindSampler | GLuint unit, GLuint sampler | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindTransformFeedback | GLenum target, GLuint id | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindVertexArray | GLuint array | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBlitFramebuffer | GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearBufferfi | GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearBufferfv | GLenum buffer, GLint drawBuffer, const GLfloat * value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearBufferiv | GLenum buffer, GLint drawBuffer, const GLint * value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glClearBufferuiv | GLenum buffer, GLint drawBuffer, const GLuint * value | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLenum | glClientWaitSync | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCompressedTexImage3D | GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCompressedTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCopyBufferSubData | GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glCopyTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteQueries | GLsizei n, const GLuint * ids | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteSamplers | GLsizei n, const GLuint * samplers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteSync | GLsync sync | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteTransformFeedbacks | GLsizei n, const GLuint *ids | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteVertexArrays | GLsizei n, const GLuint *arrays | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawArraysInstanced | GLenum mode, GLint first, GLsizei count, GLsizei primcount | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawBuffers | GLsizei n, const GLenum *bufs | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawElementsInstanced | GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawRangeElements | GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEndQuery | GLenum target | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glEndTransformFeedback | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLsync | glFenceSync | GLenum condition, GLbitfield flags | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLsync | glFlushMappedBufferRange | GLenum target, GLintptr offset, GLsizeiptr length | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTextureLayer | GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenQueries | GLsizei n, GLuint * ids | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenSamplers | GLsizei n, GLuint *samplers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenTransformFeedbacks | GLsizei n, GLuint *ids | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenVertexArrays | GLsizei n, GLuint *arrays | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetActiveUniformBlockiv | GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetActiveUniformBlockName | GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetActiveUniformsiv | GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetBufferParameteri64v | GLenum target, GLenum value, EvasGLint64 * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetBufferPointerv | GLenum target, GLenum pname, GLvoid ** params | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLint | glGetFragDataLocation | GLuint program, const char * name | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetInteger64i_v | GLenum target, GLuint index, EvasGLint64 * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetInteger64v | GLenum pname, EvasGLint64 * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetIntegeri_v | GLenum target, GLuint index, GLint * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetInternalformativ | GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramBinary | GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetQueryiv | GLenum target, GLenum pname, GLint * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetQueryObjectuiv | GLuint id, GLenum pname, GLuint * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetSamplerParameterfv | GLuint sampler, GLenum pname, GLfloat * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetSamplerParameteriv | GLuint sampler, GLenum pname, GLint * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | const GLubyte * | glGetStringi | GLenum name, GLuint index | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetSynciv | GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTransformFeedbackVarying | GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLuint | glGetUniformBlockIndex | GLuint program, const GLchar *uniformBlockName | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetUniformIndices | GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetUniformuiv | GLuint program, GLint location, GLuint* params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetVertexAttribIiv | GLuint index, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetVertexAttribIuiv | GLuint index, GLenum pname, GLuint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glInvalidateFramebuffer | GLenum target, GLsizei numAttachments, const GLenum *attachments | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glInvalidateSubFramebuffer | GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsQuery | GLuint id | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsSampler | GLuint id | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsSync | GLsync sync | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsTransformFeedback | GLuint id | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsVertexArray | GLuint array | finish | ext |  |  |  | | | | | |
+| EVAS GL | void * | glMapBufferRange | GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glPauseTransformFeedback | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramBinary | GLuint program, GLenum binaryFormat, const void *binary, GLsizei length | flush | ext | _mp_default, length, binary |  |  | | | | | |
+| EVAS GL | void | glProgramParameteri | GLuint program, GLenum pname, GLint value | flush | ext |  |  |  | | | | | |
+| EVAS GL | void | glReadBuffer | GLenum src | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glRenderbufferStorageMultisample | GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glResumeTransformFeedback | void | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSamplerParameterf | GLuint sampler, GLenum pname, GLfloat param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSamplerParameterfv | GLuint sampler, GLenum pname, const GLfloat * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSamplerParameteri | GLuint sampler, GLenum pname, GLint param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSamplerParameteriv | GLuint sampler, GLenum pname, const GLint * params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexImage3D | GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage2D | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage3D | GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexSubImage3D | GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTransformFeedbackVaryings | GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform1ui | GLint location, GLuint v0 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform1uiv | GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform2ui | GLint location, GLuint v0, GLuint v1 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform2uiv | GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform3ui | GLint location, GLuint v0, GLuint v1, GLuint v2 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform3uiv | GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform4ui | GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniform4uiv | GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformBlockBinding | GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix2x3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix3x2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix2x4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix4x2fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix3x4fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUniformMatrix4x3fv | GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glUnmapBuffer | GLenum target | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribDivisor | GLuint index, GLuint divisor | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribI4i | GLuint index, GLint v0, GLint v1, GLint v2, GLint v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribI4iv | GLuint index, const GLint *v | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribI4ui | GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribI4uiv | GLuint index, const GLuint *v | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribIPointer | GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glWaitSync | GLsync sync, GLbitfield flags, EvasGLuint64 timeout | finish | ext |  |  |  | | | | | |
+
 # OpenGL-ES 3.1
-| EVAS GL API | void | glDispatchCompute | GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z | finish | noext | | |
-| EVAS GL API | void | glDispatchComputeIndirect | GLintptr indirect | finish | noext | | |
-| EVAS GL API | void | glDrawArraysIndirect | GLenum mode, const void *indirect | finish | noext | | |
-| EVAS GL API | void | glDrawElementsIndirect | GLenum mode, GLenum type, const void *indirect | finish | noext | | |
-| EVAS GL API | void | glFramebufferParameteri | GLenum target, GLenum pname, GLint param | finish | noext | | |
-| EVAS GL API | void | glGetFramebufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetProgramInterfaceiv | GLuint program, GLenum programInterface, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | GLuint | glGetProgramResourceIndex | GLuint program, GLenum programInterface, const GLchar *name | finish | noext | | |
-| EVAS GL API | void | glGetProgramResourceName | GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name | finish | noext | | |
-| EVAS GL API | void | glGetProgramResourceiv | GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params | finish | noext | | |
-| EVAS GL API | GLint | glGetProgramResourceLocation | GLuint program, GLenum programInterface, const GLchar *name | finish | noext | | |
-| EVAS GL API | void | glUseProgramStages | GLuint pipeline, GLbitfield stages, GLuint program | finish | noext | | |
-| EVAS GL API | void | glActiveShaderProgram | GLuint pipeline, GLuint program | finish | noext | | |
-| EVAS GL API | GLuint | glCreateShaderProgramv | GLenum type, GLsizei count, const GLchar *const*strings | finish | noext | | |
-| EVAS GL API | void | glBindProgramPipeline | GLuint pipeline | finish | noext | | |
-| EVAS GL API | void | glDeleteProgramPipelines | GLsizei n, const GLuint *pipelines | finish | noext | | |
-| EVAS GL API | void | glGenProgramPipelines | GLsizei n, GLuint *pipelines | finish | noext | | |
-| EVAS GL API | GLboolean | glIsProgramPipeline | GLuint pipeline | finish | noext | | |
-| EVAS GL API | void | glGetProgramPipelineiv | GLuint pipeline, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1i | GLuint program, GLint location, GLint v0 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2i | GLuint program, GLint location, GLint v0, GLint v1 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3i | GLuint program, GLint location, GLint v0, GLint v1, GLint v2 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4i | GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1ui | GLuint program, GLint location, GLuint v0 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2ui | GLuint program, GLint location, GLuint v0, GLuint v1 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3ui | GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4ui | GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1f | GLuint program, GLint location, GLfloat v0 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2f | GLuint program, GLint location, GLfloat v0, GLfloat v1 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3f | GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4f | GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3 | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform1fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform2fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform3fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniform4fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix2x3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix3x2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix2x4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix4x2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix3x4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glProgramUniformMatrix4x3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | noext | | |
-| EVAS GL API | void | glValidateProgramPipeline | GLuint pipeline | finish | noext | | |
-| EVAS GL API | void | glGetProgramPipelineInfoLog | GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog | finish | noext | | |
-| EVAS GL API | void | glBindImageTexture | GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format | finish | noext | | |
-| EVAS GL API | void | glGetBooleani_v | GLenum target, GLuint index, GLboolean *data | finish | noext | | |
-| EVAS GL API | void | glMemoryBarrier | GLbitfield barriers | finish | noext | | |
-| EVAS GL API | void | glMemoryBarrierByRegion | GLbitfield barriers | finish | noext | | |
-| EVAS GL API | void | glTexStorage2DMultisample | GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations | finish | noext | | |
-| EVAS GL API | void | glGetMultisamplefv | GLenum pname, GLuint index, GLfloat *val | finish | noext | | |
-| EVAS GL API | void | glSampleMaski | GLuint maskNumber, GLbitfield mask | finish | noext | | |
-| EVAS GL API | void | glGetTexLevelParameteriv | GLenum target, GLint level, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetTexLevelParameterfv | GLenum target, GLint level, GLenum pname, GLfloat *params | finish | noext | | |
-| EVAS GL API | void | glBindVertexBuffer | GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride | finish | noext | | |
-| EVAS GL API | void | glVertexAttribFormat | GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset | finish | noext | | |
-| EVAS GL API | void | glVertexAttribIFormat | GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset | finish | noext | | |
-| EVAS GL API | void | glVertexAttribBinding | GLuint attribindex, GLuint bindingindex | finish | noext | | |
-| EVAS GL API | void | glVertexBindingDivisor | GLuint bindingindex, GLuint divisor | finish | noext | | |
+| EVAS GL | void | glDispatchCompute | GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDispatchComputeIndirect | GLintptr indirect | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawArraysIndirect | GLenum mode, const void *indirect | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDrawElementsIndirect | GLenum mode, GLenum type, const void *indirect | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferParameteri | GLenum target, GLenum pname, GLint param | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetFramebufferParameteriv | GLenum target, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramInterfaceiv | GLuint program, GLenum programInterface, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLuint | glGetProgramResourceIndex | GLuint program, GLenum programInterface, const GLchar *name | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramResourceName | GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramResourceiv | GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLint | glGetProgramResourceLocation | GLuint program, GLenum programInterface, const GLchar *name | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glUseProgramStages | GLuint pipeline, GLbitfield stages, GLuint program | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glActiveShaderProgram | GLuint pipeline, GLuint program | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLuint | glCreateShaderProgramv | GLenum type, GLsizei count, const GLchar *const*strings | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindProgramPipeline | GLuint pipeline | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glDeleteProgramPipelines | GLsizei n, const GLuint *pipelines | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGenProgramPipelines | GLsizei n, GLuint *pipelines | finish | ext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsProgramPipeline | GLuint pipeline | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramPipelineiv | GLuint pipeline, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1i | GLuint program, GLint location, GLint v0 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2i | GLuint program, GLint location, GLint v0, GLint v1 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3i | GLuint program, GLint location, GLint v0, GLint v1, GLint v2 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4i | GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1ui | GLuint program, GLint location, GLuint v0 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2ui | GLuint program, GLint location, GLuint v0, GLuint v1 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3ui | GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4ui | GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1f | GLuint program, GLint location, GLfloat v0 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2f | GLuint program, GLint location, GLfloat v0, GLfloat v1 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3f | GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4f | GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3 | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4iv | GLuint program, GLint location, GLsizei count, const GLint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4uiv | GLuint program, GLint location, GLsizei count, const GLuint *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform1fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform2fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform3fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniform4fv | GLuint program, GLint location, GLsizei count, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix2x3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix3x2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix2x4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix4x2fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix3x4fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glProgramUniformMatrix4x3fv | GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glValidateProgramPipeline | GLuint pipeline | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetProgramPipelineInfoLog | GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glBindImageTexture | GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetBooleani_v | GLenum target, GLuint index, GLboolean *data | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMemoryBarrier | GLbitfield barriers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glMemoryBarrierByRegion | GLbitfield barriers | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage2DMultisample | GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetMultisamplefv | GLenum pname, GLuint index, GLfloat *val | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glSampleMaski | GLuint maskNumber, GLbitfield mask | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexLevelParameteriv | GLenum target, GLint level, GLenum pname, GLint *params | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexLevelParameterfv | GLenum target, GLint level, GLenum pname, GLfloat *params | finish | ext | GL |  |  | | | | | |
+| EVAS GL | void | glBindVertexBuffer | GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribFormat | GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribIFormat | GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexAttribBinding | GLuint attribindex, GLuint bindingindex | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | glVertexBindingDivisor | GLuint bindingindex, GLuint divisor | finish | ext |  |  |  | | | | | |
 # OpenGL-ES 3.2
-| EVAS GL API | void |  glBlendBarrier | void | finish | noext | | |
-| EVAS GL API | void |  glCopyImageSubData |  GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth | finish | noext | | |
-| EVAS GL API | void | glDebugMessageControl | GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled | finish | noext | | |
-| EVAS GL API | void | glDebugMessageInsert | GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf | finish | noext | | |
-| EVAS GL API | void | glDebugMessageCallback | GLDEBUGPROC callback, const void *userParam | finish | noext | | |
-| EVAS GL API | GLuint | glGetDebugMessageLog | GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog | finish | noext | | |
-| EVAS GL API | void | glPushDebugGroup | GLenum source, GLuint id, GLsizei length, const GLchar *message | finish | noext | | |
-| EVAS GL API | void | glPopDebugGroup | void | finish | noext | | |
-| EVAS GL API | void | glObjectLabel | GLenum identifier, GLuint name, GLsizei length, const GLchar *label | finish | noext | | |
-| EVAS GL API | void | glGetObjectLabel | GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label | finish | noext | | |
-| EVAS GL API | void | glObjectPtrLabel | const void *ptr, GLsizei length, const GLchar *label | finish | noext | | |
-| EVAS GL API | void | glGetObjectPtrLabel | const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label | finish | noext | | |
-#| EVAS GL API | void | glGetPointerv | GLenum pname, void **params | finish | noext | | |
-| EVAS GL API | void | glEnablei | GLenum target, GLuint index | finish | noext | | |
-| EVAS GL API | void | glDisablei | GLenum target, GLuint index | finish | noext | | |
-| EVAS GL API | void | glBlendEquationi | GLuint buf, GLenum mode | finish | noext | | |
-| EVAS GL API | void | glBlendEquationSeparatei | GLuint buf, GLenum modeRGB, GLenum modeAlpha | finish | noext | | |
-| EVAS GL API | void | glBlendFunci | GLuint buf, GLenum src, GLenum dst | finish | noext | | |
-| EVAS GL API | void | glBlendFuncSeparatei | GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | finish | noext | | |
-| EVAS GL API | void | glColorMaski | GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a | finish | noext | | |
-| EVAS GL API | GLboolean | glIsEnabledi | GLenum target, GLuint index | finish | noext | | |
-| EVAS GL API | void | glDrawElementsBaseVertex | GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex | finish | noext | | |
-| EVAS GL API | void | glDrawRangeElementsBaseVertex | GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex | finish | noext | | |
-| EVAS GL API | void | glDrawElementsInstancedBaseVertex | GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex | finish | noext | | |
-| EVAS GL API | void | glFramebufferTexture | GLenum target, GLenum attachment, GLuint texture, GLint level | finish | noext | | |
-| EVAS GL API | void | glPrimitiveBoundingBox | GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW | finish | noext | | |
-#| EVAS GL API | GLenum | glGetGraphicsResetStatus | void | finish | noext | | |
-#| EVAS GL API | void | glReadnPixels | GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data | finish | noext | | |
-#| EVAS GL API | void | glGetnUniformfv | GLuint program, GLint location, GLsizei bufSize, GLfloat *params | finish | noext | | |
-#| EVAS GL API | void | glGetnUniformiv | GLuint program, GLint location, GLsizei bufSize, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetnUniformuiv | GLuint program, GLint location, GLsizei bufSize, GLuint *params | finish | noext | | |
-| EVAS GL API | void | glMinSampleShading | GLfloat value | finish | noext | | |
-| EVAS GL API | void | glPatchParameteri | GLenum pname, GLint value | finish | noext | | |
-| EVAS GL API | void | glTexParameterIiv | GLenum target, GLenum pname, const GLint *params | finish | noext | | |
-| EVAS GL API | void | glTexParameterIuiv | GLenum target, GLenum pname, const GLuint *params | finish | noext | | |
-| EVAS GL API | void | glGetTexParameterIiv | GLenum target, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetTexParameterIuiv | GLenum target, GLenum pname, GLuint *params | finish | noext | | |
-| EVAS GL API | void | glSamplerParameterIiv | GLuint sampler, GLenum pname, const GLint *param | finish | noext | | |
-| EVAS GL API | void | glSamplerParameterIuiv | GLuint sampler, GLenum pname, const GLuint *param | finish | noext | | |
-| EVAS GL API | void | glGetSamplerParameterIiv | GLuint sampler, GLenum pname, GLint *params | finish | noext | | |
-| EVAS GL API | void | glGetSamplerParameterIuiv | GLuint sampler, GLenum pname, GLuint *params | finish | noext | | |
-| EVAS GL API | void | glTexBuffer | GLenum target, GLenum internalformat, GLuint buffer | finish | noext | | |
-| EVAS GL API | void | glTexBufferRange | GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size | finish | noext | | |
-| EVAS GL API | void | glTexStorage3DMultisample | GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations | finish | noext | | |
-###
-| EVAS GL API | void | glEGLImageTargetTexture2DOES | GLenum target,void *image | finish | ext | | |
-| EVAS GL API | void | glEGLImageTargetRenderbufferStorageOES | GLenum target, void *image | flush | ext | | |
+| EVAS GL | void |  glBlendBarrier |  void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void |  glCopyImageSubData |  GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDebugMessageControl |  GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDebugMessageInsert |  GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDebugMessageCallback |  GLDEBUGPROC callback, const void *userParam | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLuint | glGetDebugMessageLog |  GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glPushDebugGroup |  GLenum source, GLuint id, GLsizei length, const GLchar *message | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glPopDebugGroup |  void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glObjectLabel |  GLenum identifier, GLuint name, GLsizei length, const GLchar *label | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetObjectLabel |  GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glObjectPtrLabel |  const void *ptr, GLsizei length, const GLchar *label | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetObjectPtrLabel |  const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label | finish | noext |  |  |  | | | | | |
+#| EVAS GL | void | glGetPointerv |  GLenum pname, void **params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glEnablei |  GLenum target, GLuint index | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDisablei |  GLenum target, GLuint index | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendEquationi |  GLuint buf, GLenum mode | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendEquationSeparatei |  GLuint buf, GLenum modeRGB, GLenum modeAlpha | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendFunci |  GLuint buf, GLenum src, GLenum dst | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glBlendFuncSeparatei |  GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glColorMaski |  GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLboolean | glIsEnabledi |  GLenum target, GLuint index | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDrawElementsBaseVertex | GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDrawRangeElementsBaseVertex |  GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glDrawElementsInstancedBaseVertex |  GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glFramebufferTexture |  GLenum target, GLenum attachment, GLuint texture, GLint level | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glPrimitiveBoundingBox |  GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW | finish | noext |  |  |  | | | | | |
+| EVAS GL | GLenum | glGetGraphicsResetStatus |  void | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glReadnPixels |  GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetnUniformfv |  GLuint program, GLint location, GLsizei bufSize, GLfloat *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetnUniformiv |  GLuint program, GLint location, GLsizei bufSize, GLint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetnUniformuiv |  GLuint program, GLint location, GLsizei bufSize, GLuint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glMinSampleShading |  GLfloat value | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glPatchParameteri |  GLenum pname, GLint value | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterIiv |  GLenum target, GLenum pname, const GLint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexParameterIuiv |  GLenum target, GLenum pname, const GLuint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameterIiv |  GLenum target, GLenum pname, GLint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetTexParameterIuiv |  GLenum target, GLenum pname, GLuint *params | finish | noext |   |  |  | | | | | |
+| EVAS GL | void | glSamplerParameterIiv |  GLuint sampler, GLenum pname, const GLint *param | finish | noext |   |  |  | | | | | |
+| EVAS GL | void | glSamplerParameterIuiv |  GLuint sampler, GLenum pname, const GLuint *param | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetSamplerParameterIiv |  GLuint sampler, GLenum pname, GLint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glGetSamplerParameterIuiv |  GLuint sampler, GLenum pname, GLuint *params | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexBuffer |  GLenum target, GLenum internalformat, GLuint buffer | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexBufferRange |  GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size | finish | noext |  |  |  | | | | | |
+| EVAS GL | void | glTexStorage3DMultisample |  GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations | finish | noext |  |  |  | | | | | |
+
+### EGL
+| INTERNAL | void | glEGLImageTargetTexture2DOES | GLenum target,void *image | finish | ext |  |  |  | | | | | |
+| INTERNAL | void | glEGLImageTargetRenderbufferStorageOES | GLenum target, void *image | flush | ext |  |  |  | | | | | |
+
 ### Evas GL
-| EVAS GL API | void | _evgl_glDiscardFramebufferEXT | GLenum target, GLsizei numAttachments, const GLenum* attachments | finish | ext | | |
-| EVAS GL API | void | _evgl_glEvasGLImageTargetTexture2D | GLenum target, EvasGLImage image | finish | ext | | |
-| EVAS GL API | void | _evgl_glEvasGLImageTargetRenderbufferStorage | GLenum target, EvasGLImage image | finish | ext | | |
-| EVAS GL API | EvasGLImage | _evgl_evasglCreateImage | int target, void* buffer, const int *attrib_list | finish | ext | | |
-| EVAS GL API | void | _evgl_evasglDestroyImage | EvasGLImage image | finish | ext | | |
-| EVAS GL API | EvasGLImage | _evgl_evasglCreateImageForContext | Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list | finish | ext | | |
-| EVAS GL API | EvasGLSync | _evgl_evasglCreateSync | Evas_GL *evas_gl, unsigned int type, const int *attrib_list | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglDestroySync | Evas_GL *evas_gl, EvasGLSync sync | finish | ext | | |
-| EVAS GL API | int | _evgl_evasglClientWaitSync | Evas_GL *evas_gl, EvasGLSync sync | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglGetSyncAttrib | Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglSignalSync | Evas_GL *evas_gl, EvasGLSync sync, unsigned mode | finish | ext | | |
-| EVAS GL API | int | _evgl_evasglWaitSync | Evas_GL *evas_gl, EvasGLSync sync, int flags | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglBindWaylandDisplay | Evas_GL *evas_gl, void *wl_display | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglUnbindWaylandDisplay | Evas_GL *evas_gl, void *wl_display | finish | ext | | |
-| EVAS GL API | Eina_Bool | _evgl_evasglQueryWaylandBuffer | Evas_GL *evas_gl, void *buffer, int attribute, int *value | finish | ext | | |
+##| EVAS GL | void | glEvasGLImageTargetTexture2D | GLenum target, EvasGLImage image | finish | ext |  |  |  | | | | | |
+##| EVAS GL | void | glEvasGLImageTargetRenderbufferStorage | GLenum target, EvasGLImage image | finish | ext |  |  |  | | | | | |
+| EVAS GL | EvasGLImage | evasglCreateImage | int target, void* buffer, const int *attrib_list | finish | ext |  |  |  | | | | | |
+| EVAS GL | void | evasglDestroyImage | EvasGLImage image | finish | ext |  |  |  | | | | | |
+| EVAS GL | EvasGLImage | evasglCreateImageForContext | Evas_GL *evas_gl, Evas_GL_Context *ctx, int target, void* buffer, const int *attrib_list | finish | ext |  |  |  | | | | | |
+| EVAS GL | EvasGLSync | evasglCreateSync | Evas_GL *evas_gl, unsigned int type, const int *attrib_list | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglDestroySync | Evas_GL *evas_gl, EvasGLSync sync | finish | ext |  |  |  | | | | | |
+| EVAS GL | int | evasglClientWaitSync | Evas_GL *evas_gl, EvasGLSync sync, int flags, EvasGLTime timeout | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglGetSyncAttrib | Evas_GL *evas_gl, EvasGLSync sync, int attribute, int *value | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglSignalSync | Evas_GL *evas_gl, EvasGLSync sync, unsigned mode | finish | ext |  |  |  | | | | | |
+| EVAS GL | int | evasglWaitSync | Evas_GL *evas_gl, EvasGLSync sync, int flags | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglBindWaylandDisplay | Evas_GL *evas_gl, void *wl_display | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglUnbindWaylandDisplay | Evas_GL *evas_gl, void *wl_display | finish | ext |  |  |  | | | | | |
+| EVAS GL | Eina_Bool | evasglQueryWaylandBuffer | Evas_GL *evas_gl, void *buffer, int attribute, int *value | finish | ext |  |  |  | | | | | |