From: Joogab Yun Date: Tue, 18 Apr 2017 07:46:39 +0000 (+0900) Subject: [evas_thread_render] enhancement render thread. X-Git-Tag: accepted/tizen/unified/20170426.061819^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ad7e2717bd5690f9906c5e1fda117616dd8ba2ab;p=platform%2Fupstream%2Fefl.git [evas_thread_render] enhancement render thread. 1. Apply async finish mode 2. change the finish and flush mode for some egl/gl calls Change-Id: Ia0f7178212e23d22897215bb7db17a7ade999660 --- diff --git a/src/lib/evas/common/evas_thread_render.c b/src/lib/evas/common/evas_thread_render.c index 92a59e3..1f473cc 100644 --- a/src/lib/evas/common/evas_thread_render.c +++ b/src/lib/evas/common/evas_thread_render.c @@ -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; diff --git a/src/lib/evas/include/evas_common_private.h b/src/lib/evas/include/evas_common_private.h index 643a5bb..30c9f87 100644 --- a/src/lib/evas/include/evas_common_private.h +++ b/src/lib/evas/include/evas_common_private.h @@ -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 diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_egl.c b/src/modules/evas/engines/gl_common/evas_gl_thread_egl.c index 2f9ef2b..e971007 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_thread_egl.c +++ b/src/modules/evas/engines/gl_common/evas_gl_thread_egl.c @@ -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; } 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 index 0bd6f7d..a113f96 100644 --- 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 @@ -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, 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 index b31a5d2..c4cdeb3 100644 --- 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 @@ -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, diff --git a/src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c b/src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c index b63bf97..496e54f 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c +++ b/src/modules/evas/engines/gl_common/evas_gl_thread_gl_generated.c @@ -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, diff --git a/src/utils/evas/gl_api_def.txt b/src/utils/evas/gl_api_def.txt index cd00594..d6f0548 100644 --- a/src/utils/evas/gl_api_def.txt +++ b/src/utils/evas/gl_api_def.txt @@ -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 | | | @@ -105,7 +105,7 @@ # 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 | | | @@ -236,8 +236,8 @@ # 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 | | | @@ -315,7 +315,7 @@ # 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 | | | @@ -461,11 +461,11 @@ | 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 | | |