From ce6a01d118c082ea9e72060993d5ff9f54f8f9ba Mon Sep 17 00:00:00 2001 From: raster Date: Mon, 5 Dec 2011 08:54:14 +0000 Subject: [PATCH] I'm attaching a patch for the initial version of the GL Fastpath addition to evas gl backend. Working on different mobile devices, we've noticed that the cost of context switch (MakeCurrent) in GL can be very expensive depending on the driver implementation. To minimize the poorly written driver's context switch overhead, I've implemented a state tracking layer on top of the driver implemented GL. Essentially, this layer wraps all the GL/Glue(GLX/EGL) APIs and manages its own state changes. Internally, only one real GL context is created and logical contexts are created every time a user requests context creation. The logical contexts keep track of its states and sets only the necessary states (the ones that are different than the current ones) when there is a MakeCurrent request. The real MakeCurrent gets called when there is a Surface/Window change request. The GL library is dlopened and all the APIs are dlsym'ed and wrapped accordingly. All the GL functions are in evas_gl_core.{h,c}. Here's a very simply flow of the code. - all the APIs are exported as function pointers (*glsym_glBegin), (*glsm_eglCreatContext), and etc. - all the native GL/Glue(GLX/EGL) APIs are dlsym'ed as _sym_glBegin, _sym_eglCreateContext, and etc. - all the fastpath APIs are implmemnted as fpgl_glBegin, fpgl_eglCreateContext, and etc. - if faspath is seletected, the exported APIs are set accordingly ie. glsym_glBegin = fpgl_glBegin; - default mode is the regular gl symbols are directly set. ie. glsym_glBegin = _sym_glBegin; I have an Environment variable where you can set it to three different Modes EVAS_GL_FASTPATH = 0 // Default mode. Regular GL symbols are directly loaded EVAS_GL_FASTPATH = 1 // Fastpath mode. Takes the path described above. EVAS_GL_FASTPATH = 2 // Wrapped mode. All the regular GL functions are wrapped once. This can be used for various purposes Since all the GL symbols are now loaded in this library, I took out all the gl symbol loading parts in the evas gl backend as you'll see in the patch. The changes to the engine and the backend itself is pretty minor. There are still some known issues to hammer out but I thought we're at a good place for an initial version so that my source doesn't diverge too much. Known Issues and To Do's * Current GL Fastpath version doesn't support multiple threads. Instead of having one global real context, I would need to do it for each thread. I'll get on this soon. * Issues running Evas GL on certain conditions. When running the elementary test (with gl engine), if you run ELMGLview test that runs in ON_DEMAND mode, everything works fine. BUT, when you run the ELMGLView test in ALWAYS mode, the subsequent elm tests shows blank screen. When you destroy the GLView window, everything else comes on fine. * Resource protection code. This actually applies to Evas GL code in general as well. Since all the resources are shared among all the contexts that get created, I would like to eventually have a resource protecting mechanism that prevents access to resources outside of its context unless specifically specified. I'm attaching three files - evas_gl_core.h, evas_gl_core.c, fastpath.patch To get the code running... - copy evas_gl_core.{c,h} to src/modules/engine/gl_common/ - apply the fastpath.patch - compile/install evas - to run with fastpath GL (ie. % EVAS_GL_FASTPATH=1 ./evasgl_sample1) git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@65891 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/modules/engines/gl_common/Makefile.am | 2 + src/modules/engines/gl_common/evas_gl_common.h | 30 +- src/modules/engines/gl_common/evas_gl_context.c | 400 +- src/modules/engines/gl_common/evas_gl_core.c | 5526 +++++++++++++++++++++++ src/modules/engines/gl_common/evas_gl_core.h | 1377 ++++++ src/modules/engines/gl_common/evas_gl_line.c | 2 +- src/modules/engines/gl_common/evas_gl_shader.c | 88 +- src/modules/engines/gl_common/evas_gl_texture.c | 170 +- src/modules/engines/gl_x11/evas_engine.c | 1446 +++--- src/modules/engines/gl_x11/evas_engine.h | 16 +- src/modules/engines/gl_x11/evas_x_main.c | 354 +- 11 files changed, 8022 insertions(+), 1389 deletions(-) create mode 100644 src/modules/engines/gl_common/evas_gl_core.c create mode 100644 src/modules/engines/gl_common/evas_gl_core.h diff --git a/src/modules/engines/gl_common/Makefile.am b/src/modules/engines/gl_common/Makefile.am index 15acc02..6b419df 100644 --- a/src/modules/engines/gl_common/Makefile.am +++ b/src/modules/engines/gl_common/Makefile.am @@ -14,6 +14,8 @@ if BUILD_ENGINE_GL_COMMON noinst_LTLIBRARIES = libevas_engine_gl_common.la libevas_engine_gl_common_la_SOURCES = \ +evas_gl_core.h \ +evas_gl_core.c \ evas_gl_private.h \ evas_gl_common.h \ evas_gl_context.c \ diff --git a/src/modules/engines/gl_common/evas_gl_common.h b/src/modules/engines/gl_common/evas_gl_common.h index a088748..9f63fcf 100644 --- a/src/modules/engines/gl_common/evas_gl_common.h +++ b/src/modules/engines/gl_common/evas_gl_common.h @@ -12,6 +12,7 @@ #include #include #include +#include "evas_gl_core.h" #define GL_GLEXT_PROTOTYPES @@ -28,14 +29,14 @@ # else # if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) # if defined(GLES_VARIETY_S3C6410) -# include +//# include # elif defined(GLES_VARIETY_SGX) -# include -# include +//# include +//# include # endif # else -# include -# include +//# include +//# include # endif # endif #endif @@ -624,29 +625,12 @@ Filtered_Image *evas_gl_common_image_filtered_save(Evas_GL_Image *im, Evas_GL_ void evas_gl_common_image_filtered_free(Evas_GL_Image *im, Filtered_Image *); #endif -extern void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b); -extern void (*glsym_glBindFramebuffer) (GLenum a, GLuint b); -extern void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e); -extern void (*glsym_glDeleteFramebuffers) (GLsizei a, const GLuint *b); -extern void (*glsym_glGetProgramBinary) (GLuint a, GLsizei b, GLsizei *c, GLenum *d, void *e); -extern void (*glsym_glProgramBinary) (GLuint a, GLenum b, const void *c, GLint d); -extern void (*glsym_glProgramParameteri) (GLuint a, GLuint b, GLint d); - -#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) -extern void *(*secsym_eglCreateImage) (void *a, void *b, GLenum c, void *d, const int *e); -extern unsigned int (*secsym_eglDestroyImage) (void *a, void *b); -extern void (*secsym_glEGLImageTargetTexture2DOES) (int a, void *b); -extern void *(*secsym_eglMapImageSEC) (void *a, void *b); -extern unsigned int (*secsym_eglUnmapImageSEC) (void *a, void *b); -extern unsigned int (*secsym_eglGetImageAttribSEC) (void *a, void *b, int c, int *d); -#endif - //#define GL_ERRORS 1 #ifdef GL_ERRORS # define GLERR(fn, fl, ln, op) \ { \ - int __gl_err = glGetError(); \ + int __gl_err = glsym_glGetError(); \ if (__gl_err != GL_NO_ERROR) glerr(__gl_err, fl, fn, ln, op); \ } #else diff --git a/src/modules/engines/gl_common/evas_gl_context.c b/src/modules/engines/gl_common/evas_gl_context.c index 62e72bd..74d2c9a 100644 --- a/src/modules/engines/gl_common/evas_gl_context.c +++ b/src/modules/engines/gl_common/evas_gl_context.c @@ -12,142 +12,8 @@ static int sym_done = 0; int _evas_engine_GL_common_log_dom = -1; -typedef void (*glsym_func_void) (); - -void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b) = NULL; -void (*glsym_glBindFramebuffer) (GLenum a, GLuint b) = NULL; -void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e) = NULL; -void (*glsym_glDeleteFramebuffers) (GLsizei a, const GLuint *b) = NULL; -void (*glsym_glGetProgramBinary) (GLuint a, GLsizei b, GLsizei *c, GLenum *d, void *e) = NULL; -void (*glsym_glProgramBinary) (GLuint a, GLenum b, const void *c, GLint d) = NULL; -void (*glsym_glProgramParameteri) (GLuint a, GLuint b, GLint d) = NULL; - -#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) -// just used for finding symbols :) -typedef void (*_eng_fn) (void); - -typedef _eng_fn (*secsym_func_eng_fn) (); -typedef unsigned int (*secsym_func_uint) (); -typedef void *(*secsym_func_void_ptr) (); - -static _eng_fn (*secsym_eglGetProcAddress) (const char *a) = 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; -void (*secsym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL; -void *(*secsym_eglMapImageSEC) (void *a, void *b) = NULL; -unsigned int (*secsym_eglUnmapImageSEC) (void *a, void *b) = NULL; -unsigned int (*secsym_eglGetImageAttribSEC) (void *a, void *b, int c, int *d) = NULL; -#endif - static int dbgflushnum = -1; -static void -sym_missing(void) -{ - ERR("GL symbols missing!"); -} - -static void -gl_symbols(void) -{ - if (sym_done) return; - sym_done = 1; - - /* FIXME: If using the SDL engine, we should use SDL_GL_GetProcAddress - * instead of dlsym - * if (!dst) dst = (typ)SDL_GL_GetProcAddress(sym) - */ -#define FINDSYM(dst, sym, typ) if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym) -#define FALLBAK(dst, typ) if (!dst) dst = (typ)sym_missing; - - FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void); - FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersEXT", glsym_func_void); - FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersARB", glsym_func_void); - FALLBAK(glsym_glGenFramebuffers, glsym_func_void); - - FINDSYM(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void); - FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferEXT", glsym_func_void); - FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferARB", glsym_func_void); - FALLBAK(glsym_glBindFramebuffer, glsym_func_void); - - FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void); - FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DEXT", glsym_func_void); - FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DARB", glsym_func_void); - FALLBAK(glsym_glFramebufferTexture2D, glsym_func_void); - - FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffers", glsym_func_void); - FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersEXT", glsym_func_void); - FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersARB", glsym_func_void); - FALLBAK(glsym_glDeleteFramebuffers, glsym_func_void); - - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void); - - FINDSYM(glsym_glProgramBinary, "glProgramBinary", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryARB", glsym_func_void); - - FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void); - -#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) -#undef FINDSYM -#define FINDSYM(dst, sym, typ) \ - if ((!dst) && (secsym_eglGetProcAddress)) dst = (typ)secsym_eglGetProcAddress(sym); \ - if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym) -// yes - gl core looking for egl stuff. i know it's odd. a reverse-layer thing -// but it will work as the egl/glx layer calls gl core common stuff and thus -// these symbols will work. making the glx/egl + x11 layer do this kind-of is -// wrong as this is not x11 (output) layer specific like the native surface -// stuff. this is generic zero-copy textures for gl - - FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddress", secsym_func_eng_fn); - FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressEXT", secsym_func_eng_fn); - FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressARB", secsym_func_eng_fn); - FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressKHR", secsym_func_eng_fn); - - FINDSYM(secsym_eglCreateImage, "eglCreateImage", secsym_func_void_ptr); - FINDSYM(secsym_eglCreateImage, "eglCreateImageEXT", secsym_func_void_ptr); - FINDSYM(secsym_eglCreateImage, "eglCreateImageARB", secsym_func_void_ptr); - FINDSYM(secsym_eglCreateImage, "eglCreateImageKHR", secsym_func_void_ptr); - - FINDSYM(secsym_eglDestroyImage, "eglDestroyImage", secsym_func_uint); - FINDSYM(secsym_eglDestroyImage, "eglDestroyImageEXT", secsym_func_uint); - FINDSYM(secsym_eglDestroyImage, "eglDestroyImageARB", secsym_func_uint); - FINDSYM(secsym_eglDestroyImage, "eglDestroyImageKHR", secsym_func_uint); - - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void); - FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryKHR", glsym_func_void); - - FINDSYM(glsym_glProgramBinary, "glProgramBinary", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryARB", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryOES", glsym_func_void); - FINDSYM(glsym_glProgramBinary, "glProgramBinaryKHR", glsym_func_void); - - FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriOES", glsym_func_void); - FINDSYM(glsym_glProgramParameteri, "glProgramParameteriKHR", glsym_func_void); - - FINDSYM(secsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void); - - FINDSYM(secsym_eglMapImageSEC, "eglMapImageSEC", secsym_func_void_ptr); - - FINDSYM(secsym_eglUnmapImageSEC, "eglUnmapImageSEC", secsym_func_uint); - - FINDSYM(secsym_eglGetImageAttribSEC, "eglGetImageAttribSEC", secsym_func_uint); -#endif -} - static void shader_array_flush(Evas_Engine_GL_Context *gc); static Evas_Engine_GL_Context *_evas_gl_common_context = NULL; @@ -249,11 +115,11 @@ _evas_gl_common_version_check() int minor; /* - * glGetString returns a string describing the current GL connection. + * glsym_glGetString returns a string describing the current GL connection. * GL_VERSION is used to get the version of the connection */ - version = (char *)glGetString(GL_VERSION); + version = (char *)glsym_glGetString(GL_VERSION); /* * OpengL ES @@ -300,7 +166,7 @@ _evas_gl_common_version_check() * version number and the vendor-specific information. */ - /* glGetString() returns a static string, and we are going to */ + /* glsym_glGetString() returns a static string, and we are going to */ /* modify it, so we get a copy first */ version = strdup(version); if (!version) @@ -371,9 +237,9 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc) if (foc == 0) { if ((rot == 0) || (rot == 180)) - glViewport(0, 0, w, h); + glsym_glViewport(0, 0, w, h); else - glViewport(0, 0, h, w); + glsym_glViewport(0, 0, h, w); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); // std matrix if (m == 1) @@ -436,9 +302,9 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc) if (m == -1) ay = vy * 2; if ((rot == 0) || (rot == 180)) - glViewport(-2 * vx, -2 * vy, vw, vh); + glsym_glViewport(-2 * vx, -2 * vy, vw, vh); else - glViewport(-2 * vy, -2 * vx, vh, vw); + glsym_glViewport(-2 * vy, -2 * vx, vh, vw); if (m == 1) matrix_ortho(proj, 0, vw, 0, vh, -1000000.0, 1000000.0, @@ -455,15 +321,15 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc) for (i = 0; i < SHADER_LAST; ++i) { - glUseProgram(gc->shared->shader[i].prog); + glsym_glUseProgram(gc->shared->shader[i].prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader[i].prog, "mvp"), 1, GL_FALSE, proj); + glsym_glUniformMatrix4fv(glsym_glGetUniformLocation(gc->shared->shader[i].prog, "mvp"), 1, GL_FALSE, proj); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } if (gc->state.current.cur_prog == PRG_INVALID) - glUseProgram(gc->shared->shader[0].prog); - else glUseProgram(gc->state.current.cur_prog); + glsym_glUseProgram(gc->shared->shader[0].prog); + else glsym_glUseProgram(gc->state.current.cur_prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } @@ -486,8 +352,6 @@ evas_gl_common_context_new(void) gc = calloc(1, sizeof(Evas_Engine_GL_Context)); if (!gc) return NULL; - gl_symbols(); - gc->references = 1; _evas_gl_common_context = gc; @@ -500,7 +364,7 @@ evas_gl_common_context_new(void) const GLubyte *ext; shared = calloc(1, sizeof(Evas_GL_Shared)); - ext = glGetString(GL_EXTENSIONS); + ext = glsym_glGetString(GL_EXTENSIONS); if (ext) { if (getenv("EVAS_GL_INFO")) @@ -518,7 +382,7 @@ evas_gl_common_context_new(void) shared->info.bin_program = 1; #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if ((strstr((char *)ext, "GL_EXT_texture_filter_anisotropic"))) - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, + glsym_glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &(shared->info.anisotropic)); #endif #ifdef GL_BGRA @@ -536,24 +400,24 @@ evas_gl_common_context_new(void) { // test for all needed symbols - be "conservative" and // need all of it - if ((secsym_eglCreateImage) && - (secsym_eglDestroyImage) && - (secsym_glEGLImageTargetTexture2DOES) && - (secsym_eglMapImageSEC) && - (secsym_eglUnmapImageSEC) && - (secsym_eglGetImageAttribSEC)) + if ((glsym_eglCreateImage) && + (glsym_eglDestroyImage) && + (glsym_glEGLImageTargetTexture2DOES) && + (glsym_eglMapImageSEC) && + (glsym_eglUnmapImageSEC) && + (glsym_eglGetImageAttribSEC)) shared->info.sec_image_map = 1; } #endif } - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, + glsym_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &(shared->info.max_texture_units)); - glGetIntegerv(GL_MAX_TEXTURE_SIZE, + glsym_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &(shared->info.max_texture_size)); shared->info.max_vertex_elements = 6 * 100000; #ifdef GL_MAX_ELEMENTS_VERTICES -/* only applies to glDrawRangeElements. don't really need to get it. - glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, +/* only applies to glsym_glDrawRangeElements. don't really need to get it. + glsym_glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &(shared->info.max_vertex_elements)); */ #endif @@ -573,7 +437,7 @@ evas_gl_common_context_new(void) shared->info.tune.atlas.slot_size = DEF_ATLAS_SLOT; // per gpu hacks. based on impirical measurement of some known gpu's - s = (const char *)glGetString(GL_RENDERER); + s = (const char *)glsym_glGetString(GL_RENDERER); if (s) { if (strstr(s, "PowerVR SGX 540")) @@ -646,47 +510,47 @@ evas_gl_common_context_new(void) (int)shared->info.tune.atlas.slot_size ); - glDisable(GL_DEPTH_TEST); + glsym_glDisable(GL_DEPTH_TEST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glEnable(GL_DITHER); + glsym_glEnable(GL_DITHER); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisable(GL_BLEND); + glsym_glDisable(GL_BLEND); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glsym_glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); // no dest alpha -// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha -// glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ??? - glDepthMask(GL_FALSE); +// glsym_glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha +// glsym_glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ??? + glsym_glDepthMask(GL_FALSE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if (shared->info.anisotropic > 0.0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); + glsym_glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } #endif - glEnableVertexAttribArray(SHAD_VERTEX); + glsym_glEnableVertexAttribArray(SHAD_VERTEX); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glEnableVertexAttribArray(SHAD_COLOR); + glsym_glEnableVertexAttribArray(SHAD_COLOR); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!evas_gl_common_shader_program_init(shared)) goto error; #define SHADER_TEXTURE_ADD(Shared, Shader, Name) \ - glUseProgram(Shared->shader[SHADER_##Shader].prog); \ + glsym_glUseProgram(Shared->shader[SHADER_##Shader].prog); \ GLERR(__FUNCTION__, __FILE__, __LINE__, ""); \ - glUniform1i(glGetUniformLocation(Shared->shader[SHADER_##Shader].prog, #Name), Shared->shader[SHADER_##Shader].tex_count++); \ + glsym_glUniform1i(glsym_glGetUniformLocation(Shared->shader[SHADER_##Shader].prog, #Name), Shared->shader[SHADER_##Shader].tex_count++); \ GLERR(__FUNCTION__, __FILE__, __LINE__, ""); SHADER_TEXTURE_ADD(shared, YUV, tex); @@ -713,8 +577,8 @@ evas_gl_common_context_new(void) SHADER_TEXTURE_ADD(shared, IMG_MASK, texm); if (gc->state.current.cur_prog == PRG_INVALID) - glUseProgram(gc->shared->shader[0].prog); - else glUseProgram(gc->state.current.cur_prog); + glsym_glUseProgram(gc->shared->shader[0].prog); + else glsym_glUseProgram(gc->state.current.cur_prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); evas_gl_common_shader_program_init_done(); @@ -723,8 +587,8 @@ evas_gl_common_context_new(void) // // in code: // GLuint texes[8]; - // GLint loc = glGetUniformLocation(prog, "tex"); - // glUniform1iv(loc, 8, texes); + // GLint loc = glsym_glGetUniformLocation(prog, "tex"); + // glsym_glUniform1iv(loc, 8, texes); shared->native_pm_hash = eina_hash_int32_new(NULL); shared->native_tex_hash = eina_hash_int32_new(NULL); @@ -863,53 +727,53 @@ evas_gl_common_context_newframe(Evas_Engine_GL_Context *gc) } gc->change.size = 1; - glDisable(GL_SCISSOR_TEST); + glsym_glDisable(GL_SCISSOR_TEST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glScissor(0, 0, 0, 0); + glsym_glScissor(0, 0, 0, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisable(GL_DEPTH_TEST); + glsym_glDisable(GL_DEPTH_TEST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glEnable(GL_DITHER); + glsym_glEnable(GL_DITHER); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisable(GL_BLEND); + glsym_glDisable(GL_BLEND); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glsym_glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); // no dest alpha -// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha -// glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ??? - glDepthMask(GL_FALSE); +// glsym_glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha +// glsym_glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ??? + glsym_glDepthMask(GL_FALSE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if (shared->info.anisotropic > 0.0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); + glsym_glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } #endif - glEnableVertexAttribArray(SHAD_VERTEX); + glsym_glEnableVertexAttribArray(SHAD_VERTEX); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glEnableVertexAttribArray(SHAD_COLOR); + glsym_glEnableVertexAttribArray(SHAD_COLOR); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (gc->state.current.cur_prog == PRG_INVALID) - glUseProgram(gc->shared->shader[0].prog); - else glUseProgram(gc->state.current.cur_prog); + glsym_glUseProgram(gc->shared->shader[0].prog); + else glsym_glUseProgram(gc->state.current.cur_prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glActiveTexture(GL_TEXTURE0); + glsym_glActiveTexture(GL_TEXTURE0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _evas_gl_common_viewport_set(gc); @@ -2314,19 +2178,19 @@ scissor_rot(Evas_Engine_GL_Context *gc __UNUSED__, switch (rot) { case 0: // UP this way: ^ - glScissor(cx, cy, cw, ch); + glsym_glScissor(cx, cy, cw, ch); break; case 90: // UP this way: < - glScissor(gh - (cy + ch), cx, ch, cw); + glsym_glScissor(gh - (cy + ch), cx, ch, cw); break; case 180: // UP this way: v - glScissor(gw - (cx + cw), gh - (cy + ch), cw, ch); + glsym_glScissor(gw - (cx + cw), gh - (cy + ch), cw, ch); break; case 270: // UP this way: > - glScissor(cy, gw - (cx + cw), ch, cw); + glsym_glScissor(cy, gw - (cx + cw), ch, cw); break; default: // assume up is up - glScissor(cx, cy, cw, ch); + glsym_glScissor(cx, cy, cw, ch); break; } } @@ -2355,7 +2219,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc) GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (gc->pipe[i].shader.cur_prog != gc->state.current.cur_prog) { - glUseProgram(gc->pipe[i].shader.cur_prog); + glsym_glUseProgram(gc->pipe[i].shader.cur_prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } @@ -2364,18 +2228,18 @@ shader_array_flush(Evas_Engine_GL_Context *gc) #if 0 if (gc->pipe[i].shader.cur_tex) { - glEnable(GL_TEXTURE_2D); + glsym_glEnable(GL_TEXTURE_2D); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { - glDisable(GL_TEXTURE_2D); + glsym_glDisable(GL_TEXTURE_2D); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } #endif - glActiveTexture(GL_TEXTURE0); + glsym_glActiveTexture(GL_TEXTURE0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } if (gc->pipe[i].array.im) @@ -2383,7 +2247,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc) #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (gc->pipe[i].array.im->tex->pt->dyn.img) { - secsym_glEGLImageTargetTexture2DOES + glsym_glEGLImageTargetTexture2DOES (GL_TEXTURE_2D, gc->pipe[i].array.im->tex->pt->dyn.img); } else @@ -2402,12 +2266,12 @@ shader_array_flush(Evas_Engine_GL_Context *gc) switch (gc->pipe[i].shader.render_op) { case EVAS_RENDER_BLEND: /**< default op: d = d*(1-sa) + s */ - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glsym_glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); break; case EVAS_RENDER_COPY: /**< d = s */ gc->pipe[i].shader.blend = 0; - glBlendFunc(GL_ONE, GL_ONE); + glsym_glBlendFunc(GL_ONE, GL_ONE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); break; // FIXME: fix blend funcs below! @@ -2422,7 +2286,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc) case EVAS_RENDER_MASK: /**< d = d*sa */ case EVAS_RENDER_MUL: /**< d = d*s */ default: - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glsym_glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); break; } @@ -2431,12 +2295,12 @@ shader_array_flush(Evas_Engine_GL_Context *gc) { if (gc->pipe[i].shader.blend) { - glEnable(GL_BLEND); + glsym_glEnable(GL_BLEND); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { - glDisable(GL_BLEND); + glsym_glDisable(GL_BLEND); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -2448,17 +2312,17 @@ shader_array_flush(Evas_Engine_GL_Context *gc) #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if (shared->info.anisotropic > 0.0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic); + glsym_glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } #endif - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else @@ -2466,17 +2330,17 @@ shader_array_flush(Evas_Engine_GL_Context *gc) #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if (shared->info.anisotropic > 0.0) { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); + glsym_glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } #endif - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -2487,7 +2351,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc) { cy = gh - gc->pipe[i].shader.cy - gc->pipe[i].shader.ch; if (fbo) cy = gc->pipe[i].shader.cy; - glEnable(GL_SCISSOR_TEST); + glsym_glEnable(GL_SCISSOR_TEST); if (!fbo) scissor_rot(gc, gc->rot, gw, gh, gc->pipe[i].shader.cx, @@ -2495,14 +2359,14 @@ shader_array_flush(Evas_Engine_GL_Context *gc) gc->pipe[i].shader.cw, gc->pipe[i].shader.ch); else - glScissor(gc->pipe[i].shader.cx, cy, + glsym_glScissor(gc->pipe[i].shader.cx, cy, gc->pipe[i].shader.cw, gc->pipe[i].shader.ch); setclip = 1; } else { - glDisable(GL_SCISSOR_TEST); - glScissor(0, 0, 0, 0); + glsym_glDisable(GL_SCISSOR_TEST); + glsym_glScissor(0, 0, 0, 0); } } if ((gc->pipe[i].shader.clip) && (!setclip)) @@ -2521,112 +2385,112 @@ shader_array_flush(Evas_Engine_GL_Context *gc) gc->pipe[i].shader.cw, gc->pipe[i].shader.ch); else - glScissor(gc->pipe[i].shader.cx, cy, + glsym_glScissor(gc->pipe[i].shader.cx, cy, gc->pipe[i].shader.cw, gc->pipe[i].shader.ch); } } - glVertexAttribPointer(SHAD_VERTEX, 3, GL_SHORT, GL_FALSE, 0, gc->pipe[i].array.vertex); + glsym_glVertexAttribPointer(SHAD_VERTEX, 3, GL_SHORT, GL_FALSE, 0, gc->pipe[i].array.vertex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, gc->pipe[i].array.color); + glsym_glVertexAttribPointer(SHAD_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, gc->pipe[i].array.color); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (gc->pipe[i].array.use_texuv) { - glEnableVertexAttribArray(SHAD_TEXUV); + glsym_glEnableVertexAttribArray(SHAD_TEXUV); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_TEXUV, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv); + glsym_glVertexAttribPointer(SHAD_TEXUV, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { - glDisableVertexAttribArray(SHAD_TEXUV); + glsym_glDisableVertexAttribArray(SHAD_TEXUV); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } if (gc->pipe[i].array.line) { - glDisableVertexAttribArray(SHAD_TEXUV); + glsym_glDisableVertexAttribArray(SHAD_TEXUV); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisableVertexAttribArray(SHAD_TEXUV2); + glsym_glDisableVertexAttribArray(SHAD_TEXUV2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisableVertexAttribArray(SHAD_TEXUV3); + glsym_glDisableVertexAttribArray(SHAD_TEXUV3); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDrawArrays(GL_LINES, 0, gc->pipe[i].array.num); + glsym_glDrawArrays(GL_LINES, 0, gc->pipe[i].array.num); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { if (gc->pipe[i].array.use_texm) { - glEnableVertexAttribArray(SHAD_TEXM); + glsym_glEnableVertexAttribArray(SHAD_TEXM); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_TEXM, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texm); + glsym_glVertexAttribPointer(SHAD_TEXM, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texm); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glActiveTexture(GL_TEXTURE1); + glsym_glActiveTexture(GL_TEXTURE1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texm); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glActiveTexture(GL_TEXTURE0); + glsym_glActiveTexture(GL_TEXTURE0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { - glDisableVertexAttribArray(SHAD_TEXM); + glsym_glDisableVertexAttribArray(SHAD_TEXM); } if ((gc->pipe[i].array.use_texuv2) && (gc->pipe[i].array.use_texuv3)) { - glEnableVertexAttribArray(SHAD_TEXUV2); + glsym_glEnableVertexAttribArray(SHAD_TEXUV2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glEnableVertexAttribArray(SHAD_TEXUV3); + glsym_glEnableVertexAttribArray(SHAD_TEXUV3); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv2); + glsym_glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_TEXUV3, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv3); + glsym_glVertexAttribPointer(SHAD_TEXUV3, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv3); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glActiveTexture(GL_TEXTURE1); + glsym_glActiveTexture(GL_TEXTURE1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (gc->pipe[i].shader.cur_texu_dyn) - secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn); + glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn); #endif - glActiveTexture(GL_TEXTURE2); + glsym_glActiveTexture(GL_TEXTURE2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (gc->pipe[i].shader.cur_texv_dyn) - secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv_dyn); + glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv_dyn); #endif - glActiveTexture(GL_TEXTURE0); + glsym_glActiveTexture(GL_TEXTURE0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else if (gc->pipe[i].array.use_texuv2) { - glEnableVertexAttribArray(SHAD_TEXUV2); + glsym_glEnableVertexAttribArray(SHAD_TEXUV2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv2); + glsym_glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glActiveTexture(GL_TEXTURE1); + glsym_glActiveTexture(GL_TEXTURE1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (gc->pipe[i].shader.cur_texu_dyn) - secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn); + glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn); #endif - glActiveTexture(GL_TEXTURE0); + glsym_glActiveTexture(GL_TEXTURE0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } else { - glDisableVertexAttribArray(SHAD_TEXUV2); + glsym_glDisableVertexAttribArray(SHAD_TEXUV2); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDisableVertexAttribArray(SHAD_TEXUV3); + glsym_glDisableVertexAttribArray(SHAD_TEXUV3); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } if (dbgflushnum) @@ -2644,7 +2508,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc) types[gc->pipe[i].region.type] ); } - glDrawArrays(GL_TRIANGLES, 0, gc->pipe[i].array.num); + glsym_glDrawArrays(GL_TRIANGLES, 0, gc->pipe[i].array.num); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } if (gc->pipe[i].array.im) @@ -2703,6 +2567,8 @@ shader_array_flush(Evas_Engine_GL_Context *gc) Eina_Bool evas_gl_common_module_open(void) { + if (!init_gl()) return EINA_FALSE; + if (_evas_engine_GL_common_log_dom < 0) _evas_engine_GL_common_log_dom = eina_log_domain_register ("evas-gl_common", EVAS_DEFAULT_LOG_COLOR); @@ -2717,6 +2583,8 @@ evas_gl_common_module_open(void) void evas_gl_common_module_close(void) { + free_gl(); + if (_evas_engine_GL_common_log_dom < 0) return; eina_log_domain_unregister(_evas_engine_GL_common_log_dom); _evas_engine_GL_common_log_dom = -1; diff --git a/src/modules/engines/gl_common/evas_gl_core.c b/src/modules/engines/gl_common/evas_gl_core.c new file mode 100644 index 0000000..8ae7df5 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_core.c @@ -0,0 +1,5526 @@ +#include +#include +#include +#include +#include "evas_gl_core.h" + + +#define FLAG_BIT_0 0x01 +#define FLAG_BIT_1 0x02 +#define FLAG_BIT_2 0x04 +#define FLAG_BIT_3 0x08 +#define FLAG_BIT_4 0x10 +#define FLAG_BIT_5 0x20 +#define FLAG_BIT_6 0x40 +#define FLAG_BIT_7 0x80 + +//------------------------------------------------------// +typedef _eng_fn (*glsym_func_eng_fn) (); +typedef void (*glsym_func_void) (); +typedef XID (*glsym_func_xid) (); +typedef XVisualInfo *(*glsym_func_xvisinfo_ptr) (); +typedef Bool (*glsym_func_bool) (); +typedef unsigned int (*glsym_func_uint) (); +typedef int (*glsym_func_int) (); +typedef unsigned char (*glsym_func_uchar) (); +typedef unsigned char *(*glsym_func_uchar_ptr) (); +typedef const unsigned char *(*glsym_func_const_uchar_ptr) (); +typedef char const *(*glsym_func_char_const_ptr) (); + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) +typedef EGLDisplay (*glsym_func_egldpy) (); +typedef EGLContext (*glsym_func_eglctx) (); +typedef EGLSurface (*glsym_func_eglsfc) (); +typedef EGLBoolean (*glsym_func_eglbool) (); +#else +typedef GLXContext (*glsym_func_glxctx) (); +typedef GLXDrawable (*glsym_func_glxdraw) (); +typedef GLXFBConfig *(*glsym_func_glxfbcfg_ptr) (); +#endif +//------------------------------------------------------// + +static void *gl_lib_handle; + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) +static void *egl_lib_handle; +static EGLDisplay global_dpy = EGL_DEFAULT_DISPLAY; +static EGLSurface current_surf = EGL_NO_SURFACE; +static EGLContext global_ctx = NULL; +#else +static Display *global_dpy = NULL; +static GLXDrawable current_surf = None; +static GLXContext global_ctx = NULL; +#endif +static int global_ctx_initted = 0; +static EvasGlueContext current_ctx = NULL; +static EvasGlueContext real_current_ctx = NULL; +static int ctx_ref_count = 0; + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + +//------------------------------------------------------// +// EGL APIs... Only ones that are being used. +//--------// +_eng_fn (*GL(eglGetProcAddress)) (const char *procname) = NULL; + +//--------// +// Standard EGL APIs +EGLint (*GL(eglGetError)) (void) = NULL; +EGLDisplay (*GL(eglGetDisplay)) (EGLNativeDisplayType display_id) = NULL; +EGLBoolean (*GL(eglInitialize)) (EGLDisplay dpy, EGLint* major, EGLint* minor) = NULL; +EGLBoolean (*GL(eglTerminate)) (EGLDisplay dpy) = NULL; +EGLBoolean (*GL(eglChooseConfig)) (EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config) = NULL; +EGLSurface (*GL(eglCreateWindowSurface) ) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list) = NULL; +EGLSurface (*GL(eglCreatePixmapSurface) ) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list) = NULL; +EGLBoolean (*GL(eglDestroySurface)) (EGLDisplay dpy, EGLSurface surface) = NULL; +EGLBoolean (*GL(eglBindAPI)) (EGLenum api) = NULL; +EGLBoolean (*GL(eglWaitClient)) (void) = NULL; +EGLBoolean (*GL(eglSurfaceAttrib)) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) = NULL; +void (*GL(eglBindTexImage)) (EGLDisplay dpy, EGLSurface surface, EGLint buffer) = NULL; +EGLBoolean (*GL(eglReleaseTexImage)) (EGLDisplay dpy, EGLSurface surface, EGLint buffer) = NULL; +EGLBoolean (*GL(eglSwapInterval)) (EGLDisplay dpy, EGLint interval) = NULL; +EGLContext (*GL(eglCreateContext)) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list) = NULL; +EGLBoolean (*GL(eglDestroyContext)) (EGLDisplay dpy, EGLContext ctx) = NULL; +EGLBoolean (*GL(eglMakeCurrent)) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) = NULL; +EGLContext (*GL(eglGetCurrentContext)) (void) = NULL; +EGLSurface (*GL(eglGetCurrentSurface)) (EGLint readdraw) = NULL; +EGLDisplay (*GL(eglGetCurrentDisplay)) (void) = NULL; +EGLBoolean (*GL(eglWaitGL)) (void) = NULL; +EGLBoolean (*GL(eglWaitNative)) (EGLint engine) = NULL; +EGLBoolean (*GL(eglSwapBuffers)) (EGLDisplay dpy, EGLSurface surface) = NULL; +EGLBoolean (*GL(eglCopyBuffers)) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) = NULL; +char const *(*GL(eglQueryString)) (EGLDisplay dpy, EGLint name) = NULL; + +// Extensions +void *(*GL(eglCreateImage)) (void *a, void *b, GLenum c, void *d, const int *e) = NULL; +unsigned int (*GL(eglDestroyImage)) (void *a, void *b) = NULL; +void (*GL(glEGLImageTargetTexture2DOES)) (int a, void *b) = NULL; +void (*GL(glEGLImageTargetRenderbufferStorageOES)) (int a, void *b) = NULL; +void *(*GL(eglMapImageSEC)) (void *a, void *b) = NULL; +unsigned int (*GL(eglUnmapImageSEC)) (void *a, void *b) = NULL; +unsigned int (*GL(eglGetImageAttribSEC)) (void *a, void *b, int c, int *d) = NULL; + + +//--------// + +//------------------------------------------------------// +// Internal EGL APIs... Only ones that are being used. +//--------// +static _eng_fn (*_sym_eglGetProcAddress) (const char* procname) = NULL; +// Standard EGL funtions +static EGLint (*_sym_eglGetError) (void) = NULL; +static EGLDisplay (*_sym_eglGetDisplay) (EGLNativeDisplayType display_id) = NULL; +static EGLBoolean (*_sym_eglInitialize) (EGLDisplay dpy, EGLint* major, EGLint* minor) = NULL; +static EGLBoolean (*_sym_eglTerminate) (EGLDisplay dpy) = NULL; +static EGLBoolean (*_sym_eglChooseConfig) (EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config) = NULL; +static EGLSurface (*_sym_eglCreateWindowSurface ) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list) = NULL; +static EGLSurface (*_sym_eglCreatePixmapSurface ) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list) = NULL; +static EGLBoolean (*_sym_eglDestroySurface) (EGLDisplay dpy, EGLSurface surface) = NULL; +static EGLBoolean (*_sym_eglBindAPI) (EGLenum api) = NULL; +static EGLBoolean (*_sym_eglWaitClient) (void) = NULL; +static EGLBoolean (*_sym_eglSurfaceAttrib) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) = NULL; +static void (*_sym_eglBindTexImage) (EGLDisplay dpy, EGLSurface surface, EGLint buffer) = NULL; +static EGLBoolean (*_sym_eglReleaseTexImage) (EGLDisplay dpy, EGLSurface surface, EGLint buffer) = NULL; +static EGLBoolean (*_sym_eglSwapInterval) (EGLDisplay dpy, EGLint interval) = NULL; +static EGLContext (*_sym_eglCreateContext) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list) = NULL; +static EGLBoolean (*_sym_eglDestroyContext) (EGLDisplay dpy, EGLContext ctx) = NULL; +static EGLBoolean (*_sym_eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) = NULL; +static EGLContext (*_sym_eglGetCurrentContext) (void) = NULL; +static EGLSurface (*_sym_eglGetCurrentSurface) (EGLint readdraw) = NULL; +static EGLDisplay (*_sym_eglGetCurrentDisplay) (void) = NULL; +static EGLBoolean (*_sym_eglWaitGL) (void) = NULL; +static EGLBoolean (*_sym_eglWaitNative) (EGLint engine) = NULL; +static EGLBoolean (*_sym_eglSwapBuffers) (EGLDisplay dpy, EGLSurface surface) = NULL; +static EGLBoolean (*_sym_eglCopyBuffers) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) = NULL; +static char const *(*_sym_eglQueryString) (EGLDisplay dpy, EGLint name) = NULL; + +// Extensions +static void *(*_sym_eglCreateImage) (void *a, void *b, GLenum c, void *d, const int *e) = NULL; +static unsigned int (*_sym_eglDestroyImage) (void *a, void *b) = NULL; +static void (*_sym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL; +static void (*_sym_glEGLImageTargetRenderbufferStorageOES) (int a, void *b) = NULL; +static void *(*_sym_eglMapImageSEC) (void *a, void *b) = NULL; +static unsigned int (*_sym_eglUnmapImageSEC) (void *a, void *b) = NULL; +static unsigned int (*_sym_eglGetImageAttribSEC) (void *a, void *b, int c, int *d) = NULL; + + +#else +//------------------------------------------------------// +// GLX APIs... Only ones that are being used. +//--------// +_eng_fn (*GL(glXGetProcAddress)) (const char* procName) = NULL; + +// Standard glX functions +XVisualInfo* (*GL(glXChooseVisual)) (Display* dpy, int screen, int* attribList) = NULL; +GLXContext (*GL(glXCreateContext)) (Display* dpy, XVisualInfo* vis, GLXContext shareList, Bool direct) = NULL; +void (*GL(glXDestroyContext)) (Display* dpy, GLXContext ctx) = NULL; +GLXContext (*GL(glXGetCurrentContext)) (void) = NULL; +GLXDrawable (*GL(glXGetCurrentDrawable)) (void) = NULL; +Bool (*GL(glXMakeCurrent)) (Display* dpy, GLXDrawable draw, GLXContext ctx) = NULL; +void (*GL(glXSwapBuffers)) (Display* dpy, GLXDrawable draw) = NULL; +void (*GL(glXWaitX)) (void) = NULL; +void (*GL(glXWaitGL)) (void) = NULL; +Bool (*GL(glXQueryExtension)) (Display* dpy, int* errorb, int *event) = NULL; +const char *(*GL(glXQueryExtensionsString)) (Display *dpy, int screen) = NULL; + +//--------// +GLXFBConfig* (*GL(glXChooseFBConfig)) (Display* dpy, int screen, const int* attribList, int* nitems) = NULL; +GLXFBConfig* (*GL(glXGetFBConfigs)) (Display* dpy, int screen, int* nelements) = NULL; +int (*GL(glXGetFBConfigAttrib)) (Display* dpy, GLXFBConfig config, int attribute, int* value) = NULL; +XVisualInfo* (*GL(glXGetVisualFromFBConfig)) (Display* dpy, GLXFBConfig config) = NULL; +void (*GL(glXDestroyWindow)) (Display* dpy, GLXWindow window) = NULL; +Bool (*GL(glXMakeContextCurrent)) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) = NULL; +//--------// + +void (*GL(glXBindTexImage)) (Display* dpy, GLXDrawable draw, int buffer, int* attribList) = NULL; +void (*GL(glXReleaseTexImage)) (Display* dpy, GLXDrawable draw, int buffer) = NULL; +int (*GL(glXGetVideoSync)) (unsigned int* count) = NULL; +int (*GL(glXWaitVideoSync)) (int divisor, int remainder, unsigned int *count) = NULL; +XID (*GL(glXCreatePixmap)) (Display* dpy, void* config, Pixmap pixmap, const int* attribList) = NULL; +void (*GL(glXDestroyPixmap)) (Display* dpy, XID pixmap) = NULL; +void (*GL(glXQueryDrawable)) (Display* dpy, XID draw, int attribute, unsigned int* value) = NULL; +int (*GL(glXSwapIntervalSGI)) (int interval) = NULL; +void (*GL(glXSwapIntervalEXT)) (Display* dpy, GLXDrawable draw, int interval) = NULL; + +//------------------// + + +//------------------------------------------------------// +// Internal GLX APIs... Only ones that are being used. +//--------// +static _eng_fn (*_sym_glXGetProcAddress) (const char* procName) = NULL; + +// Standard glX functions +static XVisualInfo* (*_sym_glXChooseVisual) (Display* dpy, int screen, int* attribList) = NULL; +static GLXContext (*_sym_glXCreateContext) (Display* dpy, XVisualInfo* vis, GLXContext shareList, Bool direct) = NULL; +static void (*_sym_glXDestroyContext) (Display* dpy, GLXContext ctx) = NULL; +static GLXContext (*_sym_glXGetCurrentContext) (void) = NULL; +static GLXDrawable (*_sym_glXGetCurrentDrawable) (void) = NULL; +static Bool (*_sym_glXMakeCurrent) (Display* dpy, GLXDrawable draw, GLXContext ctx) = NULL; +static void (*_sym_glXSwapBuffers) (Display* dpy, GLXDrawable draw) = NULL; +static void (*_sym_glXWaitX) (void) = NULL; +static void (*_sym_glXWaitGL) (void) = NULL; +static Bool (*_sym_glXQueryExtension) (Display* dpy, int* errorb, int* event) = NULL; +static const char *(*_sym_glXQueryExtensionsString) (Display* dpy, int screen); + +//--------// +static GLXFBConfig* (*_sym_glXChooseFBConfig) (Display* dpy, int screen, const int* attribList, int* nitems) = NULL; +static GLXFBConfig* (*_sym_glXGetFBConfigs) (Display* dpy, int screen, int* nelements) = NULL; +static int (*_sym_glXGetFBConfigAttrib) (Display* dpy, GLXFBConfig config, int attribute, int* value) = NULL; +static XVisualInfo* (*_sym_glXGetVisualFromFBConfig) (Display* dpy, GLXFBConfig config) = NULL; +static void (*_sym_glXDestroyWindow) (Display* dpy, GLXWindow window) = NULL; +static Bool (*_sym_glXMakeContextCurrent) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) = NULL; +//--------// + +static void (*_sym_glXBindTexImage) (Display* dpy, GLXDrawable draw, int buffer, int* attribList) = NULL; +static void (*_sym_glXReleaseTexImage) (Display* dpy, GLXDrawable draw, int buffer) = NULL; +static int (*_sym_glXGetVideoSync) (unsigned int* count) = NULL; +static int (*_sym_glXWaitVideoSync) (int divisor, int remainder, unsigned int* count) = NULL; +static XID (*_sym_glXCreatePixmap) (Display* dpy, void* config, Pixmap pixmap, const int* attribList) = NULL; +static void (*_sym_glXDestroyPixmap) (Display* dpy, XID pixmap) = NULL; +static void (*_sym_glXQueryDrawable) (Display* dpy, XID draw, int attribute, unsigned int* value) = NULL; +static int (*_sym_glXSwapIntervalSGI) (int interval) = NULL; +static void (*_sym_glXSwapIntervalEXT) (Display* dpy, GLXDrawable draw, int interval) = NULL; + +//------------------// +#endif + +//------------------------------------------------------// + + +/* version 1: */ +void (*GL(glActiveTexture)) (GLenum texture) = NULL; +void (*GL(glAttachShader)) (GLuint program, GLuint shader) = NULL; +void (*GL(glBindAttribLocation)) (GLuint program, GLuint index, const char* name) = NULL; +void (*GL(glBindBuffer)) (GLenum target, GLuint buffer) = NULL; +void (*GL(glBindFramebuffer)) (GLenum target, GLuint framebuffer) = NULL; +void (*GL(glBindRenderbuffer)) (GLenum target, GLuint renderbuffer) = NULL; +void (*GL(glBindTexture)) (GLenum target, GLuint texture) = NULL; +void (*GL(glBlendColor)) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL; +void (*GL(glBlendEquation)) ( GLenum mode ) = NULL; +void (*GL(glBlendEquationSeparate)) (GLenum modeRGB, GLenum modeAlpha) = NULL; +void (*GL(glBlendFunc)) (GLenum sfactor, GLenum dfactor) = NULL; +void (*GL(glBlendFuncSeparate)) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL; +void (*GL(glBufferData)) (GLenum target, GLsizeiptr size, const void* data, GLenum usage) = NULL; +void (*GL(glBufferSubData)) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = NULL; +GLenum (*GL(glCheckFramebufferStatus)) (GLenum target) = NULL; +void (*GL(glClear)) (GLbitfield mask) = NULL; +void (*GL(glClearColor)) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL; +void (*GL(glClearDepthf)) (GLclampf depth) = NULL; +void (*GL(glClearStencil)) (GLint s) = NULL; +void (*GL(glColorMask)) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = NULL; +void (*GL(glCompileShader)) (GLuint shader) = NULL; +void (*GL(glCompressedTexImage2D)) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) = NULL; +void (*GL(glCompressedTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) = NULL; +void (*GL(glCopyTexImage2D)) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = NULL; +void (*GL(glCopyTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL; +GLuint (*GL(glCreateProgram)) (void) = NULL; +GLuint (*GL(glCreateShader)) (GLenum type) = NULL; +void (*GL(glCullFace)) (GLenum mode) = NULL; +void (*GL(glDeleteBuffers)) (GLsizei n, const GLuint* buffers) = NULL; +void (*GL(glDeleteFramebuffers)) (GLsizei n, const GLuint* framebuffers) = NULL; +void (*GL(glDeleteProgram)) (GLuint program) = NULL; +void (*GL(glDeleteRenderbuffers)) (GLsizei n, const GLuint* renderbuffers) = NULL; +void (*GL(glDeleteShader)) (GLuint shader) = NULL; +void (*GL(glDeleteTextures)) (GLsizei n, const GLuint* textures) = NULL; +void (*GL(glDepthFunc)) (GLenum func) = NULL; +void (*GL(glDepthMask)) (GLboolean flag) = NULL; +void (*GL(glDepthRangef)) (GLclampf zNear, GLclampf zFar) = NULL; +void (*GL(glDetachShader)) (GLuint program, GLuint shader) = NULL; +void (*GL(glDisable)) (GLenum cap) = NULL; +void (*GL(glDisableVertexAttribArray)) (GLuint index) = NULL; +void (*GL(glDrawArrays)) (GLenum mode, GLint first, GLsizei count) = NULL; +void (*GL(glDrawElements)) (GLenum mode, GLsizei count, GLenum type, const void* indices) = NULL; +void (*GL(glEnable)) (GLenum cap) = NULL; +void (*GL(glEnableVertexAttribArray)) (GLuint index) = NULL; +void (*GL(glFinish)) (void) = NULL; +void (*GL(glFlush)) (void) = NULL; +void (*GL(glFramebufferRenderbuffer)) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL; +void (*GL(glFramebufferTexture2D)) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL; +void (*GL(glFrontFace)) (GLenum mode) = NULL; +void (*GL(glGenBuffers)) (GLsizei n, GLuint* buffers) = NULL; +void (*GL(glGenerateMipmap)) (GLenum target) = NULL; +void (*GL(glGenFramebuffers)) (GLsizei n, GLuint* framebuffers) = NULL; +void (*GL(glGenRenderbuffers)) (GLsizei n, GLuint* renderbuffers) = NULL; +void (*GL(glGenTextures)) (GLsizei n, GLuint* textures) = NULL; +void (*GL(glGetActiveAttrib)) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL; +void (*GL(glGetActiveUniform)) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL; +void (*GL(glGetAttachedShaders)) (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = NULL; +int (*GL(glGetAttribLocation)) (GLuint program, const char* name) = NULL; +void (*GL(glGetBooleanv)) (GLenum pname, GLboolean* params) = NULL; +void (*GL(glGetBufferParameteriv)) (GLenum target, GLenum pname, GLint* params) = NULL; +GLenum (*GL(glGetError)) (void) = NULL; +void (*GL(glGetFloatv)) (GLenum pname, GLfloat* params) = NULL; +void (*GL(glGetFramebufferAttachmentParameteriv)) (GLenum target, GLenum attachment, GLenum pname, GLint* params) = NULL; +void (*GL(glGetIntegerv)) (GLenum pname, GLint* params) = NULL; +void (*GL(glGetProgramiv)) (GLuint program, GLenum pname, GLint* params) = NULL; +void (*GL(glGetProgramInfoLog)) (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = NULL; +void (*GL(glGetRenderbufferParameteriv)) (GLenum target, GLenum pname, GLint* params) = NULL; +void (*GL(glGetShaderiv)) (GLuint shader, GLenum pname, GLint* params) = NULL; +void (*GL(glGetShaderInfoLog)) (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = NULL; +void (*GL(glGetShaderPrecisionFormat)) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = NULL; +void (*GL(glGetShaderSource)) (GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = NULL; +const GLubyte *(*GL(glGetString)) (GLenum name) = NULL; +void (*GL(glGetTexParameterfv)) (GLenum target, GLenum pname, GLfloat* params) = NULL; +void (*GL(glGetTexParameteriv)) (GLenum target, GLenum pname, GLint* params) = NULL; +void (*GL(glGetUniformfv)) (GLuint program, GLint location, GLfloat* params) = NULL; +void (*GL(glGetUniformiv)) (GLuint program, GLint location, GLint* params) = NULL; +int (*GL(glGetUniformLocation)) (GLuint program, const char* name) = NULL; +void (*GL(glGetVertexAttribfv)) (GLuint index, GLenum pname, GLfloat* params) = NULL; +void (*GL(glGetVertexAttribiv)) (GLuint index, GLenum pname, GLint* params) = NULL; +void (*GL(glGetVertexAttribPointerv)) (GLuint index, GLenum pname, void** pointer) = NULL; +void (*GL(glHint)) (GLenum target, GLenum mode) = NULL; +GLboolean (*GL(glIsBuffer)) (GLuint buffer) = NULL; +GLboolean (*GL(glIsEnabled)) (GLenum cap) = NULL; +GLboolean (*GL(glIsFramebuffer)) (GLuint framebuffer) = NULL; +GLboolean (*GL(glIsProgram)) (GLuint program) = NULL; +GLboolean (*GL(glIsRenderbuffer)) (GLuint renderbuffer) = NULL; +GLboolean (*GL(glIsShader)) (GLuint shader) = NULL; +GLboolean (*GL(glIsTexture)) (GLuint texture) = NULL; +void (*GL(glLineWidth)) (GLfloat width) = NULL; +void (*GL(glLinkProgram)) (GLuint program) = NULL; +void (*GL(glPixelStorei)) (GLenum pname, GLint param) = NULL; +void (*GL(glPolygonOffset)) (GLfloat factor, GLfloat units) = NULL; +void (*GL(glReadPixels)) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = NULL; +void (*GL(glReleaseShaderCompiler)) (void) = NULL; +void (*GL(glRenderbufferStorage)) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL; +void (*GL(glSampleCoverage)) (GLclampf value, GLboolean invert) = NULL; +void (*GL(glScissor)) (GLint x, GLint y, GLsizei width, GLsizei height) = NULL; +void (*GL(glShaderBinary)) (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) = NULL; +void (*GL(glShaderSource)) (GLuint shader, GLsizei count, const char** string, const GLint* length) = NULL; +void (*GL(glStencilFunc)) (GLenum func, GLint ref, GLuint mask) = NULL; +void (*GL(glStencilFuncSeparate)) (GLenum face, GLenum func, GLint ref, GLuint mask) = NULL; +void (*GL(glStencilMask)) (GLuint mask) = NULL; +void (*GL(glStencilMaskSeparate)) (GLenum face, GLuint mask) = NULL; +void (*GL(glStencilOp)) (GLenum fail, GLenum zfail, GLenum zpass) = NULL; +void (*GL(glStencilOpSeparate)) (GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = NULL; +void (*GL(glTexImage2D)) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) = NULL; +void (*GL(glTexParameterf)) (GLenum target, GLenum pname, GLfloat param) = NULL; +void (*GL(glTexParameterfv)) (GLenum target, GLenum pname, const GLfloat* params) = NULL; +void (*GL(glTexParameteri)) (GLenum target, GLenum pname, GLint param) = NULL; +void (*GL(glTexParameteriv)) (GLenum target, GLenum pname, const GLint* params) = NULL; +void (*GL(glTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) = NULL; +void (*GL(glUniform1f)) (GLint location, GLfloat x) = NULL; +void (*GL(glUniform1fv)) (GLint location, GLsizei count, const GLfloat* v) = NULL; +void (*GL(glUniform1i)) (GLint location, GLint x) = NULL; +void (*GL(glUniform1iv)) (GLint location, GLsizei count, const GLint* v) = NULL; +void (*GL(glUniform2f)) (GLint location, GLfloat x, GLfloat y) = NULL; +void (*GL(glUniform2fv)) (GLint location, GLsizei count, const GLfloat* v) = NULL; +void (*GL(glUniform2i)) (GLint location, GLint x, GLint y) = NULL; +void (*GL(glUniform2iv)) (GLint location, GLsizei count, const GLint* v) = NULL; +void (*GL(glUniform3f)) (GLint location, GLfloat x, GLfloat y, GLfloat z) = NULL; +void (*GL(glUniform3fv)) (GLint location, GLsizei count, const GLfloat* v) = NULL; +void (*GL(glUniform3i)) (GLint location, GLint x, GLint y, GLint z) = NULL; +void (*GL(glUniform3iv)) (GLint location, GLsizei count, const GLint* v) = NULL; +void (*GL(glUniform4f)) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL; +void (*GL(glUniform4fv)) (GLint location, GLsizei count, const GLfloat* v) = NULL; +void (*GL(glUniform4i)) (GLint location, GLint x, GLint y, GLint z, GLint w) = NULL; +void (*GL(glUniform4iv)) (GLint location, GLsizei count, const GLint* v) = NULL; +void (*GL(glUniformMatrix2fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +void (*GL(glUniformMatrix3fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +void (*GL(glUniformMatrix4fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +void (*GL(glUseProgram)) (GLuint program) = NULL; +void (*GL(glValidateProgram)) (GLuint program) = NULL; +void (*GL(glVertexAttrib1f)) (GLuint indx, GLfloat x) = NULL; +void (*GL(glVertexAttrib1fv)) (GLuint indx, const GLfloat* values) = NULL; +void (*GL(glVertexAttrib2f)) (GLuint indx, GLfloat x, GLfloat y) = NULL; +void (*GL(glVertexAttrib2fv)) (GLuint indx, const GLfloat* values) = NULL; +void (*GL(glVertexAttrib3f)) (GLuint indx, GLfloat x, GLfloat y, GLfloat z) = NULL; +void (*GL(glVertexAttrib3fv)) (GLuint indx, const GLfloat* values) = NULL; +void (*GL(glVertexAttrib4f)) (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL; +void (*GL(glVertexAttrib4fv)) (GLuint indx, const GLfloat* values) = NULL; +void (*GL(glVertexAttribPointer)) (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) = NULL; +void (*GL(glViewport)) (GLint x, GLint y, GLsizei width, GLsizei height) = NULL; + +/* Extensions */ +void (*GL(glGetProgramBinary)) (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL; +void (*GL(glProgramBinary)) (GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL; +void (*GL(glProgramParameteri)) (GLuint a, GLuint b, GLint d) = NULL; + + + + + +//------------------------------------------------------// +// GLES 2.0 APIs... +static void (*_sym_glActiveTexture) (GLenum texture) = NULL; +static void (*_sym_glAttachShader) (GLuint program, GLuint shader) = NULL; +static void (*_sym_glBindAttribLocation) (GLuint program, GLuint index, const char* name) = NULL; +static void (*_sym_glBindBuffer) (GLenum target, GLuint buffer) = NULL; +static void (*_sym_glBindFramebuffer) (GLenum target, GLuint framebuffer) = NULL; +static void (*_sym_glBindRenderbuffer) (GLenum target, GLuint renderbuffer) = NULL; +static void (*_sym_glBindTexture) (GLenum target, GLuint texture) = NULL; +static void (*_sym_glBlendColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL; +static void (*_sym_glBlendEquation) (GLenum mode) = NULL; +static void (*_sym_glBlendEquationSeparate) (GLenum modeRGB, GLenum modeAlpha) = NULL; +static void (*_sym_glBlendFunc) (GLenum sfactor, GLenum dfactor) = NULL; +static void (*_sym_glBlendFuncSeparate) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL; +static void (*_sym_glBufferData) (GLenum target, GLsizeiptr size, const void* data, GLenum usage) = NULL; +static void (*_sym_glBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = NULL; +static GLenum (*_sym_glCheckFramebufferStatus) (GLenum target) = NULL; +static void (*_sym_glClear) (GLbitfield mask) = NULL; +static void (*_sym_glClearColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL; +static void (*_sym_glClearDepthf) (GLclampf depth) = NULL; +static void (*_sym_glClearStencil) (GLint s) = NULL; +static void (*_sym_glColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = NULL; +static void (*_sym_glCompileShader) (GLuint shader) = NULL; +static void (*_sym_glCompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) = NULL; +static void (*_sym_glCompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) = NULL; +static void (*_sym_glCopyTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = NULL; +static void (*_sym_glCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL; +static GLuint (*_sym_glCreateProgram) (void) = NULL; +static GLuint (*_sym_glCreateShader) (GLenum type) = NULL; +static void (*_sym_glCullFace) (GLenum mode) = NULL; +static void (*_sym_glDeleteBuffers) (GLsizei n, const GLuint* buffers) = NULL; +static void (*_sym_glDeleteFramebuffers) (GLsizei n, const GLuint* framebuffers) = NULL; +static void (*_sym_glDeleteProgram) (GLuint program) = NULL; +static void (*_sym_glDeleteRenderbuffers) (GLsizei n, const GLuint* renderbuffers) = NULL; +static void (*_sym_glDeleteShader) (GLuint shader) = NULL; +static void (*_sym_glDeleteTextures) (GLsizei n, const GLuint* textures) = NULL; +static void (*_sym_glDepthFunc) (GLenum func) = NULL; +static void (*_sym_glDepthMask) (GLboolean flag) = NULL; +static void (*_sym_glDepthRangef) (GLclampf zNear, GLclampf zFar) = NULL; +static void (*_sym_glDetachShader) (GLuint program, GLuint shader) = NULL; +static void (*_sym_glDisable) (GLenum cap) = NULL; +static void (*_sym_glDisableVertexAttribArray) (GLuint index) = NULL; +static void (*_sym_glDrawArrays) (GLenum mode, GLint first, GLsizei count) = NULL; +static void (*_sym_glDrawElements) (GLenum mode, GLsizei count, GLenum type, const void* indices) = NULL; +static void (*_sym_glEnable) (GLenum cap) = NULL; +static void (*_sym_glEnableVertexAttribArray) (GLuint index) = NULL; +static void (*_sym_glFinish) (void) = NULL; +static void (*_sym_glFlush) (void) = NULL; +static void (*_sym_glFramebufferRenderbuffer) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL; +static void (*_sym_glFramebufferTexture2D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL; +static void (*_sym_glFrontFace) (GLenum mode) = NULL; +static void (*_sym_glGenBuffers) (GLsizei n, GLuint* buffers) = NULL; +static void (*_sym_glGenerateMipmap) (GLenum target) = NULL; +static void (*_sym_glGenFramebuffers) (GLsizei n, GLuint* framebuffers) = NULL; +static void (*_sym_glGenRenderbuffers) (GLsizei n, GLuint* renderbuffers) = NULL; +static void (*_sym_glGenTextures) (GLsizei n, GLuint* textures) = NULL; +static void (*_sym_glGetActiveAttrib) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL; +static void (*_sym_glGetActiveUniform) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL; +static void (*_sym_glGetAttachedShaders) (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = NULL; +static int (*_sym_glGetAttribLocation) (GLuint program, const char* name) = NULL; +static void (*_sym_glGetBooleanv) (GLenum pname, GLboolean* params) = NULL; +static void (*_sym_glGetBufferParameteriv) (GLenum target, GLenum pname, GLint* params) = NULL; +static GLenum (*_sym_glGetError) (void) = NULL; +static void (*_sym_glGetFloatv) (GLenum pname, GLfloat* params) = NULL; +static void (*_sym_glGetFramebufferAttachmentParameteriv) (GLenum target, GLenum attachment, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetIntegerv) (GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetProgramiv) (GLuint program, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetProgramInfoLog) (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = NULL; +static void (*_sym_glGetRenderbufferParameteriv) (GLenum target, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetShaderiv) (GLuint shader, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetShaderInfoLog) (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = NULL; +static void (*_sym_glGetShaderPrecisionFormat) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = NULL; +static void (*_sym_glGetShaderSource) (GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = NULL; +static const GLubyte *(*_sym_glGetString) (GLenum name) = NULL; +static void (*_sym_glGetTexParameterfv) (GLenum target, GLenum pname, GLfloat* params) = NULL; +static void (*_sym_glGetTexParameteriv) (GLenum target, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetUniformfv) (GLuint program, GLint location, GLfloat* params) = NULL; +static void (*_sym_glGetUniformiv) (GLuint program, GLint location, GLint* params) = NULL; +static int (*_sym_glGetUniformLocation) (GLuint program, const char* name) = NULL; +static void (*_sym_glGetVertexAttribfv) (GLuint index, GLenum pname, GLfloat* params) = NULL; +static void (*_sym_glGetVertexAttribiv) (GLuint index, GLenum pname, GLint* params) = NULL; +static void (*_sym_glGetVertexAttribPointerv) (GLuint index, GLenum pname, void** pointer) = NULL; +static void (*_sym_glHint) (GLenum target, GLenum mode) = NULL; +static GLboolean (*_sym_glIsBuffer) (GLuint buffer) = NULL; +static GLboolean (*_sym_glIsEnabled) (GLenum cap) = NULL; +static GLboolean (*_sym_glIsFramebuffer) (GLuint framebuffer) = NULL; +static GLboolean (*_sym_glIsProgram) (GLuint program) = NULL; +static GLboolean (*_sym_glIsRenderbuffer) (GLuint renderbuffer) = NULL; +static GLboolean (*_sym_glIsShader) (GLuint shader) = NULL; +static GLboolean (*_sym_glIsTexture) (GLuint texture) = NULL; +static void (*_sym_glLineWidth) (GLfloat width) = NULL; +static void (*_sym_glLinkProgram) (GLuint program) = NULL; +static void (*_sym_glPixelStorei) (GLenum pname, GLint param) = NULL; +static void (*_sym_glPolygonOffset) (GLfloat factor, GLfloat units) = NULL; +static void (*_sym_glReadPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = NULL; +static void (*_sym_glReleaseShaderCompiler) (void) = NULL; +static void (*_sym_glRenderbufferStorage) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL; +static void (*_sym_glSampleCoverage) (GLclampf value, GLboolean invert) = NULL; +static void (*_sym_glScissor) (GLint x, GLint y, GLsizei width, GLsizei height) = NULL; +static void (*_sym_glShaderBinary) (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) = NULL; +static void (*_sym_glShaderSource) (GLuint shader, GLsizei count, const char** string, const GLint* length) = NULL; +static void (*_sym_glStencilFunc) (GLenum func, GLint ref, GLuint mask) = NULL; +static void (*_sym_glStencilFuncSeparate) (GLenum face, GLenum func, GLint ref, GLuint mask) = NULL; +static void (*_sym_glStencilMask) (GLuint mask) = NULL; +static void (*_sym_glStencilMaskSeparate) (GLenum face, GLuint mask) = NULL; +static void (*_sym_glStencilOp) (GLenum fail, GLenum zfail, GLenum zpass) = NULL; +static void (*_sym_glStencilOpSeparate) (GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = NULL; +static void (*_sym_glTexImage2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) = NULL; +static void (*_sym_glTexParameterf) (GLenum target, GLenum pname, GLfloat param) = NULL; +static void (*_sym_glTexParameterfv) (GLenum target, GLenum pname, const GLfloat* params) = NULL; +static void (*_sym_glTexParameteri) (GLenum target, GLenum pname, GLint param) = NULL; +static void (*_sym_glTexParameteriv) (GLenum target, GLenum pname, const GLint* params) = NULL; +static void (*_sym_glTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) = NULL; +static void (*_sym_glUniform1f) (GLint location, GLfloat x) = NULL; +static void (*_sym_glUniform1fv) (GLint location, GLsizei count, const GLfloat* v) = NULL; +static void (*_sym_glUniform1i) (GLint location, GLint x) = NULL; +static void (*_sym_glUniform1iv) (GLint location, GLsizei count, const GLint* v) = NULL; +static void (*_sym_glUniform2f) (GLint location, GLfloat x, GLfloat y) = NULL; +static void (*_sym_glUniform2fv) (GLint location, GLsizei count, const GLfloat* v) = NULL; +static void (*_sym_glUniform2i) (GLint location, GLint x, GLint y) = NULL; +static void (*_sym_glUniform2iv) (GLint location, GLsizei count, const GLint* v) = NULL; +static void (*_sym_glUniform3f) (GLint location, GLfloat x, GLfloat y, GLfloat z) = NULL; +static void (*_sym_glUniform3fv) (GLint location, GLsizei count, const GLfloat* v) = NULL; +static void (*_sym_glUniform3i) (GLint location, GLint x, GLint y, GLint z) = NULL; +static void (*_sym_glUniform3iv) (GLint location, GLsizei count, const GLint* v) = NULL; +static void (*_sym_glUniform4f) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL; +static void (*_sym_glUniform4fv) (GLint location, GLsizei count, const GLfloat* v) = NULL; +static void (*_sym_glUniform4i) (GLint location, GLint x, GLint y, GLint z, GLint w) = NULL; +static void (*_sym_glUniform4iv) (GLint location, GLsizei count, const GLint* v) = NULL; +static void (*_sym_glUniformMatrix2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +static void (*_sym_glUniformMatrix3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +static void (*_sym_glUniformMatrix4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL; +static void (*_sym_glUseProgram) (GLuint program) = NULL; +static void (*_sym_glValidateProgram) (GLuint program) = NULL; +static void (*_sym_glVertexAttrib1f) (GLuint indx, GLfloat x) = NULL; +static void (*_sym_glVertexAttrib1fv) (GLuint indx, const GLfloat* values) = NULL; +static void (*_sym_glVertexAttrib2f) (GLuint indx, GLfloat x, GLfloat y) = NULL; +static void (*_sym_glVertexAttrib2fv) (GLuint indx, const GLfloat* values) = NULL; +static void (*_sym_glVertexAttrib3f) (GLuint indx, GLfloat x, GLfloat y, GLfloat z) = NULL; +static void (*_sym_glVertexAttrib3fv) (GLuint indx, const GLfloat* values) = NULL; +static void (*_sym_glVertexAttrib4f) (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL; +static void (*_sym_glVertexAttrib4fv) (GLuint indx, const GLfloat* values) = NULL; +static void (*_sym_glVertexAttribPointer) (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) = NULL; +static void (*_sym_glViewport) (GLint x, GLint y, GLsizei width, GLsizei height) = NULL; + +// GLES Extensions... +static void (*_sym_glGetProgramBinary) (GLuint a, GLsizei b, GLsizei* c, GLenum* d, void* e) = NULL; +static void (*_sym_glProgramBinary) (GLuint a, GLenum b, const void* c, GLint d) = NULL; +static void (*_sym_glProgramParameteri) (GLuint a, GLuint b, GLint d) = NULL; + + +//------------------------------------------------------// +// For internal fastpath +static int +init_context_states(EvasGlueContext ctx) +{ + int i; + + if (!ctx) + { + ERR("Context NULL\n"); + return 0; + } + + // Set Magic and other inits + ctx->magic = MAGIC_GLFAST; + ctx->first_time = 1; + + //-------------------// + ctx->num_tex_units = MAX_TEXTURE_UNITS; + ctx->num_vertex_attribs = MAX_VERTEX_ATTRIBS; + + //----------------------------------------// + // GL States + // Bind Functions + // glBind {Buffer, Framebuffer, Renderbuffer, Texture} + ctx->gl_array_buffer_binding = 0; + ctx->gl_element_array_buffer_binding = 0; + ctx->gl_framebuffer_binding = 0; + ctx->gl_renderbuffer_binding = 0; + + // Enable States + // glEnable() + ctx->gl_blend = GL_FALSE; + ctx->gl_cull_face = GL_FALSE; + ctx->gl_cull_face_mode = GL_FALSE; + ctx->gl_depth_test = GL_FALSE; + ctx->gl_dither = GL_TRUE; + ctx->gl_polygon_offset_fill = GL_FALSE; + ctx->gl_sample_alpha_to_coverage = GL_FALSE; + ctx->gl_sample_coverage = GL_FALSE; + ctx->gl_scissor_test = GL_FALSE; + ctx->gl_stencil_test = GL_FALSE; + + // Viewport - Set it to 0 + ctx->gl_viewport[0] = 0; // (0,0,w,h) + ctx->gl_viewport[1] = 0; // (0,0,w,h) + ctx->gl_viewport[2] = 0; // (0,0,w,h) + ctx->gl_viewport[3] = 0; // (0,0,w,h) + + // Program (Shaders) + ctx->gl_current_program = 0; + + // Texture + // ctx->tex_state[MAX_TEXTURE_UNITS] + ctx->gl_active_texture = GL_TEXTURE0; + ctx->gl_generate_mipmap_hint = GL_DONT_CARE; + ctx->gl_texture_binding_2d = 0; + ctx->gl_texture_binding_cube_map = 0; + + + // Clear Color + ctx->gl_color_clear_value[0] = 0; + ctx->gl_color_clear_value[1] = 0; + ctx->gl_color_clear_value[2] = 0; + ctx->gl_color_clear_value[3] = 0; + ctx->gl_color_writemask[0] = GL_TRUE; + ctx->gl_color_writemask[1] = GL_TRUE; + ctx->gl_color_writemask[2] = GL_TRUE; + ctx->gl_color_writemask[3] = GL_TRUE; + + // Depth + ctx->gl_depth_range[0] = 0; + ctx->gl_depth_range[1] = 1; + ctx->gl_depth_clear_value = 1; + ctx->gl_depth_func = GL_LESS; + ctx->gl_depth_writemask = GL_TRUE; + + // Blending + ctx->gl_blend_color[0] = 0; + ctx->gl_blend_color[1] = 0; + ctx->gl_blend_color[2] = 0; + ctx->gl_blend_color[3] = 0; + ctx->gl_blend_src_rgb = GL_ONE; + ctx->gl_blend_src_alpha = GL_ONE; + ctx->gl_blend_dst_rgb = GL_ZERO; + ctx->gl_blend_dst_alpha = GL_ZERO; + ctx->gl_blend_equation_rgb = GL_FUNC_ADD; + ctx->gl_blend_equation_alpha = GL_FUNC_ADD; + + // Stencil + ctx->gl_stencil_fail = GL_KEEP; + ctx->gl_stencil_func = GL_ALWAYS; + ctx->gl_stencil_pass_depth_fail = GL_KEEP; + ctx->gl_stencil_pass_depth_pass = GL_KEEP; + ctx->gl_stencil_ref = 0; + ctx->gl_stencil_value_mask = 0xffffffff; + ctx->gl_stencil_writemask = 0xffffffff; + + ctx->gl_stencil_back_fail = GL_KEEP; + ctx->gl_stencil_back_func = GL_ALWAYS; + ctx->gl_stencil_back_depth_fail = GL_KEEP; + ctx->gl_stencil_back_depth_pass = GL_KEEP; + ctx->gl_stencil_back_ref = 0; + ctx->gl_stencil_back_value_mask = 0xffffffff; + ctx->gl_stencil_back_writemask = 0xffffffff; + ctx->gl_stencil_clear_value = 0; + + // Misc. + ctx->gl_front_face = GL_CCW; + ctx->gl_line_width = 1; + ctx->gl_polygon_offset_factor = 0; + ctx->gl_polygon_offset_units = 0; + + ctx->gl_sample_coverage_value = 1.0; + ctx->gl_sample_coverage_invert = GL_FALSE; + ctx->gl_scissor_box[0] = 0; + ctx->gl_scissor_box[1] = 0; + ctx->gl_scissor_box[2] = 0; // Supposed to be w + ctx->gl_scissor_box[3] = 0; // Supposed to be h + + ctx->gl_pack_alignment = 4; + ctx->gl_unpack_alignment = 4; + + + // Vertex Attrib Array + for (i = 0; i < MAX_VERTEX_ATTRIBS; i++) + { + ctx->vertex_array[i].modified = GL_FALSE; + ctx->vertex_array[i].enabled = GL_FALSE; + ctx->vertex_array[i].size = 0; + ctx->vertex_array[i].type = GL_FLOAT; + ctx->vertex_array[i].normalized = GL_FALSE; + ctx->vertex_array[i].stride = GL_FALSE; + ctx->vertex_array[i].pointer = NULL; + } + + ctx->gl_current_vertex_attrib[0] = 0; + ctx->gl_current_vertex_attrib[1] = 0; + ctx->gl_current_vertex_attrib[2] = 0; + ctx->gl_current_vertex_attrib[3] = 1; + + return 1; +} + +static void +make_context_current(EvasGlueContext oldctx, EvasGlueContext newctx) +{ + unsigned char flag = 0; + int i = 0; + + // Return if they're the same + if (oldctx==newctx) return; + +#define STATE_COMPARE(state) \ + if ((oldctx->state) != (newctx->state)) +#define STATES_COMPARE(state_ptr, bytes) \ + if ((memcmp((oldctx->state_ptr), (newctx->state_ptr), (bytes))) != 0) + + _sym_glFlush(); + + //------------------// + // _bind_flag + flag = oldctx->_bind_flag | newctx->_bind_flag; + if (flag) + { + STATE_COMPARE(gl_array_buffer_binding) + { + _sym_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding); + } + STATE_COMPARE(gl_element_array_buffer_binding) + { + _sym_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding); + } + STATE_COMPARE(gl_framebuffer_binding) + { + _sym_glBindFramebuffer(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding); + } + STATE_COMPARE(gl_renderbuffer_binding) + { + _sym_glBindRenderbuffer(GL_RENDERBUFFER, newctx->gl_renderbuffer_binding); + } + } + + //------------------// + // Enable States + // _enable_flag1 + flag = oldctx->_enable_flag1 | newctx->_enable_flag1; + if (flag) + { + STATE_COMPARE(gl_blend) + { + if (newctx->gl_blend) + _sym_glEnable(GL_BLEND); + else + _sym_glDisable(GL_BLEND); + } + STATE_COMPARE(gl_cull_face) + { + if (newctx->gl_cull_face) + _sym_glEnable(GL_CULL_FACE); + else + _sym_glDisable(GL_CULL_FACE); + } + STATE_COMPARE(gl_depth_test) + { + if (newctx->gl_depth_test) + _sym_glEnable(GL_DEPTH_TEST); + else + _sym_glDisable(GL_DEPTH_TEST); + } + STATE_COMPARE(gl_dither) + { + if (newctx->gl_dither) + _sym_glEnable(GL_DITHER); + else + _sym_glDisable(GL_DITHER); + } + } + + // _enable_flag2 + flag = oldctx->_enable_flag2 | newctx->_enable_flag2; + if (flag) + { + STATE_COMPARE(gl_polygon_offset_fill) + { + if (newctx->gl_polygon_offset_fill) + _sym_glEnable(GL_POLYGON_OFFSET_FILL); + else + _sym_glDisable(GL_POLYGON_OFFSET_FILL); + } + STATE_COMPARE(gl_sample_alpha_to_coverage) + { + if (newctx->gl_sample_alpha_to_coverage) + _sym_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); + else + _sym_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE); + } + STATE_COMPARE(gl_sample_coverage) + { + if (newctx->gl_sample_coverage) + _sym_glEnable(GL_SAMPLE_COVERAGE); + else + _sym_glDisable(GL_SAMPLE_COVERAGE); + } + STATE_COMPARE(gl_scissor_test) + { + if (newctx->gl_scissor_test) + _sym_glEnable(GL_SCISSOR_TEST); + else + _sym_glDisable(GL_SCISSOR_TEST); + } + STATE_COMPARE(gl_stencil_test) + { + if (newctx->gl_stencil_test) + _sym_glEnable(GL_STENCIL_TEST); + else + _sym_glDisable(GL_STENCIL_TEST); + } + } + + //------------------// + // _clear_flag1 + flag = oldctx->_clear_flag1 | newctx->_clear_flag1; + if (flag) + { + // Viewport. + STATES_COMPARE(gl_viewport, 4*sizeof(GLint)) + { + _sym_glViewport(newctx->gl_viewport[0], + newctx->gl_viewport[1], + newctx->gl_viewport[2], + newctx->gl_viewport[3]); + } + STATE_COMPARE(gl_current_program) + { + _sym_glUseProgram(newctx->gl_current_program); + } + STATES_COMPARE(gl_color_clear_value, 4*sizeof(GLclampf)) + { + _sym_glClearColor(newctx->gl_color_clear_value[0], + newctx->gl_color_clear_value[1], + newctx->gl_color_clear_value[2], + newctx->gl_color_clear_value[3]); + } + } + + + // _clear_flag2 + flag = oldctx->_clear_flag2 | newctx->_clear_flag2; + if (flag) + { + STATES_COMPARE(gl_color_writemask, 4*sizeof(GLboolean)) + { + _sym_glColorMask(newctx->gl_color_writemask[0], + newctx->gl_color_writemask[1], + newctx->gl_color_writemask[2], + newctx->gl_color_writemask[3]); + } + STATES_COMPARE(gl_depth_range, 2*sizeof(GLclampf)) + { + _sym_glDepthRangef(newctx->gl_depth_range[0], + newctx->gl_depth_range[1]); + } + STATE_COMPARE(gl_depth_clear_value) + { + _sym_glClearDepthf(newctx->gl_depth_clear_value); + } + STATE_COMPARE(gl_depth_func) + { + _sym_glDepthFunc(newctx->gl_depth_func); + } + STATE_COMPARE(gl_depth_writemask) + { + _sym_glDepthMask(newctx->gl_depth_writemask); + } + STATE_COMPARE(gl_cull_face_mode) + { + _sym_glCullFace(oldctx->gl_cull_face_mode); + } + + } + //------------------// + // Texture here... + flag = oldctx->_tex_flag1 | newctx->_tex_flag1; + if (flag) + { + + for (i = 0; i < oldctx->num_tex_units; i++) + { + STATE_COMPARE(tex_state[i].tex_id) + { + _sym_glActiveTexture(GL_TEXTURE0+i); + _sym_glBindTexture(newctx->tex_state[i].tex_unit, newctx->tex_state[i].tex_id); + } + } + + // Restore active texture + _sym_glActiveTexture(newctx->gl_active_texture); + + STATE_COMPARE(gl_generate_mipmap_hint) + { + _sym_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint); + } + /* + STATE_COMPARE(gl_texture_binding_2d) + { + _sym_glBindTexture(GL_TEXTURE_2D, newctx->gl_texture_binding_2d); + } + STATE_COMPARE(gl_texture_binding_cube_map) + { + _sym_glBindTexture(GL_TEXTURE_CUBE_MAP, newctx->gl_texture_binding_cube_map); + } + */ + } + + + //------------------// + flag = oldctx->_blend_flag | newctx->_blend_flag; + if (flag) + { + STATES_COMPARE(gl_blend_color, 4*sizeof(GLclampf)) + { + _sym_glBlendColor(newctx->gl_blend_color[0], + newctx->gl_blend_color[1], + newctx->gl_blend_color[2], + newctx->gl_blend_color[3]); + } + if ((oldctx->gl_blend_src_rgb != newctx->gl_blend_src_rgb) || + (oldctx->gl_blend_dst_rgb != newctx->gl_blend_dst_rgb) || + (oldctx->gl_blend_src_alpha != newctx->gl_blend_src_alpha) || + (oldctx->gl_blend_dst_alpha != newctx->gl_blend_dst_alpha)) + { + _sym_glBlendFuncSeparate(newctx->gl_blend_src_rgb, + newctx->gl_blend_dst_rgb, + newctx->gl_blend_src_alpha, + newctx->gl_blend_dst_alpha); + } + if ((oldctx->gl_blend_equation_rgb != newctx->gl_blend_equation_rgb) || + (oldctx->gl_blend_equation_alpha != newctx->gl_blend_equation_alpha)) + { + _sym_glBlendEquationSeparate(newctx->gl_blend_equation_rgb, newctx->gl_blend_equation_alpha); + } + + } + + //------------------// + // _stencil_flag1 + flag = oldctx->_stencil_flag1 | newctx->_stencil_flag1; + if (flag) + { + if ((oldctx->gl_stencil_func != newctx->gl_stencil_func) || + (oldctx->gl_stencil_ref != newctx->gl_stencil_ref) || + (oldctx->gl_stencil_value_mask != newctx->gl_stencil_value_mask)) + { + _sym_glStencilFuncSeparate(GL_FRONT, + newctx->gl_stencil_func, + newctx->gl_stencil_ref, + newctx->gl_stencil_value_mask); + } + if ((oldctx->gl_stencil_fail != newctx->gl_stencil_fail) || + (oldctx->gl_stencil_pass_depth_fail != newctx->gl_stencil_pass_depth_fail) || + (oldctx->gl_stencil_pass_depth_pass != newctx->gl_stencil_pass_depth_pass)) + { + _sym_glStencilOpSeparate(GL_FRONT, + newctx->gl_stencil_fail, + newctx->gl_stencil_pass_depth_fail, + newctx->gl_stencil_pass_depth_pass); + } + STATE_COMPARE(gl_stencil_writemask) + { + _sym_glStencilMaskSeparate(GL_FRONT, newctx->gl_stencil_writemask); + } + } + + + // _stencil_flag1 + flag = oldctx->_stencil_flag2 | newctx->_stencil_flag2; + if (flag) + { + if ((oldctx->gl_stencil_back_func != newctx->gl_stencil_back_func) || + (oldctx->gl_stencil_back_ref != newctx->gl_stencil_back_ref) || + (oldctx->gl_stencil_back_depth_pass != newctx->gl_stencil_back_depth_pass)) + { + _sym_glStencilFuncSeparate(GL_BACK, + newctx->gl_stencil_back_func, + newctx->gl_stencil_back_ref, + newctx->gl_stencil_back_value_mask); + } + if ((oldctx->gl_stencil_back_fail != newctx->gl_stencil_back_fail) || + (oldctx->gl_stencil_back_depth_fail != newctx->gl_stencil_back_depth_fail) || + (oldctx->gl_stencil_back_depth_pass != newctx->gl_stencil_back_depth_pass)) + { + _sym_glStencilOpSeparate(GL_BACK, + newctx->gl_stencil_back_fail, + newctx->gl_stencil_back_depth_fail, + newctx->gl_stencil_back_depth_pass); + } + STATE_COMPARE(gl_stencil_back_writemask) + { + _sym_glStencilMaskSeparate(GL_BACK, newctx->gl_stencil_back_writemask); + } + STATE_COMPARE(gl_stencil_clear_value) + { + _sym_glClearStencil(newctx->gl_stencil_clear_value); + } + } + + //------------------// + // _misc_flag1 + flag = oldctx->_misc_flag1 | newctx->_misc_flag1; + if (flag) + { + STATE_COMPARE(gl_front_face) + { + _sym_glFrontFace(newctx->gl_front_face); + } + STATE_COMPARE(gl_line_width) + { + _sym_glLineWidth(newctx->gl_line_width); + } + if ((oldctx->gl_polygon_offset_factor != newctx->gl_polygon_offset_factor) || + (oldctx->gl_polygon_offset_units != newctx->gl_polygon_offset_units)) + { + _sym_glPolygonOffset(newctx->gl_polygon_offset_factor, + newctx->gl_polygon_offset_units); + } + if ((oldctx->gl_sample_coverage_value != newctx->gl_sample_coverage_value) || + (oldctx->gl_sample_coverage_invert != newctx->gl_sample_coverage_invert)) + { + _sym_glSampleCoverage(newctx->gl_sample_coverage_value, + newctx->gl_sample_coverage_invert); + } + } + + // _misc_flag2 + flag = oldctx->_misc_flag2 | newctx->_misc_flag2; + if (flag) + { + STATES_COMPARE(gl_scissor_box, 4*sizeof(GLint)) + { + _sym_glScissor(newctx->gl_scissor_box[0], + newctx->gl_scissor_box[1], + newctx->gl_scissor_box[2], + newctx->gl_scissor_box[3]); + } + STATE_COMPARE(gl_pack_alignment) + { + _sym_glPixelStorei(GL_PACK_ALIGNMENT, newctx->gl_pack_alignment); + } + STATE_COMPARE(gl_unpack_alignment) + { + _sym_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment); + } + } + + // _varray_flag + flag = oldctx->_varray_flag | newctx->_varray_flag; + if (flag) + { + for (i = 0; i < MAX_VERTEX_ATTRIBS; i++) + { + // If both untouched, don't bother + if ((oldctx->vertex_array[i].modified == GL_FALSE) && + (newctx->vertex_array[i].modified == GL_FALSE)) + continue; + _sym_glVertexAttribPointer(i, + newctx->vertex_array[i].size, + newctx->vertex_array[i].type, + newctx->vertex_array[i].normalized, + newctx->vertex_array[i].stride, + newctx->vertex_array[i].pointer); + + if (newctx->vertex_array[i].enabled == GL_TRUE) + _sym_glEnableVertexAttribArray(i); + else + _sym_glDisableVertexAttribArray(i); + } + } +#undef STATE_COMPARE +#undef STATES_COMPARE +} +//----------------------------------------------------------------// +// // +// Wrapped Glue Functions // +// // +//----------------------------------------------------------------// + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + +//----------------------------------------------------------------// +// Wrapped EGL Functions // +//----------------------------------------------------------------// +static _eng_fn +evgl_eglGetProcAddress(const char* procname) +{ + return _sym_eglGetProcAddress(procname); +} + +static EGLint +evgl_eglGetError(void) +{ + return _sym_eglGetError(); +} + +static EGLDisplay +evgl_eglGetDisplay(EGLNativeDisplayType display_id) +{ + return _sym_eglGetDisplay(display_id); +} + +static EGLBoolean +evgl_eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) +{ + return _sym_eglInitialize(dpy, major, minor); +} + +static EGLBoolean +evgl_eglTerminate(EGLDisplay dpy) +{ + return _sym_eglTerminate(dpy); +} + +static EGLBoolean +evgl_eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config) +{ + return _sym_eglChooseConfig(dpy, attrib_list, configs, config_size, num_config); +} + +static EGLSurface +evgl_eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list) +{ + return _sym_eglCreateWindowSurface(dpy, config, win, attrib_list); +} + +static EGLSurface +evgl_eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list) +{ + return _sym_eglCreatePixmapSurface(dpy, config, pixmap, attrib_list); +} + +static EGLBoolean +evgl_eglDestroySurface(EGLDisplay dpy, EGLSurface surface) +{ + return _sym_eglDestroySurface(dpy, surface); +} + +static EGLBoolean +evgl_eglBindAPI(EGLenum api) +{ + return _sym_eglBindAPI(api); +} + +static EGLBoolean +evgl_eglWaitClient(void) +{ + return _sym_eglWaitClient(); +} + +static EGLBoolean +evgl_eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) +{ + return _sym_eglSurfaceAttrib(dpy, surface, attribute, value); +} + +static void +evgl_eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) +{ + _sym_eglBindTexImage(dpy, surface, buffer); +} + +static EGLBoolean +evgl_eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) +{ + return _sym_eglReleaseTexImage(dpy, surface, buffer); +} + +static EGLBoolean +evgl_eglSwapInterval(EGLDisplay dpy, EGLint interval) +{ + return _sym_eglSwapInterval(dpy, interval); +} + +static EGLContext +evgl_eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list) +{ + return _sym_eglCreateContext(dpy, config, share_context, attrib_list); +} + +static EGLBoolean +evgl_eglDestroyContext(EGLDisplay dpy, EGLContext ctx) +{ + return _sym_eglDestroyContext(dpy, ctx); +} + +static EGLBoolean +evgl_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) +{ + /* + if (_sym_eglMakeCurrent(dpy, draw, read, ctx)) + { + current_egl_context = ctx; + current_surf = draw; + return EGL_TRUE; + } + else return EGL_FALSE; + */ + return _sym_eglMakeCurrent(dpy, draw, read, ctx); +} + +static EGLContext +evgl_eglGetCurrentContext(void) +{ + //return current_egl_context; + return _sym_eglGetCurrentContext(); +} + +static EGLSurface +evgl_eglGetCurrentSurface(EGLint readdraw) +{ + return _sym_eglGetCurrentSurface(readdraw); +} + +static EGLDisplay +evgl_eglGetCurrentDisplay(void) +{ + return _sym_eglGetCurrentDisplay(); +} + +static EGLBoolean +evgl_eglWaitGL(void) +{ + return _sym_eglWaitGL(); +} + +static EGLBoolean +evgl_eglWaitNative(EGLint engine) +{ + return _sym_eglWaitNative(engine); +} + +static EGLBoolean +evgl_eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) +{ + return _sym_eglSwapBuffers(dpy, surface); +} + +static EGLBoolean +evgl_eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) +{ + return _sym_eglCopyBuffers(dpy, surface, target); +} + +static char const * +evgl_eglQueryString(EGLDisplay dpy, EGLint name) +{ + return _sym_eglQueryString(dpy, name); +} + +static void +evgl_eglCreateImage (void *a, void *b, GLenum c, void *d, const int *e) +{ + _sym_eglCreateImage(a, b, c, d, e); +} + +static unsigned int +evgl_eglDestroyImage (void *a, void *b) +{ + return _sym_eglDestroyImage(a, b); +} + +static void +evgl_glEGLImageTargetTexture2DOES (int a, void *b) +{ + _sym_glEGLImageTargetTexture2DOES(a, b); +} + +static void +evgl_glEGLImageTargetRenderbufferStorageOES (int a, void *b) +{ + _sym_glEGLImageTargetRenderbufferStorageOES(a, b); +} + +static void * +evgl_eglMapImageSEC (void *a, void *b) +{ + _sym_eglMapImageSEC(a, b); +} + +static unsigned int +evgl_eglUnmapImageSEC (void *a, void *b) +{ + return _sym_eglUnmapImageSEC(a, b); +} + +static unsigned int +evgl_eglGetImageAttribSEC (void *a, void *b, int c, int *d) +{ + return _sym_eglGetImageAttribSEC(a, b, c, d); +} +//----------------------------------------------------------------// +// Fastpath EGL Functions // +// The functions have prefix 'fpgl_' for (fastpath gl) // +//----------------------------------------------------------------// +static EGLContext +fpgl_eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list) +{ + EvasGlueContext ctx; + + // Create a global context if it hasn't been created + if (!global_ctx) + { + global_dpy = dpy; + // Create a global context if it hasn't been created yet + global_ctx = _sym_eglCreateContext(dpy, config, NULL, attrib_list); + + if (!global_ctx) + { + ERR("Failed creating a glX global context for FastPath.\n"); + return 0; + } + } + + + // Allocate a new context + ctx = calloc(1, sizeof(struct _EvasGlueContext)); + if (!ctx) + { + ERR("Error creating a new EvasGlueContext.\n"); + return NULL; + } + + // Initialize context states + if (!init_context_states(ctx)) + { + ERR("Error intialing intial context\n"); + free(ctx); + return NULL; + } + + ctx_ref_count++; + + return (EGLContext)ctx; +} + +static EGLBoolean +fpgl_eglDestroyContext(EGLDisplay dpy, EGLContext ctx) +{ + EvasGlueContext ectx = (EvasGlueContext)ctx; + + if (ctx!=NULL) + { + if (ectx->magic != MAGIC_GLFAST) + { + ERR("Magic Check Failed!!!\n"); + return EGL_FALSE; + } + + if (ectx == current_ctx) + { + DBG("Destroying current context... %d\n", ctx_ref_count); + real_current_ctx = current_ctx; + current_ctx = NULL; + } + + if (ectx) + free(ectx); + + if (!(--ctx_ref_count)) + { + DBG("Destroying the global context...\n"); + _sym_eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + _sym_eglDestroyContext(dpy, global_ctx); + global_ctx = NULL; + current_ctx = NULL; + real_current_ctx = NULL; + } + + return EGL_TRUE; + } + else + { + ERR("Invalid Context.\n"); + return EGL_FALSE; + } + +} + +static EGLBoolean +fpgl_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) +{ + EvasGlueContext ectx = (EvasGlueContext)ctx; + + // Check if the values are null + if ((draw == None) || (ctx == NULL)) + { + if (current_ctx) + { + real_current_ctx = current_ctx; + } + + current_ctx = NULL; + current_surf = None; + + return 1; + } + + // Check if the object is correct + if (ectx->magic != MAGIC_GLFAST) + { + ERR("Magic Check Failed!!!\n"); + return 0; + } + + + // If it's a first time or drawable changed, do a make current + if (!global_ctx_initted) + { + if (!_sym_eglMakeCurrent(dpy, draw, read, global_ctx)) + { + ERR("Error making context current with the drawable.\n"); + return False; + } + + current_ctx = ectx; + current_surf = draw; + real_current_ctx = current_ctx; + + global_ctx_initted = 1; + } + + if (current_surf != draw) + { + if (!_sym_eglMakeCurrent(dpy, draw, read, global_ctx)) + { + ERR("Error making context current with the drawable.\n"); + return False; + } + } + + // If it's first time... + if (ectx->first_time == 1) + { + // FIXME!!!: + // Actually, i need to query the drawable size... + // Do some initializations that required make_current + _sym_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &ectx->num_tex_units); // ctx->num_tex_units + _sym_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &ectx->num_vertex_attribs); + + _sym_glGetIntegerv(GL_VIEWPORT, ectx->gl_viewport); + _sym_glGetIntegerv(GL_SCISSOR_BOX, ectx->gl_scissor_box); + + DBG("----Num Tex Units: %d, Num Vertex Attribs: %d \n", ectx->num_tex_units, ectx->num_vertex_attribs); + ectx->first_time = 0; + } + + // if context is same, return + if ( (current_ctx == ectx) && (current_surf == draw) ) + return True; + + if (current_ctx) + make_context_current(current_ctx, ectx); + else + { + make_context_current(real_current_ctx, ectx); + DBG("Current Context NULL...\n"); + } + + current_ctx = ectx; + current_surf = draw; + + return True; +} + +static EGLContext +fpgl_eglGetCurrentContext(void) +{ + return (EGLContext)current_ctx; + //return _sym_eglGetCurrentContext(); +} + +static EGLSurface +fpgl_eglGetCurrentSurface(EGLint readdraw) +{ + return current_surf; + //return _sym_eglGetCurrentSurface(readdraw); +} + +// FIXME!!!! +static void +fvgl_glEGLImageTargetTexture2DOES (int a, void *b) +{ + _sym_glEGLImageTargetTexture2DOES(a, b); +} + +// FIXME!!!! +static void +fvgl_glEGLImageTargetRenderbufferStorageOES (int a, void *b) +{ + _sym_glEGLImageTargetRenderbufferStorageOES(a, b); +} + + +#else + +//----------------------------------------------------------------// +// Wrapped GLX Functions // +//----------------------------------------------------------------// +static _eng_fn +evgl_glXGetProcAddress(const char* procName) +{ + return _sym_glXGetProcAddress(procName); +} + +static XVisualInfo* +evgl_glXChooseVisual(Display* dpy, int screen, int* attribList) +{ + return _sym_glXChooseVisual(dpy, screen, attribList); +} + +static GLXContext +evgl_glXCreateContext(Display* dpy, XVisualInfo* vis, GLXContext shareList, Bool direct) +{ + return _sym_glXCreateContext(dpy, vis, shareList, direct); +} + +static void +evgl_glXDestroyContext(Display* dpy, GLXContext ctx) +{ + _sym_glXDestroyContext(dpy, ctx); +} + +static GLXContext +evgl_glXGetCurrentContext(void) +{ + return _sym_glXGetCurrentContext(); +} + +static GLXDrawable +evgl_glXGetCurrentDrawable(void) +{ + return _sym_glXGetCurrentDrawable(); +} + + +static Bool +evgl_glXMakeCurrent(Display* dpy, GLXDrawable draw, GLXContext ctx) +{ + return _sym_glXMakeCurrent(dpy, draw, ctx); +} + +static void +evgl_glXSwapBuffers(Display* dpy, GLXDrawable draw) +{ + _sym_glXSwapBuffers(dpy, draw); +} + +static void +evgl_glXWaitX(void) +{ + _sym_glXWaitX(); +} + +static void +evgl_glXWaitGL(void) +{ + _sym_glXWaitGL(); +} + +static Bool +evgl_glXQueryExtension(Display* dpy, int* errorb, int* event) +{ + return _sym_glXQueryExtension(dpy, errorb, event); +} + +static const char * +evgl_glXQueryExtensionsString(Display *dpy, int screen) +{ + return _sym_glXQueryExtensionsString(dpy, screen); +} + +static GLXFBConfig* +evgl_glXChooseFBConfig(Display* dpy, int screen, const int* attribList, int* nitems) +{ + return _sym_glXChooseFBConfig(dpy, screen, attribList, nitems); +} + +static GLXFBConfig* +evgl_glXGetFBConfigs(Display* dpy, int screen, int* nelements) +{ + return _sym_glXGetFBConfigs(dpy, screen, nelements); +} + +//!!!!! FIXME Called too many times +static int +evgl_glXGetFBConfigAttrib(Display* dpy, GLXFBConfig config, int attribute, int* value) +{ + return _sym_glXGetFBConfigAttrib(dpy, config, attribute, value); +} + +//!!!!! FIXME Called too many times +static XVisualInfo* +evgl_glXGetVisualFromFBConfig(Display* dpy, GLXFBConfig config) +{ + return _sym_glXGetVisualFromFBConfig(dpy, config); +} + +static void +evgl_glXDestroyWindow(Display* dpy, GLXWindow window) +{ + _sym_glXDestroyWindow(dpy, window); +} + +static Bool +evgl_glXMakeContextCurrent(Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) +{ + return _sym_glXMakeContextCurrent(dpy, draw, read, ctx); +} + +static void +evgl_glXBindTexImage(Display* dpy, GLXDrawable draw, int buffer, int* attribList) +{ + _sym_glXBindTexImage(dpy, draw, buffer, attribList); +} + +static void +evgl_glXReleaseTexImage(Display* dpy, GLXDrawable draw, int buffer) +{ + _sym_glXReleaseTexImage(dpy, draw, buffer); +} + +static int +evgl_glXGetVideoSync(unsigned int* count) +{ + return _sym_glXGetVideoSync(count); +} + +static int +evgl_glXWaitVideoSync(int divisor, int remainder, unsigned int* count) +{ + return _sym_glXWaitVideoSync(divisor, remainder, count); +} + +static XID +evgl_glXCreatePixmap(Display* dpy, void* config, Pixmap pixmap, const int* attribList) +{ + return _sym_glXCreatePixmap(dpy, config, pixmap, attribList); +} + +static void +evgl_glXDestroyPixmap(Display* dpy, XID pixmap) +{ + _sym_glXDestroyPixmap(dpy, pixmap); +} + +static void +evgl_glXQueryDrawable(Display* dpy, XID draw, int attribute, unsigned int* value) +{ + _sym_glXQueryDrawable(dpy, draw, attribute, value); +} + +static int +evgl_glXSwapIntervalSGI(int interval) +{ + return _sym_glXSwapIntervalSGI(interval); +} + +static void +evgl_glXSwapIntervalEXT(Display* dpy, GLXDrawable draw, int interval) +{ + _sym_glXSwapIntervalEXT(dpy, draw, interval); +} + + +//----------------------------------------------------------------// +// Fastpath GLX Functions // +// The functions have prefix 'fpgl_' for (fastpath gl) // +//----------------------------------------------------------------// +static GLXContext +fpgl_glXCreateContext(Display* dpy, XVisualInfo* vis, GLXContext shareList, Bool direct) +{ + EvasGlueContext ctx; + + // Create a global context if it hasn't been created + if (!global_ctx) + { + global_dpy = dpy; + // Create a global context if it hasn't been created yet + global_ctx = _sym_glXCreateContext(dpy, vis, NULL, 1); + if (!global_ctx) + { + ERR("Failed creating a glX global context for FastPath.\n"); + return 0; + } + ctx_ref_count++; + } + + // Allocate a new context + ctx = calloc(1, sizeof(struct _EvasGlueContext)); + if (!ctx) + { + ERR("Error creating a new EvasGlueContext.\n"); + return NULL; + } + + if (!init_context_states(ctx)) + { + ERR("Error intialing intial context\n"); + free(ctx); + return NULL; + } + + ctx_ref_count++; + + return (GLXContext)ctx; + +} + +static void +fpgl_glXDestroyContext(Display* dpy, GLXContext ctx) +{ + EvasGlueContext ectx = (EvasGlueContext)ctx; + + if (ctx!=NULL) + { + if (ectx->magic != MAGIC_GLFAST) + { + ERR("Magic Check Failed!!!\n"); + return; + } + + if (ectx == current_ctx) + { + DBG("Destroying current context... %d\n", ctx_ref_count); + real_current_ctx = current_ctx; + current_ctx = NULL; + } + + if (ectx) + free(ectx); + + if (!(--ctx_ref_count)) + { + DBG("Destroying the global context...\n"); + _sym_glXDestroyContext(dpy, global_ctx); + global_ctx = NULL; + current_ctx = NULL; + real_current_ctx = NULL; + } + } +} + + +static GLXContext +fpgl_glXGetCurrentContext(void) +{ + return (GLXContext)current_ctx; +} + +static GLXDrawable +fpgl_glXGetCurrentDrawable(void) +{ + //return _sym_glXGetCurrentDrawable(); + return (GLXDrawable)current_surf; +} + + +static Bool +fpgl_glXMakeCurrent(Display* dpy, GLXDrawable draw, GLXContext ctx) +{ + EvasGlueContext ectx = (EvasGlueContext)ctx; + + // Check if the values are null + if ((draw == None) || (ctx == NULL)) + { + if (current_ctx) + real_current_ctx = current_ctx; + + current_ctx = NULL; + current_surf = None; + + return 1; + } + + // Check if the object is correct + if (ectx->magic != MAGIC_GLFAST) + { + ERR("Magic Check Failed!!!\n"); + return 0; + } + + + // If it's the first time + if (!global_ctx_initted) + { + if (!_sym_glXMakeCurrent(dpy, draw, global_ctx)) + { + ERR("Error making context current with the drawable.\n"); + return False; + } + + current_ctx = ectx; + current_surf = draw; + + real_current_ctx = current_ctx; + + global_ctx_initted = 1; + } + + // If drawable changed, do a make current + if (current_surf != draw) + { + if (!_sym_glXMakeCurrent(dpy, draw, global_ctx)) + { + ERR("Error making context current with the drawable.\n"); + return False; + } + real_current_ctx = current_ctx; + } + + // If it's first time... + if ((ectx->first_time == 1) && (global_ctx_initted)) + { + // FIXME!!!: + // Actually, i need to query the drawable size... + // Do some initializations that required make_current + _sym_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &ectx->num_tex_units); + _sym_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &ectx->num_vertex_attribs); + _sym_glGetIntegerv(GL_VIEWPORT, ectx->gl_viewport); + _sym_glGetIntegerv(GL_SCISSOR_BOX, ectx->gl_scissor_box); + DBG("----Num Tex Units: %d, Num Vertex Attribs: %d \n", ectx->num_tex_units, ectx->num_vertex_attribs); + + ectx->first_time = 0; + } + + // if context is same, return + if ( (current_ctx == ectx) && (current_surf == draw) ) + { + return True; + } + + if (current_ctx) + make_context_current(current_ctx, ectx); + else + DBG("~~~Current Context NULL...\n"); + + current_ctx = ectx; + current_surf = draw; + + return True; +} + +static Bool +fpgl_glXMakeContextCurrent(Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) +{ + ERR("NOT IMPLEMENTED YET!!! GLX Function Wrapped. Not fastpathed yet...\n"); + return _sym_glXMakeContextCurrent(dpy, draw, read, ctx); +} + + +#endif // (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + + + +//----------------------------------------------------------------// +// // +// Wrapped GL Functions // +// // +//----------------------------------------------------------------// + +static void +evgl_glActiveTexture(GLenum texture) +{ + _sym_glActiveTexture(texture); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glAttachShader(GLuint program, GLuint shader) +{ + _sym_glAttachShader(program, shader); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBindAttribLocation(GLuint program, GLuint index, const char* name) +{ + _sym_glBindAttribLocation(program, index, name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBindBuffer(GLenum target, GLuint buffer) +{ + _sym_glBindBuffer(target, buffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBindFramebuffer(GLenum target, GLuint framebuffer) +{ + _sym_glBindFramebuffer(target, framebuffer); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer) +{ + _sym_glBindRenderbuffer(target, renderbuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBindTexture(GLenum target, GLuint texture) +{ + _sym_glBindTexture(target, texture); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) +{ + _sym_glBlendColor(red, green, blue, alpha); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBlendEquation(GLenum mode) +{ + _sym_glBlendEquation(mode); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) +{ + _sym_glBlendEquationSeparate(modeRGB, modeAlpha); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBlendFunc(GLenum sfactor, GLenum dfactor) +{ + _sym_glBlendFunc(sfactor, dfactor); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) +{ + _sym_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) +{ + _sym_glBufferData(target, size, data, usage); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) +{ + _sym_glBufferSubData(target, offset, size, data); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static GLenum +evgl_glCheckFramebufferStatus(GLenum target) +{ + GLenum result; + + result = _sym_glCheckFramebufferStatus(target); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static void +evgl_glClear(GLbitfield mask) +{ + _sym_glClear(mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) +{ + _sym_glClearColor(red, green, blue, alpha); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glClearDepthf(GLclampf depth) +{ + _sym_glClearDepthf(depth); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glClearStencil(GLint s) +{ + _sym_glClearStencil(s); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) +{ + _sym_glColorMask(red, green, blue, alpha); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glCompileShader(GLuint shader) +{ + _sym_glCompileShader(shader); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) +{ + _sym_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) +{ + _sym_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) +{ + _sym_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + _sym_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static GLuint +evgl_glCreateProgram(void) +{ + GLuint program; + + program = _sym_glCreateProgram(); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return program; +} + +static GLuint +evgl_glCreateShader(GLenum type) +{ + GLuint shader; + + shader = _sym_glCreateShader(type); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return shader; +} + +static void +evgl_glCullFace(GLenum mode) +{ + _sym_glCullFace(mode); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteBuffers(GLsizei n, const GLuint* buffers) +{ + _sym_glDeleteBuffers(n, buffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) +{ + _sym_glDeleteFramebuffers(n, framebuffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteProgram(GLuint program) +{ + _sym_glDeleteProgram(program); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) +{ + _sym_glDeleteRenderbuffers(n, renderbuffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteShader(GLuint shader) +{ + _sym_glDeleteShader(shader); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDeleteTextures(GLsizei n, const GLuint* textures) +{ + _sym_glDeleteTextures(n, textures); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDepthFunc(GLenum func) +{ + _sym_glDepthFunc(func); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDepthMask(GLboolean flag) +{ + _sym_glDepthMask(flag); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDepthRangef(GLclampf zNear, GLclampf zFar) +{ + _sym_glDepthRangef(zNear, zFar); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDetachShader(GLuint program, GLuint shader) +{ + _sym_glDetachShader(program, shader); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDisable(GLenum cap) +{ + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDisableVertexAttribArray(GLuint index) +{ + _sym_glDisableVertexAttribArray(index); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDrawArrays(GLenum mode, GLint first, GLsizei count) +{ + _sym_glDrawArrays(mode, first, count); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) +{ + _sym_glDrawElements(mode, count, type, indices); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glEnable(GLenum cap) +{ + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glEnableVertexAttribArray(GLuint index) +{ + _sym_glEnableVertexAttribArray(index); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glFinish(void) +{ + _sym_glFinish(); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glFlush(void) +{ + _sym_glFlush(); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) +{ + _sym_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +{ + _sym_glFramebufferTexture2D(target, attachment, textarget, texture, level); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glFrontFace(GLenum mode) +{ + _sym_glFrontFace(mode); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) +{ + _sym_glGetVertexAttribfv(index, pname, params); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) +{ + _sym_glGetVertexAttribiv(index, pname, params); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) +{ + _sym_glGetVertexAttribPointerv(index, pname, pointer); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + +} + +static void +evgl_glHint(GLenum target, GLenum mode) +{ + _sym_glHint(target, mode); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (target == GL_GENERATE_MIPMAP_HINT) + { + current_ctx->_tex_flag1 |= FLAG_BIT_2; + current_ctx->gl_generate_mipmap_hint = mode; + } +} + +static void +evgl_glGenBuffers(GLsizei n, GLuint* buffers) +{ + _sym_glGenBuffers(n, buffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGenerateMipmap(GLenum target) +{ + _sym_glGenerateMipmap(target); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGenFramebuffers(GLsizei n, GLuint* framebuffers) +{ + _sym_glGenFramebuffers(n, framebuffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) +{ + _sym_glGenRenderbuffers(n, renderbuffers); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGenTextures(GLsizei n, GLuint* textures) +{ + _sym_glGenTextures(n, textures); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) +{ + _sym_glGetActiveAttrib(program, index, bufsize, length, size, type, name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) +{ + _sym_glGetActiveUniform(program, index, bufsize, length, size, type, name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) +{ + _sym_glGetAttachedShaders(program, maxcount, count, shaders); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static int +evgl_glGetAttribLocation(GLuint program, const char* name) +{ + int location; + + location = _sym_glGetAttribLocation(program, name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return location; +} + +static void +evgl_glGetBooleanv(GLenum pname, GLboolean* params) +{ + _sym_glGetBooleanv(pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) +{ + _sym_glGetBufferParameteriv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static GLenum +evgl_glGetError(void) +{ + return _sym_glGetError(); +} + +static void +evgl_glGetFloatv(GLenum pname, GLfloat* params) +{ + _sym_glGetFloatv(pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) +{ + _sym_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetIntegerv(GLenum pname, GLint* params) +{ + _sym_glGetIntegerv(pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetProgramiv(GLuint program, GLenum pname, GLint* params) +{ + _sym_glGetProgramiv(program, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) +{ + _sym_glGetProgramInfoLog(program, bufsize, length, infolog); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) +{ + _sym_glGetRenderbufferParameteriv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetShaderiv(GLuint shader, GLenum pname, GLint* params) +{ + _sym_glGetShaderiv(shader, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) +{ + _sym_glGetShaderInfoLog(shader, bufsize, length, infolog); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) +{ +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + _sym_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +#else + if (range) + { + range[0] = -126; // floor(log2(FLT_MIN)) + range[1] = 127; // floor(log2(FLT_MAX)) + } + if (precision) + { + precision[0] = 24; // floor(-log2((1.0/16777218.0))); + } + return; + shadertype = precisiontype = 0; +#endif + +} + +static void +evgl_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) +{ + _sym_glGetShaderSource(shader, bufsize, length, source); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static const GLubyte * +evgl_glGetString(GLenum name) +{ + const GLubyte *str; + + str =_sym_glGetString(name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return str; +} + +static void +evgl_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) +{ + _sym_glGetTexParameterfv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) +{ + _sym_glGetTexParameteriv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetUniformfv(GLuint program, GLint location, GLfloat* params) +{ + _sym_glGetUniformfv(program, location, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glGetUniformiv(GLuint program, GLint location, GLint* params) +{ + _sym_glGetUniformiv(program, location, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} +static int +evgl_glGetUniformLocation(GLuint program, const char* name) +{ + int location; + + location = _sym_glGetUniformLocation(program, name); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return location; +} + +static GLboolean +evgl_glIsBuffer(GLuint buffer) +{ + GLboolean result; + + result = _sym_glIsBuffer(buffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsEnabled(GLenum cap) +{ + GLboolean result; + + result = _sym_glIsEnabled(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsFramebuffer(GLuint framebuffer) +{ + GLboolean result; + + result = _sym_glIsFramebuffer(framebuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsProgram(GLuint program) +{ + GLboolean result; + + result = _sym_glIsProgram(program); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsRenderbuffer(GLuint renderbuffer) +{ + GLboolean result; + + result = _sym_glIsRenderbuffer(renderbuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsShader(GLuint shader) +{ + GLboolean result; + + result = _sym_glIsShader(shader); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static GLboolean +evgl_glIsTexture(GLuint texture) +{ + GLboolean result; + + result = _sym_glIsTexture(texture); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + return result; +} + +static void +evgl_glLineWidth(GLfloat width) +{ + _sym_glLineWidth(width); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glLinkProgram(GLuint program) +{ + _sym_glLinkProgram(program); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glPixelStorei(GLenum pname, GLint param) +{ + _sym_glPixelStorei(pname, param); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glPolygonOffset(GLfloat factor, GLfloat units) +{ + _sym_glPolygonOffset(factor, units); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) +{ + _sym_glReadPixels(x, y, width, height, format, type, pixels); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glReleaseShaderCompiler(void) +{ +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + _sym_glReleaseShaderCompiler(); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +#else + //FIXME!!! need something here? + +#endif +} + +static void +evgl_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +{ + _sym_glRenderbufferStorage(target, internalformat, width, height); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glSampleCoverage(GLclampf value, GLboolean invert) +{ + _sym_glSampleCoverage(value, invert); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) +{ + _sym_glScissor(x, y, width, height); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) +{ +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + _sym_glShaderBinary(n, shaders, binaryformat, binary, length); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +#else +// FIXME: need to dlsym/getprocaddress for this + return; + n = binaryformat = length = 0; + shaders = binary = 0; +#endif +} + +static void +evgl_glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length) +{ + _sym_glShaderSource(shader, count, string, length); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilFunc(GLenum func, GLint ref, GLuint mask) +{ + _sym_glStencilFunc(func, ref, mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) +{ + _sym_glStencilFuncSeparate(face, func, ref, mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilMask(GLuint mask) +{ + _sym_glStencilMask(mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilMaskSeparate(GLenum face, GLuint mask) +{ + _sym_glStencilMaskSeparate(face, mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) +{ + _sym_glStencilOp(fail, zfail, zpass); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) +{ + _sym_glStencilOpSeparate(face, fail, zfail, zpass); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) +{ + _sym_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexParameterf(GLenum target, GLenum pname, GLfloat param) +{ + _sym_glTexParameterf(target, pname, param); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) +{ + _sym_glTexParameterfv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexParameteri(GLenum target, GLenum pname, GLint param) +{ + _sym_glTexParameteri(target, pname, param); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexParameteriv(GLenum target, GLenum pname, const GLint* params) +{ + _sym_glTexParameteriv(target, pname, params); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) +{ + _sym_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform1f(GLint location, GLfloat x) +{ + _sym_glUniform1f(location, x); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform1fv(GLint location, GLsizei count, const GLfloat* v) +{ + _sym_glUniform1fv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform1i(GLint location, GLint x) +{ + _sym_glUniform1i(location, x); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform1iv(GLint location, GLsizei count, const GLint* v) +{ + _sym_glUniform1iv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform2f(GLint location, GLfloat x, GLfloat y) +{ + _sym_glUniform2f(location, x, y); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform2fv(GLint location, GLsizei count, const GLfloat* v) +{ + _sym_glUniform2fv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform2i(GLint location, GLint x, GLint y) +{ + _sym_glUniform2i(location, x, y); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform2iv(GLint location, GLsizei count, const GLint* v) +{ + _sym_glUniform2iv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) +{ + _sym_glUniform3f(location, x, y, z); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform3fv(GLint location, GLsizei count, const GLfloat* v) +{ + _sym_glUniform3fv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform3i(GLint location, GLint x, GLint y, GLint z) +{ + _sym_glUniform3i(location, x, y, z); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform3iv(GLint location, GLsizei count, const GLint* v) +{ + _sym_glUniform3iv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + _sym_glUniform4f(location, x, y, z, w); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform4fv(GLint location, GLsizei count, const GLfloat* v) +{ + _sym_glUniform4fv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) +{ + _sym_glUniform4i(location, x, y, z, w); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniform4iv(GLint location, GLsizei count, const GLint* v) +{ + _sym_glUniform4iv(location, count, v); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) +{ + _sym_glUniformMatrix2fv(location, count, transpose, value); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) +{ + _sym_glUniformMatrix3fv(location, count, transpose, value); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) +{ + _sym_glUniformMatrix4fv(location, count, transpose, value); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glUseProgram(GLuint program) +{ + _sym_glUseProgram(program); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glValidateProgram(GLuint program) +{ + _sym_glValidateProgram(program); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib1f(GLuint indx, GLfloat x) +{ + _sym_glVertexAttrib1f(indx, x); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib1fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib1fv(indx, values); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) +{ + _sym_glVertexAttrib2f(indx, x, y); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib2fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib2fv(indx, values); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) +{ + _sym_glVertexAttrib3f(indx, x, y, z); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib3fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib3fv(indx, values); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + _sym_glVertexAttrib4f(indx, x, y, z, w); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttrib4fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib4fv(indx, values); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) +{ + _sym_glVertexAttribPointer(indx, size, type, normalized, stride, ptr); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) +{ + _sym_glViewport(x, y, width, height); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + + +// GLES Extensions... +static void +evgl_glGetProgramBinary(GLuint program, GLsizei bufsize, GLsizei* length, GLenum* binaryFormat, void* binary) +{ + _sym_glGetProgramBinary(program, bufsize, length, binaryFormat, binary); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +evgl_glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLint length) +{ + _sym_glProgramBinary(program, binaryFormat, binary, length); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + + +static void +evgl_glProgramParameteri(GLuint program, GLuint pname, GLint value) +{ + _sym_glProgramParameteri(program, pname, value); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +//----------------------------------------------------------------// +// // +// Fastpath GL Functions // +// The functions have prefix 'fpgl_' for (fastpath gl) // +// // +//----------------------------------------------------------------// + +#define CURR_STATE_COMPARE(curr_state, state ) \ + if ((current_ctx->curr_state) != (state)) + + +static void +fpgl_glActiveTexture(GLenum texture) +{ + CURR_STATE_COMPARE(gl_active_texture, texture) + { + _sym_glActiveTexture(texture); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_tex_flag1 |= FLAG_BIT_1; + current_ctx->gl_active_texture = texture; + } +} + +static void +fpgl_glBindBuffer(GLenum target, GLuint buffer) +{ + if (target == GL_ARRAY_BUFFER) + { + CURR_STATE_COMPARE(gl_array_buffer_binding, buffer) + { + _sym_glBindBuffer(target, buffer); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (buffer == 0) + current_ctx->_bind_flag &= (~FLAG_BIT_0); + else + current_ctx->_bind_flag |= FLAG_BIT_0; + current_ctx->gl_array_buffer_binding = buffer; + } + } + else if (target == GL_ELEMENT_ARRAY_BUFFER) + { + CURR_STATE_COMPARE(gl_element_array_buffer_binding, buffer) + { + _sym_glBindBuffer(target, buffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (buffer == 0) + current_ctx->_bind_flag &= (~FLAG_BIT_1); + else + current_ctx->_bind_flag |= FLAG_BIT_1; + current_ctx->gl_element_array_buffer_binding = buffer; + } + } + else + { + // For error recording + _sym_glBindBuffer(target, buffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glBindFramebuffer(GLenum target, GLuint framebuffer) +{ + if (target == GL_FRAMEBUFFER) + { + CURR_STATE_COMPARE(gl_framebuffer_binding, framebuffer) + { + _sym_glBindFramebuffer(target, framebuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (framebuffer == 0) + current_ctx->_bind_flag &= (~FLAG_BIT_2); + else + current_ctx->_bind_flag |= FLAG_BIT_2; + current_ctx->gl_framebuffer_binding = framebuffer; + } + } + else + { + // For error recording + _sym_glBindFramebuffer(target, framebuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + } +} + +static void +fpgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer) +{ + if (target == GL_RENDERBUFFER) + { + CURR_STATE_COMPARE(gl_renderbuffer_binding, renderbuffer) + { + _sym_glBindRenderbuffer(target, renderbuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (renderbuffer == 0) + current_ctx->_bind_flag &= (~FLAG_BIT_3); + else + current_ctx->_bind_flag |= FLAG_BIT_3; + current_ctx->gl_renderbuffer_binding = renderbuffer; + } + } + else + { + // For error recording + _sym_glBindRenderbuffer(target, renderbuffer); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glBindTexture(GLenum target, GLuint texture) +{ + int tex_idx; + + if (target == GL_TEXTURE_2D) + { + CURR_STATE_COMPARE(gl_texture_binding_2d, texture) + { + _sym_glEnable(GL_TEXTURE_2D); + _sym_glBindTexture(target, texture); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (texture == 0) + current_ctx->_tex_flag1 &= (~FLAG_BIT_3); + else + current_ctx->_tex_flag1 |= FLAG_BIT_3; + current_ctx->gl_texture_binding_2d = texture; + + tex_idx = current_ctx->gl_active_texture - GL_TEXTURE0; + current_ctx->tex_state[tex_idx].tex_unit = GL_TEXTURE_2D; + current_ctx->tex_state[tex_idx].tex_id = texture; + } + } + else if (target == GL_TEXTURE_CUBE_MAP) + { + CURR_STATE_COMPARE(gl_texture_binding_cube_map, texture) + { + _sym_glEnable(GL_TEXTURE_CUBE_MAP); + _sym_glBindTexture(target, texture); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + if (texture == 0) + current_ctx->_tex_flag1 &= (~FLAG_BIT_4); + else + current_ctx->_tex_flag1 |= FLAG_BIT_4; + current_ctx->gl_texture_binding_cube_map = texture; + + tex_idx = current_ctx->gl_active_texture - GL_TEXTURE0; + current_ctx->tex_state[tex_idx].tex_unit = GL_TEXTURE_CUBE_MAP; + current_ctx->tex_state[tex_idx].tex_id = texture; + } + } +} + +static void +fpgl_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) +{ + if ((current_ctx->gl_blend_color[0] != red) || + (current_ctx->gl_blend_color[1] != green) || + (current_ctx->gl_blend_color[2] != blue) || + (current_ctx->gl_blend_color[3] != alpha)) + { + _sym_glBlendColor(red, green, blue, alpha); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_blend_flag |= FLAG_BIT_0; + current_ctx->gl_blend_color[0] = red; + current_ctx->gl_blend_color[1] = green; + current_ctx->gl_blend_color[2] = blue; + current_ctx->gl_blend_color[3] = alpha; + } +} + +//!!! Optimze? +static void +fpgl_glBlendEquation(GLenum mode) +{ + _sym_glBlendEquation(mode); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6); + _sym_glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&(current_ctx->gl_blend_equation_rgb)); + _sym_glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&(current_ctx->gl_blend_equation_alpha)); +} + +static void +fpgl_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) +{ + if ((current_ctx->gl_blend_equation_rgb != modeRGB) || + (current_ctx->gl_blend_equation_alpha != modeAlpha)) + { + _sym_glBlendEquationSeparate(modeRGB, modeAlpha); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_blend_flag |= (FLAG_BIT_5 | FLAG_BIT_6); + current_ctx->gl_blend_equation_rgb = modeRGB; + current_ctx->gl_blend_equation_alpha = modeAlpha; + } +} + +//!!! Optimze? +static void +fpgl_glBlendFunc(GLenum sfactor, GLenum dfactor) +{ + _sym_glBlendFunc(sfactor, dfactor); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4); + _sym_glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&(current_ctx->gl_blend_src_rgb)); + _sym_glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&(current_ctx->gl_blend_src_alpha)); + _sym_glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&(current_ctx->gl_blend_dst_rgb)); + _sym_glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&(current_ctx->gl_blend_dst_alpha)); +} + +static void +fpgl_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) +{ + if ((current_ctx->gl_blend_src_rgb != srcRGB) || + (current_ctx->gl_blend_dst_rgb != dstRGB) || + (current_ctx->gl_blend_src_alpha != srcAlpha) || + (current_ctx->gl_blend_dst_alpha != dstAlpha)) + { + _sym_glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_blend_flag |= (FLAG_BIT_1 | FLAG_BIT_2 | FLAG_BIT_3 | FLAG_BIT_4); + current_ctx->gl_blend_src_rgb = srcRGB; + current_ctx->gl_blend_dst_rgb = dstRGB; + current_ctx->gl_blend_src_alpha = srcAlpha; + current_ctx->gl_blend_dst_alpha = dstAlpha; + } +} + +static void +fpgl_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) +{ + if ((current_ctx->gl_color_clear_value[0] != red) || + (current_ctx->gl_color_clear_value[1] != green) || + (current_ctx->gl_color_clear_value[2] != blue) || + (current_ctx->gl_color_clear_value[3] != alpha)) + { + _sym_glClearColor(red, green, blue, alpha); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag1 |= (FLAG_BIT_2); + current_ctx->gl_color_clear_value[0] = red; + current_ctx->gl_color_clear_value[1] = green; + current_ctx->gl_color_clear_value[2] = blue; + current_ctx->gl_color_clear_value[3] = alpha; + } +} + +static void +fpgl_glClearDepthf(GLclampf depth) +{ + CURR_STATE_COMPARE(gl_depth_clear_value, depth) + { + _sym_glClearDepthf(depth); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_2; + current_ctx->gl_depth_clear_value = depth; + } +} + +static void +fpgl_glClearStencil(GLint s) +{ + CURR_STATE_COMPARE(gl_stencil_clear_value, s) + { + _sym_glClearStencil(s); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag2 |= FLAG_BIT_7; + current_ctx->gl_stencil_clear_value = s; + } +} + +static void +fpgl_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) +{ + if ((current_ctx->gl_color_writemask[0] != red) || + (current_ctx->gl_color_writemask[1] != green) || + (current_ctx->gl_color_writemask[2] != blue) || + (current_ctx->gl_color_writemask[3] != alpha)) + { + _sym_glColorMask(red, green, blue, alpha); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_0; + current_ctx->gl_color_writemask[0] = red; + current_ctx->gl_color_writemask[1] = green; + current_ctx->gl_color_writemask[2] = blue; + current_ctx->gl_color_writemask[3] = alpha; + } +} + +static void +fpgl_glCullFace(GLenum mode) +{ + CURR_STATE_COMPARE(gl_cull_face_mode, mode) + { + _sym_glCullFace(mode); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_5; + current_ctx->gl_cull_face_mode = mode; + } +} + +static void +fpgl_glDepthFunc(GLenum func) +{ + CURR_STATE_COMPARE(gl_depth_func, func) + { + _sym_glDepthFunc(func); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_3; + current_ctx->gl_depth_func = func; + } +} + +static void +fpgl_glDepthMask(GLboolean flag) +{ + CURR_STATE_COMPARE(gl_depth_writemask, flag) + { + _sym_glDepthMask(flag); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_4; + current_ctx->gl_depth_writemask = flag; + } +} + +static void +fpgl_glDepthRangef(GLclampf zNear, GLclampf zFar) +{ + if ((current_ctx->gl_depth_range[0] != zNear) || + (current_ctx->gl_depth_range[1] != zFar)) + { + _sym_glDepthRangef(zNear, zFar); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag2 |= FLAG_BIT_1; + current_ctx->gl_depth_range[0] = zNear; + current_ctx->gl_depth_range[1] = zFar; + } +} + +static void +fpgl_glDisable(GLenum cap) +{ + switch(cap) + { + case GL_BLEND: + CURR_STATE_COMPARE(gl_blend, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag1 &= (~FLAG_BIT_0); + current_ctx->gl_blend = GL_FALSE; + } + break; + case GL_CULL_FACE: + CURR_STATE_COMPARE(gl_cull_face, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag1 &= (~FLAG_BIT_1); + current_ctx->gl_cull_face = GL_FALSE; + } + break; + case GL_DEPTH_TEST: + CURR_STATE_COMPARE(gl_depth_test, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag1 &= (~FLAG_BIT_2); + current_ctx->gl_depth_test = GL_FALSE; + } + break; + case GL_DITHER: + CURR_STATE_COMPARE(gl_dither, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag1 &= (~FLAG_BIT_3); + current_ctx->gl_dither = GL_FALSE; + } + break; + case GL_POLYGON_OFFSET_FILL: + CURR_STATE_COMPARE(gl_polygon_offset_fill, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag2 &= (~FLAG_BIT_0); + current_ctx->gl_polygon_offset_fill = GL_FALSE; + } + break; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + CURR_STATE_COMPARE(gl_sample_alpha_to_coverage, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag2 &= (~FLAG_BIT_1); + current_ctx->gl_sample_alpha_to_coverage = GL_FALSE; + } + break; + case GL_SAMPLE_COVERAGE: + CURR_STATE_COMPARE(gl_sample_coverage, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag2 &= (~FLAG_BIT_2); + current_ctx->gl_sample_coverage = GL_FALSE; + } + break; + case GL_SCISSOR_TEST: + CURR_STATE_COMPARE(gl_scissor_test, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag2 &= (~FLAG_BIT_3); + current_ctx->gl_scissor_test = GL_FALSE; + } + break; + case GL_STENCIL_TEST: + CURR_STATE_COMPARE(gl_stencil_test, GL_FALSE) + { + _sym_glDisable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + current_ctx->_enable_flag2 &= (~FLAG_BIT_4); + current_ctx->gl_stencil_test = GL_FALSE; + } + break; + } +} + +static void +fpgl_glDisableVertexAttribArray(GLuint index) +{ + _sym_glDisableVertexAttribArray(index); +} + +static void +fpgl_glDrawArrays(GLenum mode, GLint first, GLsizei count) +{ + _sym_glDrawArrays(mode, first, count); +} + +static void +fpgl_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) +{ + _sym_glDrawElements(mode, count, type, indices); +} + +static void +fpgl_glEnable(GLenum cap) +{ + switch(cap) + { + case GL_BLEND: + CURR_STATE_COMPARE(gl_blend, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_enable_flag1 |= FLAG_BIT_0; + current_ctx->gl_blend = GL_TRUE; + } + break; + case GL_CULL_FACE: + CURR_STATE_COMPARE(gl_cull_face, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag1 |= FLAG_BIT_1; + current_ctx->gl_cull_face = GL_TRUE; + } + break; + case GL_DEPTH_TEST: + CURR_STATE_COMPARE(gl_depth_test, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag1 |= FLAG_BIT_2; + current_ctx->gl_depth_test = GL_TRUE; + } + break; + case GL_DITHER: + CURR_STATE_COMPARE(gl_dither, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag1 |= FLAG_BIT_3; + current_ctx->gl_dither = GL_TRUE; + } + break; + case GL_POLYGON_OFFSET_FILL: + CURR_STATE_COMPARE(gl_polygon_offset_fill, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag2 |= FLAG_BIT_0; + current_ctx->gl_polygon_offset_fill = GL_TRUE; + } + break; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + CURR_STATE_COMPARE(gl_sample_alpha_to_coverage, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag2 |= FLAG_BIT_1; + current_ctx->gl_sample_alpha_to_coverage = GL_TRUE; + } + break; + case GL_SAMPLE_COVERAGE: + CURR_STATE_COMPARE(gl_sample_coverage, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag2 |= FLAG_BIT_2; + current_ctx->gl_sample_coverage = GL_TRUE; + } + break; + case GL_SCISSOR_TEST: + CURR_STATE_COMPARE(gl_scissor_test, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag2 |= FLAG_BIT_3; + current_ctx->gl_scissor_test = GL_TRUE; + } + break; + case GL_STENCIL_TEST: + CURR_STATE_COMPARE(gl_stencil_test, GL_TRUE) + { + _sym_glEnable(cap); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + + current_ctx->_enable_flag2 |= FLAG_BIT_4; + current_ctx->gl_stencil_test = GL_TRUE; + } + break; + } +} + +// Optimze? +static void +fpgl_glEnableVertexAttribArray(GLuint index) +{ + _sym_glEnableVertexAttribArray(index); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_varray_flag |= FLAG_BIT_0; + current_ctx->vertex_array[index].enabled = GL_TRUE; + current_ctx->vertex_array[index].modified = GL_TRUE; + +} + +static void +fpgl_glFrontFace(GLenum mode) +{ + CURR_STATE_COMPARE(gl_front_face, mode) + { + _sym_glFrontFace(mode); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag1 |= FLAG_BIT_0; + current_ctx->gl_front_face = mode; + } +} + +static void +fpgl_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) +{ + _sym_glGetVertexAttribfv(index, pname, params); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +fpgl_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) +{ + _sym_glGetVertexAttribiv(index, pname, params); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); +} + +static void +fpgl_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) +{ + _sym_glGetVertexAttribPointerv(index, pname, pointer); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + +} + +// Fix Maybe? +static void +fpgl_glHint(GLenum target, GLenum mode) +{ + if (target == GL_GENERATE_MIPMAP_HINT) + { + CURR_STATE_COMPARE(gl_generate_mipmap_hint, mode) + { + _sym_glHint(target, mode); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_tex_flag1 |= FLAG_BIT_2; + current_ctx->gl_generate_mipmap_hint = mode; + } + } + else + { + // For GL Error to be picked up + _sym_glHint(target, mode); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glLineWidth(GLfloat width) +{ + CURR_STATE_COMPARE(gl_line_width, width) + { + _sym_glLineWidth(width); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag1 |= FLAG_BIT_1; + current_ctx->gl_line_width = width; + } +} + +static void +fpgl_glPixelStorei(GLenum pname, GLint param) +{ + if (pname == GL_PACK_ALIGNMENT) + { + CURR_STATE_COMPARE(gl_pack_alignment, param) + { + _sym_glPixelStorei(pname, param); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag2 |= FLAG_BIT_1; + current_ctx->gl_pack_alignment = param; + } + } + else if (pname == GL_UNPACK_ALIGNMENT) + { + CURR_STATE_COMPARE(gl_unpack_alignment, param) + { + _sym_glPixelStorei(pname, param); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag2 |= FLAG_BIT_2; + current_ctx->gl_unpack_alignment = param; + } + } + else + { + // For GL Error to be picked up + _sym_glPixelStorei(pname, param); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glPolygonOffset(GLfloat factor, GLfloat units) +{ + if ((current_ctx->gl_polygon_offset_factor != factor) || + (current_ctx->gl_polygon_offset_units != units)) + { + _sym_glPolygonOffset(factor, units); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag1 |= (FLAG_BIT_2 | FLAG_BIT_3); + current_ctx->gl_polygon_offset_factor = factor; + current_ctx->gl_polygon_offset_units = units; + } +} + +static void +fpgl_glSampleCoverage(GLclampf value, GLboolean invert) +{ + if ((current_ctx->gl_sample_coverage_value != value) || + (current_ctx->gl_sample_coverage_invert != invert)) + { + _sym_glSampleCoverage(value, invert); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag1 |= (FLAG_BIT_4 | FLAG_BIT_5); + current_ctx->gl_sample_coverage_value = value; + current_ctx->gl_sample_coverage_invert = invert; + } +} + +static void +fpgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) +{ + if ((current_ctx->gl_scissor_box[0] != x) || + (current_ctx->gl_scissor_box[1] != y) || + (current_ctx->gl_scissor_box[2] != width) || + (current_ctx->gl_scissor_box[3] != height)) + { + _sym_glScissor(x, y, width, height); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_misc_flag2 |= FLAG_BIT_0; + current_ctx->gl_scissor_box[0] = x; + current_ctx->gl_scissor_box[1] = y; + current_ctx->gl_scissor_box[2] = width; + current_ctx->gl_scissor_box[3] = height; + } +} + +static void +fpgl_glStencilFunc(GLenum func, GLint ref, GLuint mask) +{ + if ((current_ctx->gl_stencil_func != func) || + (current_ctx->gl_stencil_ref != ref) || + (current_ctx->gl_stencil_value_mask != mask) || + (current_ctx->gl_stencil_back_func != func) || + (current_ctx->gl_stencil_back_ref != ref) || + (current_ctx->gl_stencil_back_value_mask != mask)) + { + _sym_glStencilFunc(func, ref, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2); + current_ctx->gl_stencil_func = func; + current_ctx->gl_stencil_ref = ref; + current_ctx->gl_stencil_value_mask = mask; + + current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2); + current_ctx->gl_stencil_back_func = func; + current_ctx->gl_stencil_back_ref = ref; + current_ctx->gl_stencil_back_value_mask = mask; + } +} + +static void +fpgl_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) +{ + if ((face == GL_FRONT) || (face == GL_FRONT_AND_BACK)) + { + if ((current_ctx->gl_stencil_func != func) || + (current_ctx->gl_stencil_ref != ref) || + (current_ctx->gl_stencil_value_mask != mask)) + { + _sym_glStencilFuncSeparate(face, func, ref, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2); + + current_ctx->gl_stencil_func = func; + current_ctx->gl_stencil_ref = ref; + current_ctx->gl_stencil_value_mask = mask; + } + } + else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK)) + { + if ((current_ctx->gl_stencil_back_func != func) || + (current_ctx->gl_stencil_back_ref != ref) || + (current_ctx->gl_stencil_back_value_mask != mask)) + { + _sym_glStencilFuncSeparate(face, func, ref, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag2 |= (FLAG_BIT_0 | FLAG_BIT_1 | FLAG_BIT_2); + + current_ctx->gl_stencil_back_func = func; + current_ctx->gl_stencil_back_ref = ref; + current_ctx->gl_stencil_back_value_mask = mask; + } + } + else + { + // Have GL pick up the error + _sym_glStencilFuncSeparate(face, func, ref, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glStencilMask(GLuint mask) +{ + if ((current_ctx->gl_stencil_writemask != mask) || + (current_ctx->gl_stencil_back_writemask != mask)) + { + _sym_glStencilMask(mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_6); + current_ctx->_stencil_flag2 |= (FLAG_BIT_6); + + current_ctx->gl_stencil_writemask = mask; + current_ctx->gl_stencil_back_writemask = mask; + } +} + +static void +fpgl_glStencilMaskSeparate(GLenum face, GLuint mask) +{ + if ((face == GL_FRONT) || (face == GL_FRONT_AND_BACK)) + { + if (current_ctx->gl_stencil_writemask != mask) + { + _sym_glStencilMaskSeparate(face, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_6); + current_ctx->gl_stencil_writemask = mask; + } + } + else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK)) + { + if (current_ctx->gl_stencil_back_writemask != mask) + { + _sym_glStencilMaskSeparate(face, mask); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag2 |= (FLAG_BIT_6); + current_ctx->gl_stencil_back_writemask = mask; + } + } + else + { + // Have GL pick up the error + _sym_glStencilMaskSeparate(face, mask); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) +{ + if ((current_ctx->gl_stencil_fail != fail) || + (current_ctx->gl_stencil_pass_depth_fail != zfail) || + (current_ctx->gl_stencil_pass_depth_pass != zpass) || + (current_ctx->gl_stencil_back_fail != fail) || + (current_ctx->gl_stencil_back_depth_fail != zfail) || + (current_ctx->gl_stencil_back_depth_pass != zpass)) + { + _sym_glStencilOp(fail, zfail, zpass); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5); + current_ctx->gl_stencil_fail = fail; + current_ctx->gl_stencil_pass_depth_fail = zfail; + current_ctx->gl_stencil_pass_depth_pass = zpass; + + current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5); + current_ctx->gl_stencil_back_fail = fail; + current_ctx->gl_stencil_back_depth_fail = zfail; + current_ctx->gl_stencil_back_depth_pass = zpass; + } +} + +static void +fpgl_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) +{ + + if ((face == GL_FRONT) || (face == GL_FRONT_AND_BACK)) + { + if ((current_ctx->gl_stencil_fail != fail) || + (current_ctx->gl_stencil_pass_depth_fail != zfail) || + (current_ctx->gl_stencil_pass_depth_pass != zpass)) + { + _sym_glStencilOpSeparate(face, fail, zfail, zpass); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag1 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5); + current_ctx->gl_stencil_fail = fail; + current_ctx->gl_stencil_pass_depth_fail = zfail; + current_ctx->gl_stencil_pass_depth_pass = zpass; + } + } + else if ((face == GL_BACK) || (face == GL_FRONT_AND_BACK)) + { + if ((current_ctx->gl_stencil_back_fail != fail) || + (current_ctx->gl_stencil_back_depth_fail != zfail) || + (current_ctx->gl_stencil_back_depth_pass != zpass)) + { + _sym_glStencilOpSeparate(face, fail, zfail, zpass); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_stencil_flag2 |= (FLAG_BIT_3 | FLAG_BIT_4 | FLAG_BIT_5); + current_ctx->gl_stencil_back_fail = fail; + current_ctx->gl_stencil_back_depth_fail = zfail; + current_ctx->gl_stencil_back_depth_pass = zpass; + } + } + else + { + // For picking up error purpose + _sym_glStencilOpSeparate(face, fail, zfail, zpass); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } +} + +static void +fpgl_glUseProgram(GLuint program) +{ + CURR_STATE_COMPARE(gl_current_program, program) + { + _sym_glUseProgram(program); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag1 |= FLAG_BIT_1; + current_ctx->gl_current_program = program; + } +} + +// Optmize? +static void +fpgl_glVertexAttrib1f(GLuint indx, GLfloat x) +{ + _sym_glVertexAttrib1f(indx, x); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = x; + current_ctx->vertex_attrib[indx].value[1] = 0; + current_ctx->vertex_attrib[indx].value[2] = 0; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib1fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib1fv(indx, values); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = values[0]; + current_ctx->vertex_attrib[indx].value[1] = 0; + current_ctx->vertex_attrib[indx].value[2] = 0; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) +{ + _sym_glVertexAttrib2f(indx, x, y); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = x; + current_ctx->vertex_attrib[indx].value[1] = y; + current_ctx->vertex_attrib[indx].value[2] = 0; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib2fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib2fv(indx, values); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = values[0]; + current_ctx->vertex_attrib[indx].value[1] = values[1]; + current_ctx->vertex_attrib[indx].value[2] = 0; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) +{ + _sym_glVertexAttrib3f(indx, x, y, z); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = x; + current_ctx->vertex_attrib[indx].value[1] = y; + current_ctx->vertex_attrib[indx].value[2] = z; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib3fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib3fv(indx, values); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = values[0]; + current_ctx->vertex_attrib[indx].value[1] = values[1]; + current_ctx->vertex_attrib[indx].value[2] = values[2]; + current_ctx->vertex_attrib[indx].value[3] = 1; +} + +// Optmize? +static void +fpgl_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + _sym_glVertexAttrib4f(indx, x, y, z, w); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = x; + current_ctx->vertex_attrib[indx].value[1] = y; + current_ctx->vertex_attrib[indx].value[2] = z; + current_ctx->vertex_attrib[indx].value[3] = w; +} + +// Optmize? +static void +fpgl_glVertexAttrib4fv(GLuint indx, const GLfloat* values) +{ + _sym_glVertexAttrib4fv(indx, values); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_vattrib_flag |= FLAG_BIT_0; + current_ctx->vertex_attrib[indx].modified = GL_TRUE; + current_ctx->vertex_attrib[indx].value[0] = values[0]; + current_ctx->vertex_attrib[indx].value[1] = values[1]; + current_ctx->vertex_attrib[indx].value[2] = values[2]; + current_ctx->vertex_attrib[indx].value[3] = values[3]; +} + + +// Optmize? +static void +fpgl_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) +{ + _sym_glVertexAttribPointer(indx, size, type, normalized, stride, ptr); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_varray_flag |= FLAG_BIT_0; + + current_ctx->vertex_array[indx].modified = GL_TRUE; + current_ctx->vertex_array[indx].size = size; + current_ctx->vertex_array[indx].type = type; + current_ctx->vertex_array[indx].normalized = normalized; + current_ctx->vertex_array[indx].stride = stride; + current_ctx->vertex_array[indx].pointer = ptr; +} + +static void +fpgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) +{ + if ((current_ctx->gl_viewport[0] != x) || + (current_ctx->gl_viewport[1] != y) || + (current_ctx->gl_viewport[2] != width) || + (current_ctx->gl_viewport[3] != height)) + { + _sym_glViewport(x, y, width, height); + + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + + current_ctx->_clear_flag1 |= FLAG_BIT_0; + current_ctx->gl_viewport[0] = x; + current_ctx->gl_viewport[1] = y; + current_ctx->gl_viewport[2] = width; + current_ctx->gl_viewport[3] = height; + } +} + + +//----------------------------------------------------------------// +// // +// Load Symbols // +// // +//----------------------------------------------------------------// +static void +sym_missing(void) +{ + ERR("GL symbols missing!\n"); +} + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) +//------------------------------------------------------// +// EGL +static int +glue_sym_init(void) +{ + //------------------------------------------------// + // Use gl_lib_handle for finding both GL and GLX symbols +#define FINDSYM(dst, sym, typ) \ + if ((!dst) && (_sym_eglGetProcAddress)) dst = (typeof(dst))_sym_eglGetProcAddress(sym); \ + if (!dst) dst = (typeof(dst))dlsym(egl_lib_handle, sym); \ + if (!dst) DBG("Error loading %s\n", sym); +#define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing; + + FINDSYM(_sym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn); + + FINDSYM(_sym_eglGetError, "eglGetError", glsym_func_int); + FINDSYM(_sym_eglGetDisplay, "eglGetDisplay", glsym_func_egldpy); + FINDSYM(_sym_eglInitialize, "eglInitialize", glsym_func_bool); + FINDSYM(_sym_eglTerminate, "eglTerminate", glsym_func_bool); + FINDSYM(_sym_eglChooseConfig, "eglChooseConfig", glsym_func_bool); + FINDSYM(_sym_eglCreateWindowSurface, "eglCreateWindowSurface", glsym_func_eglsfc); + FINDSYM(_sym_eglCreatePixmapSurface, "eglCreatePixmapSurface", glsym_func_eglsfc); + FINDSYM(_sym_eglDestroySurface, "eglDestroySurface", glsym_func_bool); + FINDSYM(_sym_eglBindAPI, "eglBindAPI", glsym_func_bool); + FINDSYM(_sym_eglWaitClient, "eglWaitClient", glsym_func_bool); + FINDSYM(_sym_eglSurfaceAttrib, "eglSurfaceAttrib", glsym_func_bool); + FINDSYM(_sym_eglBindTexImage, "eglBindTexImage", glsym_func_void); + FINDSYM(_sym_eglReleaseTexImage, "eglReleaseTexImage", glsym_func_bool); + FINDSYM(_sym_eglSwapInterval, "eglSwapInterval", glsym_func_bool); + FINDSYM(_sym_eglCreateContext, "eglCreateContext", glsym_func_eglctx); + FINDSYM(_sym_eglDestroyContext, "eglDestroyContext", glsym_func_bool); + FINDSYM(_sym_eglMakeCurrent, "eglMakeCurrent", glsym_func_bool); + FINDSYM(_sym_eglGetCurrentContext, "eglGetCurrentContext", glsym_func_eglctx); + FINDSYM(_sym_eglGetCurrentSurface, "eglGetCurrentSurface", glsym_func_eglsfc); + FINDSYM(_sym_eglGetCurrentDisplay, "eglGetCurrentDisplay", glsym_func_egldpy); + FINDSYM(_sym_eglWaitGL, "eglWaitGL", glsym_func_bool); + FINDSYM(_sym_eglWaitNative, "eglWaitNative", glsym_func_bool); + FINDSYM(_sym_eglSwapBuffers, "eglSwapBuffers", glsym_func_bool); + FINDSYM(_sym_eglCopyBuffers, "eglCopyBuffers", glsym_func_bool); + FINDSYM(_sym_eglQueryString, "eglQueryString", glsym_func_char_const_ptr); + //FINDSYM(_sym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn); + + //----------------// + FINDSYM(_sym_eglGetProcAddress, "eglGetProcAddressEXT", glsym_func_eng_fn); + FINDSYM(_sym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn); + FINDSYM(_sym_eglGetProcAddress, "eglGetProcAddressKHR", glsym_func_eng_fn); + + FINDSYM(_sym_eglCreateImage, "eglCreateImage", glsym_func_void_ptr); + FINDSYM(_sym_eglCreateImage, "eglCreateImageEXT", glsym_func_void_ptr); + FINDSYM(_sym_eglCreateImage, "eglCreateImageARB", glsym_func_void_ptr); + FINDSYM(_sym_eglCreateImage, "eglCreateImageKHR", glsym_func_void_ptr); + + FINDSYM(_sym_eglDestroyImage, "eglDestroyImage", glsym_func_uint); + FINDSYM(_sym_eglDestroyImage, "eglDestroyImageEXT", glsym_func_uint); + FINDSYM(_sym_eglDestroyImage, "eglDestroyImageARB", glsym_func_uint); + FINDSYM(_sym_eglDestroyImage, "eglDestroyImageKHR", glsym_func_uint); + + FINDSYM(_sym_eglMapImageSEC, "eglMapImageSEC", glsym_func_void_ptr); + + FINDSYM(_sym_eglUnmapImageSEC, "eglUnmapImageSEC", glsym_func_uint); + + FINDSYM(_sym_eglGetImageAttribSEC, "eglGetImageAttribSEC", glsym_func_uint); + + FINDSYM(_sym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void); + FINDSYM(_sym_glEGLImageTargetRenderbufferStorageOES, "glEGLImageTargetRenderbufferStorageOES", glsym_func_void); + +#undef FINDSYM +#undef FALLBAK + + return 1; +} + + +#else +//------------------------------------------------------// +// GLX +static int +glue_sym_init(void) +{ + //------------------------------------------------// + // Use gl_lib_handle for finding both GL and GLX symbols +#define FINDSYM(dst, sym, typ) \ + if ((!dst) && (_sym_glXGetProcAddress)) dst = (typeof(dst))_sym_glXGetProcAddress(sym); \ + if (!dst) dst = (typeof(dst))dlsym(gl_lib_handle, sym); \ + if (!dst) DBG("Error loading %s\n", sym); +#define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing; + + //------------------------------------------------------// + // GLX APIs... Only ones that are being used. + FINDSYM(_sym_glXGetProcAddress, "glXGetProcAddress", glsym_func_eng_fn); + FINDSYM(_sym_glXGetProcAddress, "glXGetProcAddressEXT", glsym_func_eng_fn); + FINDSYM(_sym_glXGetProcAddress, "glXGetProcAddressARB", glsym_func_eng_fn); + + // Standard Functions + FINDSYM(_sym_glXChooseVisual, "glXChooseVisual", glsym_func_xvisinfo_ptr); + FINDSYM(_sym_glXCreateContext, "glXCreateContext", glsym_func_glxctx); + FINDSYM(_sym_glXDestroyContext, "glXDestroyContext", glsym_func_void); + FINDSYM(_sym_glXGetCurrentContext, "glXGetCurrentContext", glsym_func_glxctx); + FINDSYM(_sym_glXGetCurrentDrawable, "glXGetCurrentDrawable", glsym_func_glxdraw); + FINDSYM(_sym_glXMakeCurrent, "glXMakeCurrent", glsym_func_bool); + FINDSYM(_sym_glXSwapBuffers, "glXSwapBuffers", glsym_func_void); + FINDSYM(_sym_glXWaitX, "glXWaitX", glsym_func_void); + FINDSYM(_sym_glXWaitGL, "glXWaitGL", glsym_func_void); + FINDSYM(_sym_glXQueryExtension, "glXQueryExtension", glsym_func_bool); + FINDSYM(_sym_glXQueryExtensionsString, "glXQueryExtensionsString", glsym_func_const_char_ptr); + + // 1.3 and later + FINDSYM(_sym_glXChooseFBConfig, "glXChooseFBConfig", glsym_func_glxfbcfg_ptr); + FINDSYM(_sym_glXGetFBConfigs, "glXGetFBConfigs", glsym_func_glxfbcfg_ptr); + FINDSYM(_sym_glXGetFBConfigAttrib, "glXGetFBConfigAttrib", glsym_func_int); + FINDSYM(_sym_glXGetVisualFromFBConfig, "glXGetVisualFromFBConfig", glsym_func_xvisinfo_ptr); + FINDSYM(_sym_glXDestroyWindow, "glXDestroyWindow", glsym_func_void); + FINDSYM(_sym_glXMakeContextCurrent, "glXMakeContextCurrent", glsym_func_bool); + + + // Extension functions + FINDSYM(_sym_glXBindTexImage, "glXBindTexImage", glsym_func_void); + FINDSYM(_sym_glXBindTexImage, "glXBindTexImageEXT", glsym_func_void); + FINDSYM(_sym_glXBindTexImage, "glXBindTexImageARB", glsym_func_void); + + FINDSYM(_sym_glXReleaseTexImage, "glXReleaseTexImage", glsym_func_void); + FINDSYM(_sym_glXReleaseTexImage, "glXReleaseTexImageEXT", glsym_func_void); + FINDSYM(_sym_glXReleaseTexImage, "glXReleaseTexImageARB", glsym_func_void); + + FINDSYM(_sym_glXGetVideoSync, "glXGetVideoSyncSGI", glsym_func_int); + + FINDSYM(_sym_glXWaitVideoSync, "glXWaitVideoSyncSGI", glsym_func_int); + + FINDSYM(_sym_glXCreatePixmap, "glXCreatePixmap", glsym_func_xid); + FINDSYM(_sym_glXCreatePixmap, "glXCreatePixmapEXT", glsym_func_xid); + FINDSYM(_sym_glXCreatePixmap, "glXCreatePixmapARB", glsym_func_xid); + + FINDSYM(_sym_glXDestroyPixmap, "glXDestroyPixmap", glsym_func_void); + FINDSYM(_sym_glXDestroyPixmap, "glXDestroyPixmapEXT", glsym_func_void); + FINDSYM(_sym_glXDestroyPixmap, "glXDestroyPixmapARB", glsym_func_void); + + FINDSYM(_sym_glXQueryDrawable, "glXQueryDrawable", glsym_func_void); + FINDSYM(_sym_glXQueryDrawable, "glXQueryDrawableEXT", glsym_func_void); + FINDSYM(_sym_glXQueryDrawable, "glXQueryDrawableARB", glsym_func_void); + + FINDSYM(_sym_glXSwapIntervalSGI, "glXSwapIntervalMESA", glsym_func_int); + FINDSYM(_sym_glXSwapIntervalSGI, "glXSwapIntervalSGI", glsym_func_int); + + //----------// + FINDSYM(_sym_glXSwapIntervalEXT, "glXSwapIntervalEXT", glsym_func_void); + + +#undef FINDSYM +#undef FALLBAK + + return 1; +} + +#endif + +static int +gl_sym_init(void) +{ + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + + //------------------------------------------------// + // Use eglGetProcAddress +# define FINDSYM(dst, sym, typ) \ + if ((!dst) && (_sym_eglGetProcAddress)) dst = (typeof(dst))_sym_eglGetProcAddress(sym); \ + if (!dst) dst = (typeof(dst))dlsym(gl_lib_handle, sym); \ + if (!dst) DBG("Error loading %s\n", sym); +# define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing; + + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryKHR", glsym_func_void); + + FINDSYM(_sym_glProgramBinary, "glProgramBinary", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryARB", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryOES", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryKHR", glsym_func_void); + + FINDSYM(_sym_glProgramParameteri, "glProgramParameteri", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriOES", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriKHR", glsym_func_void); + +#else + + //------------------------------------------------// + // Use gl_lib_handle for finding both GL and GLX symbols + // Try eglGetProcAddress +# define FINDSYM(dst, sym, typ) \ + if ((!dst) && (_sym_glXGetProcAddress)) dst = (typeof(dst))_sym_glXGetProcAddress(sym); \ + if (!dst) dst = (typeof(dst))dlsym(gl_lib_handle, sym); \ + if (!dst) DBG("Error loading %s\n", sym); +# define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing; + + + //----------// + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void); + FINDSYM(_sym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void); + + FINDSYM(_sym_glProgramBinary, "glProgramBinary", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void); + FINDSYM(_sym_glProgramBinary, "glProgramBinaryARB", glsym_func_void); + + FINDSYM(_sym_glProgramParameteri, "glProgramParameteri", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void); + FINDSYM(_sym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void); + +#endif + + //------------------------------------------------------// + // GLES 2.0 APIs... + FINDSYM(_sym_glActiveTexture, "glActiveTexture", glsym_func_void); + FALLBAK(_sym_glActiveTexture, glsym_func_void); + + FINDSYM(_sym_glAttachShader, "glAttachShader", glsym_func_void); + FALLBAK(_sym_glAttachShader, glsym_func_void); + + FINDSYM(_sym_glBindAttribLocation, "glBindAttribLocation", glsym_func_void); + FALLBAK(_sym_glBindAttribLocation, glsym_func_void); + + FINDSYM(_sym_glBindBuffer, "glBindBuffer", glsym_func_void); + FALLBAK(_sym_glBindBuffer, glsym_func_void); + + FINDSYM(_sym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void); + FALLBAK(_sym_glBindFramebuffer, glsym_func_void); + + FINDSYM(_sym_glBindRenderbuffer, "glBindRenderbuffer", glsym_func_void); + FALLBAK(_sym_glBindRenderbuffer, glsym_func_void); + + FINDSYM(_sym_glBindTexture, "glBindTexture", glsym_func_void); + FALLBAK(_sym_glBindTexture, glsym_func_void); + + FINDSYM(_sym_glBlendColor, "glBlendColor", glsym_func_void); + FALLBAK(_sym_glBlendColor, glsym_func_void); + + FINDSYM(_sym_glBlendEquation, "glBlendEquation", glsym_func_void); + FALLBAK(_sym_glBlendEquation, glsym_func_void); + + FINDSYM(_sym_glBlendEquationSeparate, "glBlendEquationSeparate", glsym_func_void); + FALLBAK(_sym_glBlendEquationSeparate, glsym_func_void); + + FINDSYM(_sym_glBlendFunc, "glBlendFunc", glsym_func_void); + FALLBAK(_sym_glBlendFunc, glsym_func_void); + + FINDSYM(_sym_glBlendFuncSeparate, "glBlendFuncSeparate", glsym_func_void); + FALLBAK(_sym_glBlendFuncSeparate, glsym_func_void); + + FINDSYM(_sym_glBufferData, "glBufferData", glsym_func_void); + FALLBAK(_sym_glBufferData, glsym_func_void); + + FINDSYM(_sym_glBufferSubData, "glBufferSubData", glsym_func_void); + FALLBAK(_sym_glBufferSubData, glsym_func_void); + + FINDSYM(_sym_glCheckFramebufferStatus, "glCheckFramebufferStatus", glsym_func_uint); + FALLBAK(_sym_glCheckFramebufferStatus, glsym_func_uint); + + FINDSYM(_sym_glClear, "glClear", glsym_func_void); + FALLBAK(_sym_glClear, glsym_func_void); + + FINDSYM(_sym_glClearColor, "glClearColor", glsym_func_void); + FALLBAK(_sym_glClearColor, glsym_func_void); + + FINDSYM(_sym_glClearDepthf, "glClearDepthf", glsym_func_void); + FINDSYM(_sym_glClearDepthf, "glClearDepth", glsym_func_void); + FALLBAK(_sym_glClearDepthf, glsym_func_void); + + FINDSYM(_sym_glClearStencil, "glClearStencil", glsym_func_void); + FALLBAK(_sym_glClearStencil, glsym_func_void); + + FINDSYM(_sym_glColorMask, "glColorMask", glsym_func_void); + FALLBAK(_sym_glColorMask, glsym_func_void); + + FINDSYM(_sym_glCompileShader, "glCompileShader", glsym_func_void); + FALLBAK(_sym_glCompileShader, glsym_func_void); + + FINDSYM(_sym_glCompressedTexImage2D, "glCompressedTexImage2D", glsym_func_void); + FALLBAK(_sym_glCompressedTexImage2D, glsym_func_void); + + FINDSYM(_sym_glCompressedTexSubImage2D, "glCompressedTexSubImage2D", glsym_func_void); + FALLBAK(_sym_glCompressedTexSubImage2D, glsym_func_void); + + FINDSYM(_sym_glCopyTexImage2D, "glCopyTexImage2D", glsym_func_void); + FALLBAK(_sym_glCopyTexImage2D, glsym_func_void); + + FINDSYM(_sym_glCopyTexSubImage2D, "glCopyTexSubImage2D", glsym_func_void); + FALLBAK(_sym_glCopyTexSubImage2D, glsym_func_void); + + FINDSYM(_sym_glCreateProgram, "glCreateProgram", glsym_func_uint); + FALLBAK(_sym_glCreateProgram, glsym_func_uint); + + FINDSYM(_sym_glCreateShader, "glCreateShader", glsym_func_uint); + FALLBAK(_sym_glCreateShader, glsym_func_uint); + + FINDSYM(_sym_glCullFace, "glCullFace", glsym_func_void); + FALLBAK(_sym_glCullFace, glsym_func_void); + + FINDSYM(_sym_glDeleteBuffers, "glDeleteBuffers", glsym_func_void); + FALLBAK(_sym_glDeleteBuffers, glsym_func_void); + + FINDSYM(_sym_glDeleteFramebuffers, "glDeleteFramebuffers", glsym_func_void); + FALLBAK(_sym_glDeleteFramebuffers, glsym_func_void); + + FINDSYM(_sym_glDeleteProgram, "glDeleteProgram", glsym_func_void); + FALLBAK(_sym_glDeleteProgram, glsym_func_void); + + FINDSYM(_sym_glDeleteRenderbuffers, "glDeleteRenderbuffers", glsym_func_void); + FALLBAK(_sym_glDeleteRenderbuffers, glsym_func_void); + + FINDSYM(_sym_glDeleteShader, "glDeleteShader", glsym_func_void); + FALLBAK(_sym_glDeleteShader, glsym_func_void); + + FINDSYM(_sym_glDeleteTextures, "glDeleteTextures", glsym_func_void); + FALLBAK(_sym_glDeleteTextures, glsym_func_void); + + FINDSYM(_sym_glDepthFunc, "glDepthFunc", glsym_func_void); + FALLBAK(_sym_glDepthFunc, glsym_func_void); + + FINDSYM(_sym_glDepthMask, "glDepthMask", glsym_func_void); + FALLBAK(_sym_glDepthMask, glsym_func_void); + + FINDSYM(_sym_glDepthRangef, "glDepthRangef", glsym_func_void); + FINDSYM(_sym_glDepthRangef, "glDepthRange", glsym_func_void); + FALLBAK(_sym_glDepthRangef, glsym_func_void); + + FINDSYM(_sym_glDetachShader, "glDetachShader", glsym_func_void); + FALLBAK(_sym_glDetachShader, glsym_func_void); + + FINDSYM(_sym_glDisable, "glDisable", glsym_func_void); + FALLBAK(_sym_glDisable, glsym_func_void); + + FINDSYM(_sym_glDisableVertexAttribArray, "glDisableVertexAttribArray", glsym_func_void); + FALLBAK(_sym_glDisableVertexAttribArray, glsym_func_void); + + FINDSYM(_sym_glDrawArrays, "glDrawArrays", glsym_func_void); + FALLBAK(_sym_glDrawArrays, glsym_func_void); + + FINDSYM(_sym_glDrawElements, "glDrawElements", glsym_func_void); + FALLBAK(_sym_glDrawElements, glsym_func_void); + + FINDSYM(_sym_glEnable, "glEnable", glsym_func_void); + FALLBAK(_sym_glEnable, glsym_func_void); + + FINDSYM(_sym_glEnableVertexAttribArray, "glEnableVertexAttribArray", glsym_func_void); + FALLBAK(_sym_glEnableVertexAttribArray, glsym_func_void); + + FINDSYM(_sym_glFinish, "glFinish", glsym_func_void); + FALLBAK(_sym_glFinish, glsym_func_void); + + FINDSYM(_sym_glFlush, "glFlush", glsym_func_void); + FALLBAK(_sym_glFlush, glsym_func_void); + + FINDSYM(_sym_glFramebufferRenderbuffer, "glFramebufferRenderbuffer", glsym_func_void); + FALLBAK(_sym_glFramebufferRenderbuffer, glsym_func_void); + + FINDSYM(_sym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void); + FALLBAK(_sym_glFramebufferTexture2D, glsym_func_void); + + FINDSYM(_sym_glFrontFace, "glFrontFace", glsym_func_void); + FALLBAK(_sym_glFrontFace, glsym_func_void); + + FINDSYM(_sym_glGenBuffers, "glGenBuffers", glsym_func_void); + FALLBAK(_sym_glGenBuffers, glsym_func_void); + + FINDSYM(_sym_glGenerateMipmap, "glGenerateMipmap", glsym_func_void); + FALLBAK(_sym_glGenerateMipmap, glsym_func_void); + + FINDSYM(_sym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void); + FALLBAK(_sym_glGenFramebuffers, glsym_func_void); + + FINDSYM(_sym_glGenRenderbuffers, "glGenRenderbuffers", glsym_func_void); + FALLBAK(_sym_glGenRenderbuffers, glsym_func_void); + + FINDSYM(_sym_glGenTextures, "glGenTextures", glsym_func_void); + FALLBAK(_sym_glGenTextures, glsym_func_void); + + FINDSYM(_sym_glGetActiveAttrib, "glGetActiveAttrib", glsym_func_void); + FALLBAK(_sym_glGetActiveAttrib, glsym_func_void); + + FINDSYM(_sym_glGetActiveUniform, "glGetActiveUniform", glsym_func_void); + FALLBAK(_sym_glGetActiveUniform, glsym_func_void); + + FINDSYM(_sym_glGetAttachedShaders, "glGetAttachedShaders", glsym_func_void); + FALLBAK(_sym_glGetAttachedShaders, glsym_func_void); + + FINDSYM(_sym_glGetAttribLocation, "glGetAttribLocation", glsym_func_int); + FALLBAK(_sym_glGetAttribLocation, glsym_func_int); + + FINDSYM(_sym_glGetBooleanv, "glGetBooleanv", glsym_func_void); + FALLBAK(_sym_glGetBooleanv, glsym_func_void); + + FINDSYM(_sym_glGetBufferParameteriv, "glGetBufferParameteriv", glsym_func_void); + FALLBAK(_sym_glGetBufferParameteriv, glsym_func_void); + + FINDSYM(_sym_glGetError, "glGetError", glsym_func_uint); + FALLBAK(_sym_glGetError, glsym_func_uint); + + FINDSYM(_sym_glGetFloatv, "glGetFloatv", glsym_func_void); + FALLBAK(_sym_glGetFloatv, glsym_func_void); + + FINDSYM(_sym_glGetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv", glsym_func_void); + FALLBAK(_sym_glGetFramebufferAttachmentParameteriv, glsym_func_void); + + FINDSYM(_sym_glGetIntegerv, "glGetIntegerv", glsym_func_void); + FALLBAK(_sym_glGetIntegerv, glsym_func_void); + + FINDSYM(_sym_glGetProgramiv, "glGetProgramiv", glsym_func_void); + FALLBAK(_sym_glGetProgramiv, glsym_func_void); + + FINDSYM(_sym_glGetProgramInfoLog, "glGetProgramInfoLog", glsym_func_void); + FALLBAK(_sym_glGetProgramInfoLog, glsym_func_void); + + FINDSYM(_sym_glGetRenderbufferParameteriv, "glGetRenderbufferParameteriv", glsym_func_void); + FALLBAK(_sym_glGetRenderbufferParameteriv, glsym_func_void); + + FINDSYM(_sym_glGetShaderiv, "glGetShaderiv", glsym_func_void); + FALLBAK(_sym_glGetShaderiv, glsym_func_void); + + FINDSYM(_sym_glGetShaderInfoLog, "glGetShaderInfoLog", glsym_func_void); + FALLBAK(_sym_glGetShaderInfoLog, glsym_func_void); + + FINDSYM(_sym_glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat", glsym_func_void); + FALLBAK(_sym_glGetShaderPrecisionFormat, glsym_func_void); + + FINDSYM(_sym_glGetShaderSource, "glGetShaderSource", glsym_func_void); + FALLBAK(_sym_glGetShaderSource, glsym_func_void); + + FINDSYM(_sym_glGetString, "glGetString", glsym_func_uchar_ptr); + FALLBAK(_sym_glGetString, glsym_func_const_uchar_ptr); + + FINDSYM(_sym_glGetTexParameterfv, "glGetTexParameterfv", glsym_func_void); + FALLBAK(_sym_glGetTexParameterfv, glsym_func_void); + + FINDSYM(_sym_glGetTexParameteriv, "glGetTexParameteriv", glsym_func_void); + FALLBAK(_sym_glGetTexParameteriv, glsym_func_void); + + FINDSYM(_sym_glGetUniformfv, "glGetUniformfv", glsym_func_void); + FALLBAK(_sym_glGetUniformfv, glsym_func_void); + + FINDSYM(_sym_glGetUniformiv, "glGetUniformiv", glsym_func_void); + FALLBAK(_sym_glGetUniformiv, glsym_func_void); + + FINDSYM(_sym_glGetUniformLocation, "glGetUniformLocation", glsym_func_int); + FALLBAK(_sym_glGetUniformLocation, glsym_func_int); + + FINDSYM(_sym_glGetVertexAttribfv, "glGetVertexAttribfv", glsym_func_void); + FALLBAK(_sym_glGetVertexAttribfv, glsym_func_void); + + FINDSYM(_sym_glGetVertexAttribiv, "glGetVertexAttribiv", glsym_func_void); + FALLBAK(_sym_glGetVertexAttribiv, glsym_func_void); + + FINDSYM(_sym_glGetVertexAttribPointerv, "glGetVertexAttribPointerv", glsym_func_void); + FALLBAK(_sym_glGetVertexAttribPointerv, glsym_func_void); + + FINDSYM(_sym_glHint, "glHint", glsym_func_void); + FALLBAK(_sym_glHint, glsym_func_void); + + FINDSYM(_sym_glIsBuffer, "glIsBuffer", glsym_func_uchar); + FALLBAK(_sym_glIsBuffer, glsym_func_uchar); + + FINDSYM(_sym_glIsEnabled, "glIsEnabled", glsym_func_uchar); + FALLBAK(_sym_glIsEnabled, glsym_func_uchar); + + FINDSYM(_sym_glIsFramebuffer, "glIsFramebuffer", glsym_func_uchar); + FALLBAK(_sym_glIsFramebuffer, glsym_func_uchar); + + FINDSYM(_sym_glIsProgram, "glIsProgram", glsym_func_uchar); + FALLBAK(_sym_glIsProgram, glsym_func_uchar); + + FINDSYM(_sym_glIsRenderbuffer, "glIsRenderbuffer", glsym_func_uchar); + FALLBAK(_sym_glIsRenderbuffer, glsym_func_uchar); + + FINDSYM(_sym_glIsShader, "glIsShader", glsym_func_uchar); + FALLBAK(_sym_glIsShader, glsym_func_uchar); + + FINDSYM(_sym_glIsTexture, "glIsTexture", glsym_func_uchar); + FALLBAK(_sym_glIsTexture, glsym_func_uchar); + + FINDSYM(_sym_glLineWidth, "glLineWidth", glsym_func_void); + FALLBAK(_sym_glLineWidth, glsym_func_void); + + FINDSYM(_sym_glLinkProgram, "glLinkProgram", glsym_func_void); + FALLBAK(_sym_glLinkProgram, glsym_func_void); + + FINDSYM(_sym_glPixelStorei, "glPixelStorei", glsym_func_void); + FALLBAK(_sym_glPixelStorei, glsym_func_void); + + FINDSYM(_sym_glPolygonOffset, "glPolygonOffset", glsym_func_void); + FALLBAK(_sym_glPolygonOffset, glsym_func_void); + + FINDSYM(_sym_glReadPixels, "glReadPixels", glsym_func_void); + FALLBAK(_sym_glReadPixels, glsym_func_void); + + FINDSYM(_sym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void); + FALLBAK(_sym_glReleaseShaderCompiler, glsym_func_void); + + FINDSYM(_sym_glRenderbufferStorage, "glRenderbufferStorage", glsym_func_void); + FALLBAK(_sym_glRenderbufferStorage, glsym_func_void); + + FINDSYM(_sym_glSampleCoverage, "glSampleCoverage", glsym_func_void); + FALLBAK(_sym_glSampleCoverage, glsym_func_void); + + FINDSYM(_sym_glScissor, "glScissor", glsym_func_void); + FALLBAK(_sym_glScissor, glsym_func_void); + + FINDSYM(_sym_glShaderBinary, "glShaderBinary", glsym_func_void); + FALLBAK(_sym_glShaderBinary, glsym_func_void); + + FINDSYM(_sym_glShaderSource, "glShaderSource", glsym_func_void); + FALLBAK(_sym_glShaderSource, glsym_func_void); + + FINDSYM(_sym_glStencilFunc, "glStencilFunc", glsym_func_void); + FALLBAK(_sym_glStencilFunc, glsym_func_void); + + FINDSYM(_sym_glStencilFuncSeparate, "glStencilFuncSeparate", glsym_func_void); + FALLBAK(_sym_glStencilFuncSeparate, glsym_func_void); + + FINDSYM(_sym_glStencilMask, "glStencilMask", glsym_func_void); + FALLBAK(_sym_glStencilMask, glsym_func_void); + + FINDSYM(_sym_glStencilMaskSeparate, "glStencilMaskSeparate", glsym_func_void); + FALLBAK(_sym_glStencilMaskSeparate, glsym_func_void); + + FINDSYM(_sym_glStencilOp, "glStencilOp", glsym_func_void); + FALLBAK(_sym_glStencilOp, glsym_func_void); + + FINDSYM(_sym_glStencilOpSeparate, "glStencilOpSeparate", glsym_func_void); + FALLBAK(_sym_glStencilOpSeparate, glsym_func_void); + + FINDSYM(_sym_glTexImage2D, "glTexImage2D", glsym_func_void); + FALLBAK(_sym_glTexImage2D, glsym_func_void); + + FINDSYM(_sym_glTexParameterf, "glTexParameterf", glsym_func_void); + FALLBAK(_sym_glTexParameterf, glsym_func_void); + + FINDSYM(_sym_glTexParameterfv, "glTexParameterfv", glsym_func_void); + FALLBAK(_sym_glTexParameterfv, glsym_func_void); + + FINDSYM(_sym_glTexParameteri, "glTexParameteri", glsym_func_void); + FALLBAK(_sym_glTexParameteri, glsym_func_void); + + FINDSYM(_sym_glTexParameteriv, "glTexParameteriv", glsym_func_void); + FALLBAK(_sym_glTexParameteriv, glsym_func_void); + + FINDSYM(_sym_glTexSubImage2D, "glTexSubImage2D", glsym_func_void); + FALLBAK(_sym_glTexSubImage2D, glsym_func_void); + + FINDSYM(_sym_glUniform1f, "glUniform1f", glsym_func_void); + FALLBAK(_sym_glUniform1f, glsym_func_void); + + FINDSYM(_sym_glUniform1fv, "glUniform1fv", glsym_func_void); + FALLBAK(_sym_glUniform1fv, glsym_func_void); + + FINDSYM(_sym_glUniform1i, "glUniform1i", glsym_func_void); + FALLBAK(_sym_glUniform1i, glsym_func_void); + + FINDSYM(_sym_glUniform1iv, "glUniform1iv", glsym_func_void); + FALLBAK(_sym_glUniform1iv, glsym_func_void); + + FINDSYM(_sym_glUniform2f, "glUniform2f", glsym_func_void); + FALLBAK(_sym_glUniform2f, glsym_func_void); + + FINDSYM(_sym_glUniform2fv, "glUniform2fv", glsym_func_void); + FALLBAK(_sym_glUniform2fv, glsym_func_void); + + FINDSYM(_sym_glUniform2i, "glUniform2i", glsym_func_void); + FALLBAK(_sym_glUniform2i, glsym_func_void); + + FINDSYM(_sym_glUniform2iv, "glUniform2iv", glsym_func_void); + FALLBAK(_sym_glUniform2iv, glsym_func_void); + + FINDSYM(_sym_glUniform3f, "glUniform3f", glsym_func_void); + FALLBAK(_sym_glUniform3f, glsym_func_void); + + FINDSYM(_sym_glUniform3fv, "glUniform3fv", glsym_func_void); + FALLBAK(_sym_glUniform3fv, glsym_func_void); + + FINDSYM(_sym_glUniform3i, "glUniform3i", glsym_func_void); + FALLBAK(_sym_glUniform3i, glsym_func_void); + + FINDSYM(_sym_glUniform3iv, "glUniform3iv", glsym_func_void); + FALLBAK(_sym_glUniform3iv, glsym_func_void); + + FINDSYM(_sym_glUniform4f, "glUniform4f", glsym_func_void); + FALLBAK(_sym_glUniform4f, glsym_func_void); + + FINDSYM(_sym_glUniform4fv, "glUniform4fv", glsym_func_void); + FALLBAK(_sym_glUniform4fv, glsym_func_void); + + FINDSYM(_sym_glUniform4i, "glUniform4i", glsym_func_void); + FALLBAK(_sym_glUniform4i, glsym_func_void); + + FINDSYM(_sym_glUniform4iv, "glUniform4iv", glsym_func_void); + FALLBAK(_sym_glUniform4iv, glsym_func_void); + + FINDSYM(_sym_glUniformMatrix2fv, "glUniformMatrix2fv", glsym_func_void); + FALLBAK(_sym_glUniformMatrix2fv, glsym_func_void); + + FINDSYM(_sym_glUniformMatrix3fv, "glUniformMatrix3fv", glsym_func_void); + FALLBAK(_sym_glUniformMatrix3fv, glsym_func_void); + + FINDSYM(_sym_glUniformMatrix4fv, "glUniformMatrix4fv", glsym_func_void); + FALLBAK(_sym_glUniformMatrix4fv, glsym_func_void); + + FINDSYM(_sym_glUseProgram, "glUseProgram", glsym_func_void); + FALLBAK(_sym_glUseProgram, glsym_func_void); + + FINDSYM(_sym_glValidateProgram, "glValidateProgram", glsym_func_void); + FALLBAK(_sym_glValidateProgram, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib1f, "glVertexAttrib1f", glsym_func_void); + FALLBAK(_sym_glVertexAttrib1f, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib1fv, "glVertexAttrib1fv", glsym_func_void); + FALLBAK(_sym_glVertexAttrib1fv, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib2f, "glVertexAttrib2f", glsym_func_void); + FALLBAK(_sym_glVertexAttrib2f, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib2fv, "glVertexAttrib2fv", glsym_func_void); + FALLBAK(_sym_glVertexAttrib2fv, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib3f, "glVertexAttrib3f", glsym_func_void); + FALLBAK(_sym_glVertexAttrib3f, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib3fv, "glVertexAttrib3fv", glsym_func_void); + FALLBAK(_sym_glVertexAttrib3fv, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib4f, "glVertexAttrib4f", glsym_func_void); + FALLBAK(_sym_glVertexAttrib4f, glsym_func_void); + + FINDSYM(_sym_glVertexAttrib4fv, "glVertexAttrib4fv", glsym_func_void); + FALLBAK(_sym_glVertexAttrib4fv, glsym_func_void); + + FINDSYM(_sym_glVertexAttribPointer, "glVertexAttribPointer", glsym_func_void); + FALLBAK(_sym_glVertexAttribPointer, glsym_func_void); + + FINDSYM(_sym_glViewport, "glViewport", glsym_func_void); + FALLBAK(_sym_glViewport, glsym_func_void); + +#undef FINDSYM +#undef FALLBAK + + return 1; +} + +static int +gl_lib_init(void) +{ + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + //------------------------------------------------// + // Open EGL Library as EGL is separate + egl_lib_handle = dlopen("libEGL.so.1", RTLD_NOW|RTLD_GLOBAL); + if (!egl_lib_handle) + egl_lib_handle = dlopen("libEGL.so", RTLD_NOW|RTLD_GLOBAL); + if (!egl_lib_handle) + { + ERR("%s\n", dlerror()); + return 0; + } + + // use gl_lib handle for GL symbols + gl_lib_handle = dlopen("libGLESv2.so.1", RTLD_NOW); + if (!gl_lib_handle) + gl_lib_handle = dlopen("libGLESv2.so", RTLD_NOW); + if (!gl_lib_handle) + { + ERR("%s\n", dlerror()); + return 0; + } + //------------------------------------------------// + +#else // GLX + + + // use gl_lib handle for both GLX and GL symbols + //gl_lib_handle = dlopen("/usr/lib/libGL.so", RTLD_NOW); + gl_lib_handle = dlopen("libGL.so.1", RTLD_NOW); + if (!gl_lib_handle) + gl_lib_handle = dlopen("libGL.so", RTLD_NOW); + if (!gl_lib_handle) + { + ERR("%s\n", dlerror()); + return 0; + } + + //------------------------------------------------// + +#endif // defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + + if (!glue_sym_init()) return 0; + if (!gl_sym_init()) return 0; + + return 1; +} + + +//----------------------------------------------------------------// +// Override Functions // +//----------------------------------------------------------------// +#define EVASGLUE_API_OVERRIDE(func, api_pre, prefix) \ + api_pre##func = prefix##func + +#define EVASGL_API_OVERRIDE(func, api, prefix) \ + (api)->func = prefix##func + +static void +override_glue_normal_path() +{ +#ifdef EVAS_GL_NAME_MANGLE +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, evgl_) // GL Wrapped Path +#else +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f,, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f,, evgl_) // GL Wrapped Path +#endif + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + N_ORD(eglGetProcAddress); + N_ORD(eglGetError); + N_ORD(eglGetDisplay); + N_ORD(eglInitialize); + N_ORD(eglTerminate); + N_ORD(eglChooseConfig); + N_ORD(eglCreateWindowSurface); + N_ORD(eglCreatePixmapSurface); + N_ORD(eglDestroySurface); + N_ORD(eglBindAPI); + N_ORD(eglWaitClient); + N_ORD(eglSurfaceAttrib); + N_ORD(eglBindTexImage); + N_ORD(eglReleaseTexImage); + N_ORD(eglSwapInterval); + N_ORD(eglCreateContext); + N_ORD(eglDestroyContext); + N_ORD(eglGetCurrentContext); + N_ORD(eglGetCurrentSurface); + N_ORD(eglGetCurrentDisplay); + N_ORD(eglWaitGL); + N_ORD(eglWaitNative); + N_ORD(eglSwapBuffers); + N_ORD(eglCopyBuffers); + N_ORD(eglQueryString); + + // Extensions + N_ORD(eglCreateImage); + N_ORD(eglDestroyImage); + N_ORD(eglMapImageSEC); + N_ORD(eglUnmapImageSEC); + N_ORD(eglGetImageAttribSEC); + N_ORD(glEGLImageTargetTexture2DOES); + N_ORD(glEGLImageTargetRenderbufferStorageOES); + + // Wrapped functions for evasgl specific purpose + W_ORD(eglMakeCurrent); +#else + N_ORD(glXGetProcAddress); + N_ORD(glXChooseVisual); + N_ORD(glXCreateContext); + N_ORD(glXDestroyContext); + N_ORD(glXGetCurrentContext); + N_ORD(glXGetCurrentDrawable); + N_ORD(glXSwapBuffers); + N_ORD(glXWaitX); + N_ORD(glXWaitGL); + N_ORD(glXQueryExtension); + N_ORD(glXQueryExtensionsString); + N_ORD(glXChooseFBConfig); + N_ORD(glXGetFBConfigs); + N_ORD(glXGetFBConfigAttrib); + N_ORD(glXGetVisualFromFBConfig); + N_ORD(glXDestroyWindow); + N_ORD(glXMakeContextCurrent); + N_ORD(glXBindTexImage); + N_ORD(glXReleaseTexImage); + N_ORD(glXGetVideoSync); + N_ORD(glXWaitVideoSync); + N_ORD(glXCreatePixmap); + N_ORD(glXDestroyPixmap); + N_ORD(glXQueryDrawable); + N_ORD(glXSwapIntervalSGI); + N_ORD(glXSwapIntervalEXT); + + // Wrapped functions for evasgl specific purpose + W_ORD(glXMakeCurrent); +#endif + +#undef N_ORD +#undef W_ORD +} + + +static void +override_glue_wrapped_path() +{ + +#ifdef EVAS_GL_NAME_MANGLE +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, evgl_) // GL Wrapped Path +#else +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f,, evgl_) // GL Wrapped Path +#endif + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + W_ORD(eglGetProcAddress); + W_ORD(eglGetError); + W_ORD(eglGetDisplay); + W_ORD(eglInitialize); + W_ORD(eglTerminate); + W_ORD(eglChooseConfig); + W_ORD(eglCreateWindowSurface); + W_ORD(eglCreatePixmapSurface); + W_ORD(eglDestroySurface); + W_ORD(eglBindAPI); + W_ORD(eglWaitClient); + W_ORD(eglSurfaceAttrib); + W_ORD(eglBindTexImage); + W_ORD(eglReleaseTexImage); + W_ORD(eglSwapInterval); + W_ORD(eglCreateContext); + W_ORD(eglDestroyContext); + W_ORD(eglGetCurrentContext); + W_ORD(eglGetCurrentSurface); + W_ORD(eglGetCurrentDisplay); + W_ORD(eglWaitGL); + W_ORD(eglWaitNative); + W_ORD(eglSwapBuffers); + W_ORD(eglCopyBuffers); + W_ORD(eglQueryString); + + // Extensions + W_ORD(eglCreateImage); + W_ORD(eglDestroyImage); + W_ORD(eglMapImageSEC); + W_ORD(eglUnmapImageSEC); + W_ORD(eglGetImageAttribSEC); + W_ORD(glEGLImageTargetTexture2DOES); + W_ORD(glEGLImageTargetRenderbufferStorageOES); + + // Wrapped functions for evasgl specific purpose + W_ORD(eglMakeCurrent); +#else + W_ORD(glXGetProcAddress); + W_ORD(glXChooseVisual); + W_ORD(glXCreateContext); + W_ORD(glXDestroyContext); + W_ORD(glXGetCurrentContext); + W_ORD(glXGetCurrentDrawable); + W_ORD(glXSwapBuffers); + W_ORD(glXWaitX); + W_ORD(glXWaitGL); + W_ORD(glXQueryExtension); + W_ORD(glXQueryExtensionsString); + W_ORD(glXChooseFBConfig); + W_ORD(glXGetFBConfigs); + W_ORD(glXGetFBConfigAttrib); + W_ORD(glXGetVisualFromFBConfig); + W_ORD(glXDestroyWindow); + W_ORD(glXMakeContextCurrent); + W_ORD(glXBindTexImage); + W_ORD(glXReleaseTexImage); + W_ORD(glXGetVideoSync); + W_ORD(glXWaitVideoSync); + W_ORD(glXCreatePixmap); + W_ORD(glXDestroyPixmap); + W_ORD(glXQueryDrawable); + W_ORD(glXSwapIntervalSGI); + W_ORD(glXSwapIntervalEXT); + + // Wrapped functions for evasgl specific purpose + W_ORD(glXMakeCurrent); +#endif + +#undef W_ORD +} + +static void +override_glue_fast_path() +{ + // Inherit from wrapped path + override_glue_wrapped_path(); + +#ifdef EVAS_GL_NAME_MANGLE +# define F_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, fpgl_) // GL Fast Path +#else +# define F_ORD(f) EVASGLUE_API_OVERRIDE(f,, fpgl_) // GL Fast Path +#endif + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + // Fastpath-ed Functions + F_ORD(eglCreateContext); + F_ORD(eglDestroyContext); + F_ORD(eglMakeCurrent); + F_ORD(eglGetCurrentContext); + F_ORD(eglGetCurrentSurface); + +#else + // Fastpath-ed Functions + F_ORD(glXCreateContext); + F_ORD(glXDestroyContext); + F_ORD(glXMakeCurrent); + F_ORD(glXGetCurrentContext); + F_ORD(glXGetCurrentDrawable); + + F_ORD(glXMakeContextCurrent); +#endif + +#undef F_ORD +} + +static void +override_gl_normal_path() +{ +#ifdef EVAS_GL_NAME_MANGLE +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, evgl_) // GL Wrapped Path +#else +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f,, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f,, evgl_) // GL Wrapped Path +#endif + N_ORD(glAttachShader); + N_ORD(glBindAttribLocation); + N_ORD(glBufferData); + N_ORD(glBufferSubData); + N_ORD(glCheckFramebufferStatus); + N_ORD(glClear); + N_ORD(glCompileShader); + N_ORD(glCompressedTexImage2D); + N_ORD(glCompressedTexSubImage2D); + N_ORD(glCopyTexImage2D); + N_ORD(glCopyTexSubImage2D); + N_ORD(glCreateProgram); + N_ORD(glCreateShader); + N_ORD(glDeleteBuffers); + N_ORD(glDeleteFramebuffers); + N_ORD(glDeleteProgram); + N_ORD(glDeleteRenderbuffers); + N_ORD(glDeleteShader); + N_ORD(glDeleteTextures); + N_ORD(glFinish); + N_ORD(glFlush); + N_ORD(glFramebufferRenderbuffer); + N_ORD(glFramebufferTexture2D); + N_ORD(glGenBuffers); + N_ORD(glGenerateMipmap); + N_ORD(glGenFramebuffers); + N_ORD(glGenRenderbuffers); + N_ORD(glGenTextures); + N_ORD(glGetActiveAttrib); + N_ORD(glGetActiveUniform); + N_ORD(glGetAttachedShaders); + N_ORD(glGetAttribLocation); + N_ORD(glGetBooleanv); + N_ORD(glGetBufferParameteriv); + N_ORD(glGetError); + N_ORD(glGetFloatv); + N_ORD(glGetFramebufferAttachmentParameteriv); + N_ORD(glGetIntegerv); + N_ORD(glGetProgramiv); + N_ORD(glGetProgramInfoLog); + N_ORD(glGetRenderbufferParameteriv); + N_ORD(glGetShaderiv); + N_ORD(glGetShaderInfoLog); + N_ORD(glGetShaderSource); + N_ORD(glGetString); + N_ORD(glGetTexParameterfv); + N_ORD(glGetTexParameteriv); + N_ORD(glGetUniformfv); + N_ORD(glGetUniformiv); + N_ORD(glGetUniformLocation); + N_ORD(glIsBuffer); + N_ORD(glIsEnabled); + N_ORD(glIsFramebuffer); + N_ORD(glIsProgram); + N_ORD(glIsRenderbuffer); + N_ORD(glIsShader); + N_ORD(glIsTexture); + N_ORD(glLineWidth); + N_ORD(glLinkProgram); + N_ORD(glReadPixels); + N_ORD(glRenderbufferStorage); + N_ORD(glShaderSource); + N_ORD(glTexImage2D); + N_ORD(glTexParameterf); + N_ORD(glTexParameterfv); + N_ORD(glTexParameteri); + N_ORD(glTexParameteriv); + N_ORD(glTexSubImage2D); + N_ORD(glUniform1f); + N_ORD(glUniform1fv); + N_ORD(glUniform1i); + N_ORD(glUniform1iv); + N_ORD(glUniform2f); + N_ORD(glUniform2fv); + N_ORD(glUniform2i); + N_ORD(glUniform2iv); + N_ORD(glUniform3f); + N_ORD(glUniform3fv); + N_ORD(glUniform3i); + N_ORD(glUniform3iv); + N_ORD(glUniform4f); + N_ORD(glUniform4fv); + N_ORD(glUniform4i); + N_ORD(glUniform4iv); + N_ORD(glUniformMatrix2fv); + N_ORD(glUniformMatrix3fv); + N_ORD(glUniformMatrix4fv); + N_ORD(glValidateProgram); + + N_ORD(glActiveTexture); + N_ORD(glBindBuffer); + N_ORD(glBindTexture); + N_ORD(glBlendColor); + N_ORD(glBlendEquation); + N_ORD(glBlendEquationSeparate); + N_ORD(glBlendFunc); + N_ORD(glBlendFuncSeparate); + N_ORD(glClearColor); + N_ORD(glClearDepthf); + N_ORD(glClearStencil); + N_ORD(glColorMask); + N_ORD(glCullFace); + N_ORD(glDepthFunc); + N_ORD(glDepthMask); + N_ORD(glDepthRangef); + N_ORD(glDetachShader); + N_ORD(glDisable); + N_ORD(glDisableVertexAttribArray); + N_ORD(glDrawArrays); + N_ORD(glDrawElements); + N_ORD(glEnable); + N_ORD(glEnableVertexAttribArray); + N_ORD(glFrontFace); + N_ORD(glGetVertexAttribfv); + N_ORD(glGetVertexAttribiv); + N_ORD(glGetVertexAttribPointerv); + N_ORD(glHint); + N_ORD(glPixelStorei); + N_ORD(glPolygonOffset); + N_ORD(glSampleCoverage); + N_ORD(glScissor); + N_ORD(glStencilFunc); + N_ORD(glStencilFuncSeparate); + N_ORD(glStencilMask); + N_ORD(glStencilMaskSeparate); + N_ORD(glStencilOp); + N_ORD(glStencilOpSeparate); + N_ORD(glUseProgram); + N_ORD(glVertexAttrib1f); + N_ORD(glVertexAttrib1fv); + N_ORD(glVertexAttrib2f); + N_ORD(glVertexAttrib2fv); + N_ORD(glVertexAttrib3f); + N_ORD(glVertexAttrib3fv); + N_ORD(glVertexAttrib4f); + N_ORD(glVertexAttrib4fv); + N_ORD(glVertexAttribPointer); + N_ORD(glViewport); + + // Extensions + N_ORD(glGetProgramBinary); + N_ORD(glProgramBinary); + N_ORD(glProgramParameteri); + + //----------------------------------------------------// + // Functions that need to be overriden for evasgl use + W_ORD(glBindFramebuffer); + W_ORD(glBindRenderbuffer); + + // GLES2.0 API compat on top of desktop gl + W_ORD(glGetShaderPrecisionFormat); + W_ORD(glReleaseShaderCompiler); + W_ORD(glShaderBinary); + +#undef N_ORD +#undef W_ORD +} + +static void +override_gl_wrapped_path() +{ + +#ifdef EVAS_GL_NAME_MANGLE +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, evgl_) // GL Wrapped Path +#else +# define N_ORD(f) EVASGLUE_API_OVERRIDE(f,, _sym_) // GL Normal Path +# define W_ORD(f) EVASGLUE_API_OVERRIDE(f,, evgl_) // GL Wrapped Path +#endif + + W_ORD(glAttachShader); + W_ORD(glBindAttribLocation); + W_ORD(glBufferData); + W_ORD(glBufferSubData); + W_ORD(glCheckFramebufferStatus); + W_ORD(glClear); + W_ORD(glCompileShader); + W_ORD(glCompressedTexImage2D); + W_ORD(glCompressedTexSubImage2D); + W_ORD(glCopyTexImage2D); + W_ORD(glCopyTexSubImage2D); + W_ORD(glCreateProgram); + W_ORD(glCreateShader); + W_ORD(glDeleteBuffers); + W_ORD(glDeleteFramebuffers); + W_ORD(glDeleteProgram); + W_ORD(glDeleteRenderbuffers); + W_ORD(glDeleteShader); + W_ORD(glDeleteTextures); + W_ORD(glFinish); + W_ORD(glFlush); + W_ORD(glFramebufferRenderbuffer); + W_ORD(glFramebufferTexture2D); + W_ORD(glGenBuffers); + W_ORD(glGenerateMipmap); + W_ORD(glGenFramebuffers); + W_ORD(glGenRenderbuffers); + W_ORD(glGenTextures); + W_ORD(glGetActiveAttrib); + W_ORD(glGetActiveUniform); + W_ORD(glGetAttachedShaders); + W_ORD(glGetAttribLocation); + W_ORD(glGetBooleanv); + W_ORD(glGetBufferParameteriv); + W_ORD(glGetError); + W_ORD(glGetFloatv); + W_ORD(glGetFramebufferAttachmentParameteriv); + W_ORD(glGetIntegerv); + W_ORD(glGetProgramiv); + W_ORD(glGetProgramInfoLog); + W_ORD(glGetRenderbufferParameteriv); + W_ORD(glGetShaderiv); + W_ORD(glGetShaderInfoLog); + W_ORD(glGetShaderSource); + W_ORD(glGetString); + W_ORD(glGetTexParameterfv); + W_ORD(glGetTexParameteriv); + W_ORD(glGetUniformfv); + W_ORD(glGetUniformiv); + W_ORD(glGetUniformLocation); + W_ORD(glIsBuffer); + W_ORD(glIsEnabled); + W_ORD(glIsFramebuffer); + W_ORD(glIsProgram); + W_ORD(glIsRenderbuffer); + W_ORD(glIsShader); + W_ORD(glIsTexture); + W_ORD(glLineWidth); + W_ORD(glLinkProgram); + W_ORD(glReadPixels); + W_ORD(glRenderbufferStorage); + W_ORD(glShaderSource); + W_ORD(glTexImage2D); + W_ORD(glTexParameterf); + W_ORD(glTexParameterfv); + W_ORD(glTexParameteri); + W_ORD(glTexParameteriv); + W_ORD(glTexSubImage2D); + W_ORD(glUniform1f); + W_ORD(glUniform1fv); + W_ORD(glUniform1i); + W_ORD(glUniform1iv); + W_ORD(glUniform2f); + W_ORD(glUniform2fv); + W_ORD(glUniform2i); + W_ORD(glUniform2iv); + W_ORD(glUniform3f); + W_ORD(glUniform3fv); + W_ORD(glUniform3i); + W_ORD(glUniform3iv); + W_ORD(glUniform4f); + W_ORD(glUniform4fv); + W_ORD(glUniform4i); + W_ORD(glUniform4iv); + W_ORD(glUniformMatrix2fv); + W_ORD(glUniformMatrix3fv); + W_ORD(glUniformMatrix4fv); + W_ORD(glValidateProgram); + + W_ORD(glActiveTexture); + W_ORD(glBindBuffer); + W_ORD(glBindTexture); + W_ORD(glBlendColor); + W_ORD(glBlendEquation); + W_ORD(glBlendEquationSeparate); + W_ORD(glBlendFunc); + W_ORD(glBlendFuncSeparate); + W_ORD(glClearColor); + W_ORD(glClearDepthf); + W_ORD(glClearStencil); + W_ORD(glColorMask); + W_ORD(glCullFace); + W_ORD(glDepthFunc); + W_ORD(glDepthMask); + W_ORD(glDepthRangef); + W_ORD(glDetachShader); + W_ORD(glDisable); + W_ORD(glDisableVertexAttribArray); + W_ORD(glDrawArrays); + W_ORD(glDrawElements); + W_ORD(glEnable); + W_ORD(glEnableVertexAttribArray); + W_ORD(glFrontFace); + W_ORD(glGetVertexAttribfv); + W_ORD(glGetVertexAttribiv); + W_ORD(glGetVertexAttribPointerv); + W_ORD(glHint); + W_ORD(glPixelStorei); + W_ORD(glPolygonOffset); + W_ORD(glSampleCoverage); + W_ORD(glScissor); + W_ORD(glStencilFunc); + W_ORD(glStencilFuncSeparate); + W_ORD(glStencilMask); + W_ORD(glStencilMaskSeparate); + W_ORD(glStencilOp); + W_ORD(glStencilOpSeparate); + W_ORD(glUseProgram); + W_ORD(glVertexAttrib1f); + W_ORD(glVertexAttrib1fv); + W_ORD(glVertexAttrib2f); + W_ORD(glVertexAttrib2fv); + W_ORD(glVertexAttrib3f); + W_ORD(glVertexAttrib3fv); + W_ORD(glVertexAttrib4f); + W_ORD(glVertexAttrib4fv); + W_ORD(glVertexAttribPointer); + W_ORD(glViewport); + + // Extensions + W_ORD(glGetProgramBinary); + W_ORD(glProgramBinary); + W_ORD(glProgramParameteri); + + //----------------------------------------------------// + // Functions that need to be overriden for evasgl use + W_ORD(glBindFramebuffer); + W_ORD(glBindRenderbuffer); + + // GLES2.0 API compat on top of desktop gl + W_ORD(glGetShaderPrecisionFormat); + W_ORD(glReleaseShaderCompiler); + W_ORD(glShaderBinary); + +#undef N_ORD +#undef W_ORD +} + +static void +override_gl_fast_path() +{ + // Inherit from wrapped path + override_gl_wrapped_path(); + +#ifdef EVAS_GL_NAME_MANGLE +# define F_ORD(f) EVASGLUE_API_OVERRIDE(f, glsym_, fpgl_) // GL Wrapped Path +#else +# define F_ORD(f) EVASGLUE_API_OVERRIDE(f,, fpgl_) // GL Wrapped Path +#endif + + // Fast-Path Functions + F_ORD(glActiveTexture); + F_ORD(glBindBuffer); + F_ORD(glBindTexture); + F_ORD(glBlendColor); + F_ORD(glBlendEquation); + F_ORD(glBlendEquationSeparate); + F_ORD(glBlendFunc); + F_ORD(glBlendFuncSeparate); + F_ORD(glClearColor); + F_ORD(glClearDepthf); + F_ORD(glClearStencil); + F_ORD(glColorMask); + F_ORD(glCullFace); + F_ORD(glDepthFunc); + F_ORD(glDepthMask); + F_ORD(glDepthRangef); + F_ORD(glDisable); + F_ORD(glDisableVertexAttribArray); + F_ORD(glDrawArrays); + F_ORD(glDrawElements); + F_ORD(glEnable); + F_ORD(glEnableVertexAttribArray); + F_ORD(glFrontFace); + F_ORD(glGetVertexAttribfv); + F_ORD(glGetVertexAttribiv); + F_ORD(glGetVertexAttribPointerv); + F_ORD(glHint); + F_ORD(glLineWidth); + F_ORD(glPixelStorei); + F_ORD(glPolygonOffset); + F_ORD(glSampleCoverage); + F_ORD(glScissor); + F_ORD(glStencilFunc); + F_ORD(glStencilFuncSeparate); + F_ORD(glStencilMask); + F_ORD(glStencilMaskSeparate); + F_ORD(glStencilOp); + F_ORD(glStencilOpSeparate); + F_ORD(glUseProgram); + F_ORD(glVertexAttrib1f); + F_ORD(glVertexAttrib1fv); + F_ORD(glVertexAttrib2f); + F_ORD(glVertexAttrib2fv); + F_ORD(glVertexAttrib3f); + F_ORD(glVertexAttrib3fv); + F_ORD(glVertexAttrib4f); + F_ORD(glVertexAttrib4fv); + F_ORD(glVertexAttribPointer); + F_ORD(glViewport); + + // Functions that need to be overriden for evasgl use + F_ORD(glBindFramebuffer); + F_ORD(glBindRenderbuffer); + +#undef F_ORD +} + + +static void +override_glue_apis(Evas_GL_Opt_Flag opt) +{ + switch(opt) + { + case GL_NORMAL_PATH: + override_glue_normal_path(); + break; + case GL_WRAPPED_PATH: + override_glue_wrapped_path(); + break; + case GL_FAST_PATH: + override_glue_fast_path(); + break; + default: + ERR("Invalide GL Override Option!!!\n"); + } +} + +static void +override_gl_apis(Evas_GL_Opt_Flag opt) +{ + //_gl.version = EVAS_GL_API_VERSION; + + switch(opt) + { + case GL_NORMAL_PATH: + override_gl_normal_path(); + break; + case GL_WRAPPED_PATH: + override_gl_wrapped_path(); + break; + case GL_FAST_PATH: + override_gl_fast_path(); + break; + default: + ERR("Invalide GL Override Option!!!\n"); + } + +} + +int +init_gl() +{ + char *fp_env; + int fastpath_opt = 0; + Evas_GL_Opt_Flag api_opt = GL_NORMAL_PATH; + + DBG("Initializing OpenGL APIs...\n"); + + fp_env = getenv("EVAS_GL_FASTPATH"); + + if (fp_env) fastpath_opt = atoi(fp_env); + else fastpath_opt = 0; + + switch(fastpath_opt) + { + case 1: + api_opt = GL_FAST_PATH; + DBG("API OPT: %d Fastpath enabled...\n", fastpath_opt); + break; + case 2: + api_opt = GL_WRAPPED_PATH; + DBG("API OPT: %d Wrapped API path enabled...\n", fastpath_opt); + break; + default: + DBG("API OPT: %d Default API path enabled...\n", fastpath_opt); + api_opt = GL_NORMAL_PATH; + break; + } + + if (!gl_lib_init()) return 0; + + override_glue_apis(api_opt); + override_gl_apis(api_opt); + + return 1; +} + +void +free_gl() +{ +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + if (global_ctx) + { + ERR("Destroying global context...\n"); + _sym_eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + _sym_eglDestroyContext(global_dpy, global_ctx); + } + if (egl_lib_handle) dlclose(egl_lib_handle); + if (gl_lib_handle) dlclose (gl_lib_handle); +#else + if (global_ctx) + { + ERR("Destroying global context...\n"); + _sym_glXDestroyContext(global_dpy, global_ctx); + } + if (gl_lib_handle) dlclose (gl_lib_handle); +#endif +} + diff --git a/src/modules/engines/gl_common/evas_gl_core.h b/src/modules/engines/gl_common/evas_gl_core.h new file mode 100644 index 0000000..4323fe1 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_core.h @@ -0,0 +1,1377 @@ +#ifndef EVAS_GL_CORE_H +#define EVAS_GL_CORE_H + +#include +#include + +#ifdef EVAS_GL_STANDALONE +# define ERR(...) \ + fprintf(stderr, __VA_ARGS__); + +# ifdef EVAS_GL_DEBUG +# define DBG(...) \ + fprintf(stderr, __VA_ARGS__); +# endif +#else +# include "config.h" +# include "evas_common.h" + +# define EVAS_GL_NAME_MANGLE 1 +#endif + +// Name mangling used when built with Evas +#ifdef EVAS_GL_NAME_MANGLE +# define GL(name) glsym_##name +#else +# define GL(name) name +#endif + + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/*------------------------------------------------------------------------- + * Data type definitions + *-----------------------------------------------------------------------*/ + +typedef void GLvoid; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef signed char GLbyte; // Changed khronos_int8_t +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLubyte; // Changed khronos_uint8_t +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef float GLfloat; // Changed khronos_float_t +typedef float GLclampf; // Changed khronos_float_t +typedef signed int GLfixed; // Changed khronos_int32_t + +/* GL types for handling large vertex buffer objects */ +typedef signed long int GLintptr; // Changed khronos_intptr_t +typedef signed long int GLsizeiptr; // Changed khronos_ssize_t + +#if (!defined(__gl2_h_) && !defined(__gl_h_)) +# define __gl_h_ +# define __gl2_h_ + +/* OpenGL ES core versions */ +//#define GL_ES_VERSION_2_0 1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 + +/* Boolean */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 + +/* AlphaFunction (not supported in ES20) */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + +/* BlendEquationSeparate */ +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */ +#define GL_BLEND_EQUATION_ALPHA 0x883D + +/* BlendSubtract */ +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B + +/* Separate Blend Functions */ +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 + +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 + +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 + +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 + +/* CullFaceMode */ +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* EnableCap */ +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetPName */ +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +/* GL_SCISSOR_TEST */ +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +/* GL_POLYGON_OFFSET_FILL */ +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +#define GL_GENERATE_MIPMAP_HINT 0x8192 + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C + +/* PixelFormat */ +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +/* PixelType */ +/* GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 + +/* Shaders */ +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D + +/* StencilFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 + +/* TextureTarget */ +/* GL_TEXTURE_2D */ +#define GL_TEXTURE 0x1702 + +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C + +/* TextureUnit */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 + +/* TextureWrapMode */ +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 + +/* Uniform Types */ +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 + +/* Vertex Arrays */ +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F + +/* Read Format */ +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B + +/* Shader Source */ +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA + +/* Shader Binary */ +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 + +/* Shader Precision-Specified Types */ +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 + +/* Framebuffer Object. */ +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 + +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 + +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 + +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 + +#define GL_NONE 0 + +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD + +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +//---------------------------// +// GLES extension defines + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +#endif + +#ifndef GL_ARB_get_program_binary +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +#endif + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) +//------------------------------------------------------// +// EGL +//------------------------------------------------------// + +/* EGL Types */ +/* EGLint is defined in eglplatform.h */ + +//!!!! Should be in +typedef int EGLint; // Should properly handle 64bit machine... + +//!!!! X11 Dependent... +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLSurface; +typedef void *EGLClientBuffer; + +/* EGL Versioning */ +#define EGL_VERSION_1_0 1 +#define EGL_VERSION_1_1 1 +#define EGL_VERSION_1_2 1 +#define EGL_VERSION_1_3 1 +#define EGL_VERSION_1_4 1 + +/* EGL Enumerants. Bitmasks and other exceptional cases aside, most + * enums are assigned unique values starting at 0x3000. + */ + +/* EGL aliases */ +#define EGL_FALSE 0 +#define EGL_TRUE 1 + +/* Out-of-band handle values */ +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_SURFACE ((EGLSurface)0) + +/* Out-of-band attribute value */ +#define EGL_DONT_CARE ((EGLint)-1) + +/* Errors / GetError return values */ +#define EGL_SUCCESS 0x3000 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */ + +/* Reserved 0x300F-0x301F for additional errors */ + +/* Config attributes */ +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_RED_SIZE 0x3024 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_PRESERVED_RESOURCES 0x3030 +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_NONE 0x3038 /* Attrib list terminator */ +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */ +#define EGL_CONFORMANT 0x3042 + +/* Reserved 0x3041-0x304F for additional config attributes */ + +/* Config attribute values */ +#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */ +#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */ +#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */ +#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */ +#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */ + +/* More config attribute values, for EGL_TEXTURE_FORMAT */ +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_2D 0x305F + +/* Config attribute mask bits */ +#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */ + +#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */ + +/* QueryString targets */ +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_EXTENSIONS 0x3055 +#define EGL_CLIENT_APIS 0x308D + +/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */ +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 + +/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */ +#define EGL_BACK_BUFFER 0x3084 +#define EGL_SINGLE_BUFFER 0x3085 + +/* OpenVG color spaces */ +#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */ +#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */ + +/* OpenVG alpha formats */ +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */ +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */ + +/* Constant scale factor by which fractional display resolutions & + * aspect ratio are scaled when queried as integer values. + */ +#define EGL_DISPLAY_SCALING 10000 + +/* Unknown display resolution/aspect ratio */ +#define EGL_UNKNOWN ((EGLint)-1) + +/* Back buffer swap behaviors */ +#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */ +#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */ + +/* CreatePbufferFromClientBuffer buffer types */ +#define EGL_OPENVG_IMAGE 0x3096 + +/* QueryContext targets */ +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 + +/* CreateContext attributes */ +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 + +/* Multisample resolution behaviors */ +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */ +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */ + +/* BindAPI/QueryAPI targets */ +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENGL_API 0x30A2 + +/* GetCurrentSurface targets */ +#define EGL_DRAW 0x3059 +#define EGL_READ 0x305A + +/* WaitNative engines */ +#define EGL_CORE_NATIVE_ENGINE 0x305B + +/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */ +#define EGL_COLORSPACE EGL_VG_COLORSPACE +#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT +#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB +#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR +#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE +#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE + + +#else + +//------------------------------------------------------// +// GLX +//------------------------------------------------------// + +#define GLX_VERSION_1_1 1 +#define GLX_VERSION_1_2 1 +#define GLX_VERSION_1_3 1 +#define GLX_VERSION_1_4 1 + +#define GLX_EXTENSION_NAME "GLX" + +/* + * Tokens for glXChooseVisual and glXGetConfig: + */ +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 + + +/* + * Error codes returned by glXGetConfig: + */ +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + + +/* + * GLX 1.1 and later: + */ +#define GLX_VENDOR 1 +#define GLX_VERSION 2 +#define GLX_EXTENSIONS 3 + + +/* + * GLX 1.3 and later: + */ +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 + + +/* + * GLX 1.4 and later: + */ +#define GLX_SAMPLE_BUFFERS 0x186a0 /*100000*/ +#define GLX_SAMPLES 0x186a1 /*100001*/ + + + +typedef struct __GLXcontextRec *GLXContext; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +/* GLX 1.3 and later */ +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef XID GLXFBConfigID; +typedef XID GLXContextID; +typedef XID GLXWindow; +typedef XID GLXPbuffer; + + + +/* + * #?. GLX_EXT_texture_from_pixmap + * XXX not finished? + */ +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 + +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 + +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 + +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA + +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 + +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD + +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT +#define GLX_BACK_EXT GLX_BACK_LEFT_EXT +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB + +#endif //GLX_EXT_texture_from_pixmap + +#endif //EGL vs. GLX + + +//------------------------------------------------------// + +#define MAX_TEXTURE_UNITS 32 +#define MAX_VERTEX_ATTRIBS 16 +typedef struct _EvasGlueContext *EvasGlueContext; + +typedef struct _GL_Texture_State +{ + GLint tex_unit; + GLuint tex_id; +} GL_Texture_State; + +typedef struct _GL_Vertex_Array_State +{ + GLboolean modified; + GLboolean enabled; + GLint size; + GLenum type; + GLboolean normalized; + GLsizei stride; + void *pointer; +} GL_Vertex_Array_State; + +typedef struct _GL_Vertex_Attrib +{ + GLboolean modified; + GLfloat value[4]; +} GL_Vertex_Attrib; + + +#define MAGIC_GLFAST 0x73777770 + +struct _EvasGlueContext +{ + + int magic; + + // First time flag + int first_time; + + // Default Framebuffer and RenderBuffers + GLuint fb_zero; + GLuint rb_zero; + GLuint evasgl_enabled; + + GLint num_tex_units; + GLint num_vertex_attribs; + + //----------------------------------------// + // GL States + // Bind Functions + // glBind {Buffer, Framebuffer, Renderbuffer} + // * Texture Binding is done with textures + unsigned char _bind_flag; + GLuint gl_array_buffer_binding; // 0 + GLuint gl_element_array_buffer_binding; // 0 + GLuint gl_framebuffer_binding; // 0 + GLuint gl_renderbuffer_binding; // 0 + + //------------------// + // Enable States + // glEnable() + unsigned char _enable_flag1; + GLboolean gl_blend; // GL_FALSE + GLboolean gl_cull_face; // GL_FALSE + GLboolean gl_depth_test; // GL_FALSE + GLboolean gl_dither; // GL_TRUE + + unsigned char _enable_flag2; + GLboolean gl_polygon_offset_fill; // GL_FALSE + GLboolean gl_sample_alpha_to_coverage; // GL_FALSE + GLboolean gl_sample_coverage; // GL_FALSE + GLboolean gl_scissor_test; // GL_FALSE + GLboolean gl_stencil_test; // GL_FALSE + + //------------------// + unsigned char _clear_flag1; + // Viewport + GLint gl_viewport[4]; // (0,0,w,h) + // Program (Shaders) + GLuint gl_current_program; // 0 + + // Clear Color + GLclampf gl_color_clear_value[4]; // (0,0,0,0) + + //------------------// + unsigned char _clear_flag2; + GLboolean gl_color_writemask[4]; // (GL_TRUE x 4) + // Depth + GLclampf gl_depth_range[2]; // (0,1) + GLclampf gl_depth_clear_value; // 1 + GLenum gl_depth_func; // GL_LESS + GLboolean gl_depth_writemask; // GL_TRUE + GLenum gl_cull_face_mode; // GL_FALSE + + //------------------// + unsigned char _tex_flag1; + // Texture + GL_Texture_State tex_state[MAX_TEXTURE_UNITS]; + GLenum gl_active_texture; // GL_TEXTURE0 + GLenum gl_generate_mipmap_hint; // GL_DONT_CARE + GLuint gl_texture_binding_2d; // 0 + GLuint gl_texture_binding_cube_map; // 0 + + //unsigned char _tex_flag2[4]; + + //------------------// + unsigned char _blend_flag; + // Blending + GLclampf gl_blend_color[4]; + GLenum gl_blend_src_rgb; // GL_ONE + GLenum gl_blend_src_alpha; // GL_ONE + GLenum gl_blend_dst_rgb; // GL_ZERO + GLenum gl_blend_dst_alpha; // GL_ZERO + GLenum gl_blend_equation_rgb; + GLenum gl_blend_equation_alpha; + + //------------------// + unsigned char _stencil_flag1; + // Stencil + GLenum gl_stencil_func; // GL_ALWAYS + GLint gl_stencil_ref; + GLuint gl_stencil_value_mask; // 0xffffffff + GLenum gl_stencil_fail; // GL_KEEP + GLenum gl_stencil_pass_depth_fail; // GL_KEEP + GLenum gl_stencil_pass_depth_pass; // GL_KEEP + GLuint gl_stencil_writemask; // 0xffffffff + + unsigned char _stencil_flag2; + GLenum gl_stencil_back_func; // GL_ALWAYS + GLint gl_stencil_back_ref; + GLuint gl_stencil_back_value_mask; // 0xffffffff + GLenum gl_stencil_back_fail; // GL_KEEP + GLenum gl_stencil_back_depth_fail; // GL_KEEP + GLenum gl_stencil_back_depth_pass; // GL_KEEP + GLuint gl_stencil_back_writemask; // 0xffffffff + + GLint gl_stencil_clear_value; + + + //------------------// + + + //------------------// + unsigned char _misc_flag1; + GLenum gl_front_face; // GL_CCW + GLfloat gl_line_width; // 1 + GLfloat gl_polygon_offset_factor; // 0 + GLfloat gl_polygon_offset_units; // 0 + GLclampf gl_sample_coverage_value; + GLboolean gl_sample_coverage_invert; + + unsigned char _misc_flag2; + GLint gl_scissor_box[4]; // (0,0,w,h) + GLint gl_pack_alignment; // 4 + GLint gl_unpack_alignment; // 4 + + //------------------// + // Vertex Attrib Array + unsigned char _varray_flag; + GL_Vertex_Array_State vertex_array[MAX_VERTEX_ATTRIBS]; + GLint gl_current_vertex_attrib[4]; + + // Verte Attribs + unsigned char _vattrib_flag; + GL_Vertex_Attrib vertex_attrib[MAX_VERTEX_ATTRIBS]; + +}; + + +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) +//------------------------------------------------------// + +typedef void (*_eng_fn) (void); + +//------------------------------------------------------// +// EGL APIs... Only ones that are being used. + +// Standard EGL APIs +extern _eng_fn (*GL(eglGetProcAddress)) (const char* procname); + +extern EGLint (*GL(eglGetError)) (void); +extern EGLDisplay (*GL(eglGetDisplay)) (EGLNativeDisplayType display_id); +extern EGLBoolean (*GL(eglInitialize)) (EGLDisplay dpy, EGLint* major, EGLint *minor); +extern EGLBoolean (*GL(eglTerminate)) (EGLDisplay dpy); +extern EGLBoolean (*GL(eglChooseConfig)) (EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config); +extern EGLSurface (*GL(eglCreateWindowSurface)) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list); +extern EGLSurface (*GL(eglCreatePixmapSurface)) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list); +extern EGLBoolean (*GL(eglDestroySurface)) (EGLDisplay dpy, EGLSurface surface); +extern EGLBoolean (*GL(eglBindAPI)) (EGLenum api); +extern EGLBoolean (*GL(eglWaitClient)) (void); +extern EGLBoolean (*GL(eglSurfaceAttrib)) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +extern void (*GL(eglBindTexImage)) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +extern EGLBoolean (*GL(eglReleaseTexImage)) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +extern EGLBoolean (*GL(eglSwapInterval)) (EGLDisplay dpy, EGLint interval); +extern EGLContext (*GL(eglCreateContext)) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list); +extern EGLBoolean (*GL(eglDestroyContext)) (EGLDisplay dpy, EGLContext ctx); +extern EGLBoolean (*GL(eglMakeCurrent)) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +extern EGLContext (*GL(eglGetCurrentContext)) (void); +extern EGLSurface (*GL(eglGetCurrentSurface)) (EGLint readdraw); +extern EGLDisplay (*GL(eglGetCurrentDisplay)) (void); +extern EGLBoolean (*GL(eglWaitGL)) (void); +extern EGLBoolean (*GL(eglWaitNative)) (EGLint engine); +extern EGLBoolean (*GL(eglSwapBuffers)) (EGLDisplay dpy, EGLSurface surface); +extern EGLBoolean (*GL(eglCopyBuffers)) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +extern char const *(*GL(eglQueryString)) (EGLDisplay dpy, EGLint name); + +// Extensions +extern void *(*GL(eglCreateImage)) (void *a, void *b, GLenum c, void *d, const int *e); +extern unsigned int (*GL(eglDestroyImage)) (void *a, void *b); +extern void (*GL(glEGLImageTargetTexture2DOES)) (int a, void *b); +extern void (*GL(glEGLImageTargetRenderbufferStorageOES)) (int a, void *b); +extern void *(*GL(eglMapImageSEC)) (void *a, void *b); +extern unsigned int (*GL(eglUnmapImageSEC)) (void *a, void *b); +extern unsigned int (*GL(eglGetImageAttribSEC)) (void *a, void *b, int c, int *d); +//extern unsigned int (*GL(eglLockSurface)) (EGLDisplay a, EGLSurface b, const int *attrib_list); +//extern unsigned int (*GL(eglUnlockSurface)) (EGLDisplay a, EGLSurface b); + + +//------------------------------------------------------// + +#else + +//------------------------------------------------------// + +typedef void (*_eng_fn) (void); + +//------------------------------------------------------// +// GLX APIs... Only ones that are being used. + +//--------// +extern _eng_fn (*GL(glXGetProcAddress)) (const char* procName); + +// Standard GL(glX) functions +extern XVisualInfo* (*GL(glXChooseVisual)) (Display* dpy, int screen, int* attribList); +extern GLXContext (*GL(glXCreateContext)) (Display* dpy, XVisualInfo* vis, GLXContext shareList, Bool direct); +extern void (*GL(glXDestroyContext)) (Display* dpy, GLXContext ctx); +extern GLXContext (*GL(glXGetCurrentContext)) (void); +extern GLXDrawable (*GL(glXGetCurrentDrawable)) (void); +extern Bool (*GL(glXMakeCurrent)) (Display* dpy, GLXDrawable draw, GLXContext ctx); +extern void (*GL(glXSwapBuffers)) (Display* dpy, GLXDrawable draw); +extern void (*GL(glXWaitX)) (void); +extern void (*GL(glXWaitGL)) (void); +extern Bool (*GL(glXQueryExtension)) (Display* dpy, int* errorb, int* event); +extern const char *(*GL(glXQueryExtensionsString)) (Display *dpy, int screen); + +//--------// +extern GLXFBConfig* (*GL(glXChooseFBConfig)) (Display* dpy, int screen, const int* attribList, int* nitems); +extern GLXFBConfig* (*GL(glXGetFBConfigs)) (Display* dpy, int screen, int* nelements); +extern int (*GL(glXGetFBConfigAttrib)) (Display* dpy, GLXFBConfig config, int attribute, int* value); +extern XVisualInfo* (*GL(glXGetVisualFromFBConfig)) (Display* dpy, GLXFBConfig config); +extern void (*GL(glXDestroyWindow)) (Display* dpy, GLXWindow window); +extern Bool (*GL(glXMakeContextCurrent)) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +//--------// + +extern void (*GL(glXBindTexImage)) (Display* dpy, GLXDrawable draw, int buffer, int* attribList); +extern void (*GL(glXReleaseTexImage)) (Display* dpy, GLXDrawable draw, int buffer); +extern int (*GL(glXGetVideoSync)) (unsigned int* count); +extern int (*GL(glXWaitVideoSync)) (int divisor, int remainder, unsigned int* count); +extern XID (*GL(glXCreatePixmap)) (Display* dpy, void* config, Pixmap pixmap, const int* attribList); +extern void (*GL(glXDestroyPixmap)) (Display* dpy, XID pixmap); +extern void (*GL(glXQueryDrawable)) (Display* dpy, XID draw, int attribute, unsigned int* value); +extern int (*GL(glXSwapIntervalSGI)) (int interval); +extern void (*GL(glXSwapIntervalEXT)) (Display* dpy, GLXDrawable draw, int interval); + +//--------// + +#endif // EGL vs. GLX + +//------------------------------------------------------// + +typedef enum _Evas_GL_Opt_Flag +{ + GL_NORMAL_PATH, + GL_WRAPPED_PATH, + GL_FAST_PATH +} Evas_GL_Opt_Flag; + + +//#define GL_ERRORS 1 + /* + { \ + int __gl_err = _gl.GL(glGetError)(); \ + if (__gl_err != GL_NO_ERROR) glerr(__gl_err, fl, fn, ln, op); \ + } + */ +#ifdef GL_ERRORS +# define GLERR(fn, fl, ln, op) +#else +# define GLERR(fn, fl, ln, op) +#endif + +//extern Evas_GL_API _gl; + + +extern int init_gl(); +extern void free_gl(); + + /* version 1: */ +extern void (*GL(glActiveTexture)) (GLenum texture); +extern void (*GL(glAttachShader)) (GLuint program, GLuint shader); +extern void (*GL(glBindAttribLocation)) (GLuint program, GLuint index, const char* name); +extern void (*GL(glBindBuffer)) (GLenum target, GLuint buffer); +extern void (*GL(glBindFramebuffer)) (GLenum target, GLuint framebuffer); +extern void (*GL(glBindRenderbuffer)) (GLenum target, GLuint renderbuffer); +extern void (*GL(glBindTexture)) (GLenum target, GLuint texture); +extern void (*GL(glBlendColor)) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +extern void (*GL(glBlendEquation)) ( GLenum mode ); +extern void (*GL(glBlendEquationSeparate)) (GLenum modeRGB, GLenum modeAlpha); +extern void (*GL(glBlendFunc)) (GLenum sfactor, GLenum dfactor); +extern void (*GL(glBlendFuncSeparate)) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +extern void (*GL(glBufferData)) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); +extern void (*GL(glBufferSubData)) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); +extern GLenum (*GL(glCheckFramebufferStatus)) (GLenum target); +extern void (*GL(glClear)) (GLbitfield mask); +extern void (*GL(glClearColor)) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +extern void (*GL(glClearDepthf)) (GLclampf depth); +extern void (*GL(glClearStencil)) (GLint s); +extern void (*GL(glColorMask)) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +extern void (*GL(glCompileShader)) (GLuint shader); +extern void (*GL(glCompressedTexImage2D)) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +extern void (*GL(glCompressedTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +extern void (*GL(glCopyTexImage2D)) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +extern void (*GL(glCopyTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +extern GLuint (*GL(glCreateProgram)) (void); +extern GLuint (*GL(glCreateShader)) (GLenum type); +extern void (*GL(glCullFace)) (GLenum mode); +extern void (*GL(glDeleteBuffers)) (GLsizei n, const GLuint* buffers); +extern void (*GL(glDeleteFramebuffers)) (GLsizei n, const GLuint* framebuffers); +extern void (*GL(glDeleteProgram)) (GLuint program); +extern void (*GL(glDeleteRenderbuffers)) (GLsizei n, const GLuint* renderbuffers); +extern void (*GL(glDeleteShader)) (GLuint shader); +extern void (*GL(glDeleteTextures)) (GLsizei n, const GLuint* textures); +extern void (*GL(glDepthFunc)) (GLenum func); +extern void (*GL(glDepthMask)) (GLboolean flag); +extern void (*GL(glDepthRangef)) (GLclampf zNear, GLclampf zFar); +extern void (*GL(glDetachShader)) (GLuint program, GLuint shader); +extern void (*GL(glDisable)) (GLenum cap); +extern void (*GL(glDisableVertexAttribArray)) (GLuint index); +extern void (*GL(glDrawArrays)) (GLenum mode, GLint first, GLsizei count); +extern void (*GL(glDrawElements)) (GLenum mode, GLsizei count, GLenum type, const void* indices); +extern void (*GL(glEnable)) (GLenum cap); +extern void (*GL(glEnableVertexAttribArray)) (GLuint index); +extern void (*GL(glFinish)) (void); +extern void (*GL(glFlush)) (void); +extern void (*GL(glFramebufferRenderbuffer)) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +extern void (*GL(glFramebufferTexture2D)) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +extern void (*GL(glFrontFace)) (GLenum mode); +extern void (*GL(glGenBuffers)) (GLsizei n, GLuint* buffers); +extern void (*GL(glGenerateMipmap)) (GLenum target); +extern void (*GL(glGenFramebuffers)) (GLsizei n, GLuint* framebuffers); +extern void (*GL(glGenRenderbuffers)) (GLsizei n, GLuint* renderbuffers); +extern void (*GL(glGenTextures)) (GLsizei n, GLuint* textures); +extern void (*GL(glGetActiveAttrib)) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name); +extern void (*GL(glGetActiveUniform)) (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name); +extern void (*GL(glGetAttachedShaders)) (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); +extern int (*GL(glGetAttribLocation)) (GLuint program, const char* name); +extern void (*GL(glGetBooleanv)) (GLenum pname, GLboolean* params); +extern void (*GL(glGetBufferParameteriv)) (GLenum target, GLenum pname, GLint* params); +extern GLenum (*GL(glGetError)) (void); +extern void (*GL(glGetFloatv)) (GLenum pname, GLfloat* params); +extern void (*GL(glGetFramebufferAttachmentParameteriv)) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +extern void (*GL(glGetIntegerv)) (GLenum pname, GLint* params); +extern void (*GL(glGetProgramiv)) (GLuint program, GLenum pname, GLint* params); +extern void (*GL(glGetProgramInfoLog)) (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog); +extern void (*GL(glGetRenderbufferParameteriv)) (GLenum target, GLenum pname, GLint* params); +extern void (*GL(glGetShaderiv)) (GLuint shader, GLenum pname, GLint* params); +extern void (*GL(glGetShaderInfoLog)) (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog); +extern void (*GL(glGetShaderPrecisionFormat)) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); +extern void (*GL(glGetShaderSource)) (GLuint shader, GLsizei bufsize, GLsizei* length, char* source); +extern const GLubyte *(*GL(glGetString)) (GLenum name); +extern void (*GL(glGetTexParameterfv)) (GLenum target, GLenum pname, GLfloat* params); +extern void (*GL(glGetTexParameteriv)) (GLenum target, GLenum pname, GLint* params); +extern void (*GL(glGetUniformfv)) (GLuint program, GLint location, GLfloat* params); +extern void (*GL(glGetUniformiv)) (GLuint program, GLint location, GLint* params); +extern int (*GL(glGetUniformLocation)) (GLuint program, const char* name); +extern void (*GL(glGetVertexAttribfv)) (GLuint index, GLenum pname, GLfloat* params); +extern void (*GL(glGetVertexAttribiv)) (GLuint index, GLenum pname, GLint* params); +extern void (*GL(glGetVertexAttribPointerv)) (GLuint index, GLenum pname, void** pointer); +extern void (*GL(glHint)) (GLenum target, GLenum mode); +extern GLboolean (*GL(glIsBuffer)) (GLuint buffer); +extern GLboolean (*GL(glIsEnabled)) (GLenum cap); +extern GLboolean (*GL(glIsFramebuffer)) (GLuint framebuffer); +extern GLboolean (*GL(glIsProgram)) (GLuint program); +extern GLboolean (*GL(glIsRenderbuffer)) (GLuint renderbuffer); +extern GLboolean (*GL(glIsShader)) (GLuint shader); +extern GLboolean (*GL(glIsTexture)) (GLuint texture); +extern void (*GL(glLineWidth)) (GLfloat width); +extern void (*GL(glLinkProgram)) (GLuint program); +extern void (*GL(glPixelStorei)) (GLenum pname, GLint param); +extern void (*GL(glPolygonOffset)) (GLfloat factor, GLfloat units); +extern void (*GL(glReadPixels)) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); +extern void (*GL(glReleaseShaderCompiler)) (void); +extern void (*GL(glRenderbufferStorage)) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +extern void (*GL(glSampleCoverage)) (GLclampf value, GLboolean invert); +extern void (*GL(glScissor)) (GLint x, GLint y, GLsizei width, GLsizei height); +extern void (*GL(glShaderBinary)) (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length); +extern void (*GL(glShaderSource)) (GLuint shader, GLsizei count, const char** string, const GLint* length); +extern void (*GL(glStencilFunc)) (GLenum func, GLint ref, GLuint mask); +extern void (*GL(glStencilFuncSeparate)) (GLenum face, GLenum func, GLint ref, GLuint mask); +extern void (*GL(glStencilMask)) (GLuint mask); +extern void (*GL(glStencilMaskSeparate)) (GLenum face, GLuint mask); +extern void (*GL(glStencilOp)) (GLenum fail, GLenum zfail, GLenum zpass); +extern void (*GL(glStencilOpSeparate)) (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); +extern void (*GL(glTexImage2D)) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); +extern void (*GL(glTexParameterf)) (GLenum target, GLenum pname, GLfloat param); +extern void (*GL(glTexParameterfv)) (GLenum target, GLenum pname, const GLfloat* params); +extern void (*GL(glTexParameteri)) (GLenum target, GLenum pname, GLint param); +extern void (*GL(glTexParameteriv)) (GLenum target, GLenum pname, const GLint* params); +extern void (*GL(glTexSubImage2D)) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +extern void (*GL(glUniform1f)) (GLint location, GLfloat x); +extern void (*GL(glUniform1fv)) (GLint location, GLsizei count, const GLfloat* v); +extern void (*GL(glUniform1i)) (GLint location, GLint x); +extern void (*GL(glUniform1iv)) (GLint location, GLsizei count, const GLint* v); +extern void (*GL(glUniform2f)) (GLint location, GLfloat x, GLfloat y); +extern void (*GL(glUniform2fv)) (GLint location, GLsizei count, const GLfloat* v); +extern void (*GL(glUniform2i)) (GLint location, GLint x, GLint y); +extern void (*GL(glUniform2iv)) (GLint location, GLsizei count, const GLint* v); +extern void (*GL(glUniform3f)) (GLint location, GLfloat x, GLfloat y, GLfloat z); +extern void (*GL(glUniform3fv)) (GLint location, GLsizei count, const GLfloat* v); +extern void (*GL(glUniform3i)) (GLint location, GLint x, GLint y, GLint z); +extern void (*GL(glUniform3iv)) (GLint location, GLsizei count, const GLint* v); +extern void (*GL(glUniform4f)) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +extern void (*GL(glUniform4fv)) (GLint location, GLsizei count, const GLfloat* v); +extern void (*GL(glUniform4i)) (GLint location, GLint x, GLint y, GLint z, GLint w); +extern void (*GL(glUniform4iv)) (GLint location, GLsizei count, const GLint* v); +extern void (*GL(glUniformMatrix2fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +extern void (*GL(glUniformMatrix3fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +extern void (*GL(glUniformMatrix4fv)) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +extern void (*GL(glUseProgram)) (GLuint program); +extern void (*GL(glValidateProgram)) (GLuint program); +extern void (*GL(glVertexAttrib1f)) (GLuint indx, GLfloat x); +extern void (*GL(glVertexAttrib1fv)) (GLuint indx, const GLfloat* values); +extern void (*GL(glVertexAttrib2f)) (GLuint indx, GLfloat x, GLfloat y); +extern void (*GL(glVertexAttrib2fv)) (GLuint indx, const GLfloat* values); +extern void (*GL(glVertexAttrib3f)) (GLuint indx, GLfloat x, GLfloat y, GLfloat z); +extern void (*GL(glVertexAttrib3fv)) (GLuint indx, const GLfloat* values); +extern void (*GL(glVertexAttrib4f)) (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +extern void (*GL(glVertexAttrib4fv)) (GLuint indx, const GLfloat* values); +extern void (*GL(glVertexAttribPointer)) (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr); +extern void (*GL(glViewport)) (GLint x, GLint y, GLsizei width, GLsizei height); + +/* Extensions */ +extern void (*GL(glGetProgramBinary)) (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary); +extern void (*GL(glProgramBinary)) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +extern void (*GL(glProgramParameteri)) (GLuint a, GLuint b, GLint d); + + +#endif // EVAS_GL_CORE_H diff --git a/src/modules/engines/gl_common/evas_gl_line.c b/src/modules/engines/gl_common/evas_gl_line.c index 48499ea..6e616c8 100644 --- a/src/modules/engines/gl_common/evas_gl_line.c +++ b/src/modules/engines/gl_common/evas_gl_line.c @@ -20,7 +20,7 @@ evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int r = g = b = a = 255; } - glFlush(); + glsym_glFlush(); c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; diff --git a/src/modules/engines/gl_common/evas_gl_shader.c b/src/modules/engines/gl_common/evas_gl_shader.c index 6666ac5..187f31d 100644 --- a/src/modules/engines/gl_common/evas_gl_shader.c +++ b/src/modules/engines/gl_common/evas_gl_shader.c @@ -770,26 +770,26 @@ gl_compile_link_error(GLuint target, const char *action) char *logtxt; /* Shader info log */ - glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen); + glsym_glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen); if (loglen > 0) { logtxt = calloc(loglen, sizeof(char)); if (logtxt) { - glGetShaderInfoLog(target, loglen, &chars, logtxt); + glsym_glGetShaderInfoLog(target, loglen, &chars, logtxt); ERR("Failed to %s: %s", action, logtxt); free(logtxt); } } /* Program info log */ - glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen); + glsym_glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen); if (loglen > 0) { logtxt = calloc(loglen, sizeof(char)); if (logtxt) { - glGetProgramInfoLog(target, loglen, &chars, logtxt); + glsym_glGetProgramInfoLog(target, loglen, &chars, logtxt); ERR("Failed to %s: %s", action, logtxt); free(logtxt); } @@ -885,9 +885,9 @@ _evas_gl_shader_file_check(const char *bin_shader_dir, char *bin_shader_file, in char *driver = NULL; char *version = NULL; - vendor = (char *)glGetString(GL_VENDOR); - driver = (char *)glGetString(GL_RENDERER); - version = (char *)glGetString(GL_VERSION); + vendor = (char *)glsym_glGetString(GL_VENDOR); + driver = (char *)glsym_glGetString(GL_RENDERER); + version = (char *)glsym_glGetString(GL_VERSION); new_path_len = snprintf(before_name, sizeof(before_name), "%s::%s::%s::%s::binary_shader.eet", vendor, version, driver, MODULE_ARCH); @@ -922,27 +922,27 @@ _evas_gl_common_shader_program_binary_init(Evas_GL_Program *p, data = eet_read(ef, pname, &length); if ((!data) || (length <= 0)) goto finish; - glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num); + glsym_glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num); if (num <= 0) goto finish; formats = calloc(num, sizeof(int)); if (!formats) goto finish; - glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, formats); + glsym_glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, formats); if (!formats[0]) goto finish; - p->prog = glCreateProgram(); + p->prog = glsym_glCreateProgram(); glsym_glProgramBinary(p->prog, formats[0], data, length); - glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex"); - glBindAttribLocation(p->prog, SHAD_COLOR, "color"); - glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord"); - glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2"); - glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3"); - glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm"); + glsym_glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex"); + glsym_glBindAttribLocation(p->prog, SHAD_COLOR, "color"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm"); - glGetProgramiv(p->prog, GL_LINK_STATUS, &ok); + glsym_glGetProgramiv(p->prog, GL_LINK_STATUS, &ok); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!ok) { @@ -958,7 +958,7 @@ finish: if (data) free(data); if ((!res) && (p->prog)) { - glDeleteProgram(p->prog); + glsym_glDeleteProgram(p->prog); p->prog = 0; } return res; @@ -975,7 +975,7 @@ _evas_gl_common_shader_program_binary_save(Evas_GL_Program *p, if (!glsym_glGetProgramBinary) return 0; - glGetProgramiv(p->prog, GL_PROGRAM_BINARY_LENGTH, &length); + glsym_glGetProgramiv(p->prog, GL_PROGRAM_BINARY_LENGTH, &length); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (length <= 0) return 0; @@ -1008,21 +1008,21 @@ _evas_gl_common_shader_program_source_init(Evas_GL_Program *p, { GLint ok; - p->vert = glCreateShader(GL_VERTEX_SHADER); - p->frag = glCreateShader(GL_FRAGMENT_SHADER); + p->vert = glsym_glCreateShader(GL_VERTEX_SHADER); + p->frag = glsym_glCreateShader(GL_FRAGMENT_SHADER); #if defined (GLES_VARIETY_S3C6410) - glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size); + glsym_glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size); + glsym_glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #else - glShaderSource(p->vert, 1, + glsym_glShaderSource(p->vert, 1, (const char **)&(vert->src), NULL); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glCompileShader(p->vert); + glsym_glCompileShader(p->vert); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); ok = 0; - glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok); + glsym_glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!ok) { @@ -1030,13 +1030,13 @@ _evas_gl_common_shader_program_source_init(Evas_GL_Program *p, ERR("Abort compile of shader vert (%s): %s", name, vert->src); return 0; } - glShaderSource(p->frag, 1, + glsym_glShaderSource(p->frag, 1, (const char **)&(frag->src), NULL); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glCompileShader(p->frag); + glsym_glCompileShader(p->frag); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); ok = 0; - glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok); + glsym_glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!ok) { @@ -1045,35 +1045,35 @@ _evas_gl_common_shader_program_source_init(Evas_GL_Program *p, return 0; } #endif - p->prog = glCreateProgram(); + p->prog = glsym_glCreateProgram(); #if defined(GLES_VARIETY_S3C6410) || defined(GLES_VARIETY_SGX) #else if ((glsym_glGetProgramBinary) && (glsym_glProgramParameteri)) glsym_glProgramParameteri(p->prog, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); #endif - glAttachShader(p->prog, p->vert); + glsym_glAttachShader(p->prog, p->vert); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glAttachShader(p->prog, p->frag); + glsym_glAttachShader(p->prog, p->frag); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex"); + glsym_glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_COLOR, "color"); + glsym_glBindAttribLocation(p->prog, SHAD_COLOR, "color"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm"); + glsym_glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm"); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glLinkProgram(p->prog); + glsym_glLinkProgram(p->prog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); ok = 0; - glGetProgramiv(p->prog, GL_LINK_STATUS, &ok); + glsym_glGetProgramiv(p->prog, GL_LINK_STATUS, &ok); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!ok) { @@ -1249,14 +1249,14 @@ void evas_gl_common_shader_program_init_done(void) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glReleaseShaderCompiler(); + glsym_glReleaseShaderCompiler(); #endif } void evas_gl_common_shader_program_shutdown(Evas_GL_Program *p) { - if (p->vert) glDeleteShader(p->vert); - if (p->frag) glDeleteShader(p->frag); - if (p->prog) glDeleteProgram(p->prog); + if (p->vert) glsym_glDeleteShader(p->vert); + if (p->frag) glsym_glDeleteShader(p->frag); + if (p->prog) glsym_glDeleteProgram(p->prog); } diff --git a/src/modules/engines/gl_common/evas_gl_texture.c b/src/modules/engines/gl_common/evas_gl_texture.c index c99f4bd..56e96c3 100644 --- a/src/modules/engines/gl_common/evas_gl_texture.c +++ b/src/modules/engines/gl_common/evas_gl_texture.c @@ -110,7 +110,7 @@ static void _tex_2d(int intfmt, int w, int h, int fmt, int type) { int intfmtret = -1; - glTexImage2D(GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, NULL); + glsym_glTexImage2D(GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, NULL); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #ifdef GL_TEXTURE_INTERNAL_FORMAT // this is not in opengles!!! hrrrm @@ -127,7 +127,7 @@ _tex_2d(int intfmt, int w, int h, int fmt, int type) static void _tex_sub_2d(int x, int y, int w, int h, int fmt, int type, const void *pix) { - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix); + glsym_glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } @@ -166,20 +166,20 @@ _pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, GLenum fo _print_tex_count(); - glGenTextures(1, &(pt->texture)); + glsym_glGenTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(pt->intformat, w, h, pt->format, pt->dataformat); - glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); return pt; } @@ -382,17 +382,17 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in _print_tex_count(); - glGenTextures(1, &(pt->texture)); + glsym_glGenTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(pt->intformat, w, h, pt->format, pt->dataformat); @@ -405,7 +405,7 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); return pt; } @@ -442,9 +442,9 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in _print_tex_count(); - glGenTextures(1, &(pt->texture)); + glsym_glGenTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(im->native.target, pt->texture); + glsym_glBindTexture(im->native.target, pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) @@ -456,17 +456,17 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in } #endif - glTexParameteri(im->native.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(im->native.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(im->native.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(im->native.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(im->native.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(im->native.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(im->native.target, 0); + glsym_glBindTexture(im->native.target, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(im->native.target, gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(im->native.target, gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); return pt; } @@ -522,17 +522,17 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i _print_tex_count(); - glGenTextures(1, &(pt->texture)); + glsym_glGenTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); egldisplay = pt->gc->egldisp; @@ -542,45 +542,45 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i // FIXME: seems a bit slower than i'd like - maybe too many flushes? // FIXME: YCbCr no support as yet - pt->dyn.img = secsym_eglCreateImage(egldisplay, + pt->dyn.img = glsym_eglCreateImage(egldisplay, EGL_NO_CONTEXT, EGL_MAP_GL_TEXTURE_2D_SEC, 0, attr); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (!pt->dyn.img) { - glBindTexture(GL_TEXTURE_2D, 0); + glsym_glBindTexture(GL_TEXTURE_2D, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDeleteTextures(1, &(pt->texture)); + glsym_glDeleteTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); free(pt); return NULL; } - if (secsym_eglGetImageAttribSEC(egldisplay, + if (glsym_eglGetImageAttribSEC(egldisplay, pt->dyn.img, EGL_MAP_GL_TEXTURE_WIDTH_SEC, &(pt->dyn.w)) != EGL_TRUE) goto error; - if (secsym_eglGetImageAttribSEC(egldisplay, + if (glsym_eglGetImageAttribSEC(egldisplay, pt->dyn.img, EGL_MAP_GL_TEXTURE_HEIGHT_SEC, &(pt->dyn.h)) != EGL_TRUE) goto error; - if (secsym_eglGetImageAttribSEC(egldisplay, + if (glsym_eglGetImageAttribSEC(egldisplay, pt->dyn.img, EGL_MAP_GL_TEXTURE_STRIDE_IN_BYTES_SEC, &(pt->dyn.stride)) != EGL_TRUE) goto error; - if (secsym_eglGetImageAttribSEC(egldisplay, + if (glsym_eglGetImageAttribSEC(egldisplay, pt->dyn.img, EGL_MAP_GL_TEXTURE_FORMAT_SEC, &(fmt)) != EGL_TRUE) goto error; - if (secsym_eglGetImageAttribSEC(egldisplay, + if (glsym_eglGetImageAttribSEC(egldisplay, pt->dyn.img, EGL_MAP_GL_TEXTURE_PIXEL_TYPE_SEC, &(pixtype)) != EGL_TRUE) goto error; if (pixtype != EGL_MAP_GL_TEXTURE_UNSIGNED_BYTE_SEC) goto error; - glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #else gc = NULL; @@ -594,12 +594,12 @@ _pool_tex_dynamic_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, i /* ERROR HANDLING */ #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) error: - secsym_eglDestroyImage(egldisplay, pt->dyn.img); + glsym_eglDestroyImage(egldisplay, pt->dyn.img); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); pt->dyn.img = NULL; - glBindTexture(GL_TEXTURE_2D, 0); + glsym_glBindTexture(GL_TEXTURE_2D, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glDeleteTextures(1, &(pt->texture)); + glsym_glDeleteTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); free(pt); return NULL; @@ -648,8 +648,8 @@ evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt) if (pt->dyn.img) { if (pt->dyn.checked_out > 0) - secsym_eglUnmapImageSEC(pt->gc->egldisp, pt->dyn.img); - secsym_eglDestroyImage(pt->gc->egldisp, pt->dyn.img); + glsym_eglUnmapImageSEC(pt->gc->egldisp, pt->dyn.img); + glsym_eglDestroyImage(pt->gc->egldisp, pt->dyn.img); pt->dyn.img = NULL; pt->dyn.data = NULL; pt->dyn.w = 0; @@ -659,7 +659,7 @@ evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt) } #endif - glDeleteTextures(1, &(pt->texture)); + glsym_glDeleteTextures(1, &(pt->texture)); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); if (pt->fb) { @@ -851,13 +851,13 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) if (!im->image.data) return; fmt = tex->pt->format; - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #endif - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 4); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); // printf("tex upload %ix%i\n", im->cache_entry.w, im->cache_entry.h); @@ -946,7 +946,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) #endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { - glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -1030,19 +1030,19 @@ evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels, unsigned int w, unsigned int h, int fh __UNUSED__) { if (!tex->pt) return; - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); #endif - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 4); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_sub_2d(tex->x, tex->y, w, h, tex->pt->format, tex->pt->dataformat, pixels); if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { - glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -1109,32 +1109,32 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i if (!tex->pt) return; // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2 #ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat); _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]); - glBindTexture(GL_TEXTURE_2D, tex->ptu->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptu->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat); _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]); - glBindTexture(GL_TEXTURE_2D, tex->ptv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat); _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]); #else unsigned int y; - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat); if ((rows[1] - rows[0]) == (int)w) @@ -1145,7 +1145,7 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]); } - glBindTexture(GL_TEXTURE_2D, tex->ptu->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptu->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat); if ((rows[h + 1] - rows[h]) == (int)(w / 2)) @@ -1156,7 +1156,7 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i _tex_sub_2d(0, y, w / 2, 1, tex->ptu->format, tex->ptu->dataformat, rows[h + y]); } - glBindTexture(GL_TEXTURE_2D, tex->ptv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat); if ((rows[h + (h / 2) + 1] - rows[h + (h / 2)]) == (int)(w / 2)) @@ -1169,7 +1169,7 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i #endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { - glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -1316,9 +1316,9 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned tex->pt = tex->double_buffer.pt[tex->double_buffer.source]; tex->ptuv = tex->double_buffer.ptuv[tex->double_buffer.source]; - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat); if ((rows[1] - rows[0]) == (int)w * 4) @@ -1329,7 +1329,7 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]); } - glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptuv->intformat, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat); #if 0 @@ -1348,7 +1348,7 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { - glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -1364,26 +1364,26 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2 #ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat); _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]); - glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]); + glsym_glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat); _tex_sub_2d(0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]); #else unsigned int y; - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat); if ((rows[1] - rows[0]) == (int)w) @@ -1394,7 +1394,7 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]); } - glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat); if ((rows[h + 1] - rows[h]) == (int)(w / 2)) @@ -1407,7 +1407,7 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned #endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { - glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); + glsym_glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); } } @@ -1433,7 +1433,7 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi char *texture_addr; char *tmp; - texture_addr = secsym_eglMapImageSEC(tex->gc->egldisp, tex->pt->dyn.img); + texture_addr = glsym_eglMapImageSEC(tex->gc->egldisp, tex->pt->dyn.img); /* Iterate each Y macroblock like we do in evas_convert_yuv.c */ for (mb_y = 0; mb_y < (mb_h >> 1); mb_y++) @@ -1488,9 +1488,9 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi } } - secsym_eglUnmapImageSEC(tex->gc->egldisp, tex->pt->dyn.img); + glsym_eglUnmapImageSEC(tex->gc->egldisp, tex->pt->dyn.img); - texture_addr = secsym_eglMapImageSEC(tex->gc->egldisp, tex->ptuv->dyn.img); + texture_addr = glsym_eglMapImageSEC(tex->gc->egldisp, tex->ptuv->dyn.img); /* Iterate each UV macroblock like we do in evas_convert_yuv.c */ base_h = (mb_h >> 1) + (mb_h & 0x1); @@ -1555,15 +1555,15 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi } } - secsym_eglUnmapImageSEC(tex->gc->egldisp, tex->ptuv->dyn.img); + glsym_eglUnmapImageSEC(tex->gc->egldisp, tex->ptuv->dyn.img); return ; } #endif - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glsym_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glBindTexture(GL_TEXTURE_2D, tex->pt->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); // We are telling the driver to not swizzle back the buffer as we are going to replace all pixel @@ -1610,7 +1610,7 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi _tex_sub_2d(x, ry, 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x); } - glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); + glsym_glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_2d(tex->ptuv->intformat, w, h, tex->ptuv->format, tex->ptuv->dataformat); diff --git a/src/modules/engines/gl_x11/evas_engine.c b/src/modules/engines/gl_x11/evas_engine.c index 38e0c13..f119aa9 100644 --- a/src/modules/engines/gl_x11/evas_engine.c +++ b/src/modules/engines/gl_x11/evas_engine.c @@ -110,50 +110,18 @@ static Eina_TLS resource_key; static Eina_List *resource_list; LK(resource_lock); -typedef void (*_eng_fn) (void); -typedef _eng_fn (*glsym_func_eng_fn) (); typedef void (*glsym_func_void) (); typedef void *(*glsym_func_void_ptr) (); typedef int (*glsym_func_int) (); typedef unsigned int (*glsym_func_uint) (); typedef unsigned char (*glsym_func_uchar) (); -typedef unsigned char *(*glsym_func_uchar_ptr) (); -typedef const char *(*glsym_func_const_char_ptr) (); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) #ifndef EGL_NATIVE_PIXMAP_KHR # define EGL_NATIVE_PIXMAP_KHR 0x30b0 #endif -_eng_fn (*glsym_eglGetProcAddress) (const char *a) = NULL; -void (*glsym_eglBindTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL; -void (*glsym_eglReleaseTexImage) (EGLDisplay a, EGLSurface b, int c) = 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_glEGLImageTargetRenderbufferStorageOES) (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; - -unsigned int (*glsym_eglLockSurface) (EGLDisplay a, EGLSurface b, const int *attrib_list) = NULL; -unsigned int (*glsym_eglUnlockSurface) (EGLDisplay a, EGLSurface b) = NULL; -#else -typedef XID (*glsym_func_xid) (); - -_eng_fn (*glsym_glXGetProcAddress) (const char *a) = NULL; -void (*glsym_glXBindTexImage) (Display *a, GLXDrawable b, int c, int *d) = NULL; -void (*glsym_glXReleaseTexImage) (Display *a, GLXDrawable b, int c) = NULL; -int (*glsym_glXGetVideoSync) (unsigned int *a) = NULL; -int (*glsym_glXWaitVideoSync) (int a, int b, unsigned int *c) = NULL; -XID (*glsym_glXCreatePixmap) (Display *a, void *b, Pixmap c, const int *d) = NULL; -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 // GLES2 Extensions @@ -210,7 +178,7 @@ void (*glsym_glExtGetProgramBinarySourceQCOM) (GLuint program, GLenum shadertyp //------ GLES 2.0 Extensions supported in EvasGL -----// static Extension_Entry _gl_ext_entries[] = { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - //--- Function Extensions ---// + //--- Function Extensions ---// { "GL_OES_get_program_binary", "get_program_binary", 0 }, { "GL_OES_mapbuffer", "mapbuffer", 0 }, { "GL_OES_texture_3D", "texture_3D", 0 }, @@ -327,90 +295,10 @@ _sym_init(void) #define FINDSYM(dst, sym, typ) \ if ((!dst) && (glsym_eglGetProcAddress)) dst = (typ)glsym_eglGetProcAddress(sym); \ if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym) - - FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn); - 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_eglBindTexImage, "eglBindTexImage", glsym_func_void); - FINDSYM(glsym_eglBindTexImage, "eglBindTexImageEXT", glsym_func_void); - FINDSYM(glsym_eglBindTexImage, "eglBindTexImageARB", glsym_func_void); - FINDSYM(glsym_eglBindTexImage, "eglBindTexImageKHR", glsym_func_void); - - FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImage", glsym_func_void); - FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageEXT", glsym_func_void); - FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageARB", glsym_func_void); - FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageKHR", glsym_func_void); - - FINDSYM(glsym_eglCreateImage, "eglCreateImage", glsym_func_void_ptr); - FINDSYM(glsym_eglCreateImage, "eglCreateImageEXT", glsym_func_void_ptr); - FINDSYM(glsym_eglCreateImage, "eglCreateImageARB", glsym_func_void_ptr); - FINDSYM(glsym_eglCreateImage, "eglCreateImageKHR", glsym_func_void_ptr); - - FINDSYM(glsym_eglDestroyImage, "eglDestroyImage", glsym_func_void); - FINDSYM(glsym_eglDestroyImage, "eglDestroyImageEXT", glsym_func_void); - FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB", glsym_func_void); - FINDSYM(glsym_eglDestroyImage, "eglDestroyImageKHR", glsym_func_void); - - FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void); - - FINDSYM(glsym_glEGLImageTargetRenderbufferStorageOES, "glEGLImageTargetRenderbufferStorageOES", glsym_func_void); - - FINDSYM(glsym_eglMapImageSEC, "eglMapImageSEC", glsym_func_void_ptr); - FINDSYM(glsym_eglUnmapImageSEC, "eglUnmapImageSEC", glsym_func_uint); - - FINDSYM(glsym_eglQueryString, "eglQueryString", glsym_func_const_char_ptr); - - FINDSYM(glsym_eglLockSurface, "eglLockSurface", glsym_func_uint); - FINDSYM(glsym_eglLockSurface, "eglLockSurfaceEXT", glsym_func_uint); - FINDSYM(glsym_eglLockSurface, "eglLockSurfaceARB", glsym_func_uint); - FINDSYM(glsym_eglLockSurface, "eglLockSurfaceKHR", glsym_func_uint); - - FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurface", glsym_func_uint); - FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceEXT", glsym_func_uint); - FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceARB", glsym_func_uint); - FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceKHR", glsym_func_uint); - #else #define FINDSYM(dst, sym, typ) \ if ((!dst) && (glsym_glXGetProcAddress)) dst = (typ)glsym_glXGetProcAddress(sym); \ if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym) - - 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_glXBindTexImage, "glXBindTexImage", glsym_func_void); - FINDSYM(glsym_glXBindTexImage, "glXBindTexImageEXT", glsym_func_void); - FINDSYM(glsym_glXBindTexImage, "glXBindTexImageARB", glsym_func_void); - - FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImage", glsym_func_void); - FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageEXT", glsym_func_void); - FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageARB", glsym_func_void); - - FINDSYM(glsym_glXGetVideoSync, "glXGetVideoSyncSGI", glsym_func_int); - - FINDSYM(glsym_glXWaitVideoSync, "glXWaitVideoSyncSGI", glsym_func_int); - - FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmap", glsym_func_xid); - FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapEXT", glsym_func_xid); - FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapARB", glsym_func_xid); - - FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmap", glsym_func_void); - FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapEXT", glsym_func_void); - FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapARB", glsym_func_void); - - FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawable", glsym_func_void); - FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableEXT", glsym_func_void); - FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableARB", glsym_func_void); - - FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalMESA", glsym_func_int); - FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalSGI", glsym_func_int); - - FINDSYM(glsym_glXSwapIntervalEXT, "glXSwapIntervalEXT", glsym_func_void); - - FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsString", glsym_func_const_char_ptr); #endif //----------- GLES 2.0 Extensions ------------// @@ -565,7 +453,7 @@ _extensions_init(Render_Engine *re) memset(_evasgl_ext_string, 0, 1024); // GLES 2.0 Extensions - glexts = (const char*)glGetString(GL_EXTENSIONS); + glexts = (const char*)glsym_glGetString(GL_EXTENSIONS); DBG("--------GLES 2.0 Extensions--------"); for (i = 0; _gl_ext_entries[i].name != NULL; i++) @@ -586,8 +474,8 @@ _extensions_init(Render_Engine *re) // EGL Extensions evasglexts = glsym_eglQueryString(re->win->egl_disp, EGL_EXTENSIONS); #else - evasglexts = glXQueryExtensionsString(re->info->info.display, - re->info->info.screen); + evasglexts = glsym_glXQueryExtensionsString(re->info->info.display, + re->info->info.screen); #endif DBG("--------EvasGL Extensions----------"); @@ -628,30 +516,30 @@ xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val) xrdb_user.last_stat = now; if (last != now) // don't stat() more than once every second { - struct stat st; - const char *home = getenv("HOME"); - char tmp[PATH_MAX]; + struct stat st; + const char *home = getenv("HOME"); + char tmp[PATH_MAX]; - if (!home) goto failed; - snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home); - if (stat(tmp, &st) != 0) goto failed; - if (xrdb_user.last_mtime != st.st_mtime) - { - if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db); - xrdb_user.db = XrmGetFileDatabase(tmp); - if (!xrdb_user.db) goto failed; - xrdb_user.last_mtime = st.st_mtime; - } + if (!home) goto failed; + snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home); + if (stat(tmp, &st) != 0) goto failed; + if (xrdb_user.last_mtime != st.st_mtime) + { + if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db); + xrdb_user.db = XrmGetFileDatabase(tmp); + if (!xrdb_user.db) goto failed; + xrdb_user.last_mtime = st.st_mtime; + } } if (!xrdb_user.db) return EINA_FALSE; return XrmGetResource(xrdb_user.db, name, cls, type, val); - failed: +failed: if (xrdb_user.db) { - XrmDestroyDatabase(xrdb_user.db); - xrdb_user.db = NULL; + XrmDestroyDatabase(xrdb_user.db); + xrdb_user.db = NULL; } xrdb_user.last_mtime = 0; return EINA_FALSE; @@ -677,8 +565,8 @@ static void eng_info_free(Evas *e __UNUSED__, void *info) { Evas_Engine_Info_GL_X11 *in; -// dont free! why bother? its not worth it -// eina_log_domain_unregister(_evas_engine_GL_X11_log_dom); + // dont free! why bother? its not worth it + // eina_log_domain_unregister(_evas_engine_GL_X11_log_dom); in = (Evas_Engine_Info_GL_X11 *)info; free(in); } @@ -720,10 +608,10 @@ _create_internal_glue_resources(void *data) context_attrs[2] = EGL_NONE; // Create resource surface for EGL - rsc->surface = eglCreateWindowSurface(re->win->egl_disp, - re->win->egl_config, - (EGLNativeWindowType)DefaultRootWindow(re->info->info.display), - NULL); + rsc->surface = glsym_eglCreateWindowSurface(re->win->egl_disp, + re->win->egl_config, + (EGLNativeWindowType)DefaultRootWindow(re->info->info.display), + NULL); if (!rsc->surface) { ERR("Creating internal resource surface failed."); @@ -732,10 +620,10 @@ _create_internal_glue_resources(void *data) } // Create a resource context for EGL - rsc->context = eglCreateContext(re->win->egl_disp, - re->win->egl_config, - re->win->egl_context[0], // Evas' GL Context - context_attrs); + rsc->context = glsym_eglCreateContext(re->win->egl_disp, + re->win->egl_config, + re->win->egl_context[0], // Evas' GL Context + context_attrs); if (!rsc->context) { ERR("Internal Resource Context Creations Failed."); @@ -758,10 +646,10 @@ _create_internal_glue_resources(void *data) #else // GLX - rsc->context = glXCreateContext(re->info->info.display, - re->win->visualinfo, - re->win->context, // Evas' GL Context - 1); + rsc->context = glsym_glXCreateContext(re->info->info.display, + re->win->visualinfo, + re->win->context, // Evas' GL Context + 1); if (!rsc->context) { ERR("Internal Resource Context Creations Failed."); @@ -801,8 +689,8 @@ _destroy_internal_glue_resources(void *data) LKL(resource_lock); EINA_LIST_FOREACH(resource_list, l, rsc) { - if (rsc->surface) eglDestroySurface(re->win->egl_disp, rsc->surface); - if (rsc->context) eglDestroyContext(re->win->egl_disp, rsc->context); + if (rsc->surface) glsym_eglDestroySurface(re->win->egl_disp, rsc->surface); + if (rsc->context) glsym_eglDestroyContext(re->win->egl_disp, rsc->context); free(rsc); } eina_list_free(resource_list); @@ -818,7 +706,7 @@ _destroy_internal_glue_resources(void *data) { if (rsc) { - glXDestroyContext(re->info->info.display, rsc->context); + glsym_glXDestroyContext(re->info->info.display, rsc->context); free(rsc); } } @@ -847,7 +735,7 @@ eng_setup(Evas *e, void *in) #else int eb, evb; - if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0; + if (!glsym_glXQueryExtension(info->info.display, &eb, &evb)) return 0; #endif re = calloc(1, sizeof(Render_Engine)); if (!re) return 0; @@ -885,12 +773,12 @@ eng_setup(Evas *e, void *in) status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val); if ((!status) || (!type)) - { - if (!re->xrdb) re->xrdb = XrmGetDatabase(re->info->info.display); - if (re->xrdb) - status = XrmGetResource(re->xrdb, - "Xft.dpi", "Xft.Dpi", &type, &val); - } + { + if (!re->xrdb) re->xrdb = XrmGetDatabase(re->info->info.display); + if (re->xrdb) + status = XrmGetResource(re->xrdb, + "Xft.dpi", "Xft.Dpi", &type, &val); + } if ((status) && (type)) { @@ -924,7 +812,7 @@ eng_setup(Evas *e, void *in) re->xr.dpi = atoi(buf) * 1000; } else - re->xr.dpi = atoi(str) * 1000; + re->xr.dpi = atoi(str) * 1000; evas_common_font_dpi_set(re->xr.dpi / 1000); } } @@ -1036,8 +924,8 @@ eng_setup(Evas *e, void *in) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); if (!e->engine.data.context) - e->engine.data.context = - e->engine.func->context_new(e->engine.data.output); + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); eng_window_use(re->win); re->vsync = 0; @@ -1059,24 +947,13 @@ eng_output_free(void *data) if (re) { -// NOTE: XrmGetDatabase() result is shared per connection, do not free it. -// if (re->xrdb) XrmDestroyDatabase(re->xrdb); + // NOTE: XrmGetDatabase() result is shared per connection, do not free it. + // if (re->xrdb) XrmDestroyDatabase(re->xrdb); -#if 0 -#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - // Destroy the resource surface - // Only required for EGL case - if (re->surface) - eglDestroySurface(re->win->egl_disp, re->surface); -#endif - - // Destroy the resource context - _destroy_internal_context(re, context); -#endif if (re->win) { if ((initted == 1) && (gl_wins == 1)) - _destroy_internal_glue_resources(re); + _destroy_internal_glue_resources(re); eng_window_free(re->win); gl_wins--; } @@ -1131,23 +1008,23 @@ eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) if (!re->win->draw.redraw) { #if 0 - re->win->draw.x1 = x; - re->win->draw.y1 = y; - re->win->draw.x2 = x + w - 1; - re->win->draw.y2 = y + h - 1; + re->win->draw.x1 = x; + re->win->draw.y1 = y; + re->win->draw.x2 = x + w - 1; + re->win->draw.y2 = y + h - 1; #else - re->win->draw.x1 = 0; - re->win->draw.y1 = 0; - re->win->draw.x2 = re->win->w - 1; - re->win->draw.y2 = re->win->h - 1; + re->win->draw.x1 = 0; + re->win->draw.y1 = 0; + re->win->draw.x2 = re->win->w - 1; + re->win->draw.y2 = re->win->h - 1; #endif } else { - if (x < re->win->draw.x1) re->win->draw.x1 = x; - if (y < re->win->draw.y1) re->win->draw.y1 = y; - if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1; - if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1; + if (x < re->win->draw.x1) re->win->draw.x1 = x; + if (y < re->win->draw.y1) re->win->draw.y1 = y; + if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1; + if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1; } re->win->draw.redraw = 1; */ @@ -1170,7 +1047,7 @@ eng_output_redraws_clear(void *data) re = (Render_Engine *)data; evas_common_tilebuf_clear(re->tb); /* re->win->draw.redraw = 0;*/ -// INF("GL: finish update cycle!"); + // INF("GL: finish update cycle!"); } /* vsync games - not for now though */ @@ -1278,12 +1155,12 @@ eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x if (s) safe_native = atoi(s); else { - s = (const char *)glGetString(GL_RENDERER); + s = (const char *)glsym_glGetString(GL_RENDERER); if (s) { if (strstr(s, "PowerVR SGX 540") || strstr(s, "Mali-400 MP")) - safe_native = 1; + safe_native = 1; } } } @@ -1296,21 +1173,21 @@ eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x pt = t0; #endif // previous rendering should be done and swapped - if (!safe_native) eglWaitNative(EGL_CORE_NATIVE_ENGINE); + if (!safe_native) glsym_eglWaitNative(EGL_CORE_NATIVE_ENGINE); #ifdef FRAMECOUNT double t1 = get_time(); tb = t1 - t0; printf("... %1.5f -> %1.5f | ", ta, tb); #endif -// if (eglGetError() != EGL_SUCCESS) -// { -// printf("Error: eglWaitNative(EGL_CORE_NATIVE_ENGINE) fail.\n"); -// } + // if (glsym_eglGetError() != EGL_SUCCESS) + // { + // printf("Error: glsym_eglWaitNative(EGL_CORE_NATIVE_ENGINE) fail.\n"); + // } #else // previous rendering should be done and swapped - if (!safe_native) glXWaitX(); + if (!safe_native) glsym_glXWaitX(); #endif -//x// printf("frame -> push\n"); + //x// printf("frame -> push\n"); } static void @@ -1321,7 +1198,7 @@ eng_output_flush(void *data) re = (Render_Engine *)data; if (!_re_wincheck(re)) return; if (!re->win->draw.drew) return; -//x// printf("frame -> flush\n"); + //x// printf("frame -> flush\n"); re->win->draw.drew = 0; eng_window_use(re->win); @@ -1331,16 +1208,16 @@ eng_output_flush(void *data) #endif if (!re->vsync) { - if (re->info->vsync) eglSwapInterval(re->win->egl_disp, 1); - else eglSwapInterval(re->win->egl_disp, 0); + if (re->info->vsync) glsym_eglSwapInterval(re->win->egl_disp, 1); + else glsym_eglSwapInterval(re->win->egl_disp, 0); re->vsync = 1; } if (re->info->callback.pre_swap) { re->info->callback.pre_swap(re->info->callback.data, re->evas); } - eglSwapBuffers(re->win->egl_disp, re->win->egl_surface[0]); - if (!safe_native) eglWaitGL(); + glsym_eglSwapBuffers(re->win->egl_disp, re->win->egl_surface[0]); + if (!safe_native) glsym_eglWaitGL(); if (re->info->callback.post_swap) { re->info->callback.post_swap(re->info->callback.data, re->evas); @@ -1349,10 +1226,10 @@ eng_output_flush(void *data) double t1 = get_time(); printf("%1.5f\n", t1 - t0); #endif -// if (eglGetError() != EGL_SUCCESS) -// { -// printf("Error: eglSwapBuffers() fail.\n"); -// } + // if (glsym_eglGetError() != EGL_SUCCESS) + // { + // printf("Error: glsym_eglSwapBuffers() fail.\n"); + // } #else #ifdef VSYNC_TO_SCREEN if ((re->info->vsync)/* || (1)*/) @@ -1391,44 +1268,44 @@ eng_output_flush(void *data) { re->info->callback.pre_swap(re->info->callback.data, re->evas); } -/* - if ((1) -// (re->win->draw.x1 == 0) && -// (re->win->draw.y1 == 0) && -// (re->win->draw.x2 == (re->win->w - 1)) && -// (re->win->draw.y2 == (re->win->h - 1)) - ) - */ + /* + if ((1) + // (re->win->draw.x1 == 0) && + // (re->win->draw.y1 == 0) && + // (re->win->draw.x2 == (re->win->w - 1)) && + // (re->win->draw.y2 == (re->win->h - 1)) + ) + */ { - glXSwapBuffers(re->win->disp, re->win->win); - if (!safe_native) glXWaitGL(); + glsym_glXSwapBuffers(re->win->disp, re->win->win); + if (!safe_native) glsym_glXWaitGL(); } -/* - else - { -// FIXME: this doesn't work.. why oh why? - int sx, sy, sw, sh; - - // fimxe - reset when done -// glEnable(GL_SCISSOR_TEST); - glDrawBuffer(GL_FRONT); - - sx = re->win->draw.x1; - sy = re->win->draw.y1; - sw = (re->win->draw.x2 - re->win->draw.x1) + 1; - sh = (re->win->draw.y2 - re->win->draw.y1) + 1; - sy = re->win->h - sy - sh; - -// glScissor(sx, sy, sw, sh); - glRasterPos2i(sx, re->win->h - sy); - glCopyPixels(sx, sy, sw, sh, GL_COLOR); - glRasterPos2i(0, 0); - -// glDisable(GL_SCISSOR_TEST); - glDrawBuffer(GL_BACK); - glFlush(); - } - */ + /* + else + { + // FIXME: this doesn't work.. why oh why? + int sx, sy, sw, sh; + + // fimxe - reset when done + // glEnable(GL_SCISSOR_TEST); + glDrawBuffer(GL_FRONT); + + sx = re->win->draw.x1; + sy = re->win->draw.y1; + sw = (re->win->draw.x2 - re->win->draw.x1) + 1; + sh = (re->win->draw.y2 - re->win->draw.y1) + 1; + sy = re->win->h - sy - sh; + + // glScissor(sx, sy, sw, sh); + glRasterPos2i(sx, re->win->h - sy); + glCopyPixels(sx, sy, sw, sh, GL_COLOR); + glRasterPos2i(0, 0); + + // glDisable(GL_SCISSOR_TEST); + glDrawBuffer(GL_BACK); + glFlush(); + } + */ if (re->info->callback.post_swap) { re->info->callback.post_swap(re->info->callback.data, re->evas); @@ -1459,20 +1336,20 @@ eng_output_dump(void *data) static void eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h) { -// Render_Engine *re; -// -// re = (Render_Engine *)data; -// re->win->gl_context->dc = context; + // Render_Engine *re; + // + // re = (Render_Engine *)data; + // re->win->gl_context->dc = context; evas_common_draw_context_add_cutout(context, x, y, w, h); } static void eng_context_cutout_clear(void *data __UNUSED__, void *context) { -// Render_Engine *re; -// -// re = (Render_Engine *)data; -// re->win->gl_context->dc = context; + // Render_Engine *re; + // + // re = (Render_Engine *)data; + // re->win->gl_context->dc = context; evas_common_draw_context_clear_cutouts(context); } @@ -1533,10 +1410,10 @@ eng_polygon_draw(void *data, void *context, void *surface __UNUSED__, void *poly static int eng_image_alpha_get(void *data __UNUSED__, void *image) { -// Render_Engine *re; + // Render_Engine *re; Evas_GL_Image *im; -// re = (Render_Engine *)data; + // re = (Render_Engine *)data; if (!image) return 1; im = image; return im->alpha; @@ -1545,10 +1422,10 @@ eng_image_alpha_get(void *data __UNUSED__, void *image) static int eng_image_colorspace_get(void *data __UNUSED__, void *image) { -// Render_Engine *re; + // Render_Engine *re; Evas_GL_Image *im; -// re = (Render_Engine *)data; + // re = (Render_Engine *)data; if (!image) return EVAS_COLORSPACE_ARGB8888; im = image; return im->cs.space; @@ -1600,44 +1477,44 @@ eng_image_alpha_set(void *data, void *image, int has_alpha) im_new = evas_gl_common_image_new_from_copied_data (im->gc, im->im->cache_entry.w, im->im->cache_entry.h, - im->im->image.data, - eng_image_alpha_get(data, image), - eng_image_colorspace_get(data, image)); + im->im->image.data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); if (!im_new) return im; evas_gl_common_image_free(im); im = im_new; } else - evas_gl_common_image_dirty(im, 0, 0, 0, 0); + evas_gl_common_image_dirty(im, 0, 0, 0, 0); return evas_gl_common_image_alpha_set(im, has_alpha ? 1 : 0); -// im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0; -// return image; + // im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0; + // return image; } static void * eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__) { -// Render_Engine *re; -// -// re = (Render_Engine *)data; + // Render_Engine *re; + // + // re = (Render_Engine *)data; return image; } static void eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__) { -// Render_Engine *re; -// -// re = (Render_Engine *)data; + // Render_Engine *re; + // + // re = (Render_Engine *)data; } static char * eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__) { -// Render_Engine *re; + // Render_Engine *re; Evas_GL_Image *im; -// re = (Render_Engine *)data; + // re = (Render_Engine *)data; if (!image) return NULL; im = image; if (!im->im) return NULL; @@ -1647,10 +1524,10 @@ eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__) static char * eng_image_format_get(void *data __UNUSED__, void *image) { -// Render_Engine *re; + // Render_Engine *re; Evas_GL_Image *im; -// re = (Render_Engine *)data; + // re = (Render_Engine *)data; im = image; return NULL; } @@ -1738,40 +1615,40 @@ _native_bind_cb(void *data, void *image) Evas_GL_Image *im = image; Native *n = im->native.data; - if (n->ns.type == EVAS_NATIVE_SURFACE_X11) - { + if (n->ns.type == EVAS_NATIVE_SURFACE_X11) + { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - if (n->egl_surface) - { - if (glsym_glEGLImageTargetTexture2DOES) - { - glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface); - if (eglGetError() != EGL_SUCCESS) - ERR("glEGLImageTargetTexture2DOES() failed."); - } - else - ERR("Try glEGLImageTargetTexture2DOES on EGL with no support"); - } + if (n->egl_surface) + { + if (glsym_glEGLImageTargetTexture2DOES) + { + glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface); + if (glsym_eglGetError() != EGL_SUCCESS) + ERR("glEGLImageTargetTexture2DOES() failed."); + } + else + ERR("Try glEGLImageTargetTexture2DOES on EGL with no support"); + } #else # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT - Render_Engine *re = data; - - if (glsym_glXBindTexImage) - { - glsym_glXBindTexImage(re->win->disp, n->glx_pixmap, - GLX_FRONT_LEFT_EXT, NULL); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } - else - ERR("Try glXBindTexImage on GLX with no support"); + Render_Engine *re = data; + + if (glsym_glXBindTexImage) + { + glsym_glXBindTexImage(re->win->disp, n->glx_pixmap, + GLX_FRONT_LEFT_EXT, NULL); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } + else + ERR("Try glXBindTexImage on GLX with no support"); # endif #endif - } - else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) - { - glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } + } + else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) + { + glsym_glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } return; data = NULL; } @@ -1779,33 +1656,33 @@ _native_bind_cb(void *data, void *image) static void _native_unbind_cb(void *data, void *image) { - Evas_GL_Image *im = image; - Native *n = im->native.data; + Evas_GL_Image *im = image; + Native *n = im->native.data; - if (n->ns.type == EVAS_NATIVE_SURFACE_X11) - { + if (n->ns.type == EVAS_NATIVE_SURFACE_X11) + { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - // nothing + // nothing #else # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT - Render_Engine *re = data; - - if (glsym_glXReleaseTexImage) - { - glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap, - GLX_FRONT_LEFT_EXT); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } - else - ERR("Try glXReleaseTexImage on GLX with no support"); + Render_Engine *re = data; + + if (glsym_glXReleaseTexImage) + { + glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap, + GLX_FRONT_LEFT_EXT); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } + else + ERR("Try glXReleaseTexImage on GLX with no support"); # endif #endif - } - else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) - { - glBindTexture(GL_TEXTURE_2D, 0); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } + } + else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) + { + glsym_glBindTexture(GL_TEXTURE_2D, 0); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } return; data = NULL; } @@ -1813,386 +1690,385 @@ _native_unbind_cb(void *data, void *image) static void _native_free_cb(void *data, void *image) { - Render_Engine *re = data; - Evas_GL_Image *im = image; - Native *n = im->native.data; - uint32_t pmid, texid; + Render_Engine *re = data; + Evas_GL_Image *im = image; + Native *n = im->native.data; + uint32_t pmid, texid; - if (n->ns.type == EVAS_NATIVE_SURFACE_X11) - { - pmid = n->pixmap; - eina_hash_del(re->win->gl_context->shared->native_pm_hash, &pmid, im); + if (n->ns.type == EVAS_NATIVE_SURFACE_X11) + { + pmid = n->pixmap; + eina_hash_del(re->win->gl_context->shared->native_pm_hash, &pmid, im); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - if (n->egl_surface) - { - if (glsym_eglDestroyImage) - { - glsym_eglDestroyImage(re->win->egl_disp, - n->egl_surface); - if (eglGetError() != EGL_SUCCESS) - ERR("eglDestroyImage() failed."); - } - else - ERR("Try eglDestroyImage on EGL with no support"); - } + if (n->egl_surface) + { + if (glsym_eglDestroyImage) + { + glsym_eglDestroyImage(re->win->egl_disp, + n->egl_surface); + if (glsym_eglGetError() != EGL_SUCCESS) + ERR("glsym_eglDestroyImage() failed."); + } + else + ERR("Try glsym_eglDestroyImage on EGL with no support"); + } #else # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT - if (n->glx_pixmap) - { - if (im->native.loose) - { - if (glsym_glXReleaseTexImage) - { - glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap, - GLX_FRONT_LEFT_EXT); + if (n->glx_pixmap) + { + if (im->native.loose) + { + if (glsym_glXReleaseTexImage) + { + glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap, + GLX_FRONT_LEFT_EXT); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } + else + ERR("Try glXReleaseTexImage on GLX with no support"); + } + if (glsym_glXDestroyPixmap) + { + glsym_glXDestroyPixmap(re->win->disp, n->glx_pixmap); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } - else - ERR("Try glXReleaseTexImage on GLX with no support"); - } - if (glsym_glXDestroyPixmap) - { - glsym_glXDestroyPixmap(re->win->disp, n->glx_pixmap); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - } - else - ERR("Try glXDestroyPixmap on GLX with no support"); - n->glx_pixmap = 0; - } + } + else + ERR("Try glXDestroyPixmap on GLX with no support"); + n->glx_pixmap = 0; + } # endif #endif - } - else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) - { - texid = n->ns.data.opengl.texture_id; - eina_hash_del(re->win->gl_context->shared->native_tex_hash, &texid, im); - } - im->native.data = NULL; - im->native.func.data = NULL; - im->native.func.bind = NULL; - im->native.func.unbind = NULL; - im->native.func.free = NULL; - free(n); + } + else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) + { + texid = n->ns.data.opengl.texture_id; + eina_hash_del(re->win->gl_context->shared->native_tex_hash, &texid, im); + } + im->native.data = NULL; + im->native.func.data = NULL; + im->native.func.bind = NULL; + im->native.func.unbind = NULL; + im->native.func.free = NULL; + free(n); } static void * eng_image_native_set(void *data, void *image, void *native) { - Render_Engine *re = (Render_Engine *)data; - Evas_Native_Surface *ns = native; - Evas_GL_Image *im = image, *im2 = NULL; - Visual *vis = NULL; - Pixmap pm = 0; - Native *n = NULL; - uint32_t pmid, texid; - unsigned int tex = 0; - unsigned int fbo = 0; - - if (!im) - { - if ((!ns) && (ns->type == EVAS_NATIVE_SURFACE_OPENGL)) - { - im = evas_gl_common_image_new_from_data(re->win->gl_context, - ns->data.opengl.w, - ns->data.opengl.h, - NULL, 1, - EVAS_COLORSPACE_ARGB8888); - } - else + Render_Engine *re = (Render_Engine *)data; + Evas_Native_Surface *ns = native; + Evas_GL_Image *im = image, *im2 = NULL; + Visual *vis = NULL; + Pixmap pm = 0; + Native *n = NULL; + uint32_t pmid, texid; + unsigned int tex = 0; + unsigned int fbo = 0; + + if (!im) + { + if ((!ns) && (ns->type == EVAS_NATIVE_SURFACE_OPENGL)) + { + im = evas_gl_common_image_new_from_data(re->win->gl_context, + ns->data.opengl.w, + ns->data.opengl.h, + NULL, 1, + EVAS_COLORSPACE_ARGB8888); + } + else return NULL; - } - - if (ns) - { - if (ns->type == EVAS_NATIVE_SURFACE_X11) - { - vis = ns->data.x11.visual; - pm = ns->data.x11.pixmap; - if (im->native.data) - { - Evas_Native_Surface *ens = im->native.data; - if ((ens->data.x11.visual == vis) && - (ens->data.x11.pixmap == pm)) - return im; - } - } - else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) - { - tex = ns->data.opengl.texture_id; - fbo = ns->data.opengl.framebuffer_id; - if (im->native.data) - { - Evas_Native_Surface *ens = im->native.data; - if ((ens->data.opengl.texture_id == tex) && - (ens->data.opengl.framebuffer_id == fbo)) - return im; - } - } - } - if ((!ns) && (!im->native.data)) return im; - - eng_window_use(re->win); - - if (im->native.data) - { - if (im->native.func.free) - im->native.func.free(im->native.func.data, im); - evas_gl_common_image_native_disable(im); - } - - if (!ns) return im; - - if (ns->type == EVAS_NATIVE_SURFACE_X11) - { - pmid = pm; - im2 = eina_hash_find(re->win->gl_context->shared->native_pm_hash, &pmid); - if (im2 == im) return im; - if (im2) - { - n = im2->native.data; - if (n) - { - evas_gl_common_image_ref(im2); - evas_gl_common_image_free(im); - return im2; - } - } - } - else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) - { - texid = tex; - im2 = eina_hash_find(re->win->gl_context->shared->native_tex_hash, &texid); - if (im2 == im) return im; - if (im2) - { - n = im2->native.data; - if (n) - { - evas_gl_common_image_ref(im2); - evas_gl_common_image_free(im); - return im2; - } - } - - } - im2 = evas_gl_common_image_new_from_data(re->win->gl_context, - im->w, im->h, NULL, im->alpha, - EVAS_COLORSPACE_ARGB8888); - evas_gl_common_image_free(im); - im = im2; - if (ns->type == EVAS_NATIVE_SURFACE_X11) - { -#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - if (native) - { - n = calloc(1, sizeof(Native)); - if (n) - { - EGLConfig egl_config; - int config_attrs[20]; - int num_config, i = 0; - - eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im); - - config_attrs[i++] = EGL_RED_SIZE; - config_attrs[i++] = 8; - config_attrs[i++] = EGL_GREEN_SIZE; - config_attrs[i++] = 8; - config_attrs[i++] = EGL_BLUE_SIZE; - config_attrs[i++] = 8; - config_attrs[i++] = EGL_ALPHA_SIZE; - config_attrs[i++] = 8; - config_attrs[i++] = EGL_DEPTH_SIZE; - config_attrs[i++] = 0; - config_attrs[i++] = EGL_STENCIL_SIZE; - config_attrs[i++] = 0; - config_attrs[i++] = EGL_RENDERABLE_TYPE; - config_attrs[i++] = EGL_OPENGL_ES2_BIT; - config_attrs[i++] = EGL_SURFACE_TYPE; - config_attrs[i++] = EGL_PIXMAP_BIT; - config_attrs[i++] = EGL_NONE; - - if (!eglChooseConfig(re->win->egl_disp, config_attrs, - &egl_config, 1, &num_config)) - ERR("eglChooseConfig() failed for pixmap 0x%x, num_config = %i", (unsigned int)pm, num_config); - memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); - n->pixmap = pm; - n->visual = vis; - if (glsym_eglCreateImage) - n->egl_surface = glsym_eglCreateImage(re->win->egl_disp, - EGL_NO_CONTEXT, - EGL_NATIVE_PIXMAP_KHR, - (void *)pm, - NULL); - else - ERR("Try eglCreateImage on EGL with no support"); - if (!n->egl_surface) - ERR("eglCreatePixmapSurface() for 0x%x failed", (unsigned int)pm); - im->native.yinvert = 1; - im->native.loose = 0; - im->native.data = n; - im->native.func.data = re; - im->native.func.bind = _native_bind_cb; - im->native.func.unbind = _native_unbind_cb; - im->native.func.free = _native_free_cb; - im->native.target = GL_TEXTURE_2D; - im->native.mipmap = 0; - evas_gl_common_image_native_enable(im); - } - } -#else -# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT - if (native) - { - int dummy; - unsigned int w, h, depth = 32, border; - Window wdummy; - - // fixme: round trip :( - XGetGeometry(re->win->disp, pm, &wdummy, &dummy, &dummy, - &w, &h, &border, &depth); - n = calloc(1, sizeof(Native)); - if (n) - { - int pixmap_att[20]; - unsigned int target = 0; - unsigned int i = 0; - - eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im); - if ((re->win->depth_cfg[depth].tex_target & - GLX_TEXTURE_2D_BIT_EXT) - // && (1) // we assume npo2 for now - // size is pow2 || mnpo2 supported - ) - target = GLX_TEXTURE_2D_EXT; - else if ((re->win->depth_cfg[depth].tex_target & - GLX_TEXTURE_RECTANGLE_BIT_EXT)) - { - ERR("rect!!! (not handled)"); - target = GLX_TEXTURE_RECTANGLE_EXT; - } - if (!target) - { - ERR("broken text-from-pixmap"); - if (!(re->win->depth_cfg[depth].tex_target & - GLX_TEXTURE_2D_BIT_EXT)) - target = GLX_TEXTURE_RECTANGLE_EXT; - else if (!(re->win->depth_cfg[depth].tex_target & - GLX_TEXTURE_RECTANGLE_BIT_EXT)) - target = GLX_TEXTURE_2D_EXT; - } + } + if (ns) + { + if (ns->type == EVAS_NATIVE_SURFACE_X11) + { + vis = ns->data.x11.visual; + pm = ns->data.x11.pixmap; + if (im->native.data) + { + Evas_Native_Surface *ens = im->native.data; + if ((ens->data.x11.visual == vis) && + (ens->data.x11.pixmap == pm)) + return im; + } + } + else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) + { + tex = ns->data.opengl.texture_id; + fbo = ns->data.opengl.framebuffer_id; + if (im->native.data) + { + Evas_Native_Surface *ens = im->native.data; + if ((ens->data.opengl.texture_id == tex) && + (ens->data.opengl.framebuffer_id == fbo)) + return im; + } + } + } + if ((!ns) && (!im->native.data)) return im; - pixmap_att[i++] = GLX_TEXTURE_FORMAT_EXT; - pixmap_att[i++] = re->win->depth_cfg[depth].tex_format; - pixmap_att[i++] = GLX_MIPMAP_TEXTURE_EXT; - pixmap_att[i++] = re->win->depth_cfg[depth].mipmap; + eng_window_use(re->win); - if (target) - { - pixmap_att[i++] = GLX_TEXTURE_TARGET_EXT; - pixmap_att[i++] = target; - } + if (im->native.data) + { + if (im->native.func.free) + im->native.func.free(im->native.func.data, im); + evas_gl_common_image_native_disable(im); + } - pixmap_att[i++] = 0; + if (!ns) return im; - memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); - n->pixmap = pm; - n->visual = vis; - n->fbc = re->win->depth_cfg[depth].fbc; - if (glsym_glXCreatePixmap) - n->glx_pixmap = glsym_glXCreatePixmap(re->win->disp, - n->fbc, - n->pixmap, - pixmap_att); - else - ERR("Try glXCreatePixmap on GLX with no support"); - if (n->glx_pixmap) - { -// printf("%p: new native texture for %x | %4i x %4i @ %2i = %p\n", -// n, pm, w, h, depth, n->glx_pixmap); - if (!target) + if (ns->type == EVAS_NATIVE_SURFACE_X11) + { + pmid = pm; + im2 = eina_hash_find(re->win->gl_context->shared->native_pm_hash, &pmid); + if (im2 == im) return im; + if (im2) + { + n = im2->native.data; + if (n) + { + evas_gl_common_image_ref(im2); + evas_gl_common_image_free(im); + return im2; + } + } + } + else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) + { + texid = tex; + im2 = eina_hash_find(re->win->gl_context->shared->native_tex_hash, &texid); + if (im2 == im) return im; + if (im2) + { + n = im2->native.data; + if (n) + { + evas_gl_common_image_ref(im2); + evas_gl_common_image_free(im); + return im2; + } + } + } + im2 = evas_gl_common_image_new_from_data(re->win->gl_context, + im->w, im->h, NULL, im->alpha, + EVAS_COLORSPACE_ARGB8888); + evas_gl_common_image_free(im); + im = im2; + if (ns->type == EVAS_NATIVE_SURFACE_X11) + { +#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) + if (native) + { + n = calloc(1, sizeof(Native)); + if (n) + { + EGLConfig egl_config; + int config_attrs[20]; + int num_config, i = 0; + + eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im); + + config_attrs[i++] = EGL_RED_SIZE; + config_attrs[i++] = 8; + config_attrs[i++] = EGL_GREEN_SIZE; + config_attrs[i++] = 8; + config_attrs[i++] = EGL_BLUE_SIZE; + config_attrs[i++] = 8; + config_attrs[i++] = EGL_ALPHA_SIZE; + config_attrs[i++] = 8; + config_attrs[i++] = EGL_DEPTH_SIZE; + config_attrs[i++] = 0; + config_attrs[i++] = EGL_STENCIL_SIZE; + config_attrs[i++] = 0; + config_attrs[i++] = EGL_RENDERABLE_TYPE; + config_attrs[i++] = EGL_OPENGL_ES2_BIT; + config_attrs[i++] = EGL_SURFACE_TYPE; + config_attrs[i++] = EGL_PIXMAP_BIT; + config_attrs[i++] = EGL_NONE; + + if (!glsym_eglChooseConfig(re->win->egl_disp, config_attrs, + &egl_config, 1, &num_config)) + ERR("glsym_eglChooseConfig() failed for pixmap 0x%x, num_config = %i", (unsigned int)pm, num_config); + memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); + n->pixmap = pm; + n->visual = vis; + if (glsym_eglCreateImage) + n->egl_surface = glsym_eglCreateImage(re->win->egl_disp, + EGL_NO_CONTEXT, + EGL_NATIVE_PIXMAP_KHR, + (void *)pm, + NULL); + else + ERR("Try glsym_eglCreateImage on EGL with no support"); + if (!n->egl_surface) + ERR("glsym_eglCreatePixmapSurface() for 0x%x failed", (unsigned int)pm); + im->native.yinvert = 1; + im->native.loose = 0; + im->native.data = n; + im->native.func.data = re; + im->native.func.bind = _native_bind_cb; + im->native.func.unbind = _native_unbind_cb; + im->native.func.free = _native_free_cb; + im->native.target = GL_TEXTURE_2D; + im->native.mipmap = 0; + evas_gl_common_image_native_enable(im); + } + } +#else +# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT + if (native) + { + int dummy; + unsigned int w, h, depth = 32, border; + Window wdummy; + + // fixme: round trip :( + XGetGeometry(re->win->disp, pm, &wdummy, &dummy, &dummy, + &w, &h, &border, &depth); + n = calloc(1, sizeof(Native)); + if (n) + { + int pixmap_att[20]; + unsigned int target = 0; + unsigned int i = 0; + + eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im); + if ((re->win->depth_cfg[depth].tex_target & + GLX_TEXTURE_2D_BIT_EXT) + // && (1) // we assume npo2 for now + // size is pow2 || mnpo2 supported + ) + target = GLX_TEXTURE_2D_EXT; + else if ((re->win->depth_cfg[depth].tex_target & + GLX_TEXTURE_RECTANGLE_BIT_EXT)) { - ERR("no target :("); - if (glsym_glXQueryDrawable) - glsym_glXQueryDrawable(re->win->disp, - n->pixmap, - GLX_TEXTURE_TARGET_EXT, - &target); + ERR("rect!!! (not handled)"); + target = GLX_TEXTURE_RECTANGLE_EXT; } - if (target == GLX_TEXTURE_2D_EXT) + if (!target) { - im->native.target = GL_TEXTURE_2D; - im->native.mipmap = re->win->depth_cfg[depth].mipmap; + ERR("broken text-from-pixmap"); + if (!(re->win->depth_cfg[depth].tex_target & + GLX_TEXTURE_2D_BIT_EXT)) + target = GLX_TEXTURE_RECTANGLE_EXT; + else if (!(re->win->depth_cfg[depth].tex_target & + GLX_TEXTURE_RECTANGLE_BIT_EXT)) + target = GLX_TEXTURE_2D_EXT; } -# ifdef GL_TEXTURE_RECTANGLE_ARB - else if (target == GLX_TEXTURE_RECTANGLE_EXT) + + + pixmap_att[i++] = GLX_TEXTURE_FORMAT_EXT; + pixmap_att[i++] = re->win->depth_cfg[depth].tex_format; + pixmap_att[i++] = GLX_MIPMAP_TEXTURE_EXT; + pixmap_att[i++] = re->win->depth_cfg[depth].mipmap; + + if (target) { - im->native.target = GL_TEXTURE_RECTANGLE_ARB; - im->native.mipmap = 0; + pixmap_att[i++] = GLX_TEXTURE_TARGET_EXT; + pixmap_att[i++] = target; } -# endif + + pixmap_att[i++] = 0; + + memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); + n->pixmap = pm; + n->visual = vis; + n->fbc = re->win->depth_cfg[depth].fbc; + if (glsym_glXCreatePixmap) + n->glx_pixmap = glsym_glXCreatePixmap(re->win->disp, + n->fbc, + n->pixmap, + pixmap_att); else + ERR("Try glXCreatePixmap on GLX with no support"); + if (n->glx_pixmap) { - im->native.target = GL_TEXTURE_2D; - im->native.mipmap = 0; - ERR("still unknown target"); + // printf("%p: new native texture for %x | %4i x %4i @ %2i = %p\n", + // n, pm, w, h, depth, n->glx_pixmap); + if (!target) + { + ERR("no target :("); + if (glsym_glXQueryDrawable) + glsym_glXQueryDrawable(re->win->disp, + n->pixmap, + GLX_TEXTURE_TARGET_EXT, + &target); + } + if (target == GLX_TEXTURE_2D_EXT) + { + im->native.target = GL_TEXTURE_2D; + im->native.mipmap = re->win->depth_cfg[depth].mipmap; + } +# ifdef GL_TEXTURE_RECTANGLE_ARB + else if (target == GLX_TEXTURE_RECTANGLE_EXT) + { + im->native.target = GL_TEXTURE_RECTANGLE_ARB; + im->native.mipmap = 0; + } +# endif + else + { + im->native.target = GL_TEXTURE_2D; + im->native.mipmap = 0; + ERR("still unknown target"); + } } - } - else - ERR("GLX Pixmap create fail"); - im->native.yinvert = re->win->depth_cfg[depth].yinvert; - im->native.loose = re->win->detected.loose_binding; - im->native.data = n; - im->native.func.data = re; - im->native.func.bind = _native_bind_cb; - im->native.func.unbind = _native_unbind_cb; - im->native.func.free = _native_free_cb; - - evas_gl_common_image_native_enable(im); - } - } + else + ERR("GLX Pixmap create fail"); + im->native.yinvert = re->win->depth_cfg[depth].yinvert; + im->native.loose = re->win->detected.loose_binding; + im->native.data = n; + im->native.func.data = re; + im->native.func.bind = _native_bind_cb; + im->native.func.unbind = _native_unbind_cb; + im->native.func.free = _native_free_cb; + + evas_gl_common_image_native_enable(im); + } + } # endif #endif - } - else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) - { - if (native) - { - n = calloc(1, sizeof(Native)); - if (n) - { - memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); - - eina_hash_add(re->win->gl_context->shared->native_tex_hash, &texid, im); - - n->pixmap = 0; - n->visual = 0; + } + else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL) + { + if (native) + { + n = calloc(1, sizeof(Native)); + if (n) + { + memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); + + eina_hash_add(re->win->gl_context->shared->native_tex_hash, &texid, im); + + n->pixmap = 0; + n->visual = 0; #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - n->egl_surface = 0; + n->egl_surface = 0; #else - n->fbc = 0; - n->glx_pixmap = 0; + n->fbc = 0; + n->glx_pixmap = 0; #endif - im->native.yinvert = 0; - im->native.loose = 0; - im->native.data = n; - im->native.func.data = re; - im->native.func.bind = _native_bind_cb; - im->native.func.unbind = _native_unbind_cb; - im->native.func.free = _native_free_cb; - im->native.target = GL_TEXTURE_2D; - im->native.mipmap = 0; + im->native.yinvert = 0; + im->native.loose = 0; + im->native.data = n; + im->native.func.data = re; + im->native.func.bind = _native_bind_cb; + im->native.func.unbind = _native_unbind_cb; + im->native.func.free = _native_free_cb; + im->native.target = GL_TEXTURE_2D; + im->native.mipmap = 0; - // FIXME: need to implement mapping sub texture regions - // x, y, w, h for possible texture atlasing + // FIXME: need to implement mapping sub texture regions + // x, y, w, h for possible texture atlasing - evas_gl_common_image_native_enable(im); - } - } + evas_gl_common_image_native_enable(im); + } + } - } + } return im; } @@ -2342,24 +2218,24 @@ eng_image_size_set(void *data, void *image, int w, int h) if ((im_old) && ((int)im_old->im->cache_entry.w == w) && ((int)im_old->im->cache_entry.h == h)) - return image; + return image; if (im_old) { im = evas_gl_common_image_new(re->win->gl_context, w, h, eng_image_alpha_get(data, image), eng_image_colorspace_get(data, image)); /* - evas_common_load_image_data_from_file(im_old->im); - if (im_old->im->image->data) - { - evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0); - evas_common_cpu_end_opt(); - } - */ + evas_common_load_image_data_from_file(im_old->im); + if (im_old->im->image->data) + { + evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0); + evas_common_cpu_end_opt(); + } + */ evas_gl_common_image_free(im_old); } else - im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888); + im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888); return im; } @@ -2436,14 +2312,14 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i #endif /* Engine can be fail to create texture after cache drop like eng_image_content_hint_set function, - so it is need to add code which check im->im's NULL value*/ + so it is need to add code which check im->im's NULL value*/ if (!im->im) - { - *image_data = NULL; - if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; - return NULL; - } + { + *image_data = NULL; + if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; + return NULL; + } error = evas_cache_image_load_data(&im->im->cache_entry); switch (im->cs.space) @@ -2740,9 +2616,9 @@ eng_image_stride_get(void *data __UNUSED__, void *image, int *stride) Evas_GL_Image *im = image; if ((im->tex) && (im->tex->pt->dyn.img)) - *stride = im->tex->pt->dyn.stride; + *stride = im->tex->pt->dyn.stride; else - *stride = im->w * 4; + *stride = im->w * 4; } static void @@ -2759,7 +2635,7 @@ eng_font_draw(void *data, void *context, void *surface, Evas_Font_Set *font, int static RGBA_Image *im = NULL; if (!im) - im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); + im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); im->cache_entry.w = re->win->w; im->cache_entry.h = re->win->h; evas_common_draw_context_font_ext_set(context, @@ -2853,15 +2729,15 @@ _create_rt_buffers(Render_Engine *data __UNUSED__, Render_Engine_GL_Surface *sfc) { // Render Target texture - glGenTextures(1, &sfc->rt_tex ); + glsym_glGenTextures(1, &sfc->rt_tex ); // Depth RenderBuffer - Create storage here... if (sfc->depth_bits != EVAS_GL_DEPTH_NONE) - glGenRenderbuffers(1, &sfc->rb_depth); + glsym_glGenRenderbuffers(1, &sfc->rb_depth); // Stencil RenderBuffer - Create Storage here... if (sfc->stencil_bits != EVAS_GL_STENCIL_NONE) - glGenRenderbuffers(1, &sfc->rb_stencil); + glsym_glGenRenderbuffers(1, &sfc->rb_stencil); return 1; } @@ -2874,45 +2750,45 @@ _attach_fbo_surface(Render_Engine *data __UNUSED__, int fb_status; // Initialize Texture - glBindTexture(GL_TEXTURE_2D, sfc->rt_tex ); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfc->w, sfc->h, 0, - GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, 0); + glsym_glBindTexture(GL_TEXTURE_2D, sfc->rt_tex ); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glsym_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glsym_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfc->w, sfc->h, 0, + GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glsym_glBindTexture(GL_TEXTURE_2D, 0); // Attach texture to FBO - glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, sfc->rt_tex, 0); + glsym_glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo); + glsym_glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, sfc->rt_tex, 0); // Depth RenderBuffer - Attach it to FBO if (sfc->depth_bits != EVAS_GL_DEPTH_NONE) { - glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_depth); - glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_depth_fmt, - sfc->w, sfc->h); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, sfc->rb_depth); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + glsym_glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_depth); + glsym_glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_depth_fmt, + sfc->w, sfc->h); + glsym_glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, sfc->rb_depth); + glsym_glBindRenderbuffer(GL_RENDERBUFFER, 0); } // Stencil RenderBuffer - Attach it to FBO if (sfc->stencil_bits != EVAS_GL_STENCIL_NONE) { - glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_stencil); - glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_stencil_fmt, - sfc->w, sfc->h); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, sfc->rb_stencil); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + glsym_glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_stencil); + glsym_glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_stencil_fmt, + sfc->w, sfc->h); + glsym_glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, sfc->rb_stencil); + glsym_glBindRenderbuffer(GL_RENDERBUFFER, 0); } // Check FBO for completeness - fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + fb_status = glsym_glCheckFramebufferStatus(GL_FRAMEBUFFER); if (fb_status != GL_FRAMEBUFFER_COMPLETE) { ERR("FBO not complete!"); @@ -2973,9 +2849,9 @@ eng_gl_surface_create(void *data, void *config, int w, int h) // make_current called, the user can't call native_surface_get() right // after the surface is created. hence this is done here using evas' context. #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context); + ret = glsym_eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context); #else - ret = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context); + ret = glsym_glXMakeCurrent(re->info->info.display, re->win->win, rsc->context); #endif if (!ret) { @@ -2993,9 +2869,9 @@ eng_gl_surface_create(void *data, void *config, int w, int h) } #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + ret = glsym_eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); #else - ret = glXMakeCurrent(re->info->info.display, None, NULL); + ret = glsym_glXMakeCurrent(re->info->info.display, None, NULL); #endif if (!ret) { @@ -3023,9 +2899,9 @@ eng_gl_surface_destroy(void *data, void *surface) if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0; #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context); + ret = glsym_eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context); #else - ret = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context); + ret = glsym_glXMakeCurrent(re->info->info.display, re->win->win, rsc->context); #endif if (!ret) { @@ -3035,18 +2911,18 @@ eng_gl_surface_destroy(void *data, void *surface) // Delete FBO/RBO and Texture here if (sfc->rt_tex) - glDeleteTextures(1, &sfc->rt_tex); + glsym_glDeleteTextures(1, &sfc->rt_tex); if (sfc->rb_depth) - glDeleteRenderbuffers(1, &sfc->rb_depth); + glsym_glDeleteRenderbuffers(1, &sfc->rb_depth); if (sfc->rb_stencil) - glDeleteRenderbuffers(1, &sfc->rb_stencil); + glsym_glDeleteRenderbuffers(1, &sfc->rb_stencil); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + ret = glsym_eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); #else - ret = glXMakeCurrent(re->info->info.display, None, NULL); + ret = glsym_glXMakeCurrent(re->info->info.display, None, NULL); #endif if (!ret) { @@ -3088,39 +2964,39 @@ eng_gl_context_create(void *data, void *share_context) if (share_ctx) { - ctx->context = eglCreateContext(re->win->egl_disp, - re->win->egl_config, - share_ctx->context, // Share Context - context_attrs); + ctx->context = glsym_eglCreateContext(re->win->egl_disp, + re->win->egl_config, + share_ctx->context, // Share Context + context_attrs); } else { - ctx->context = eglCreateContext(re->win->egl_disp, - re->win->egl_config, - re->win->egl_context[0], // Evas' GL Context - context_attrs); + ctx->context = glsym_eglCreateContext(re->win->egl_disp, + re->win->egl_config, + re->win->egl_context[0], // Evas' GL Context + context_attrs); } if (!ctx->context) { - ERR("eglCreateContext() fail. code=%#x", eglGetError()); + ERR("glsym_eglCreateContext() fail. code=%#x", glsym_eglGetError()); return NULL; } #else // GLX if (share_context) { - ctx->context = glXCreateContext(re->info->info.display, - re->win->visualinfo, - share_ctx->context, // Share Context - 1); + ctx->context = glsym_glXCreateContext(re->info->info.display, + re->win->visualinfo, + share_ctx->context, // Share Context + 1); } else { - ctx->context = glXCreateContext(re->info->info.display, - re->win->visualinfo, - re->win->context, // Evas' GL Context - 1); + ctx->context = glsym_glXCreateContext(re->info->info.display, + re->win->visualinfo, + re->win->context, // Evas' GL Context + 1); } if (!ctx->context) @@ -3154,11 +3030,11 @@ eng_gl_context_destroy(void *data, void *context) // 1. Do a make current with the given context #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, - rsc->surface, ctx->context); + ret = glsym_eglMakeCurrent(re->win->egl_disp, rsc->surface, + rsc->surface, ctx->context); #else - ret = glXMakeCurrent(re->info->info.display, re->win->win, - ctx->context); + ret = glsym_glXMakeCurrent(re->info->info.display, re->win->win, + ctx->context); #endif if (!ret) { @@ -3168,22 +3044,22 @@ eng_gl_context_destroy(void *data, void *context) // 2. Delete the FBO if (ctx->context_fbo) - glDeleteFramebuffers(1, &ctx->context_fbo); + glsym_glDeleteFramebuffers(1, &ctx->context_fbo); // 3. Destroy the Context #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - eglDestroyContext(re->win->egl_disp, ctx->context); + glsym_eglDestroyContext(re->win->egl_disp, ctx->context); ctx->context = EGL_NO_CONTEXT; - ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT); + ret = glsym_eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, + EGL_NO_SURFACE, EGL_NO_CONTEXT); #else - glXDestroyContext(re->info->info.display, ctx->context); + glsym_glXDestroyContext(re->info->info.display, ctx->context); ctx->context = 0; - ret = glXMakeCurrent(re->info->info.display, None, NULL); + ret = glsym_glXMakeCurrent(re->info->info.display, None, NULL); #endif if (!ret) { @@ -3216,10 +3092,10 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context) if ((!sfc) || (!ctx)) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT); + ret = glsym_eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, + EGL_NO_SURFACE, EGL_NO_CONTEXT); #else - ret = glXMakeCurrent(re->info->info.display, None, NULL); + ret = glsym_glXMakeCurrent(re->info->info.display, None, NULL); #endif if (!ret) { @@ -3237,16 +3113,16 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context) #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0; - if ((eglGetCurrentContext() != ctx->context) || - (eglGetCurrentSurface(EGL_READ) != rsc->surface) || - (eglGetCurrentSurface(EGL_DRAW) != rsc->surface) ) + if ((glsym_eglGetCurrentContext() != ctx->context) || + (glsym_eglGetCurrentSurface(EGL_READ) != rsc->surface) || + (glsym_eglGetCurrentSurface(EGL_DRAW) != rsc->surface) ) { // Flush remainder of what's in Evas' pipeline if (re->win) eng_window_use(NULL); // Do a make current - ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, - rsc->surface, ctx->context); + ret = glsym_eglMakeCurrent(re->win->egl_disp, rsc->surface, + rsc->surface, ctx->context); if (!ret) { ERR("xxxMakeCurrent() failed!"); @@ -3254,14 +3130,14 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context) } } #else - if ((glXGetCurrentContext() != ctx->context) || - (glXGetCurrentDrawable() != re->win->win) ) + if ((glsym_glXGetCurrentContext() != ctx->context) || + (glsym_glXGetCurrentDrawable() != re->win->win) ) { // Flush remainder of what's in Evas' pipeline if (re->win) eng_window_use(NULL); // Do a make current - ret = glXMakeCurrent(re->info->info.display, re->win->win, ctx->context); + ret = glsym_glXMakeCurrent(re->info->info.display, re->win->win, ctx->context); if (!ret) { ERR("xxxMakeCurrent() failed!"); @@ -3273,7 +3149,7 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context) // Create FBO if not already created if (!ctx->initialized) { - glGenFramebuffers(1, &ctx->context_fbo); + glsym_glGenFramebuffers(1, &ctx->context_fbo); ctx->initialized = 1; } @@ -3288,10 +3164,10 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context) if (ctx->current_fbo) // Bind to the previously bound buffer - glBindFramebuffer(GL_FRAMEBUFFER, ctx->current_fbo); + glsym_glBindFramebuffer(GL_FRAMEBUFFER, ctx->current_fbo); else // Bind FBO - glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo); + glsym_glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo); sfc->fbo_attached = 1; } @@ -3357,7 +3233,7 @@ evgl_glGetString(GLenum name) if (name == GL_EXTENSIONS) return (GLubyte *)_gl_ext_string; //glGetString(GL_EXTENSIONS); else - return glGetString(name); + return glsym_glGetString(name); } static void @@ -3370,13 +3246,13 @@ evgl_glBindFramebuffer(GLenum target, GLuint framebuffer) { if (ctx) { - glBindFramebuffer(target, ctx->context_fbo); + glsym_glBindFramebuffer(target, ctx->context_fbo); ctx->current_fbo = 0; } } else { - glBindFramebuffer(target, framebuffer); + glsym_glBindFramebuffer(target, framebuffer); // Save this for restore when doing make current if (ctx) @@ -3389,16 +3265,16 @@ evgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer) { // Add logic to take care when renderbuffer=0 // On a second thought we don't need this - glBindRenderbuffer(target, renderbuffer); + glsym_glBindRenderbuffer(target, renderbuffer); } static void evgl_glClearDepthf(GLclampf depth) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glClearDepthf(depth); + glsym_glClearDepthf(depth); #else - glClearDepth(depth); + glsym_glClearDepthf(depth); #endif } @@ -3406,9 +3282,9 @@ static void evgl_glDepthRangef(GLclampf zNear, GLclampf zFar) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glDepthRangef(zNear, zFar); + glsym_glDepthRangef(zNear, zFar); #else - glDepthRange(zNear, zFar); + glsym_glDepthRangef(zNear, zFar); #endif } @@ -3416,7 +3292,7 @@ static void evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + glsym_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); #else if (range) { @@ -3436,7 +3312,7 @@ static void evgl_glReleaseShaderCompiler(void) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glReleaseShaderCompiler(); + glsym_glReleaseShaderCompiler(); #else #endif } @@ -3445,9 +3321,9 @@ static void evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) { #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - glShaderBinary(n, shaders, binaryformat, binary, length); + glsym_glShaderBinary(n, shaders, binaryformat, binary, length); #else -// FIXME: need to dlsym/getprocaddress for this + // FIXME: need to dlsym/getprocaddress for this return; n = binaryformat = length = 0; shaders = binary = 0; @@ -3476,7 +3352,7 @@ static void evgl_evasglDestroyImage(EvasGLImage image) { if (current_engine) - glsym_eglDestroyImage(current_engine->win->egl_disp, image); + glsym_eglDestroyImage(current_engine->win->egl_disp, image); else ERR("Invalid Engine... (Can't acccess EGL Display)\n"); } @@ -3507,7 +3383,7 @@ eng_gl_api_get(void *data) gl_funcs.version = EVAS_GL_API_VERSION; -#define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, ) +#define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, glsym_) // GLES 2.0 ORD(glActiveTexture); ORD(glAttachShader); @@ -3524,7 +3400,7 @@ eng_gl_api_get(void *data) ORD(glCheckFramebufferStatus); ORD(glClear); ORD(glClearColor); -// ORD(glClearDepthf); + // ORD(glClearDepthf); ORD(glClearStencil); ORD(glColorMask); ORD(glCompileShader); @@ -3543,7 +3419,7 @@ eng_gl_api_get(void *data) ORD(glDeleteTextures); ORD(glDepthFunc); ORD(glDepthMask); -// ORD(glDepthRangef); + // ORD(glDepthRangef); ORD(glDetachShader); ORD(glDisable); ORD(glDisableVertexAttribArray); @@ -3576,9 +3452,9 @@ eng_gl_api_get(void *data) ORD(glGetRenderbufferParameteriv); ORD(glGetShaderiv); ORD(glGetShaderInfoLog); -// ORD(glGetShaderPrecisionFormat); + // ORD(glGetShaderPrecisionFormat); ORD(glGetShaderSource); -// ORD(glGetString); + // ORD(glGetString); ORD(glGetTexParameterfv); ORD(glGetTexParameteriv); ORD(glGetUniformfv); @@ -3600,11 +3476,11 @@ eng_gl_api_get(void *data) ORD(glPixelStorei); ORD(glPolygonOffset); ORD(glReadPixels); -// ORD(glReleaseShaderCompiler); + // ORD(glReleaseShaderCompiler); ORD(glRenderbufferStorage); ORD(glSampleCoverage); ORD(glScissor); -// ORD(glShaderBinary); + // ORD(glShaderBinary); ORD(glShaderSource); ORD(glStencilFunc); ORD(glStencilFuncSeparate); @@ -3703,7 +3579,7 @@ eng_gl_api_get(void *data) ORD(glExtGetProgramBinarySourceQCOM); #undef ORD -// Override functions wrapped by Evas_GL + // Override functions wrapped by Evas_GL #define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, evgl_) ORD(glBindFramebuffer); ORD(glBindRenderbuffer); @@ -3849,8 +3725,8 @@ module_open(Evas_Module *em) /* get whatever engine module we inherit from */ if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; if (_evas_engine_GL_X11_log_dom < 0) - _evas_engine_GL_X11_log_dom = eina_log_domain_register - ("evas-gl_x11", EVAS_DEFAULT_LOG_COLOR); + _evas_engine_GL_X11_log_dom = eina_log_domain_register + ("evas-gl_x11", EVAS_DEFAULT_LOG_COLOR); if (_evas_engine_GL_X11_log_dom < 0) { EINA_LOG_ERR("Can not create a module log domain."); @@ -3859,7 +3735,7 @@ module_open(Evas_Module *em) /* store it for later use */ func = pfunc; /* now to override methods */ - #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) ORD(info); ORD(info_free); ORD(setup); @@ -3979,8 +3855,8 @@ static Evas_Module_Api evas_modapi = "gl_x11", "none", { - module_open, - module_close + module_open, + module_close } }; diff --git a/src/modules/engines/gl_x11/evas_engine.h b/src/modules/engines/gl_x11/evas_engine.h index 4f62c58..007ed7d 100644 --- a/src/modules/engines/gl_x11/evas_engine.h +++ b/src/modules/engines/gl_x11/evas_engine.h @@ -12,8 +12,8 @@ #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) # if defined(GLES_VARIETY_S3C6410) -# include -# include +//# include +//# include # include # include # include @@ -21,9 +21,9 @@ # include // xres - dpi # elif defined(GLES_VARIETY_SGX) # define SUPPORT_X11 1 -# include -# include -# include +//# include +//# include +//# include # include # include # include @@ -36,9 +36,9 @@ # include # include # include // xres - dpi -# include -# include -# include +//# include +//# include +//# include #endif extern int _evas_engine_GL_X11_log_dom ; diff --git a/src/modules/engines/gl_x11/evas_x_main.c b/src/modules/engines/gl_x11/evas_x_main.c index 323c976..89fbd82 100644 --- a/src/modules/engines/gl_x11/evas_x_main.c +++ b/src/modules/engines/gl_x11/evas_x_main.c @@ -24,13 +24,13 @@ static int win_count = 0; Evas_GL_X11_Window * eng_window_new(Display *disp, - Window win, - int screen, - Visual *vis, - Colormap cmap, - int depth, - int w, - int h, + Window win, + int screen, + Visual *vis, + Colormap cmap, + int depth, + int w, + int h, int indirect, int alpha, int rot) @@ -71,17 +71,17 @@ eng_window_new(Display *disp, vi_use = _evas_gl_x11_rgba_vi; } #else -//#ifdef NEWGL + //#ifdef NEWGL if (_evas_gl_x11_rgba_vi) { vi_use = _evas_gl_x11_rgba_vi; } -//#endif + //#endif #endif } gw->visualinfo = vi_use; -// EGL / GLES + // EGL / GLES #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION; context_attrs[1] = 2; @@ -130,14 +130,14 @@ eng_window_new(Display *disp, config_attrs[n++] = EGL_RENDERABLE_TYPE; config_attrs[n++] = EGL_OPENGL_ES2_BIT; #if 0 -// FIXME: n900 - omap3 sgx libs break here + // FIXME: n900 - omap3 sgx libs break here config_attrs[n++] = EGL_RED_SIZE; config_attrs[n++] = 1; config_attrs[n++] = EGL_GREEN_SIZE; config_attrs[n++] = 1; config_attrs[n++] = EGL_BLUE_SIZE; config_attrs[n++] = 1; -// FIXME: end n900 breakage + // FIXME: end n900 breakage #endif if (gw->alpha) { @@ -156,68 +156,68 @@ eng_window_new(Display *disp, config_attrs[n++] = EGL_NONE; # endif - gw->egl_disp = eglGetDisplay((EGLNativeDisplayType)(gw->disp)); + gw->egl_disp = glsym_eglGetDisplay((EGLNativeDisplayType)(gw->disp)); if (!gw->egl_disp) { - ERR("eglGetDisplay() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglGetDisplay() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } - if (!eglInitialize(gw->egl_disp, &major_version, &minor_version)) + if (!glsym_eglInitialize(gw->egl_disp, &major_version, &minor_version)) { - ERR("eglInitialize() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglInitialize() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } - eglBindAPI(EGL_OPENGL_ES_API); - if (eglGetError() != EGL_SUCCESS) + glsym_eglBindAPI(EGL_OPENGL_ES_API); + if (glsym_eglGetError() != EGL_SUCCESS) { - ERR("eglBindAPI() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglBindAPI() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } num_config = 0; - if (!eglChooseConfig(gw->egl_disp, config_attrs, &gw->egl_config, - 1, &num_config) || (num_config != 1)) + if (!glsym_eglChooseConfig(gw->egl_disp, config_attrs, &gw->egl_config, + 1, &num_config) || (num_config != 1)) { - ERR("eglChooseConfig() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglChooseConfig() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } - gw->egl_surface[0] = eglCreateWindowSurface(gw->egl_disp, gw->egl_config, - (EGLNativeWindowType)gw->win, - NULL); + gw->egl_surface[0] = glsym_eglCreateWindowSurface(gw->egl_disp, gw->egl_config, + (EGLNativeWindowType)gw->win, + NULL); if (gw->egl_surface[0] == EGL_NO_SURFACE) { - ERR("eglCreateWindowSurface() fail for %#x. code=%#x", - (unsigned int)gw->win, eglGetError()); - eng_window_free(gw); + ERR("glsym_eglCreateWindowSurface() fail for %#x. code=%#x", + (unsigned int)gw->win, glsym_eglGetError()); + eng_window_free(gw); return NULL; } if (context == EGL_NO_CONTEXT) - context = eglCreateContext(gw->egl_disp, gw->egl_config, NULL, - context_attrs); + context = glsym_eglCreateContext(gw->egl_disp, gw->egl_config, NULL, + context_attrs); gw->egl_context[0] = context; if (gw->egl_context[0] == EGL_NO_CONTEXT) { - ERR("eglCreateContext() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglCreateContext() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } - if (eglMakeCurrent(gw->egl_disp, - gw->egl_surface[0], - gw->egl_surface[0], - gw->egl_context[0]) == EGL_FALSE) + if (glsym_eglMakeCurrent(gw->egl_disp, + gw->egl_surface[0], + gw->egl_surface[0], + gw->egl_context[0]) == EGL_FALSE) { - ERR("eglMakeCurrent() fail. code=%#x", eglGetError()); - eng_window_free(gw); + ERR("glsym_eglMakeCurrent() fail. code=%#x", glsym_eglGetError()); + eng_window_free(gw); return NULL; } - vendor = glGetString(GL_VENDOR); - renderer = glGetString(GL_RENDERER); - version = glGetString(GL_VERSION); + vendor = glsym_glGetString(GL_VENDOR); + renderer = glsym_glGetString(GL_RENDERER); + version = glsym_glGetString(GL_VERSION); if (!vendor) vendor = (unsigned char *)"-UNKNOWN-"; if (!renderer) renderer = (unsigned char *)"-UNKNOWN-"; if (!version) version = (unsigned char *)"-UNKNOWN-"; @@ -227,45 +227,45 @@ eng_window_new(Display *disp, fprintf(stderr, "renderer: %s\n", renderer); fprintf(stderr, "version: %s\n", version); } -// GLX + // GLX #else if (!context) { #ifdef NEWGL if (indirect) - context = glXCreateNewContext(gw->disp, fbconf, - GLX_RGBA_TYPE, NULL, - GL_FALSE); + context = glsym_glXCreateNewContext(gw->disp, fbconf, + GLX_RGBA_TYPE, NULL, + GL_FALSE); else - context = glXCreateNewContext(gw->disp, fbconf, - GLX_RGBA_TYPE, NULL, - GL_TRUE); + context = glsym_glXCreateNewContext(gw->disp, fbconf, + GLX_RGBA_TYPE, NULL, + GL_TRUE); #else if (indirect) - context = glXCreateContext(gw->disp, gw->visualinfo, NULL, GL_FALSE); + context = glsym_glXCreateContext(gw->disp, gw->visualinfo, NULL, GL_FALSE); else - context = glXCreateContext(gw->disp, gw->visualinfo, NULL, GL_TRUE); + context = glsym_glXCreateContext(gw->disp, gw->visualinfo, NULL, GL_TRUE); #endif } #ifdef NEWGL if ((gw->alpha) && (!rgba_context)) { if (indirect) - rgba_context = glXCreateNewContext(gw->disp, rgba_fbconf, - GLX_RGBA_TYPE, context, - GL_FALSE); + rgba_context = glsym_glXCreateNewContext(gw->disp, rgba_fbconf, + GLX_RGBA_TYPE, context, + GL_FALSE); else - rgba_context = glXCreateNewContext(gw->disp, rgba_fbconf, - GLX_RGBA_TYPE, context, - GL_TRUE); + rgba_context = glsym_glXCreateNewContext(gw->disp, rgba_fbconf, + GLX_RGBA_TYPE, context, + GL_TRUE); } if (gw->alpha) - gw->glxwin = glXCreateWindow(gw->disp, rgba_fbconf, gw->win, NULL); + gw->glxwin = glsym_glXCreateWindow(gw->disp, rgba_fbconf, gw->win, NULL); else - gw->glxwin = glXCreateWindow(gw->disp, fbconf, gw->win, NULL); + gw->glxwin = glsym_glXCreateWindow(gw->disp, fbconf, gw->win, NULL); if (!gw->glxwin) { - eng_window_free(gw); + eng_window_free(gw); return NULL; } @@ -277,7 +277,7 @@ eng_window_new(Display *disp, if (!gw->context) { - eng_window_free(gw); + eng_window_free(gw); return NULL; } if (gw->context) @@ -288,19 +288,19 @@ eng_window_new(Display *disp, if (gw->glxwin) { - if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, - gw->context)) + if (!glsym_glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, + gw->context)) { - printf("Error: glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); + printf("Error: glsym_glXMakeContextCurrent(%p, %p, %p, %p)\n", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); eng_window_free(gw); return NULL; } } else { - if (!glXMakeCurrent(gw->disp, gw->win, gw->context)) + if (!glsym_glXMakeCurrent(gw->disp, gw->win, gw->context)) { - printf("Error: glXMakeCurrent(%p, 0x%x, %p) failed\n", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context); + printf("Error: glsym_glXMakeCurrent(%p, 0x%x, %p) failed\n", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context); eng_window_free(gw); return NULL; } @@ -308,9 +308,9 @@ eng_window_new(Display *disp, // FIXME: move this up to context creation - vendor = glGetString(GL_VENDOR); - renderer = glGetString(GL_RENDERER); - version = glGetString(GL_VERSION); + vendor = glsym_glGetString(GL_VENDOR); + renderer = glsym_glGetString(GL_RENDERER); + version = glsym_glGetString(GL_VERSION); if (getenv("EVAS_GL_INFO")) { fprintf(stderr, "vendor: %s\n", vendor); @@ -416,10 +416,10 @@ eng_window_new(Display *disp, // noothing yet. add more cases and options over time } - fbc = glXGetFBConfigs(gw->disp, screen, &num); + fbc = glsym_glXGetFBConfigs(gw->disp, screen, &num); if (!fbc) { - ERR("glXGetFBConfigs() returned no fb configs"); + ERR("glsym_glXGetFBConfigs() returned no fb configs"); eng_window_free(gw); return NULL; } @@ -432,15 +432,15 @@ eng_window_new(Display *disp, int alph, val, dbuf, stencil, tdepth; int rgba; - vi = glXGetVisualFromFBConfig(gw->disp, fbc[j]); + vi = glsym_glXGetVisualFromFBConfig(gw->disp, fbc[j]); if (!vi) continue; vd = vi->depth; XFree(vi); if (vd != i) continue; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_ALPHA_SIZE, &alph); - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BUFFER_SIZE, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_ALPHA_SIZE, &alph); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BUFFER_SIZE, &val); if ((val != i) && ((val - alph) != i)) continue; @@ -449,7 +449,7 @@ eng_window_new(Display *disp, if (i == 32) { - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_RGBA_EXT, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_RGBA_EXT, &val); if (val) { rgba = 1; @@ -459,34 +459,34 @@ eng_window_new(Display *disp, if (!val) { if (rgba) continue; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_RGB_EXT, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_RGB_EXT, &val); if (!val) continue; gw->depth_cfg[i].tex_format = GLX_TEXTURE_FORMAT_RGB_EXT; } dbuf = 0x7fff; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_DOUBLEBUFFER, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_DOUBLEBUFFER, &val); if (val > dbuf) continue; dbuf = val; stencil = 0x7fff; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_STENCIL_SIZE, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_STENCIL_SIZE, &val); if (val > stencil) continue; stencil = val; tdepth = 0x7fff; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_DEPTH_SIZE, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_DEPTH_SIZE, &val); if (val > tdepth) continue; tdepth = val; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &val); if (val < 0) continue; gw->depth_cfg[i].mipmap = val; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_Y_INVERTED_EXT, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_Y_INVERTED_EXT, &val); gw->depth_cfg[i].yinvert = val; - glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &val); + glsym_glXGetFBConfigAttrib(gw->disp, fbc[j], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &val); gw->depth_cfg[i].tex_target = val; gw->depth_cfg[i].fbc = fbc[j]; @@ -503,8 +503,8 @@ eng_window_new(Display *disp, gw->gl_context = evas_gl_common_context_new(); if (!gw->gl_context) { - eng_window_free(gw); - return NULL; + eng_window_free(gw); + return NULL; } #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) gw->gl_context->egldisp = gw->egl_disp; @@ -530,20 +530,20 @@ eng_window_free(Evas_GL_X11_Window *gw) } #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (gw->egl_surface[0] != EGL_NO_SURFACE) - eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); + glsym_eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); if (ref == 0) { - if (context) eglDestroyContext(gw->egl_disp, context); - eglTerminate(gw->egl_disp); + if (context) glsym_eglDestroyContext(gw->egl_disp, context); + glsym_eglTerminate(gw->egl_disp); context = EGL_NO_CONTEXT; } - eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + glsym_eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); #else - if (gw->glxwin) glXDestroyWindow(gw->disp, gw->glxwin); + if (gw->glxwin) glsym_glXDestroyWindow(gw->disp, gw->glxwin); if (ref == 0) { - if (context) glXDestroyContext(gw->disp, context); - if (rgba_context) glXDestroyContext(gw->disp, rgba_context); + if (context) glsym_glXDestroyContext(gw->disp, context); + if (rgba_context) glsym_glXDestroyContext(gw->disp, rgba_context); context = 0; rgba_context = 0; fbconf = 0; @@ -561,18 +561,18 @@ eng_window_use(Evas_GL_X11_Window *gw) #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (_evas_gl_x11_window) { - if ((eglGetCurrentContext() != + if ((glsym_eglGetCurrentContext() != _evas_gl_x11_window->egl_context[0]) || - (eglGetCurrentSurface(EGL_READ) != - _evas_gl_x11_window->egl_surface[0]) || - (eglGetCurrentSurface(EGL_DRAW) != - _evas_gl_x11_window->egl_surface[0])) + (glsym_eglGetCurrentSurface(EGL_READ) != + _evas_gl_x11_window->egl_surface[0]) || + (glsym_eglGetCurrentSurface(EGL_DRAW) != + _evas_gl_x11_window->egl_surface[0])) force_use = EINA_TRUE; } #else if (_evas_gl_x11_window) { - if (glXGetCurrentContext() != _evas_gl_x11_window->context) + if (glsym_glXGetCurrentContext() != _evas_gl_x11_window->context) force_use = EINA_TRUE; } #endif @@ -586,35 +586,35 @@ eng_window_use(Evas_GL_X11_Window *gw) _evas_gl_x11_window = gw; if (gw) { -// EGL / GLES + // EGL / GLES #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - if (gw->egl_surface[0] != EGL_NO_SURFACE) - { - if (eglMakeCurrent(gw->egl_disp, - gw->egl_surface[0], - gw->egl_surface[0], - gw->egl_context[0]) == EGL_FALSE) - { - ERR("eglMakeCurrent() failed!"); - } - } -// GLX + if (gw->egl_surface[0] != EGL_NO_SURFACE) + { + if (glsym_eglMakeCurrent(gw->egl_disp, + gw->egl_surface[0], + gw->egl_surface[0], + gw->egl_context[0]) == EGL_FALSE) + { + ERR("glsym_eglMakeCurrent() failed!"); + } + } + // GLX #else - if (gw->glxwin) - { - if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, - gw->context)) - { - ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); - } - } - else - { - if (!glXMakeCurrent(gw->disp, gw->win, gw->context)) - { - ERR("glXMakeCurrent(%p, 0x%x, %p) failed", gw->disp, (unsigned int)gw->win, (void *)gw->context); - } - } + if (gw->glxwin) + { + if (!glsym_glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, + gw->context)) + { + ERR("glsym_glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); + } + } + else + { + if (!glsym_glXMakeCurrent(gw->disp, gw->win, gw->context)) + { + ERR("glsym_glXMakeCurrent(%p, 0x%x, %p) failed", gw->disp, (unsigned int)gw->win, (void *)gw->context); + } + } #endif } } @@ -633,17 +633,17 @@ eng_window_unsurf(Evas_GL_X11_Window *gw) evas_gl_common_context_flush(_evas_gl_x11_window->gl_context); if (_evas_gl_x11_window == gw) { - eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + glsym_eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (gw->egl_surface[0] != EGL_NO_SURFACE) - eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); + glsym_eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); gw->egl_surface[0] = EGL_NO_SURFACE; _evas_gl_x11_window = NULL; } #else if (gw->glxwin) - { - glXDestroyWindow(gw->disp, gw->glxwin); - } + { + glsym_glXDestroyWindow(gw->disp, gw->glxwin); + } else { } @@ -658,37 +658,37 @@ eng_window_resurf(Evas_GL_X11_Window *gw) if (getenv("EVAS_GL_INFO")) printf("resurf %p\n", gw); #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) - gw->egl_surface[0] = eglCreateWindowSurface(gw->egl_disp, gw->egl_config, - (EGLNativeWindowType)gw->win, - NULL); + gw->egl_surface[0] = glsym_eglCreateWindowSurface(gw->egl_disp, gw->egl_config, + (EGLNativeWindowType)gw->win, + NULL); if (gw->egl_surface[0] == EGL_NO_SURFACE) { - ERR("eglCreateWindowSurface() fail for %#x. code=%#x", - (unsigned int)gw->win, eglGetError()); + ERR("glsym_eglCreateWindowSurface() fail for %#x. code=%#x", + (unsigned int)gw->win, glsym_eglGetError()); return; } - if (eglMakeCurrent(gw->egl_disp, - gw->egl_surface[0], - gw->egl_surface[0], - gw->egl_context[0]) == EGL_FALSE) + if (glsym_eglMakeCurrent(gw->egl_disp, + gw->egl_surface[0], + gw->egl_surface[0], + gw->egl_context[0]) == EGL_FALSE) { - ERR("eglMakeCurrent() failed!"); + ERR("glsym_eglMakeCurrent() failed!"); } #else #ifdef NEWGL if (gw->alpha) - gw->glxwin = glXCreateWindow(gw->disp, rgba_fbconf, gw->win, NULL); + gw->glxwin = glsym_glXCreateWindow(gw->disp, rgba_fbconf, gw->win, NULL); else - gw->glxwin = glXCreateWindow(gw->disp, fbconf, gw->win, NULL); - if (!glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, - gw->context)) + gw->glxwin = glsym_glXCreateWindow(gw->disp, fbconf, gw->win, NULL); + if (!glsym_glXMakeContextCurrent(gw->disp, gw->glxwin, gw->glxwin, + gw->context)) { - ERR("glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); + ERR("glsym_glXMakeContextCurrent(%p, %p, %p, %p)", (void *)gw->disp, (void *)gw->glxwin, (void *)gw->glxwin, (void *)gw->context); } #else - if (!glXMakeCurrent(gw->disp, gw->win, gw->context)) + if (!glsym_glXMakeCurrent(gw->disp, gw->win, gw->context)) { - ERR("glXMakeCurrent(%p, 0x%x, %p) failed", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context); + ERR("glsym_glXMakeCurrent(%p, 0x%x, %p) failed", (void *)gw->disp, (unsigned int)gw->win, (void *)gw->context); } #endif #endif @@ -704,7 +704,7 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) { int alpha; -// EGL / GLES + // EGL / GLES #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) for (alpha = 0; alpha < 2; alpha++) { @@ -733,10 +733,10 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) (fmt->direct.alphaMask)) { _evas_gl_x11_rgba_vi = - calloc(1, sizeof(XVisualInfo)); + calloc(1, sizeof(XVisualInfo)); if (_evas_gl_x11_rgba_vi) - memcpy(_evas_gl_x11_rgba_vi, - &(xvi[i]), sizeof(XVisualInfo)); + memcpy(_evas_gl_x11_rgba_vi, + &(xvi[i]), sizeof(XVisualInfo)); break; } } @@ -751,7 +751,7 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) _evas_gl_x11_vi); } } -// GLX + // GLX #else for (alpha = 0; alpha < 2; alpha++) { @@ -793,13 +793,13 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) config_attrs[i++] = GLX_TRANSPARENT_TYPE; config_attrs[i++] = GLX_NONE;//GLX_NONE;//GLX_TRANSPARENT_INDEX//GLX_TRANSPARENT_RGB; config_attrs[i++] = 0; - - configs = glXChooseFBConfig(einfo->info.display, - einfo->info.screen, - config_attrs, &num); + + configs = glsym_glXChooseFBConfig(einfo->info.display, + einfo->info.screen, + config_attrs, &num); if ((!configs) || (num < 1)) { - ERR("glXChooseFBConfig returned no configs"); + ERR("glsym_glXChooseFBConfig returned no configs"); return NULL; } for (i = 0; i < num; i++) @@ -807,8 +807,8 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) XVisualInfo *visinfo; XRenderPictFormat *format = NULL; - visinfo = glXGetVisualFromFBConfig(einfo->info.display, - configs[i]); + visinfo = glsym_glXGetVisualFromFBConfig(einfo->info.display, + configs[i]); if (!visinfo) continue; if (!alpha) { @@ -822,7 +822,7 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) else { format = XRenderFindVisualFormat - (einfo->info.display, visinfo->visual); + (einfo->info.display, visinfo->visual); if (!format) { XFree(visinfo); @@ -846,13 +846,13 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) if (!_evas_gl_x11_vi) return NULL; if (einfo->info.destination_alpha) { -// EGL / GLES + // EGL / GLES #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX) if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->visual; #else -//# ifdef NEWGL + //# ifdef NEWGL if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->visual; -//# endif + //# endif #endif } return _evas_gl_x11_vi->visual; @@ -868,21 +868,21 @@ eng_best_colormap_get(Evas_Engine_Info_GL_X11 *einfo) if (einfo->info.destination_alpha) { if (!_evas_gl_x11_rgba_cmap) - _evas_gl_x11_rgba_cmap = - XCreateColormap(einfo->info.display, - RootWindow(einfo->info.display, - einfo->info.screen), - _evas_gl_x11_rgba_vi->visual, - 0); + _evas_gl_x11_rgba_cmap = + XCreateColormap(einfo->info.display, + RootWindow(einfo->info.display, + einfo->info.screen), + _evas_gl_x11_rgba_vi->visual, + 0); return _evas_gl_x11_rgba_cmap; } if (!_evas_gl_x11_cmap) - _evas_gl_x11_cmap = - XCreateColormap(einfo->info.display, - RootWindow(einfo->info.display, - einfo->info.screen), - _evas_gl_x11_vi->visual, - 0); + _evas_gl_x11_cmap = + XCreateColormap(einfo->info.display, + RootWindow(einfo->info.display, + einfo->info.screen), + _evas_gl_x11_vi->visual, + 0); return _evas_gl_x11_cmap; } -- 2.7.4