#include "evas_gl_core_private.h" #include "evas_gl_api_ext.h" #define EVGL_FUNC_BEGIN() \ { \ _func_begin_debug(__FUNCTION__); \ } #define EVGL_FUNC_END() #define _EVGL_INT_INIT_VALUE -3 //---------------------------------------// // API Debug Error Checking Code static void _make_current_check(const char* api) { EVGL_Context *ctx = NULL; ctx = _evgl_current_context_get(); if (!ctx) { CRIT("\e[1;33m%s\e[m: Current Context NOT SET: GL Call Should NOT Be Called without MakeCurrent!!!", api); } } static void _direct_rendering_check(const char *api) { EVGL_Context *ctx = NULL; ctx = _evgl_current_context_get(); if (!ctx) { ERR("Current Context Not Set"); return; } if (_evgl_not_in_pixel_get(evgl_engine)) { CRIT("\e[1;33m%s\e[m: This API is being called outside Pixel Get Callback Function.", api); } } static void _func_begin_debug(const char *api) { _make_current_check(api); _direct_rendering_check(api); } //-------------------------------------------------------------// // GL to GLES Compatibility Functions //-------------------------------------------------------------// void _evgl_glBindFramebuffer(GLenum target, GLuint framebuffer) { EVGL_Context *ctx = NULL; ctx = _evgl_current_context_get(); if (!ctx) { ERR("No current context set."); return; } // Take care of BindFramebuffer 0 issue if (framebuffer==0) { if (evgl_direct_enabled(evgl_engine)) glBindFramebuffer(target, 0); else glBindFramebuffer(target, ctx->surface_fbo); ctx->current_fbo = 0; } else { glBindFramebuffer(target, framebuffer); // Save this for restore when doing make current ctx->current_fbo = framebuffer; } } void _evgl_glClearDepthf(GLclampf depth) { #ifdef GL_GLES glClearDepthf(depth); #else glClearDepth(depth); #endif } void _evgl_glDepthRangef(GLclampf zNear, GLclampf zFar) { #ifdef GL_GLES glDepthRangef(zNear, zFar); #else glDepthRange(zNear, zFar); #endif } void _evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { #ifdef GL_GLES glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); #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; if (shadertype) shadertype = precisiontype = 0; #endif } void _evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) { #ifdef GL_GLES glShaderBinary(n, shaders, binaryformat, binary, length); #else // FIXME: need to dlsym/getprocaddress for this ERR("Binary Shader is not supported here yet."); return; n = binaryformat = length = 0; shaders = binary = 0; #endif } void _evgl_glReleaseShaderCompiler(void) { #ifdef GL_GLES glReleaseShaderCompiler(); #else #endif } //-------------------------------------------------------------// // Calls related to Evas GL Direct Rendering //-------------------------------------------------------------// // Transform from Evas Coordinat to GL Coordinate // returns: oc[4] original image object dimension in gl coord // returns: nc[4] tranformed (x, y, width, heigth) in gl coord static void compute_gl_coordinates(Evas_Object *obj, int rot, int clip, int x, int y, int width, int height, int imgc[4], int objc[4]) { Evas_Object_Protected_Data *pd = eo_data_get(obj, EVAS_OBJ_CLASS); if (rot == 0) { // oringinal image object coordinate in gl coordinate imgc[0] = pd->cur.geometry.x; imgc[1] = pd->layer->evas->output.h - pd->cur.geometry.y - pd->cur.geometry.h; imgc[2] = imgc[0] + pd->cur.geometry.w; imgc[3] = imgc[1] + pd->cur.geometry.h; // transformed (x,y,width,height) in gl coordinate objc[0] = imgc[0] + x; objc[1] = imgc[1] + y; objc[2] = objc[0] + width; objc[3] = objc[1] + height; } else if (rot == 180) { // oringinal image object coordinate in gl coordinate imgc[0] = pd->layer->evas->output.w - pd->cur.geometry.x - pd->cur.geometry.w; imgc[1] = pd->cur.geometry.y; imgc[2] = imgc[0] + pd->cur.geometry.w; imgc[3] = imgc[1] + pd->cur.geometry.h; // transformed (x,y,width,height) in gl coordinate objc[0] = imgc[0] + pd->cur.geometry.w - x - width; objc[1] = imgc[1] + pd->cur.geometry.h - y - height; objc[2] = objc[0] + width; objc[3] = objc[1] + height; } else if (rot == 90) { // oringinal image object coordinate in gl coordinate imgc[0] = pd->cur.geometry.y; imgc[1] = pd->cur.geometry.x; imgc[2] = imgc[0] + pd->cur.geometry.h; imgc[3] = imgc[1] + pd->cur.geometry.w; // transformed (x,y,width,height) in gl coordinate objc[0] = imgc[0] + pd->cur.geometry.h - y - height; objc[1] = imgc[1] + x; objc[2] = objc[0] + height; objc[3] = objc[1] + width; } else if (rot == 270) { // oringinal image object coordinate in gl coordinate imgc[0] = pd->layer->evas->output.h - pd->cur.geometry.y - pd->cur.geometry.h; imgc[1] = pd->layer->evas->output.w - pd->cur.geometry.x - pd->cur.geometry.w; imgc[2] = imgc[0] + pd->cur.geometry.h; imgc[3] = imgc[1] + pd->cur.geometry.w; // transformed (x,y,width,height) in gl coordinate objc[0] = imgc[0] + y; objc[1] = imgc[1] + pd->cur.geometry.w - x - width; objc[2] = objc[0] + height; objc[3] = objc[1] + width; } else { ERR("Invalid rotation angle %d.", rot); return; } if (clip) { // Clip against original image object if (objc[0] < imgc[0]) objc[0] = imgc[0]; if (objc[0] > imgc[2]) objc[0] = imgc[2]; if (objc[1] < imgc[1]) objc[1] = imgc[1]; if (objc[1] > imgc[3]) objc[1] = imgc[3]; if (objc[2] < imgc[0]) objc[2] = imgc[0]; if (objc[2] > imgc[2]) objc[2] = imgc[2]; if (objc[3] < imgc[1]) objc[3] = imgc[1]; if (objc[3] > imgc[3]) objc[3] = imgc[3]; } imgc[2] = imgc[2]-imgc[0]; // width imgc[3] = imgc[3]-imgc[1]; // height objc[2] = objc[2]-objc[0]; // width objc[3] = objc[3]-objc[1]; // height } static void _evgl_glClear(GLbitfield mask) { EVGL_Engine *ee = evgl_engine; EVGL_Resource *rsc; EVGL_Context *ctx; Evas_Object *img; int rot = 0; int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}; if (!(rsc=_evgl_tls_resource_get(ee))) { ERR("Unable to execute GL command. Error retrieving tls"); return; } ctx = rsc->current_ctx; if (!ctx) { ERR("Unable to retrive Current Context"); return; } if (evgl_direct_enabled(evgl_engine)) { if (!(rsc->current_ctx->current_fbo)) { if ((!ctx->direct_scissor)) { glEnable(GL_SCISSOR_TEST); ctx->direct_scissor = 1; } img = rsc->direct_img_obj; rot = ee->funcs->rotation_angle_get(ee->engine_data); compute_gl_coordinates(img, rot, 0, 0, 0, 0, 0, oc, nc); if ((ctx->scissor_upated) && (ctx->scissor_enabled)) { glScissor(ctx->dr_scissor_coord[0], ctx->dr_scissor_coord[1], ctx->dr_scissor_coord[2], ctx->dr_scissor_coord[3]); ctx->direct_scissor = 0; } else glScissor(oc[0], oc[1], oc[2], oc[3]); glClear(mask); } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glClear(mask); } } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glClear(mask); } } static void _evgl_glEnable(GLenum cap) { EVGL_Context *ctx; ctx = _evgl_current_context_get(); if (cap == GL_SCISSOR_TEST) if (ctx) ctx->scissor_enabled = 1; glEnable(cap); } static void _evgl_glDisable(GLenum cap) { EVGL_Context *ctx; ctx = _evgl_current_context_get(); if (cap == GL_SCISSOR_TEST) if (ctx) ctx->scissor_enabled = 0; glDisable(cap); } void _evgl_glGetIntegerv(GLenum pname, GLint* params) { EVGL_Engine *ee = evgl_engine; EVGL_Resource *rsc; EVGL_Context *ctx; Evas_Object_Protected_Data *img; if (evgl_direct_enabled(evgl_engine)) { if (!params) { ERR("Inavlid Parameter"); return; } rsc=_evgl_tls_resource_get(ee); ctx = rsc->current_ctx; // Only need to handle it if it's directly rendering to the window if (!(rsc->current_ctx->current_fbo)) { img = eo_data_get(rsc->direct_img_obj, EVAS_OBJ_CLASS); if (pname==GL_SCISSOR_BOX) { if (ctx->scissor_upated) { memcpy(params, ctx->scissor_coord, sizeof(int)*4); return; } } if (pname==GL_VIEWPORT) { if (ctx->viewport_updated) { memcpy(params, ctx->viewport_coord, sizeof(int)*4); return; } } // If it hasn't been initialized yet, return img object size if ((pname==GL_SCISSOR_BOX) || (pname==GL_VIEWPORT)) { params[0] = 0; params[1] = 0; params[2] = (GLint)img->cur.geometry.w; params[3] = (GLint)img->cur.geometry.h; return; } } } glGetIntegerv(pname, params); } static void _evgl_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { EVGL_Engine *ee = evgl_engine; EVGL_Resource *rsc; EVGL_Context *ctx; Evas_Object *img; int rot = 0; int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}; if (!(rsc=_evgl_tls_resource_get(ee))) { ERR("Unable to execute GL command. Error retrieving tls"); return; } ctx = rsc->current_ctx; if (!ctx) { ERR("Unable to retrive Current Context"); return; } if (evgl_direct_enabled(evgl_engine)) { if (!(rsc->current_ctx->current_fbo)) { img = rsc->direct_img_obj; rot = ee->funcs->rotation_angle_get(ee->engine_data); compute_gl_coordinates(img, rot, 1, x, y, width, height, oc, nc); glReadPixels(nc[0], nc[1], nc[2], nc[3], format, type, pixels); } else { glReadPixels(x, y, width, height, format, type, pixels); } } else { glReadPixels(x, y, width, height, format, type, pixels); } } static void _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { EVGL_Engine *ee = evgl_engine; EVGL_Resource *rsc; EVGL_Context *ctx; Evas_Object *img; int rot = 0; int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}; if (!(rsc=_evgl_tls_resource_get(ee))) { ERR("Unable to execute GL command. Error retrieving tls"); return; } ctx = rsc->current_ctx; if (!ctx) { ERR("Unable to retrive Current Context"); return; } if (evgl_direct_enabled(evgl_engine)) { if (!(rsc->current_ctx->current_fbo)) { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); } img = rsc->direct_img_obj; rot = ee->funcs->rotation_angle_get(ee->engine_data); compute_gl_coordinates(img, rot, 1, x, y, width, height, oc, nc); glScissor(nc[0], nc[1], nc[2], nc[3]); // Keep a copy of the original coordinates ctx->scissor_coord[0] = x; ctx->scissor_coord[1] = y; ctx->scissor_coord[2] = width; ctx->scissor_coord[3] = height; // Update direct rendering coordinates ctx->dr_scissor_coord[0] = nc[0]; ctx->dr_scissor_coord[1] = nc[1]; ctx->dr_scissor_coord[2] = nc[2]; ctx->dr_scissor_coord[3] = nc[3]; ctx->direct_scissor = 0; // Check....!!!! ctx->scissor_upated = 1; } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glScissor(x, y, width, height); ctx->scissor_upated = 0; } } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glScissor(x, y, width, height); } } static void _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { EVGL_Engine *ee = evgl_engine; EVGL_Resource *rsc; EVGL_Context *ctx; Evas_Object *img; int rot = 0; int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}; if (!(rsc=_evgl_tls_resource_get(ee))) { ERR("Unable to execute GL command. Error retrieving tls"); return; } ctx = rsc->current_ctx; if (!ctx) { ERR("Unable to retrive Current Context"); return; } if (evgl_direct_enabled(evgl_engine)) { if (!(rsc->current_ctx->current_fbo)) { if ((!ctx->direct_scissor)) { glEnable(GL_SCISSOR_TEST); ctx->direct_scissor = 1; } img = rsc->direct_img_obj; rot = ee->funcs->rotation_angle_get(ee->engine_data); compute_gl_coordinates(img, rot, 0, x, y, width, height, oc, nc); if ((ctx->scissor_upated) && (ctx->scissor_enabled)) { glScissor(ctx->dr_scissor_coord[0], ctx->dr_scissor_coord[1], ctx->dr_scissor_coord[2], ctx->dr_scissor_coord[3]); ctx->direct_scissor = 0; } else glScissor(oc[0], oc[1], oc[2], oc[3]); glViewport(nc[0], nc[1], nc[2], nc[3]); // Keep a copy of the original coordinates ctx->viewport_coord[0] = x; ctx->viewport_coord[1] = y; ctx->viewport_coord[2] = width; ctx->viewport_coord[3] = height; ctx->viewport_updated = 1; } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glViewport(x, y, width, height); } } else { if ((ctx->direct_scissor) && (!ctx->scissor_enabled)) { glDisable(GL_SCISSOR_TEST); ctx->direct_scissor = 0; } glViewport(x, y, width, height); } } //-------------------------------------------------------------// //-------------------------------------------------------------// // Debug Evas GL APIs // - GL APIs Overriden for debugging purposes //-------------------------------------------------------------// void _evgld_glActiveTexture(GLenum texture) { EVGL_FUNC_BEGIN(); glActiveTexture(texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glAttachShader(GLuint program, GLuint shader) { EVGL_FUNC_BEGIN(); glAttachShader(program, shader); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBindAttribLocation(GLuint program, GLuint index, const char* name) { EVGL_FUNC_BEGIN(); glBindAttribLocation(program, index, name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBindBuffer(GLenum target, GLuint buffer) { EVGL_FUNC_BEGIN(); glBindBuffer(target, buffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBindFramebuffer(GLenum target, GLuint framebuffer) { EVGL_FUNC_BEGIN(); _evgl_glBindFramebuffer(target, framebuffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBindRenderbuffer(GLenum target, GLuint renderbuffer) { EVGL_FUNC_BEGIN(); glBindRenderbuffer(target, renderbuffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBindTexture(GLenum target, GLuint texture) { EVGL_FUNC_BEGIN(); glBindTexture(target, texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { EVGL_FUNC_BEGIN(); glBlendColor(red, green, blue, alpha); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBlendEquation(GLenum mode) { EVGL_FUNC_BEGIN(); glBlendEquation(mode); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { EVGL_FUNC_BEGIN(); glBlendEquationSeparate(modeRGB, modeAlpha); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBlendFunc(GLenum sfactor, GLenum dfactor) { EVGL_FUNC_BEGIN(); glBlendFunc(sfactor, dfactor); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { EVGL_FUNC_BEGIN(); glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { EVGL_FUNC_BEGIN(); glBufferData(target, size, data, usage); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { EVGL_FUNC_BEGIN(); glBufferSubData(target, offset, size, data); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } GLenum _evgld_glCheckFramebufferStatus(GLenum target) { GLenum ret = GL_NONE; EVGL_FUNC_BEGIN(); ret = glCheckFramebufferStatus(target); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { EVGL_FUNC_BEGIN(); glClearColor(red, green, blue, alpha); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glClearDepthf(GLclampf depth) { EVGL_FUNC_BEGIN(); _evgl_glClearDepthf(depth); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glClearStencil(GLint s) { EVGL_FUNC_BEGIN(); glClearStencil(s); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { EVGL_FUNC_BEGIN(); glColorMask(red, green, blue, alpha); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glCompileShader(GLuint shader) { EVGL_FUNC_BEGIN(); glCompileShader(shader); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { EVGL_FUNC_BEGIN(); glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { EVGL_FUNC_BEGIN(); glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { EVGL_FUNC_BEGIN(); glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { EVGL_FUNC_BEGIN(); glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } GLuint _evgld_glCreateProgram(void) { GLuint ret = _EVGL_INT_INIT_VALUE; EVGL_FUNC_BEGIN(); ret = glCreateProgram(); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLuint _evgld_glCreateShader(GLenum type) { GLuint ret = _EVGL_INT_INIT_VALUE; EVGL_FUNC_BEGIN(); ret = glCreateShader(type); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glCullFace(GLenum mode) { EVGL_FUNC_BEGIN(); glCullFace(mode); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteBuffers(GLsizei n, const GLuint* buffers) { EVGL_FUNC_BEGIN(); glDeleteBuffers(n, buffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { EVGL_FUNC_BEGIN(); glDeleteFramebuffers(n, framebuffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteProgram(GLuint program) { EVGL_FUNC_BEGIN(); glDeleteProgram(program); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { EVGL_FUNC_BEGIN(); glDeleteRenderbuffers(n, renderbuffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteShader(GLuint shader) { EVGL_FUNC_BEGIN(); glDeleteShader(shader); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDeleteTextures(GLsizei n, const GLuint* textures) { EVGL_FUNC_BEGIN(); glDeleteTextures(n, textures); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDepthFunc(GLenum func) { EVGL_FUNC_BEGIN(); glDepthFunc(func); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDepthMask(GLboolean flag) { EVGL_FUNC_BEGIN(); glDepthMask(flag); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDepthRangef(GLclampf zNear, GLclampf zFar) { EVGL_FUNC_BEGIN(); _evgl_glDepthRangef(zNear, zFar); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDetachShader(GLuint program, GLuint shader) { EVGL_FUNC_BEGIN(); glDetachShader(program, shader); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDisableVertexAttribArray(GLuint index) { EVGL_FUNC_BEGIN(); glDisableVertexAttribArray(index); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDrawArrays(GLenum mode, GLint first, GLsizei count) { EVGL_FUNC_BEGIN(); glDrawArrays(mode, first, count); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) { EVGL_FUNC_BEGIN(); glDrawElements(mode, count, type, indices); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glEnableVertexAttribArray(GLuint index) { EVGL_FUNC_BEGIN(); glEnableVertexAttribArray(index); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glFinish(void) { EVGL_FUNC_BEGIN(); glFinish(); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glFlush(void) { EVGL_FUNC_BEGIN(); glFlush(); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { EVGL_FUNC_BEGIN(); glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { EVGL_FUNC_BEGIN(); glFramebufferTexture2D(target, attachment, textarget, texture, level); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glFrontFace(GLenum mode) { EVGL_FUNC_BEGIN(); glFrontFace(mode); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) { EVGL_FUNC_BEGIN(); glGetVertexAttribfv(index, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetVertexAttribiv(index, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) { EVGL_FUNC_BEGIN(); glGetVertexAttribPointerv(index, pname, pointer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glHint(GLenum target, GLenum mode) { EVGL_FUNC_BEGIN(); glHint(target, mode); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGenBuffers(GLsizei n, GLuint* buffers) { EVGL_FUNC_BEGIN(); glGenBuffers(n, buffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGenerateMipmap(GLenum target) { EVGL_FUNC_BEGIN(); glGenerateMipmap(target); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGenFramebuffers(GLsizei n, GLuint* framebuffers) { EVGL_FUNC_BEGIN(); glGenFramebuffers(n, framebuffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { EVGL_FUNC_BEGIN(); glGenRenderbuffers(n, renderbuffers); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGenTextures(GLsizei n, GLuint* textures) { EVGL_FUNC_BEGIN(); glGenTextures(n, textures); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) { EVGL_FUNC_BEGIN(); glGetActiveAttrib(program, index, bufsize, length, size, type, name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) { EVGL_FUNC_BEGIN(); glGetActiveUniform(program, index, bufsize, length, size, type, name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { EVGL_FUNC_BEGIN(); glGetAttachedShaders(program, maxcount, count, shaders); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } int _evgld_glGetAttribLocation(GLuint program, const char* name) { int ret = _EVGL_INT_INIT_VALUE; EVGL_FUNC_BEGIN(); ret = glGetAttribLocation(program, name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glGetBooleanv(GLenum pname, GLboolean* params) { EVGL_FUNC_BEGIN(); glGetBooleanv(pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetBufferParameteriv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } GLenum _evgld_glGetError(void) { GLenum ret = GL_NONE; EVGL_FUNC_BEGIN(); ret = glGetError(); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glGetFloatv(GLenum pname, GLfloat* params) { EVGL_FUNC_BEGIN(); glGetFloatv(pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetProgramiv(GLuint program, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetProgramiv(program, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { EVGL_FUNC_BEGIN(); glGetProgramInfoLog(program, bufsize, length, infolog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetRenderbufferParameteriv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetShaderiv(GLuint shader, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetShaderiv(shader, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { EVGL_FUNC_BEGIN(); glGetShaderInfoLog(shader, bufsize, length, infolog); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { EVGL_FUNC_BEGIN(); _evgl_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { EVGL_FUNC_BEGIN(); glGetShaderSource(shader, bufsize, length, source); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } const GLubyte * _evgld_glGetString(GLenum name) { const GLubyte *ret = NULL; EVGL_FUNC_BEGIN(); #if 0 if (name == GL_EXTENSIONS) return (GLubyte *)_gl_ext_string; //glGetString(GL_EXTENSIONS); else return glGetString(name); #endif ret = glGetString(name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { EVGL_FUNC_BEGIN(); glGetTexParameterfv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); glGetTexParameteriv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetUniformfv(GLuint program, GLint location, GLfloat* params) { EVGL_FUNC_BEGIN(); glGetUniformfv(program, location, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetUniformiv(GLuint program, GLint location, GLint* params) { EVGL_FUNC_BEGIN(); glGetUniformiv(program, location, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } int _evgld_glGetUniformLocation(GLuint program, const char* name) { int ret = _EVGL_INT_INIT_VALUE; EVGL_FUNC_BEGIN(); ret = glGetUniformLocation(program, name); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsBuffer(GLuint buffer) { GLboolean ret = GL_FALSE; EVGL_FUNC_BEGIN(); ret = glIsBuffer(buffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsEnabled(GLenum cap) { GLboolean ret = GL_FALSE; EVGL_FUNC_BEGIN(); ret = glIsEnabled(cap); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsFramebuffer(GLuint framebuffer) { GLboolean ret = GL_FALSE; EVGL_FUNC_BEGIN(); ret = glIsFramebuffer(framebuffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsProgram(GLuint program) { GLboolean ret; EVGL_FUNC_BEGIN(); ret = glIsProgram(program); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsRenderbuffer(GLuint renderbuffer) { GLboolean ret; EVGL_FUNC_BEGIN(); ret = glIsRenderbuffer(renderbuffer); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsShader(GLuint shader) { GLboolean ret; EVGL_FUNC_BEGIN(); ret = glIsShader(shader); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } GLboolean _evgld_glIsTexture(GLuint texture) { GLboolean ret; EVGL_FUNC_BEGIN(); ret = glIsTexture(texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); return ret; } void _evgld_glLineWidth(GLfloat width) { EVGL_FUNC_BEGIN(); glLineWidth(width); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glLinkProgram(GLuint program) { EVGL_FUNC_BEGIN(); glLinkProgram(program); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glPixelStorei(GLenum pname, GLint param) { EVGL_FUNC_BEGIN(); glPixelStorei(pname, param); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glPolygonOffset(GLfloat factor, GLfloat units) { EVGL_FUNC_BEGIN(); glPolygonOffset(factor, units); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glReleaseShaderCompiler(void) { EVGL_FUNC_BEGIN(); _evgl_glReleaseShaderCompiler(); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { EVGL_FUNC_BEGIN(); glRenderbufferStorage(target, internalformat, width, height); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glSampleCoverage(GLclampf value, GLboolean invert) { EVGL_FUNC_BEGIN(); glSampleCoverage(value, invert); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) { EVGL_FUNC_BEGIN(); _evgl_glShaderBinary(n, shaders, binaryformat, binary, length); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length) { EVGL_FUNC_BEGIN(); glShaderSource(shader, count, string, length); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilFunc(GLenum func, GLint ref, GLuint mask) { EVGL_FUNC_BEGIN(); glStencilFunc(func, ref, mask); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { EVGL_FUNC_BEGIN(); glStencilFuncSeparate(face, func, ref, mask); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilMask(GLuint mask) { EVGL_FUNC_BEGIN(); glStencilMask(mask); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilMaskSeparate(GLenum face, GLuint mask) { EVGL_FUNC_BEGIN(); glStencilMaskSeparate(face, mask); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) { EVGL_FUNC_BEGIN(); glStencilOp(fail, zfail, zpass); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { EVGL_FUNC_BEGIN(); glStencilOpSeparate(face, fail, zfail, zpass); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { EVGL_FUNC_BEGIN(); glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexParameterf(GLenum target, GLenum pname, GLfloat param) { EVGL_FUNC_BEGIN(); glTexParameterf(target, pname, param); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) { EVGL_FUNC_BEGIN(); glTexParameterfv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexParameteri(GLenum target, GLenum pname, GLint param) { EVGL_FUNC_BEGIN(); glTexParameteri(target, pname, param); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { EVGL_FUNC_BEGIN(); glTexParameteriv(target, pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { EVGL_FUNC_BEGIN(); glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform1f(GLint location, GLfloat x) { EVGL_FUNC_BEGIN(); glUniform1f(location, x); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform1fv(GLint location, GLsizei count, const GLfloat* v) { EVGL_FUNC_BEGIN(); glUniform1fv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform1i(GLint location, GLint x) { EVGL_FUNC_BEGIN(); glUniform1i(location, x); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform1iv(GLint location, GLsizei count, const GLint* v) { EVGL_FUNC_BEGIN(); glUniform1iv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform2f(GLint location, GLfloat x, GLfloat y) { EVGL_FUNC_BEGIN(); glUniform2f(location, x, y); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform2fv(GLint location, GLsizei count, const GLfloat* v) { EVGL_FUNC_BEGIN(); glUniform2fv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform2i(GLint location, GLint x, GLint y) { EVGL_FUNC_BEGIN(); glUniform2i(location, x, y); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform2iv(GLint location, GLsizei count, const GLint* v) { EVGL_FUNC_BEGIN(); glUniform2iv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { EVGL_FUNC_BEGIN(); glUniform3f(location, x, y, z); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform3fv(GLint location, GLsizei count, const GLfloat* v) { EVGL_FUNC_BEGIN(); glUniform3fv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform3i(GLint location, GLint x, GLint y, GLint z) { EVGL_FUNC_BEGIN(); glUniform3i(location, x, y, z); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform3iv(GLint location, GLsizei count, const GLint* v) { EVGL_FUNC_BEGIN(); glUniform3iv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { EVGL_FUNC_BEGIN(); glUniform4f(location, x, y, z, w); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform4fv(GLint location, GLsizei count, const GLfloat* v) { EVGL_FUNC_BEGIN(); glUniform4fv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { EVGL_FUNC_BEGIN(); glUniform4i(location, x, y, z, w); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniform4iv(GLint location, GLsizei count, const GLint* v) { EVGL_FUNC_BEGIN(); glUniform4iv(location, count, v); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { EVGL_FUNC_BEGIN(); glUniformMatrix2fv(location, count, transpose, value); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { EVGL_FUNC_BEGIN(); glUniformMatrix3fv(location, count, transpose, value); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { EVGL_FUNC_BEGIN(); glUniformMatrix4fv(location, count, transpose, value); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glUseProgram(GLuint program) { EVGL_FUNC_BEGIN(); glUseProgram(program); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glValidateProgram(GLuint program) { EVGL_FUNC_BEGIN(); glValidateProgram(program); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib1f(GLuint indx, GLfloat x) { EVGL_FUNC_BEGIN(); glVertexAttrib1f(indx, x); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib1fv(GLuint indx, const GLfloat* values) { EVGL_FUNC_BEGIN(); glVertexAttrib1fv(indx, values); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { EVGL_FUNC_BEGIN(); glVertexAttrib2f(indx, x, y); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib2fv(GLuint indx, const GLfloat* values) { EVGL_FUNC_BEGIN(); glVertexAttrib2fv(indx, values); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { EVGL_FUNC_BEGIN(); glVertexAttrib3f(indx, x, y, z); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib3fv(GLuint indx, const GLfloat* values) { EVGL_FUNC_BEGIN(); glVertexAttrib3fv(indx, values); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { EVGL_FUNC_BEGIN(); glVertexAttrib4f(indx, x, y, z, w); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttrib4fv(GLuint indx, const GLfloat* values) { EVGL_FUNC_BEGIN(); glVertexAttrib4fv(indx, values); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) { EVGL_FUNC_BEGIN(); glVertexAttribPointer(indx, size, type, normalized, stride, ptr); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } //-------------------------------------------------------------// // Calls for stripping precision string in the shader #if 0 static const char * opengl_strtok(const char *s, int *n, char **saveptr, char *prevbuf) { char *start; char *ret; char *p; int retlen; static const char *delim = " \t\n\r/"; if (prevbuf) free(prevbuf); if (s) { *saveptr = s; } else { if (!(*saveptr) || !(*n)) return NULL; s = *saveptr; } for (; *n && strchr(delim, *s); s++, (*n)--) { if (*s == '/' && *n > 1) { if (s[1] == '/') { do { s++, (*n)--; } while (*n > 1 && s[1] != '\n' && s[1] != '\r'); } else if (s[1] == '*') { do { s++, (*n)--; } while (*n > 2 && (s[1] != '*' || s[2] != '/')); s++, (*n)--; s++, (*n)--; if (*n == 0) { break; } } else { break; } } } start = s; for (; *n && *s && !strchr(delim, *s); s++, (*n)--); if (*n > 0) s++, (*n)--; *saveptr = s; retlen = s - start; ret = malloc(retlen + 1); p = ret; if (retlen == 0) { *p = 0; return; } while (retlen > 0) { if (*start == '/' && retlen > 1) { if (start[1] == '/') { do { start++, retlen--; } while (retlen > 1 && start[1] != '\n' && start[1] != '\r'); start++, retlen--; continue; } else if (start[1] == '*') { do { start++, retlen--; } while (retlen > 2 && (start[1] != '*' || start[2] != '/')); start += 3, retlen -= 3; continue; } } *(p++) = *(start++), retlen--; } *p = 0; return ret; } static char * do_eglShaderPatch(const char *source, int length, int *patched_len) { char *saveptr = NULL; char *sp; char *p = NULL; if (!length) length = strlen(source); *patched_len = 0; int patched_size = length; char *patched = malloc(patched_size + 1); if (!patched) return NULL; p = opengl_strtok(source, &length, &saveptr, NULL); for (; p; p = opengl_strtok(0, &length, &saveptr, p)) { if (!strncmp(p, "lowp", 4) || !strncmp(p, "mediump", 7) || !strncmp(p, "highp", 5)) { continue; } else if (!strncmp(p, "precision", 9)) { while ((p = opengl_strtok(0, &length, &saveptr, p)) && !strchr(p, ';')); } else { if (!strncmp(p, "gl_MaxVertexUniformVectors", 26)) { p = "(gl_MaxVertexUniformComponents / 4)"; } else if (!strncmp(p, "gl_MaxFragmentUniformVectors", 28)) { p = "(gl_MaxFragmentUniformComponents / 4)"; } else if (!strncmp(p, "gl_MaxVaryingVectors", 20)) { p = "(gl_MaxVaryingFloats / 4)"; } int new_len = strlen(p); if (*patched_len + new_len > patched_size) { patched_size *= 2; patched = realloc(patched, patched_size + 1); if (!patched) return NULL; } memcpy(patched + *patched_len, p, new_len); *patched_len += new_len; } } patched[*patched_len] = 0; /* check that we don't leave dummy preprocessor lines */ for (sp = patched; *sp;) { for (; *sp == ' ' || *sp == '\t'; sp++); if (!strncmp(sp, "#define", 7)) { for (p = sp + 7; *p == ' ' || *p == '\t'; p++); if (*p == '\n' || *p == '\r' || *p == '/') { memset(sp, 0x20, 7); } } for (; *sp && *sp != '\n' && *sp != '\r'; sp++); for (; *sp == '\n' || *sp == '\r'; sp++); } return patched; } static int shadersrc_gles_to_gl(GLsizei count, const char** string, char **s, const GLint* length, GLint *l) { int i; for(i = 0; i < count; ++i) { GLint len; if(length) { len = length[i]; if (len < 0) len = string[i] ? strlen(string[i]) : 0; } else len = string[i] ? strlen(string[i]) : 0; if(string[i]) { s[i] = do_eglShaderPatch(string[i], len, &l[i]); if(!s[i]) { while(i) free(s[--i]); free(l); free(s); return -1; } } else { s[i] = NULL; l[i] = 0; } } return 0; } void _evgld_glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length) { EVGL_FUNC_BEGIN(); #ifdef GL_GLES glShaderSource(shader, count, string, length); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; #else //GET_EXT_PTR(void, glShaderSource, (int, int, char **, void *)); int size = count; int i; int acc_length = 0; GLchar **tab_prog = malloc(size * sizeof(GLchar *)); int *tab_length = (int *) length; char **tab_prog_new; GLint *tab_length_new; tab_prog_new = malloc(count* sizeof(char*)); tab_length_new = malloc(count* sizeof(GLint)); memset(tab_prog_new, 0, count * sizeof(char*)); memset(tab_length_new, 0, count * sizeof(GLint)); for (i = 0; i < size; i++) { tab_prog[i] = ((GLchar *) string) + acc_length; acc_length += tab_length[i]; } shadersrc_gles_to_gl(count, tab_prog, tab_prog_new, tab_length, tab_length_new); if (!tab_prog_new || !tab_length_new) ERR("Error allocating memory for shader string manipulation."); glShaderSource(shader, count, tab_prog_new, tab_length_new); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); for (i = 0; i < count; i++) free(tab_prog_new[i]); free(tab_prog_new); free(tab_length_new); free(tab_prog); #endif finish: EVGL_FUNC_END(); } #endif //-------------------------------------------------------------// //-------------------------------------------------------------// // Calls related to Evas GL Direct Rendering //-------------------------------------------------------------// static void _evgld_glClear(GLbitfield mask) { EVGL_FUNC_BEGIN(); _evgl_glClear(mask); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } static void _evgld_glEnable(GLenum cap) { EVGL_FUNC_BEGIN(); _evgl_glEnable(cap); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } static void _evgld_glDisable(GLenum cap) { EVGL_FUNC_BEGIN(); _evgl_glDisable(cap); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } void _evgld_glGetIntegerv(GLenum pname, GLint* params) { EVGL_FUNC_BEGIN(); _evgl_glGetIntegerv(pname, params); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } static void _evgld_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { EVGL_FUNC_BEGIN(); _evgl_glReadPixels(x, y, width, height, format, type, pixels); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } static void _evgld_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { EVGL_FUNC_BEGIN(); _evgl_glScissor(x, y, width, height); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } static void _evgld_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { EVGL_FUNC_BEGIN(); _evgl_glViewport(x, y, width, height); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); goto finish; finish: EVGL_FUNC_END(); } //-------------------------------------------------------------// static void _normal_gl_api_get(Evas_GL_API *funcs) { funcs->version = EVAS_GL_API_VERSION; #define ORD(f) EVAS_API_OVERRIDE(f, funcs,) // GLES 2.0 ORD(glActiveTexture); ORD(glAttachShader); ORD(glBindAttribLocation); ORD(glBindBuffer); ORD(glBindTexture); ORD(glBlendColor); ORD(glBlendEquation); ORD(glBlendEquationSeparate); ORD(glBlendFunc); ORD(glBlendFuncSeparate); ORD(glBufferData); ORD(glBufferSubData); ORD(glCheckFramebufferStatus); // ORD(glClear); ORD(glClearColor); // ORD(glClearDepthf); ORD(glClearStencil); ORD(glColorMask); ORD(glCompileShader); ORD(glCompressedTexImage2D); ORD(glCompressedTexSubImage2D); ORD(glCopyTexImage2D); ORD(glCopyTexSubImage2D); ORD(glCreateProgram); ORD(glCreateShader); ORD(glCullFace); ORD(glDeleteBuffers); ORD(glDeleteFramebuffers); ORD(glDeleteProgram); ORD(glDeleteRenderbuffers); ORD(glDeleteShader); ORD(glDeleteTextures); ORD(glDepthFunc); ORD(glDepthMask); // ORD(glDepthRangef); ORD(glDetachShader); // ORD(glDisable); ORD(glDisableVertexAttribArray); ORD(glDrawArrays); ORD(glDrawElements); // ORD(glEnable); ORD(glEnableVertexAttribArray); ORD(glFinish); ORD(glFlush); ORD(glFramebufferRenderbuffer); ORD(glFramebufferTexture2D); ORD(glFrontFace); ORD(glGenBuffers); ORD(glGenerateMipmap); ORD(glGenFramebuffers); ORD(glGenRenderbuffers); ORD(glGenTextures); ORD(glGetActiveAttrib); ORD(glGetActiveUniform); ORD(glGetAttachedShaders); ORD(glGetAttribLocation); ORD(glGetBooleanv); ORD(glGetBufferParameteriv); ORD(glGetError); ORD(glGetFloatv); ORD(glGetFramebufferAttachmentParameteriv); // ORD(glGetIntegerv); ORD(glGetProgramiv); ORD(glGetProgramInfoLog); ORD(glGetRenderbufferParameteriv); ORD(glGetShaderiv); ORD(glGetShaderInfoLog); // ORD(glGetShaderPrecisionFormat); ORD(glGetShaderSource); ORD(glGetString); ORD(glGetTexParameterfv); ORD(glGetTexParameteriv); ORD(glGetUniformfv); ORD(glGetUniformiv); ORD(glGetUniformLocation); ORD(glGetVertexAttribfv); ORD(glGetVertexAttribiv); ORD(glGetVertexAttribPointerv); ORD(glHint); ORD(glIsBuffer); ORD(glIsEnabled); ORD(glIsFramebuffer); ORD(glIsProgram); ORD(glIsRenderbuffer); ORD(glIsShader); ORD(glIsTexture); ORD(glLineWidth); ORD(glLinkProgram); ORD(glPixelStorei); ORD(glPolygonOffset); // ORD(glReadPixels); // ORD(glReleaseShaderCompiler); ORD(glRenderbufferStorage); ORD(glSampleCoverage); // ORD(glScissor); // ORD(glShaderBinary); ORD(glShaderSource); ORD(glStencilFunc); ORD(glStencilFuncSeparate); ORD(glStencilMask); ORD(glStencilMaskSeparate); ORD(glStencilOp); ORD(glStencilOpSeparate); ORD(glTexImage2D); ORD(glTexParameterf); ORD(glTexParameterfv); ORD(glTexParameteri); ORD(glTexParameteriv); ORD(glTexSubImage2D); ORD(glUniform1f); ORD(glUniform1fv); ORD(glUniform1i); ORD(glUniform1iv); ORD(glUniform2f); ORD(glUniform2fv); ORD(glUniform2i); ORD(glUniform2iv); ORD(glUniform3f); ORD(glUniform3fv); ORD(glUniform3i); ORD(glUniform3iv); ORD(glUniform4f); ORD(glUniform4fv); ORD(glUniform4i); ORD(glUniform4iv); ORD(glUniformMatrix2fv); ORD(glUniformMatrix3fv); ORD(glUniformMatrix4fv); ORD(glUseProgram); ORD(glValidateProgram); ORD(glVertexAttrib1f); ORD(glVertexAttrib1fv); ORD(glVertexAttrib2f); ORD(glVertexAttrib2fv); ORD(glVertexAttrib3f); ORD(glVertexAttrib3fv); ORD(glVertexAttrib4f); ORD(glVertexAttrib4fv); ORD(glVertexAttribPointer); // ORD(glViewport); // ORD(glBindFramebuffer); ORD(glBindRenderbuffer); #undef ORD #define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgl_) // For Surface FBO ORD(glBindFramebuffer); // For Direct Rendering ORD(glClear); ORD(glDisable); ORD(glEnable); ORD(glGetIntegerv); ORD(glReadPixels); ORD(glScissor); ORD(glViewport); // GLES 2 Compat for Desktop ORD(glClearDepthf); ORD(glDepthRangef); ORD(glGetShaderPrecisionFormat); ORD(glShaderBinary); ORD(glReleaseShaderCompiler); #undef ORD evgl_api_ext_get(funcs); } static void _debug_gl_api_get(Evas_GL_API *funcs) { funcs->version = EVAS_GL_API_VERSION; #define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgld_) // GLES 2.0 ORD(glActiveTexture); ORD(glAttachShader); ORD(glBindAttribLocation); ORD(glBindBuffer); ORD(glBindTexture); ORD(glBlendColor); ORD(glBlendEquation); ORD(glBlendEquationSeparate); ORD(glBlendFunc); ORD(glBlendFuncSeparate); ORD(glBufferData); ORD(glBufferSubData); ORD(glCheckFramebufferStatus); ORD(glClear); ORD(glClearColor); ORD(glClearDepthf); ORD(glClearStencil); ORD(glColorMask); ORD(glCompileShader); ORD(glCompressedTexImage2D); ORD(glCompressedTexSubImage2D); ORD(glCopyTexImage2D); ORD(glCopyTexSubImage2D); ORD(glCreateProgram); ORD(glCreateShader); ORD(glCullFace); ORD(glDeleteBuffers); ORD(glDeleteFramebuffers); ORD(glDeleteProgram); ORD(glDeleteRenderbuffers); ORD(glDeleteShader); ORD(glDeleteTextures); ORD(glDepthFunc); ORD(glDepthMask); ORD(glDepthRangef); ORD(glDetachShader); ORD(glDisable); ORD(glDisableVertexAttribArray); ORD(glDrawArrays); ORD(glDrawElements); ORD(glEnable); ORD(glEnableVertexAttribArray); ORD(glFinish); ORD(glFlush); ORD(glFramebufferRenderbuffer); ORD(glFramebufferTexture2D); ORD(glFrontFace); ORD(glGenBuffers); ORD(glGenerateMipmap); ORD(glGenFramebuffers); ORD(glGenRenderbuffers); ORD(glGenTextures); ORD(glGetActiveAttrib); ORD(glGetActiveUniform); ORD(glGetAttachedShaders); ORD(glGetAttribLocation); ORD(glGetBooleanv); ORD(glGetBufferParameteriv); ORD(glGetError); ORD(glGetFloatv); ORD(glGetFramebufferAttachmentParameteriv); ORD(glGetIntegerv); ORD(glGetProgramiv); ORD(glGetProgramInfoLog); ORD(glGetRenderbufferParameteriv); ORD(glGetShaderiv); ORD(glGetShaderInfoLog); ORD(glGetShaderPrecisionFormat); ORD(glGetShaderSource); ORD(glGetString); ORD(glGetTexParameterfv); ORD(glGetTexParameteriv); ORD(glGetUniformfv); ORD(glGetUniformiv); ORD(glGetUniformLocation); ORD(glGetVertexAttribfv); ORD(glGetVertexAttribiv); ORD(glGetVertexAttribPointerv); ORD(glHint); ORD(glIsBuffer); ORD(glIsEnabled); ORD(glIsFramebuffer); ORD(glIsProgram); ORD(glIsRenderbuffer); ORD(glIsShader); ORD(glIsTexture); ORD(glLineWidth); ORD(glLinkProgram); ORD(glPixelStorei); ORD(glPolygonOffset); ORD(glReadPixels); ORD(glReleaseShaderCompiler); ORD(glRenderbufferStorage); ORD(glSampleCoverage); ORD(glScissor); ORD(glShaderBinary); ORD(glShaderSource); ORD(glStencilFunc); ORD(glStencilFuncSeparate); ORD(glStencilMask); ORD(glStencilMaskSeparate); ORD(glStencilOp); ORD(glStencilOpSeparate); ORD(glTexImage2D); ORD(glTexParameterf); ORD(glTexParameterfv); ORD(glTexParameteri); ORD(glTexParameteriv); ORD(glTexSubImage2D); ORD(glUniform1f); ORD(glUniform1fv); ORD(glUniform1i); ORD(glUniform1iv); ORD(glUniform2f); ORD(glUniform2fv); ORD(glUniform2i); ORD(glUniform2iv); ORD(glUniform3f); ORD(glUniform3fv); ORD(glUniform3i); ORD(glUniform3iv); ORD(glUniform4f); ORD(glUniform4fv); ORD(glUniform4i); ORD(glUniform4iv); ORD(glUniformMatrix2fv); ORD(glUniformMatrix3fv); ORD(glUniformMatrix4fv); ORD(glUseProgram); ORD(glValidateProgram); ORD(glVertexAttrib1f); ORD(glVertexAttrib1fv); ORD(glVertexAttrib2f); ORD(glVertexAttrib2fv); ORD(glVertexAttrib3f); ORD(glVertexAttrib3fv); ORD(glVertexAttrib4f); ORD(glVertexAttrib4fv); ORD(glVertexAttribPointer); ORD(glViewport); ORD(glBindFramebuffer); ORD(glBindRenderbuffer); #undef ORD evgl_api_ext_get(funcs); } void _evgl_api_get(Evas_GL_API *funcs, int debug) { if (debug) _debug_gl_api_get(funcs); else _normal_gl_api_get(funcs); }