[evas_thread_render] enhancement render thread. 45/125645/4 accepted/tizen/unified/20170426.061819 submit/tizen/20170425.111935
authorJoogab Yun <joogab.yun@samsung.com>
Tue, 18 Apr 2017 07:46:39 +0000 (16:46 +0900)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Mon, 24 Apr 2017 05:14:59 +0000 (05:14 +0000)
 1. Apply async finish mode
 2. change the finish and flush mode for some egl/gl calls

Change-Id: Ia0f7178212e23d22897215bb7db17a7ade999660

src/lib/evas/common/evas_thread_render.c
src/lib/evas/include/evas_common_private.h
src/modules/evas/engines/gl_common/evas_gl_thread_egl.c
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_api_generated.c
src/modules/evas/engines/gl_common/evas_gl_thread_evgl_generated.c
src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c
src/utils/evas/gl_api_def.txt

index 92a59e3..1f473cc 100644 (file)
@@ -43,7 +43,7 @@ _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 do_finish)
+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_Command *cmd;
   void *ref;
@@ -56,7 +56,7 @@ evas_thread_queue_append(Evas_Thread *ev_thread, Evas_Thread_Command_Cb cb, void
       cmd->cb = cb;
       cmd->data = data;
 
-      if (do_finish)
+        if (need_finish)
         cmd->finish = EINA_TRUE;
       else
         cmd->finish = EINA_FALSE;
@@ -90,13 +90,13 @@ 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);
+   evas_thread_queue_append(&evas_thread_software, cb, data, EINA_FALSE, EINA_FALSE, EINA_FALSE);
 }
 
 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);
+   evas_thread_queue_append(&evas_thread_software, cb, data, EINA_TRUE, EINA_FALSE, EINA_FALSE);
 }
 
 EAPI void
@@ -115,11 +115,13 @@ evas_gl_thread_cmd_enqueue(int thread_type, Evas_Thread_Command_Cb cb, void *dat
     }
 
   if (thread_mode == EVAS_GL_THREAD_MODE_ENQUEUE)
-    evas_thread_queue_append(ev_thread, cb, data, EINA_FALSE, EINA_FALSE);
+     evas_thread_queue_append(ev_thread, cb, data, 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);
+     evas_thread_queue_append(ev_thread, cb, data, 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);
+     evas_thread_queue_append(ev_thread, cb, data, 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);
   else
     {
       ERR("GL thread mode is invalid");
@@ -130,6 +132,41 @@ out:
   return;
 }
 
+EAPI void
+evas_gl_thread_cmd_wait(int thread_type, void *data, Eina_Bool *finished_ptr)
+{
+   Evas_Thread *ev_thread = NULL;
+
+   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;
+   else
+     {
+        ERR("GL thread type is invalid");
+        goto out;
+     }
+
+   while (!(*finished_ptr))
+     {
+        void *finish_ref;
+        Evas_Thread_Finish_Reply *rep;
+
+        rep = eina_thread_queue_wait(ev_thread->thread_queue_finish, &finish_ref);
+        if (rep && rep->data == data)
+          {
+             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);
+     }
+
+out:
+     return;
+}
+
 EAPI Eina_Thread
 evas_gl_thread_get(int thread_type)
 {
@@ -229,12 +266,12 @@ evas_thread_init(Evas_Thread *ev_thread, const char *thread_name)
 
   return EINA_TRUE;
 
-  fail_on_thread_creation:
+fail_on_thread_creation:
   ev_thread->worker = 0;
   eina_thread_queue_free(ev_thread->thread_queue_finish);
-  fail_on_thread_queue_finish_creation:
+fail_on_thread_queue_finish_creation:
   eina_thread_queue_free(ev_thread->thread_queue_command);
-  fail_on_thread_queue_command_creation:
+fail_on_thread_queue_command_creation:
   ev_thread->exit_thread = EINA_TRUE;
   ev_thread->exited = 1;
   return EINA_FALSE;
index 643a5bb..30c9f87 100644 (file)
@@ -1315,6 +1315,7 @@ void              evas_all_sync(void);
 #define EVAS_GL_THREAD_MODE_FINISH   0
 #define EVAS_GL_THREAD_MODE_FLUSH    1
 #define EVAS_GL_THREAD_MODE_ENQUEUE  2
+#define EVAS_GL_THREAD_MODE_ASYNC_FINISH   3
 
 EAPI int          evas_threads_sw_init(void);
 EAPI int          evas_threads_gl_init(void);
@@ -1323,6 +1324,7 @@ 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_wait(int thread_type, void *data, Eina_Bool *finished_ptr);
 EAPI Eina_Thread  evas_gl_thread_get(int thread_type);
 
 typedef enum _Evas_Render_Mode
index 2f9ef2b..e971007 100644 (file)
@@ -389,6 +389,7 @@ typedef struct
    EGLBoolean return_value;
    EGLDisplay dpy;
    EGLSurface surface;
+   int command_allocated;
 } Evas_Thread_Command_eglSwapBuffers;
 
 static void
