cleanup some egl/glx/gl extension string matching and proc address

vetos.
This commit is contained in:
Carsten Haitzler 2013-03-12 15:26:32 +09:00
parent b121520955
commit 8b55c24fe8
2 changed files with 54 additions and 4 deletions

View File

@ -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,

View File

@ -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;
}
}