YaGL: make GLES drivers initialization OS agnostic
authorIgor Mitsyanko <i.mitsyanko@samsung.com>
Thu, 18 Oct 2012 08:45:27 +0000 (12:45 +0400)
committerEvgeny Voevodin <e.voevodin@samsung.com>
Mon, 26 Nov 2012 09:25:34 +0000 (13:25 +0400)
Introduce function to acquire symbols from openGL library OS-specific way.
This is needed because only EGL OS-specific backend (glx, wgl e.t.c.) knows how
function addresses should be retreived.

Signed-off-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
hw/yagl_drivers/egl_glx/yagl_egl_glx.c
hw/yagl_drivers/gles1_ogl/yagl_gles1_ogl.c
hw/yagl_drivers/gles2_ogl/yagl_gles2_ogl.c
hw/yagl_drivers/gles_ogl/yagl_gles_ogl.c
hw/yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h
hw/yagl_dyn_lib.h

index 70260e0..7ce3083 100644 (file)
@@ -637,3 +637,26 @@ fail:
 
     return NULL;
 }
+
+void *yagl_egl_glx_procaddr_get(struct yagl_dyn_lib *dyn_lib,
+                                const char *sym_name)
+{
+    PFNGLXGETPROCADDRESSPROC get_address = NULL;
+    void *ret_func = NULL;
+
+    get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress");
+
+    if (!get_address) {
+        get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB");
+    }
+
+    if (get_address) {
+        ret_func = (void *)get_address((const GLubyte *)sym_name);
+    }
+
+    if (!ret_func) {
+        ret_func = yagl_dyn_lib_get_sym(dyn_lib, sym_name);
+    }
+
+    return ret_func;
+}
index 61c89e6..96035b6 100644 (file)
@@ -8,7 +8,6 @@
 #include "yagl_process.h"
 #include "yagl_thread.h"
 #include "yagl_tls.h"
-#include <GL/glx.h>
 
 static YAGL_DEFINE_TLS(struct yagl_thread_state*, gles1_ogl_ts);
 
@@ -238,7 +237,6 @@ static void yagl_gles1_ogl_destroy(struct yagl_gles1_driver *driver)
 struct yagl_gles1_driver *yagl_gles1_ogl_create(struct yagl_dyn_lib *dyn_lib)
 {
     struct yagl_gles1_ogl *gles1_ogl = NULL;
-    PFNGLXGETPROCADDRESSPROC get_address = NULL;
     struct yagl_gles_ogl *gles_ogl = NULL;
 
     YAGL_LOG_FUNC_ENTER_NPT(yagl_gles1_ogl_create, NULL);
@@ -253,12 +251,6 @@ struct yagl_gles1_driver *yagl_gles1_ogl_create(struct yagl_dyn_lib *dyn_lib)
         goto fail;
     }
 
-    get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress");
-
-    if (!get_address) {
-        get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB");
-    }
-
     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glAlphaFunc);
     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glColor4f);
     YAGL_GLES_OGL_GET_PROC(gles1_ogl, glDepthRangef);
index 28487f3..6abc299 100644 (file)
@@ -8,7 +8,6 @@
 #include "yagl_process.h"
 #include "yagl_thread.h"
 #include "yagl_tls.h"
-#include <GL/glx.h>
 
 static YAGL_DEFINE_TLS(struct yagl_thread_state*, gles2_ogl_ts);
 
@@ -313,7 +312,6 @@ static void yagl_gles2_ogl_destroy(struct yagl_gles2_driver *driver)
 struct yagl_gles2_driver *yagl_gles2_ogl_create(struct yagl_dyn_lib *dyn_lib)
 {
     struct yagl_gles2_ogl *gles2_ogl = NULL;
-    PFNGLXGETPROCADDRESSPROC get_address = NULL;
     struct yagl_gles_ogl *gles_ogl = NULL;
 
     YAGL_LOG_FUNC_ENTER_NPT(yagl_gles2_ogl_create, NULL);
@@ -328,12 +326,6 @@ struct yagl_gles2_driver *yagl_gles2_ogl_create(struct yagl_dyn_lib *dyn_lib)
         goto fail;
     }
 
-    get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress");
-
-    if (!get_address) {
-        get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB");
-    }
-
     YAGL_GLES_OGL_GET_PROC(gles2_ogl, glAttachShader);
     YAGL_GLES_OGL_GET_PROC(gles2_ogl, glBindAttribLocation);
     YAGL_GLES_OGL_GET_PROC(gles2_ogl, glBlendColor);
index 998e866..f82beac 100644 (file)
@@ -4,7 +4,6 @@
 #include "yagl_log.h"
 #include "yagl_dyn_lib.h"
 #include "yagl_process.h"
-#include <GL/glx.h>
 
 struct yagl_gles_ogl
 {
@@ -270,18 +269,11 @@ struct yagl_gles_ogl
     *yagl_gles_ogl_create(struct yagl_dyn_lib *dyn_lib)
 {
     struct yagl_gles_ogl *gles_ogl;
-    PFNGLXGETPROCADDRESSPROC get_address = NULL;
 
     YAGL_LOG_FUNC_ENTER_NPT(yagl_gles_ogl_create, NULL);
 
     gles_ogl = g_malloc0(sizeof(*gles_ogl));
 
-    get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress");
-
-    if (!get_address) {
-        get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB");
-    }
-
     YAGL_GLES_OGL_GET_PROC(gles_ogl, glActiveTexture);
     YAGL_GLES_OGL_GET_PROC(gles_ogl, glBindBuffer);
     YAGL_GLES_OGL_GET_PROC(gles_ogl, glBindTexture);
index eaf5d2e..1d29ac5 100644 (file)
@@ -161,16 +161,11 @@ static void driver_type##_##func(struct obj_type *driver_ps, arg0_type arg0, arg
 
 #define YAGL_GLES_OGL_GET_PROC(driver, func) \
     do { \
-        if (get_address) { \
-            *(void**)(&driver->func) = get_address((const GLubyte*)#func); \
-        } \
+        *(void**)(&driver->func) = yagl_dyn_lib_procaddr_get(dyn_lib, #func); \
         if (!driver->func) { \
-            *(void**)(&driver->func) = yagl_dyn_lib_get_sym(dyn_lib, #func); \
-            if (!driver->func) { \
-                YAGL_LOG_ERROR("Unable to get symbol: %s", \
-                               yagl_dyn_lib_get_error(dyn_lib)); \
-                goto fail; \
-            } \
+            YAGL_LOG_ERROR("Unable to get symbol: %s", \
+                           yagl_dyn_lib_get_error(dyn_lib)); \
+            goto fail; \
         } \
     } while (0)
 
index 5fd96be..66cec08 100644 (file)
@@ -17,4 +17,19 @@ void *yagl_dyn_lib_get_sym(struct yagl_dyn_lib *dyn_lib, const char* sym_name);
 
 const char *yagl_dyn_lib_get_error(struct yagl_dyn_lib *dyn_lib);
 
+#ifdef CONFIG_YAGL_EGL_GLX
+
+void *yagl_egl_glx_procaddr_get(struct yagl_dyn_lib *dyn_lib,
+                                const char *sym_name);
+
+static inline void *yagl_dyn_lib_procaddr_get(struct yagl_dyn_lib *dyn_lib,
+                                              const char *sym_name)
+{
+    return yagl_egl_glx_procaddr_get(dyn_lib, sym_name);
+}
+
+#else
+#error Unknown EGL backend
+#endif
+
 #endif