From 8b55c24fe8a63e23d119fd948e6c0c30d8f404d5 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 12 Mar 2013 15:26:32 +0900 Subject: [PATCH] cleanup some egl/glx/gl extension string matching and proc address vetos. --- .../evas/engines/gl_common/evas_gl_context.c | 9 ++++ src/modules/evas/engines/gl_x11/evas_engine.c | 49 ++++++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c index ac5d2c4..0f0911c 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_context.c +++ b/src/modules/evas/engines/gl_common/evas_gl_context.c @@ -15,6 +15,7 @@ int _evas_engine_GL_common_log_dom = -1; typedef void (*glsym_func_void) (); typedef void *(*glsym_func_void_ptr) (); typedef GLboolean (*glsym_func_boolean) (); +typedef const char *(*glsym_func_const_char_ptr) (); void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b) = NULL; void (*glsym_glBindFramebuffer) (GLenum a, GLuint b) = NULL; @@ -36,6 +37,7 @@ typedef unsigned int (*secsym_func_uint) (); typedef void *(*secsym_func_void_ptr) (); static _eng_fn (*glsym_eglGetProcAddress) (const char *a) = NULL; +static const char *(*glsym_eglQueryString) (void *a, int name) = NULL; void *(*secsym_eglCreateImage) (void *a, void *b, GLenum c, void *d, const int *e) = NULL; unsigned int (*secsym_eglDestroyImage) (void *a, void *b) = NULL; @@ -48,6 +50,7 @@ typedef void (*_eng_fn) (void); typedef _eng_fn (*glsym_func_eng_fn) (); static _eng_fn (*glsym_glXGetProcAddress) (const char *a) = NULL; +static const char *(*glsym_glXQueryExtensionsString) (void *a, int screen) = NULL; #endif static int dbgflushnum = -1; @@ -79,6 +82,8 @@ gl_symbols(void) FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressEXT", glsym_func_eng_fn); FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn); FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressKHR", glsym_func_eng_fn); + + FINDSYM(glsym_eglQueryString, "eglQueryString", glsym_func_const_char_ptr); #else #define FINDSYM(dst, sym, typ) \ if (glsym_glXGetProcAddress) { \ @@ -89,6 +94,8 @@ gl_symbols(void) FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddress", glsym_func_eng_fn); FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressEXT", glsym_func_eng_fn); FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressARB", glsym_func_eng_fn); + + FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsString", glsym_func_const_char_ptr); #endif #define FALLBAK(dst, typ) if (!dst) dst = (typ)sym_missing; @@ -576,6 +583,8 @@ evas_gl_common_context_new(void) if ((strstr((char *)ext, "GL_ARB_get_program_binary")) || (strstr((char *)ext, "GL_OES_get_program_binary"))) shared->info.bin_program = 1; + else + glsym_glGetProgramBinary = NULL; #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if ((strstr((char *)ext, "GL_EXT_texture_filter_anisotropic"))) glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index 01814d2..f83a2cd 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -62,10 +62,10 @@ _eng_fn (*glsym_eglGetProcAddress) (const char *a) = NULL; void *(*glsym_eglCreateImage) (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL; void (*glsym_eglDestroyImage) (EGLDisplay a, void *b) = NULL; void (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL; -void *(*glsym_eglMapImageSEC) (void *a, void *b) = NULL; -unsigned int (*glsym_eglUnmapImageSEC) (void *a, void *b) = NULL; -const char *(*glsym_eglQueryString) (EGLDisplay a, int name) = NULL; -void (*glsym_eglSwapBuffersRegion) (EGLDisplay a, void *b, EGLint c, const EGLint *d) = NULL; +void *(*glsym_eglMapImageSEC) (void *a, void *b) = NULL; +unsigned int (*glsym_eglUnmapImageSEC) (void *a, void *b) = NULL; +const char *(*glsym_eglQueryString) (EGLDisplay a, int name) = NULL; +void (*glsym_eglSwapBuffersRegion) (EGLDisplay a, void *b, EGLint c, const EGLint *d) = NULL; #else typedef XID (*glsym_func_xid) (); @@ -80,6 +80,7 @@ void (*glsym_glXDestroyPixmap) (Display *a, XID b) = NULL; void (*glsym_glXQueryDrawable) (Display *a, XID b, int c, unsigned int *d) = NULL; int (*glsym_glXSwapIntervalSGI) (int a) = NULL; void (*glsym_glXSwapIntervalEXT) (Display *s, GLXDrawable b, int c) = NULL; +const char *(*glsym_glXQueryExtensionsString) (Display *a, int screen) = NULL; #endif @@ -554,6 +555,8 @@ gl_symbols(void) FINDSYM(glsym_eglSwapBuffersRegion, "eglSwapBuffersRegion", glsym_func_void_ptr); FINDSYM(glsym_eglSwapBuffersRegion, "eglSwapBuffersRegionSEC", glsym_func_void_ptr); + + #else #define FINDSYM(dst, sym, typ) \ if (glsym_glXGetProcAddress) { \ @@ -600,6 +603,43 @@ gl_symbols(void) done = 1; } +static void +gl_extn_veto(Render_Engine *re) +{ + const char *str = NULL; +#ifdef GL_GLES + if (glsym_eglQueryString) + str = glsym_eglQueryString(re->win->egl_disp, EGL_EXTENSIONS); + if (str) + { + if (getenv("EVAS_GL_INFO")) + printf("EGL EXTN:\n%s\n", str); +// if (!strstr(str, "")) +// { +// } + } +#else + if (glsym_glXQueryExtensionsString) + str = glsym_glXQueryExtensionsString(re->info->info.display, + re->info->info.screen); + if (str) + { + if (getenv("EVAS_GL_INFO")) + printf("GLX EXTN:\n%s\n", str); + if (!strstr(str, "_texture_from_pixmap")) + { + glsym_glXBindTexImage = NULL; + glsym_glXReleaseTexImage = NULL; + } + if (!strstr(str, "_video_sync")) + { + glsym_glXGetVideoSync = NULL; + glsym_glXWaitVideoSync = NULL; + } + } +#endif +} + int _evas_engine_GL_X11_log_dom = -1; /* function tables - filled in later (func and parent func) */ static Evas_Func func, pfunc; @@ -709,6 +749,7 @@ eng_setup(Evas *eo_e, void *in) evas_common_font_init(); evas_common_draw_init(); evas_common_tilebuf_init(); + gl_extn_veto(re); initted = 1; } } -- 2.7.4