[evas_gl_thread_egl] seperate eglGetProcAddress into a gl thread 67/118567/2
authorJoogab Yun <joogab.yun@samsung.com>
Mon, 13 Mar 2017 07:06:53 +0000 (16:06 +0900)
committerjoogab yun <joogab.yun@samsung.com>
Tue, 14 Mar 2017 07:36:57 +0000 (00:36 -0700)
eglGetProcAddress is returned as null, for the gles1.1 extension
ex) like eglGetProcAddress("glIsRenderbufferOES")

Change-Id: I0a60f1241bd6d5f73b1b341c7d524224501ede49

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/wayland_egl/evas_engine.c

index 0227623..3c68e2c 100644 (file)
@@ -222,6 +222,53 @@ eglReleaseThread_thread_cmd(void)
    return thread_data.return_value;
 }
 
+typedef struct
+{
+  void *return_value;
+  char const * procname;
+} Evas_Thread_Command_eglGetProcAddress;
+
+
+void *(*orig_evas_eglGetProcAddress)(char const * procname);
+
+EAPI void
+eglGetProcAddress_orig_evas_set(void *func)
+{
+   orig_evas_eglGetProcAddress = func;
+}
+
+EAPI void *
+eglGetProcAddress_orig_evas_get()
+{
+   return orig_evas_eglGetProcAddress;
+}
+
+
+static void
+_gl_thread_eglGetProcAddress(void *data)
+{
+  Evas_Thread_Command_eglGetProcAddress *thread_data = data;
+
+   thread_data->return_value = orig_evas_eglGetProcAddress(thread_data->procname);
+}
+
+EAPI void *
+eglGetProcAddress_thread_cmd(char const * procname)
+{
+   if (!evas_gl_thread_enabled())
+     return eglGetProcAddress(procname);
+
+   Evas_Thread_Command_eglGetProcAddress thread_data;
+
+   thread_data.procname = procname;
+
+   evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
+                              _gl_thread_eglGetProcAddress,
+                              &thread_data,
+                              EVAS_GL_THREAD_MODE_FINISH);
+
+   return thread_data.return_value;
+}
 
 
 typedef struct
@@ -427,8 +474,6 @@ eglSwapBuffersWithDamage_thread_cmd(EGLDisplay dpy, EGLSurface surface, EGLint *
    return thread_data.return_value;
 }
 
-
-
 typedef struct
 {
    EGLBoolean return_value;
@@ -625,6 +670,13 @@ eglMakeCurrent_evgl_thread_cmd(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
 
    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;
@@ -685,6 +737,9 @@ 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);
@@ -728,6 +783,9 @@ void _egl_thread_link_init()
    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);
index 36932dd..7176024 100644 (file)
@@ -63,6 +63,9 @@ 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 *****/
 
@@ -86,6 +89,9 @@ 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);
 
 
 /* EGL 1.4 Sequential Operations */
index e05f678..f9efadc 100644 (file)
@@ -186,6 +186,7 @@ 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);