@@ -398,6 +399,9 @@ _gl_thread_eglSwapBuffers(void *data)
 
    thread_data->return_value = eglSwapBuffers(thread_data->dpy,
                                               thread_data->surface);
+
+   if (thread_data->command_allocated)
+     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI EGLBoolean
@@ -406,17 +410,36 @@ eglSwapBuffers_thread_cmd(EGLDisplay dpy, EGLSurface surface)
    if (!evas_gl_thread_enabled())
      return eglSwapBuffers(dpy, surface);
 
-   Evas_Thread_Command_eglSwapBuffers thread_data;
+   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;
+
+   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.dpy = dpy;
-   thread_data.surface = surface;
+   thread_data->dpy = dpy;
+   thread_data->surface = surface;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
                               _gl_thread_eglSwapBuffers,
-                              &thread_data,
-                              EVAS_GL_THREAD_MODE_FINISH);
+                              thread_data,
+                              thread_mode);
 
-   return thread_data.return_value;
+   return thread_data->return_value;
 }
 
 
index 0bd6f7d..a113f96 100644 (file)
@@ -2504,7 +2504,6 @@ glDisable_evgl_api_thread_cmd(GLenum cap)
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } EVGL_API_Thread_Command_glDisableVertexAttribArray;
 
@@ -2518,8 +2517,6 @@ _evgl_api_thread_glDisableVertexAttribArray(void *data)
 
    orig_evgl_api_glDisableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -2536,22 +2533,6 @@ glDisableVertexAttribArray_evgl_api_thread_cmd(GLuint index)
    EVGL_API_Thread_Command_glDisableVertexAttribArray thread_data_local;
    EVGL_API_Thread_Command_glDisableVertexAttribArray *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_glDisableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glDisableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
@@ -2737,7 +2718,6 @@ glEnable_evgl_api_thread_cmd(GLenum cap)
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } EVGL_API_Thread_Command_glEnableVertexAttribArray;
 
@@ -2751,8 +2731,6 @@ _evgl_api_thread_glEnableVertexAttribArray(void *data)
 
    orig_evgl_api_glEnableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -2769,22 +2747,6 @@ glEnableVertexAttribArray_evgl_api_thread_cmd(GLuint index)
    EVGL_API_Thread_Command_glEnableVertexAttribArray thread_data_local;
    EVGL_API_Thread_Command_glEnableVertexAttribArray *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_glEnableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_API_Thread_Command_glEnableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
index b31a5d2..c4cdeb3 100644 (file)
@@ -114,7 +114,6 @@ glVertexAttribPointer_evgl_thread_cmd(GLuint index, GLint size, GLenum type, GLb
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } EVGL_Thread_Command_glEnableVertexAttribArray;
 
@@ -126,8 +125,6 @@ _evgl_thread_glEnableVertexAttribArray(void *data)
 
    glEnableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -144,22 +141,6 @@ glEnableVertexAttribArray_evgl_thread_cmd(GLuint index)
    EVGL_Thread_Command_glEnableVertexAttribArray thread_data_local;
    EVGL_Thread_Command_glEnableVertexAttribArray *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glEnableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glEnableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
@@ -176,7 +157,6 @@ glEnableVertexAttribArray_evgl_thread_cmd(GLuint index)
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } EVGL_Thread_Command_glDisableVertexAttribArray;
 
@@ -188,8 +168,6 @@ _evgl_thread_glDisableVertexAttribArray(void *data)
 
    glDisableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -206,22 +184,6 @@ glDisableVertexAttribArray_evgl_thread_cmd(GLuint index)
    EVGL_Thread_Command_glDisableVertexAttribArray thread_data_local;
    EVGL_Thread_Command_glDisableVertexAttribArray *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glDisableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glDisableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
@@ -3686,7 +3648,6 @@ glPixelStorei_evgl_thread_cmd(GLenum pname, GLint param)
 typedef struct
 {
    GLenum texture;
-   int command_allocated;
 
 } EVGL_Thread_Command_glActiveTexture;
 
@@ -3698,8 +3659,6 @@ _evgl_thread_glActiveTexture(void *data)
 
    glActiveTexture(thread_data->texture);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -3716,22 +3675,6 @@ glActiveTexture_evgl_thread_cmd(GLenum texture)
    EVGL_Thread_Command_glActiveTexture thread_data_local;
    EVGL_Thread_Command_glActiveTexture *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        EVGL_Thread_Command_glActiveTexture *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(EVGL_Thread_Command_glActiveTexture));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->texture = texture;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_EVGL,
index b63bf97..496e54f 100644 (file)
@@ -114,7 +114,6 @@ glVertexAttribPointer_thread_cmd(GLuint index, GLint size, GLenum type, GLboolea
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } Evas_Thread_Command_glEnableVertexAttribArray;
 
@@ -126,8 +125,6 @@ _gl_thread_glEnableVertexAttribArray(void *data)
 
    glEnableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -144,22 +141,6 @@ glEnableVertexAttribArray_thread_cmd(GLuint index)
    Evas_Thread_Command_glEnableVertexAttribArray thread_data_local;
    Evas_Thread_Command_glEnableVertexAttribArray *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glEnableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glEnableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_ENQUEUE;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
@@ -176,7 +157,6 @@ glEnableVertexAttribArray_thread_cmd(GLuint index)
 typedef struct
 {
    GLuint index;
-   int command_allocated;
 
 } Evas_Thread_Command_glDisableVertexAttribArray;
 
@@ -188,8 +168,6 @@ _gl_thread_glDisableVertexAttribArray(void *data)
 
    glDisableVertexAttribArray(thread_data->index);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -206,22 +184,6 @@ glDisableVertexAttribArray_thread_cmd(GLuint index)
    Evas_Thread_Command_glDisableVertexAttribArray thread_data_local;
    Evas_Thread_Command_glDisableVertexAttribArray *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glDisableVertexAttribArray *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glDisableVertexAttribArray));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_ENQUEUE;
-          }
-     }
-
    thread_data->index = index;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
@@ -3932,7 +3894,6 @@ glPixelStorei_thread_cmd(GLenum pname, GLint param)
 typedef struct
 {
    GLenum texture;
-   int command_allocated;
 
 } Evas_Thread_Command_glActiveTexture;
 
@@ -3944,8 +3905,6 @@ _gl_thread_glActiveTexture(void *data)
 
    glActiveTexture(thread_data->texture);
 
-   if (thread_data->command_allocated)
-     eina_mempool_free(_mp_command, thread_data);
 }
 
 EAPI void
@@ -3962,22 +3921,6 @@ glActiveTexture_thread_cmd(GLenum texture)
    Evas_Thread_Command_glActiveTexture thread_data_local;
    Evas_Thread_Command_glActiveTexture *thread_data = &thread_data_local;
 
-   /* command_allocated flag init. */
-   thread_data->command_allocated = 0;
-
-   if (!evas_gl_thread_force_finish())
-     { /* _flush */
-        Evas_Thread_Command_glActiveTexture *thread_data_new;
-        thread_data_new = eina_mempool_malloc(_mp_command,
-                                              sizeof(Evas_Thread_Command_glActiveTexture));
-        if (thread_data_new)
-          {
-             thread_data = thread_data_new;
-             thread_data->command_allocated = 1;
-             thread_mode = EVAS_GL_THREAD_MODE_FLUSH;
-          }
-     }
-
    thread_data->texture = texture;
 
    evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
index cd00594..d6f0548 100644 (file)
@@ -22,8 +22,8 @@
 # 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 | enqueue | noext | | |
-| EVAS | void | glDisableVertexAttribArray | GLuint index | enqueue | 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 | | |
 
 
 # Texturing
-| EVAS | void | glActiveTexture | GLenum texture | flush | noext | | |
+| EVAS | void | glActiveTexture | GLenum texture | finish | noext | | |
 
 # Texture Objects
 | EVAS | void | glGenTextures | GLsizei n,GLuint *textures | 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 | flush | noext | | |
-| EVAS GL | void | glDisableVertexAttribArray | GLuint index | flush | 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 | | |
 
 
 # Texturing
-| EVAS GL | void | glActiveTexture | GLenum texture | flush | noext | | |
+| EVAS GL | void | glActiveTexture | GLenum texture | finish | noext | | |
 
 # Texture Objects
 | EVAS GL | void | glGenTextures | GLsizei n,GLuint *textures | finish | 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 | 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 | 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 | | |